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"]},