diff --git a/CHANGELOG.md b/CHANGELOG.md
index 06159a3faa..6c20844244 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
## Current
### Features
+- [#3792](https://github.com/blockscout/blockscout/pull/3792) - Cancel pending transaction
- [#3786](https://github.com/blockscout/blockscout/pull/3786) - Read contract: enable methods with StateMutability: pure
- [#3758](https://github.com/blockscout/blockscout/pull/3758) - Add pool metadata display/change to Staking DApp
- [#3750](https://github.com/blockscout/blockscout/pull/3750) - getblocknobytime block module API endpoint
diff --git a/apps/block_scout_web/assets/css/components/_button.scss b/apps/block_scout_web/assets/css/components/_button.scss
index 53bca7a83a..d743e87b20 100644
--- a/apps/block_scout_web/assets/css/components/_button.scss
+++ b/apps/block_scout_web/assets/css/components/_button.scss
@@ -70,6 +70,11 @@ $button-secondary-color: $secondary !default;
padding: 20px 60px 20px;
}
+ &-danger {
+ background-color: #dc3545 !important;
+ border: 1px solid #dc3545 !important;
+ }
+
// Block button
// -------------------------
diff --git a/apps/block_scout_web/assets/js/lib/smart_contract/common_helpers.js b/apps/block_scout_web/assets/js/lib/smart_contract/common_helpers.js
index c6947a718c..c4e01220d6 100644
--- a/apps/block_scout_web/assets/js/lib/smart_contract/common_helpers.js
+++ b/apps/block_scout_web/assets/js/lib/smart_contract/common_helpers.js
@@ -1,4 +1,5 @@
import $ from 'jquery'
+import { props } from 'eth-net-props'
export function getContractABI ($form) {
const implementationAbi = $form.data('implementation-abi')
@@ -51,6 +52,36 @@ export function prepareMethodArgs ($functionInputs, inputs) {
})
}
+export function compareChainIDs (explorerChainId, walletChainIdHex) {
+ if (explorerChainId !== parseInt(walletChainIdHex)) {
+ const networkDisplayNameFromWallet = props.getNetworkDisplayName(walletChainIdHex)
+ const networkDisplayName = props.getNetworkDisplayName(explorerChainId)
+ const errorMsg = `You connected to ${networkDisplayNameFromWallet} chain in the wallet, but the current instance of Blockscout is for ${networkDisplayName} chain`
+ return Promise.reject(new Error(errorMsg))
+ } else {
+ return Promise.resolve()
+ }
+}
+
+export const formatError = (error) => {
+ let { message } = error
+ message = message && message.split('Error: ').length > 1 ? message.split('Error: ')[1] : message
+ return message
+}
+
+export const getCurrentAccount = () => {
+ return new Promise((resolve, reject) => {
+ window.ethereum.request({ method: 'eth_accounts' })
+ .then(accounts => {
+ const account = accounts[0] ? accounts[0].toLowerCase() : null
+ resolve(account)
+ })
+ .catch(err => {
+ reject(err)
+ })
+ })
+}
+
function convertToBool (value) {
const boolVal = (value === 'true' || value === '1' || value === 1)
diff --git a/apps/block_scout_web/assets/js/lib/smart_contract/write.js b/apps/block_scout_web/assets/js/lib/smart_contract/write.js
index 14ada95f25..fd6bacb3ec 100644
--- a/apps/block_scout_web/assets/js/lib/smart_contract/write.js
+++ b/apps/block_scout_web/assets/js/lib/smart_contract/write.js
@@ -1,7 +1,6 @@
import Web3 from 'web3'
-import { props } from 'eth-net-props'
import { openErrorModal, openWarningModal, openSuccessModal, openModalWithMessage } from '../modals'
-import { getContractABI, getMethodInputs, prepareMethodArgs } from './common_helpers'
+import { compareChainIDs, formatError, getContractABI, getCurrentAccount, getMethodInputs, prepareMethodArgs } from './common_helpers'
export const walletEnabled = () => {
return new Promise((resolve) => {
@@ -54,13 +53,6 @@ export const connectToWallet = () => {
}
}
-export const getCurrentAccount = async () => {
- const accounts = await window.ethereum.request({ method: 'eth_accounts' })
- const account = accounts[0] ? accounts[0].toLowerCase() : null
-
- return account
-}
-
export const shouldHideConnectButton = () => {
return new Promise((resolve) => {
if (window.ethereum) {
@@ -100,6 +92,7 @@ export function callMethod (isWalletEnabled, $functionInputs, explorerChainId, $
const { chainId: walletChainIdHex } = window.ethereum
compareChainIDs(explorerChainId, walletChainIdHex)
+ .then(() => getCurrentAccount())
.then(currentAccount => {
if (functionName) {
const TargetContract = new window.web3.eth.Contract(contractAbi, contractAddress)
@@ -153,12 +146,6 @@ function onTransactionHash (txHash, $element, functionName) {
const txReceiptPollingIntervalId = setInterval(() => { getTxReceipt(txHash) }, 5 * 1000)
}
-const formatError = (error) => {
- let { message } = error
- message = message && message.split('Error: ').length > 1 ? message.split('Error: ')[1] : message
- return message
-}
-
function getTxValue ($functionInputs) {
const WEI_MULTIPLIER = 10 ** 18
const $txValue = $functionInputs.filter('[tx-value]:first')
@@ -166,14 +153,3 @@ function getTxValue ($functionInputs) {
const txValueStr = txValue && txValue.toString(16)
return txValueStr
}
-
-function compareChainIDs (explorerChainId, walletChainIdHex) {
- if (explorerChainId !== parseInt(walletChainIdHex)) {
- const networkDisplayNameFromWallet = props.getNetworkDisplayName(walletChainIdHex)
- const networkDisplayName = props.getNetworkDisplayName(explorerChainId)
- const errorMsg = `You connected to ${networkDisplayNameFromWallet} chain in the wallet, but the current instance of Blockscout is for ${networkDisplayName} chain`
- return Promise.reject(new Error(errorMsg))
- } else {
- return getCurrentAccount()
- }
-}
diff --git a/apps/block_scout_web/assets/js/pages/transaction.js b/apps/block_scout_web/assets/js/pages/transaction.js
index 4752f4499a..c848c4934b 100644
--- a/apps/block_scout_web/assets/js/pages/transaction.js
+++ b/apps/block_scout_web/assets/js/pages/transaction.js
@@ -7,6 +7,8 @@ import { createStore, connectElements } from '../lib/redux_helpers.js'
import '../lib/transaction_input_dropdown'
import '../lib/async_listing_load'
import '../app'
+import Swal from 'sweetalert2'
+import { compareChainIDs, formatError } from '../lib/smart_contract/common_helpers'
export const initialState = {
blockNumber: null,
@@ -61,4 +63,63 @@ if ($transactionDetailsPage.length) {
const transactionChannel = socket.channel(`transactions:${transactionHash}`, {})
transactionChannel.join()
transactionChannel.on('collated', () => window.location.reload())
+
+ $('.js-cancel-transaction').on('click', (event) => {
+ const btn = $(event.target)
+ if (!window.ethereum) {
+ btn
+ .attr('data-original-title', `Please unlock ${btn.data('from')} account in Metamask`)
+ .tooltip('show')
+
+ setTimeout(() => {
+ btn
+ .attr('data-original-title', null)
+ .tooltip('dispose')
+ }, 3000)
+ return
+ }
+ const { chainId: walletChainIdHex } = window.ethereum
+ compareChainIDs(btn.data('chainId'), walletChainIdHex)
+ .then(() => {
+ const txParams = {
+ from: btn.data('from'),
+ to: btn.data('from'),
+ value: 0,
+ nonce: btn.data('nonce').toString()
+ }
+ window.ethereum.request({
+ method: 'eth_sendTransaction',
+ params: [txParams]
+ })
+ .then(function (txHash) {
+ const successMsg = `Canceling transaction successfully sent to the network. The current one will change the status once canceling transaction will be confirmed.`
+ Swal.fire({
+ title: 'Success',
+ html: successMsg,
+ icon: 'success'
+ })
+ .then(() => {
+ window.location.reload()
+ })
+ })
+ .catch(_error => {
+ btn
+ .attr('data-original-title', `Please unlock ${btn.data('from')} account in Metamask`)
+ .tooltip('show')
+
+ setTimeout(() => {
+ btn
+ .attr('data-original-title', null)
+ .tooltip('dispose')
+ }, 3000)
+ })
+ })
+ .catch((error) => {
+ Swal.fire({
+ title: 'Warning',
+ html: formatError(error),
+ icon: 'warning'
+ })
+ })
+ })
}
diff --git a/apps/block_scout_web/assets/package-lock.json b/apps/block_scout_web/assets/package-lock.json
index 990a400dfd..d88757e54c 100644
--- a/apps/block_scout_web/assets/package-lock.json
+++ b/apps/block_scout_web/assets/package-lock.json
@@ -34,6 +34,7 @@
"redux": "^4.0.5",
"stream-browserify": "^3.0.0",
"stream-http": "^3.1.1",
+ "sweetalert2": "^10.14.0",
"urijs": "^1.19.2",
"url": "^0.11.0",
"util": "^0.12.3",
@@ -75,7 +76,7 @@
"license": "MIT"
},
"../../../deps/phoenix_html": {
- "version": "2.14.2"
+ "version": "2.14.3"
},
"node_modules/@babel/code-frame": {
"version": "7.8.3",
@@ -16598,6 +16599,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/sweetalert2": {
+ "version": "10.14.0",
+ "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-10.14.0.tgz",
+ "integrity": "sha512-EBUh4k9qyRRsttm9X9j7WUhLExetvTJpcbp1VTMJCpuI2UwHLesXMIw9M+UeuqBywv0UjNMR5PKH7Qnv65m8rw==",
+ "funding": {
+ "url": "https://sweetalert2.github.io/#donations"
+ }
+ },
"node_modules/symbol-observable": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
@@ -32382,6 +32391,11 @@
}
}
},
+ "sweetalert2": {
+ "version": "10.14.0",
+ "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-10.14.0.tgz",
+ "integrity": "sha512-EBUh4k9qyRRsttm9X9j7WUhLExetvTJpcbp1VTMJCpuI2UwHLesXMIw9M+UeuqBywv0UjNMR5PKH7Qnv65m8rw=="
+ },
"symbol-observable": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
diff --git a/apps/block_scout_web/assets/package.json b/apps/block_scout_web/assets/package.json
index 880ec531f6..1ea07d1557 100644
--- a/apps/block_scout_web/assets/package.json
+++ b/apps/block_scout_web/assets/package.json
@@ -46,6 +46,7 @@
"redux": "^4.0.5",
"stream-browserify": "^3.0.0",
"stream-http": "^3.1.1",
+ "sweetalert2": "^10.14.0",
"urijs": "^1.19.2",
"url": "^0.11.0",
"util": "^0.12.3",
diff --git a/apps/block_scout_web/config/test.exs b/apps/block_scout_web/config/test.exs
index 922b14d98b..967ee24c70 100644
--- a/apps/block_scout_web/config/test.exs
+++ b/apps/block_scout_web/config/test.exs
@@ -18,7 +18,7 @@ config :logger, :block_scout_web,
path: Path.absname("logs/test/block_scout_web.log")
# Configure wallaby
-config :wallaby, screenshot_on_failure: true, driver: Wallaby.Chrome
+config :wallaby, screenshot_on_failure: true, driver: Wallaby.Chrome, js_errors: false
config :explorer, Explorer.ExchangeRates, enabled: false, store: :none
diff --git a/apps/block_scout_web/lib/block_scout_web/templates/transaction/overview.html.eex b/apps/block_scout_web/lib/block_scout_web/templates/transaction/overview.html.eex
index 84982c183e..6dc742e171 100644
--- a/apps/block_scout_web/lib/block_scout_web/templates/transaction/overview.html.eex
+++ b/apps/block_scout_web/lib/block_scout_web/templates/transaction/overview.html.eex
@@ -1,4 +1,5 @@
<% block = @transaction.block %>
+<% from_address_hash = @transaction.from_address_hash %>
<% decoded_input_data = decoded_input_data(@transaction) %>
<% status = transaction_status(@transaction) %>
<% circles_addresses_list = CustomContractsHelpers.get_custom_addresses_list(:circles_addresses) %>
@@ -25,6 +26,15 @@
<% end %>
<%= gettext "Transaction Details" %>
+ <%= if status == :pending do %>
+ Cancel transaction
+ <% end %>
diff --git a/apps/block_scout_web/mix.exs b/apps/block_scout_web/mix.exs
index 8eb483c791..b36fef277a 100644
--- a/apps/block_scout_web/mix.exs
+++ b/apps/block_scout_web/mix.exs
@@ -121,7 +121,7 @@ defmodule BlockScoutWeb.Mixfile do
# `:spandex` tracing of `:phoenix`
{:spandex_phoenix, "~> 1.0"},
{:timex, "~> 3.6"},
- {:wallaby, "~> 0.26", only: :test, runtime: false},
+ {:wallaby, "~> 0.28", only: :test, runtime: false},
# `:cowboy` `~> 2.0` and Phoenix 1.4 compatibility
{:wobserver, "~> 0.2.0", github: "poanetwork/wobserver", branch: "support-https"},
{:phoenix_form_awesomplete, "~> 0.1.4"},
diff --git a/apps/block_scout_web/priv/gettext/default.pot b/apps/block_scout_web/priv/gettext/default.pot
index 3b5e6ffa0e..16b8ca2871 100644
--- a/apps/block_scout_web/priv/gettext/default.pot
+++ b/apps/block_scout_web/priv/gettext/default.pot
@@ -13,7 +13,7 @@ msgstr[0] ""
msgstr[1] ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:220
+#: lib/block_scout_web/templates/transaction/overview.html.eex:230
msgid " Token Transfer"
msgstr ""
@@ -196,7 +196,7 @@ msgid "Block %{block_number} - %{subnetwork} Explorer"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:96
+#: lib/block_scout_web/templates/transaction/overview.html.eex:106
msgid "Block Confirmations"
msgstr ""
@@ -216,7 +216,7 @@ msgid "Block Mined, awaiting import..."
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:82
+#: lib/block_scout_web/templates/transaction/overview.html.eex:92
msgid "Block Number"
msgstr ""
@@ -426,12 +426,12 @@ msgid "Copy Source Code"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:32
+#: lib/block_scout_web/templates/transaction/overview.html.eex:42
msgid "Copy Transaction Hash"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:36
+#: lib/block_scout_web/templates/transaction/overview.html.eex:46
msgid "Copy Txn Hash"
msgstr ""
@@ -634,8 +634,8 @@ msgstr ""
#: lib/block_scout_web/templates/layout/app.html.eex:33
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:20
#: lib/block_scout_web/templates/transaction/_tile.html.eex:29
-#: lib/block_scout_web/templates/transaction/overview.html.eex:205
-#: lib/block_scout_web/templates/transaction/overview.html.eex:258
+#: lib/block_scout_web/templates/transaction/overview.html.eex:215
+#: lib/block_scout_web/templates/transaction/overview.html.eex:268
#: lib/block_scout_web/views/wei_helpers.ex:78
msgid "Ether"
msgstr ""
@@ -654,7 +654,7 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:73
-#: lib/block_scout_web/templates/transaction/overview.html.eex:103
+#: lib/block_scout_web/templates/transaction/overview.html.eex:113
msgid "Nonce"
msgstr ""
@@ -742,8 +742,8 @@ msgid "Hash"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:139
-#: lib/block_scout_web/templates/transaction/overview.html.eex:143
+#: lib/block_scout_web/templates/transaction/overview.html.eex:149
+#: lib/block_scout_web/templates/transaction/overview.html.eex:153
msgid "Hex (Default)"
msgstr ""
@@ -778,7 +778,7 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:21
#: lib/block_scout_web/templates/transaction/_tile.html.eex:32
-#: lib/block_scout_web/templates/transaction/overview.html.eex:108
+#: lib/block_scout_web/templates/transaction/overview.html.eex:118
msgid "TX Fee"
msgstr ""
@@ -840,7 +840,7 @@ msgid "There are no transfers for this Token."
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:51
+#: lib/block_scout_web/templates/transaction/overview.html.eex:61
msgid "This transaction is pending confirmation."
msgstr ""
@@ -1002,7 +1002,7 @@ msgid "License ID"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:286
+#: lib/block_scout_web/templates/transaction/overview.html.eex:296
msgid "Limit"
msgstr ""
@@ -1194,7 +1194,7 @@ msgid "RPC"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:133
+#: lib/block_scout_web/templates/transaction/overview.html.eex:143
msgid "Raw Input"
msgstr ""
@@ -1468,7 +1468,7 @@ msgid "Transaction %{transaction}, %{subnetwork} %{transaction}"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:27
+#: lib/block_scout_web/templates/transaction/overview.html.eex:28
msgid "Transaction Details"
msgstr ""
@@ -1479,7 +1479,7 @@ msgid "Transaction Inputs"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:125
+#: lib/block_scout_web/templates/transaction/overview.html.eex:135
msgid "Transaction Speed"
msgstr ""
@@ -1506,7 +1506,7 @@ msgid "Type"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:146
+#: lib/block_scout_web/templates/transaction/overview.html.eex:156
msgid "UTF-8"
msgstr ""
@@ -1532,7 +1532,7 @@ msgid "Use the search box to find a hosted network, or select from the list of a
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:280
+#: lib/block_scout_web/templates/transaction/overview.html.eex:290
msgid "Used"
msgstr ""
@@ -1562,8 +1562,8 @@ msgid "Validator Info"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:205
-#: lib/block_scout_web/templates/transaction/overview.html.eex:258
+#: lib/block_scout_web/templates/transaction/overview.html.eex:215
+#: lib/block_scout_web/templates/transaction/overview.html.eex:268
msgid "Value"
msgstr ""
@@ -1741,7 +1741,7 @@ msgid "Decimals"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:276
+#: lib/block_scout_web/templates/transaction/overview.html.eex:286
msgid "Gas"
msgstr ""
@@ -1788,8 +1788,8 @@ msgid "Transfers"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:158
-#: lib/block_scout_web/templates/transaction/overview.html.eex:171
+#: lib/block_scout_web/templates/transaction/overview.html.eex:168
+#: lib/block_scout_web/templates/transaction/overview.html.eex:181
msgid "Copy Txn Input"
msgstr ""
@@ -1872,7 +1872,7 @@ msgid "Transactions"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:242
+#: lib/block_scout_web/templates/transaction/overview.html.eex:252
msgid " Token Burning"
msgstr ""
@@ -1884,7 +1884,7 @@ msgid "Token Burning"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:231
+#: lib/block_scout_web/templates/transaction/overview.html.eex:241
msgid " Token Minting"
msgstr ""
@@ -1901,7 +1901,7 @@ msgid "Chore Reward"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:74
+#: lib/block_scout_web/templates/transaction/overview.html.eex:84
msgid "Revert reason"
msgstr ""
diff --git a/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po b/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po
index 3b5e6ffa0e..16b8ca2871 100644
--- a/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po
+++ b/apps/block_scout_web/priv/gettext/en/LC_MESSAGES/default.po
@@ -13,7 +13,7 @@ msgstr[0] ""
msgstr[1] ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:220
+#: lib/block_scout_web/templates/transaction/overview.html.eex:230
msgid " Token Transfer"
msgstr ""
@@ -196,7 +196,7 @@ msgid "Block %{block_number} - %{subnetwork} Explorer"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:96
+#: lib/block_scout_web/templates/transaction/overview.html.eex:106
msgid "Block Confirmations"
msgstr ""
@@ -216,7 +216,7 @@ msgid "Block Mined, awaiting import..."
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:82
+#: lib/block_scout_web/templates/transaction/overview.html.eex:92
msgid "Block Number"
msgstr ""
@@ -426,12 +426,12 @@ msgid "Copy Source Code"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:32
+#: lib/block_scout_web/templates/transaction/overview.html.eex:42
msgid "Copy Transaction Hash"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:36
+#: lib/block_scout_web/templates/transaction/overview.html.eex:46
msgid "Copy Txn Hash"
msgstr ""
@@ -634,8 +634,8 @@ msgstr ""
#: lib/block_scout_web/templates/layout/app.html.eex:33
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:20
#: lib/block_scout_web/templates/transaction/_tile.html.eex:29
-#: lib/block_scout_web/templates/transaction/overview.html.eex:205
-#: lib/block_scout_web/templates/transaction/overview.html.eex:258
+#: lib/block_scout_web/templates/transaction/overview.html.eex:215
+#: lib/block_scout_web/templates/transaction/overview.html.eex:268
#: lib/block_scout_web/views/wei_helpers.ex:78
msgid "Ether"
msgstr ""
@@ -654,7 +654,7 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/block/overview.html.eex:73
-#: lib/block_scout_web/templates/transaction/overview.html.eex:103
+#: lib/block_scout_web/templates/transaction/overview.html.eex:113
msgid "Nonce"
msgstr ""
@@ -742,8 +742,8 @@ msgid "Hash"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:139
-#: lib/block_scout_web/templates/transaction/overview.html.eex:143
+#: lib/block_scout_web/templates/transaction/overview.html.eex:149
+#: lib/block_scout_web/templates/transaction/overview.html.eex:153
msgid "Hex (Default)"
msgstr ""
@@ -778,7 +778,7 @@ msgstr ""
#, elixir-format
#: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:21
#: lib/block_scout_web/templates/transaction/_tile.html.eex:32
-#: lib/block_scout_web/templates/transaction/overview.html.eex:108
+#: lib/block_scout_web/templates/transaction/overview.html.eex:118
msgid "TX Fee"
msgstr ""
@@ -840,7 +840,7 @@ msgid "There are no transfers for this Token."
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:51
+#: lib/block_scout_web/templates/transaction/overview.html.eex:61
msgid "This transaction is pending confirmation."
msgstr ""
@@ -1002,7 +1002,7 @@ msgid "License ID"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:286
+#: lib/block_scout_web/templates/transaction/overview.html.eex:296
msgid "Limit"
msgstr ""
@@ -1194,7 +1194,7 @@ msgid "RPC"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:133
+#: lib/block_scout_web/templates/transaction/overview.html.eex:143
msgid "Raw Input"
msgstr ""
@@ -1468,7 +1468,7 @@ msgid "Transaction %{transaction}, %{subnetwork} %{transaction}"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:27
+#: lib/block_scout_web/templates/transaction/overview.html.eex:28
msgid "Transaction Details"
msgstr ""
@@ -1479,7 +1479,7 @@ msgid "Transaction Inputs"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:125
+#: lib/block_scout_web/templates/transaction/overview.html.eex:135
msgid "Transaction Speed"
msgstr ""
@@ -1506,7 +1506,7 @@ msgid "Type"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:146
+#: lib/block_scout_web/templates/transaction/overview.html.eex:156
msgid "UTF-8"
msgstr ""
@@ -1532,7 +1532,7 @@ msgid "Use the search box to find a hosted network, or select from the list of a
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:280
+#: lib/block_scout_web/templates/transaction/overview.html.eex:290
msgid "Used"
msgstr ""
@@ -1562,8 +1562,8 @@ msgid "Validator Info"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:205
-#: lib/block_scout_web/templates/transaction/overview.html.eex:258
+#: lib/block_scout_web/templates/transaction/overview.html.eex:215
+#: lib/block_scout_web/templates/transaction/overview.html.eex:268
msgid "Value"
msgstr ""
@@ -1741,7 +1741,7 @@ msgid "Decimals"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:276
+#: lib/block_scout_web/templates/transaction/overview.html.eex:286
msgid "Gas"
msgstr ""
@@ -1788,8 +1788,8 @@ msgid "Transfers"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:158
-#: lib/block_scout_web/templates/transaction/overview.html.eex:171
+#: lib/block_scout_web/templates/transaction/overview.html.eex:168
+#: lib/block_scout_web/templates/transaction/overview.html.eex:181
msgid "Copy Txn Input"
msgstr ""
@@ -1872,7 +1872,7 @@ msgid "Transactions"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:242
+#: lib/block_scout_web/templates/transaction/overview.html.eex:252
msgid " Token Burning"
msgstr ""
@@ -1884,7 +1884,7 @@ msgid "Token Burning"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:231
+#: lib/block_scout_web/templates/transaction/overview.html.eex:241
msgid " Token Minting"
msgstr ""
@@ -1901,7 +1901,7 @@ msgid "Chore Reward"
msgstr ""
#, elixir-format
-#: lib/block_scout_web/templates/transaction/overview.html.eex:74
+#: lib/block_scout_web/templates/transaction/overview.html.eex:84
msgid "Revert reason"
msgstr ""
diff --git a/apps/block_scout_web/test/block_scout_web/controllers/transaction_internal_transaction_controller_test.exs b/apps/block_scout_web/test/block_scout_web/controllers/transaction_internal_transaction_controller_test.exs
index 71deea5dbf..4969db3685 100644
--- a/apps/block_scout_web/test/block_scout_web/controllers/transaction_internal_transaction_controller_test.exs
+++ b/apps/block_scout_web/test/block_scout_web/controllers/transaction_internal_transaction_controller_test.exs
@@ -1,6 +1,8 @@
defmodule BlockScoutWeb.TransactionInternalTransactionControllerTest do
use BlockScoutWeb.ConnCase
+ import Mox
+
import BlockScoutWeb.WebRouter.Helpers, only: [transaction_internal_transaction_path: 3]
alias Explorer.Chain.InternalTransaction
@@ -73,6 +75,11 @@ defmodule BlockScoutWeb.TransactionInternalTransactionControllerTest do
end
test "includes USD exchange rate value for address in assigns", %{conn: conn} do
+ EthereumJSONRPC.Mox
+ |> expect(:json_rpc, fn %{id: _id, method: "net_version", params: []}, _options ->
+ {:ok, "100"}
+ end)
+
transaction = insert(:transaction)
conn = get(conn, transaction_internal_transaction_path(BlockScoutWeb.Endpoint, :index, transaction.hash))
diff --git a/apps/block_scout_web/test/block_scout_web/controllers/transaction_log_controller_test.exs b/apps/block_scout_web/test/block_scout_web/controllers/transaction_log_controller_test.exs
index 5e316f4483..f5b6118a2c 100644
--- a/apps/block_scout_web/test/block_scout_web/controllers/transaction_log_controller_test.exs
+++ b/apps/block_scout_web/test/block_scout_web/controllers/transaction_log_controller_test.exs
@@ -1,6 +1,8 @@
defmodule BlockScoutWeb.TransactionLogControllerTest do
use BlockScoutWeb.ConnCase
+ import Mox
+
import BlockScoutWeb.WebRouter.Helpers, only: [transaction_log_path: 3]
alias Explorer.ExchangeRates.Token
@@ -154,6 +156,11 @@ defmodule BlockScoutWeb.TransactionLogControllerTest do
end
test "includes USD exchange rate value for address in assigns", %{conn: conn} do
+ EthereumJSONRPC.Mox
+ |> expect(:json_rpc, fn %{id: _id, method: "net_version", params: []}, _options ->
+ {:ok, "100"}
+ end)
+
transaction = insert(:transaction)
conn = get(conn, transaction_log_path(BlockScoutWeb.Endpoint, :index, transaction.hash))
@@ -162,6 +169,11 @@ defmodule BlockScoutWeb.TransactionLogControllerTest do
end
test "loads for transactions that created a contract", %{conn: conn} do
+ EthereumJSONRPC.Mox
+ |> expect(:json_rpc, fn %{id: _id, method: "net_version", params: []}, _options ->
+ {:ok, "100"}
+ end)
+
contract_address = insert(:contract_address)
transaction =
diff --git a/apps/block_scout_web/test/block_scout_web/controllers/transaction_token_transfer_controller_test.exs b/apps/block_scout_web/test/block_scout_web/controllers/transaction_token_transfer_controller_test.exs
index 3c1fb0a8f4..18a2bdf3f0 100644
--- a/apps/block_scout_web/test/block_scout_web/controllers/transaction_token_transfer_controller_test.exs
+++ b/apps/block_scout_web/test/block_scout_web/controllers/transaction_token_transfer_controller_test.exs
@@ -1,12 +1,19 @@
defmodule BlockScoutWeb.TransactionTokenTransferControllerTest do
use BlockScoutWeb.ConnCase
+ import Mox
+
import BlockScoutWeb.WebRouter.Helpers, only: [transaction_token_transfer_path: 3]
alias Explorer.ExchangeRates.Token
describe "GET index/3" do
test "load token transfers", %{conn: conn} do
+ EthereumJSONRPC.Mox
+ |> expect(:json_rpc, fn %{id: _id, method: "net_version", params: []}, _options ->
+ {:ok, "100"}
+ end)
+
transaction = insert(:transaction)
token_transfer = insert(:token_transfer, transaction: transaction)
@@ -64,6 +71,11 @@ defmodule BlockScoutWeb.TransactionTokenTransferControllerTest do
end
test "includes USD exchange rate value for address in assigns", %{conn: conn} do
+ EthereumJSONRPC.Mox
+ |> expect(:json_rpc, fn %{id: _id, method: "net_version", params: []}, _options ->
+ {:ok, "100"}
+ end)
+
transaction = insert(:transaction)
conn = get(conn, transaction_token_transfer_path(BlockScoutWeb.Endpoint, :index, transaction.hash))
@@ -146,6 +158,11 @@ defmodule BlockScoutWeb.TransactionTokenTransferControllerTest do
end
test "preloads to_address smart contract verified", %{conn: conn} do
+ EthereumJSONRPC.Mox
+ |> expect(:json_rpc, fn %{id: _id, method: "net_version", params: []}, _options ->
+ {:ok, "100"}
+ end)
+
transaction = insert(:transaction_to_verified_contract)
conn = get(conn, transaction_token_transfer_path(BlockScoutWeb.Endpoint, :index, transaction.hash))
diff --git a/apps/block_scout_web/test/block_scout_web/features/viewing_chain_test.exs b/apps/block_scout_web/test/block_scout_web/features/viewing_chain_test.exs
index c7521fb8a4..e055df39e7 100644
--- a/apps/block_scout_web/test/block_scout_web/features/viewing_chain_test.exs
+++ b/apps/block_scout_web/test/block_scout_web/features/viewing_chain_test.exs
@@ -82,7 +82,11 @@ defmodule BlockScoutWeb.ViewingChainTest do
describe "viewing transactions" do
test "search for transactions", %{session: session} do
- transaction = insert(:transaction)
+ block = insert(:block)
+
+ transaction =
+ insert(:transaction)
+ |> with_block(block)
start_supervised!(AddressesCounter)
AddressesCounter.consolidate()
diff --git a/apps/block_scout_web/test/block_scout_web/features/viewing_transactions_test.exs b/apps/block_scout_web/test/block_scout_web/features/viewing_transactions_test.exs
index 6775065f17..33c8fe9e88 100644
--- a/apps/block_scout_web/test/block_scout_web/features/viewing_transactions_test.exs
+++ b/apps/block_scout_web/test/block_scout_web/features/viewing_transactions_test.exs
@@ -1,11 +1,15 @@
defmodule BlockScoutWeb.ViewingTransactionsTest do
@moduledoc false
+ import Mox
+
use BlockScoutWeb.FeatureCase, async: false
alias BlockScoutWeb.{AddressPage, TransactionListPage, TransactionLogsPage, TransactionPage}
alias Explorer.Chain.Wei
+ setup :set_mox_global
+
setup do
block =
insert(:block, %{
@@ -112,6 +116,11 @@ defmodule BlockScoutWeb.ViewingTransactionsTest do
describe "viewing a pending transaction page" do
test "can see a pending transaction's details", %{session: session, pending: pending} do
+ EthereumJSONRPC.Mox
+ |> expect(:json_rpc, fn %{id: _id, method: "net_version", params: []}, _options ->
+ {:ok, "100"}
+ end)
+
session
|> TransactionPage.visit_page(pending)
|> assert_has(TransactionPage.detail_hash(pending))
diff --git a/apps/block_scout_web/test/block_scout_web/views/address_token_balance_view_test.exs b/apps/block_scout_web/test/block_scout_web/views/address_token_balance_view_test.exs
index c61a776edc..398332a310 100644
--- a/apps/block_scout_web/test/block_scout_web/views/address_token_balance_view_test.exs
+++ b/apps/block_scout_web/test/block_scout_web/views/address_token_balance_view_test.exs
@@ -80,7 +80,8 @@ defmodule BlockScoutWeb.AddressTokenBalanceViewTest do
token_balance_b =
build(:token_balance,
- token: build(:token, name: "token", decimals: Decimal.new(18)) |> Map.put(:usd_value, Decimal.new(3.45)),
+ token:
+ build(:token, name: "token", decimals: Decimal.new(18)) |> Map.put(:usd_value, Decimal.from_float(3.45)),
value: Decimal.new(100_500)
)
diff --git a/mix.exs b/mix.exs
index 1fe6445fdc..ad27371e55 100644
--- a/mix.exs
+++ b/mix.exs
@@ -67,7 +67,6 @@ defmodule BlockScout.Mixfile do
# and cannot be accessed from applications inside the apps folder
defp deps do
[
- {:dialyxir, "~> 1.1"},
{:absinthe_plug, git: "https://github.com/blockscout/absinthe_plug.git", tag: "1.5.3", override: true},
# Documentation
{:ex_doc, "~> 0.19.0", only: [:dev]},
diff --git a/mix.lock b/mix.lock
index 880afcb26f..c839d2dd3d 100644
--- a/mix.lock
+++ b/mix.lock
@@ -56,7 +56,7 @@
"gettext": {:hex, :gettext, "0.16.1", "e2130b25eebcbe02bb343b119a07ae2c7e28bd4b146c4a154da2ffb2b3507af2", [:mix], [], "hexpm", "dd3a7ea5e3e87ee9df29452dd9560709b4c7cc8141537d0b070155038d92bdf1"},
"hackney": {:hex, :hackney, "1.17.4", "99da4674592504d3fb0cfef0db84c3ba02b4508bae2dff8c0108baa0d6e0977c", [:rebar3], [{:certifi, "~>2.6.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "de16ff4996556c8548d512f4dbe22dd58a587bf3332e7fd362430a7ef3986b16"},
"html_entities": {:hex, :html_entities, "0.4.0", "f2fee876858cf6aaa9db608820a3209e45a087c5177332799592142b50e89a6b", [:mix], [], "hexpm", "3e3d7156a272950373ce5a4018b1490bea26676f8d6a7d409f6fac8568b8cb9a"},
- "httpoison": {:hex, :httpoison, "1.7.0", "abba7d086233c2d8574726227b6c2c4f6e53c4deae7fe5f6de531162ce9929a0", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "975cc87c845a103d3d1ea1ccfd68a2700c211a434d8428b10c323dc95dc5b980"},
+ "httpoison": {:hex, :httpoison, "1.8.0", "6b85dea15820b7804ef607ff78406ab449dd78bed923a49c7160e1886e987a3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "28089eaa98cf90c66265b6b5ad87c59a3729bea2e74e9d08f9b51eb9729b3c3a"},
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
"jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"},
"jsx": {:hex, :jsx, "2.8.3", "a05252d381885240744d955fbe3cf810504eb2567164824e19303ea59eef62cf", [:mix, :rebar3], [], "hexpm", "fc3499fed7a726995aa659143a248534adc754ebd16ccd437cd93b649a95091f"},
@@ -69,7 +69,7 @@
"meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
"memento": {:hex, :memento, "0.3.1", "b2909390820550d8b90b68ec96f9e15ff8a45a28b6f97fa4a62ef50e87c2f9d9", [:mix], [], "hexpm", "ff8fc66255d21dcd539c5d77a0b5458715bf3efec91b389dd06017bbb4e2e916"},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
- "mime": {:hex, :mime, "1.5.0", "203ef35ef3389aae6d361918bf3f952fa17a09e8e43b5aa592b93eba05d0fb8d", [:mix], [], "hexpm", "55a94c0f552249fc1a3dd9cd2d3ab9de9d3c89b559c2bd01121f824834f24746"},
+ "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"},
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
"mix_erlang_tasks": {:hex, :mix_erlang_tasks, "0.1.0", "36819fec60b80689eb1380938675af215565a89320a9e29c72c70d97512e4649", [:mix], [], "hexpm", "95d2839c422c482a70c08a8702da8242f86b773f8ab6e8602a4eb72da8da04ed"},
"mochiweb": {:hex, :mochiweb, "2.18.0", "eb55f1db3e6e960fac4e6db4e2db9ec3602cc9f30b86cd1481d56545c3145d2e", [:rebar3], [], "hexpm", "b93e2b1e564bdbadfecc297277f9e6d0902da645b417d6c9210f6038ac63489a"},
@@ -85,15 +85,15 @@
"phoenix": {:hex, :phoenix, "1.5.6", "8298cdb4e0f943242ba8410780a6a69cbbe972fef199b341a36898dd751bdd66", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "0dc4d39af1306b6aa5122729b0a95ca779e42c708c6fe7abbb3d336d5379e956"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.2.1", "13f124cf0a3ce0f1948cf24654c7b9f2347169ff75c1123f44674afee6af3b03", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "478a1bae899cac0a6e02be1deec7e2944b7754c04e7d4107fc5a517f877743c0"},
"phoenix_form_awesomplete": {:hex, :phoenix_form_awesomplete, "0.1.6", "c7195aeed29eb0e18ead82cb7d81a1fd43cfc5beb8789f50c37ffe5eeff31d82", [:mix], [{:phoenix_html, "~> 2.10", [hex: :phoenix_html, repo: "hexpm", optional: false]}], "hexpm", "4066a8222d31efec70c2e5e927406314923544b9c9d3611c456fd2fc096d1b18"},
- "phoenix_html": {:hex, :phoenix_html, "2.14.2", "b8a3899a72050f3f48a36430da507dd99caf0ac2d06c77529b1646964f3d563e", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "58061c8dfd25da5df1ea0ca47c972f161beb6c875cd293917045b92ffe1bf617"},
+ "phoenix_html": {:hex, :phoenix_html, "2.14.3", "51f720d0d543e4e157ff06b65de38e13303d5778a7919bcc696599e5934271b8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "efd697a7fff35a13eeeb6b43db884705cba353a1a41d127d118fda5f90c8e80f"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.3.0", "f35f61c3f959c9a01b36defaa1f0624edd55b87e236b606664a556d6f72fd2e7", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "02c1007ae393f2b76ec61c1a869b1e617179877984678babde131d716f95b582"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"},
- "plug": {:hex, :plug, "1.11.0", "f17217525597628298998bc3baed9f8ea1fa3f1160aa9871aee6df47a6e4d38e", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2d9c633f0499f9dc5c2fd069161af4e2e7756890b81adcbb2ceaa074e8308876"},
+ "plug": {:hex, :plug, "1.11.1", "f2992bac66fdae679453c9e86134a4201f6f43a687d8ff1cd1b2862d53c80259", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "23524e4fefbb587c11f0833b3910bfb414bf2e2534d61928e920f54e3a1b881f"},
"plug_cowboy": {:hex, :plug_cowboy, "2.4.1", "779ba386c0915027f22e14a48919a9545714f849505fa15af2631a0d298abf0f", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d72113b6dff7b37a7d9b2a5b68892808e3a9a752f2bf7e503240945385b70507"},
- "plug_crypto": {:hex, :plug_crypto, "1.2.0", "1cb20793aa63a6c619dd18bb33d7a3aa94818e5fd39ad357051a67f26dfa2df6", [:mix], [], "hexpm", "a48b538ae8bf381ffac344520755f3007cc10bd8e90b240af98ea29b69683fc2"},
+ "plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"},
"poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"},
"poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"},
- "postgrex": {:hex, :postgrex, "0.15.7", "724410acd48abac529d0faa6c2a379fb8ae2088e31247687b16cacc0e0883372", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "88310c010ff047cecd73d5ceca1d99205e4b1ab1b9abfdab7e00f5c9d20ef8f9"},
+ "postgrex": {:hex, :postgrex, "0.15.8", "f5e782bbe5e8fa178d5e3cd1999c857dc48eda95f0a4d7f7bd92a50e84a0d491", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "698fbfacea34c4cf22c8281abeb5cf68d99628d541874f085520ab3b53d356fe"},
"prometheus": {:hex, :prometheus, "4.6.0", "20510f381db1ccab818b4cf2fac5fa6ab5cc91bc364a154399901c001465f46f", [:mix, :rebar3], [], "hexpm", "4905fd2992f8038eccd7aa0cd22f40637ed618c0bed1f75c05aacec15b7545de"},
"prometheus_ecto": {:hex, :prometheus_ecto, "1.4.3", "3dd4da1812b8e0dbee81ea58bb3b62ed7588f2eae0c9e97e434c46807ff82311", [:mix], [{:ecto, "~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:prometheus_ex, "~> 1.1 or ~> 2.0 or ~> 3.0", [hex: :prometheus_ex, repo: "hexpm", optional: false]}], "hexpm", "8d66289f77f913b37eda81fd287340c17e61a447549deb28efc254532b2bed82"},
"prometheus_ex": {:hex, :prometheus_ex, "3.0.5", "fa58cfd983487fc5ead331e9a3e0aa622c67232b3ec71710ced122c4c453a02f", [:mix], [{:prometheus, "~> 4.0", [hex: :prometheus, repo: "hexpm", optional: false]}], "hexpm", "9fd13404a48437e044b288b41f76e64acd9735fb8b0e3809f494811dfa66d0fb"},
@@ -116,7 +116,7 @@
"toml": {:hex, :toml, "0.5.2", "e471388a8726d1ce51a6b32f864b8228a1eb8edc907a0edf2bb50eab9321b526", [:mix], [], "hexpm", "f1e3dabef71fb510d015fad18c0e05e7c57281001141504c6b69d94e99750a07"},
"tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
- "wallaby": {:hex, :wallaby, "0.26.2", "32f43de121ba3a65ecff060b46c92a255ac5f092b0e296e738ec9f1ad5aa1215", [:mix], [{:ecto_sql, ">= 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}, {:httpoison, "~> 0.12 or ~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_ecto, ">= 3.0.0", [hex: :phoenix_ecto, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:web_driver_client, "~> 0.1.0", [hex: :web_driver_client, repo: "hexpm", optional: false]}], "hexpm", "f40ef31caf08e3f0947e31be4b99eeb79560259430518457fa6faed89f650f38"},
+ "wallaby": {:hex, :wallaby, "0.28.0", "2ff217c0f245cadb3e5d91748ebcf0102873ceb9ef8a3507717c8bdd73915668", [:mix], [{:ecto_sql, ">= 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}, {:httpoison, "~> 0.12 or ~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:phoenix_ecto, ">= 3.0.0", [hex: :phoenix_ecto, repo: "hexpm", optional: true]}, {:web_driver_client, "~> 0.1.0", [hex: :web_driver_client, repo: "hexpm", optional: false]}], "hexpm", "e58112650d0b51e81714a626eab7d486d7a77342c9bbc2ba262b6653f9b22558"},
"web_driver_client": {:hex, :web_driver_client, "0.1.0", "19466a989c76b7ec803c796cec0fec4611a64f445fd5120ce50c9e3817e09c2c", [:mix], [{:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:tesla, "~> 1.3.0", [hex: :tesla, repo: "hexpm", optional: false]}], "hexpm", "c9c031ca915e8fc75b5e24ac93503244f3cc406dd7f53047087a45aa62d60e9e"},
"websocket_client": {:hex, :websocket_client, "1.3.0", "2275d7daaa1cdacebf2068891c9844b15f4fdc3de3ec2602420c2fb486db59b6", [:rebar3], [], "hexpm", "b864fa076f059b615da4ab99240e515b26132ce4d2d0f9df5d7f22f01fa04b65"},
"wobserver": {:git, "https://github.com/poanetwork/wobserver.git", "13bcda30a87f4f0be1878920a79433ad831eefbe", [branch: "support-https"]},