diff --git a/CHANGELOG.md b/CHANGELOG.md index f76fa8f8bacf..1342b69ef710 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,205 @@ ## Current ### Features +- [#5105](https://github.com/blockscout/blockscout/pull/5105) - Redesign token page +- [#4690](https://github.com/blockscout/blockscout/pull/4690) - Improve pagination: introduce pagination with random access to pages; Integrate it to the Transactions List page + +### Fixes +- [#5169](https://github.com/blockscout/blockscout/pull/5169) - Fix several UI bugs; Add tooltip to the prev/next block buttons +- [#5184](https://github.com/blockscout/blockscout/pull/5184) - eth_call method: remove from param from the request, if it is null +- [#5172](https://github.com/blockscout/blockscout/pull/5172), [#5182](https://github.com/blockscout/blockscout/pull/5182) - Reduced the size of js bundles +- [#5166](https://github.com/blockscout/blockscout/pull/5166) - Fix contracts verification bugs +- [#5160](https://github.com/blockscout/blockscout/pull/5160) - Fix blocks validated hint +- [#5155](https://github.com/blockscout/blockscout/pull/5155) - Fix get_implementation_abi_from_proxy/2 implementation +- [#5154](https://github.com/blockscout/blockscout/pull/5154) - Fix token counters bug + +### Chore +- [#5171](https://github.com/blockscout/blockscout/pull/5171) - Replace lodash NPM package with tiny lodash modules +- [#5170](https://github.com/blockscout/blockscout/pull/5170) - Token price row name fix +- [#5153](https://github.com/blockscout/blockscout/pull/5153) - Discord link instead of Gitter +- [#5142](https://github.com/blockscout/blockscout/pull/5142) - Updated some outdated npm packages +- [#5140](https://github.com/blockscout/blockscout/pull/5140) - Babel minor and core-js major updates +- [#5139](https://github.com/blockscout/blockscout/pull/5139) - Eslint major update +- [#5138](https://github.com/blockscout/blockscout/pull/5138) - Webpack minor update +- [#5119](https://github.com/blockscout/blockscout/pull/5119) - Inventory controller refactoring +- [#5118](https://github.com/blockscout/blockscout/pull/5118) - Fix top navigation template + + +## 4.1.1-beta + +### Features +- [#5090](https://github.com/blockscout/blockscout/pull/5090) - Allotted rate limit by IP +- [#5080](https://github.com/blockscout/blockscout/pull/5080) - Allotted rate limit by a global API key + +### Fixes +- [#5085](https://github.com/blockscout/blockscout/pull/5085) - Fix wallet style +- [#5088](https://github.com/blockscout/blockscout/pull/5088) - Store address transactions/token transfers in the DB +- [#5071](https://github.com/blockscout/blockscout/pull/5071) - Fix write page contract tuple input +- [#5066](https://github.com/blockscout/blockscout/pull/5066) - Fix read contract page bug +- [#5034](https://github.com/blockscout/blockscout/pull/5034) - Fix broken functions input at transaction page +- [#5025](https://github.com/blockscout/blockscout/pull/5025) - Add standard input JSON files validation +- [#5051](https://github.com/blockscout/blockscout/pull/5051) - Fix 500 response when ABI method was parsed as nil + +### Chore +- [#5092](https://github.com/blockscout/blockscout/pull/5092) - Resolve vulnerable follow-redirects npm dep in ./apps/explorer +- [#5091](https://github.com/blockscout/blockscout/pull/5091) - Refactor search page template +- [#5081](https://github.com/blockscout/blockscout/pull/5081) - Add internal transactions fetcher disabled? config parameter +- [#5063](https://github.com/blockscout/blockscout/pull/5063) - Resolve moderate NPM vulnerabilities with npm audit tool +- [#5053](https://github.com/blockscout/blockscout/pull/5053) - Update ex_keccak lib + + +## 4.1.0-beta + +### Features +- [#5030](https://github.com/blockscout/blockscout/pull/5030) - API rate limiting +- [#4924](https://github.com/blockscout/blockscout/pull/4924) - Add daily bytecode verifcation to prevent metamorphic contracts vulnerablity +- [#4908](https://github.com/blockscout/blockscout/pull/4908) - Add verification via standard JSON input +- [#5004](https://github.com/blockscout/blockscout/pull/5004) - Add ability to set up a separate DB endpoint for the API endpoints +- [#4989](https://github.com/blockscout/blockscout/pull/4989), [#4991](https://github.com/blockscout/blockscout/pull/4991) - Bridged tokens list API endpoint +- [#4931](https://github.com/blockscout/blockscout/pull/4931) - Web3 modal with Wallet Connect for Write contract page and Staking Dapp + +### Fixes +- [#5045](https://github.com/blockscout/blockscout/pull/5045) - Contracts interaction improvements +- [#5032](https://github.com/blockscout/blockscout/pull/5032) - Fix token transfer csv export +- [#5020](https://github.com/blockscout/blockscout/pull/5020) - Token instance image display imrovement +- [#5019](https://github.com/blockscout/blockscout/pull/5019) - Fix fetch_last_token_balance function termination +- [#5011](https://github.com/blockscout/blockscout/pull/5011) - Fix `0x0` implementation address +- [#5008](https://github.com/blockscout/blockscout/pull/5008) - Extend decimals cap in format_according_to_decimals up to 24 +- [#5005](https://github.com/blockscout/blockscout/pull/5005) - Fix falsy appearance `Connection Lost` warning on reload/switch page +- [#5003](https://github.com/blockscout/blockscout/pull/5003) - API router refactoring +- [#4992](https://github.com/blockscout/blockscout/pull/4992) - Fix `type` field in transactions after enabling 1559 +- [#4979](https://github.com/blockscout/blockscout/pull/4979), [#4993](https://github.com/blockscout/blockscout/pull/4993) - Store total gas_used in addresses table +- [#4977](https://github.com/blockscout/blockscout/pull/4977) - Export token transfers on address: include transfers on contract itself +- [#4976](https://github.com/blockscout/blockscout/pull/4976) - Handle :econnrefused in pending transactions fetcher +- [#4965](https://github.com/blockscout/blockscout/pull/4965) - Fix search field appearance on medium size screens +- [#4945](https://github.com/blockscout/blockscout/pull/4945) - Fix `Verify & Publish` button link +- [#4938](https://github.com/blockscout/blockscout/pull/4938) - Fix displaying of nested arrays for contracts read +- [#4888](https://github.com/blockscout/blockscout/pull/4888) - Fix fetch_top_tokens method: add nulls last for token holders desc order +- [#4867](https://github.com/blockscout/blockscout/pull/4867) - Fix bug in quering contracts method and improve contracts interactions + +### Chore +- [#5047](https://github.com/blockscout/blockscout/pull/5047) - At contract write use wei precision +- [#5023](https://github.com/blockscout/blockscout/pull/5023) - Capability to leave an empty logo +- [#5018](https://github.com/blockscout/blockscout/pull/5018) - Resolve npm vulnerabilities via npm audix fix +- [#5014](https://github.com/blockscout/blockscout/pull/5014) - Separate FIRST_BLOCK and TRACE_FIRST_BLOCK option for blocks import and tracing methods +- [#4998](https://github.com/blockscout/blockscout/pull/4998) - API endpoints logger +- [#4983](https://github.com/blockscout/blockscout/pull/4983), [#5038](https://github.com/blockscout/blockscout/pull/5038) - Fix contract verification tests +- [#4861](https://github.com/blockscout/blockscout/pull/4861) - Add separate column for token icons + + +## 4.0.0-beta + +### Features +- [#4807](https://github.com/blockscout/blockscout/pull/4807) - Added support for BeaconProxy pattern +- [#4777](https://github.com/blockscout/blockscout/pull/4777), [#4791](https://github.com/blockscout/blockscout/pull/4791), [#4799](https://github.com/blockscout/blockscout/pull/4799), [#4847](https://github.com/blockscout/blockscout/pull/4847) - Added decoding revert reason +- [#4776](https://github.com/blockscout/blockscout/pull/4776) - Added view for unsuccessfully fetched values from read functions +- [#4761](https://github.com/blockscout/blockscout/pull/4761) - ERC-1155 support +- [#4739](https://github.com/blockscout/blockscout/pull/4739) - Improve logs and inputs decoding +- [#4747](https://github.com/blockscout/blockscout/pull/4747) - Advanced CSV export +- [#4745](https://github.com/blockscout/blockscout/pull/4745) - Vyper contracts verification +- [#4699](https://github.com/blockscout/blockscout/pull/4699), [#4793](https://github.com/blockscout/blockscout/pull/4793), [#4820](https://github.com/blockscout/blockscout/pull/4820), [#4827](https://github.com/blockscout/blockscout/pull/4827) - Address page facelifting +- [#4667](https://github.com/blockscout/blockscout/pull/4667) - Transaction Page: Add expand/collapse button for long contract method data +- [#4641](https://github.com/blockscout/blockscout/pull/4641), [#4733](https://github.com/blockscout/blockscout/pull/4733) - Improve Read Contract page logic +- [#4660](https://github.com/blockscout/blockscout/pull/4660) - Save Sourcify path instead of filename +- [#4656](https://github.com/blockscout/blockscout/pull/4656) - Open in Tenderly button +- [#4655](https://github.com/blockscout/blockscout/pull/4655), [#4676](https://github.com/blockscout/blockscout/pull/4676) - EIP-3091 support +- [#4621](https://github.com/blockscout/blockscout/pull/4621) - Add beacon contract address slot for proxy +- [#4625](https://github.com/blockscout/blockscout/pull/4625) - Contract address page: Add implementation link to the overview of proxy contracts +- [#4624](https://github.com/blockscout/blockscout/pull/4624) - Support HTML tags in alert message +- [#4608](https://github.com/blockscout/blockscout/pull/4608), [#4622](https://github.com/blockscout/blockscout/pull/4622) - Block Details page: Improved style of transactions button +- [#4596](https://github.com/blockscout/blockscout/pull/4596), [#4681](https://github.com/blockscout/blockscout/pull/4681), [#4693](https://github.com/blockscout/blockscout/pull/4693) - Display token icon for bridged with Mainnet tokens or identicons for other tokens +- [#4520](https://github.com/blockscout/blockscout/pull/4520) - Add support for EIP-1559 +- [#4593](https://github.com/blockscout/blockscout/pull/4593) - Add status in `Position` pane for txs have no block +- [#4579](https://github.com/blockscout/blockscout/pull/4579) - Write contract page: Resize inputs; Improve multiplier selector + +### Fixes +- [#4857](https://github.com/blockscout/blockscout/pull/4857) - Fix `tx/raw-trace` Internal Server Error +- [#4854](https://github.com/blockscout/blockscout/pull/4854) - Fix infinite gas usage count loading +- [#4853](https://github.com/blockscout/blockscout/pull/4853) - Allow custom optimizations runs for contract verifications via API +- [#4840](https://github.com/blockscout/blockscout/pull/4840) - Replace Enum.dedup with Enum.uniq where actually uniq items are expected +- [#4835](https://github.com/blockscout/blockscout/pull/4835) - Fix view for broken token icons +- [#4830](https://github.com/blockscout/blockscout/pull/4830) - Speed up txs per day chart data collection +- [#4818](https://github.com/blockscout/blockscout/pull/4818) - Fix for extract_omni_bridged_token_metadata_wrapper method +- [#4812](https://github.com/blockscout/blockscout/pull/4812), [#4815](https://github.com/blockscout/blockscout/pull/4815) - Check if exists custom_cap property of extended token object before access it +- [#4810](https://github.com/blockscout/blockscout/pull/4810) - Show `nil` block.size as `N/A bytes` +- [#4806](https://github.com/blockscout/blockscout/pull/4806) - Get token type for token balance update if it is empty +- [#4802](https://github.com/blockscout/blockscout/pull/4802) - Fix floating tooltip on the main page +- [#4801](https://github.com/blockscout/blockscout/pull/4801) - Added clauses and tests for get_total_staked_and_ordered/1 +- [#4798](https://github.com/blockscout/blockscout/pull/4798) - Token instance View contract icon Safari fix +- [#4796](https://github.com/blockscout/blockscout/pull/4796) - Fix nil.timestamp issue +- [#4764](https://github.com/blockscout/blockscout/pull/4764) - Add cleaning of substrings of `require` messages from parsed constructor arguments +- [#4778](https://github.com/blockscout/blockscout/pull/4778) - Migrate :optimization_runs field type: `int4 -> int8` in `smart_contracts` table +- [#4768](https://github.com/blockscout/blockscout/pull/4768) - Block Details page: handle zero division +- [#4751](https://github.com/blockscout/blockscout/pull/4751) - Change text and link for `trade STAKE` button +- [#4746](https://github.com/blockscout/blockscout/pull/4746) - Fix comparison of decimal value +- [#4711](https://github.com/blockscout/blockscout/pull/4711) - Add trimming to the contract functions inputs +- [#4729](https://github.com/blockscout/blockscout/pull/4729) - Fix bugs with fees in cases of txs with `gas price = 0` +- [#4725](https://github.com/blockscout/blockscout/pull/4725) - Fix hardcoded coin name on transaction's and block's page +- [#4724](https://github.com/blockscout/blockscout/pull/4724), [#4842](https://github.com/blockscout/blockscout/pull/4841) - Sanitizer of "empty" blocks +- [#4717](https://github.com/blockscout/blockscout/pull/4717) - Contract verification fix: check only success creation tx +- [#4713](https://github.com/blockscout/blockscout/pull/4713) - Search input field: sanitize input +- [#4703](https://github.com/blockscout/blockscout/pull/4703) - Block Details page: Fix pagination on the Transactions tab +- [#4686](https://github.com/blockscout/blockscout/pull/4686) - Block page: check gas limit value before division +- [#4678](https://github.com/blockscout/blockscout/pull/4678) - Internal transactions indexer: fix issue of some pending transactions never become confirmed +- [#4668](https://github.com/blockscout/blockscout/pull/4668) - Fix css for dark theme +- [#4654](https://github.com/blockscout/blockscout/pull/4654) - AddressView: Change `@burn_address` to string `0x0000000000000000000000000000000000000000` +- [#4626](https://github.com/blockscout/blockscout/pull/4626) - Refine view of popup for reverted tx +- [#4640](https://github.com/blockscout/blockscout/pull/4640) - Token page: fixes in mobile view +- [#4612](https://github.com/blockscout/blockscout/pull/4612) - Hide error selector in the contract's functions list +- [#4615](https://github.com/blockscout/blockscout/pull/4615) - Fix broken style for `View more transfers` button +- [#4592](https://github.com/blockscout/blockscout/pull/4592) - Add `type` field for `receive` and `fallback` entities of a Smart Contract +- [#4601](https://github.com/blockscout/blockscout/pull/4601) - Fix endless Fetching tokens... message on empty addresses +- [#4591](https://github.com/blockscout/blockscout/pull/4591) - Add step and min value for txValue input field +- [#4589](https://github.com/blockscout/blockscout/pull/4589) - Fix solid outputs on contract read page +- [#4586](https://github.com/blockscout/blockscout/pull/4586) - Fix floating tooltips on the token transfer family blocks +- [#4587](https://github.com/blockscout/blockscout/pull/4587) - Enable navbar menu on Search results page +- [#4582](https://github.com/blockscout/blockscout/pull/4582) - Fix NaN input on write contract page + +### Chore +- [#4876](https://github.com/blockscout/blockscout/pull/4876) - Add missing columns updates when INSERT ... ON CONFLICT DO UPDATE ... happens +- [#4872](https://github.com/blockscout/blockscout/pull/4872) - Set explicit ascending order by hash in acquire transactions query of internal transactions import +- [#4871](https://github.com/blockscout/blockscout/pull/4871) - Remove cumulative gas used update duplicate +- [#4860](https://github.com/blockscout/blockscout/pull/4860) - Node 16 support +- [#4828](https://github.com/blockscout/blockscout/pull/4828) - Logging for txs/day chart +- [#4823](https://github.com/blockscout/blockscout/pull/4823) - Various error handlers with unresponsive JSON RPC endpoint +- [#4821](https://github.com/blockscout/blockscout/pull/4821) - Block Details page: Remove crossing at the Burnt Fee line +- [#4819](https://github.com/blockscout/blockscout/pull/4819) - Add config for GasUsage Cache +- [#4781](https://github.com/blockscout/blockscout/pull/4781) - PGAnalyze index suggestions +- [#4735](https://github.com/blockscout/blockscout/pull/4735) - Code clean up: Remove clauses for outdated ganache bugs +- [#4726](https://github.com/blockscout/blockscout/pull/4726) - Update chart.js +- [#4707](https://github.com/blockscout/blockscout/pull/4707) - Top navigation: Move Accounts tab to Tokens +- [#4704](https://github.com/blockscout/blockscout/pull/4704) - Update to Erlang/OTP 24 +- [#4682](https://github.com/blockscout/blockscout/pull/4682) - Update all possible outdated mix dependencies +- [#4663](https://github.com/blockscout/blockscout/pull/4663) - Migrate to Elixir 1.12.x +- [#4661](https://github.com/blockscout/blockscout/pull/4661) - Update NPM packages to resolve vulnerabilities +- [#4649](https://github.com/blockscout/blockscout/pull/4649) - 1559 Transaction Page: Convert Burnt Fee to ether and add price in USD +- [#4646](https://github.com/blockscout/blockscout/pull/4646) - Transaction page: Rename burned to burnt +- [#4611](https://github.com/blockscout/blockscout/pull/4611) - Ability to hide miner in block views + + +## 3.7.3-beta + +### Features +- [#4569](https://github.com/blockscout/blockscout/pull/4569) - Smart-Contract: remove comment with the submission date +- [#4568](https://github.com/blockscout/blockscout/pull/4568) - TX page: Token transfer and minting section improvements +- [#4540](https://github.com/blockscout/blockscout/pull/4540) - Allign copy buttons for `Block Details` and `Transaction Details` pages +- [#4528](https://github.com/blockscout/blockscout/pull/4528) - Block Details page: rework view +- [#4531](https://github.com/blockscout/blockscout/pull/4531) - Add Arbitrum support +- [#4524](https://github.com/blockscout/blockscout/pull/4524) - Add index position of transaction in the block +- [#4489](https://github.com/blockscout/blockscout/pull/4489) - Search results page - [#4475](https://github.com/blockscout/blockscout/pull/4475) - Tx page facelifting -- [#4452](https://github.com/blockscout/blockscout/pull/4452) - Add names for smart-conrtact's function response +- [#4452](https://github.com/blockscout/blockscout/pull/4452) - Add names for smart-contract's function response ### Fixes -- [#4494](https://github.com/blockscout/blockscout/pull/4494) - Fix empty created_contract_address in transaction +- [#4553](https://github.com/blockscout/blockscout/pull/4553) - Indexer performance update: skip genesis block in requesting of trace_block API endpoint +- [#4546](https://github.com/blockscout/blockscout/pull/4546) - Indexer performance update: async get block rewards +- [#4544](https://github.com/blockscout/blockscout/pull/4544) - Indexer performance update: Add skip_metadata flag for token if indexer failed to get any of [name, symbol, decimals, totalSupply] +- [#4542](https://github.com/blockscout/blockscout/pull/4542) - Indexer performance update: Deduplicate tokens in the indexer token transfers transformer +- [#4535](https://github.com/blockscout/blockscout/pull/4535) - Indexer performance update:: Eliminate multiple updates of the same token while parsing mint/burn token transfers batch +- [#4527](https://github.com/blockscout/blockscout/pull/4527) - Indexer performance update: refactor coin balance daily fetcher +- [#4525](https://github.com/blockscout/blockscout/pull/4525) - Uncataloged token transfers query performance improvement +- [#4513](https://github.com/blockscout/blockscout/pull/4513) - Fix installation with custom default path: add NETWORK_PATH variable to the current_path +- [#4500](https://github.com/blockscout/blockscout/pull/4500) - `/tokens/{addressHash}/instance/{id}/token-transfers`: fix incorrect next page url - [#4493](https://github.com/blockscout/blockscout/pull/4493) - Contract's code page: handle null contracts_creation_transaction - [#4488](https://github.com/blockscout/blockscout/pull/4488) - Tx page: handle empty to_address - [#4483](https://github.com/blockscout/blockscout/pull/4483) - Fix copy-paste typo in `token_transfers_counter.ex` @@ -16,6 +210,11 @@ - [#4401](https://github.com/blockscout/blockscout/pull/4401) - Fix displaying of token holders with the same amount ### Chore +- [#4550](https://github.com/blockscout/blockscout/pull/4550) - Update con_cache package to 1.0 +- [#4523](https://github.com/blockscout/blockscout/pull/4523) - Change order of transations in block's view +- [#4521](https://github.com/blockscout/blockscout/pull/4521) - Rewrite transaction page tooltips +- [#4516](https://github.com/blockscout/blockscout/pull/4516) - Add DB migrations step into Docker start script +- [#4497](https://github.com/blockscout/blockscout/pull/4497) - Handle error in fetch_validators_list method - [#4444](https://github.com/blockscout/blockscout/pull/4444) - Main page performance cumulative update - [#4439](https://github.com/blockscout/blockscout/pull/4439), - [#4465](https://github.com/blockscout/blockscout/pull/4465) - Fix revert response in contract's output diff --git a/apps/block_scout_web/assets/css/components/_verify_other_explorers.scss b/apps/block_scout_web/assets/css/components/_verify_other_explorers.scss index e0371b6cad46..f97e39728a08 100644 --- a/apps/block_scout_web/assets/css/components/_verify_other_explorers.scss +++ b/apps/block_scout_web/assets/css/components/_verify_other_explorers.scss @@ -13,7 +13,7 @@ } h2 { color: #a3a9b5; - font-size: 12px; + font-size: 14px; font-weight: 400; line-height: 1.25; display: inline-flex; @@ -66,18 +66,18 @@ background-repeat: no-repeat; background-position: center; &.etherscan { - @include image-2x('../static/images/icons/etherscan@2x.png', 15px, 16px); - background-image: url("../static/images/icons/etherscan.png"); + @include image-2x('/images/icons/etherscan@2x.png', 15px, 16px); + background-image: url("/images/icons/etherscan.png"); background-size: 15px 16px; } &.blockchair { - @include image-2x('../static/images/icons/blockchair@2x.png', 10px, 16px); - background-image: url("../static/images/icons/blockchair.png"); + @include image-2x('/images/icons/blockchair@2x.png', 10px, 16px); + background-image: url("/images/icons/blockchair.png"); background-size: 10px 16px; } &.etherchain { - @include image-2x('../static/images/icons/etherchain@2x.png', 16px, 16px); - background-image: url("../static/images/icons/etherchain.png"); + @include image-2x('/images/icons/etherchain@2x.png', 16px, 16px); + background-image: url("/images/icons/etherchain.png"); background-size: 16px 16px; } } @@ -168,31 +168,31 @@ &:first-child { .verify-other-explorers-cell.left { .exp-logo { - @include image-2x('../static/images/icons/etherscan@2x.png', 15px, 16px); - background-image: url("../static/images/icons/etherscan.png"); + @include image-2x('/images/icons/blockchair@2x.png', 10px, 16px); + background-image: url("/images/icons/blockchair.png"); background-repeat: no-repeat; padding-left: 25px; - background-size: 15px 16px; + background-size: 10px 16px; + background-position: left 3px center; } } } &:nth-child(2) { .verify-other-explorers-cell.left { .exp-logo { - @include image-2x('../static/images/icons/blockchair@2x.png', 10px, 16px); - background-image: url("../static/images/icons/blockchair.png"); + @include image-2x('/images/icons/etherscan@2x.png', 15px, 16px); + background-image: url("/images/icons/etherscan.png"); background-repeat: no-repeat; padding-left: 25px; - background-size: 10px 16px; - background-position: left 3px center; + background-size: 15px 16px; } } } &:nth-child(3) { .verify-other-explorers-cell.left { .exp-logo { - @include image-2x('../static/images/icons/etherchain@2x.png', 16px, 16px); - background-image: url("../static/images/icons/etherchain.png"); + @include image-2x('/images/icons/etherchain@2x.png', 16px, 16px); + background-image: url("/images/icons/etherchain.png"); background-repeat: no-repeat; padding-left: 25px; background-size: 16px 16px; @@ -209,7 +209,7 @@ } .link { - background-image: url("../static/images/icons/link.svg"); + background-image: url("/images/icons/link.svg"); background-repeat: no-repeat; padding-left: 15px; background-size: 12px 12px; diff --git a/apps/block_scout_web/assets/css/theme/_variables-non-critical.scss b/apps/block_scout_web/assets/css/theme/_variables-non-critical.scss index 6f6f26340c86..4bc7448c6cb7 100644 --- a/apps/block_scout_web/assets/css/theme/_variables-non-critical.scss +++ b/apps/block_scout_web/assets/css/theme/_variables-non-critical.scss @@ -3,7 +3,7 @@ // @import "xusdt_variables-non-critical"; // @import "dai_variables-non-critical"; // @import "ethereum_classic_variables-non-critical"; -// @import "ethereum_variables-non-critical"; +@import "ethereum_variables-non-critical"; // @import "ether1_variables-non-critical"; // @import "expanse_variables-non-critical"; // @import "gochain_variables-non-critical"; diff --git a/apps/block_scout_web/assets/css/theme/_variables.scss b/apps/block_scout_web/assets/css/theme/_variables.scss index 1cdaed4a18d2..5c4fabdd7707 100644 --- a/apps/block_scout_web/assets/css/theme/_variables.scss +++ b/apps/block_scout_web/assets/css/theme/_variables.scss @@ -1,5 +1,5 @@ @import "base_variables"; -// @import "neutral_variables"; +@import "ethereum_variables"; // @import "xusdt_variables"; // @import "dai_variables"; // @import "ethereum_classic_variables"; @@ -21,7 +21,6 @@ // @import "tomochain_variables"; // @import "rsk_variables"; // @import "ethercore_variables"; -@import "optimism_variables"; // responsive breakpoints $breakpoint-xs: 320px; diff --git a/apps/block_scout_web/assets/js/lib/autocomplete.js b/apps/block_scout_web/assets/js/lib/autocomplete.js index c957066873de..130f8197521e 100644 --- a/apps/block_scout_web/assets/js/lib/autocomplete.js +++ b/apps/block_scout_web/assets/js/lib/autocomplete.js @@ -1,11 +1,8 @@ import $ from 'jquery' -// @ts-ignore import AutoComplete from '@tarekraafat/autocomplete.js/dist/autoComplete' import { getTextAdData, fetchTextAdData } from './ad' import { DateTime } from 'luxon' import { appendTokenIcon } from './token_icon' -import { escapeHtml } from './utils' -import { commonPath } from './path_helper' import xss from 'xss' const placeHolder = 'Search by address, token symbol, name, transaction hash, or block number' @@ -15,16 +12,16 @@ const dataSrc = async (query, id) => { const searchInput = document .getElementById(id) - searchInput && searchInput.setAttribute('placeholder', 'Loading...') + searchInput.setAttribute('placeholder', 'Loading...') // Fetch External Data Source const source = await fetch( - `${commonPath}/token-autocomplete?q=${query}` + `/token-autocomplete?q=${query}` ) const data = await source.json() // Post Loading placeholder text - searchInput && searchInput.setAttribute('placeholder', placeHolder) + searchInput.setAttribute('placeholder', placeHolder) // Returns Fetched data return data } catch (error) { @@ -41,24 +38,20 @@ const resultsListElement = (list, data) => { if (data.results.length > 0) { info.innerHTML += `Displaying ${data.results.length} results` } else if (data.query !== '###') { - info.innerHTML += `Found ${data.matches.length} matching results for ` - const strong = document.createElement('strong') - strong.appendChild(document.createTextNode(data.query)) - info.appendChild(strong) + info.innerHTML += `Found ${data.matches.length} matching results for "${data.query}"` } list.prepend(info) fetchTextAdData() } -export const searchEngine = (query, record) => { - const queryLowerCase = query.toLowerCase() +const searchEngine = (query, record) => { if (record && ( - (record.name && record.name.toLowerCase().includes(queryLowerCase)) || - (record.symbol && record.symbol.toLowerCase().includes(queryLowerCase)) || - (record.address_hash && record.address_hash.toLowerCase().includes(queryLowerCase)) || - (record.tx_hash && record.tx_hash.toLowerCase().includes(queryLowerCase)) || - (record.block_hash && record.block_hash.toLowerCase().includes(queryLowerCase)) + (record.name && record.name.toLowerCase().includes(query.toLowerCase())) || + (record.symbol && record.symbol.toLowerCase().includes(query.toLowerCase())) || + (record.address_hash && record.address_hash.toLowerCase().includes(query.toLowerCase())) || + (record.tx_hash && record.tx_hash.toLowerCase().includes(query.toLowerCase())) || + (record.block_hash && record.block_hash.toLowerCase().includes(query.toLowerCase())) ) ) { let searchResult = '
<%= gettext "This page is no longer explorable! If you are lost, use the search bar to find what you are looking for." %>
- <%= gettext "Back to home" %> +The requested path was not found on BlockScout.
+ Back HomePending stake (stake placed on a candidate pool or placed during the current staking epoch) may be withdrawn now.
\nActive stake (stake available after the current epoch) can be ordered for withdrawal from the pool, and will be available to claim after the current staking epoch is complete.
\nIf you have already ordered (and the staking window is still open), you may increase your current order by entering a positive value, or decrease your current order by entering a negative value in the box and clicking 'Order Withdrawal'. You must either keep the minimum stake amount in the pool, or order your entire stake for withdrawal.
\n" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:100 -#, elixir-autogen, elixir-format -msgid "A confirmation email was sent to" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:36 +msgid "To become a candidate, your staking address must be funded with %{tokenSymbol} tokens and %{coinSymbol} coins, and your OpenEthereum node must be active and configured with the mining address you specify here.
\nTo become a delegator, close this window and select an address from the list of pools you would like to place stake on. Click the Stake button next to the address to begin the process.
" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_first.html.eex:4 -#, elixir-autogen, elixir-format -msgid "A library name called in the .sol file. Multiple libraries (up to " +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:97 +msgid "A block producer who successfully included the block onto the blockchain." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:73 -#, elixir-autogen, elixir-format msgid "A string with the name of the action to be invoked." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:62 -#, elixir-autogen, elixir-format msgid "A string with the name of the module to be invoked." msgstr "" -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:24 -#, elixir-autogen, elixir-format -msgid "ABI" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification_common_fields/_constructor_args.html.eex:3 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:62 msgid "ABI-encoded Constructor Arguments (if required by the contract)" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/index.html.eex:4 -#, elixir-autogen, elixir-format msgid "API Documentation" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_metatags.html.eex:4 -#, elixir-autogen, elixir-format msgid "API endpoints for the %{subnetwork}" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_metatags.html.eex:2 -#, elixir-autogen, elixir-format msgid "API for the %{subnetwork} - BlockScout" msgstr "" -#: lib/block_scout_web/templates/account/api_key/form.html.eex:7 -#: lib/block_scout_web/templates/account/api_key/form.html.eex:13 -#: lib/block_scout_web/templates/account/api_key/form.html.eex:14 -#: lib/block_scout_web/templates/account/api_key/index.html.eex:29 -#, elixir-autogen, elixir-format -msgid "API key" +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:124 +msgid "APIs" msgstr "" -#: lib/block_scout_web/templates/account/api_key/index.html.eex:7 -#: lib/block_scout_web/templates/account/common/_nav.html.eex:16 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:18 -#, elixir-autogen, elixir-format -msgid "API keys" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:39 +msgid "APY" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:106 -#, elixir-autogen, elixir-format -msgid "APIs" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:79 +msgid "APY & Predicted Reward" msgstr "" -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:24 -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:24 +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:69 -#, elixir-autogen, elixir-format msgid "Action" msgstr "" -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:25 -#, elixir-autogen, elixir-format -msgid "Actions" -msgstr "" - -#: lib/block_scout_web/templates/transaction/overview.html.eex:451 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:423 msgid "Actual gas amount used by the transaction." msgstr "" -#: lib/block_scout_web/templates/account/api_key/form.html.eex:7 -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:8 -#: lib/block_scout_web/templates/layout/_add_chain_to_mm.html.eex:10 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:44 msgid "Add" msgstr "" -#: lib/block_scout_web/templates/account/api_key/index.html.eex:44 -#, elixir-autogen, elixir-format -msgid "Add API key" -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:86 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:76 -#, elixir-autogen, elixir-format -msgid "Add Contract Libraries" -msgstr "" - -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:44 -#, elixir-autogen, elixir-format -msgid "Add Custom ABI" -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:97 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:87 -#, elixir-autogen, elixir-format -msgid "Add Library" -msgstr "" - -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:38 -#, elixir-autogen, elixir-format -msgid "Add address" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:7 -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:37 -#, elixir-autogen, elixir-format -msgid "Add address tag" -msgstr "" - -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Add address to the Watch list" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:7 -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:37 -#, elixir-autogen, elixir-format -msgid "Add transaction tag" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:11 -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:23 -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:23 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:12 +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:16 -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_address.html.eex:4 -#: lib/block_scout_web/templates/tokens/index.html.eex:34 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:20 -#: lib/block_scout_web/templates/transaction_state/index.html.eex:34 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:60 -#: lib/block_scout_web/views/address_view.ex:109 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:20 lib/block_scout_web/views/address_view.ex:104 msgid "Address" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:243 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:211 msgid "Address (external or contract) receiving the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:225 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:191 msgid "Address (external or contract) sending the transaction." msgstr "" -#: lib/block_scout_web/templates/account/common/_nav.html.eex:10 -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:7 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:16 -#, elixir-autogen, elixir-format -msgid "Address Tags" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:164 +msgid "Address balance in xDAI (doesn't include ERC20, ERC721, ERC1155 tokens)." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:149 -#, elixir-autogen, elixir-format -msgid "Address balance in" -msgstr "" - -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:51 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:65 msgid "Address of the token contract" msgstr "" -#: lib/block_scout_web/templates/transaction_state/_state_change.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Address used in token mintings and burnings." -msgstr "" - -#: lib/block_scout_web/templates/account/public_tags_request/address_field.html.eex:2 -#, elixir-autogen, elixir-format -msgid "Address*" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address/index.html.eex:5 -#, elixir-autogen, elixir-format msgid "Addresses" msgstr "" -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:38 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:35 -#, elixir-autogen, elixir-format -msgid "Age" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:26 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:28 -#: lib/block_scout_web/templates/address_transaction/index.html.eex:22 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:88 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:20 -#: lib/block_scout_web/views/address_internal_transaction_view.ex:11 -#: lib/block_scout_web/views/address_token_transfer_view.ex:11 -#: lib/block_scout_web/views/address_transaction_view.ex:11 -#: lib/block_scout_web/views/verified_contracts_view.ex:13 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:28 lib/block_scout_web/templates/address_transaction/index.html.eex:22 +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:21 lib/block_scout_web/templates/layout/_topnav.html.eex:73 +#: lib/block_scout_web/templates/layout/_topnav.html.eex:105 lib/block_scout_web/views/address_internal_transaction_view.ex:11 +#: lib/block_scout_web/views/address_token_transfer_view.ex:11 lib/block_scout_web/views/address_transaction_view.ex:11 msgid "All" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/smart_contract/_functions.html.eex:13 -#, elixir-autogen, elixir-format msgid "All functions displayed below are from ABI of that contract. In order to verify current contract, proceed with" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:27 -#, elixir-autogen, elixir-format msgid "All metadata displayed below is from that contract. In order to verify current contract, click" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:174 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:27 +msgid "All pool participant addresses. The top address belongs to the %{pool_type}." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:189 msgid "All tokens in the account and total value." msgstr "" -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:41 -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:32 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:38 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:27 +msgid "Already Ordered:" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:10 lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:14 +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:11 lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:11 msgid "Amount" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:437 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:409 msgid "Amount of" msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:236 -#, elixir-autogen, elixir-format -msgid "Amount of distributed reward. Miners receive a static block reward + Tx fees + uncle fees." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:41 +msgid "Amount of %{symbol} placed by an address." msgstr "" -#: lib/block_scout_web/templates/internal_server_error/index.html.eex:8 -#, elixir-autogen, elixir-format -msgid "An unexpected error has occurred. Try reloading the page, or come back soon and try again." +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:236 +msgid "Amount of distributed reward. Miners receive a static block reward + Tx fees + uncle fees." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:15 -#, elixir-autogen, elixir-format msgid "Anything not in this list is not supported. Click on the method to be taken to the documentation for that method, and check the notes section for any potential differences." msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:134 -#, elixir-autogen, elixir-format -msgid "Apps" -msgstr "" - -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:21 -#, elixir-autogen, elixir-format -msgid "Average" -msgstr "" - -#: lib/block_scout_web/templates/chain/show.html.eex:101 -#, elixir-autogen, elixir-format -msgid "Average block time" -msgstr "" - -#: lib/block_scout_web/templates/account/api_key/form.html.eex:25 -#, elixir-autogen, elixir-format -msgid "Back to API keys (Cancel)" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:80 +msgid "Approximate Current Annual Percentage Yield. If you see N/A, please reopen the popup in a few blocks (APY cannot be calculated at the very beginning of a staking epoch). Predicted Reward is the amount of %{symbol} a participant will receive for staking and can claim once the current epoch ends." msgstr "" -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Back to Address Tags (Cancel)" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:39 +msgid "Approximate Current Annual Percentage Yield. If you see N/A, please wait for a few blocks (APY cannot be calculated at the very beginning of a staking epoch)." msgstr "" -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:30 -#, elixir-autogen, elixir-format -msgid "Back to Custom ABI (Cancel)" +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:152 +msgid "Apps" msgstr "" -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Back to Transaction Tags (Cancel)" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:48 +msgid "Available Now:" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:81 -#, elixir-autogen, elixir-format -msgid "Back to Watch list (Cancel)" +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:123 +msgid "Average block time" msgstr "" -#: lib/block_scout_web/templates/error422/index.html.eex:9 -#: lib/block_scout_web/templates/internal_server_error/index.html.eex:9 -#: lib/block_scout_web/templates/page_not_found/index.html.eex:9 -#: lib/block_scout_web/templates/transaction/not_found.html.eex:13 -#, elixir-autogen, elixir-format -msgid "Back to home" +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:30 +msgid "Back Home" msgstr "" -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:24 -#: lib/block_scout_web/templates/address/overview.html.eex:150 -#: lib/block_scout_web/templates/address_token/overview.html.eex:51 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:63 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_balance_card.html.eex:4 +#: lib/block_scout_web/templates/address/overview.html.eex:165 lib/block_scout_web/templates/address_token/overview.html.eex:51 +#: lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:42 lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:43 msgid "Balance" msgstr "" -#: lib/block_scout_web/templates/transaction_state/index.html.eex:40 -#, elixir-autogen, elixir-format -msgid "Balance after" +#, elixir-format +#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:14 +msgid "Balances" msgstr "" -#: lib/block_scout_web/templates/transaction_state/index.html.eex:37 -#, elixir-autogen, elixir-format -msgid "Balance before" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:32 +msgid "Banned" msgstr "" -#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Balances" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_rows.html.eex:46 +msgid "Banned until block #%{banned_until} (%{estimated_unban_day})" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:207 -#, elixir-autogen, elixir-format msgid "Base Fee per Gas" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:5 #: lib/block_scout_web/templates/api_docs/index.html.eex:5 -#, elixir-autogen, elixir-format msgid "Base URL:" msgstr "" -#: lib/block_scout_web/templates/withdrawal/_metatags.html.eex:2 -#, elixir-autogen, elixir-format -msgid "Beacon chain withdrawals - %{subnetwork} Explorer" -msgstr "" - -#: lib/block_scout_web/templates/withdrawal/_metatags.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Beacon chain, Withdrawals, %{subnetwork}, %{coin}" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_empty_content.html.eex:13 +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:5 +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:33 lib/block_scout_web/templates/stakes/_stakes_top.html.eex:24 +msgid "Become a Candidate" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:472 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:444 msgid "Binary data included with the transaction. See input / logs below for additional info." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_coin_balance/_coin_balances.html.eex:8 -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:35 -#: lib/block_scout_web/templates/block/overview.html.eex:29 -#: lib/block_scout_web/templates/transaction/overview.html.eex:161 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:29 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:26 lib/block_scout_web/templates/transaction/overview.html.eex:150 msgid "Block" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_link.html.eex:2 -#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:32 -#: lib/block_scout_web/templates/tokens/transfer/_token_transfer.html.eex:43 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:28 lib/block_scout_web/templates/tokens/transfer/_token_transfer.html.eex:43 msgid "Block #%{number}" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_metatags.html.eex:3 -#, elixir-autogen, elixir-format msgid "Block %{block_number} - %{subnetwork} Explorer" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block_transaction/404.html.eex:7 -#, elixir-autogen, elixir-format msgid "Block Details" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:53 -#, elixir-autogen, elixir-format msgid "Block Height" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:47 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/app.html.eex:46 msgid "Block Mined, awaiting import..." msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:34 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:33 msgid "Block Pending" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:158 -#, elixir-autogen, elixir-format msgid "Block difficulty for miner, used to calibrate block generation time (Note: constant in POA based networks)." msgstr "" +#, elixir-format #: lib/block_scout_web/views/block_transaction_view.ex:15 -#, elixir-autogen, elixir-format msgid "Block not found, please try again later." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:160 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:5 +msgid "Block number" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:149 msgid "Block number containing the transaction." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:257 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:272 msgid "Block number in which the address was updated." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/chain/_metatags.html.eex:4 -#, elixir-autogen, elixir-format msgid "BlockScout provides analytics data, API, and Smart Contract tools for the %{subnetwork}" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:29 -#, elixir-autogen, elixir-format -msgid "Blockchain" -msgstr "" - -#: lib/block_scout_web/templates/chain/show.html.eex:154 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:34 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:38 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:165 +#: lib/block_scout_web/templates/layout/_topnav.html.eex:24 lib/block_scout_web/templates/layout/_topnav.html.eex:28 msgid "Blocks" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:46 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/app.html.eex:45 msgid "Blocks Indexed" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:56 -#: lib/block_scout_web/templates/address/overview.html.eex:275 -#: lib/block_scout_web/templates/address_validation/index.html.eex:11 -#: lib/block_scout_web/views/address_view.ex:386 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:48 +#: lib/block_scout_web/templates/address/overview.html.eex:289 lib/block_scout_web/templates/address_validation/index.html.eex:11 +#: lib/block_scout_web/views/address_view.ex:356 msgid "Blocks Validated" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:48 -#, elixir-autogen, elixir-format -msgid "Blocks With Internal Transactions Indexed" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/layout/_footer.html.eex:22 -#, elixir-autogen, elixir-format msgid "Blockscout is a tool for inspecting and analyzing EVM based blockchains. Blockchain explorer for Ethereum Networks." msgstr "" -#: lib/block_scout_web/templates/transaction_state/_state_change.html.eex:8 -#, elixir-autogen, elixir-format -msgid "Burn address" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:45 +msgid "Bridge STAKE to Ethereum" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/bridged_tokens/index.html.eex:7 +msgid "Bridged Tokens from " +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:84 +msgid "Bridged from BSC" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:78 +msgid "Bridged from Ethereum" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_tile.html.eex:64 #: lib/block_scout_web/templates/block/overview.html.eex:216 -#, elixir-autogen, elixir-format msgid "Burnt Fees" msgstr "" -#: lib/block_scout_web/templates/address_token/overview.html.eex:65 -#, elixir-autogen, elixir-format -msgid "CRC Worth" -msgstr "" - -#: lib/block_scout_web/templates/common_components/_csv_export_button.html.eex:4 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/common_components/_csv_export_button.html.eex:2 msgid "CSV" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:10 #: lib/block_scout_web/views/internal_transaction_view.ex:21 -#, elixir-autogen, elixir-format msgid "Call" msgstr "" +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:22 -#, elixir-autogen, elixir-format msgid "Call Code" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:62 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:120 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:115 -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:41 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:107 -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:55 -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:51 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:47 +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:114 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:231 +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:48 +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:60 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:85 lib/block_scout_web/templates/api_docs/_action_tile.html.eex:47 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:54 -#, elixir-autogen, elixir-format msgid "Cancel" msgstr "" -#: lib/block_scout_web/templates/transaction_state/index.html.eex:43 -#, elixir-autogen, elixir-format -msgid "Change" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:10 +msgid "Candidate and Validator Pool Addresses. Current validator pools are specified by a checkmark." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:47 +msgid "Candidate’s Staked Amount" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:11 +msgid "Change Network" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:43 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:41 msgid "Chat (#blockscout)" msgstr "" -#: lib/block_scout_web/views/block_view.ex:65 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:6 +msgid "Choose Pool" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:22 +msgid "Choose Target Pool" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/views/block_view.ex:63 msgid "Chore Reward" msgstr "" -#: lib/block_scout_web/templates/tokens/index.html.eex:38 -#, elixir-autogen, elixir-format -msgid "Circulating Market Cap" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_withdrawal.html.eex:7 +msgid "Claim Ordered Withdraw" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward.html.eex:6 +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:59 lib/block_scout_web/templates/stakes/_stakes_top.html.eex:30 +msgid "Claim Reward" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:40 +msgid "Claim for" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_withdrawal.html.eex:18 +msgid "Claim the Amount" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:137 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:106 -#, elixir-autogen, elixir-format msgid "Clear" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:37 -#: lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:6 -#: lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:14 -#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:84 -#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:92 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:6 lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:14 +#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:84 lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:92 msgid "Close" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:66 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:165 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:187 -#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:126 -#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:149 -#: lib/block_scout_web/views/address_view.ex:379 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:58 +#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:165 lib/block_scout_web/templates/api_docs/_action_tile.html.eex:187 +#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:126 lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:149 +#: lib/block_scout_web/views/address_view.ex:349 msgid "Code" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:42 -#: lib/block_scout_web/views/address_view.ex:385 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:34 +#: lib/block_scout_web/views/address_view.ex:355 msgid "Coin Balance History" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:55 -#, elixir-autogen, elixir-format msgid "Collapse" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Company name" -msgstr "" - -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:32 -#, elixir-autogen, elixir-format -msgid "Company website" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification_common_fields/_compiler_field.html.eex:3 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:69 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:40 msgid "Compiler" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:142 -#, elixir-autogen, elixir-format -msgid "Compiler Settings" -msgstr "" - -#: lib/block_scout_web/templates/address_contract/index.html.eex:71 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:65 msgid "Compiler version" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:364 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:344 msgid "Confirmed" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:127 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:116 msgid "Confirmed by " msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:193 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:182 msgid "Confirmed within" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:2 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:6 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:11 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:2 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:4 -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:6 -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:4 -#: lib/block_scout_web/templates/tokens/holder/index.html.eex:16 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:9 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:6 lib/block_scout_web/templates/tokens/holder/index.html.eex:15 msgid "Connection Lost" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_coin_balance/index.html.eex:12 #: lib/block_scout_web/templates/block/index.html.eex:5 -#, elixir-autogen, elixir-format msgid "Connection Lost, click to load newer blocks" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:15 -#, elixir-autogen, elixir-format msgid "Connection Lost, click to load newer internal transactions" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_transaction/index.html.eex:11 -#: lib/block_scout_web/templates/pending_transaction/index.html.eex:16 -#: lib/block_scout_web/templates/transaction/index.html.eex:22 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/pending_transaction/index.html.eex:16 lib/block_scout_web/templates/transaction/index.html.eex:22 msgid "Connection Lost, click to load newer transactions" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_validation/index.html.eex:10 -#, elixir-autogen, elixir-format msgid "Connection Lost, click to load newer validations" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:96 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:90 msgid "Constructor Arguments" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:78 -#, elixir-autogen, elixir-format -msgid "Constructor args" -msgstr "" - -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:52 -#: lib/block_scout_web/templates/transaction/overview.html.eex:253 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:221 msgid "Contract" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:157 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:126 msgid "Contract ABI" msgstr "" -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:18 -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:29 +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:14 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_contract_address_field.html.eex:3 -#: lib/block_scout_web/views/address_view.ex:107 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:23 +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:9 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:18 lib/block_scout_web/views/address_view.ex:102 msgid "Contract Address" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:16 -#: lib/block_scout_web/views/address_view.ex:47 -#: lib/block_scout_web/views/address_view.ex:81 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/views/address_view.ex:42 lib/block_scout_web/views/address_view.ex:76 msgid "Contract Address Pending" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:480 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:459 msgid "Contract Call" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:477 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:456 msgid "Contract Creation" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:174 -#: lib/block_scout_web/templates/address_contract/index.html.eex:189 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:142 +#: lib/block_scout_web/templates/address_contract/index.html.eex:157 msgid "Contract Creation Code" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:90 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:80 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:100 msgid "Contract Libraries" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:75 +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:91 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_contract_name_field.html.eex:3 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:29 msgid "Contract Name" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:25 #: lib/block_scout_web/templates/smart_contract/_functions.html.eex:11 -#, elixir-autogen, elixir-format msgid "Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:47 -#, elixir-autogen, elixir-format -msgid "Contract name or address" -msgstr "" - -#: lib/block_scout_web/templates/address_contract/index.html.eex:63 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:57 msgid "Contract name:" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:106 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:100 msgid "Contract source code" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:120 -#, elixir-autogen, elixir-format -msgid "Contract was precompiled and created at genesis or contract creation transaction is missing" -msgstr "" - -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:5 -#, elixir-autogen, elixir-format -msgid "Contracts" -msgstr "" - -#: lib/block_scout_web/templates/address_contract/index.html.eex:180 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:148 msgid "Contracts that self destruct in their constructors have no contract code published and cannot be verified." msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:42 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:40 msgid "Contribute" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:159 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:128 msgid "Copy ABI" msgstr "" -#: lib/block_scout_web/templates/account/api_key/row.html.eex:6 -#: lib/block_scout_web/templates/account/api_key/row.html.eex:6 -#, elixir-autogen, elixir-format -msgid "Copy API key" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_address/row.html.eex:8 -#: lib/block_scout_web/templates/account/tag_address/row.html.eex:8 -#: lib/block_scout_web/templates/account/tag_transaction/row.html.eex:11 -#: lib/block_scout_web/templates/account/tag_transaction/row.html.eex:11 -#: lib/block_scout_web/templates/account/watchlist_address/row.html.eex:7 -#: lib/block_scout_web/templates/address/overview.html.eex:38 -#: lib/block_scout_web/templates/address/overview.html.eex:39 -#: lib/block_scout_web/templates/block/overview.html.eex:104 -#: lib/block_scout_web/templates/block/overview.html.eex:105 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:43 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:44 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:37 +#: lib/block_scout_web/templates/address/overview.html.eex:38 lib/block_scout_web/templates/block/overview.html.eex:104 +#: lib/block_scout_web/templates/block/overview.html.eex:105 lib/block_scout_web/templates/tokens/overview/_details.html.eex:50 +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:51 msgid "Copy Address" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:144 -#, elixir-autogen, elixir-format -msgid "Copy Compiler Settings" -msgstr "" - -#: lib/block_scout_web/templates/account/custom_abi/row.html.eex:6 -#: lib/block_scout_web/templates/account/custom_abi/row.html.eex:6 -#, elixir-autogen, elixir-format -msgid "Copy Contract Address" -msgstr "" - -#: lib/block_scout_web/templates/address_contract/index.html.eex:176 -#: lib/block_scout_web/templates/address_contract/index.html.eex:192 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:160 msgid "Copy Contract Creation Code" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:19 -#, elixir-autogen, elixir-format msgid "Copy Decompiled Contract Code" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:213 -#: lib/block_scout_web/templates/address_contract/index.html.eex:223 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:187 +#: lib/block_scout_web/templates/address_contract/index.html.eex:197 msgid "Copy Deployed ByteCode" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/row.html.eex:7 -#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:17 -#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:18 -#: lib/block_scout_web/templates/transaction/overview.html.eex:233 -#: lib/block_scout_web/templates/transaction/overview.html.eex:234 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:14 +#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:15 lib/block_scout_web/templates/transaction/overview.html.eex:201 +#: lib/block_scout_web/templates/transaction/overview.html.eex:202 msgid "Copy From Address" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:129 #: lib/block_scout_web/templates/block/overview.html.eex:130 -#, elixir-autogen, elixir-format msgid "Copy Hash" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/metadata/index.html.eex:20 -#, elixir-autogen, elixir-format msgid "Copy Metadata" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:149 #: lib/block_scout_web/templates/block/overview.html.eex:150 -#, elixir-autogen, elixir-format msgid "Copy Parent Hash" msgstr "" -#: lib/block_scout_web/templates/transaction_raw_trace/_card_body.html.eex:9 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction_raw_trace/index.html.eex:15 msgid "Copy Raw Trace" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:120 -#: lib/block_scout_web/templates/address_contract/index.html.eex:132 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:102 +#: lib/block_scout_web/templates/address_contract/index.html.eex:115 msgid "Copy Source Code" msgstr "" -#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:34 -#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:35 -#: lib/block_scout_web/templates/transaction/overview.html.eex:260 -#: lib/block_scout_web/templates/transaction/overview.html.eex:261 -#: lib/block_scout_web/templates/transaction/overview.html.eex:268 -#: lib/block_scout_web/templates/transaction/overview.html.eex:269 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:31 +#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:32 lib/block_scout_web/templates/transaction/overview.html.eex:230 +#: lib/block_scout_web/templates/transaction/overview.html.eex:231 lib/block_scout_web/templates/transaction/overview.html.eex:240 +#: lib/block_scout_web/templates/transaction/overview.html.eex:241 msgid "Copy To Address" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:32 #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:33 -#, elixir-autogen, elixir-format msgid "Copy Token ID" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:87 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:81 msgid "Copy Transaction Hash" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:88 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:82 msgid "Copy Txn Hash" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:498 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:470 msgid "Copy Txn Hex Input" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:504 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:476 msgid "Copy Txn UTF-8 Input" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:20 -#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:41 -#: lib/block_scout_web/templates/transaction/overview.html.eex:497 -#: lib/block_scout_web/templates/transaction/overview.html.eex:503 -#: lib/block_scout_web/templates/transaction_raw_trace/_card_body.html.eex:8 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:41 lib/block_scout_web/templates/transaction/overview.html.eex:469 +#: lib/block_scout_web/templates/transaction/overview.html.eex:475 msgid "Copy Value" msgstr "" +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:25 -#, elixir-autogen, elixir-format msgid "Create" msgstr "" -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:12 -#, elixir-autogen, elixir-format -msgid "Create a Custom ABI to interact with contracts." -msgstr "" - -#: lib/block_scout_web/templates/account/api_key/index.html.eex:12 -#, elixir-autogen, elixir-format -msgid "Create an API key to use with your RPC и EthRPC API requests." -msgstr "" - +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:26 -#, elixir-autogen, elixir-format msgid "Create2" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:102 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:118 msgid "Creator" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:146 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:116 -#, elixir-autogen, elixir-format msgid "Curl" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:97 -#, elixir-autogen, elixir-format -msgid "Current transaction state: Success, Failed (Error), or Pending (In Process)" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:55 +msgid "Current Reward Share" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:63 +msgid "Current Reward Share is calculated based on the Working Stake Amount." msgstr "" -#: lib/block_scout_web/templates/address_read_contract/index.html.eex:20 -#: lib/block_scout_web/templates/address_write_contract/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "Custom" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:35 +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:37 +msgid "Current Stake Amount" msgstr "" -#: lib/block_scout_web/templates/account/common/_nav.html.eex:19 -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:8 -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:7 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:19 -#, elixir-autogen, elixir-format -msgid "Custom ABI" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:36 +msgid "Current Stake:" msgstr "" -#: lib/block_scout_web/templates/address_read_contract/index.html.eex:25 -#: lib/block_scout_web/templates/address_write_contract/index.html.eex:23 -#, elixir-autogen, elixir-format -msgid "Custom ABI from account" +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:89 +msgid "Current transaction state: Success, Failed (Error), or Pending (In Process)" msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:70 -#, elixir-autogen, elixir-format -msgid "Daily Transactions" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_metatags.html.eex:6 +msgid "DApp for Staking %{symbol} tokens" msgstr "" -#: lib/block_scout_web/templates/address_logs/_logs.html.eex:98 -#: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:7 -#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:23 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:121 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_logs/_logs.html.eex:101 +#: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:7 lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:23 +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:120 msgid "Data" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:70 -#, elixir-autogen, elixir-format msgid "Date & time at which block was produced." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:179 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:168 msgid "Date & time of transaction inclusion, including length of time for confirmation." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:52 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:131 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:145 msgid "Decimals" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:32 -#: lib/block_scout_web/templates/address_logs/_logs.html.eex:38 -#: lib/block_scout_web/templates/address_logs/_logs.html.eex:53 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:34 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:42 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:57 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:73 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_logs/_logs.html.eex:38 lib/block_scout_web/templates/address_logs/_logs.html.eex:53 +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:33 lib/block_scout_web/templates/transaction_log/_logs.html.eex:41 +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:56 lib/block_scout_web/templates/transaction_log/_logs.html.eex:72 msgid "Decoded" msgstr "" -#: lib/block_scout_web/views/address_view.ex:380 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/address_view.ex:350 msgid "Decompiled Code" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:83 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:75 msgid "Decompiled code" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:17 -#, elixir-autogen, elixir-format msgid "Decompiled contract code" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:10 -#, elixir-autogen, elixir-format msgid "Decompiler version" msgstr "" +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:23 -#, elixir-autogen, elixir-format msgid "Delegate Call" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:211 -#: lib/block_scout_web/templates/address_contract/index.html.eex:219 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_progress.html.eex:31 +#: lib/block_scout_web/templates/stakes/_table.html.eex:43 +msgid "Delegators" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:6 +msgid "Delegators of " +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:53 +msgid "Delegators’ Staked Amount" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:185 +#: lib/block_scout_web/templates/address_contract/index.html.eex:193 msgid "Deployed ByteCode" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:53 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:188 -#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:60 +#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:188 lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:60 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:150 -#, elixir-autogen, elixir-format msgid "Description" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:56 -#, elixir-autogen, elixir-format -msgid "Description*" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address/overview.html.eex:30 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:166 -#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:127 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:166 lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:127 msgid "Details" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:159 -#, elixir-autogen, elixir-format msgid "Difficulty" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:181 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:149 msgid "Displaying the init data provided of the creating transaction." msgstr "" -#: lib/block_scout_web/templates/common_components/_csv_export_button.html.eex:4 -#: lib/block_scout_web/templates/csv_export/index.html.eex:33 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/csv_export/index.html.eex:25 msgid "Download" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:72 -#, elixir-autogen, elixir-format -msgid "Drop all Solidity contract source files into the drop zone." -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:72 -#, elixir-autogen, elixir-format -msgid "Drop all Solidity or Yul contract source files into the drop zone." -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:18 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:26 msgid "Drop sources and metadata JSON file or click here" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:67 -#, elixir-autogen, elixir-format -msgid "Drop sources or click here" -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:28 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:33 msgid "Drop the standard input JSON file or click here" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:27 -#, elixir-autogen, elixir-format -msgid "E-mail*" +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:22 +msgid "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 "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_minimal_proxy_pattern.html.eex:6 -#, elixir-autogen, elixir-format msgid "EIP-1167" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:222 -#, elixir-autogen, elixir-format -msgid "ERC-1155 " -msgstr "" - -#: lib/block_scout_web/views/transaction_view.ex:220 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:214 msgid "ERC-20 " msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:40 -#, elixir-autogen, elixir-format -msgid "ERC-20 tokens (beta)" -msgstr "" - -#: lib/block_scout_web/views/transaction_view.ex:221 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:215 msgid "ERC-721 " msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:53 -#, elixir-autogen, elixir-format -msgid "ERC-721, ERC-1155 tokens (NFT) (beta)" +#, elixir-format +#: lib/block_scout_web/templates/address_token/overview.html.eex:1 +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:93 lib/block_scout_web/templates/smart_contract/_functions.html.eex:93 +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:133 +msgid "ETH" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:4 -#, elixir-autogen, elixir-format msgid "ETH RPC API Documentation" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:82 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:30 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:22 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:76 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:40 msgid "EVM Version" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:34 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:26 -#, elixir-autogen, elixir-format -msgid "EVM version details" -msgstr "" - +#, elixir-format #: lib/block_scout_web/views/block_transaction_view.ex:7 -#, elixir-autogen, elixir-format msgid "Easy Cowboy! This block does not exist yet!" msgstr "" -#: lib/block_scout_web/templates/account/api_key/row.html.eex:16 -#: lib/block_scout_web/templates/account/custom_abi/row.html.eex:16 -#: lib/block_scout_web/templates/account/watchlist_address/row.html.eex:27 -#, elixir-autogen, elixir-format -msgid "Edit" -msgstr "" - -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Edit Watch list address" -msgstr "" - -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:71 -#, elixir-autogen, elixir-format -msgid "Email notifications" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/transaction/_emission_reward_tile.html.eex:5 -#, elixir-autogen, elixir-format msgid "Emission Contract" msgstr "" -#: lib/block_scout_web/views/block_view.ex:73 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/block_view.ex:71 msgid "Emission Reward" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:72 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:82 msgid "Enter the Solidity Contract Code" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:22 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:51 msgid "Enter the Vyper Contract Code" msgstr "" -#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:11 -#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:10 -#, elixir-autogen, elixir-format -msgid "Error" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:4 +msgid "Epoch number" msgstr "" -#: lib/block_scout_web/templates/transaction/_tile.html.eex:11 -#, elixir-autogen, elixir-format -msgid "Error in internal transactions" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:44 +msgid "Epochs range(s) or enum, e.g.: 5-9,23-27,47,50" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:33 -#, elixir-autogen, elixir-format msgid "Error rendering value" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/address/_balance_card.html.eex:31 #: lib/block_scout_web/templates/address/_balance_dropdown.html.eex:10 -#, elixir-autogen, elixir-format msgid "Error trying to fetch balances." msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:375 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:355 msgid "Error: %{reason}" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:373 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:353 msgid "Error: (Awaiting internal transactions for reason)" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:120 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:135 msgid "Error: Could not determine contract creator." msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:120 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:138 msgid "Eth RPC" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/address/_balance_card.html.eex:18 +#: lib/block_scout_web/templates/address/index.html.eex:5 lib/block_scout_web/templates/address/overview.html.eex:178 +#: lib/block_scout_web/templates/block/overview.html.eex:209 lib/block_scout_web/templates/internal_transaction/_tile.html.eex:20 +#: lib/block_scout_web/templates/layout/_topnav.html.eex:89 lib/block_scout_web/templates/layout/_topnav.html.eex:110 +#: lib/block_scout_web/templates/layout/app.html.eex:45 lib/block_scout_web/templates/transaction/_pending_tile.html.eex:20 +#: lib/block_scout_web/templates/transaction/_tile.html.eex:37 lib/block_scout_web/templates/transaction/overview.html.eex:409 +#: lib/block_scout_web/views/wei_helpers.ex:78 +msgid "Ether" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:211 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:164 -#, elixir-autogen, elixir-format msgid "Example Value" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:128 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:99 -#, elixir-autogen, elixir-format msgid "Execute" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:55 -#, elixir-autogen, elixir-format msgid "Expand" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/csv_export/index.html.eex:10 -#, elixir-autogen, elixir-format msgid "Export Data" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:248 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:228 msgid "External libraries" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:40 -#, elixir-autogen, elixir-format msgid "Failed to decode input data." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:35 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:37 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:36 msgid "Failed to decode log data." msgstr "" -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:22 -#, elixir-autogen, elixir-format -msgid "Fast" -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:247 -#, elixir-autogen, elixir-format -msgid "Fetching gas used..." -msgstr "" - -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:112 -#, elixir-autogen, elixir-format -msgid "Fetching holders..." +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:24 +msgid "Favorites" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/address/_balance_card.html.eex:28 #: lib/block_scout_web/templates/address/_balance_dropdown.html.eex:7 -#, elixir-autogen, elixir-format msgid "Fetching tokens..." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:194 -#: lib/block_scout_web/templates/address/overview.html.eex:202 -#, elixir-autogen, elixir-format -msgid "Fetching transactions..." -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:221 -#: lib/block_scout_web/templates/address/overview.html.eex:229 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:123 -#, elixir-autogen, elixir-format -msgid "Fetching transfers..." -msgstr "" - -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:15 -#, elixir-autogen, elixir-format -msgid "Filter by compiler:" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/admin/dashboard/index.html.eex:16 -#, elixir-autogen, elixir-format msgid "For any existing contracts in the database, insert all ABI entries into the contract_methods table. Use this in case you have verified smart contracts before early March 2019 and you want other contracts with the same functions to show those ABI's as candidate matches." msgstr "" -#: lib/block_scout_web/templates/visualize_sol2uml/index.html.eex:7 -#, elixir-autogen, elixir-format -msgid "For contract" -msgstr "" - -#: lib/block_scout_web/templates/layout/_topnav.html.eex:44 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:34 msgid "Forked Blocks (Reorgs)" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:45 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:42 msgid "Forum" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:38 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:40 -#: lib/block_scout_web/templates/address_transaction/index.html.eex:34 -#: lib/block_scout_web/templates/transaction/overview.html.eex:226 -#: lib/block_scout_web/views/address_internal_transaction_view.ex:10 -#: lib/block_scout_web/views/address_token_transfer_view.ex:10 -#: lib/block_scout_web/views/address_transaction_view.ex:10 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:40 lib/block_scout_web/templates/address_transaction/index.html.eex:34 +#: lib/block_scout_web/templates/transaction/overview.html.eex:192 lib/block_scout_web/views/address_internal_transaction_view.ex:10 +#: lib/block_scout_web/views/address_token_transfer_view.ex:10 lib/block_scout_web/views/address_transaction_view.ex:10 msgid "From" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:18 -#, elixir-autogen, elixir-format msgid "GET" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_tile.html.eex:67 -#: lib/block_scout_web/templates/block/overview.html.eex:187 -#: lib/block_scout_web/templates/transaction/overview.html.eex:399 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:181 lib/block_scout_web/templates/transaction/overview.html.eex:371 msgid "Gas Limit" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:379 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:351 msgid "Gas Price" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:240 -#: lib/block_scout_web/templates/block/_tile.html.eex:73 -#: lib/block_scout_web/templates/block/overview.html.eex:178 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:255 +#: lib/block_scout_web/templates/block/_tile.html.eex:73 lib/block_scout_web/templates/block/overview.html.eex:172 msgid "Gas Used" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:452 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:424 msgid "Gas Used by Transaction" msgstr "" -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:3 -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:18 -#, elixir-autogen, elixir-format -msgid "Gas tracker" -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:239 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:254 +#: lib/block_scout_web/templates/address/overview.html.eex:288 msgid "Gas used by the address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:60 -#, elixir-autogen, elixir-format msgid "Genesis Block" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/layout/_footer.html.eex:24 -#, elixir-autogen, elixir-format msgid "Github" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_rap_pagination_container.html.eex:8 -#, elixir-autogen, elixir-format msgid "Go to" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:110 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:128 msgid "GraphQL" msgstr "" -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:11 -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:20 -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:21 -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:22 -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:38 -#: lib/block_scout_web/views/block_view.ex:22 -#: lib/block_scout_web/views/wei_helper.ex:81 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:52 +#: lib/block_scout_web/views/block_view.ex:21 lib/block_scout_web/views/wei_helpers.ex:77 msgid "Gwei" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:123 -#, elixir-autogen, elixir-format msgid "Hash" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:480 -#: lib/block_scout_web/templates/transaction/overview.html.eex:484 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:452 +#: lib/block_scout_web/templates/transaction/overview.html.eex:456 msgid "Hex (Default)" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:204 -#, elixir-autogen, elixir-format -msgid "Highlighted events of the transaction." +#, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:122 +msgid "Holders" msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:108 -#, elixir-autogen, elixir-format -msgid "Holders" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:77 +msgid "How Many Times this Address has been Banned" msgstr "" -#: lib/block_scout_web/templates/tokens/index.html.eex:48 -#, elixir-autogen, elixir-format -msgid "Holders Count" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:71 +msgid "How Many Times this Address has been a Validator" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:11 -#, elixir-autogen, elixir-format msgid "However, in general, the" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:19 -#, elixir-autogen, elixir-format msgid "IMPORTANT: This information is a best guess based on similar functions from other verified contracts." msgstr "" -#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:42 -#: lib/block_scout_web/templates/transaction/_tile.html.eex:92 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:38 +#: lib/block_scout_web/templates/transaction/_tile.html.eex:80 msgid "IN" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:56 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:48 -#, elixir-autogen, elixir-format -msgid "If you enabled optimization during compilation, select yes." -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:133 -#, elixir-autogen, elixir-format -msgid "Implementation" +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:26 +msgid "If it still does not show up after 1 hour, please check with your sender/exchange/wallet/transaction provider for additional information." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:132 -#, elixir-autogen, elixir-format -msgid "Implementation address of the proxy contract." +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:12 +msgid "If you have just submitted this transaction please wait for at least 30 seconds before refreshing this page." msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:3 -#, elixir-autogen, elixir-format -msgid "Include nightly builds" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:147 +msgid "Implementation" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:30 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:43 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:56 -#, elixir-autogen, elixir-format -msgid "Incoming" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:146 +msgid "Implementation address of the proxy contract." msgstr "" -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:29 -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:23 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:23 -#, elixir-autogen, elixir-format -msgid "Index" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:12 +msgid "Inactive Pool Addresses. Current validator pools are specified by a checkmark." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:464 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:436 msgid "Index position of Transaction in the block." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:249 -#, elixir-autogen, elixir-format msgid "Index position(s) of referenced stale blocks." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:6 -#, elixir-autogen, elixir-format msgid "Indexed?" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/layout/app.html.eex:47 +msgid "Indexing Tokens" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:3 -#, elixir-autogen, elixir-format msgid "Input" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:245 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:213 msgid "Interacted With (To)" msgstr "" -#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:7 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:6 msgid "Internal Transaction" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:36 -#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:17 -#: lib/block_scout_web/templates/transaction/_tabs.html.eex:11 -#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:6 -#: lib/block_scout_web/views/address_view.ex:376 -#: lib/block_scout_web/views/transaction_view.ex:535 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:28 +#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:17 lib/block_scout_web/templates/transaction/_tabs.html.eex:11 +#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:6 lib/block_scout_web/views/address_view.ex:346 +#: lib/block_scout_web/views/transaction_view.ex:514 msgid "Internal Transactions" msgstr "" -#: lib/block_scout_web/templates/internal_server_error/index.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Internal server error" +#, elixir-format +#: lib/block_scout_web/templates/transaction/invalid.html.eex:6 +msgid "Invalid Transaction Hash" msgstr "" -#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:16 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:19 -#: lib/block_scout_web/views/tokens/overview_view.ex:43 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:15 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:19 lib/block_scout_web/views/tokens/overview_view.ex:44 msgid "Inventory" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_yul_contracts_switcher.html.eex:3 -#, elixir-autogen, elixir-format -msgid "Is Yul contract" +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:16 +msgid "It could still be in the TX Pool of a different node, waiting to be broadcasted." msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:13 -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:26 -#, elixir-autogen, elixir-format -msgid "Last 24h" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:125 +msgid "It's me!" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:258 -#, elixir-autogen, elixir-format -msgid "Last Balance Update" +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:828 +msgid "JSON RPC error" msgstr "" -#: lib/block_scout_web/templates/account/api_key/index.html.eex:12 -#: lib/block_scout_web/templates/account/api_key/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "Learn more" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:273 +msgid "Last Balance Update" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:49 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/app.html.eex:48 msgid "Less than" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_address.html.eex:4 -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_name.html.eex:4 -#, elixir-autogen, elixir-format -msgid "Library" +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:115 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:137 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:159 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:181 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:203 +msgid "Library Address" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:105 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:127 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:149 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:171 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:193 +msgid "Library Name" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:24 -#, elixir-autogen, elixir-format msgid "License Expires" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:10 -#, elixir-autogen, elixir-format msgid "License ID" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:331 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:83 +msgid "Likelihood of Becoming a Validator on the Next Epoch" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:303 msgid "List of ERC-1155 tokens created in the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:315 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:287 msgid "List of token burnt in the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:298 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:270 msgid "List of token minted in the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:282 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:254 msgid "List of token transferred in the transaction." msgstr "" -#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "Loading chart..." -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:77 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:109 -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:35 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:99 -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:49 -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:45 -#: lib/block_scout_web/templates/address_read_contract/index.html.eex:41 -#: lib/block_scout_web/templates/address_read_contract/index.html.eex:49 -#: lib/block_scout_web/templates/address_read_proxy/index.html.eex:12 -#: lib/block_scout_web/templates/address_write_contract/index.html.eex:39 -#: lib/block_scout_web/templates/address_write_contract/index.html.eex:47 -#: lib/block_scout_web/templates/address_write_proxy/index.html.eex:12 -#: lib/block_scout_web/templates/tokens/contract/index.html.eex:17 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:79 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:225 +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:42 +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:54 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:79 lib/block_scout_web/templates/address_read_contract/index.html.eex:12 +#: lib/block_scout_web/templates/address_read_proxy/index.html.eex:12 lib/block_scout_web/templates/address_write_contract/index.html.eex:12 +#: lib/block_scout_web/templates/address_write_proxy/index.html.eex:12 lib/block_scout_web/templates/tokens/contract/index.html.eex:16 msgid "Loading..." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:2 -#, elixir-autogen, elixir-format msgid "Log Data" msgstr "" -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:131 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:130 msgid "Log Index" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:49 -#: lib/block_scout_web/templates/address_logs/index.html.eex:10 -#: lib/block_scout_web/templates/transaction/_tabs.html.eex:17 -#: lib/block_scout_web/templates/transaction_log/index.html.eex:8 -#: lib/block_scout_web/views/address_view.ex:387 -#: lib/block_scout_web/views/transaction_view.ex:536 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:41 +#: lib/block_scout_web/templates/address_logs/index.html.eex:10 lib/block_scout_web/templates/transaction/_tabs.html.eex:17 +#: lib/block_scout_web/templates/transaction_log/index.html.eex:8 lib/block_scout_web/views/address_view.ex:357 +#: lib/block_scout_web/views/transaction_view.ex:515 msgid "Logs" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:54 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:127 +msgid "ME" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:52 msgid "Main Networks" msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:53 -#: lib/block_scout_web/templates/layout/app.html.eex:50 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:85 -#: lib/block_scout_web/views/address_view.ex:147 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:22 +msgid "Mainnet" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:61 +#: lib/block_scout_web/templates/layout/app.html.eex:49 lib/block_scout_web/templates/tokens/overview/_details.html.eex:98 +#: lib/block_scout_web/views/address_view.ex:142 msgid "Market Cap" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:84 -#, elixir-autogen, elixir-format -msgid "Market cap" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:42 +msgid "Max Amount to Move:" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:408 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:380 msgid "Max Fee per Gas" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:418 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:390 msgid "Max Priority Fee per Gas" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:327 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:321 msgid "Max of" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:398 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:370 msgid "Maximum gas amount approved for the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:407 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:379 msgid "Maximum total amount per unit of gas a user is willing to pay for a transaction, including base fee and priority fee." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/metadata/index.html.eex:18 -#: lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:10 -#: lib/block_scout_web/views/tokens/instance/overview_view.ex:115 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:10 lib/block_scout_web/views/tokens/instance/overview_view.ex:187 msgid "Metadata" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:5 -#, elixir-autogen, elixir-format msgid "Method Id" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_tile.html.eex:41 -#: lib/block_scout_web/templates/block/overview.html.eex:98 -#: lib/block_scout_web/templates/chain/_block.html.eex:16 -#: lib/block_scout_web/templates/transaction_state/_state_change.html.eex:22 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:98 lib/block_scout_web/templates/chain/_block.html.eex:16 msgid "Miner" msgstr "" -#: lib/block_scout_web/views/block_view.ex:63 -#: lib/block_scout_web/views/block_view.ex:68 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/block_view.ex:61 +#: lib/block_scout_web/views/block_view.ex:66 msgid "Miner Reward" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_minimal_proxy_pattern.html.eex:3 -#, elixir-autogen, elixir-format msgid "Minimal Proxy Contract for" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:22 +msgid "Minimum Stake Allowed:" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:17 +msgid "Minimum Stake:" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:206 -#, elixir-autogen, elixir-format msgid "Minimum fee required per unit of gas. Fee adjusts based on network congestion." msgstr "" -#: lib/block_scout_web/templates/transaction/_actions.html.eex:92 -#, elixir-autogen, elixir-format -msgid "Mint of %{address} To %{to}" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:24 +msgid "Mining Address:" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:223 -#, elixir-autogen, elixir-format msgid "Model" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:58 -#, elixir-autogen, elixir-format msgid "Module" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:12 -#, elixir-autogen, elixir-format msgid "More internal transactions have come in" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_transaction/index.html.eex:46 -#: lib/block_scout_web/templates/chain/show.html.eex:217 -#: lib/block_scout_web/templates/pending_transaction/index.html.eex:13 +#: lib/block_scout_web/templates/chain/show.html.eex:228 lib/block_scout_web/templates/pending_transaction/index.html.eex:13 #: lib/block_scout_web/templates/transaction/index.html.eex:19 -#, elixir-autogen, elixir-format msgid "More transactions have come in" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:10 +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:57 +msgid "Move Stake" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:63 #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:74 -#, elixir-autogen, elixir-format msgid "Must be set to:" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:22 -#, elixir-autogen, elixir-format -msgid "Must match the name specified in the code. For example, in contract MyContract {..} MyContract is the contract name." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_rows.html.eex:34 +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:186 +msgid "N/A" msgstr "" -#: lib/block_scout_web/templates/tokens/_tile.html.eex:40 -#: lib/block_scout_web/templates/verified_contracts/_contract.html.eex:21 -#: lib/block_scout_web/templates/verified_contracts/_contract.html.eex:61 -#, elixir-autogen, elixir-format -msgid "N/A" -msgstr "" - -#: lib/block_scout_web/templates/block/overview.html.eex:116 -#, elixir-autogen, elixir-format -msgid "N/A bytes" -msgstr "" - -#: lib/block_scout_web/templates/account/api_key/form.html.eex:19 -#: lib/block_scout_web/templates/account/api_key/index.html.eex:28 -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:13 -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:28 -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:18 -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:22 -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:18 -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:22 -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:22 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:19 -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_name.html.eex:4 +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:52 -#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:59 -#: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:4 +#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:59 lib/block_scout_web/templates/log/_data_decoded_view.html.eex:4 #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:21 -#, elixir-autogen, elixir-format msgid "Name" msgstr "" -#: lib/block_scout_web/templates/account/api_key/form.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Name this API key" -msgstr "" - -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Name this Custom ABI" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:19 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Name this address" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:19 -#, elixir-autogen, elixir-format -msgid "Name this transaction" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_token/overview.html.eex:44 -#, elixir-autogen, elixir-format msgid "Net Worth" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:5 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:5 +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:14 msgid "New Smart Contract Verification" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:9 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:7 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:14 msgid "New Solidity Smart Contract Verification" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:7 -#, elixir-autogen, elixir-format -msgid "New Solidity/Yul Smart Contract Verification" -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:7 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:9 msgid "New Vyper Smart Contract Verification" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:80 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:87 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:95 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:103 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:111 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:82 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:89 lib/block_scout_web/templates/address_contract_verification/new.html.eex:97 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:105 msgid "Next" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:6 +msgid "Next epoch in" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:9 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:9 -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_yul_contracts_switcher.html.eex:9 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:46 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:38 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:56 lib/block_scout_web/templates/stakes/_rows.html.eex:24 msgid "No" msgstr "" -#: lib/block_scout_web/templates/transaction_raw_trace/_card_body.html.eex:17 -#, elixir-autogen, elixir-format -msgid "No trace entries found." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_empty_content.html.eex:11 +msgid "No Information" msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:196 -#: lib/block_scout_web/templates/transaction/overview.html.eex:462 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:190 +#: lib/block_scout_web/templates/transaction/overview.html.eex:434 msgid "Nonce" msgstr "" -#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:11 -#, elixir-autogen, elixir-format -msgid "Not unique Token" -msgstr "" - -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:107 -#, elixir-autogen, elixir-format -msgid "Number of accounts holding the token" -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:274 -#, elixir-autogen, elixir-format -msgid "Number of blocks validated by this validator." -msgstr "" - -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:130 -#, elixir-autogen, elixir-format -msgid "Number of digits that come after the decimal place when displaying token value" -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:185 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:200 msgid "Number of transactions related to this address." msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:118 -#, elixir-autogen, elixir-format -msgid "Number of transfers for the token" -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:212 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:227 msgid "Number of transfers to/from this address." msgstr "" -#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:40 -#: lib/block_scout_web/templates/transaction/_tile.html.eex:88 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:36 +#: lib/block_scout_web/templates/transaction/_tile.html.eex:76 msgid "OUT" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_rap_pagination_container.html.eex:13 -#, elixir-autogen, elixir-format msgid "Only the first" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:40 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:32 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:75 -#, elixir-autogen, elixir-format -msgid "Optimization" -msgstr "" - -#: lib/block_scout_web/templates/address_contract/index.html.eex:67 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:61 msgid "Optimization enabled" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:76 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:62 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:54 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:70 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:72 msgid "Optimization runs" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:78 -#, elixir-autogen, elixir-format -msgid "Other Explorers" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:62 +msgid "Order Withdrawal" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:35 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:48 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:61 -#, elixir-autogen, elixir-format -msgid "Outgoing" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:49 +#: lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:50 +msgid "Ordered" msgstr "" -#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Owner Address" +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:76 +msgid "Other Explorers" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:77 -#, elixir-autogen, elixir-format -msgid "POA solidity flattener or the" +#, elixir-format +#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:24 +msgid "Owner Address" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:19 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:26 -#, elixir-autogen, elixir-format msgid "POST" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:41 -#, elixir-autogen, elixir-format msgid "Page" msgstr "" -#: lib/block_scout_web/templates/page_not_found/index.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Page not found" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:33 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:40 -#, elixir-autogen, elixir-format msgid "Parameters" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:139 -#, elixir-autogen, elixir-format msgid "Parent Hash" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:63 -#: lib/block_scout_web/views/transaction_view.ex:370 -#: lib/block_scout_web/views/transaction_view.ex:409 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:55 +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:184 lib/block_scout_web/views/transaction_view.ex:350 +#: lib/block_scout_web/views/transaction_view.ex:388 msgid "Pending" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/pending_transaction/index.html.eex:5 -#, elixir-autogen, elixir-format msgid "Pending Transactions" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:45 +msgid "Place stake" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/address/_custom_view_df_title.html.eex:9 #: lib/block_scout_web/templates/address/_custom_view_df_title.html.eex:13 -#, elixir-autogen, elixir-format msgid "Play" msgstr "" -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:22 -#: lib/block_scout_web/templates/layout/app.html.eex:100 -#, elixir-autogen, elixir-format -msgid "Please confirm your email address to use the My Account feature." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:11 +msgid "Please, sign transaction and wait for its mining..." msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:68 -#, elixir-autogen, elixir-format -msgid "Please select notification methods:" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_progress.html.eex:19 +#: lib/block_scout_web/templates/stakes/_table.html.eex:15 +msgid "Pool" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Please select what types of notifications you will receive:" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:9 +msgid "Pool description" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:464 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:8 +msgid "Pool name" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:884 +msgid "Pools searching is already in progress for this address" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:436 msgid "Position" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:254 -#, elixir-autogen, elixir-format msgid "Position %{index}" msgstr "" -#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:18 -#, elixir-autogen, elixir-format -msgid "Potential matches from contract method database:" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:55 +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:57 +msgid "Potential Reward Share" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:18 #: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:32 -#, elixir-autogen, elixir-format msgid "Potential matches from our contract method database:" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/layout/_search.html.eex:27 -#, elixir-autogen, elixir-format msgid "Press / and focus will be moved to the search field" msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:42 -#: lib/block_scout_web/templates/layout/app.html.eex:51 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:96 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:41 +#: lib/block_scout_web/templates/layout/app.html.eex:50 lib/block_scout_web/templates/tokens/overview/_details.html.eex:109 msgid "Price" msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:95 -#, elixir-autogen, elixir-format -msgid "Price per token on the exchanges" -msgstr "" - -#: lib/block_scout_web/templates/transaction/overview.html.eex:378 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:350 msgid "Price per unit of gas specified by the sender. Higher gas prices can prioritize transaction inclusion during times of high usage." msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:225 -#: lib/block_scout_web/templates/transaction/overview.html.eex:428 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:219 +#: lib/block_scout_web/templates/transaction/overview.html.eex:400 msgid "Priority Fee / Tip" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_tile.html.eex:62 -#, elixir-autogen, elixir-format msgid "Priority Fees" msgstr "" -#: lib/block_scout_web/templates/account/common/_nav.html.eex:4 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Profile" -msgstr "" - -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Public Tags" -msgstr "" - -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Public tag" -msgstr "" - -#: lib/block_scout_web/templates/account/common/_nav.html.eex:22 -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Public tags" -msgstr "" - -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:50 -#, elixir-autogen, elixir-format -msgid "Public tags* (2 tags maximum, please use \";\" as a divider)" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/common_components/_btn_qr_code.html.eex:10 -#: lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:5 -#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:83 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:5 lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:83 msgid "QR Code" msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:106 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:98 msgid "Query" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:115 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:133 msgid "RPC" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:473 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:445 msgid "Raw Input" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_tabs.html.eex:24 -#: lib/block_scout_web/templates/transaction_raw_trace/_card_body.html.eex:1 -#: lib/block_scout_web/views/transaction_view.ex:537 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction_raw_trace/index.html.eex:7 lib/block_scout_web/views/transaction_view.ex:516 msgid "Raw Trace" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:89 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:27 -#: lib/block_scout_web/views/address_view.ex:381 -#: lib/block_scout_web/views/tokens/overview_view.ex:42 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:81 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:27 lib/block_scout_web/views/address_view.ex:351 +#: lib/block_scout_web/views/tokens/overview_view.ex:43 msgid "Read Contract" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:96 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:41 -#: lib/block_scout_web/views/address_view.ex:382 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:88 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:41 lib/block_scout_web/views/address_view.ex:352 msgid "Read Proxy" msgstr "" -#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:13 -#, elixir-autogen, elixir-format -msgid "Records" -msgstr "" - -#: lib/block_scout_web/templates/account/api_key/row.html.eex:13 -#: lib/block_scout_web/templates/account/custom_abi/row.html.eex:13 -#, elixir-autogen, elixir-format -msgid "Remove" -msgstr "" - -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:77 -#, elixir-autogen, elixir-format -msgid "Remove from Watch list" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:32 +msgid "Reason for Ban: %{ban_reason}" msgstr "" -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:155 -#, elixir-autogen, elixir-format -msgid "Request URL" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:58 +msgid "Recalculate" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Request a public tag/label" -msgstr "" - -#: lib/block_scout_web/templates/error422/index.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Request cannot be processed" +#, elixir-format +#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:13 +msgid "Records" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:37 -#, elixir-autogen, elixir-format -msgid "Request to add public tag" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:58 +msgid "Refresh now" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Request to edit a public tag/label" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:12 +msgid "Remove My Pool" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:100 -#, elixir-autogen, elixir-format -msgid "Resend verification email" +#, elixir-format +#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:155 +msgid "Request URL" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:112 -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:38 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:104 -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:52 -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:48 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:228 +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:45 +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:57 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:82 msgid "Reset" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:173 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:134 -#, elixir-autogen, elixir-format msgid "Response Body" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:185 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:147 -#, elixir-autogen, elixir-format msgid "Responses" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:98 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:90 msgid "Result" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:138 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:127 msgid "Revert reason" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_tile.html.eex:52 -#: lib/block_scout_web/templates/chain/_block.html.eex:27 -#: lib/block_scout_web/views/internal_transaction_view.ex:28 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/chain/_block.html.eex:27 lib/block_scout_web/views/internal_transaction_view.ex:28 msgid "Reward" msgstr "" -#: lib/block_scout_web/templates/admin/dashboard/index.html.eex:21 -#, elixir-autogen, elixir-format -msgid "Run" +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:925 +msgid "Reward calculating is already in progress for this address" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:61 +msgid "Reward distribution is based on stake amount. Validator receives at least %{min}% of the pool reward." msgstr "" -#: lib/block_scout_web/templates/account/api_key/form.html.eex:26 -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:31 -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:25 -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:25 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:83 -#, elixir-autogen, elixir-format -msgid "Save" +#, elixir-format +#: lib/block_scout_web/templates/admin/dashboard/index.html.eex:21 +msgid "Run" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:206 -#, elixir-autogen, elixir-format -msgid "Scroll to see more" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:10 +msgid "Save changes" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/index.html.eex:16 #: lib/block_scout_web/templates/layout/_search.html.eex:34 -#, elixir-autogen, elixir-format msgid "Search" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/search/results.html.eex:17 -#, elixir-autogen, elixir-format msgid "Search Results" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/layout/_search.html.eex:3 -#, elixir-autogen, elixir-format msgid "Search by address, token symbol name, transaction hash, or block number" msgstr "" -#: lib/block_scout_web/templates/address_token_balance/_token_balances.html.eex:47 -#, elixir-autogen, elixir-format -msgid "Search tokens" +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:18 +msgid "Search network" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_yul_contracts_switcher.html.eex:19 -#, elixir-autogen, elixir-format -msgid "Select Yes if you want to verify Yul contract." +#, elixir-format +#: lib/block_scout_web/templates/address_token_balance/_token_balances.html.eex:47 +msgid "Search tokens" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:19 -#, elixir-autogen, elixir-format -msgid "Select yes if you want to show nightly builds." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward.html.eex:9 +msgid "Searching for pools you have ever staked into. Please, wait..." msgstr "" +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:27 -#, elixir-autogen, elixir-format msgid "Self-Destruct" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:63 -#, elixir-autogen, elixir-format -msgid "Send request" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:163 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:124 -#, elixir-autogen, elixir-format msgid "Server Response" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:65 +msgid "Share of Pool’s Reward" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:7 -#, elixir-autogen, elixir-format msgid "Show" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_btn_qr_code.html.eex:11 -#, elixir-autogen, elixir-format msgid "Show QR Code" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:47 +msgid "Show Validator Info" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_title.html.eex:22 +msgid "Show banned only" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_title.html.eex:28 +msgid "Show only those I have stake in" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/address_token/overview.html.eex:52 -#, elixir-autogen, elixir-format msgid "Shows the current" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_token/overview.html.eex:59 -#, elixir-autogen, elixir-format msgid "Shows the tokens held in the address (includes ERC-20, ERC-721 and ERC-1155)." msgstr "" -#: lib/block_scout_web/templates/address_token/overview.html.eex:66 -#, elixir-autogen, elixir-format -msgid "Shows the total CRC balance in the address." -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_token/overview.html.eex:45 -#, elixir-autogen, elixir-format msgid "Shows total assets held in the address" msgstr "" -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:33 -#, elixir-autogen, elixir-format -msgid "Sign in" +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:114 +msgid "Size" msgstr "" -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Sign out" +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:113 +msgid "Size of the block in bytes." msgstr "" -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:11 -#, elixir-autogen, elixir-format -msgid "Signed in as " +#, elixir-format +#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:30 +#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:50 lib/block_scout_web/templates/address_logs/index.html.eex:23 +#: lib/block_scout_web/templates/address_token/index.html.eex:60 lib/block_scout_web/templates/address_token_transfer/index.html.eex:58 +#: lib/block_scout_web/templates/address_transaction/index.html.eex:50 lib/block_scout_web/templates/address_validation/index.html.eex:20 +#: lib/block_scout_web/templates/block_transaction/index.html.eex:22 lib/block_scout_web/templates/chain/show.html.eex:169 +#: lib/block_scout_web/templates/pending_transaction/index.html.eex:18 lib/block_scout_web/templates/stakes/_table.html.eex:49 +#: lib/block_scout_web/templates/tokens/holder/index.html.eex:23 lib/block_scout_web/templates/tokens/instance/holder/index.html.eex:23 +#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:23 lib/block_scout_web/templates/tokens/inventory/index.html.eex:22 +#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:21 lib/block_scout_web/templates/transaction/index.html.eex:25 +#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:13 lib/block_scout_web/templates/transaction_log/index.html.eex:15 +#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:14 +msgid "Something went wrong, click to reload." msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:114 -#, elixir-autogen, elixir-format -msgid "Size" +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:234 +msgid "Something went wrong, click to retry." msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:113 -#, elixir-autogen, elixir-format -msgid "Size of the block in bytes." +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:7 +msgid "Sorry, We are unable to locate this transaction Hash" msgstr "" -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Slow" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:7 +msgid "Source Pool" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:21 -#, elixir-autogen, elixir-format -msgid "Smart contract / Address" +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:19 +msgid "Sources and Metadata JSON" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/address_field.html.eex:4 -#: lib/block_scout_web/templates/account/public_tags_request/address_field.html.eex:5 -#, elixir-autogen, elixir-format -msgid "Smart contract / Address (0x...)" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:7 +msgid "Stake" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_contract.html.eex:28 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:26 -#: lib/block_scout_web/views/verified_contracts_view.ex:10 -#, elixir-autogen, elixir-format -msgid "Solidity" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:43 +msgid "Stake More" msgstr "" -#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:30 -#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:50 -#: lib/block_scout_web/templates/address_logs/index.html.eex:23 -#: lib/block_scout_web/templates/address_token/index.html.eex:60 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:58 -#: lib/block_scout_web/templates/address_transaction/index.html.eex:50 -#: lib/block_scout_web/templates/address_validation/index.html.eex:20 -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:20 -#: lib/block_scout_web/templates/block_transaction/index.html.eex:14 -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:14 -#: lib/block_scout_web/templates/chain/show.html.eex:158 -#: lib/block_scout_web/templates/pending_transaction/index.html.eex:18 -#: lib/block_scout_web/templates/tokens/holder/index.html.eex:24 -#: lib/block_scout_web/templates/tokens/instance/holder/index.html.eex:23 -#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:23 -#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:23 -#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:22 -#: lib/block_scout_web/templates/transaction/index.html.eex:25 -#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:13 -#: lib/block_scout_web/templates/transaction_log/index.html.eex:15 -#: lib/block_scout_web/templates/transaction_state/index.html.eex:13 -#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:14 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:51 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Something went wrong, click to reload." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:64 +msgid "Stake placed on a candidate pool or an active validator pool during the current staking epoch can be moved from one pool to another. Active stake cannot be moved. To re-delegate active stake: order a withdrawal, claim the amount on the next staking epoch, and stake the amount on a different pool." msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:223 -#, elixir-autogen, elixir-format -msgid "Something went wrong, click to retry." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:53 +msgid "Stake placed on a pool is pending for the current staking epoch. It will be applied to the next staking epoch. You may withdraw or move pending stake at any time until it becomes active. Once active (the pool you staked with becomes a validator), a withdrawal order can be placed. This amount will be available to claim after that staking epoch is complete." msgstr "" -#: lib/block_scout_web/templates/transaction/not_found.html.eex:6 -#, elixir-autogen, elixir-format -msgid "Sorry, we are unable to locate this transaction hash" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:45 +#: lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:46 +msgid "Staked" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:63 -#, elixir-autogen, elixir-format -msgid "Sources *.sol files" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:28 +msgid "Staked Amount" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:63 -#, elixir-autogen, elixir-format -msgid "Sources *.sol or *.yul files" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:26 +msgid "Staker's Address" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Sources and Metadata JSON" +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:154 +msgid "Stakes" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:136 -#, elixir-autogen, elixir-format -msgid "Stakes" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:59 +#: lib/block_scout_web/templates/stakes/_stakes_progress.html.eex:25 lib/block_scout_web/templates/stakes/_table.html.eex:34 +msgid "Stakes Ratio" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Standard Input JSON" +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:160 +msgid "Staking" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:20 +msgid "Staking Address:" msgstr "" -#: lib/block_scout_web/templates/transaction/_tabs.html.eex:29 -#: lib/block_scout_web/templates/transaction_state/index.html.eex:6 -#: lib/block_scout_web/views/transaction_view.ex:538 -#, elixir-autogen, elixir-format -msgid "State changes" +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:928 +msgid "Staking epochs are not specified or not in the allowed range" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:29 +msgid "Standard Input JSON" +msgstr "" + +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:24 -#, elixir-autogen, elixir-format msgid "Static Call" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:110 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:102 msgid "Status" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:22 -#, elixir-autogen, elixir-format -msgid "Submission date" -msgstr "" - -#: lib/block_scout_web/templates/layout/_footer.html.eex:41 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:39 msgid "Submit an Issue" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_emission_reward_tile.html.eex:8 -#: lib/block_scout_web/views/transaction_view.ex:372 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:352 msgid "Success" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:38 +msgid "Swap STAKE on Honeyswap" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:21 -#: lib/block_scout_web/templates/transaction/_tile.html.eex:52 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction/_tile.html.eex:40 msgid "TX Fee" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:31 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:67 +msgid "Target Pool" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:30 msgid "Telegram" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:67 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:65 msgid "Test Networks" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_first.html.eex:9 -#, elixir-autogen, elixir-format -msgid "The 0x library address. This can be found in the generated json file or Truffle output (if using truffle)." +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:23 +msgid "Testnet" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:34 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:26 -#, elixir-autogen, elixir-format -msgid "The EVM version the contract is written for. If the bytecode does not match the version, we try to verify using the latest EVM version." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:89 +msgid "The Number of Delegators in the Pool" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:122 -#, elixir-autogen, elixir-format msgid "The SHA256 hash of the block." msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:39 +msgid "The amount can be claimed after the current epoch finishes." +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:51 -#, elixir-autogen, elixir-format msgid "The block height of a particular block is defined as the number of blocks preceding it in the blockchain." msgstr "" -#: lib/block_scout_web/templates/transaction_state/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "The changes from this transaction have not yet happened since the transaction is still pending." +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:41 +msgid "The fallback function is executed on a call to the contract if none of the other functions match the given function signature, or if no data was supplied at all and there is no receive Ether function. The fallback function always receives data, but in order to also receive Ether it must be marked payable." msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:26 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:18 -#, elixir-autogen, elixir-format -msgid "The compiler version is specified in pragma solidity X.X.X. Use the compiler version rather than the nightly build. If using the Solidity compiler, run solc —version to check." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:23 +msgid "The first amount is the candidate’s own stake, the second is the total amount staked into the pool by the candidate and all delegators." msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:44 -#, elixir-autogen, elixir-format -msgid "The fallback function is executed on a call to the contract if none of the other functions match the given function signature, or if no data was supplied at all and there is no receive Ether function. The fallback function always receives data, but in order to also receive Ether it must be marked payable." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:25 +msgid "The first amount is the pool owner’s stake, the second is the total amount staked into the pool by the pool owner and all delegators." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:21 +msgid "The first amount is the validator’s own stake, the second is the total amount staked into the pool by the validator and all delegators." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:138 -#, elixir-autogen, elixir-format msgid "The hash of the block from which this block was generated." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:74 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:90 msgid "The name found in the source code of the Contract." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:85 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:101 msgid "The name of the validator." msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:43 +msgid "The number of delegators providing stake to the pool. Click on the number to see more details." +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:79 -#, elixir-autogen, elixir-format msgid "The number of transactions in the block." msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:46 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:34 +msgid "The percentage of stake in a single pool relative to the total amount staked in all active pools. A higher ratio results in a greater likelihood of validator pool selection." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:43 msgid "The receive function is executed on a call to the contract with empty calldata. This is the function that is executed on plain Ether transfers (e.g. via .send() or .transfer()). If no such function exists, but a payable fallback function exists, the fallback function will be called on a plain Ether transfer. If neither a receive Ether nor a payable fallback function is present, the contract cannot receive Ether through regular transactions and throws an exception." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:137 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:105 +msgid "The rest addresses are delegators of its pool." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:126 msgid "The revert reason of the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:109 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:34 +msgid "The staking epochs for which the reward could be claimed (read-only field):" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:101 msgid "The status of the transaction: Confirmed or Unconfirmed." msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:67 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:58 +msgid "The table refreshed block(s) ago." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:82 msgid "The total amount of tokens issued" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:177 -#, elixir-autogen, elixir-format msgid "The total gas amount used in the block and its percentage of gas filled in the block." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_validation/index.html.eex:16 -#, elixir-autogen, elixir-format msgid "There are no blocks validated by this address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/index.html.eex:17 -#, elixir-autogen, elixir-format msgid "There are no blocks." msgstr "" -#: lib/block_scout_web/templates/tokens/holder/index.html.eex:29 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/holder/index.html.eex:28 msgid "There are no holders for this Token." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:54 -#, elixir-autogen, elixir-format msgid "There are no internal transactions for this address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:17 -#, elixir-autogen, elixir-format msgid "There are no internal transactions for this transaction." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/index.html.eex:28 -#, elixir-autogen, elixir-format msgid "There are no logs for this address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction_log/index.html.eex:20 -#, elixir-autogen, elixir-format msgid "There are no logs for this transaction." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/pending_transaction/index.html.eex:22 -#, elixir-autogen, elixir-format msgid "There are no pending transactions." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_token_transfer/index.html.eex:53 -#, elixir-autogen, elixir-format msgid "There are no token transfers for this address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:19 -#, elixir-autogen, elixir-format msgid "There are no token transfers for this transaction" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_token/index.html.eex:65 -#, elixir-autogen, elixir-format msgid "There are no tokens for this address." msgstr "" -#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:28 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:27 msgid "There are no tokens." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_transaction/index.html.eex:55 -#, elixir-autogen, elixir-format msgid "There are no transactions for this address." msgstr "" -#: lib/block_scout_web/templates/block_transaction/index.html.eex:19 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/block_transaction/index.html.eex:27 msgid "There are no transactions for this block." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/index.html.eex:31 -#, elixir-autogen, elixir-format msgid "There are no transactions." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/holder/index.html.eex:28 -#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:28 -#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:27 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:28 lib/block_scout_web/templates/tokens/transfer/index.html.eex:26 msgid "There are no transfers for this Token." msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:99 -#, elixir-autogen, elixir-format -msgid "There are no verified contracts." -msgstr "" - -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:54 -#, elixir-autogen, elixir-format -msgid "There are no withdrawals for this address." -msgstr "" - -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:45 -#, elixir-autogen, elixir-format -msgid "There are no withdrawals for this block." -msgstr "" - -#: lib/block_scout_web/templates/withdrawal/index.html.eex:53 -#, elixir-autogen, elixir-format -msgid "There are no withdrawals." -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_coin_balance/index.html.eex:35 -#, elixir-autogen, elixir-format msgid "There is no coin history for this address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:29 -#, elixir-autogen, elixir-format -msgid "There is no decompiled contracts for this address." +msgid "There is no decompilded contracts for this address." msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_empty_content.html.eex:12 +msgid "There is no information currently available for this view. Deselect filters or choose another pool view to see current info. To participate as a delegator, select a pool address and click the Stake icon. To become a candidate, click the button below." +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/address_coin_balance/index.html.eex:21 #: lib/block_scout_web/templates/chain/show.html.eex:9 -#, elixir-autogen, elixir-format msgid "There was a problem loading the chart." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/index.html.eex:6 -#, elixir-autogen, elixir-format msgid "This API is provided for developers transitioning their applications from Etherscan to BlockScout. It supports GET and POST requests." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:7 -#, elixir-autogen, elixir-format msgid "This API is provided to support some rpc methods in the exact format specified for ethereum nodes, which can be found " msgstr "" +#, elixir-format #: lib/block_scout_web/views/block_transaction_view.ex:11 -#, elixir-autogen, elixir-format msgid "This block has not been processed yet." msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:47 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:41 msgid "This contract has been partially verified via Sourcify." msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:51 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:45 msgid "This contract has been verified via Sourcify." msgstr "" -#: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:10 -#, elixir-autogen, elixir-format -msgid "This is useful to allow sending requests to blockscout without having to change anything about the request." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:102 +msgid "This is a %{pool_type}." msgstr "" -#: lib/block_scout_web/templates/page_not_found/index.html.eex:8 -#, elixir-autogen, elixir-format -msgid "This page is no longer explorable! If you are lost, use the search bar to find what you are looking for." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_rows.html.eex:5 +msgid "This is a validator" msgstr "" -#: lib/block_scout_web/templates/transaction_state/index.html.eex:22 -#, elixir-autogen, elixir-format -msgid "This transaction hasn't changed state." +#, elixir-format +#: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:10 +msgid "This is useful to allow sending requests to blockscout without having to change anything about the request." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:64 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:31 +msgid "This pool is banned until block #%{banned_until} (%{estimated_unban_day})" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:58 msgid "This transaction is pending confirmation." msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:71 -#: lib/block_scout_web/templates/transaction/overview.html.eex:180 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:65 +#: lib/block_scout_web/templates/transaction/overview.html.eex:169 msgid "Timestamp" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:32 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:34 -#: lib/block_scout_web/templates/address_transaction/index.html.eex:28 -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:29 -#: lib/block_scout_web/templates/transaction/overview.html.eex:247 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:32 -#: lib/block_scout_web/views/address_internal_transaction_view.ex:9 -#: lib/block_scout_web/views/address_token_transfer_view.ex:9 -#: lib/block_scout_web/views/address_transaction_view.ex:9 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:34 lib/block_scout_web/templates/address_transaction/index.html.eex:28 +#: lib/block_scout_web/templates/transaction/overview.html.eex:215 lib/block_scout_web/views/address_internal_transaction_view.ex:9 +#: lib/block_scout_web/views/address_token_transfer_view.ex:9 lib/block_scout_web/views/address_transaction_view.ex:9 msgid "To" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:20 -#, elixir-autogen, elixir-format msgid "To have guaranteed accuracy, use the link above to verify the contract's source code." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:6 -#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:8 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:6 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:8 lib/block_scout_web/templates/transaction_log/_logs.html.eex:6 msgid "To see accurate decoded input data, the contract must be verified." msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:18 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:13 msgid "Toggle navigation" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:55 -#: lib/block_scout_web/templates/tokens/index.html.eex:31 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:71 msgid "Token" msgstr "" -#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:3 -#: lib/block_scout_web/views/transaction_view.ex:471 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:3 lib/block_scout_web/views/transaction_view.ex:450 msgid "Token Burning" msgstr "" -#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:7 -#: lib/block_scout_web/views/transaction_view.ex:472 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:7 lib/block_scout_web/views/transaction_view.ex:451 msgid "Token Creation" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:10 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:34 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:42 msgid "Token Details" msgstr "" -#: lib/block_scout_web/templates/tokens/holder/index.html.eex:17 -#: lib/block_scout_web/templates/tokens/instance/holder/index.html.eex:16 -#: lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:17 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:11 -#: lib/block_scout_web/views/tokens/overview_view.ex:41 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/holder/index.html.eex:16 +#: lib/block_scout_web/templates/tokens/instance/holder/index.html.eex:16 lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:17 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:11 lib/block_scout_web/views/tokens/overview_view.ex:42 msgid "Token Holders" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:38 -#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:18 -#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:37 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:18 lib/block_scout_web/templates/tokens/inventory/_token.html.eex:37 msgid "Token ID" msgstr "" -#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:5 -#: lib/block_scout_web/views/transaction_view.ex:470 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:5 lib/block_scout_web/views/transaction_view.ex:449 msgid "Token Minting" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:9 -#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:11 -#: lib/block_scout_web/views/transaction_view.ex:473 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:11 lib/block_scout_web/views/transaction_view.ex:452 msgid "Token Transfer" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_tabs.html.eex:13 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:19 -#: lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:3 -#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:16 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:5 -#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:15 -#: lib/block_scout_web/templates/transaction/_tabs.html.eex:4 -#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:7 -#: lib/block_scout_web/views/address_view.ex:378 -#: lib/block_scout_web/views/tokens/instance/overview_view.ex:114 -#: lib/block_scout_web/views/tokens/overview_view.ex:40 -#: lib/block_scout_web/views/transaction_view.ex:534 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:19 lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:3 +#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:16 lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:5 +#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:14 lib/block_scout_web/templates/transaction/_tabs.html.eex:4 +#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:7 lib/block_scout_web/views/address_view.ex:348 +#: lib/block_scout_web/views/tokens/instance/overview_view.ex:186 lib/block_scout_web/views/tokens/overview_view.ex:41 +#: lib/block_scout_web/views/transaction_view.ex:513 msgid "Token Transfers" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:54 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:70 msgid "Token name and symbol." msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:142 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:156 msgid "Token type" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_tabs.html.eex:21 -#: lib/block_scout_web/templates/address/overview.html.eex:175 -#: lib/block_scout_web/templates/address_token/overview.html.eex:58 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:13 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:84 -#: lib/block_scout_web/templates/tokens/index.html.eex:10 -#: lib/block_scout_web/views/address_view.ex:375 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:190 lib/block_scout_web/templates/address_token/overview.html.eex:58 +#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:13 lib/block_scout_web/templates/layout/_topnav.html.eex:69 +#: lib/block_scout_web/templates/layout/_topnav.html.eex:101 lib/block_scout_web/templates/tokens/index.html.eex:10 +#: lib/block_scout_web/views/address_view.ex:345 msgid "Tokens" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:316 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:288 msgid "Tokens Burnt" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:332 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:304 msgid "Tokens Created" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:299 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:271 msgid "Tokens Minted" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:283 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:255 msgid "Tokens Transferred" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_metatags.html.eex:13 -#, elixir-autogen, elixir-format msgid "Top Accounts - %{subnetwork} Explorer" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/index.html.eex:14 -#, elixir-autogen, elixir-format msgid "Topic" msgstr "" -#: lib/block_scout_web/templates/address_logs/_logs.html.eex:68 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:91 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_logs/_logs.html.eex:71 +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:90 msgid "Topics" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:9 -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:22 -#, elixir-autogen, elixir-format -msgid "Total" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:169 -#, elixir-autogen, elixir-format msgid "Total Difficulty" msgstr "" -#: lib/block_scout_web/templates/tokens/index.html.eex:43 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:97 msgid "Total Supply" msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:84 -#, elixir-autogen, elixir-format -msgid "Total Supply * Price" -msgstr "" - -#: lib/block_scout_web/templates/chain/show.html.eex:131 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:142 msgid "Total blocks" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:168 -#, elixir-autogen, elixir-format msgid "Total difficulty of the chain until this block." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:186 -#, elixir-autogen, elixir-format msgid "Total gas limit provided by all transactions in the block." msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:68 -#, elixir-autogen, elixir-format -msgid "Total supply" -msgstr "" - -#: lib/block_scout_web/templates/transaction/overview.html.eex:363 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:335 msgid "Total transaction fee." msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:110 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:132 msgid "Total transactions" msgstr "" -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:11 -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:23 +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:52 +msgid "Trade STAKE on AscendEX" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:19 -#: lib/block_scout_web/views/transaction_view.ex:483 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:462 msgid "Transaction" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_metatags.html.eex:3 -#, elixir-autogen, elixir-format msgid "Transaction %{transaction} - %{subnetwork} Explorer" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_metatags.html.eex:11 -#, elixir-autogen, elixir-format msgid "Transaction %{transaction}, %{subnetwork} %{transaction}" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:205 -#, elixir-autogen, elixir-format -msgid "Transaction Action" -msgstr "" - -#: lib/block_scout_web/templates/transaction/overview.html.eex:438 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:410 msgid "Transaction Burnt Fee" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:50 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:49 msgid "Transaction Details" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:364 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:336 msgid "Transaction Fee" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:80 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:74 msgid "Transaction Hash" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:2 #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:19 -#, elixir-autogen, elixir-format msgid "Transaction Inputs" msgstr "" -#: lib/block_scout_web/templates/account/common/_nav.html.eex:13 -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:7 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:17 -#, elixir-autogen, elixir-format -msgid "Transaction Tags" -msgstr "" - -#: lib/block_scout_web/templates/transaction/overview.html.eex:388 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:360 msgid "Transaction Type" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:461 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:433 msgid "Transaction number from the sending address. Each transaction sent from an address increments the nonce by 1." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:387 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:359 msgid "Transaction type, introduced in EIP-2718." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_tabs.html.eex:7 -#: lib/block_scout_web/templates/address/_tile.html.eex:31 -#: lib/block_scout_web/templates/address/overview.html.eex:186 -#: lib/block_scout_web/templates/address/overview.html.eex:192 -#: lib/block_scout_web/templates/address/overview.html.eex:200 -#: lib/block_scout_web/templates/address_transaction/index.html.eex:13 -#: lib/block_scout_web/templates/block/_tabs.html.eex:4 -#: lib/block_scout_web/templates/block/overview.html.eex:80 -#: lib/block_scout_web/templates/chain/show.html.eex:214 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:49 -#: lib/block_scout_web/views/address_view.ex:377 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:201 lib/block_scout_web/templates/address/overview.html.eex:207 +#: lib/block_scout_web/templates/address/overview.html.eex:215 lib/block_scout_web/templates/address_transaction/index.html.eex:13 +#: lib/block_scout_web/templates/block/overview.html.eex:74 lib/block_scout_web/templates/block_transaction/index.html.eex:10 +#: lib/block_scout_web/templates/chain/show.html.eex:225 lib/block_scout_web/templates/layout/_topnav.html.eex:43 +#: lib/block_scout_web/views/address_view.ex:347 msgid "Transactions" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:101 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:117 msgid "Transactions and address of creation." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:213 -#: lib/block_scout_web/templates/address/overview.html.eex:219 -#: lib/block_scout_web/templates/address/overview.html.eex:227 +#, elixir-format +#: lib/block_scout_web/templates/address/_tile.html.eex:31 +msgid "Transactions sent" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:228 +#: lib/block_scout_web/templates/address/overview.html.eex:234 lib/block_scout_web/templates/address/overview.html.eex:242 #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:50 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:119 -#, elixir-autogen, elixir-format msgid "Transfers" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:40 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:47 -#, elixir-autogen, elixir-format msgid "Try it out" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:3 -#, elixir-autogen, elixir-format -msgid "Try to fetch constructor arguments automatically" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/layout/_footer.html.eex:27 -#, elixir-autogen, elixir-format msgid "Twitter" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:53 -#, elixir-autogen, elixir-format -msgid "Tx/day" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:53 +msgid "Tx Gas Limit:" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:66 -#, elixir-autogen, elixir-format -msgid "Txns" +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:92 +#: lib/block_scout_web/templates/layout/app.html.eex:52 +msgid "Tx/day" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:5 #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:22 -#, elixir-autogen, elixir-format msgid "Type" msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:141 -#, elixir-autogen, elixir-format -msgid "Type of the token standard" -msgstr "" - -#: lib/block_scout_web/templates/visualize_sol2uml/index.html.eex:5 -#, elixir-autogen, elixir-format -msgid "UML diagram" +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:459 +msgid "UTF-8" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:487 -#, elixir-autogen, elixir-format -msgid "UTF-8" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:69 +msgid "Unable to find any pools you could claim a reward from." msgstr "" -#: lib/block_scout_web/views/block_view.ex:77 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/block_view.ex:75 msgid "Uncle Reward" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:250 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:41 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:31 msgid "Uncles" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:363 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:343 msgid "Unconfirmed" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:9 -#, elixir-autogen, elixir-format msgid "Unique Token" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:79 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:73 msgid "Unique character string (TxID) assigned to every verified transaction." msgstr "" -#: lib/block_scout_web/templates/account/api_key/form.html.eex:7 -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:8 -#, elixir-autogen, elixir-format -msgid "Update" +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:891 +#: lib/block_scout_web/channels/stakes_channel.ex:938 +msgid "Unknown address of Staking contract. Please, contact support" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:417 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:931 +msgid "Unknown pool staking address. Please, contact support" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:887 +#: lib/block_scout_web/channels/stakes_channel.ex:934 +msgid "Unknown staker address. Please, choose your account in MetaMask" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:12 +msgid "Use the search box to find a hosted network, or select from the list of available networks below." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:389 msgid "User defined maximum fee (tip) per unit of gas paid to validator for transaction prioritization." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:427 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:399 msgid "User-defined tip sent to validator for transaction priority/inclusion." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:224 -#, elixir-autogen, elixir-format msgid "User-defined tips sent to validator for transaction priority/inclusion." msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:56 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:47 msgid "Validated" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/index.html.eex:12 -#, elixir-autogen, elixir-format msgid "Validated Transactions" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:30 -#, elixir-autogen, elixir-format msgid "Validator Creation Date" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:5 -#, elixir-autogen, elixir-format msgid "Validator Data" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:86 -#, elixir-autogen, elixir-format -msgid "Validator Name" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:51 +msgid "Validator Info" msgstr "" -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:32 -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:26 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:26 -#, elixir-autogen, elixir-format -msgid "Validator index" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:102 +msgid "Validator Name" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:349 -#, elixir-autogen, elixir-format -msgid "Value" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:8 +msgid "Validator Pool Addresses." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:348 -#, elixir-autogen, elixir-format -msgid "Value sent in the native token (and USD) if applicable." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:32 +msgid "Validator pools can be banned for misbehavior (such as not revealing secret numbers). Validator and delegator stake contained in a banned pool cannot be withdrawn until the ban is over." msgstr "" -#: lib/block_scout_web/templates/address_read_contract/index.html.eex:17 -#: lib/block_scout_web/templates/address_write_contract/index.html.eex:15 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:81 -#, elixir-autogen, elixir-format -msgid "Verified" +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:321 +msgid "Value" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:18 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:6 -#, elixir-autogen, elixir-format -msgid "Verified Contracts" +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:320 +msgid "Value sent in the native token (and USD) if applicable." msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:88 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:82 msgid "Verified at" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:69 -#, elixir-autogen, elixir-format -msgid "Verified contracts" -msgstr "" - -#: lib/block_scout_web/templates/verified_contracts/_metatags.html.eex:2 -#, elixir-autogen, elixir-format -msgid "Verified contracts - %{subnetwork} Explorer" -msgstr "" - -#: lib/block_scout_web/templates/verified_contracts/_metatags.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Verified contracts, %{subnetwork}, %{coin}" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:27 -#: lib/block_scout_web/templates/address_contract/index.html.eex:29 -#: lib/block_scout_web/templates/address_contract/index.html.eex:197 -#: lib/block_scout_web/templates/address_contract/index.html.eex:228 -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:14 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:29 lib/block_scout_web/templates/address_contract/index.html.eex:164 +#: lib/block_scout_web/templates/address_contract/index.html.eex:170 lib/block_scout_web/templates/address_contract/index.html.eex:201 +#: lib/block_scout_web/templates/address_contract/index.html.eex:207 lib/block_scout_web/templates/smart_contract/_functions.html.eex:14 msgid "Verify & Publish" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:111 -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:37 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:103 -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:51 -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:47 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:227 +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:44 +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:56 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:81 msgid "Verify & publish" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:10 -#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:12 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:10 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:12 lib/block_scout_web/templates/transaction_log/_logs.html.eex:10 msgid "Verify the contract " msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:93 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:72 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:91 msgid "Version" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:33 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:42 msgid "Via Sourcify: Sources and metadata JSON file" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:27 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:36 msgid "Via Standard Input JSON" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:22 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:31 msgid "Via flattened source code" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:40 -#, elixir-autogen, elixir-format -msgid "Via multi-part files" -msgstr "" - -#: lib/block_scout_web/templates/chain/show.html.eex:153 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:164 msgid "View All Blocks" msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:213 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:224 msgid "View All Transactions" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:16 #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:20 -#, elixir-autogen, elixir-format msgid "View Contract" msgstr "" -#: lib/block_scout_web/templates/transaction/_tile.html.eex:73 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/_tile.html.eex:61 msgid "View Less Transfers" msgstr "" -#: lib/block_scout_web/templates/transaction/_tile.html.eex:72 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/_tile.html.eex:60 msgid "View More Transfers" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:39 -#, elixir-autogen, elixir-format msgid "View next block" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:23 -#, elixir-autogen, elixir-format msgid "View previous block" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_metatags.html.eex:9 -#, elixir-autogen, elixir-format msgid "View the account balance, transactions, and other data for %{address} on the %{network}" msgstr "" -#: lib/block_scout_web/templates/withdrawal/_metatags.html.eex:8 -#, elixir-autogen, elixir-format -msgid "View the beacon chain withdrawals on %{subnetwork}" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/block/_metatags.html.eex:10 -#, elixir-autogen, elixir-format msgid "View the transactions, token transfers, and uncles for block number %{block_number}" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_metatags.html.eex:8 -#, elixir-autogen, elixir-format -msgid "View the verified contracts on %{subnetwork}" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/transaction/_metatags.html.eex:10 -#, elixir-autogen, elixir-format msgid "View transaction %{transaction} on %{subnetwork}" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_contract.html.eex:28 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:32 -#: lib/block_scout_web/views/verified_contracts_view.ex:11 -#, elixir-autogen, elixir-format -msgid "Vyper" -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:46 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:48 msgid "Vyper contract" msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:142 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:132 msgid "WEI" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/smart_contract/_pending_contract_write.html.eex:9 -#, elixir-autogen, elixir-format msgid "Waiting for transaction's confirmation..." msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:139 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:150 msgid "Wallet addresses" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_changed_bytecode_warning.html.eex:3 -#, elixir-autogen, elixir-format msgid "Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky." msgstr "" -#: lib/block_scout_web/templates/account/common/_nav.html.eex:7 -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:7 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:15 -#, elixir-autogen, elixir-format -msgid "Watch list" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:2 +msgid "We found the following pools you can claim reward from:" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:77 -#, elixir-autogen, elixir-format -msgid "We recommend using flattened code. This is necessary if your code utilizes a library or inherits dependencies. Use the" +#, elixir-format +#: lib/block_scout_web/views/wei_helpers.ex:76 +msgid "Wei" msgstr "" -#: lib/block_scout_web/views/wei_helper.ex:80 -#, elixir-autogen, elixir-format -msgid "Wei" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:7 +msgid "Withdraw" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:70 +msgid "Withdraw Now" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_rows.html.eex:52 +msgid "Withdraw after block #%{banned_delegators_until} (%{estimated_unban_day})" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_withdrawal.html.eex:22 +msgid "Withdrawal orders made during an active staking epoch are available to claim after the epoch is complete." msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:29 -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:13 -#: lib/block_scout_web/templates/block/_tabs.html.eex:13 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:73 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:5 -#, elixir-autogen, elixir-format -msgid "Withdrawals" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:35 +msgid "Working Stake Amount" msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:106 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:98 msgid "Write" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:103 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:34 -#: lib/block_scout_web/views/address_view.ex:383 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:95 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:34 lib/block_scout_web/views/address_view.ex:353 msgid "Write Contract" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:110 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:48 -#: lib/block_scout_web/views/address_view.ex:384 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:102 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:48 lib/block_scout_web/views/address_view.ex:354 msgid "Write Proxy" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:14 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:14 -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_yul_contracts_switcher.html.eex:14 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:51 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:43 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:61 lib/block_scout_web/templates/stakes/_rows.html.eex:24 msgid "Yes" msgstr "" -#: lib/block_scout_web/templates/account/api_key/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "You can create 3 API keys per account." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:34 +msgid "You Can Order:" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:15 +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:12 +msgid "You Staked:" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward.html.eex:11 +msgid "You can get your reward for all staking epochs during which the pool was a validator or specify separate epochs if Tx Gas Limit is too high. Tx Gas Limit depends on how long the pool was a validator and how many staking epochs you held your stake in the pool without movement." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:52 +msgid "You can withdraw this amount right now." msgstr "" -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "You can create up to 15 Custom ABIs per account." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:38 +msgid "You will be able to withdraw after block #%{banned_delegators_until} (%{estimated_unban_day})" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:11 -#, elixir-autogen, elixir-format -msgid "You can request a public category tag which is displayed to all Blockscout users. Public tags may be added to contract or external addresses, and any associated transactions will inherit that tag. Clicking a tag opens a page with related information and helps provide context and data organization. Requests are sent to a moderator for review and approval. This process can take several days." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:48 +msgid "You will receive:" msgstr "" -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:14 -#, elixir-autogen, elixir-format -msgid "You don't have address tags yet" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:22 lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:28 +msgid "Your Balance:" msgstr "" -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:14 -#, elixir-autogen, elixir-format -msgid "You don't have addresses on you watchlist yet" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:16 +msgid "Your Current Stake:" msgstr "" -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:14 -#, elixir-autogen, elixir-format -msgid "You don't have transaction tags yet" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:12 +msgid "Your Mining Address" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:15 -#, elixir-autogen, elixir-format -msgid "Your name" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:14 +msgid "Your Pool Name" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Your name*" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:16 +msgid "Your Pool Short Description (optional)" msgstr "" -#: lib/block_scout_web/templates/error422/index.html.eex:8 -#, elixir-autogen, elixir-format -msgid "Your request contained an error, perhaps a mistyped tx/block/address hash. Try again, and check the developer tools console for more info." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_withdrawal.html.eex:11 +msgid "Your ordered amount" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:111 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:41 +msgid "all epochs" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:127 msgid "at" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_token/overview.html.eex:52 -#, elixir-autogen, elixir-format msgid "balance of the address" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:409 +msgid "burned for this transaction. Equals Block Base Fee per Gas * Gas Used." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:215 +msgid "burned from transactions included in the block (Base fee (per unit of gas) * Gas Used)." +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:27 -#, elixir-autogen, elixir-format msgid "button" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:256 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:19 +msgid "candidate" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:226 msgid "created" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:12 -#, elixir-autogen, elixir-format msgid "custom RPC" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:149 -#, elixir-autogen, elixir-format -msgid "doesn't include ERC20, ERC721, ERC1155 tokens)." -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/common_components/_rap_pagination_container.html.eex:13 -#, elixir-autogen, elixir-format msgid "elements are displayed" msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:44 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:41 msgid "fallback" msgstr "" -#: lib/block_scout_web/views/address_contract_view.ex:30 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/address_contract_view.ex:24 msgid "false" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:10 -#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:12 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:10 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:12 lib/block_scout_web/templates/transaction_log/_logs.html.eex:10 msgid "here" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:9 -#, elixir-autogen, elixir-format msgid "here." msgstr "" -#: lib/block_scout_web/templates/smart_contract/_function_response.html.eex:3 -#, elixir-autogen, elixir-format -msgid "method Response" +#, elixir-format +#: lib/block_scout_web/templates/transaction/invalid.html.eex:8 +msgid "is not a valid transaction hash" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:41 -#, elixir-autogen, elixir-format msgid "of" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:100 -#, elixir-autogen, elixir-format -msgid "on sign up. Didn’t receive?" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/smart_contract/_functions.html.eex:16 -#, elixir-autogen, elixir-format msgid "page" msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:46 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:20 +msgid "pool owner" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:43 msgid "receive" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:58 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:69 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:81 +#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:69 lib/block_scout_web/templates/api_docs/_action_tile.html.eex:81 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:70 -#, elixir-autogen, elixir-format msgid "required" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:42 +msgid "specified epochs only" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:59 #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:70 -#, elixir-autogen, elixir-format msgid "string" msgstr "" -#: lib/block_scout_web/views/address_contract_view.ex:29 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/address_contract_view.ex:23 msgid "true" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:77 -#, elixir-autogen, elixir-format -msgid "truffle flattener" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:18 +msgid "validator" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:9 -#, elixir-autogen, elixir-format -msgid "New Smart Contract Verification via Standard input JSON" +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:216 +msgid "ERC-1155 " msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:5 -#, elixir-autogen, elixir-format -msgid "New Smart Contract Verification via metadata JSON" +#, elixir-format +#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:11 +msgid "Not unique Token" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:10 +msgid "Error" msgstr "" -#: lib/block_scout_web/templates/withdrawal/index.html.eex:11 -#, elixir-autogen, elixir-format -msgid "%{withdrawals_count} withdrawals processed and %{withdrawals_sum} withdrawn." +#, elixir-format +#: lib/block_scout_web/templates/address_token/overview.html.eex:65 +msgid "CRC Worth" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address_token/overview.html.eex:66 +msgid "Shows the total CRC balance in the address." msgstr "" -#: lib/block_scout_web/templates/csv_export/index.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Export" +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:110 +msgid "N/A bytes" msgstr "" -#: lib/block_scout_web/templates/csv_export/index.html.eex:14 -#, elixir-autogen, elixir-format -msgid "for address" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:262 +msgid "Fetching gas used..." msgstr "" -#: lib/block_scout_web/templates/csv_export/index.html.eex:17 -#, elixir-autogen, elixir-format -msgid "to CSV file" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:209 +#: lib/block_scout_web/templates/address/overview.html.eex:217 +msgid "Fetching transactions..." msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:38 -#: lib/block_scout_web/views/verified_contracts_view.ex:12 -#, elixir-autogen, elixir-format -msgid "Yul" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:236 +#: lib/block_scout_web/templates/address/overview.html.eex:244 +msgid "Fetching transfers..." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:437 -#, elixir-autogen, elixir-format -msgid "burnt for this transaction. Equals Block Base Fee per Gas * Gas Used." +#, elixir-format +#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:18 +msgid "Loading chart..." msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:215 -#, elixir-autogen, elixir-format -msgid "burnt from transactions included in the block (Base fee (per unit of gas) * Gas Used)." +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_function_response.html.eex:3 +msgid "method Response" 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 328f17c0900d..053983c42f92 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 @@ -1,3684 +1,3321 @@ +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:6 +msgid "%{blocks} block" +msgid_plural "%{blocks} blocks" +msgstr[0] "" +msgstr[1] "" + +#, elixir-format #: lib/block_scout_web/views/address_token_balance_view.ex:10 -#, elixir-autogen, elixir-format msgid "%{count} token" msgid_plural "%{count} tokens" msgstr[0] "" msgstr[1] "" +#, elixir-format #: lib/block_scout_web/templates/block/_tile.html.eex:29 -#, elixir-autogen, elixir-format msgid "%{count} transaction" msgid_plural "%{count} transactions" msgstr[0] "" msgstr[1] "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_minimal_proxy_pattern.html.eex:9 -#, elixir-autogen, elixir-format msgid " - minimal bytecode implementation that delegates all calls to a known address" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:43 +msgid " Working Stake Amount is an amount which is accounted and working at the current staking epoch." +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:14 -#, elixir-autogen, elixir-format msgid " is recommended." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_metatags.html.eex:3 -#, elixir-autogen, elixir-format msgid "%{address} - %{subnetwork} Explorer" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:12 -#, elixir-autogen, elixir-format msgid "%{block_type} Details" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:55 -#, elixir-autogen, elixir-format msgid "%{block_type} Height" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/index.html.eex:7 -#, elixir-autogen, elixir-format msgid "%{block_type}s" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:85 -#, elixir-autogen, elixir-format msgid "%{count} Transaction" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:87 #: lib/block_scout_web/templates/chain/_block.html.eex:11 -#, elixir-autogen, elixir-format msgid "%{count} Transactions" msgstr "" -#: lib/block_scout_web/templates/transaction/_actions.html.eex:101 -#, elixir-autogen, elixir-format -msgid "%{qty} of Token ID [%{link_to_id}]" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/chain/_metatags.html.eex:2 -#, elixir-autogen, elixir-format msgid "%{subnetwork} %{network} Explorer" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/layout/_default_title.html.eex:2 -#, elixir-autogen, elixir-format msgid "%{subnetwork} Explorer - BlockScout" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:371 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_metatags.html.eex:2 +msgid "%{subnetwork} Staking DApp - BlockScout" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:351 msgid "(Awaiting internal transactions for status)" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_rows.html.eex:26 +#: lib/block_scout_web/templates/stakes/_stakes_progress.html.eex:27 +msgid "(inactive pool)" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:59 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:70 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:82 +#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:70 lib/block_scout_web/templates/api_docs/_action_tile.html.eex:82 #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:104 -#, elixir-autogen, elixir-format msgid "(query)" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_first.html.eex:4 -#, elixir-autogen, elixir-format -msgid ") may be added for each contract. Click the Add Library button to add an additional one." -msgstr "" - -#: lib/block_scout_web/templates/layout/app.html.eex:93 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/app.html.eex:192 msgid "- We're indexing this chain right now. Some of the counts may be inaccurate." msgstr "" -#: lib/block_scout_web/templates/transaction/not_found.html.eex:8 -#, elixir-autogen, elixir-format -msgid "1. If you have just submitted this transaction please wait for at least 30 seconds before refreshing this page." -msgstr "" - -#: lib/block_scout_web/templates/transaction/not_found.html.eex:9 -#, elixir-autogen, elixir-format -msgid "2. It could still be in the TX Pool of a different node, waiting to be broadcasted." -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 -#, 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." -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:195 -#, elixir-autogen, elixir-format msgid "64-bit hash of value verifying proof-of-work (note: null for POA chains)." msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:97 -#: lib/block_scout_web/templates/transaction_state/_state_change.html.eex:21 -#, elixir-autogen, elixir-format -msgid "A block producer who successfully included the block onto the blockchain." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:76 +msgid "Pending stake (stake placed on a candidate pool or placed during the current staking epoch) may be withdrawn now.
\nActive stake (stake available after the current epoch) can be ordered for withdrawal from the pool, and will be available to claim after the current staking epoch is complete.
\nIf you have already ordered (and the staking window is still open), you may increase your current order by entering a positive value, or decrease your current order by entering a negative value in the box and clicking 'Order Withdrawal'. You must either keep the minimum stake amount in the pool, or order your entire stake for withdrawal.
\n" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:100 -#, elixir-autogen, elixir-format -msgid "A confirmation email was sent to" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:36 +msgid "To become a candidate, your staking address must be funded with %{tokenSymbol} tokens and %{coinSymbol} coins, and your OpenEthereum node must be active and configured with the mining address you specify here.
\nTo become a delegator, close this window and select an address from the list of pools you would like to place stake on. Click the Stake button next to the address to begin the process.
" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_first.html.eex:4 -#, elixir-autogen, elixir-format -msgid "A library name called in the .sol file. Multiple libraries (up to " +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:97 +msgid "A block producer who successfully included the block onto the blockchain." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:73 -#, elixir-autogen, elixir-format msgid "A string with the name of the action to be invoked." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:62 -#, elixir-autogen, elixir-format msgid "A string with the name of the module to be invoked." msgstr "" -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:24 -#, elixir-autogen, elixir-format -msgid "ABI" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification_common_fields/_constructor_args.html.eex:3 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:62 msgid "ABI-encoded Constructor Arguments (if required by the contract)" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/index.html.eex:4 -#, elixir-autogen, elixir-format msgid "API Documentation" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_metatags.html.eex:4 -#, elixir-autogen, elixir-format msgid "API endpoints for the %{subnetwork}" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_metatags.html.eex:2 -#, elixir-autogen, elixir-format msgid "API for the %{subnetwork} - BlockScout" msgstr "" -#: lib/block_scout_web/templates/account/api_key/form.html.eex:7 -#: lib/block_scout_web/templates/account/api_key/form.html.eex:13 -#: lib/block_scout_web/templates/account/api_key/form.html.eex:14 -#: lib/block_scout_web/templates/account/api_key/index.html.eex:29 -#, elixir-autogen, elixir-format -msgid "API key" +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:124 +msgid "APIs" msgstr "" -#: lib/block_scout_web/templates/account/api_key/index.html.eex:7 -#: lib/block_scout_web/templates/account/common/_nav.html.eex:16 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:18 -#, elixir-autogen, elixir-format -msgid "API keys" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:39 +msgid "APY" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:106 -#, elixir-autogen, elixir-format -msgid "APIs" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:79 +msgid "APY & Predicted Reward" msgstr "" -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:24 -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:24 +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:69 -#, elixir-autogen, elixir-format msgid "Action" msgstr "" -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:25 -#, elixir-autogen, elixir-format -msgid "Actions" -msgstr "" - -#: lib/block_scout_web/templates/transaction/overview.html.eex:451 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:423 msgid "Actual gas amount used by the transaction." msgstr "" -#: lib/block_scout_web/templates/account/api_key/form.html.eex:7 -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:8 -#: lib/block_scout_web/templates/layout/_add_chain_to_mm.html.eex:10 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:44 msgid "Add" msgstr "" -#: lib/block_scout_web/templates/account/api_key/index.html.eex:44 -#, elixir-autogen, elixir-format -msgid "Add API key" -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:86 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:76 -#, elixir-autogen, elixir-format -msgid "Add Contract Libraries" -msgstr "" - -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:44 -#, elixir-autogen, elixir-format -msgid "Add Custom ABI" -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:97 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:87 -#, elixir-autogen, elixir-format -msgid "Add Library" -msgstr "" - -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:38 -#, elixir-autogen, elixir-format -msgid "Add address" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:7 -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:37 -#, elixir-autogen, elixir-format -msgid "Add address tag" -msgstr "" - -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Add address to the Watch list" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:7 -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:37 -#, elixir-autogen, elixir-format -msgid "Add transaction tag" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:11 -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:23 -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:23 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:12 +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:16 -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_address.html.eex:4 -#: lib/block_scout_web/templates/tokens/index.html.eex:34 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:20 -#: lib/block_scout_web/templates/transaction_state/index.html.eex:34 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:60 -#: lib/block_scout_web/views/address_view.ex:109 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:20 lib/block_scout_web/views/address_view.ex:104 msgid "Address" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:243 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:211 msgid "Address (external or contract) receiving the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:225 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:191 msgid "Address (external or contract) sending the transaction." msgstr "" -#: lib/block_scout_web/templates/account/common/_nav.html.eex:10 -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:7 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:16 -#, elixir-autogen, elixir-format -msgid "Address Tags" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:164 +msgid "Address balance in xDAI (doesn't include ERC20, ERC721, ERC1155 tokens)." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:149 -#, elixir-autogen, elixir-format -msgid "Address balance in" -msgstr "" - -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:51 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:65 msgid "Address of the token contract" msgstr "" -#: lib/block_scout_web/templates/transaction_state/_state_change.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Address used in token mintings and burnings." -msgstr "" - -#: lib/block_scout_web/templates/account/public_tags_request/address_field.html.eex:2 -#, elixir-autogen, elixir-format -msgid "Address*" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address/index.html.eex:5 -#, elixir-autogen, elixir-format msgid "Addresses" msgstr "" -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:38 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:35 -#, elixir-autogen, elixir-format -msgid "Age" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:26 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:28 -#: lib/block_scout_web/templates/address_transaction/index.html.eex:22 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:88 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:20 -#: lib/block_scout_web/views/address_internal_transaction_view.ex:11 -#: lib/block_scout_web/views/address_token_transfer_view.ex:11 -#: lib/block_scout_web/views/address_transaction_view.ex:11 -#: lib/block_scout_web/views/verified_contracts_view.ex:13 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:28 lib/block_scout_web/templates/address_transaction/index.html.eex:22 +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:21 lib/block_scout_web/templates/layout/_topnav.html.eex:73 +#: lib/block_scout_web/templates/layout/_topnav.html.eex:105 lib/block_scout_web/views/address_internal_transaction_view.ex:11 +#: lib/block_scout_web/views/address_token_transfer_view.ex:11 lib/block_scout_web/views/address_transaction_view.ex:11 msgid "All" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/smart_contract/_functions.html.eex:13 -#, elixir-autogen, elixir-format msgid "All functions displayed below are from ABI of that contract. In order to verify current contract, proceed with" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:27 -#, elixir-autogen, elixir-format msgid "All metadata displayed below is from that contract. In order to verify current contract, click" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:174 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:27 +msgid "All pool participant addresses. The top address belongs to the %{pool_type}." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:189 msgid "All tokens in the account and total value." msgstr "" -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:41 -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:32 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:38 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:27 +msgid "Already Ordered:" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:10 lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:14 +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:11 lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:11 msgid "Amount" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:437 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:409 msgid "Amount of" msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:236 -#, elixir-autogen, elixir-format -msgid "Amount of distributed reward. Miners receive a static block reward + Tx fees + uncle fees." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:41 +msgid "Amount of %{symbol} placed by an address." msgstr "" -#: lib/block_scout_web/templates/internal_server_error/index.html.eex:8 -#, elixir-autogen, elixir-format -msgid "An unexpected error has occurred. Try reloading the page, or come back soon and try again." +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:236 +msgid "Amount of distributed reward. Miners receive a static block reward + Tx fees + uncle fees." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:15 -#, elixir-autogen, elixir-format msgid "Anything not in this list is not supported. Click on the method to be taken to the documentation for that method, and check the notes section for any potential differences." msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:134 -#, elixir-autogen, elixir-format -msgid "Apps" -msgstr "" - -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:21 -#, elixir-autogen, elixir-format -msgid "Average" -msgstr "" - -#: lib/block_scout_web/templates/chain/show.html.eex:101 -#, elixir-autogen, elixir-format -msgid "Average block time" -msgstr "" - -#: lib/block_scout_web/templates/account/api_key/form.html.eex:25 -#, elixir-autogen, elixir-format -msgid "Back to API keys (Cancel)" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:80 +msgid "Approximate Current Annual Percentage Yield. If you see N/A, please reopen the popup in a few blocks (APY cannot be calculated at the very beginning of a staking epoch). Predicted Reward is the amount of %{symbol} a participant will receive for staking and can claim once the current epoch ends." msgstr "" -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Back to Address Tags (Cancel)" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:39 +msgid "Approximate Current Annual Percentage Yield. If you see N/A, please wait for a few blocks (APY cannot be calculated at the very beginning of a staking epoch)." msgstr "" -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:30 -#, elixir-autogen, elixir-format -msgid "Back to Custom ABI (Cancel)" +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:152 +msgid "Apps" msgstr "" -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Back to Transaction Tags (Cancel)" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:48 +msgid "Available Now:" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:81 -#, elixir-autogen, elixir-format -msgid "Back to Watch list (Cancel)" +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:123 +msgid "Average block time" msgstr "" -#: lib/block_scout_web/templates/error422/index.html.eex:9 -#: lib/block_scout_web/templates/internal_server_error/index.html.eex:9 -#: lib/block_scout_web/templates/page_not_found/index.html.eex:9 -#: lib/block_scout_web/templates/transaction/not_found.html.eex:13 -#, elixir-autogen, elixir-format -msgid "Back to home" +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:30 +msgid "Back Home" msgstr "" -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:24 -#: lib/block_scout_web/templates/address/overview.html.eex:150 -#: lib/block_scout_web/templates/address_token/overview.html.eex:51 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:63 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_balance_card.html.eex:4 +#: lib/block_scout_web/templates/address/overview.html.eex:165 lib/block_scout_web/templates/address_token/overview.html.eex:51 +#: lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:42 lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:43 msgid "Balance" msgstr "" -#: lib/block_scout_web/templates/transaction_state/index.html.eex:40 -#, elixir-autogen, elixir-format -msgid "Balance after" +#, elixir-format +#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:14 +msgid "Balances" msgstr "" -#: lib/block_scout_web/templates/transaction_state/index.html.eex:37 -#, elixir-autogen, elixir-format -msgid "Balance before" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:32 +msgid "Banned" msgstr "" -#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Balances" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_rows.html.eex:46 +msgid "Banned until block #%{banned_until} (%{estimated_unban_day})" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:207 -#, elixir-autogen, elixir-format msgid "Base Fee per Gas" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:5 #: lib/block_scout_web/templates/api_docs/index.html.eex:5 -#, elixir-autogen, elixir-format msgid "Base URL:" msgstr "" -#: lib/block_scout_web/templates/withdrawal/_metatags.html.eex:2 -#, elixir-autogen, elixir-format -msgid "Beacon chain withdrawals - %{subnetwork} Explorer" -msgstr "" - -#: lib/block_scout_web/templates/withdrawal/_metatags.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Beacon chain, Withdrawals, %{subnetwork}, %{coin}" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_empty_content.html.eex:13 +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:5 +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:33 lib/block_scout_web/templates/stakes/_stakes_top.html.eex:24 +msgid "Become a Candidate" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:472 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:444 msgid "Binary data included with the transaction. See input / logs below for additional info." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_coin_balance/_coin_balances.html.eex:8 -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:35 -#: lib/block_scout_web/templates/block/overview.html.eex:29 -#: lib/block_scout_web/templates/transaction/overview.html.eex:161 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:29 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:26 lib/block_scout_web/templates/transaction/overview.html.eex:150 msgid "Block" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_link.html.eex:2 -#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:32 -#: lib/block_scout_web/templates/tokens/transfer/_token_transfer.html.eex:43 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:28 lib/block_scout_web/templates/tokens/transfer/_token_transfer.html.eex:43 msgid "Block #%{number}" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_metatags.html.eex:3 -#, elixir-autogen, elixir-format msgid "Block %{block_number} - %{subnetwork} Explorer" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block_transaction/404.html.eex:7 -#, elixir-autogen, elixir-format msgid "Block Details" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:53 -#, elixir-autogen, elixir-format msgid "Block Height" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:47 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/app.html.eex:46 msgid "Block Mined, awaiting import..." msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:34 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:33 msgid "Block Pending" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:158 -#, elixir-autogen, elixir-format msgid "Block difficulty for miner, used to calibrate block generation time (Note: constant in POA based networks)." msgstr "" +#, elixir-format #: lib/block_scout_web/views/block_transaction_view.ex:15 -#, elixir-autogen, elixir-format msgid "Block not found, please try again later." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:160 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:5 +msgid "Block number" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:149 msgid "Block number containing the transaction." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:257 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:272 msgid "Block number in which the address was updated." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/chain/_metatags.html.eex:4 -#, elixir-autogen, elixir-format msgid "BlockScout provides analytics data, API, and Smart Contract tools for the %{subnetwork}" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:29 -#, elixir-autogen, elixir-format -msgid "Blockchain" -msgstr "" - -#: lib/block_scout_web/templates/chain/show.html.eex:154 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:34 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:38 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:165 +#: lib/block_scout_web/templates/layout/_topnav.html.eex:24 lib/block_scout_web/templates/layout/_topnav.html.eex:28 msgid "Blocks" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:46 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/app.html.eex:45 msgid "Blocks Indexed" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:56 -#: lib/block_scout_web/templates/address/overview.html.eex:275 -#: lib/block_scout_web/templates/address_validation/index.html.eex:11 -#: lib/block_scout_web/views/address_view.ex:386 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:48 +#: lib/block_scout_web/templates/address/overview.html.eex:289 lib/block_scout_web/templates/address_validation/index.html.eex:11 +#: lib/block_scout_web/views/address_view.ex:356 msgid "Blocks Validated" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:48 -#, elixir-autogen, elixir-format -msgid "Blocks With Internal Transactions Indexed" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/layout/_footer.html.eex:22 -#, elixir-autogen, elixir-format msgid "Blockscout is a tool for inspecting and analyzing EVM based blockchains. Blockchain explorer for Ethereum Networks." msgstr "" -#: lib/block_scout_web/templates/transaction_state/_state_change.html.eex:8 -#, elixir-autogen, elixir-format -msgid "Burn address" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:45 +msgid "Bridge STAKE to Ethereum" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/bridged_tokens/index.html.eex:7 +msgid "Bridged Tokens from " +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:84 +msgid "Bridged from BSC" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:78 +msgid "Bridged from Ethereum" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_tile.html.eex:64 #: lib/block_scout_web/templates/block/overview.html.eex:216 -#, elixir-autogen, elixir-format msgid "Burnt Fees" msgstr "" -#: lib/block_scout_web/templates/address_token/overview.html.eex:65 -#, elixir-autogen, elixir-format -msgid "CRC Worth" -msgstr "" - -#: lib/block_scout_web/templates/common_components/_csv_export_button.html.eex:4 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/common_components/_csv_export_button.html.eex:2 msgid "CSV" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:10 #: lib/block_scout_web/views/internal_transaction_view.ex:21 -#, elixir-autogen, elixir-format msgid "Call" msgstr "" +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:22 -#, elixir-autogen, elixir-format msgid "Call Code" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:62 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:120 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:115 -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:41 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:107 -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:55 -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:51 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:47 +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:114 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:231 +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:48 +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:60 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:85 lib/block_scout_web/templates/api_docs/_action_tile.html.eex:47 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:54 -#, elixir-autogen, elixir-format msgid "Cancel" msgstr "" -#: lib/block_scout_web/templates/transaction_state/index.html.eex:43 -#, elixir-autogen, elixir-format -msgid "Change" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:10 +msgid "Candidate and Validator Pool Addresses. Current validator pools are specified by a checkmark." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:47 +msgid "Candidate’s Staked Amount" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:11 +msgid "Change Network" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:43 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:41 msgid "Chat (#blockscout)" msgstr "" -#: lib/block_scout_web/views/block_view.ex:65 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:6 +msgid "Choose Pool" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:22 +msgid "Choose Target Pool" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/views/block_view.ex:63 msgid "Chore Reward" msgstr "" -#: lib/block_scout_web/templates/tokens/index.html.eex:38 -#, elixir-autogen, elixir-format -msgid "Circulating Market Cap" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_withdrawal.html.eex:7 +msgid "Claim Ordered Withdraw" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward.html.eex:6 +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:59 lib/block_scout_web/templates/stakes/_stakes_top.html.eex:30 +msgid "Claim Reward" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:40 +msgid "Claim for" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_withdrawal.html.eex:18 +msgid "Claim the Amount" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:137 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:106 -#, elixir-autogen, elixir-format msgid "Clear" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:37 -#: lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:6 -#: lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:14 -#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:84 -#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:92 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:6 lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:14 +#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:84 lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:92 msgid "Close" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:66 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:165 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:187 -#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:126 -#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:149 -#: lib/block_scout_web/views/address_view.ex:379 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:58 +#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:165 lib/block_scout_web/templates/api_docs/_action_tile.html.eex:187 +#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:126 lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:149 +#: lib/block_scout_web/views/address_view.ex:349 msgid "Code" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:42 -#: lib/block_scout_web/views/address_view.ex:385 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:34 +#: lib/block_scout_web/views/address_view.ex:355 msgid "Coin Balance History" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:55 -#, elixir-autogen, elixir-format msgid "Collapse" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Company name" -msgstr "" - -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:32 -#, elixir-autogen, elixir-format -msgid "Company website" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification_common_fields/_compiler_field.html.eex:3 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:69 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:40 msgid "Compiler" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:142 -#, elixir-autogen, elixir-format -msgid "Compiler Settings" -msgstr "" - -#: lib/block_scout_web/templates/address_contract/index.html.eex:71 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:65 msgid "Compiler version" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:364 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:344 msgid "Confirmed" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:127 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:116 msgid "Confirmed by " msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:193 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:182 msgid "Confirmed within" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:2 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:6 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:11 #: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:2 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:4 -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:6 -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:4 -#: lib/block_scout_web/templates/tokens/holder/index.html.eex:16 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:9 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:6 lib/block_scout_web/templates/tokens/holder/index.html.eex:15 msgid "Connection Lost" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_coin_balance/index.html.eex:12 #: lib/block_scout_web/templates/block/index.html.eex:5 -#, elixir-autogen, elixir-format msgid "Connection Lost, click to load newer blocks" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:15 -#, elixir-autogen, elixir-format msgid "Connection Lost, click to load newer internal transactions" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_transaction/index.html.eex:11 -#: lib/block_scout_web/templates/pending_transaction/index.html.eex:16 -#: lib/block_scout_web/templates/transaction/index.html.eex:22 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/pending_transaction/index.html.eex:16 lib/block_scout_web/templates/transaction/index.html.eex:22 msgid "Connection Lost, click to load newer transactions" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_validation/index.html.eex:10 -#, elixir-autogen, elixir-format msgid "Connection Lost, click to load newer validations" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:96 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:90 msgid "Constructor Arguments" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:78 -#, elixir-autogen, elixir-format -msgid "Constructor args" -msgstr "" - -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:52 -#: lib/block_scout_web/templates/transaction/overview.html.eex:253 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:221 msgid "Contract" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:157 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:126 msgid "Contract ABI" msgstr "" -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:18 -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:29 +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:14 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_contract_address_field.html.eex:3 -#: lib/block_scout_web/views/address_view.ex:107 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:23 +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:9 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:18 lib/block_scout_web/views/address_view.ex:102 msgid "Contract Address" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:16 -#: lib/block_scout_web/views/address_view.ex:47 -#: lib/block_scout_web/views/address_view.ex:81 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/views/address_view.ex:42 lib/block_scout_web/views/address_view.ex:76 msgid "Contract Address Pending" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:480 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:459 msgid "Contract Call" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:477 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:456 msgid "Contract Creation" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:174 -#: lib/block_scout_web/templates/address_contract/index.html.eex:189 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:142 +#: lib/block_scout_web/templates/address_contract/index.html.eex:157 msgid "Contract Creation Code" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:90 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:80 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:100 msgid "Contract Libraries" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:75 +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:91 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_contract_name_field.html.eex:3 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:29 msgid "Contract Name" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:25 #: lib/block_scout_web/templates/smart_contract/_functions.html.eex:11 -#, elixir-autogen, elixir-format msgid "Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:47 -#, elixir-autogen, elixir-format -msgid "Contract name or address" -msgstr "" - -#: lib/block_scout_web/templates/address_contract/index.html.eex:63 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:57 msgid "Contract name:" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:106 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:100 msgid "Contract source code" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:120 -#, elixir-autogen, elixir-format -msgid "Contract was precompiled and created at genesis or contract creation transaction is missing" -msgstr "" - -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:5 -#, elixir-autogen, elixir-format -msgid "Contracts" -msgstr "" - -#: lib/block_scout_web/templates/address_contract/index.html.eex:180 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:148 msgid "Contracts that self destruct in their constructors have no contract code published and cannot be verified." msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:42 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:40 msgid "Contribute" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:159 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:128 msgid "Copy ABI" msgstr "" -#: lib/block_scout_web/templates/account/api_key/row.html.eex:6 -#: lib/block_scout_web/templates/account/api_key/row.html.eex:6 -#, elixir-autogen, elixir-format -msgid "Copy API key" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_address/row.html.eex:8 -#: lib/block_scout_web/templates/account/tag_address/row.html.eex:8 -#: lib/block_scout_web/templates/account/tag_transaction/row.html.eex:11 -#: lib/block_scout_web/templates/account/tag_transaction/row.html.eex:11 -#: lib/block_scout_web/templates/account/watchlist_address/row.html.eex:7 -#: lib/block_scout_web/templates/address/overview.html.eex:38 -#: lib/block_scout_web/templates/address/overview.html.eex:39 -#: lib/block_scout_web/templates/block/overview.html.eex:104 -#: lib/block_scout_web/templates/block/overview.html.eex:105 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:43 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:44 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:37 +#: lib/block_scout_web/templates/address/overview.html.eex:38 lib/block_scout_web/templates/block/overview.html.eex:104 +#: lib/block_scout_web/templates/block/overview.html.eex:105 lib/block_scout_web/templates/tokens/overview/_details.html.eex:50 +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:51 msgid "Copy Address" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:144 -#, elixir-autogen, elixir-format -msgid "Copy Compiler Settings" -msgstr "" - -#: lib/block_scout_web/templates/account/custom_abi/row.html.eex:6 -#: lib/block_scout_web/templates/account/custom_abi/row.html.eex:6 -#, elixir-autogen, elixir-format -msgid "Copy Contract Address" -msgstr "" - -#: lib/block_scout_web/templates/address_contract/index.html.eex:176 -#: lib/block_scout_web/templates/address_contract/index.html.eex:192 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:160 msgid "Copy Contract Creation Code" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:19 -#, elixir-autogen, elixir-format msgid "Copy Decompiled Contract Code" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:213 -#: lib/block_scout_web/templates/address_contract/index.html.eex:223 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:187 +#: lib/block_scout_web/templates/address_contract/index.html.eex:197 msgid "Copy Deployed ByteCode" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/row.html.eex:7 -#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:17 -#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:18 -#: lib/block_scout_web/templates/transaction/overview.html.eex:233 -#: lib/block_scout_web/templates/transaction/overview.html.eex:234 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:14 +#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:15 lib/block_scout_web/templates/transaction/overview.html.eex:201 +#: lib/block_scout_web/templates/transaction/overview.html.eex:202 msgid "Copy From Address" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:129 #: lib/block_scout_web/templates/block/overview.html.eex:130 -#, elixir-autogen, elixir-format msgid "Copy Hash" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/metadata/index.html.eex:20 -#, elixir-autogen, elixir-format msgid "Copy Metadata" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:149 #: lib/block_scout_web/templates/block/overview.html.eex:150 -#, elixir-autogen, elixir-format msgid "Copy Parent Hash" msgstr "" -#: lib/block_scout_web/templates/transaction_raw_trace/_card_body.html.eex:9 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction_raw_trace/index.html.eex:15 msgid "Copy Raw Trace" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:120 -#: lib/block_scout_web/templates/address_contract/index.html.eex:132 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:102 +#: lib/block_scout_web/templates/address_contract/index.html.eex:115 msgid "Copy Source Code" msgstr "" -#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:34 -#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:35 -#: lib/block_scout_web/templates/transaction/overview.html.eex:260 -#: lib/block_scout_web/templates/transaction/overview.html.eex:261 -#: lib/block_scout_web/templates/transaction/overview.html.eex:268 -#: lib/block_scout_web/templates/transaction/overview.html.eex:269 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:31 +#: lib/block_scout_web/templates/transaction/_total_transfers_from_to.html.eex:32 lib/block_scout_web/templates/transaction/overview.html.eex:230 +#: lib/block_scout_web/templates/transaction/overview.html.eex:231 lib/block_scout_web/templates/transaction/overview.html.eex:240 +#: lib/block_scout_web/templates/transaction/overview.html.eex:241 msgid "Copy To Address" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:32 #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:33 -#, elixir-autogen, elixir-format msgid "Copy Token ID" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:87 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:81 msgid "Copy Transaction Hash" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:88 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:82 msgid "Copy Txn Hash" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:498 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:470 msgid "Copy Txn Hex Input" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:504 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:476 msgid "Copy Txn UTF-8 Input" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:20 -#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:41 -#: lib/block_scout_web/templates/transaction/overview.html.eex:497 -#: lib/block_scout_web/templates/transaction/overview.html.eex:503 -#: lib/block_scout_web/templates/transaction_raw_trace/_card_body.html.eex:8 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:41 lib/block_scout_web/templates/transaction/overview.html.eex:469 +#: lib/block_scout_web/templates/transaction/overview.html.eex:475 msgid "Copy Value" msgstr "" +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:25 -#, elixir-autogen, elixir-format msgid "Create" msgstr "" -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:12 -#, elixir-autogen, elixir-format -msgid "Create a Custom ABI to interact with contracts." -msgstr "" - -#: lib/block_scout_web/templates/account/api_key/index.html.eex:12 -#, elixir-autogen, elixir-format -msgid "Create an API key to use with your RPC и EthRPC API requests." -msgstr "" - +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:26 -#, elixir-autogen, elixir-format msgid "Create2" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:102 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:118 msgid "Creator" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:146 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:116 -#, elixir-autogen, elixir-format msgid "Curl" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:97 -#, elixir-autogen, elixir-format -msgid "Current transaction state: Success, Failed (Error), or Pending (In Process)" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:55 +msgid "Current Reward Share" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:63 +msgid "Current Reward Share is calculated based on the Working Stake Amount." msgstr "" -#: lib/block_scout_web/templates/address_read_contract/index.html.eex:20 -#: lib/block_scout_web/templates/address_write_contract/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "Custom" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:35 +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:37 +msgid "Current Stake Amount" msgstr "" -#: lib/block_scout_web/templates/account/common/_nav.html.eex:19 -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:8 -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:7 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:19 -#, elixir-autogen, elixir-format -msgid "Custom ABI" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:36 +msgid "Current Stake:" msgstr "" -#: lib/block_scout_web/templates/address_read_contract/index.html.eex:25 -#: lib/block_scout_web/templates/address_write_contract/index.html.eex:23 -#, elixir-autogen, elixir-format -msgid "Custom ABI from account" +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:89 +msgid "Current transaction state: Success, Failed (Error), or Pending (In Process)" msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:70 -#, elixir-autogen, elixir-format -msgid "Daily Transactions" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_metatags.html.eex:6 +msgid "DApp for Staking %{symbol} tokens" msgstr "" -#: lib/block_scout_web/templates/address_logs/_logs.html.eex:98 -#: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:7 -#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:23 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:121 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_logs/_logs.html.eex:101 +#: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:7 lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:23 +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:120 msgid "Data" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:70 -#, elixir-autogen, elixir-format msgid "Date & time at which block was produced." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:179 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:168 msgid "Date & time of transaction inclusion, including length of time for confirmation." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:52 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:131 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:145 msgid "Decimals" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:32 -#: lib/block_scout_web/templates/address_logs/_logs.html.eex:38 -#: lib/block_scout_web/templates/address_logs/_logs.html.eex:53 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:34 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:42 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:57 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:73 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_logs/_logs.html.eex:38 lib/block_scout_web/templates/address_logs/_logs.html.eex:53 +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:33 lib/block_scout_web/templates/transaction_log/_logs.html.eex:41 +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:56 lib/block_scout_web/templates/transaction_log/_logs.html.eex:72 msgid "Decoded" msgstr "" -#: lib/block_scout_web/views/address_view.ex:380 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/address_view.ex:350 msgid "Decompiled Code" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:83 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:75 msgid "Decompiled code" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:17 -#, elixir-autogen, elixir-format msgid "Decompiled contract code" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:10 -#, elixir-autogen, elixir-format msgid "Decompiler version" msgstr "" +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:23 -#, elixir-autogen, elixir-format msgid "Delegate Call" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:211 -#: lib/block_scout_web/templates/address_contract/index.html.eex:219 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_progress.html.eex:31 +#: lib/block_scout_web/templates/stakes/_table.html.eex:43 +msgid "Delegators" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:6 +msgid "Delegators of " +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:53 +msgid "Delegators’ Staked Amount" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:185 +#: lib/block_scout_web/templates/address_contract/index.html.eex:193 msgid "Deployed ByteCode" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:53 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:188 -#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:60 +#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:188 lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:60 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:150 -#, elixir-autogen, elixir-format msgid "Description" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:56 -#, elixir-autogen, elixir-format -msgid "Description*" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address/overview.html.eex:30 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:166 -#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:127 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:166 lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:127 msgid "Details" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:159 -#, elixir-autogen, elixir-format msgid "Difficulty" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:181 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:149 msgid "Displaying the init data provided of the creating transaction." msgstr "" -#: lib/block_scout_web/templates/common_components/_csv_export_button.html.eex:4 -#: lib/block_scout_web/templates/csv_export/index.html.eex:33 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/csv_export/index.html.eex:25 msgid "Download" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:72 -#, elixir-autogen, elixir-format -msgid "Drop all Solidity contract source files into the drop zone." -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:72 -#, elixir-autogen, elixir-format -msgid "Drop all Solidity or Yul contract source files into the drop zone." -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:18 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:26 msgid "Drop sources and metadata JSON file or click here" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:67 -#, elixir-autogen, elixir-format -msgid "Drop sources or click here" -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:28 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:33 msgid "Drop the standard input JSON file or click here" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:27 -#, elixir-autogen, elixir-format -msgid "E-mail*" +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:22 +msgid "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 "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_minimal_proxy_pattern.html.eex:6 -#, elixir-autogen, elixir-format msgid "EIP-1167" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:222 -#, elixir-autogen, elixir-format -msgid "ERC-1155 " -msgstr "" - -#: lib/block_scout_web/views/transaction_view.ex:220 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:214 msgid "ERC-20 " msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:40 -#, elixir-autogen, elixir-format -msgid "ERC-20 tokens (beta)" -msgstr "" - -#: lib/block_scout_web/views/transaction_view.ex:221 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:215 msgid "ERC-721 " msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:53 -#, elixir-autogen, elixir-format -msgid "ERC-721, ERC-1155 tokens (NFT) (beta)" +#, elixir-format +#: lib/block_scout_web/templates/address_token/overview.html.eex:1 +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:93 lib/block_scout_web/templates/smart_contract/_functions.html.eex:93 +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:133 +msgid "ETH" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:4 -#, elixir-autogen, elixir-format msgid "ETH RPC API Documentation" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:82 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:30 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:22 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:76 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:40 msgid "EVM Version" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:34 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:26 -#, elixir-autogen, elixir-format -msgid "EVM version details" -msgstr "" - +#, elixir-format #: lib/block_scout_web/views/block_transaction_view.ex:7 -#, elixir-autogen, elixir-format msgid "Easy Cowboy! This block does not exist yet!" msgstr "" -#: lib/block_scout_web/templates/account/api_key/row.html.eex:16 -#: lib/block_scout_web/templates/account/custom_abi/row.html.eex:16 -#: lib/block_scout_web/templates/account/watchlist_address/row.html.eex:27 -#, elixir-autogen, elixir-format -msgid "Edit" -msgstr "" - -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Edit Watch list address" -msgstr "" - -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:71 -#, elixir-autogen, elixir-format -msgid "Email notifications" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/transaction/_emission_reward_tile.html.eex:5 -#, elixir-autogen, elixir-format msgid "Emission Contract" msgstr "" -#: lib/block_scout_web/views/block_view.ex:73 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/block_view.ex:71 msgid "Emission Reward" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:72 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:82 msgid "Enter the Solidity Contract Code" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:22 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:51 msgid "Enter the Vyper Contract Code" msgstr "" -#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:11 -#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:10 -#, elixir-autogen, elixir-format -msgid "Error" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:4 +msgid "Epoch number" msgstr "" -#: lib/block_scout_web/templates/transaction/_tile.html.eex:11 -#, elixir-autogen, elixir-format -msgid "Error in internal transactions" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:44 +msgid "Epochs range(s) or enum, e.g.: 5-9,23-27,47,50" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:33 -#, elixir-autogen, elixir-format msgid "Error rendering value" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/address/_balance_card.html.eex:31 #: lib/block_scout_web/templates/address/_balance_dropdown.html.eex:10 -#, elixir-autogen, elixir-format msgid "Error trying to fetch balances." msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:375 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:355 msgid "Error: %{reason}" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:373 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:353 msgid "Error: (Awaiting internal transactions for reason)" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:120 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:135 msgid "Error: Could not determine contract creator." msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:120 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:138 msgid "Eth RPC" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/address/_balance_card.html.eex:18 +#: lib/block_scout_web/templates/address/index.html.eex:5 lib/block_scout_web/templates/address/overview.html.eex:178 +#: lib/block_scout_web/templates/block/overview.html.eex:209 lib/block_scout_web/templates/internal_transaction/_tile.html.eex:20 +#: lib/block_scout_web/templates/layout/_topnav.html.eex:89 lib/block_scout_web/templates/layout/_topnav.html.eex:110 +#: lib/block_scout_web/templates/layout/app.html.eex:45 lib/block_scout_web/templates/transaction/_pending_tile.html.eex:20 +#: lib/block_scout_web/templates/transaction/_tile.html.eex:37 lib/block_scout_web/templates/transaction/overview.html.eex:409 +#: lib/block_scout_web/views/wei_helpers.ex:78 +msgid "Ether" +msgstr "ETH" + +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:211 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:164 -#, elixir-autogen, elixir-format msgid "Example Value" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:128 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:99 -#, elixir-autogen, elixir-format msgid "Execute" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:55 -#, elixir-autogen, elixir-format msgid "Expand" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/csv_export/index.html.eex:10 -#, elixir-autogen, elixir-format msgid "Export Data" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:248 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:228 msgid "External libraries" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:40 -#, elixir-autogen, elixir-format msgid "Failed to decode input data." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:35 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:37 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:36 msgid "Failed to decode log data." msgstr "" -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:22 -#, elixir-autogen, elixir-format -msgid "Fast" -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:247 -#, elixir-autogen, elixir-format -msgid "Fetching gas used..." -msgstr "" - -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:112 -#, elixir-autogen, elixir-format -msgid "Fetching holders..." +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:24 +msgid "Favorites" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/address/_balance_card.html.eex:28 #: lib/block_scout_web/templates/address/_balance_dropdown.html.eex:7 -#, elixir-autogen, elixir-format msgid "Fetching tokens..." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:194 -#: lib/block_scout_web/templates/address/overview.html.eex:202 -#, elixir-autogen, elixir-format -msgid "Fetching transactions..." -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:221 -#: lib/block_scout_web/templates/address/overview.html.eex:229 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:123 -#, elixir-autogen, elixir-format -msgid "Fetching transfers..." -msgstr "" - -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:15 -#, elixir-autogen, elixir-format -msgid "Filter by compiler:" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/admin/dashboard/index.html.eex:16 -#, elixir-autogen, elixir-format msgid "For any existing contracts in the database, insert all ABI entries into the contract_methods table. Use this in case you have verified smart contracts before early March 2019 and you want other contracts with the same functions to show those ABI's as candidate matches." msgstr "" -#: lib/block_scout_web/templates/visualize_sol2uml/index.html.eex:7 -#, elixir-autogen, elixir-format -msgid "For contract" -msgstr "" - -#: lib/block_scout_web/templates/layout/_topnav.html.eex:44 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:34 msgid "Forked Blocks (Reorgs)" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:45 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:42 msgid "Forum" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:38 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:40 -#: lib/block_scout_web/templates/address_transaction/index.html.eex:34 -#: lib/block_scout_web/templates/transaction/overview.html.eex:226 -#: lib/block_scout_web/views/address_internal_transaction_view.ex:10 -#: lib/block_scout_web/views/address_token_transfer_view.ex:10 -#: lib/block_scout_web/views/address_transaction_view.ex:10 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:40 lib/block_scout_web/templates/address_transaction/index.html.eex:34 +#: lib/block_scout_web/templates/transaction/overview.html.eex:192 lib/block_scout_web/views/address_internal_transaction_view.ex:10 +#: lib/block_scout_web/views/address_token_transfer_view.ex:10 lib/block_scout_web/views/address_transaction_view.ex:10 msgid "From" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:18 -#, elixir-autogen, elixir-format msgid "GET" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_tile.html.eex:67 -#: lib/block_scout_web/templates/block/overview.html.eex:187 -#: lib/block_scout_web/templates/transaction/overview.html.eex:399 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:181 lib/block_scout_web/templates/transaction/overview.html.eex:371 msgid "Gas Limit" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:379 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:351 msgid "Gas Price" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:240 -#: lib/block_scout_web/templates/block/_tile.html.eex:73 -#: lib/block_scout_web/templates/block/overview.html.eex:178 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:255 +#: lib/block_scout_web/templates/block/_tile.html.eex:73 lib/block_scout_web/templates/block/overview.html.eex:172 msgid "Gas Used" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:452 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:424 msgid "Gas Used by Transaction" msgstr "" -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:3 -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:18 -#, elixir-autogen, elixir-format -msgid "Gas tracker" -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:239 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:254 +#: lib/block_scout_web/templates/address/overview.html.eex:288 msgid "Gas used by the address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:60 -#, elixir-autogen, elixir-format msgid "Genesis Block" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/layout/_footer.html.eex:24 -#, elixir-autogen, elixir-format msgid "Github" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_rap_pagination_container.html.eex:8 -#, elixir-autogen, elixir-format msgid "Go to" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:110 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:128 msgid "GraphQL" msgstr "" -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:11 -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:20 -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:21 -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:22 -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:38 -#: lib/block_scout_web/views/block_view.ex:22 -#: lib/block_scout_web/views/wei_helper.ex:81 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:52 +#: lib/block_scout_web/views/block_view.ex:21 lib/block_scout_web/views/wei_helpers.ex:77 msgid "Gwei" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:123 -#, elixir-autogen, elixir-format msgid "Hash" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:480 -#: lib/block_scout_web/templates/transaction/overview.html.eex:484 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:452 +#: lib/block_scout_web/templates/transaction/overview.html.eex:456 msgid "Hex (Default)" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:204 -#, elixir-autogen, elixir-format -msgid "Highlighted events of the transaction." +#, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:122 +msgid "Holders" msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:108 -#, elixir-autogen, elixir-format -msgid "Holders" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:77 +msgid "How Many Times this Address has been Banned" msgstr "" -#: lib/block_scout_web/templates/tokens/index.html.eex:48 -#, elixir-autogen, elixir-format -msgid "Holders Count" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:71 +msgid "How Many Times this Address has been a Validator" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:11 -#, elixir-autogen, elixir-format msgid "However, in general, the" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:19 -#, elixir-autogen, elixir-format msgid "IMPORTANT: This information is a best guess based on similar functions from other verified contracts." msgstr "" -#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:42 -#: lib/block_scout_web/templates/transaction/_tile.html.eex:92 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:38 +#: lib/block_scout_web/templates/transaction/_tile.html.eex:80 msgid "IN" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:56 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:48 -#, elixir-autogen, elixir-format -msgid "If you enabled optimization during compilation, select yes." +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:26 +msgid "If it still does not show up after 1 hour, please check with your sender/exchange/wallet/transaction provider for additional information." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:133 -#, elixir-autogen, elixir-format -msgid "Implementation" -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:132 -#, elixir-autogen, elixir-format -msgid "Implementation address of the proxy contract." +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:12 +msgid "If you have just submitted this transaction please wait for at least 30 seconds before refreshing this page." msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:3 -#, elixir-autogen, elixir-format -msgid "Include nightly builds" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:147 +msgid "Implementation" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:30 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:43 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:56 -#, elixir-autogen, elixir-format -msgid "Incoming" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:146 +msgid "Implementation address of the proxy contract." msgstr "" -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:29 -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:23 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:23 -#, elixir-autogen, elixir-format -msgid "Index" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:12 +msgid "Inactive Pool Addresses. Current validator pools are specified by a checkmark." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:464 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:436 msgid "Index position of Transaction in the block." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:249 -#, elixir-autogen, elixir-format msgid "Index position(s) of referenced stale blocks." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:6 -#, elixir-autogen, elixir-format msgid "Indexed?" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/layout/app.html.eex:47 +msgid "Indexing Tokens" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:3 -#, elixir-autogen, elixir-format msgid "Input" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:245 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:213 msgid "Interacted With (To)" msgstr "" -#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:7 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:6 msgid "Internal Transaction" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:36 -#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:17 -#: lib/block_scout_web/templates/transaction/_tabs.html.eex:11 -#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:6 -#: lib/block_scout_web/views/address_view.ex:376 -#: lib/block_scout_web/views/transaction_view.ex:535 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:28 +#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:17 lib/block_scout_web/templates/transaction/_tabs.html.eex:11 +#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:6 lib/block_scout_web/views/address_view.ex:346 +#: lib/block_scout_web/views/transaction_view.ex:514 msgid "Internal Transactions" msgstr "" -#: lib/block_scout_web/templates/internal_server_error/index.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Internal server error" +#, elixir-format +#: lib/block_scout_web/templates/transaction/invalid.html.eex:6 +msgid "Invalid Transaction Hash" msgstr "" -#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:16 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:19 -#: lib/block_scout_web/views/tokens/overview_view.ex:43 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:15 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:19 lib/block_scout_web/views/tokens/overview_view.ex:44 msgid "Inventory" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_yul_contracts_switcher.html.eex:3 -#, elixir-autogen, elixir-format -msgid "Is Yul contract" +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:16 +msgid "It could still be in the TX Pool of a different node, waiting to be broadcasted." msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:13 -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:26 -#, elixir-autogen, elixir-format -msgid "Last 24h" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:125 +msgid "It's me!" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:258 -#, elixir-autogen, elixir-format -msgid "Last Balance Update" +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:828 +msgid "JSON RPC error" msgstr "" -#: lib/block_scout_web/templates/account/api_key/index.html.eex:12 -#: lib/block_scout_web/templates/account/api_key/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "Learn more" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:273 +msgid "Last Balance Update" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:49 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/app.html.eex:48 msgid "Less than" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_address.html.eex:4 -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_name.html.eex:4 -#, elixir-autogen, elixir-format -msgid "Library" +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:115 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:137 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:159 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:181 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:203 +msgid "Library Address" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:105 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:127 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:149 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:171 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:193 +msgid "Library Name" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:24 -#, elixir-autogen, elixir-format msgid "License Expires" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:10 -#, elixir-autogen, elixir-format msgid "License ID" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:331 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:83 +msgid "Likelihood of Becoming a Validator on the Next Epoch" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:303 msgid "List of ERC-1155 tokens created in the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:315 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:287 msgid "List of token burnt in the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:298 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:270 msgid "List of token minted in the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:282 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:254 msgid "List of token transferred in the transaction." msgstr "" -#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "Loading chart..." -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:77 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:109 -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:35 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:99 -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:49 -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:45 -#: lib/block_scout_web/templates/address_read_contract/index.html.eex:41 -#: lib/block_scout_web/templates/address_read_contract/index.html.eex:49 -#: lib/block_scout_web/templates/address_read_proxy/index.html.eex:12 -#: lib/block_scout_web/templates/address_write_contract/index.html.eex:39 -#: lib/block_scout_web/templates/address_write_contract/index.html.eex:47 -#: lib/block_scout_web/templates/address_write_proxy/index.html.eex:12 -#: lib/block_scout_web/templates/tokens/contract/index.html.eex:17 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:79 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:225 +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:42 +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:54 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:79 lib/block_scout_web/templates/address_read_contract/index.html.eex:12 +#: lib/block_scout_web/templates/address_read_proxy/index.html.eex:12 lib/block_scout_web/templates/address_write_contract/index.html.eex:12 +#: lib/block_scout_web/templates/address_write_proxy/index.html.eex:12 lib/block_scout_web/templates/tokens/contract/index.html.eex:16 msgid "Loading..." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:2 -#, elixir-autogen, elixir-format msgid "Log Data" msgstr "" -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:131 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:130 msgid "Log Index" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:49 -#: lib/block_scout_web/templates/address_logs/index.html.eex:10 -#: lib/block_scout_web/templates/transaction/_tabs.html.eex:17 -#: lib/block_scout_web/templates/transaction_log/index.html.eex:8 -#: lib/block_scout_web/views/address_view.ex:387 -#: lib/block_scout_web/views/transaction_view.ex:536 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:41 +#: lib/block_scout_web/templates/address_logs/index.html.eex:10 lib/block_scout_web/templates/transaction/_tabs.html.eex:17 +#: lib/block_scout_web/templates/transaction_log/index.html.eex:8 lib/block_scout_web/views/address_view.ex:357 +#: lib/block_scout_web/views/transaction_view.ex:515 msgid "Logs" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:54 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:127 +msgid "ME" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:52 msgid "Main Networks" msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:53 -#: lib/block_scout_web/templates/layout/app.html.eex:50 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:85 -#: lib/block_scout_web/views/address_view.ex:147 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:22 +msgid "Mainnet" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:61 +#: lib/block_scout_web/templates/layout/app.html.eex:49 lib/block_scout_web/templates/tokens/overview/_details.html.eex:98 +#: lib/block_scout_web/views/address_view.ex:142 msgid "Market Cap" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:84 -#, elixir-autogen, elixir-format -msgid "Market cap" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:42 +msgid "Max Amount to Move:" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:408 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:380 msgid "Max Fee per Gas" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:418 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:390 msgid "Max Priority Fee per Gas" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:327 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:321 msgid "Max of" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:398 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:370 msgid "Maximum gas amount approved for the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:407 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:379 msgid "Maximum total amount per unit of gas a user is willing to pay for a transaction, including base fee and priority fee." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/metadata/index.html.eex:18 -#: lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:10 -#: lib/block_scout_web/views/tokens/instance/overview_view.ex:115 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:10 lib/block_scout_web/views/tokens/instance/overview_view.ex:187 msgid "Metadata" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:5 -#, elixir-autogen, elixir-format msgid "Method Id" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_tile.html.eex:41 -#: lib/block_scout_web/templates/block/overview.html.eex:98 -#: lib/block_scout_web/templates/chain/_block.html.eex:16 -#: lib/block_scout_web/templates/transaction_state/_state_change.html.eex:22 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:98 lib/block_scout_web/templates/chain/_block.html.eex:16 msgid "Miner" msgstr "" -#: lib/block_scout_web/views/block_view.ex:63 -#: lib/block_scout_web/views/block_view.ex:68 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/block_view.ex:61 +#: lib/block_scout_web/views/block_view.ex:66 msgid "Miner Reward" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_minimal_proxy_pattern.html.eex:3 -#, elixir-autogen, elixir-format msgid "Minimal Proxy Contract for" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:22 +msgid "Minimum Stake Allowed:" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:17 +msgid "Minimum Stake:" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:206 -#, elixir-autogen, elixir-format msgid "Minimum fee required per unit of gas. Fee adjusts based on network congestion." msgstr "" -#: lib/block_scout_web/templates/transaction/_actions.html.eex:92 -#, elixir-autogen, elixir-format -msgid "Mint of %{address} To %{to}" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:24 +msgid "Mining Address:" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:223 -#, elixir-autogen, elixir-format msgid "Model" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:58 -#, elixir-autogen, elixir-format msgid "Module" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:12 -#, elixir-autogen, elixir-format msgid "More internal transactions have come in" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_transaction/index.html.eex:46 -#: lib/block_scout_web/templates/chain/show.html.eex:217 -#: lib/block_scout_web/templates/pending_transaction/index.html.eex:13 +#: lib/block_scout_web/templates/chain/show.html.eex:228 lib/block_scout_web/templates/pending_transaction/index.html.eex:13 #: lib/block_scout_web/templates/transaction/index.html.eex:19 -#, elixir-autogen, elixir-format msgid "More transactions have come in" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:10 +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:57 +msgid "Move Stake" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:63 #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:74 -#, elixir-autogen, elixir-format msgid "Must be set to:" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:22 -#, elixir-autogen, elixir-format -msgid "Must match the name specified in the code. For example, in contract MyContract {..} MyContract is the contract name." -msgstr "" - -#: lib/block_scout_web/templates/tokens/_tile.html.eex:40 -#: lib/block_scout_web/templates/verified_contracts/_contract.html.eex:21 -#: lib/block_scout_web/templates/verified_contracts/_contract.html.eex:61 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_rows.html.eex:34 +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:186 msgid "N/A" msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:116 -#, elixir-autogen, elixir-format -msgid "N/A bytes" -msgstr "" - -#: lib/block_scout_web/templates/account/api_key/form.html.eex:19 -#: lib/block_scout_web/templates/account/api_key/index.html.eex:28 -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:13 -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:28 -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:18 -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:22 -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:18 -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:22 -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:22 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:19 -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_name.html.eex:4 +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:52 -#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:59 -#: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:4 +#: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:59 lib/block_scout_web/templates/log/_data_decoded_view.html.eex:4 #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:21 -#, elixir-autogen, elixir-format msgid "Name" msgstr "" -#: lib/block_scout_web/templates/account/api_key/form.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Name this API key" -msgstr "" - -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Name this Custom ABI" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:19 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Name this address" -msgstr "" - -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:19 -#, elixir-autogen, elixir-format -msgid "Name this transaction" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_token/overview.html.eex:44 -#, elixir-autogen, elixir-format msgid "Net Worth" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification/new.html.eex:5 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:5 +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:14 msgid "New Smart Contract Verification" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:9 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:7 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:14 msgid "New Solidity Smart Contract Verification" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:7 -#, elixir-autogen, elixir-format -msgid "New Solidity/Yul Smart Contract Verification" -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:7 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:9 msgid "New Vyper Smart Contract Verification" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:80 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:87 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:95 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:103 -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:111 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:82 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:89 lib/block_scout_web/templates/address_contract_verification/new.html.eex:97 +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:105 msgid "Next" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:6 +msgid "Next epoch in" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:9 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:9 -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_yul_contracts_switcher.html.eex:9 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:46 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:38 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:56 lib/block_scout_web/templates/stakes/_rows.html.eex:24 msgid "No" msgstr "" -#: lib/block_scout_web/templates/transaction_raw_trace/_card_body.html.eex:17 -#, elixir-autogen, elixir-format -msgid "No trace entries found." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_empty_content.html.eex:11 +msgid "No Information" msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:196 -#: lib/block_scout_web/templates/transaction/overview.html.eex:462 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:190 +#: lib/block_scout_web/templates/transaction/overview.html.eex:434 msgid "Nonce" msgstr "" -#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:11 -#, elixir-autogen, elixir-format -msgid "Not unique Token" -msgstr "" - -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:107 -#, elixir-autogen, elixir-format -msgid "Number of accounts holding the token" -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:274 -#, elixir-autogen, elixir-format -msgid "Number of blocks validated by this validator." -msgstr "" - -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:130 -#, elixir-autogen, elixir-format -msgid "Number of digits that come after the decimal place when displaying token value" -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:185 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:200 msgid "Number of transactions related to this address." msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:118 -#, elixir-autogen, elixir-format -msgid "Number of transfers for the token" -msgstr "" - -#: lib/block_scout_web/templates/address/overview.html.eex:212 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:227 msgid "Number of transfers to/from this address." msgstr "" -#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:40 -#: lib/block_scout_web/templates/transaction/_tile.html.eex:88 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/internal_transaction/_tile.html.eex:36 +#: lib/block_scout_web/templates/transaction/_tile.html.eex:76 msgid "OUT" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_rap_pagination_container.html.eex:13 -#, elixir-autogen, elixir-format msgid "Only the first" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:40 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:32 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:75 -#, elixir-autogen, elixir-format -msgid "Optimization" -msgstr "" - -#: lib/block_scout_web/templates/address_contract/index.html.eex:67 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:61 msgid "Optimization enabled" msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:76 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:62 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:54 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:70 +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:72 msgid "Optimization runs" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:78 -#, elixir-autogen, elixir-format -msgid "Other Explorers" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:62 +msgid "Order Withdrawal" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:35 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:48 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:61 -#, elixir-autogen, elixir-format -msgid "Outgoing" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:49 +#: lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:50 +msgid "Ordered" msgstr "" -#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Owner Address" +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:76 +msgid "Other Explorers" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:77 -#, elixir-autogen, elixir-format -msgid "POA solidity flattener or the" +#, elixir-format +#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:24 +msgid "Owner Address" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:19 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:26 -#, elixir-autogen, elixir-format msgid "POST" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:41 -#, elixir-autogen, elixir-format msgid "Page" msgstr "" -#: lib/block_scout_web/templates/page_not_found/index.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Page not found" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:33 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:40 -#, elixir-autogen, elixir-format msgid "Parameters" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:139 -#, elixir-autogen, elixir-format msgid "Parent Hash" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:63 -#: lib/block_scout_web/views/transaction_view.ex:370 -#: lib/block_scout_web/views/transaction_view.ex:409 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:55 +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:184 lib/block_scout_web/views/transaction_view.ex:350 +#: lib/block_scout_web/views/transaction_view.ex:388 msgid "Pending" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/pending_transaction/index.html.eex:5 -#, elixir-autogen, elixir-format msgid "Pending Transactions" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:45 +msgid "Place stake" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/address/_custom_view_df_title.html.eex:9 #: lib/block_scout_web/templates/address/_custom_view_df_title.html.eex:13 -#, elixir-autogen, elixir-format msgid "Play" msgstr "" -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:22 -#: lib/block_scout_web/templates/layout/app.html.eex:100 -#, elixir-autogen, elixir-format -msgid "Please confirm your email address to use the My Account feature." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:11 +msgid "Please, sign transaction and wait for its mining..." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_progress.html.eex:19 +#: lib/block_scout_web/templates/stakes/_table.html.eex:15 +msgid "Pool" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:9 +msgid "Pool description" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:68 -#, elixir-autogen, elixir-format -msgid "Please select notification methods:" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:8 +msgid "Pool name" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Please select what types of notifications you will receive:" +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:884 +msgid "Pools searching is already in progress for this address" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:464 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:436 msgid "Position" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:254 -#, elixir-autogen, elixir-format msgid "Position %{index}" msgstr "" -#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:18 -#, elixir-autogen, elixir-format -msgid "Potential matches from contract method database:" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:55 +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:57 +msgid "Potential Reward Share" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:18 #: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:32 -#, elixir-autogen, elixir-format msgid "Potential matches from our contract method database:" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/layout/_search.html.eex:27 -#, elixir-autogen, elixir-format msgid "Press / and focus will be moved to the search field" msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:42 -#: lib/block_scout_web/templates/layout/app.html.eex:51 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:96 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:41 +#: lib/block_scout_web/templates/layout/app.html.eex:50 lib/block_scout_web/templates/tokens/overview/_details.html.eex:109 msgid "Price" msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:95 -#, elixir-autogen, elixir-format -msgid "Price per token on the exchanges" -msgstr "" - -#: lib/block_scout_web/templates/transaction/overview.html.eex:378 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:350 msgid "Price per unit of gas specified by the sender. Higher gas prices can prioritize transaction inclusion during times of high usage." msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:225 -#: lib/block_scout_web/templates/transaction/overview.html.eex:428 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:219 +#: lib/block_scout_web/templates/transaction/overview.html.eex:400 msgid "Priority Fee / Tip" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_tile.html.eex:62 -#, elixir-autogen, elixir-format msgid "Priority Fees" msgstr "" -#: lib/block_scout_web/templates/account/common/_nav.html.eex:4 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Profile" -msgstr "" - -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Public Tags" -msgstr "" - -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Public tag" -msgstr "" - -#: lib/block_scout_web/templates/account/common/_nav.html.eex:22 -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Public tags" -msgstr "" - -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:50 -#, elixir-autogen, elixir-format -msgid "Public tags* (2 tags maximum, please use \";\" as a divider)" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/common_components/_btn_qr_code.html.eex:10 -#: lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:5 -#: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:83 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/common_components/_modal_qr_code.html.eex:5 lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:83 msgid "QR Code" msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:106 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:98 msgid "Query" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:115 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:133 msgid "RPC" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:473 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:445 msgid "Raw Input" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_tabs.html.eex:24 -#: lib/block_scout_web/templates/transaction_raw_trace/_card_body.html.eex:1 -#: lib/block_scout_web/views/transaction_view.ex:537 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction_raw_trace/index.html.eex:7 lib/block_scout_web/views/transaction_view.ex:516 msgid "Raw Trace" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:89 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:27 -#: lib/block_scout_web/views/address_view.ex:381 -#: lib/block_scout_web/views/tokens/overview_view.ex:42 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:81 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:27 lib/block_scout_web/views/address_view.ex:351 +#: lib/block_scout_web/views/tokens/overview_view.ex:43 msgid "Read Contract" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:96 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:41 -#: lib/block_scout_web/views/address_view.ex:382 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:88 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:41 lib/block_scout_web/views/address_view.ex:352 msgid "Read Proxy" msgstr "" -#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:13 -#, elixir-autogen, elixir-format -msgid "Records" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:32 +msgid "Reason for Ban: %{ban_reason}" msgstr "" -#: lib/block_scout_web/templates/account/api_key/row.html.eex:13 -#: lib/block_scout_web/templates/account/custom_abi/row.html.eex:13 -#, elixir-autogen, elixir-format -msgid "Remove" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:58 +msgid "Recalculate" msgstr "" -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:77 -#, elixir-autogen, elixir-format -msgid "Remove from Watch list" -msgstr "" - -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:155 -#, elixir-autogen, elixir-format -msgid "Request URL" -msgstr "" - -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Request a public tag/label" -msgstr "" - -#: lib/block_scout_web/templates/error422/index.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Request cannot be processed" +#, elixir-format +#: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:13 +msgid "Records" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:37 -#, elixir-autogen, elixir-format -msgid "Request to add public tag" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:58 +msgid "Refresh now" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Request to edit a public tag/label" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:12 +msgid "Remove My Pool" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:100 -#, elixir-autogen, elixir-format -msgid "Resend verification email" +#, elixir-format +#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:155 +msgid "Request URL" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:112 -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:38 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:104 -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:52 -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:48 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:228 +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:45 +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:57 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:82 msgid "Reset" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:173 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:134 -#, elixir-autogen, elixir-format msgid "Response Body" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:185 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:147 -#, elixir-autogen, elixir-format msgid "Responses" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:98 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:90 msgid "Result" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:138 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:127 msgid "Revert reason" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/_tile.html.eex:52 -#: lib/block_scout_web/templates/chain/_block.html.eex:27 -#: lib/block_scout_web/views/internal_transaction_view.ex:28 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/chain/_block.html.eex:27 lib/block_scout_web/views/internal_transaction_view.ex:28 msgid "Reward" msgstr "" -#: lib/block_scout_web/templates/admin/dashboard/index.html.eex:21 -#, elixir-autogen, elixir-format -msgid "Run" +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:925 +msgid "Reward calculating is already in progress for this address" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:61 +msgid "Reward distribution is based on stake amount. Validator receives at least %{min}% of the pool reward." msgstr "" -#: lib/block_scout_web/templates/account/api_key/form.html.eex:26 -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:31 -#: lib/block_scout_web/templates/account/tag_address/form.html.eex:25 -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:25 -#: lib/block_scout_web/templates/account/watchlist_address/form.html.eex:83 -#, elixir-autogen, elixir-format -msgid "Save" +#, elixir-format +#: lib/block_scout_web/templates/admin/dashboard/index.html.eex:21 +msgid "Run" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:206 -#, elixir-autogen, elixir-format -msgid "Scroll to see more" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:10 +msgid "Save changes" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/index.html.eex:16 #: lib/block_scout_web/templates/layout/_search.html.eex:34 -#, elixir-autogen, elixir-format msgid "Search" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/search/results.html.eex:17 -#, elixir-autogen, elixir-format msgid "Search Results" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/layout/_search.html.eex:3 -#, elixir-autogen, elixir-format msgid "Search by address, token symbol name, transaction hash, or block number" msgstr "" -#: lib/block_scout_web/templates/address_token_balance/_token_balances.html.eex:47 -#, elixir-autogen, elixir-format -msgid "Search tokens" +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:18 +msgid "Search network" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_yul_contracts_switcher.html.eex:19 -#, elixir-autogen, elixir-format -msgid "Select Yes if you want to verify Yul contract." +#, elixir-format +#: lib/block_scout_web/templates/address_token_balance/_token_balances.html.eex:47 +msgid "Search tokens" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:19 -#, elixir-autogen, elixir-format -msgid "Select yes if you want to show nightly builds." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward.html.eex:9 +msgid "Searching for pools you have ever staked into. Please, wait..." msgstr "" +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:27 -#, elixir-autogen, elixir-format msgid "Self-Destruct" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:63 -#, elixir-autogen, elixir-format -msgid "Send request" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:163 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:124 -#, elixir-autogen, elixir-format msgid "Server Response" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:65 +msgid "Share of Pool’s Reward" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:7 -#, elixir-autogen, elixir-format msgid "Show" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_btn_qr_code.html.eex:11 -#, elixir-autogen, elixir-format msgid "Show QR Code" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:47 +msgid "Show Validator Info" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_title.html.eex:22 +msgid "Show banned only" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_title.html.eex:28 +msgid "Show only those I have stake in" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/address_token/overview.html.eex:52 -#, elixir-autogen, elixir-format msgid "Shows the current" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_token/overview.html.eex:59 -#, elixir-autogen, elixir-format msgid "Shows the tokens held in the address (includes ERC-20, ERC-721 and ERC-1155)." msgstr "" -#: lib/block_scout_web/templates/address_token/overview.html.eex:66 -#, elixir-autogen, elixir-format -msgid "Shows the total CRC balance in the address." -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_token/overview.html.eex:45 -#, elixir-autogen, elixir-format msgid "Shows total assets held in the address" msgstr "" -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:33 -#, elixir-autogen, elixir-format -msgid "Sign in" +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:114 +msgid "Size" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:113 +msgid "Size of the block in bytes." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:30 +#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:50 lib/block_scout_web/templates/address_logs/index.html.eex:23 +#: lib/block_scout_web/templates/address_token/index.html.eex:60 lib/block_scout_web/templates/address_token_transfer/index.html.eex:58 +#: lib/block_scout_web/templates/address_transaction/index.html.eex:50 lib/block_scout_web/templates/address_validation/index.html.eex:20 +#: lib/block_scout_web/templates/block_transaction/index.html.eex:22 lib/block_scout_web/templates/chain/show.html.eex:169 +#: lib/block_scout_web/templates/pending_transaction/index.html.eex:18 lib/block_scout_web/templates/stakes/_table.html.eex:49 +#: lib/block_scout_web/templates/tokens/holder/index.html.eex:23 lib/block_scout_web/templates/tokens/instance/holder/index.html.eex:23 +#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:23 lib/block_scout_web/templates/tokens/inventory/index.html.eex:22 +#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:21 lib/block_scout_web/templates/transaction/index.html.eex:25 +#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:13 lib/block_scout_web/templates/transaction_log/index.html.eex:15 +#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:14 +msgid "Something went wrong, click to reload." msgstr "" -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Sign out" +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:234 +msgid "Something went wrong, click to retry." msgstr "" -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:11 -#, elixir-autogen, elixir-format -msgid "Signed in as " +#, elixir-format +#: lib/block_scout_web/templates/transaction/not_found.html.eex:7 +msgid "Sorry, We are unable to locate this transaction Hash" msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:114 -#, elixir-autogen, elixir-format -msgid "Size" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:7 +msgid "Source Pool" msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:113 -#, elixir-autogen, elixir-format -msgid "Size of the block in bytes." +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:19 +msgid "Sources and Metadata JSON" msgstr "" -#: lib/block_scout_web/templates/chain/gas_price_oracle_legend_item.html.eex:20 -#, elixir-autogen, elixir-format -msgid "Slow" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:7 +msgid "Stake" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:21 -#, elixir-autogen, elixir-format -msgid "Smart contract / Address" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:43 +msgid "Stake More" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/address_field.html.eex:4 -#: lib/block_scout_web/templates/account/public_tags_request/address_field.html.eex:5 -#, elixir-autogen, elixir-format -msgid "Smart contract / Address (0x...)" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:64 +msgid "Stake placed on a candidate pool or an active validator pool during the current staking epoch can be moved from one pool to another. Active stake cannot be moved. To re-delegate active stake: order a withdrawal, claim the amount on the next staking epoch, and stake the amount on a different pool." msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_contract.html.eex:28 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:26 -#: lib/block_scout_web/views/verified_contracts_view.ex:10 -#, elixir-autogen, elixir-format -msgid "Solidity" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:53 +msgid "Stake placed on a pool is pending for the current staking epoch. It will be applied to the next staking epoch. You may withdraw or move pending stake at any time until it becomes active. Once active (the pool you staked with becomes a validator), a withdrawal order can be placed. This amount will be available to claim after that staking epoch is complete." msgstr "" -#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:30 -#: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:50 -#: lib/block_scout_web/templates/address_logs/index.html.eex:23 -#: lib/block_scout_web/templates/address_token/index.html.eex:60 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:58 -#: lib/block_scout_web/templates/address_transaction/index.html.eex:50 -#: lib/block_scout_web/templates/address_validation/index.html.eex:20 -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:20 -#: lib/block_scout_web/templates/block_transaction/index.html.eex:14 -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:14 -#: lib/block_scout_web/templates/chain/show.html.eex:158 -#: lib/block_scout_web/templates/pending_transaction/index.html.eex:18 -#: lib/block_scout_web/templates/tokens/holder/index.html.eex:24 -#: lib/block_scout_web/templates/tokens/instance/holder/index.html.eex:23 -#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:23 -#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:23 -#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:22 -#: lib/block_scout_web/templates/transaction/index.html.eex:25 -#: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:13 -#: lib/block_scout_web/templates/transaction_log/index.html.eex:15 -#: lib/block_scout_web/templates/transaction_state/index.html.eex:13 -#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:14 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:51 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Something went wrong, click to reload." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:45 +#: lib/block_scout_web/templates/stakes/_stakes_stats_item_account.html.eex:46 +msgid "Staked" msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:223 -#, elixir-autogen, elixir-format -msgid "Something went wrong, click to retry." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:28 +msgid "Staked Amount" msgstr "" -#: lib/block_scout_web/templates/transaction/not_found.html.eex:6 -#, elixir-autogen, elixir-format -msgid "Sorry, we are unable to locate this transaction hash" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:26 +msgid "Staker's Address" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:63 -#, elixir-autogen, elixir-format -msgid "Sources *.sol files" +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:154 +msgid "Stakes" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:63 -#, elixir-autogen, elixir-format -msgid "Sources *.sol or *.yul files" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:59 +#: lib/block_scout_web/templates/stakes/_stakes_progress.html.eex:25 lib/block_scout_web/templates/stakes/_table.html.eex:34 +msgid "Stakes Ratio" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Sources and Metadata JSON" +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:160 +msgid "Staking" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:136 -#, elixir-autogen, elixir-format -msgid "Stakes" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:20 +msgid "Staking Address:" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:24 -#, elixir-autogen, elixir-format -msgid "Standard Input JSON" +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:928 +msgid "Staking epochs are not specified or not in the allowed range" msgstr "" -#: lib/block_scout_web/templates/transaction/_tabs.html.eex:29 -#: lib/block_scout_web/templates/transaction_state/index.html.eex:6 -#: lib/block_scout_web/views/transaction_view.ex:538 -#, elixir-autogen, elixir-format -msgid "State changes" +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:29 +msgid "Standard Input JSON" msgstr "" +#, elixir-format #: lib/block_scout_web/views/internal_transaction_view.ex:24 -#, elixir-autogen, elixir-format msgid "Static Call" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:110 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:102 msgid "Status" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:22 -#, elixir-autogen, elixir-format -msgid "Submission date" -msgstr "" - -#: lib/block_scout_web/templates/layout/_footer.html.eex:41 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:39 msgid "Submit an Issue" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_emission_reward_tile.html.eex:8 -#: lib/block_scout_web/views/transaction_view.ex:372 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:352 msgid "Success" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:38 +msgid "Swap STAKE on Honeyswap" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/transaction/_pending_tile.html.eex:21 -#: lib/block_scout_web/templates/transaction/_tile.html.eex:52 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction/_tile.html.eex:40 msgid "TX Fee" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:31 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:67 +msgid "Target Pool" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:30 msgid "Telegram" msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:67 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:65 msgid "Test Networks" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_library_first.html.eex:9 -#, elixir-autogen, elixir-format -msgid "The 0x library address. This can be found in the generated json file or Truffle output (if using truffle)." +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:23 +msgid "Testnet" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:34 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:26 -#, elixir-autogen, elixir-format -msgid "The EVM version the contract is written for. If the bytecode does not match the version, we try to verify using the latest EVM version." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:89 +msgid "The Number of Delegators in the Pool" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:122 -#, elixir-autogen, elixir-format msgid "The SHA256 hash of the block." msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:39 +msgid "The amount can be claimed after the current epoch finishes." +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:51 -#, elixir-autogen, elixir-format msgid "The block height of a particular block is defined as the number of blocks preceding it in the blockchain." msgstr "" -#: lib/block_scout_web/templates/transaction_state/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "The changes from this transaction have not yet happened since the transaction is still pending." +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:41 +msgid "The fallback function is executed on a call to the contract if none of the other functions match the given function signature, or if no data was supplied at all and there is no receive Ether function. The fallback function always receives data, but in order to also receive Ether it must be marked payable." msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:26 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:18 -#, elixir-autogen, elixir-format -msgid "The compiler version is specified in pragma solidity X.X.X. Use the compiler version rather than the nightly build. If using the Solidity compiler, run solc —version to check." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:23 +msgid "The first amount is the candidate’s own stake, the second is the total amount staked into the pool by the candidate and all delegators." msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:44 -#, elixir-autogen, elixir-format -msgid "The fallback function is executed on a call to the contract if none of the other functions match the given function signature, or if no data was supplied at all and there is no receive Ether function. The fallback function always receives data, but in order to also receive Ether it must be marked payable." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:25 +msgid "The first amount is the pool owner’s stake, the second is the total amount staked into the pool by the pool owner and all delegators." msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:21 +msgid "The first amount is the validator’s own stake, the second is the total amount staked into the pool by the validator and all delegators." +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:138 -#, elixir-autogen, elixir-format msgid "The hash of the block from which this block was generated." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:74 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:90 msgid "The name found in the source code of the Contract." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:85 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:101 msgid "The name of the validator." msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:43 +msgid "The number of delegators providing stake to the pool. Click on the number to see more details." +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:79 -#, elixir-autogen, elixir-format msgid "The number of transactions in the block." msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:46 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:34 +msgid "The percentage of stake in a single pool relative to the total amount staked in all active pools. A higher ratio results in a greater likelihood of validator pool selection." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:43 msgid "The receive function is executed on a call to the contract with empty calldata. This is the function that is executed on plain Ether transfers (e.g. via .send() or .transfer()). If no such function exists, but a payable fallback function exists, the fallback function will be called on a plain Ether transfer. If neither a receive Ether nor a payable fallback function is present, the contract cannot receive Ether through regular transactions and throws an exception." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:137 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:105 +msgid "The rest addresses are delegators of its pool." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:126 msgid "The revert reason of the transaction." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:109 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:34 +msgid "The staking epochs for which the reward could be claimed (read-only field):" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:101 msgid "The status of the transaction: Confirmed or Unconfirmed." msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:67 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:58 +msgid "The table refreshed block(s) ago." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:82 msgid "The total amount of tokens issued" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:177 -#, elixir-autogen, elixir-format msgid "The total gas amount used in the block and its percentage of gas filled in the block." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_validation/index.html.eex:16 -#, elixir-autogen, elixir-format msgid "There are no blocks validated by this address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/index.html.eex:17 -#, elixir-autogen, elixir-format msgid "There are no blocks." msgstr "" -#: lib/block_scout_web/templates/tokens/holder/index.html.eex:29 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/holder/index.html.eex:28 msgid "There are no holders for this Token." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:54 -#, elixir-autogen, elixir-format msgid "There are no internal transactions for this address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction_internal_transaction/index.html.eex:17 -#, elixir-autogen, elixir-format msgid "There are no internal transactions for this transaction." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/index.html.eex:28 -#, elixir-autogen, elixir-format msgid "There are no logs for this address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction_log/index.html.eex:20 -#, elixir-autogen, elixir-format msgid "There are no logs for this transaction." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/pending_transaction/index.html.eex:22 -#, elixir-autogen, elixir-format msgid "There are no pending transactions." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_token_transfer/index.html.eex:53 -#, elixir-autogen, elixir-format msgid "There are no token transfers for this address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:19 -#, elixir-autogen, elixir-format msgid "There are no token transfers for this transaction" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_token/index.html.eex:65 -#, elixir-autogen, elixir-format msgid "There are no tokens for this address." msgstr "" -#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:28 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/inventory/index.html.eex:27 msgid "There are no tokens." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_transaction/index.html.eex:55 -#, elixir-autogen, elixir-format msgid "There are no transactions for this address." msgstr "" -#: lib/block_scout_web/templates/block_transaction/index.html.eex:19 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/block_transaction/index.html.eex:27 msgid "There are no transactions for this block." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/index.html.eex:31 -#, elixir-autogen, elixir-format msgid "There are no transactions." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/holder/index.html.eex:28 -#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:28 -#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:27 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:28 lib/block_scout_web/templates/tokens/transfer/index.html.eex:26 msgid "There are no transfers for this Token." msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:99 -#, elixir-autogen, elixir-format -msgid "There are no verified contracts." -msgstr "" - -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:54 -#, elixir-autogen, elixir-format -msgid "There are no withdrawals for this address." -msgstr "" - -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:45 -#, elixir-autogen, elixir-format -msgid "There are no withdrawals for this block." -msgstr "" - -#: lib/block_scout_web/templates/withdrawal/index.html.eex:53 -#, elixir-autogen, elixir-format -msgid "There are no withdrawals." -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_coin_balance/index.html.eex:35 -#, elixir-autogen, elixir-format msgid "There is no coin history for this address." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_decompiled_contract/index.html.eex:29 -#, elixir-autogen, elixir-format -msgid "There is no decompiled contracts for this address." +msgid "There is no decompilded contracts for this address." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_empty_content.html.eex:12 +msgid "There is no information currently available for this view. Deselect filters or choose another pool view to see current info. To participate as a delegator, select a pool address and click the Stake icon. To become a candidate, click the button below." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_coin_balance/index.html.eex:21 #: lib/block_scout_web/templates/chain/show.html.eex:9 -#, elixir-autogen, elixir-format msgid "There was a problem loading the chart." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/index.html.eex:6 -#, elixir-autogen, elixir-format msgid "This API is provided for developers transitioning their applications from Etherscan to BlockScout. It supports GET and POST requests." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:7 -#, elixir-autogen, elixir-format msgid "This API is provided to support some rpc methods in the exact format specified for ethereum nodes, which can be found " msgstr "" +#, elixir-format #: lib/block_scout_web/views/block_transaction_view.ex:11 -#, elixir-autogen, elixir-format msgid "This block has not been processed yet." msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:47 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:41 msgid "This contract has been partially verified via Sourcify." msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:51 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:45 msgid "This contract has been verified via Sourcify." msgstr "" -#: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:10 -#, elixir-autogen, elixir-format -msgid "This is useful to allow sending requests to blockscout without having to change anything about the request." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:102 +msgid "This is a %{pool_type}." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_rows.html.eex:5 +msgid "This is a validator" msgstr "" -#: lib/block_scout_web/templates/page_not_found/index.html.eex:8 -#, elixir-autogen, elixir-format -msgid "This page is no longer explorable! If you are lost, use the search bar to find what you are looking for." +#, elixir-format +#: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:10 +msgid "This is useful to allow sending requests to blockscout without having to change anything about the request." msgstr "" -#: lib/block_scout_web/templates/transaction_state/index.html.eex:22 -#, elixir-autogen, elixir-format -msgid "This transaction hasn't changed state." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:31 +msgid "This pool is banned until block #%{banned_until} (%{estimated_unban_day})" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:64 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:58 msgid "This transaction is pending confirmation." msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:71 -#: lib/block_scout_web/templates/transaction/overview.html.eex:180 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:65 +#: lib/block_scout_web/templates/transaction/overview.html.eex:169 msgid "Timestamp" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_internal_transaction/index.html.eex:32 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:34 -#: lib/block_scout_web/templates/address_transaction/index.html.eex:28 -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:29 -#: lib/block_scout_web/templates/transaction/overview.html.eex:247 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:32 -#: lib/block_scout_web/views/address_internal_transaction_view.ex:9 -#: lib/block_scout_web/views/address_token_transfer_view.ex:9 -#: lib/block_scout_web/views/address_transaction_view.ex:9 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:34 lib/block_scout_web/templates/address_transaction/index.html.eex:28 +#: lib/block_scout_web/templates/transaction/overview.html.eex:215 lib/block_scout_web/views/address_internal_transaction_view.ex:9 +#: lib/block_scout_web/views/address_token_transfer_view.ex:9 lib/block_scout_web/views/address_transaction_view.ex:9 msgid "To" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:20 -#, elixir-autogen, elixir-format msgid "To have guaranteed accuracy, use the link above to verify the contract's source code." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:6 -#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:8 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:6 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:8 lib/block_scout_web/templates/transaction_log/_logs.html.eex:6 msgid "To see accurate decoded input data, the contract must be verified." msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:18 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:13 msgid "Toggle navigation" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:55 -#: lib/block_scout_web/templates/tokens/index.html.eex:31 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:71 msgid "Token" msgstr "" -#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:3 -#: lib/block_scout_web/views/transaction_view.ex:471 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:3 lib/block_scout_web/views/transaction_view.ex:450 msgid "Token Burning" msgstr "" -#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:7 -#: lib/block_scout_web/views/transaction_view.ex:472 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:7 lib/block_scout_web/views/transaction_view.ex:451 msgid "Token Creation" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:10 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:34 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:42 msgid "Token Details" msgstr "" -#: lib/block_scout_web/templates/tokens/holder/index.html.eex:17 -#: lib/block_scout_web/templates/tokens/instance/holder/index.html.eex:16 -#: lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:17 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:11 -#: lib/block_scout_web/views/tokens/overview_view.ex:41 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/holder/index.html.eex:16 +#: lib/block_scout_web/templates/tokens/instance/holder/index.html.eex:16 lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:17 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:11 lib/block_scout_web/views/tokens/overview_view.ex:42 msgid "Token Holders" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:38 -#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:18 -#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:37 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:18 lib/block_scout_web/templates/tokens/inventory/_token.html.eex:37 msgid "Token ID" msgstr "" -#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:5 -#: lib/block_scout_web/views/transaction_view.ex:470 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:5 lib/block_scout_web/views/transaction_view.ex:449 msgid "Token Minting" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:9 -#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:11 -#: lib/block_scout_web/views/transaction_view.ex:473 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/common_components/_token_transfer_type_display_name.html.eex:11 lib/block_scout_web/views/transaction_view.ex:452 msgid "Token Transfer" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_tabs.html.eex:13 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:19 -#: lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:3 -#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:16 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:5 -#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:15 -#: lib/block_scout_web/templates/transaction/_tabs.html.eex:4 -#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:7 -#: lib/block_scout_web/views/address_view.ex:378 -#: lib/block_scout_web/views/tokens/instance/overview_view.ex:114 -#: lib/block_scout_web/views/tokens/overview_view.ex:40 -#: lib/block_scout_web/views/transaction_view.ex:534 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:19 lib/block_scout_web/templates/tokens/instance/overview/_tabs.html.eex:3 +#: lib/block_scout_web/templates/tokens/instance/transfer/index.html.eex:16 lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:5 +#: lib/block_scout_web/templates/tokens/transfer/index.html.eex:14 lib/block_scout_web/templates/transaction/_tabs.html.eex:4 +#: lib/block_scout_web/templates/transaction_token_transfer/index.html.eex:7 lib/block_scout_web/views/address_view.ex:348 +#: lib/block_scout_web/views/tokens/instance/overview_view.ex:186 lib/block_scout_web/views/tokens/overview_view.ex:41 +#: lib/block_scout_web/views/transaction_view.ex:513 msgid "Token Transfers" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:54 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:70 msgid "Token name and symbol." msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:142 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:156 msgid "Token type" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_tabs.html.eex:21 -#: lib/block_scout_web/templates/address/overview.html.eex:175 -#: lib/block_scout_web/templates/address_token/overview.html.eex:58 -#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:13 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:84 -#: lib/block_scout_web/templates/tokens/index.html.eex:10 -#: lib/block_scout_web/views/address_view.ex:375 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:190 lib/block_scout_web/templates/address_token/overview.html.eex:58 +#: lib/block_scout_web/templates/address_token_transfer/index.html.eex:13 lib/block_scout_web/templates/layout/_topnav.html.eex:69 +#: lib/block_scout_web/templates/layout/_topnav.html.eex:101 lib/block_scout_web/templates/tokens/index.html.eex:10 +#: lib/block_scout_web/views/address_view.ex:345 msgid "Tokens" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:316 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:288 msgid "Tokens Burnt" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:332 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:304 msgid "Tokens Created" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:299 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:271 msgid "Tokens Minted" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:283 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:255 msgid "Tokens Transferred" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_metatags.html.eex:13 -#, elixir-autogen, elixir-format msgid "Top Accounts - %{subnetwork} Explorer" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/index.html.eex:14 -#, elixir-autogen, elixir-format msgid "Topic" msgstr "" -#: lib/block_scout_web/templates/address_logs/_logs.html.eex:68 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:91 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_logs/_logs.html.eex:71 +#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:90 msgid "Topics" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:9 -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:22 -#, elixir-autogen, elixir-format -msgid "Total" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:169 -#, elixir-autogen, elixir-format msgid "Total Difficulty" msgstr "" -#: lib/block_scout_web/templates/tokens/index.html.eex:43 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:97 msgid "Total Supply" msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:84 -#, elixir-autogen, elixir-format -msgid "Total Supply * Price" -msgstr "" - -#: lib/block_scout_web/templates/chain/show.html.eex:131 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:142 msgid "Total blocks" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:168 -#, elixir-autogen, elixir-format msgid "Total difficulty of the chain until this block." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:186 -#, elixir-autogen, elixir-format msgid "Total gas limit provided by all transactions in the block." msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:68 -#, elixir-autogen, elixir-format -msgid "Total supply" -msgstr "" - -#: lib/block_scout_web/templates/transaction/overview.html.eex:363 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:335 msgid "Total transaction fee." msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:110 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:132 msgid "Total transactions" msgstr "" -#: lib/block_scout_web/templates/account/tag_transaction/form.html.eex:11 -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:23 +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_top.html.eex:52 +msgid "Trade STAKE on AscendEX" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:19 -#: lib/block_scout_web/views/transaction_view.ex:483 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:462 msgid "Transaction" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_metatags.html.eex:3 -#, elixir-autogen, elixir-format msgid "Transaction %{transaction} - %{subnetwork} Explorer" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_metatags.html.eex:11 -#, elixir-autogen, elixir-format msgid "Transaction %{transaction}, %{subnetwork} %{transaction}" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:205 -#, elixir-autogen, elixir-format -msgid "Transaction Action" -msgstr "" - -#: lib/block_scout_web/templates/transaction/overview.html.eex:438 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:410 msgid "Transaction Burnt Fee" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:50 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:49 msgid "Transaction Details" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:364 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:336 msgid "Transaction Fee" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:80 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:74 msgid "Transaction Hash" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:2 #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:19 -#, elixir-autogen, elixir-format msgid "Transaction Inputs" msgstr "" -#: lib/block_scout_web/templates/account/common/_nav.html.eex:13 -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:7 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:17 -#, elixir-autogen, elixir-format -msgid "Transaction Tags" -msgstr "" - -#: lib/block_scout_web/templates/transaction/overview.html.eex:388 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:360 msgid "Transaction Type" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:461 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:433 msgid "Transaction number from the sending address. Each transaction sent from an address increments the nonce by 1." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:387 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:359 msgid "Transaction type, introduced in EIP-2718." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_tabs.html.eex:7 -#: lib/block_scout_web/templates/address/_tile.html.eex:31 -#: lib/block_scout_web/templates/address/overview.html.eex:186 -#: lib/block_scout_web/templates/address/overview.html.eex:192 -#: lib/block_scout_web/templates/address/overview.html.eex:200 -#: lib/block_scout_web/templates/address_transaction/index.html.eex:13 -#: lib/block_scout_web/templates/block/_tabs.html.eex:4 -#: lib/block_scout_web/templates/block/overview.html.eex:80 -#: lib/block_scout_web/templates/chain/show.html.eex:214 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:49 -#: lib/block_scout_web/views/address_view.ex:377 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:201 lib/block_scout_web/templates/address/overview.html.eex:207 +#: lib/block_scout_web/templates/address/overview.html.eex:215 lib/block_scout_web/templates/address_transaction/index.html.eex:13 +#: lib/block_scout_web/templates/block/overview.html.eex:74 lib/block_scout_web/templates/block_transaction/index.html.eex:10 +#: lib/block_scout_web/templates/chain/show.html.eex:225 lib/block_scout_web/templates/layout/_topnav.html.eex:43 +#: lib/block_scout_web/views/address_view.ex:347 msgid "Transactions" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:101 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:117 msgid "Transactions and address of creation." msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:213 -#: lib/block_scout_web/templates/address/overview.html.eex:219 -#: lib/block_scout_web/templates/address/overview.html.eex:227 +#, elixir-format +#: lib/block_scout_web/templates/address/_tile.html.eex:31 +msgid "Transactions sent" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:228 +#: lib/block_scout_web/templates/address/overview.html.eex:234 lib/block_scout_web/templates/address/overview.html.eex:242 #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:50 -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:119 -#, elixir-autogen, elixir-format msgid "Transfers" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:40 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:47 -#, elixir-autogen, elixir-format msgid "Try it out" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:3 -#, elixir-autogen, elixir-format -msgid "Try to fetch constructor arguments automatically" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/layout/_footer.html.eex:27 -#, elixir-autogen, elixir-format msgid "Twitter" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:53 -#, elixir-autogen, elixir-format -msgid "Tx/day" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:53 +msgid "Tx Gas Limit:" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:66 -#, elixir-autogen, elixir-format -msgid "Txns" +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:92 +#: lib/block_scout_web/templates/layout/app.html.eex:52 +msgid "Tx/day" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/log/_data_decoded_view.html.eex:5 #: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:22 -#, elixir-autogen, elixir-format msgid "Type" msgstr "" -#: lib/block_scout_web/templates/tokens/overview/_details.html.eex:141 -#, elixir-autogen, elixir-format -msgid "Type of the token standard" -msgstr "" - -#: lib/block_scout_web/templates/visualize_sol2uml/index.html.eex:5 -#, elixir-autogen, elixir-format -msgid "UML diagram" +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:459 +msgid "UTF-8" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:487 -#, elixir-autogen, elixir-format -msgid "UTF-8" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:69 +msgid "Unable to find any pools you could claim a reward from." msgstr "" -#: lib/block_scout_web/views/block_view.ex:77 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/block_view.ex:75 msgid "Uncle Reward" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:250 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:41 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:31 msgid "Uncles" msgstr "" -#: lib/block_scout_web/views/transaction_view.ex:363 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:343 msgid "Unconfirmed" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:9 -#, elixir-autogen, elixir-format msgid "Unique Token" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:79 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:73 msgid "Unique character string (TxID) assigned to every verified transaction." msgstr "" -#: lib/block_scout_web/templates/account/api_key/form.html.eex:7 -#: lib/block_scout_web/templates/account/custom_abi/form.html.eex:8 -#, elixir-autogen, elixir-format -msgid "Update" +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:891 +#: lib/block_scout_web/channels/stakes_channel.ex:938 +msgid "Unknown address of Staking contract. Please, contact support" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:931 +msgid "Unknown pool staking address. Please, contact support" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:417 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/channels/stakes_channel.ex:887 +#: lib/block_scout_web/channels/stakes_channel.ex:934 +msgid "Unknown staker address. Please, choose your account in MetaMask" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/layout/_network_selector.html.eex:12 +msgid "Use the search box to find a hosted network, or select from the list of available networks below." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:389 msgid "User defined maximum fee (tip) per unit of gas paid to validator for transaction prioritization." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:427 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:399 msgid "User-defined tip sent to validator for transaction priority/inclusion." msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:224 -#, elixir-autogen, elixir-format msgid "User-defined tips sent to validator for transaction priority/inclusion." msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:56 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_topnav.html.eex:47 msgid "Validated" -msgstr "" +msgstr "Mined" +#, elixir-format #: lib/block_scout_web/templates/transaction/index.html.eex:12 -#, elixir-autogen, elixir-format msgid "Validated Transactions" -msgstr "" +msgstr "Mined Transactions" +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:30 -#, elixir-autogen, elixir-format msgid "Validator Creation Date" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_validator_metadata_modal.html.eex:5 -#, elixir-autogen, elixir-format msgid "Validator Data" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:86 -#, elixir-autogen, elixir-format -msgid "Validator Name" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:51 +msgid "Validator Info" msgstr "" -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:32 -#: lib/block_scout_web/templates/block_withdrawal/index.html.eex:26 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:26 -#, elixir-autogen, elixir-format -msgid "Validator index" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:102 +msgid "Validator Name" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:349 -#, elixir-autogen, elixir-format -msgid "Value" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:8 +msgid "Validator Pool Addresses." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:348 -#, elixir-autogen, elixir-format -msgid "Value sent in the native token (and USD) if applicable." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_table.html.eex:32 +msgid "Validator pools can be banned for misbehavior (such as not revealing secret numbers). Validator and delegator stake contained in a banned pool cannot be withdrawn until the ban is over." msgstr "" -#: lib/block_scout_web/templates/address_read_contract/index.html.eex:17 -#: lib/block_scout_web/templates/address_write_contract/index.html.eex:15 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:81 -#, elixir-autogen, elixir-format -msgid "Verified" +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:321 +msgid "Value" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_stats.html.eex:18 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:6 -#, elixir-autogen, elixir-format -msgid "Verified Contracts" +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:320 +msgid "Value sent in the native token (and USD) if applicable." msgstr "" -#: lib/block_scout_web/templates/address_contract/index.html.eex:88 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:82 msgid "Verified at" msgstr "" -#: lib/block_scout_web/templates/layout/_topnav.html.eex:69 -#, elixir-autogen, elixir-format -msgid "Verified contracts" -msgstr "" - -#: lib/block_scout_web/templates/verified_contracts/_metatags.html.eex:2 -#, elixir-autogen, elixir-format -msgid "Verified contracts - %{subnetwork} Explorer" -msgstr "" - -#: lib/block_scout_web/templates/verified_contracts/_metatags.html.eex:7 -#, elixir-autogen, elixir-format -msgid "Verified contracts, %{subnetwork}, %{coin}" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:27 -#: lib/block_scout_web/templates/address_contract/index.html.eex:29 -#: lib/block_scout_web/templates/address_contract/index.html.eex:197 -#: lib/block_scout_web/templates/address_contract/index.html.eex:228 -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:14 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract/index.html.eex:29 lib/block_scout_web/templates/address_contract/index.html.eex:164 +#: lib/block_scout_web/templates/address_contract/index.html.eex:170 lib/block_scout_web/templates/address_contract/index.html.eex:201 +#: lib/block_scout_web/templates/address_contract/index.html.eex:207 lib/block_scout_web/templates/smart_contract/_functions.html.eex:14 msgid "Verify & Publish" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:111 -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:37 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:103 -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:51 -#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:47 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:227 +#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:44 +#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:56 +#: lib/block_scout_web/templates/address_contract_verification_vyper/new.html.eex:81 msgid "Verify & publish" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:10 -#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:12 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:10 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:12 lib/block_scout_web/templates/transaction_log/_logs.html.eex:10 msgid "Verify the contract " msgstr "" -#: lib/block_scout_web/templates/layout/_footer.html.eex:93 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:72 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/layout/_footer.html.eex:91 msgid "Version" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:33 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:42 msgid "Via Sourcify: Sources and metadata JSON file" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:27 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:36 msgid "Via Standard Input JSON" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:22 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:31 msgid "Via flattened source code" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:40 -#, elixir-autogen, elixir-format -msgid "Via multi-part files" -msgstr "" - -#: lib/block_scout_web/templates/chain/show.html.eex:153 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:164 msgid "View All Blocks" msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:213 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:224 msgid "View All Transactions" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:16 #: lib/block_scout_web/templates/tokens/instance/overview/_details.html.eex:20 -#, elixir-autogen, elixir-format msgid "View Contract" msgstr "" -#: lib/block_scout_web/templates/transaction/_tile.html.eex:73 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/_tile.html.eex:61 msgid "View Less Transfers" msgstr "" -#: lib/block_scout_web/templates/transaction/_tile.html.eex:72 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/transaction/_tile.html.eex:60 msgid "View More Transfers" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:39 -#, elixir-autogen, elixir-format msgid "View next block" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/block/overview.html.eex:23 -#, elixir-autogen, elixir-format msgid "View previous block" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address/_metatags.html.eex:9 -#, elixir-autogen, elixir-format msgid "View the account balance, transactions, and other data for %{address} on the %{network}" msgstr "" -#: lib/block_scout_web/templates/withdrawal/_metatags.html.eex:8 -#, elixir-autogen, elixir-format -msgid "View the beacon chain withdrawals on %{subnetwork}" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/block/_metatags.html.eex:10 -#, elixir-autogen, elixir-format msgid "View the transactions, token transfers, and uncles for block number %{block_number}" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_metatags.html.eex:8 -#, elixir-autogen, elixir-format -msgid "View the verified contracts on %{subnetwork}" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/transaction/_metatags.html.eex:10 -#, elixir-autogen, elixir-format msgid "View transaction %{transaction} on %{subnetwork}" msgstr "" -#: lib/block_scout_web/templates/verified_contracts/_contract.html.eex:28 -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:32 -#: lib/block_scout_web/views/verified_contracts_view.ex:11 -#, elixir-autogen, elixir-format -msgid "Vyper" -msgstr "" - -#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:46 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address_contract_verification/new.html.eex:48 msgid "Vyper contract" msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:142 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:132 msgid "WEI" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/smart_contract/_pending_contract_write.html.eex:9 -#, elixir-autogen, elixir-format msgid "Waiting for transaction's confirmation..." msgstr "" -#: lib/block_scout_web/templates/chain/show.html.eex:139 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/chain/show.html.eex:150 msgid "Wallet addresses" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_changed_bytecode_warning.html.eex:3 -#, elixir-autogen, elixir-format msgid "Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky." msgstr "" -#: lib/block_scout_web/templates/account/common/_nav.html.eex:7 -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:7 -#: lib/block_scout_web/templates/layout/_account_menu_item.html.eex:15 -#, elixir-autogen, elixir-format -msgid "Watch list" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:2 +msgid "We found the following pools you can claim reward from:" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:77 -#, elixir-autogen, elixir-format -msgid "We recommend using flattened code. This is necessary if your code utilizes a library or inherits dependencies. Use the" +#, elixir-format +#: lib/block_scout_web/views/wei_helpers.ex:76 +msgid "Wei" msgstr "" -#: lib/block_scout_web/views/wei_helper.ex:80 -#, elixir-autogen, elixir-format -msgid "Wei" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:7 +msgid "Withdraw" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:70 +msgid "Withdraw Now" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_rows.html.eex:52 +msgid "Withdraw after block #%{banned_delegators_until} (%{estimated_unban_day})" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_withdrawal.html.eex:22 +msgid "Withdrawal orders made during an active staking epoch are available to claim after the epoch is complete." msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:29 -#: lib/block_scout_web/templates/address_withdrawal/index.html.eex:13 -#: lib/block_scout_web/templates/block/_tabs.html.eex:13 -#: lib/block_scout_web/templates/layout/_topnav.html.eex:73 -#: lib/block_scout_web/templates/withdrawal/index.html.eex:5 -#, elixir-autogen, elixir-format -msgid "Withdrawals" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:35 +msgid "Working Stake Amount" msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:106 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:98 msgid "Write" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:103 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:34 -#: lib/block_scout_web/views/address_view.ex:383 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:95 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:34 lib/block_scout_web/views/address_view.ex:353 msgid "Write Contract" msgstr "" -#: lib/block_scout_web/templates/address/_tabs.html.eex:110 -#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:48 -#: lib/block_scout_web/views/address_view.ex:384 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/address/_tabs.html.eex:102 +#: lib/block_scout_web/templates/tokens/overview/_tabs.html.eex:48 lib/block_scout_web/views/address_view.ex:354 msgid "Write Proxy" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_contract_verification_common_fields/_fetch_constructor_args.html.eex:14 #: lib/block_scout_web/templates/address_contract_verification_common_fields/_include_nightly_builds_field.html.eex:14 -#: lib/block_scout_web/templates/address_contract_verification_common_fields/_yul_contracts_switcher.html.eex:14 -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:51 -#: lib/block_scout_web/templates/address_contract_verification_via_multi_part_files/new.html.eex:43 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:61 lib/block_scout_web/templates/stakes/_rows.html.eex:24 msgid "Yes" msgstr "" -#: lib/block_scout_web/templates/account/api_key/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "You can create 3 API keys per account." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:34 +msgid "You Can Order:" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_move.html.eex:15 +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:12 +msgid "You Staked:" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward.html.eex:11 +msgid "You can get your reward for all staking epochs during which the pool was a validator or specify separate epochs if Tx Gas Limit is too high. Tx Gas Limit depends on how long the pool was a validator and how many staking epochs you held your stake in the pool without movement." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_withdraw.html.eex:52 +msgid "You can withdraw this amount right now." msgstr "" -#: lib/block_scout_web/templates/account/custom_abi/index.html.eex:18 -#, elixir-autogen, elixir-format -msgid "You can create up to 15 Custom ABIs per account." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_pool_info.html.eex:38 +msgid "You will be able to withdraw after block #%{banned_delegators_until} (%{estimated_unban_day})" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/index.html.eex:11 -#, elixir-autogen, elixir-format -msgid "You can request a public category tag which is displayed to all Blockscout users. Public tags may be added to contract or external addresses, and any associated transactions will inherit that tag. Clicking a tag opens a page with related information and helps provide context and data organization. Requests are sent to a moderator for review and approval. This process can take several days." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:48 +msgid "You will receive:" msgstr "" -#: lib/block_scout_web/templates/account/tag_address/index.html.eex:14 -#, elixir-autogen, elixir-format -msgid "You don't have address tags yet" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:22 lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:28 +msgid "Your Balance:" msgstr "" -#: lib/block_scout_web/templates/account/watchlist/show.html.eex:14 -#, elixir-autogen, elixir-format -msgid "You don't have addresses on you watchlist yet" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_stake.html.eex:16 +msgid "Your Current Stake:" msgstr "" -#: lib/block_scout_web/templates/account/tag_transaction/index.html.eex:14 -#, elixir-autogen, elixir-format -msgid "You don't have transaction tags yet" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:12 +msgid "Your Mining Address" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:15 -#, elixir-autogen, elixir-format -msgid "Your name" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:14 +msgid "Your Pool Name" msgstr "" -#: lib/block_scout_web/templates/account/public_tags_request/form.html.eex:14 -#, elixir-autogen, elixir-format -msgid "Your name*" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_become_candidate.html.eex:16 +msgid "Your Pool Short Description (optional)" msgstr "" -#: lib/block_scout_web/templates/error422/index.html.eex:8 -#, elixir-autogen, elixir-format -msgid "Your request contained an error, perhaps a mistyped tx/block/address hash. Try again, and check the developer tools console for more info." +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_withdrawal.html.eex:11 +msgid "Your ordered amount" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:111 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:41 +msgid "all epochs" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:127 msgid "at" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_token/overview.html.eex:52 -#, elixir-autogen, elixir-format msgid "balance of the address" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:409 +msgid "burned for this transaction. Equals Block Base Fee per Gas * Gas Used." +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:215 +msgid "burned from transactions included in the block (Base fee (per unit of gas) * Gas Used)." +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/address_contract/index.html.eex:27 -#, elixir-autogen, elixir-format msgid "button" msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:256 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:19 +msgid "candidate" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/overview.html.eex:226 msgid "created" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:12 -#, elixir-autogen, elixir-format msgid "custom RPC" msgstr "" -#: lib/block_scout_web/templates/address/overview.html.eex:149 -#, elixir-autogen, elixir-format -msgid "doesn't include ERC20, ERC721, ERC1155 tokens)." -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/common_components/_rap_pagination_container.html.eex:13 -#, elixir-autogen, elixir-format msgid "elements are displayed" msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:44 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:41 msgid "fallback" msgstr "" -#: lib/block_scout_web/views/address_contract_view.ex:30 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/address_contract_view.ex:24 msgid "false" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/address_logs/_logs.html.eex:10 -#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:12 -#: lib/block_scout_web/templates/transaction_log/_logs.html.eex:10 -#, elixir-autogen, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input.html.eex:12 lib/block_scout_web/templates/transaction_log/_logs.html.eex:10 msgid "here" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/eth_rpc.html.eex:9 -#, elixir-autogen, elixir-format msgid "here." msgstr "" -#: lib/block_scout_web/templates/smart_contract/_function_response.html.eex:3 -#, elixir-autogen, elixir-format -msgid "method Response" +#, elixir-format +#: lib/block_scout_web/templates/transaction/invalid.html.eex:8 +msgid "is not a valid transaction hash" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/common_components/_pagination_container.html.eex:41 -#, elixir-autogen, elixir-format msgid "of" msgstr "" -#: lib/block_scout_web/templates/layout/app.html.eex:100 -#, elixir-autogen, elixir-format -msgid "on sign up. Didn’t receive?" -msgstr "" - +#, elixir-format #: lib/block_scout_web/templates/smart_contract/_functions.html.eex:16 -#, elixir-autogen, elixir-format msgid "page" msgstr "" -#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:46 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:20 +msgid "pool owner" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_functions.html.eex:43 msgid "receive" msgstr "" +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:58 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:69 -#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:81 +#: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:69 lib/block_scout_web/templates/api_docs/_action_tile.html.eex:81 #: lib/block_scout_web/templates/api_docs/_eth_rpc_item.html.eex:70 -#, elixir-autogen, elixir-format msgid "required" msgstr "" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_claim_reward_content.html.eex:42 +msgid "specified epochs only" +msgstr "" + +#, elixir-format #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:59 #: lib/block_scout_web/templates/api_docs/_action_tile.html.eex:70 -#, elixir-autogen, elixir-format msgid "string" msgstr "" -#: lib/block_scout_web/views/address_contract_view.ex:29 -#, elixir-autogen, elixir-format +#, elixir-format +#: lib/block_scout_web/views/address_contract_view.ex:23 msgid "true" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_flattened_code/new.html.eex:77 -#, elixir-autogen, elixir-format -msgid "truffle flattener" +#, elixir-format +#: lib/block_scout_web/templates/stakes/_stakes_modal_delegators_list.html.eex:18 +msgid "validator" msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_standard_json_input/new.html.eex:9 -#, elixir-autogen, elixir-format, fuzzy -msgid "New Smart Contract Verification via Standard input JSON" +#, elixir-format +#: lib/block_scout_web/views/transaction_view.ex:216 +msgid "ERC-1155 " msgstr "" -#: lib/block_scout_web/templates/address_contract_verification_via_json/new.html.eex:5 -#, elixir-autogen, elixir-format, fuzzy -msgid "New Smart Contract Verification via metadata JSON" +#, elixir-format +#: lib/block_scout_web/templates/tokens/inventory/_token.html.eex:11 +msgid "Not unique Token" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/transaction/_decoded_input_body.html.eex:10 +msgid "Error" msgstr "" -#: lib/block_scout_web/templates/withdrawal/index.html.eex:11 -#, elixir-autogen, elixir-format, fuzzy -msgid "%{withdrawals_count} withdrawals processed and %{withdrawals_sum} withdrawn." +#, elixir-format +#: lib/block_scout_web/templates/address_token/overview.html.eex:65 +msgid "CRC Worth" +msgstr "" + +#, elixir-format +#: lib/block_scout_web/templates/address_token/overview.html.eex:66 +msgid "Shows the total CRC balance in the address." msgstr "" -#: lib/block_scout_web/templates/csv_export/index.html.eex:14 -#, elixir-autogen, elixir-format, fuzzy -msgid "Export" +#, elixir-format +#: lib/block_scout_web/templates/block/overview.html.eex:110 +msgid "N/A bytes" msgstr "" -#: lib/block_scout_web/templates/csv_export/index.html.eex:14 -#, elixir-autogen, elixir-format, fuzzy -msgid "for address" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:262 +msgid "Fetching gas used..." msgstr "" -#: lib/block_scout_web/templates/csv_export/index.html.eex:17 -#, elixir-autogen, elixir-format -msgid "to CSV file" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:209 +#: lib/block_scout_web/templates/address/overview.html.eex:217 +msgid "Fetching transactions..." msgstr "" -#: lib/block_scout_web/templates/verified_contracts/index.html.eex:38 -#: lib/block_scout_web/views/verified_contracts_view.ex:12 -#, elixir-autogen, elixir-format -msgid "Yul" +#, elixir-format +#: lib/block_scout_web/templates/address/overview.html.eex:236 +#: lib/block_scout_web/templates/address/overview.html.eex:244 +msgid "Fetching transfers..." msgstr "" -#: lib/block_scout_web/templates/transaction/overview.html.eex:437 -#, elixir-autogen, elixir-format, fuzzy -msgid "burnt for this transaction. Equals Block Base Fee per Gas * Gas Used." +#, elixir-format +#: lib/block_scout_web/templates/address_coin_balance/index.html.eex:18 +msgid "Loading chart..." msgstr "" -#: lib/block_scout_web/templates/block/overview.html.eex:215 -#, elixir-autogen, elixir-format, fuzzy -msgid "burnt from transactions included in the block (Base fee (per unit of gas) * Gas Used)." +#, elixir-format +#: lib/block_scout_web/templates/smart_contract/_function_response.html.eex:3 +msgid "method Response" msgstr "" diff --git a/apps/ethereum_jsonrpc/config/config.exs b/apps/ethereum_jsonrpc/config/config.exs index 503b7a3828ed..09dcd54c19ba 100644 --- a/apps/ethereum_jsonrpc/config/config.exs +++ b/apps/ethereum_jsonrpc/config/config.exs @@ -1,4 +1,4 @@ -import Config +use Mix.Config config :ethereum_jsonrpc, EthereumJSONRPC.RequestCoordinator, rolling_window_opts: [ @@ -6,8 +6,13 @@ config :ethereum_jsonrpc, EthereumJSONRPC.RequestCoordinator, duration: :timer.minutes(1), table: EthereumJSONRPC.RequestCoordinator.TimeoutCounter ], + wait_per_timeout: :timer.seconds(2), max_jitter: :timer.seconds(2) +config :ethereum_jsonrpc, + rpc_transport: if(System.get_env("ETHEREUM_JSONRPC_TRANSPORT", "http") == "http", do: :http, else: :ipc), + ipc_path: System.get_env("IPC_PATH") + # Add this configuration to add global RPC request throttling. # throttle_rate_limit: 250, # throttle_rolling_window_opts: [ @@ -31,4 +36,4 @@ config :logger, :ethereum_jsonrpc, # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. -import_config "#{config_env()}.exs" +import_config "#{Mix.env()}.exs" diff --git a/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc.ex b/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc.ex index cd155ed3d231..426542b84397 100644 --- a/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc.ex +++ b/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc.ex @@ -274,6 +274,12 @@ defmodule EthereumJSONRPC do range |> Enum.map(fn number -> %{number: number} end) |> fetch_blocks_by_params(&Block.ByNumber.request/1, json_rpc_named_arguments) + + # range_list = Enum.to_list(range) + + # if Enum.at(range_list, 0) != Enum.at(range_list, -1) do + # Logger.info(["### fetch_blocks_by_range fetched ", inspect(range), " ###"]) + # end end @doc """ diff --git a/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/erigon.ex b/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/erigon.ex index 8173a98df2a5..e2210e2ee862 100644 --- a/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/erigon.ex +++ b/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/erigon.ex @@ -1,18 +1,21 @@ # credo:disable-for-this-file defmodule EthereumJSONRPC.Erigon do @moduledoc """ - Ethereum JSONRPC methods that are only supported by Erigon. + Ethereum JSONRPC methods that are only supported by [Parity](https://wiki.parity.io/). """ - import EthereumJSONRPC, only: [id_to_params: 1, integer_to_quantity: 1, json_rpc: 2] + require Logger + import EthereumJSONRPC, only: [id_to_params: 1, integer_to_quantity: 1, json_rpc: 2, request: 1] - alias EthereumJSONRPC.Nethermind.Traces - alias EthereumJSONRPC.{FetchedBeneficiaries, PendingTransaction, TraceReplayBlockTransactions} + alias EthereumJSONRPC.Parity.{FetchedBeneficiaries, Traces} + alias EthereumJSONRPC.Transactions @behaviour EthereumJSONRPC.Variant @impl EthereumJSONRPC.Variant def fetch_beneficiaries(block_numbers, json_rpc_named_arguments) when is_list(block_numbers) and is_list(json_rpc_named_arguments) do + # Logger.info(["### Beneficiaries started. Range starts with ", inspect(Enum.at(block_numbers, 0)), " ###"]) + id_to_params = block_numbers |> block_numbers_to_params_list() @@ -22,24 +25,66 @@ defmodule EthereumJSONRPC.Erigon do id_to_params |> FetchedBeneficiaries.requests() |> json_rpc(json_rpc_named_arguments) do + # Logger.info(["### Beneficiaries FINISHED. Range starts with ", inspect(Enum.at(block_numbers, 0)), " ###"]) {:ok, FetchedBeneficiaries.from_responses(responses, id_to_params)} end end + @doc """ + Internal transaction fetching for individual transactions is no longer supported for Parity. + + To signal to the caller that fetching is not supported, `:ignore` is returned. + """ @impl EthereumJSONRPC.Variant def fetch_internal_transactions(_transactions_params, _json_rpc_named_arguments), do: :ignore @doc """ - Fetches the `t:Explorer.Chain.InternalTransaction.changeset/2` params from the Erigon trace URL. + Fetches the `t:Explorer.Chain.InternalTransaction.changeset/2` params from the Parity trace URL. """ @impl EthereumJSONRPC.Variant def fetch_block_internal_transactions(block_numbers, json_rpc_named_arguments) when is_list(block_numbers) do - TraceReplayBlockTransactions.fetch_block_internal_transactions(block_numbers, json_rpc_named_arguments, Traces) + id_to_params = id_to_params(block_numbers) + + with {:ok, responses} <- + id_to_params + |> trace_replay_block_transactions_requests() + |> json_rpc(json_rpc_named_arguments) do + trace_replay_block_transactions_responses_to_internal_transactions_params(responses, id_to_params) + end end @impl EthereumJSONRPC.Variant def fetch_first_trace(transactions_params, json_rpc_named_arguments) when is_list(transactions_params) do - TraceReplayBlockTransactions.fetch_first_trace(transactions_params, json_rpc_named_arguments, Traces) + id_to_params = id_to_params(transactions_params) + + trace_replay_transaction_response = + id_to_params + |> trace_replay_transaction_requests() + |> json_rpc(json_rpc_named_arguments) + + case trace_replay_transaction_response do + {:ok, responses} -> + case trace_replay_transaction_responses_to_first_trace_params(responses, id_to_params) do + {:ok, [first_trace]} -> + %{block_hash: block_hash} = + transactions_params + |> Enum.at(0) + + {:ok, + [%{first_trace: first_trace, block_hash: block_hash, json_rpc_named_arguments: json_rpc_named_arguments}]} + + {:error, error} -> + Logger.error(inspect(error)) + {:error, error} + end + + {:error, :econnrefused} -> + {:error, :econnrefused} + + {:error, [error]} -> + Logger.error(inspect(error)) + {:error, error} + end end @doc """ @@ -47,10 +92,227 @@ defmodule EthereumJSONRPC.Erigon do """ @impl EthereumJSONRPC.Variant def fetch_pending_transactions(json_rpc_named_arguments) do - PendingTransaction.fetch_pending_transactions_geth(json_rpc_named_arguments) + with {:ok, transaction_data} <- + %{id: 1, method: "txpool_content", params: []} |> request() |> json_rpc(json_rpc_named_arguments) do + transactions_params = + transaction_data["pending"] + |> Enum.flat_map(fn {_address, nonce_transactions_map} -> + nonce_transactions_map + |> Enum.map(fn {_nonce, transaction} -> + transaction + end) + end) + |> Transactions.to_elixir() + |> Transactions.elixir_to_params() + |> Enum.map(fn params -> + # txpool_content always returns transaction with 0x0000000000000000000000000000000000000000000000000000000000000000 value in block hash and index is null. + # https://github.com/ethereum/go-ethereum/issues/19897 + params + |> Map.merge(%{:block_hash => nil, :index => nil}) + end) + + {:ok, transactions_params} + end end defp block_numbers_to_params_list(block_numbers) when is_list(block_numbers) do Enum.map(block_numbers, &%{block_quantity: integer_to_quantity(&1)}) end + + defp trace_replay_block_transactions_responses_to_internal_transactions_params(responses, id_to_params) + when is_list(responses) and is_map(id_to_params) do + with {:ok, traces} <- trace_replay_block_transactions_responses_to_traces(responses, id_to_params) do + params = + traces + |> Traces.to_elixir() + |> Traces.elixir_to_params() + + {:ok, params} + end + end + + defp trace_replay_block_transactions_responses_to_traces(responses, id_to_params) + when is_list(responses) and is_map(id_to_params) do + responses + |> Enum.map(&trace_replay_block_transactions_response_to_traces(&1, id_to_params)) + |> Enum.reduce( + {:ok, []}, + fn + {:ok, traces}, {:ok, acc_traces_list} -> + {:ok, [traces | acc_traces_list]} + + {:ok, _}, {:error, _} = acc_error -> + acc_error + + {:error, reason}, {:ok, _} -> + {:error, [reason]} + + {:error, reason}, {:error, acc_reason} -> + {:error, [reason | acc_reason]} + end + ) + |> case do + {:ok, traces_list} -> + traces = + traces_list + |> Enum.reverse() + |> List.flatten() + + {:ok, traces} + + {:error, reverse_reasons} -> + reasons = Enum.reverse(reverse_reasons) + {:error, reasons} + end + end + + defp trace_replay_block_transactions_response_to_traces(%{id: id, result: results}, id_to_params) + when is_list(results) and is_map(id_to_params) do + block_number = Map.fetch!(id_to_params, id) + + annotated_traces = + results + |> Stream.with_index() + |> Enum.flat_map(fn {%{"trace" => traces, "transactionHash" => transaction_hash}, transaction_index} -> + traces + |> Stream.with_index() + |> Enum.map(fn {trace, index} -> + Map.merge(trace, %{ + "blockNumber" => block_number, + "transactionHash" => transaction_hash, + "transactionIndex" => transaction_index, + "index" => index + }) + end) + end) + + {:ok, annotated_traces} + end + + defp trace_replay_block_transactions_response_to_traces(%{id: id, error: error}, id_to_params) + when is_map(id_to_params) do + block_number = Map.fetch!(id_to_params, id) + + annotated_error = + Map.put(error, :data, %{ + "blockNumber" => block_number + }) + + {:error, annotated_error} + end + + defp trace_replay_block_transactions_requests(id_to_params) when is_map(id_to_params) do + Enum.map(id_to_params, fn {id, block_number} -> + trace_replay_block_transactions_request(%{id: id, block_number: block_number}) + end) + end + + defp trace_replay_block_transactions_request(%{id: id, block_number: block_number}) do + request(%{id: id, method: "trace_replayBlockTransactions", params: [integer_to_quantity(block_number), ["trace"]]}) + end + + def trace_replay_transaction_responses_to_first_trace_params(responses, id_to_params) + when is_list(responses) and is_map(id_to_params) do + with {:ok, traces} <- trace_replay_transaction_responses_to_first_trace(responses, id_to_params) do + params = + traces + |> Traces.to_elixir() + |> Traces.elixir_to_params() + + {:ok, params} + end + end + + defp trace_replay_transaction_responses_to_first_trace(responses, id_to_params) + when is_list(responses) and is_map(id_to_params) do + responses + |> Enum.map(&trace_replay_transaction_response_to_first_trace(&1, id_to_params)) + |> Enum.reduce( + {:ok, []}, + fn + {:ok, traces}, {:ok, acc_traces_list} -> + {:ok, [traces | acc_traces_list]} + + {:ok, _}, {:error, _} = acc_error -> + acc_error + + {:error, reason}, {:ok, _} -> + {:error, [reason]} + + {:error, reason}, {:error, acc_reason} -> + {:error, [reason | acc_reason]} + end + ) + |> case do + {:ok, traces_list} -> + traces = + traces_list + |> Enum.reverse() + |> List.flatten() + + {:ok, traces} + + {:error, reverse_reasons} -> + reasons = Enum.reverse(reverse_reasons) + {:error, reasons} + end + end + + defp trace_replay_transaction_response_to_first_trace(%{id: id, result: %{"trace" => traces}}, id_to_params) + when is_list(traces) and is_map(id_to_params) do + %{ + block_hash: block_hash, + block_number: block_number, + hash_data: transaction_hash, + transaction_index: transaction_index + } = Map.fetch!(id_to_params, id) + + first_trace = + traces + |> Stream.with_index() + |> Enum.map(fn {trace, index} -> + Map.merge(trace, %{ + "blockHash" => block_hash, + "blockNumber" => block_number, + "index" => index, + "transactionIndex" => transaction_index, + "transactionHash" => transaction_hash + }) + end) + |> Enum.filter(fn trace -> + Map.get(trace, "index") == 0 + end) + + {:ok, first_trace} + end + + defp trace_replay_transaction_response_to_first_trace(%{id: id, error: error}, id_to_params) + when is_map(id_to_params) do + %{ + block_hash: block_hash, + block_number: block_number, + hash_data: transaction_hash, + transaction_index: transaction_index + } = Map.fetch!(id_to_params, id) + + annotated_error = + Map.put(error, :data, %{ + "blockHash" => block_hash, + "blockNumber" => block_number, + "transactionIndex" => transaction_index, + "transactionHash" => transaction_hash + }) + + {:error, annotated_error} + end + + defp trace_replay_transaction_requests(id_to_params) when is_map(id_to_params) do + Enum.map(id_to_params, fn {id, %{hash_data: hash_data}} -> + trace_replay_transaction_request(%{id: id, hash_data: hash_data}) + end) + end + + defp trace_replay_transaction_request(%{id: id, hash_data: hash_data}) do + request(%{id: id, method: "trace_replayTransaction", params: [hash_data, ["trace"]]}) + end end diff --git a/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/nethermind/trace.ex b/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/nethermind/trace.ex index 047a4d6bbd8f..71a4918491c8 100644 --- a/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/nethermind/trace.ex +++ b/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/nethermind/trace.ex @@ -451,7 +451,7 @@ defmodule EthereumJSONRPC.Nethermind.Trace do # subtraces is an actual integer in JSON and not hex-encoded # traceAddress is a list of actual integers, not a list of hex-encoded defp entry_to_elixir({key, _} = entry) - when key in ~w(subtraces traceAddress transactionHash blockHash type output), + when key in ~w(subtraces traceAddress transactionHash blockHash type output transactionPosition), do: entry defp entry_to_elixir({"action" = key, action}) do diff --git a/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/transaction.ex b/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/transaction.ex index b7ba7412f520..395741229482 100644 --- a/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/transaction.ex +++ b/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/transaction.ex @@ -249,7 +249,6 @@ defmodule EthereumJSONRPC.Transaction do "blockNumber" => block_number, "from" => from_address_hash, "gas" => gas, - "gasPrice" => gas_price, "hash" => hash, "input" => input, "nonce" => nonce, @@ -269,7 +268,7 @@ defmodule EthereumJSONRPC.Transaction do block_number: block_number, from_address_hash: from_address_hash, gas: gas, - gas_price: gas_price, + gas_price: max_fee_per_gas, hash: hash, index: index, input: input, @@ -454,6 +453,55 @@ defmodule EthereumJSONRPC.Transaction do ]) end + def elixir_to_params( + %{ + "blockHash" => block_hash, + "blockNumber" => block_number, + "from" => from_address_hash, + "gas" => gas, + "gasPrice" => gas_price, + "hash" => hash, + "input" => input, + "nonce" => nonce, + "r" => r, + "s" => s, + "to" => to_address_hash, + "transactionIndex" => index, + "v" => v, + "value" => value, + "type" => type, + "maxPriorityFeePerGas" => max_priority_fee_per_gas, + "maxFeePerGas" => max_fee_per_gas + } = transaction + ) do + result = %{ + block_hash: block_hash, + block_number: block_number, + from_address_hash: from_address_hash, + gas: gas, + gas_price: gas_price, + hash: hash, + index: index, + input: input, + nonce: nonce, + r: r, + s: s, + to_address_hash: to_address_hash, + v: v, + value: value, + transaction_index: index, + type: type, + max_priority_fee_per_gas: max_priority_fee_per_gas, + max_fee_per_gas: max_fee_per_gas + } + + if transaction["creates"] do + Map.put(result, :created_contract_address_hash, transaction["creates"]) + else + result + end + end + def elixir_to_params( %{ "blockHash" => block_hash, @@ -533,6 +581,16 @@ defmodule EthereumJSONRPC.Transaction do end end + def elixir_to_params( + %{ + nil => _ + } = transaction + ) do + transaction + |> Map.delete(nil) + |> elixir_to_params() + end + @doc """ Extracts `t:EthereumJSONRPC.hash/0` from transaction `params` diff --git a/apps/explorer/config/config.exs b/apps/explorer/config/config.exs index 117ca2c0ab4a..eac0132626fa 100644 --- a/apps/explorer/config/config.exs +++ b/apps/explorer/config/config.exs @@ -1,45 +1,86 @@ # This file is responsible for configuring your application -# and its dependencies with the aid of the Config module. +# and its dependencies with the aid of the Mix.Config module. # # This configuration file is loaded before any dependency and # is restricted to this project. -import Config - -[__DIR__ | ~w(.. .. .. config config_helper.exs)] -|> Path.join() -|> Code.eval_file() +use Mix.Config # General application configuration config :explorer, - chain_type: ConfigHelper.chain_type(), - ecto_repos: ConfigHelper.repos(), - token_functions_reader_max_retries: 3, - # for not fully indexed blockchains - decode_not_a_contract_calls: ConfigHelper.parse_bool_env_var("DECODE_NOT_A_CONTRACT_CALLS") - -config :explorer, Explorer.ChainSpec.GenesisData, enabled: true - -config :explorer, Explorer.Chain.Cache.BlockNumber, enabled: true + ecto_repos: [Explorer.Repo], + coin: System.get_env("COIN") || "ETH", + coingecko_coin_id: System.get_env("COINGECKO_COIN_ID"), + token_functions_reader_max_retries: 1, + allowed_evm_versions: + System.get_env("ALLOWED_EVM_VERSIONS") || + "homestead,tangerineWhistle,spuriousDragon,byzantium,constantinople,petersburg,istanbul,default", + include_uncles_in_average_block_time: + if(System.get_env("UNCLES_IN_AVERAGE_BLOCK_TIME") == "true", do: true, else: false), + healthy_blocks_period: System.get_env("HEALTHY_BLOCKS_PERIOD") || :timer.minutes(5), + realtime_events_sender: + if(System.get_env("DISABLE_WEBAPP") != "true", + do: Explorer.Chain.Events.SimpleSender, + else: Explorer.Chain.Events.DBSender + ) + +config :explorer, Explorer.Counters.AverageBlockTime, + enabled: true, + period: :timer.minutes(10) + +config :explorer, Explorer.Chain.Events.Listener, + enabled: + if(System.get_env("DISABLE_WEBAPP") == nil && System.get_env("DISABLE_INDEXER") == nil, + do: false, + else: true + ) + +config :explorer, Explorer.ChainSpec.GenesisData, + enabled: true, + chain_spec_path: System.get_env("CHAIN_SPEC_PATH"), + emission_format: System.get_env("EMISSION_FORMAT", "DEFAULT"), + rewards_contract_address: System.get_env("REWARDS_CONTRACT", "0xeca443e8e1ab29971a45a9c57a6a9875701698a5") + +config :explorer, Explorer.Chain.Cache.BlockNumber, + enabled: true, + ttl_check_interval: if(System.get_env("DISABLE_INDEXER") == "true", do: :timer.seconds(1), else: false), + global_ttl: if(System.get_env("DISABLE_INDEXER") == "true", do: :timer.seconds(5)) + +address_sum_global_ttl = + "ADDRESS_SUM_CACHE_PERIOD" + |> System.get_env("") + |> Integer.parse() + |> case do + {integer, ""} -> :timer.seconds(integer) + _ -> :timer.minutes(60) + end config :explorer, Explorer.Chain.Cache.AddressSum, enabled: true, - ttl_check_interval: :timer.seconds(1) + ttl_check_interval: :timer.seconds(1), + global_ttl: address_sum_global_ttl config :explorer, Explorer.Chain.Cache.AddressSumMinusBurnt, enabled: true, - ttl_check_interval: :timer.seconds(1) + ttl_check_interval: :timer.seconds(1), + global_ttl: address_sum_global_ttl -update_interval_in_milliseconds = ConfigHelper.parse_time_env_var("CACHE_ADDRESS_WITH_BALANCES_UPDATE_INTERVAL", "30m") +balances_update_interval = + if System.get_env("ADDRESS_WITH_BALANCES_UPDATE_INTERVAL") do + case Integer.parse(System.get_env("ADDRESS_WITH_BALANCES_UPDATE_INTERVAL")) do + {integer, ""} -> integer + _ -> nil + end + end config :explorer, Explorer.Counters.AddressesWithBalanceCounter, enabled: false, enable_consolidation: true, - update_interval_in_milliseconds: update_interval_in_milliseconds + update_interval_in_seconds: balances_update_interval || 30 * 60 config :explorer, Explorer.Counters.AddressesCounter, enabled: true, enable_consolidation: true, - update_interval_in_milliseconds: update_interval_in_milliseconds + update_interval_in_seconds: balances_update_interval || 30 * 60 config :explorer, Explorer.Counters.AddressTransactionsGasUsageCounter, enabled: true, @@ -49,41 +90,9 @@ config :explorer, Explorer.Counters.AddressTokenUsdSum, enabled: true, enable_consolidation: true -update_interval_in_milliseconds_default = 30 * 60 * 1000 - -config :explorer, Explorer.Chain.Cache.ContractsCounter, - enabled: true, - enable_consolidation: true, - update_interval_in_milliseconds: update_interval_in_milliseconds_default - -config :explorer, Explorer.Chain.Cache.NewContractsCounter, - enabled: true, - enable_consolidation: true, - update_interval_in_milliseconds: update_interval_in_milliseconds_default - -config :explorer, Explorer.Chain.Cache.VerifiedContractsCounter, +config :explorer, Explorer.Chain.Cache.TokenExchangeRate, enabled: true, - enable_consolidation: true, - update_interval_in_milliseconds: update_interval_in_milliseconds_default - -config :explorer, Explorer.Chain.Cache.NewVerifiedContractsCounter, - enabled: true, - enable_consolidation: true, - update_interval_in_milliseconds: update_interval_in_milliseconds_default - -config :explorer, Explorer.Chain.Cache.WithdrawalsSum, - enabled: true, - enable_consolidation: true, - update_interval_in_milliseconds: update_interval_in_milliseconds_default - -config :explorer, Explorer.Chain.Cache.TransactionActionTokensData, enabled: true - -config :explorer, Explorer.Chain.Cache.TransactionActionUniswapPools, enabled: true - -config :explorer, Explorer.ExchangeRates, - cache_period: ConfigHelper.parse_time_env_var("CACHE_EXCHANGE_RATES_PERIOD", "10m") - -config :explorer, Explorer.ExchangeRates.TokenExchangeRates, enabled: true + enable_consolidation: true config :explorer, Explorer.Counters.TokenHoldersCounter, enabled: true, @@ -101,7 +110,7 @@ config :explorer, Explorer.Counters.AddressTokenTransfersCounter, enabled: true, enable_consolidation: true -config :explorer, Explorer.Counters.BlockBurntFeeCounter, +config :explorer, Explorer.Counters.BlockBurnedFeeCounter, enabled: true, enable_consolidation: true @@ -109,22 +118,52 @@ config :explorer, Explorer.Counters.BlockPriorityFeeCounter, enabled: true, enable_consolidation: true -config :explorer, Explorer.TokenInstanceOwnerAddressMigration.Supervisor, enabled: true - -config :explorer, Explorer.Migrator.TransactionsDenormalization, enabled: true -config :explorer, Explorer.Migrator.AddressCurrentTokenBalanceTokenType, enabled: true -config :explorer, Explorer.Migrator.AddressTokenBalanceTokenType, enabled: true +bridge_market_cap_update_interval = + if System.get_env("BRIDGE_MARKET_CAP_UPDATE_INTERVAL") do + case Integer.parse(System.get_env("BRIDGE_MARKET_CAP_UPDATE_INTERVAL")) do + {integer, ""} -> integer + _ -> nil + end + end -config :explorer, Explorer.Chain.Fetcher.CheckBytecodeMatchingOnDemand, enabled: true +config :explorer, Explorer.Counters.Bridge, + enabled: if(System.get_env("SUPPLY_MODULE") === "TokenBridge", do: true, else: false), + enable_consolidation: System.get_env("DISABLE_BRIDGE_MARKET_CAP_UPDATER") !== "true", + update_interval_in_seconds: bridge_market_cap_update_interval || 30 * 60, + disable_lp_tokens_in_market_cap: System.get_env("DISABLE_LP_TOKENS_IN_MARKET_CAP") == "true" -config :explorer, Explorer.Chain.Fetcher.FetchValidatorInfoOnDemand, enabled: true +config :explorer, Explorer.ExchangeRates, enabled: System.get_env("DISABLE_EXCHANGE_RATES") != "true", store: :ets -config :explorer, Explorer.Chain.Cache.GasUsage, - enabled: ConfigHelper.parse_bool_env_var("CACHE_TOTAL_GAS_USAGE_COUNTER_ENABLED") +config :explorer, Explorer.KnownTokens, enabled: System.get_env("DISABLE_KNOWN_TOKENS") != "true", store: :ets config :explorer, Explorer.Integrations.EctoLogger, query_time_ms_threshold: :timer.seconds(2) -config :explorer, Explorer.Tags.AddressTag.Cataloger, enabled: true +config :explorer, Explorer.Market.History.Cataloger, enabled: System.get_env("DISABLE_INDEXER") != "true" + +txs_stats_init_lag = + System.get_env("TXS_HISTORIAN_INIT_LAG", "0") + |> Integer.parse() + |> elem(0) + |> :timer.minutes() + +txs_stats_days_to_compile_at_init = + System.get_env("TXS_STATS_DAYS_TO_COMPILE_AT_INIT", "40") + |> Integer.parse() + |> elem(0) + +config :explorer, Explorer.Chain.Transaction.History.Historian, + enabled: System.get_env("ENABLE_TXS_STATS", "false") != "false", + init_lag: txs_stats_init_lag, + days_to_compile_at_init: txs_stats_days_to_compile_at_init + +history_fetch_interval = + case Integer.parse(System.get_env("HISTORY_FETCH_INTERVAL", "")) do + {mins, ""} -> mins + _ -> 60 + end + |> :timer.minutes() + +config :explorer, Explorer.History.Process, history_fetch_interval: history_fetch_interval config :explorer, Explorer.Repo, migration_timestamps: [type: :utc_datetime_usec] @@ -133,12 +172,48 @@ config :explorer, Explorer.Tracer, adapter: SpandexDatadog.Adapter, trace_key: :blockscout -config :explorer, - solc_bin_api_url: "https://solc-bin.ethereum.org" - -config :explorer, :http_adapter, HTTPoison +if System.get_env("METADATA_CONTRACT") && System.get_env("VALIDATORS_CONTRACT") do + config :explorer, Explorer.Validator.MetadataRetriever, + metadata_contract_address: System.get_env("METADATA_CONTRACT"), + validators_contract_address: System.get_env("VALIDATORS_CONTRACT") + + config :explorer, Explorer.Validator.MetadataProcessor, enabled: System.get_env("DISABLE_INDEXER") != "true" +else + config :explorer, Explorer.Validator.MetadataProcessor, enabled: false +end + +config :explorer, Explorer.Chain.Block.Reward, + validators_contract_address: System.get_env("VALIDATORS_CONTRACT"), + keys_manager_contract_address: System.get_env("KEYS_MANAGER_CONTRACT") + +if System.get_env("POS_STAKING_CONTRACT") do + config :explorer, Explorer.Staking.ContractState, + enabled: true, + staking_contract_address: System.get_env("POS_STAKING_CONTRACT"), + eth_subscribe_max_delay: System.get_env("POS_ETH_SUBSCRIBE_MAX_DELAY", "60"), + eth_blocknumber_pull_interval: System.get_env("POS_ETH_BLOCKNUMBER_PULL_INTERVAL", "500") +else + config :explorer, Explorer.Staking.ContractState, enabled: false +end + +case System.get_env("SUPPLY_MODULE") do + "TokenBridge" -> + config :explorer, supply: Explorer.Chain.Supply.TokenBridge + + "rsk" -> + config :explorer, supply: Explorer.Chain.Supply.RSK + + _ -> + :ok +end + +if System.get_env("SOURCE_MODULE") == "TokenBridge" do + config :explorer, Explorer.ExchangeRates.Source, source: Explorer.ExchangeRates.Source.TokenBridge +end -config :explorer, Explorer.Chain.BridgedToken, enabled: ConfigHelper.parse_bool_env_var("BRIDGED_TOKENS_ENABLED") +config :explorer, + solc_bin_api_url: "https://solc-bin.ethereum.org", + checksum_function: System.get_env("CHECKSUM_FUNCTION") && String.to_atom(System.get_env("CHECKSUM_FUNCTION")) config :logger, :explorer, # keep synced with `config/config.exs` @@ -153,6 +228,26 @@ config :spandex_ecto, SpandexEcto.EctoLogger, tracer: Explorer.Tracer, otp_app: :explorer +config :explorer, Explorer.Chain.Cache.Transactions, + ttl_check_interval: if(System.get_env("DISABLE_INDEXER") == "true", do: :timer.seconds(1), else: false), + global_ttl: if(System.get_env("DISABLE_INDEXER") == "true", do: :timer.seconds(5)) + +config :explorer, Explorer.Chain.Cache.Accounts, + ttl_check_interval: if(System.get_env("DISABLE_INDEXER") == "true", do: :timer.seconds(1), else: false), + global_ttl: if(System.get_env("DISABLE_INDEXER") == "true", do: :timer.seconds(5)) + +config :explorer, Explorer.Chain.Cache.Uncles, + ttl_check_interval: if(System.get_env("DISABLE_INDEXER") == "true", do: :timer.seconds(1), else: false), + global_ttl: if(System.get_env("DISABLE_INDEXER") == "true", do: :timer.seconds(5)) + +config :explorer, Explorer.Chain.Cache.GasUsage, enabled: false + +config :explorer, Explorer.ThirdPartyIntegrations.Sourcify, + server_url: System.get_env("SOURCIFY_SERVER_URL") || "https://sourcify.dev/server", + enabled: System.get_env("ENABLE_SOURCIFY_INTEGRATION") == "true", + chain_id: System.get_env("CHAIN_ID"), + repo_url: System.get_env("SOURCIFY_REPO_URL") || "https://repo.sourcify.dev/contracts" + # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. -import_config "#{config_env()}.exs" +import_config "#{Mix.env()}.exs" diff --git a/apps/explorer/config/dev.exs b/apps/explorer/config/dev.exs index e83c505a1db2..377382765e8f 100644 --- a/apps/explorer/config/dev.exs +++ b/apps/explorer/config/dev.exs @@ -1,35 +1,32 @@ -import Config +use Mix.Config + +database = if System.get_env("DATABASE_URL"), do: nil, else: "explorer_dev" +hostname = if System.get_env("DATABASE_URL"), do: nil, else: "localhost" + +database_api_url = + if System.get_env("DATABASE_READ_ONLY_API_URL"), + do: System.get_env("DATABASE_READ_ONLY_API_URL"), + else: System.get_env("DATABASE_URL") # Configure your database config :explorer, Explorer.Repo, + database: database, + hostname: hostname, + url: System.get_env("DATABASE_URL"), + pool_size: String.to_integer(System.get_env("POOL_SIZE", "50")), timeout: :timer.seconds(80), - migration_lock: nil - -# Configure API database -config :explorer, Explorer.Repo.Replica1, timeout: :timer.seconds(80) - -# Configure Account database -config :explorer, Explorer.Repo.Account, timeout: :timer.seconds(80) - -# Configure Polygon Edge database -config :explorer, Explorer.Repo.PolygonEdge, timeout: :timer.seconds(80) - -# Configure Polygon zkEVM database -config :explorer, Explorer.Repo.PolygonZkevm, timeout: :timer.seconds(80) + queue_target: 2000 -# Configure ZkSync database -config :explorer, Explorer.Repo.ZkSync, timeout: :timer.seconds(80) +database_api = if System.get_env("DATABASE_READ_ONLY_API_URL"), do: nil, else: database +hostname_api = if System.get_env("DATABASE_READ_ONLY_API_URL"), do: nil, else: hostname -config :explorer, Explorer.Repo.RSK, timeout: :timer.seconds(80) - -config :explorer, Explorer.Repo.Shibarium, timeout: :timer.seconds(80) - -config :explorer, Explorer.Repo.Suave, timeout: :timer.seconds(80) - -# Configure Arbitrum database -config :explorer, Explorer.Repo.Arbitrum, timeout: :timer.seconds(80) - -config :explorer, Explorer.Repo.BridgedTokens, timeout: :timer.seconds(80) +# Configure API database +config :explorer, Explorer.Repo.Replica1, + database: database_api, + hostname: hostname_api, + url: database_api_url, + pool_size: String.to_integer(System.get_env("POOL_SIZE_API", "50")), + timeout: :timer.seconds(80) config :explorer, Explorer.Tracer, env: "dev", disabled?: true @@ -46,3 +43,17 @@ config :logger, :token_instances, level: :debug, path: Path.absname("logs/dev/explorer/tokens/token_instances.log"), metadata_filter: [fetcher: :token_instances] + +variant = + if is_nil(System.get_env("ETHEREUM_JSONRPC_VARIANT")) do + "parity" + else + System.get_env("ETHEREUM_JSONRPC_VARIANT") + |> String.split(".") + |> List.last() + |> String.downcase() + end + +# Import variant specific config. This must remain at the bottom +# of this file so it overrides the configuration defined above. +import_config "dev/#{variant}.exs" diff --git a/apps/explorer/config/dev/erigon.exs b/apps/explorer/config/dev/erigon.exs index 163f526996f6..197d976cdbb3 100644 --- a/apps/explorer/config/dev/erigon.exs +++ b/apps/explorer/config/dev/erigon.exs @@ -1,11 +1,4 @@ -import Config - -~w(config config_helper.exs) -|> Path.join() -|> Code.eval_file() - -hackney_opts = ConfigHelper.hackney_options() -timeout = ConfigHelper.timeout(1) +use Mix.Config config :explorer, json_rpc_named_arguments: [ @@ -13,14 +6,12 @@ config :explorer, transport_options: [ http: EthereumJSONRPC.HTTP.HTTPoison, url: System.get_env("ETHEREUM_JSONRPC_HTTP_URL") || "http://localhost:8545", - fallback_url: System.get_env("ETHEREUM_JSONRPC_FALLBACK_HTTP_URL"), - fallback_trace_url: System.get_env("ETHEREUM_JSONRPC_FALLBACK_TRACE_URL"), method_to_url: [ - eth_call: ConfigHelper.eth_call_url("http://localhost:8545"), + eth_call: 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" ], - http_options: [recv_timeout: timeout, timeout: timeout, hackney: hackney_opts] + http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] ], variant: EthereumJSONRPC.Erigon ], diff --git a/apps/explorer/config/prod.exs b/apps/explorer/config/prod.exs index 3ff639dfce9a..bf2036f9ba27 100644 --- a/apps/explorer/config/prod.exs +++ b/apps/explorer/config/prod.exs @@ -1,68 +1,56 @@ -import Config +use Mix.Config # Configures the database config :explorer, Explorer.Repo, + url: System.get_env("DATABASE_URL"), + pool_size: String.to_integer(System.get_env("POOL_SIZE", "50")), + ssl: String.equivalent?(System.get_env("ECTO_USE_SSL") || "true", "true"), prepare: :unnamed, timeout: :timer.seconds(60), - migration_lock: nil + queue_target: 2000 + +database_api_url = + if System.get_env("DATABASE_READ_ONLY_API_URL"), + do: System.get_env("DATABASE_READ_ONLY_API_URL"), + else: System.get_env("DATABASE_URL") # Configures API the database config :explorer, Explorer.Repo.Replica1, - prepare: :unnamed, - timeout: :timer.seconds(60) - -# Configures Account database -config :explorer, Explorer.Repo.Account, - prepare: :unnamed, - timeout: :timer.seconds(60) - -config :explorer, Explorer.Repo.PolygonEdge, - prepare: :unnamed, - timeout: :timer.seconds(60) - -config :explorer, Explorer.Repo.PolygonZkevm, - prepare: :unnamed, - timeout: :timer.seconds(60) - -config :explorer, Explorer.Repo.ZkSync, - prepare: :unnamed, - timeout: :timer.seconds(60) - -config :explorer, Explorer.Repo.RSK, - prepare: :unnamed, - timeout: :timer.seconds(60) - -config :explorer, Explorer.Repo.Shibarium, - prepare: :unnamed, - timeout: :timer.seconds(60) - -config :explorer, Explorer.Repo.Suave, - prepare: :unnamed, - timeout: :timer.seconds(60) - -config :explorer, Explorer.Repo.Arbitrum, - prepare: :unnamed, - timeout: :timer.seconds(60) - -config :explorer, Explorer.Repo.BridgedTokens, + url: database_api_url, + pool_size: String.to_integer(System.get_env("POOL_SIZE_API", "50")), + ssl: String.equivalent?(System.get_env("ECTO_USE_SSL") || "true", "true"), prepare: :unnamed, timeout: :timer.seconds(60) config :explorer, Explorer.Tracer, env: "production", disabled?: true config :logger, :explorer, - level: :info, + level: :debug, path: Path.absname("logs/prod/explorer.log"), - rotate: %{max_bytes: 52_428_800, keep: 5} + rotate: %{max_bytes: 52_428_800, keep: 19} config :logger, :reading_token_functions, level: :debug, path: Path.absname("logs/prod/explorer/tokens/reading_functions.log"), metadata_filter: [fetcher: :token_functions], - rotate: %{max_bytes: 52_428_800, keep: 5} + rotate: %{max_bytes: 52_428_800, keep: 19} config :logger, :token_instances, level: :debug, path: Path.absname("logs/prod/explorer/tokens/token_instances.log"), metadata_filter: [fetcher: :token_instances], - rotate: %{max_bytes: 52_428_800, keep: 5} + rotate: %{max_bytes: 52_428_800, keep: 19} + +variant = + if is_nil(System.get_env("ETHEREUM_JSONRPC_VARIANT")) do + "parity" + else + System.get_env("ETHEREUM_JSONRPC_VARIANT") + |> String.split(".") + |> List.last() + |> String.downcase() + end + +# Import variant specific config. This must remain at the bottom +# of this file so it overrides the configuration defined above. +import_config "prod/#{variant}.exs" diff --git a/apps/explorer/config/prod/erigon.exs b/apps/explorer/config/prod/erigon.exs index 1ca954c1ef41..f2f9a0f3b77f 100644 --- a/apps/explorer/config/prod/erigon.exs +++ b/apps/explorer/config/prod/erigon.exs @@ -1,11 +1,4 @@ -import Config - -~w(config config_helper.exs) -|> Path.join() -|> Code.eval_file() - -hackney_opts = ConfigHelper.hackney_options() -timeout = ConfigHelper.timeout(1) +use Mix.Config config :explorer, json_rpc_named_arguments: [ @@ -13,14 +6,12 @@ config :explorer, transport_options: [ http: EthereumJSONRPC.HTTP.HTTPoison, url: System.get_env("ETHEREUM_JSONRPC_HTTP_URL"), - fallback_url: System.get_env("ETHEREUM_JSONRPC_FALLBACK_HTTP_URL"), - fallback_trace_url: System.get_env("ETHEREUM_JSONRPC_FALLBACK_TRACE_URL"), method_to_url: [ - eth_call: ConfigHelper.eth_call_url(), + eth_call: 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") ], - http_options: [recv_timeout: timeout, timeout: timeout, hackney: hackney_opts] + http_options: [recv_timeout: :timer.minutes(1), timeout: :timer.minutes(1), hackney: [pool: :ethereum_jsonrpc]] ], variant: EthereumJSONRPC.Erigon ], diff --git a/apps/explorer/lib/explorer/application.ex b/apps/explorer/lib/explorer/application.ex index caa7e586dad6..c579fc5f2392 100644 --- a/apps/explorer/lib/explorer/application.ex +++ b/apps/explorer/lib/explorer/application.ex @@ -9,23 +9,16 @@ defmodule Explorer.Application do alias Explorer.Chain.Cache.{ Accounts, - AddressesTabsCounters, AddressSum, AddressSumMinusBurnt, - BackgroundMigrations, - Block, + BlockCount, BlockNumber, - Blocks, GasPriceOracle, - GasUsage, + # GasUsage, MinMissingBlockNumber, NetVersion, - OptimismFinalizationPeriod, - PendingBlockOperation, - StateChanges, - Transaction, + TransactionCount, Transactions, - TransactionsApiV2, Uncles } @@ -49,117 +42,63 @@ defmodule Explorer.Application do base_children = [ Explorer.Repo, Explorer.Repo.Replica1, - Explorer.Vault, Supervisor.child_spec({SpandexDatadog.ApiServer, datadog_opts()}, id: SpandexDatadog.ApiServer), Supervisor.child_spec({Task.Supervisor, name: Explorer.HistoryTaskSupervisor}, id: Explorer.HistoryTaskSupervisor), Supervisor.child_spec({Task.Supervisor, name: Explorer.MarketTaskSupervisor}, id: Explorer.MarketTaskSupervisor), Supervisor.child_spec({Task.Supervisor, name: Explorer.GenesisDataTaskSupervisor}, id: GenesisDataTaskSupervisor), Supervisor.child_spec({Task.Supervisor, name: Explorer.TaskSupervisor}, id: Explorer.TaskSupervisor), - Supervisor.child_spec({Task.Supervisor, name: Explorer.LookUpSmartContractSourcesTaskSupervisor}, - id: LookUpSmartContractSourcesTaskSupervisor - ), Explorer.SmartContract.SolcDownloader, Explorer.SmartContract.VyperDownloader, {Registry, keys: :duplicate, name: Registry.ChainEvents, id: Registry.ChainEvents}, {Admin.Recovery, [[], [name: Admin.Recovery]]}, - Accounts, + TransactionCount, AddressSum, AddressSumMinusBurnt, - BackgroundMigrations, - Block, - BlockNumber, - Blocks, + BlockCount, GasPriceOracle, - GasUsage, + # GasUsage, NetVersion, - OptimismFinalizationPeriod, - PendingBlockOperation, - Transaction, - StateChanges, - Transactions, - TransactionsApiV2, - Uncles, - AddressesTabsCounters, + BlockNumber, con_cache_child_spec(MarketHistoryCache.cache_name()), con_cache_child_spec(RSK.cache_name(), ttl_check_interval: :timer.minutes(1), global_ttl: :timer.minutes(30)), - {Redix, redix_opts()}, - {Explorer.Utility.MissingRangesManipulator, []} + Transactions, + Accounts, + Uncles, + MinMissingBlockNumber ] children = base_children ++ configurable_children() - opts = [strategy: :one_for_one, name: Explorer.Supervisor, max_restarts: 1_000] + opts = [strategy: :one_for_one, name: Explorer.Supervisor] Supervisor.start_link(children, opts) end defp configurable_children do - configurable_children_set = - [ - configure(Explorer.ExchangeRates), - configure(Explorer.ExchangeRates.TokenExchangeRates), - configure(Explorer.ChainSpec.GenesisData), - configure(Explorer.Market.History.Cataloger), - configure(Explorer.Chain.Cache.ContractsCounter), - configure(Explorer.Chain.Cache.NewContractsCounter), - configure(Explorer.Chain.Cache.VerifiedContractsCounter), - configure(Explorer.Chain.Cache.NewVerifiedContractsCounter), - configure(Explorer.Chain.Cache.TransactionActionTokensData), - configure(Explorer.Chain.Cache.TransactionActionUniswapPools), - configure(Explorer.Chain.Cache.WithdrawalsSum), - configure(Explorer.Chain.Transaction.History.Historian), - configure(Explorer.Chain.Events.Listener), - configure(Explorer.Counters.AddressesWithBalanceCounter), - configure(Explorer.Counters.AddressesCounter), - configure(Explorer.Counters.AddressTransactionsCounter), - configure(Explorer.Counters.AddressTokenTransfersCounter), - configure(Explorer.Counters.AddressTransactionsGasUsageCounter), - configure(Explorer.Counters.AddressTokenUsdSum), - configure(Explorer.Counters.TokenHoldersCounter), - configure(Explorer.Counters.TokenTransfersCounter), - configure(Explorer.Counters.BlockBurntFeeCounter), - configure(Explorer.Counters.BlockPriorityFeeCounter), - configure(Explorer.Counters.AverageBlockTime), - configure(Explorer.Validator.MetadataProcessor), - configure(Explorer.Tags.AddressTag.Cataloger), - configure(MinMissingBlockNumber), - configure(Explorer.Chain.Fetcher.CheckBytecodeMatchingOnDemand), - configure(Explorer.Chain.Fetcher.FetchValidatorInfoOnDemand), - configure(Explorer.TokenInstanceOwnerAddressMigration.Supervisor), - sc_microservice_configure(Explorer.Chain.Fetcher.LookUpSmartContractSourcesOnDemand), - configure(Explorer.Chain.Cache.RootstockLockedBTC), - configure(Explorer.Migrator.TransactionsDenormalization), - configure(Explorer.Migrator.AddressCurrentTokenBalanceTokenType), - configure(Explorer.Migrator.AddressTokenBalanceTokenType) - ] - |> List.flatten() - - repos_by_chain_type() ++ account_repo() ++ configurable_children_set - end - - defp repos_by_chain_type do - if Mix.env() == :test do - [ - Explorer.Repo.PolygonEdge, - Explorer.Repo.PolygonZkevm, - Explorer.Repo.ZkSync, - Explorer.Repo.RSK, - Explorer.Repo.Shibarium, - Explorer.Repo.Suave, - Explorer.Repo.Arbitrum, - Explorer.Repo.BridgedTokens - ] - else - [] - end - end - - defp account_repo do - if System.get_env("ACCOUNT_DATABASE_URL") || Mix.env() == :test do - [Explorer.Repo.Account] - else - [] - end + [ + configure(Explorer.ExchangeRates), + configure(Explorer.ChainSpec.GenesisData), + configure(Explorer.KnownTokens), + configure(Explorer.Market.History.Cataloger), + configure(Explorer.Chain.Cache.TokenExchangeRate), + configure(Explorer.Chain.Transaction.History.Historian), + configure(Explorer.Chain.Events.Listener), + configure(Explorer.Counters.AddressesWithBalanceCounter), + configure(Explorer.Counters.AddressesCounter), + configure(Explorer.Counters.AddressTransactionsCounter), + configure(Explorer.Counters.AddressTokenTransfersCounter), + configure(Explorer.Counters.AddressTransactionsGasUsageCounter), + configure(Explorer.Counters.AddressTokenUsdSum), + configure(Explorer.Counters.TokenHoldersCounter), + configure(Explorer.Counters.TokenTransfersCounter), + configure(Explorer.Counters.BlockBurnedFeeCounter), + configure(Explorer.Counters.BlockPriorityFeeCounter), + configure(Explorer.Counters.AverageBlockTime), + configure(Explorer.Counters.Bridge), + configure(Explorer.Validator.MetadataProcessor), + configure(Explorer.Staking.ContractState) + ] + |> List.flatten() end defp should_start?(process) do @@ -174,38 +113,12 @@ defmodule Explorer.Application do end end - defp sc_microservice_configure(process) do - if Application.get_env(:explorer, Explorer.SmartContract.RustVerifierInterfaceBehaviour)[:eth_bytecode_db?] do - process - else - [] - end - end - - defp datadog_port do - Application.get_env(:explorer, :datadog)[:port] - end - - defp spandex_batch_size do - Application.get_env(:explorer, :spandex)[:batch_size] - end - - defp spandex_sync_threshold do - Application.get_env(:explorer, :spandex)[:sync_threshold] - end - defp datadog_opts do - datadog_port = datadog_port() - - spandex_batch_size = spandex_batch_size() - - spandex_sync_threshold = spandex_sync_threshold() - [ host: System.get_env("DATADOG_HOST") || "localhost", - port: datadog_port, - batch_size: spandex_batch_size, - sync_threshold: spandex_sync_threshold, + port: System.get_env("DATADOG_PORT") || 8126, + batch_size: System.get_env("SPANDEX_BATCH_SIZE") || 100, + sync_threshold: System.get_env("SPANDEX_SYNC_THRESHOLD") || 100, http: HTTPoison ] end @@ -221,8 +134,4 @@ defmodule Explorer.Application do id: {ConCache, name} ) end - - defp redix_opts do - {System.get_env("ACCOUNT_REDIS_URL") || "redis://127.0.0.1:6379", [name: :redix]} - end end diff --git a/apps/explorer/lib/explorer/chain.ex b/apps/explorer/lib/explorer/chain.ex index a985998e5485..c155404a57da 100644 --- a/apps/explorer/lib/explorer/chain.ex +++ b/apps/explorer/lib/explorer/chain.ex @@ -5,8 +5,6 @@ defmodule Explorer.Chain do import Ecto.Query, only: [ - dynamic: 1, - dynamic: 2, from: 2, join: 4, join: 5, @@ -16,7 +14,6 @@ defmodule Explorer.Chain do order_by: 2, order_by: 3, preload: 2, - preload: 3, select: 2, select: 3, subquery: 1, @@ -25,19 +22,18 @@ defmodule Explorer.Chain do where: 3 ] - import EthereumJSONRPC, only: [integer_to_quantity: 1, fetch_block_internal_transactions: 2] + import EthereumJSONRPC, only: [integer_to_quantity: 1, json_rpc: 2, fetch_block_internal_transactions: 2] require Logger - alias ABI.TypeDecoder + alias ABI.{TypeDecoder, TypeEncoder} + alias Ecto.Adapters.SQL alias Ecto.{Changeset, Multi} + alias EthereumJSONRPC.Contract alias EthereumJSONRPC.Transaction, as: EthereumJSONRPCTransaction - alias EthereumJSONRPC.Utility.RangesHelper - alias Explorer.Account.WatchlistAddress - - alias Explorer.Counters.{LastFetchedCounter, TokenHoldersCounter, TokenTransfersCounter} + alias Explorer.Counters.LastFetchedCounter alias Explorer.Chain @@ -48,77 +44,66 @@ defmodule Explorer.Chain do Address.CurrentTokenBalance, Address.TokenBalance, Block, - CurrencyHelper, + BridgedToken, + CurrencyHelpers, Data, DecompiledSmartContract, - DenormalizationHelper, Hash, Import, InternalTransaction, Log, PendingBlockOperation, SmartContract, + SmartContractAdditionalSource, + StakingPool, + StakingPoolsDelegator, Token, Token.Instance, TokenTransfer, Transaction, - Wei, - Withdrawal + Wei } + alias Explorer.Chain.Block.{EmissionReward, Reward} + alias Explorer.Chain.Cache.{ + Accounts, + BlockCount, BlockNumber, - Blocks, - ContractsCounter, - NewContractsCounter, - NewVerifiedContractsCounter, + GasUsage, + TokenExchangeRate, + TransactionCount, Transactions, - Uncles, - VerifiedContractsCounter, - WithdrawalsSum + Uncles } - alias Explorer.Chain.Cache.Block, as: BlockCache - alias Explorer.Chain.Cache.PendingBlockOperation, as: PendingBlockOperationCache - alias Explorer.Chain.Fetcher.{CheckBytecodeMatchingOnDemand, LookUpSmartContractSourcesOnDemand} alias Explorer.Chain.Import.Runner alias Explorer.Chain.InternalTransaction.{CallType, Type} - alias Explorer.Chain.SmartContract.Proxy.EIP1167 - + alias Explorer.Counters.{AddressesCounter, AddressesWithBalanceCounter} alias Explorer.Market.MarketHistoryCache alias Explorer.{PagingOptions, Repo} + alias Explorer.SmartContract.Reader + alias Explorer.Staking.ContractState alias Dataloader.Ecto, as: DataloaderEcto @default_paging_options %PagingOptions{page_size: 50} - @token_transfers_per_transaction_preview 10 - @token_transfers_necessity_by_association %{ - [from_address: :smart_contract] => :optional, - [to_address: :smart_contract] => :optional, - [from_address: :names] => :optional, - [to_address: :names] => :optional, - token: :optional - } - - @method_name_to_id_map %{ - "approve" => "095ea7b3", - "transfer" => "a9059cbb", - "multicall" => "5ae401dc", - "mint" => "40c10f19", - "commit" => "f14fcbc8" - } + @max_incoming_transactions_count 10_000 @revert_msg_prefix_1 "Revert: " @revert_msg_prefix_2 "revert: " @revert_msg_prefix_3 "reverted " @revert_msg_prefix_4 "Reverted " - # Geth-like node - @revert_msg_prefix_5 "execution reverted: " # keccak256("Error(string)") @revert_error_method_id "08c379a0" - @limit_showing_transactions 10_000 + @burn_address_hash_str "0x0000000000000000000000000000000000000000" + + # seconds + @check_bytecode_interval 86_400 + + @limit_showing_transaсtions 10_000 @default_page_size 50 @typedoc """ @@ -159,10 +144,61 @@ defmodule Explorer.Chain do """ @type necessity_by_association :: %{association => necessity} - @type necessity_by_association_option :: {:necessity_by_association, necessity_by_association} - @type paging_options :: {:paging_options, PagingOptions.t()} + @typep necessity_by_association_option :: {:necessity_by_association, necessity_by_association} + @typep paging_options :: {:paging_options, PagingOptions.t()} @typep balance_by_day :: %{date: String.t(), value: Wei.t()} - @type api? :: {:api?, true | false} + + @doc """ + Gets from the cache the count of `t:Explorer.Chain.Address.t/0`'s where the `fetched_coin_balance` is > 0 + """ + @spec count_addresses_with_balance_from_cache :: non_neg_integer() + def count_addresses_with_balance_from_cache do + AddressesWithBalanceCounter.fetch() + end + + @doc """ + Estimated count of `t:Explorer.Chain.Address.t/0`. + + Estimated count of addresses. + """ + @spec address_estimated_count() :: non_neg_integer() + def address_estimated_count do + cached_value = AddressesCounter.fetch() + + if is_nil(cached_value) do + %Postgrex.Result{rows: [[count]]} = Repo.query!("SELECT reltuples FROM pg_class WHERE relname = 'addresses';") + + count + else + cached_value + end + end + + @doc """ + Counts the number of addresses with fetched coin balance > 0. + + This function should be used with caution. In larger databases, it may take a + while to have the return back. + """ + def count_addresses_with_balance do + Repo.one( + Address.count_with_fetched_coin_balance(), + timeout: :infinity + ) + end + + @doc """ + Counts the number of all addresses. + + This function should be used with caution. In larger databases, it may take a + while to have the return back. + """ + def count_addresses do + Repo.one( + Address.count(), + timeout: :infinity + ) + end @doc """ `t:Explorer.Chain.InternalTransaction/0`s from the address with the given `hash`. @@ -196,12 +232,12 @@ defmodule Explorer.Chain do paging_options = Keyword.get(options, :paging_options, @default_paging_options) - if direction == nil || direction == "" do + if direction == nil do query_to_address_hash_wrapped = InternalTransaction |> InternalTransaction.where_nonpending_block() |> InternalTransaction.where_address_fields_match(hash, :to_address_hash) - |> where_block_number_in_period(from_block, to_block) + |> InternalTransaction.where_block_number_in_period(from_block, to_block) |> common_where_limit_order(paging_options) |> wrapped_union_subquery() @@ -209,7 +245,7 @@ defmodule Explorer.Chain do InternalTransaction |> InternalTransaction.where_nonpending_block() |> InternalTransaction.where_address_fields_match(hash, :from_address_hash) - |> where_block_number_in_period(from_block, to_block) + |> InternalTransaction.where_block_number_in_period(from_block, to_block) |> common_where_limit_order(paging_options) |> wrapped_union_subquery() @@ -217,27 +253,35 @@ defmodule Explorer.Chain do InternalTransaction |> InternalTransaction.where_nonpending_block() |> InternalTransaction.where_address_fields_match(hash, :created_contract_address_hash) - |> where_block_number_in_period(from_block, to_block) + |> InternalTransaction.where_block_number_in_period(from_block, to_block) |> common_where_limit_order(paging_options) |> wrapped_union_subquery() - query_to_address_hash_wrapped - |> union(^query_from_address_hash_wrapped) - |> union(^query_created_contract_address_hash_wrapped) + full_query = + query_to_address_hash_wrapped + |> union(^query_from_address_hash_wrapped) + |> union(^query_created_contract_address_hash_wrapped) + + full_query |> wrapped_union_subquery() - |> common_where_limit_order(paging_options) - |> preload(:block) + |> order_by( + [q], + desc: q.block_number, + desc: q.transaction_index, + desc: q.index + ) + |> preload(transaction: :block) |> join_associations(necessity_by_association) - |> select_repo(options).all() + |> Repo.all() else InternalTransaction |> InternalTransaction.where_nonpending_block() |> InternalTransaction.where_address_fields_match(hash, direction) - |> where_block_number_in_period(from_block, to_block) + |> InternalTransaction.where_block_number_in_period(from_block, to_block) |> common_where_limit_order(paging_options) - |> preload(:block) + |> preload(transaction: :block) |> join_associations(necessity_by_association) - |> select_repo(options).all() + |> Repo.all() end end @@ -251,7 +295,8 @@ defmodule Explorer.Chain do defp common_where_limit_order(query, paging_options) do query |> InternalTransaction.where_is_different_from_parent_transaction() - |> page_internal_transaction(paging_options, %{index_int_tx_desc_order: true}) + |> InternalTransaction.where_block_number_is_not_null() + |> page_internal_transaction(paging_options) |> limit(^paging_options.page_size) |> order_by( [it], @@ -261,28 +306,240 @@ defmodule Explorer.Chain do ) end - def address_hashes_to_mined_transactions_without_rewards(address_hashes, options) do + @doc """ + Get the total number of transactions sent by the address with the given hash according to the last block indexed. + + We have to increment +1 in the last nonce result because it works like an array position, the first + nonce has the value 0. When last nonce is nil, it considers that the given address has 0 transactions. + """ + @spec total_transactions_sent_by_address(Hash.Address.t()) :: non_neg_integer() + def total_transactions_sent_by_address(address_hash) do + last_nonce = + address_hash + |> Transaction.last_nonce_by_address_query() + |> Repo.one(timeout: :infinity) + + case last_nonce do + nil -> 0 + value -> value + 1 + end + end + + @doc """ + Fetches the transactions related to the address with the given hash, including + transactions that only have the address in the `token_transfers` related table + and rewards for block validation. + + This query is divided into multiple subqueries intentionally in order to + improve the listing performance. + + The `token_trasfers` table tends to grow exponentially, and the query results + with a `transactions` `join` statement takes too long. + + To solve this the `transaction_hashes` are fetched in a separate query, and + paginated through the `block_number` already present in the `token_transfers` + table. + + ## Options + + * `:necessity_by_association` - use to load `t:association/0` as `:required` or `:optional`. If an association is + `:required`, and the `t:Explorer.Chain.Transaction.t/0` has no associated record for that association, then the + `t:Explorer.Chain.Transaction.t/0` will not be included in the page `entries`. + * `:paging_options` - a `t:Explorer.PagingOptions.t/0` used to specify the `:page_size` and + `:key` (a tuple of the lowest/oldest `{block_number, index}`) and. Results will be the transactions older than + the `block_number` and `index` that are passed. + + """ + @spec address_to_transactions_with_rewards(Hash.Address.t(), [paging_options | necessity_by_association_option]) :: + [ + Transaction.t() + ] + def address_to_transactions_with_rewards(address_hash, options \\ []) when is_list(options) do + paging_options = Keyword.get(options, :paging_options, @default_paging_options) + + if Application.get_env(:block_scout_web, BlockScoutWeb.Chain)[:has_emission_funds] do + cond do + Keyword.get(options, :direction) == :from -> + address_to_transactions_without_rewards(address_hash, options) + + address_has_rewards?(address_hash) -> + %{payout_key: block_miner_payout_address} = Reward.get_validator_payout_key_by_mining(address_hash) + + if block_miner_payout_address && address_hash == block_miner_payout_address do + transactions_with_rewards_results(address_hash, options, paging_options) + else + address_to_transactions_without_rewards(address_hash, options) + end + + true -> + address_to_transactions_without_rewards(address_hash, options) + end + else + address_to_transactions_without_rewards(address_hash, options) + end + end + + defp transactions_with_rewards_results(address_hash, options, paging_options) do + blocks_range = address_to_transactions_tasks_range_of_blocks(address_hash, options) + + rewards_task = + Task.async(fn -> Reward.fetch_emission_rewards_tuples(address_hash, paging_options, blocks_range) end) + + [rewards_task | address_to_transactions_tasks(address_hash, options)] + |> wait_for_address_transactions() + |> Enum.sort_by(fn item -> + case item do + {%Reward{} = emission_reward, _} -> + {-emission_reward.block.number, 1} + + item -> + block_number = if item.block_number, do: -item.block_number, else: 0 + index = if item.index, do: -item.index, else: 0 + {block_number, index} + end + end) + |> Enum.dedup_by(fn item -> + case item do + {%Reward{} = emission_reward, _} -> + {emission_reward.block_hash, emission_reward.address_hash, emission_reward.address_type} + + transaction -> + transaction.hash + end + end) + |> Enum.take(paging_options.page_size) + end + + def address_to_transactions_without_rewards(address_hash, options) do + paging_options = Keyword.get(options, :paging_options, @default_paging_options) + + address_hash + |> address_to_transactions_tasks(options) + |> wait_for_address_transactions() + |> Enum.sort_by(&{&1.block_number, &1.index}, &>=/2) + |> Enum.dedup_by(& &1.hash) + |> Enum.take(paging_options.page_size) + end + + def address_to_mined_transactions_without_rewards(address_hash, options) do paging_options = Keyword.get(options, :paging_options, @default_paging_options) - address_hashes - |> address_hashes_to_mined_transactions_tasks(options) - |> Transaction.wait_for_address_transactions() + address_hash + |> address_to_mined_transactions_tasks(options) + |> wait_for_address_transactions() |> Enum.sort_by(&{&1.block_number, &1.index}, &>=/2) |> Enum.dedup_by(& &1.hash) |> Enum.take(paging_options.page_size) end - defp address_hashes_to_mined_transactions_tasks(address_hashes, options) do + defp address_to_transactions_tasks_query(options) do + from_block = from_block(options) + to_block = to_block(options) + + options + |> Keyword.get(:paging_options, @default_paging_options) + |> fetch_transactions(from_block, to_block) + end + + defp transactions_block_numbers_at_address(address_hash, options) do + direction = Keyword.get(options, :direction) + + options + |> address_to_transactions_tasks_query() + |> Transaction.not_pending_transactions() + |> select([t], t.block_number) + |> Transaction.matching_address_queries_list(direction, address_hash) + end + + defp address_to_transactions_tasks(address_hash, options) do + direction = Keyword.get(options, :direction) + necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) + + from_block = from_block(options) + to_block = to_block(options) + + options + |> address_to_transactions_tasks_query() + |> Transaction.not_dropped_or_replaced_transacions() + |> where_block_number_in_period(from_block, to_block) + |> join_associations(necessity_by_association) + |> Transaction.matching_address_queries_list(direction, address_hash) + |> Enum.map(fn query -> Task.async(fn -> Repo.all(query) end) end) + end + + defp address_to_mined_transactions_tasks(address_hash, options) do direction = Keyword.get(options, :direction) necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) options - |> Transaction.address_to_transactions_tasks_query(true) + |> address_to_transactions_tasks_query() |> Transaction.not_pending_transactions() |> join_associations(necessity_by_association) - |> Transaction.put_has_token_transfers_to_tx(false) - |> Transaction.matching_address_queries_list(direction, address_hashes) - |> Enum.map(fn query -> Task.async(fn -> select_repo(options).all(query) end) end) + |> Transaction.matching_address_queries_list(direction, address_hash) + |> Enum.map(fn query -> Task.async(fn -> Repo.all(query) end) end) + end + + def address_to_transactions_tasks_range_of_blocks(address_hash, options) do + extremums_list = + address_hash + |> transactions_block_numbers_at_address(options) + |> Enum.map(fn query -> + extremum_query = + from( + q in subquery(query), + select: %{min_block_number: min(q.block_number), max_block_number: max(q.block_number)} + ) + + extremum_query + |> Repo.one!() + end) + + extremums_list + |> Enum.reduce(%{min_block_number: nil, max_block_number: 0}, fn %{ + min_block_number: min_number, + max_block_number: max_number + }, + extremums_result -> + current_min_number = Map.get(extremums_result, :min_block_number) + current_max_number = Map.get(extremums_result, :max_block_number) + + extremums_result = + if is_number(current_min_number) do + if is_number(min_number) and min_number > 0 and min_number < current_min_number do + extremums_result + |> Map.put(:min_block_number, min_number) + else + extremums_result + end + else + extremums_result + |> Map.put(:min_block_number, min_number) + end + + if is_number(max_number) and max_number > 0 and max_number > current_max_number do + extremums_result + |> Map.put(:max_block_number, max_number) + else + extremums_result + end + end) + end + + defp wait_for_address_transactions(tasks) do + tasks + |> Task.yield_many(:timer.seconds(20)) + |> Enum.flat_map(fn {_task, res} -> + case res do + {:ok, result} -> + result + + {:exit, reason} -> + raise "Query fetching address transactions terminated: #{inspect(reason)}" + + nil -> + raise "Query fetching address transactions timed out." + end + end) end @spec address_hash_to_token_transfers(Hash.Address.t(), Keyword.t()) :: [Transaction.t()] @@ -293,106 +550,122 @@ defmodule Explorer.Chain do direction |> Transaction.transactions_with_token_transfers_direction(address_hash) |> Transaction.preload_token_transfers(address_hash) - |> Transaction.handle_paging_options(paging_options) + |> handle_paging_options(paging_options) |> Repo.all() end - @spec address_hash_to_token_transfers_new(Hash.Address.t() | String.t(), Keyword.t()) :: [TokenTransfer.t()] - def address_hash_to_token_transfers_new(address_hash, options \\ []) do + @doc """ + address_hash_to_token_transfers_including_contract/2 function returns token transfers on address (to/from/contract). + It is used by CSV export of token transfers button. + """ + @spec address_hash_to_token_transfers_including_contract(Hash.Address.t(), Keyword.t()) :: [TokenTransfer.t()] + def address_hash_to_token_transfers_including_contract(address_hash, options \\ []) do paging_options = Keyword.get(options, :paging_options, @default_paging_options) - direction = Keyword.get(options, :direction) - filters = Keyword.get(options, :token_type) - necessity_by_association = Keyword.get(options, :necessity_by_association) + from_block = Keyword.get(options, :from_block) + to_block = Keyword.get(options, :to_block) - direction - |> TokenTransfer.token_transfers_by_address_hash(address_hash, filters) - |> join_associations(necessity_by_association) - |> TokenTransfer.handle_paging_options(paging_options) - |> select_repo(options).all() - end + query = + from_block + |> query_address_hash_to_token_transfers_including_contract(to_block, address_hash) + |> order_by([token_transfer], asc: token_transfer.block_number, asc: token_transfer.log_index) - @spec address_hash_to_token_transfers_by_token_address_hash( - Hash.Address.t() | String.t(), - Hash.Address.t() | String.t(), - Keyword.t() - ) :: [TokenTransfer.t()] - def address_hash_to_token_transfers_by_token_address_hash(address_hash, token_address_hash, options \\ []) do - paging_options = Keyword.get(options, :paging_options, @default_paging_options) + query + |> handle_token_transfer_paging_options(paging_options) + |> preload(transaction: :block) + |> preload(:token) + |> Repo.all() + end - necessity_by_association = Keyword.get(options, :necessity_by_association) + defp query_address_hash_to_token_transfers_including_contract(nil, to_block, address_hash) + when not is_nil(to_block) do + from( + token_transfer in TokenTransfer, + where: + (token_transfer.to_address_hash == ^address_hash or + token_transfer.from_address_hash == ^address_hash or + token_transfer.token_contract_address_hash == ^address_hash) and + token_transfer.block_number <= ^to_block + ) + end - address_hash - |> TokenTransfer.token_transfers_by_address_hash_and_token_address_hash(token_address_hash) - |> join_associations(necessity_by_association) - |> TokenTransfer.handle_paging_options(paging_options) - |> select_repo(options).all() + defp query_address_hash_to_token_transfers_including_contract(from_block, nil, address_hash) + when not is_nil(from_block) do + from( + token_transfer in TokenTransfer, + where: + (token_transfer.to_address_hash == ^address_hash or + token_transfer.from_address_hash == ^address_hash or + token_transfer.token_contract_address_hash == ^address_hash) and + token_transfer.block_number >= ^from_block + ) end - @spec address_hash_to_withdrawals( - Hash.Address.t(), - [paging_options | necessity_by_association_option] - ) :: [Withdrawal.t()] - def address_hash_to_withdrawals(address_hash, options \\ []) when is_list(options) do - paging_options = Keyword.get(options, :paging_options, @default_paging_options) - necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) + defp query_address_hash_to_token_transfers_including_contract(from_block, to_block, address_hash) + when not is_nil(from_block) and not is_nil(to_block) do + from( + token_transfer in TokenTransfer, + where: + (token_transfer.to_address_hash == ^address_hash or + token_transfer.from_address_hash == ^address_hash or + token_transfer.token_contract_address_hash == ^address_hash) and + (token_transfer.block_number >= ^from_block and token_transfer.block_number <= ^to_block) + ) + end - address_hash - |> Withdrawal.address_hash_to_withdrawals_query() - |> join_associations(necessity_by_association) - |> handle_withdrawals_paging_options(paging_options) - |> select_repo(options).all() + defp query_address_hash_to_token_transfers_including_contract(_, _, address_hash) do + from( + token_transfer in TokenTransfer, + where: + token_transfer.to_address_hash == ^address_hash or + token_transfer.from_address_hash == ^address_hash or + token_transfer.token_contract_address_hash == ^address_hash + ) end @spec address_to_logs(Hash.Address.t(), Keyword.t()) :: [Log.t()] - def address_to_logs(address_hash, csv_export?, options \\ []) when is_list(options) do + def address_to_logs(address_hash, options \\ []) when is_list(options) do paging_options = Keyword.get(options, :paging_options) || %PagingOptions{page_size: 50} from_block = from_block(options) to_block = to_block(options) - base = - if DenormalizationHelper.denormalization_finished?() do - from(log in Log, - order_by: [desc: log.block_number, desc: log.index], - where: log.address_hash == ^address_hash, - limit: ^paging_options.page_size, - select: log, - inner_join: transaction in assoc(log, :transaction), - where: transaction.block_consensus == true - ) - else - from(log in Log, - order_by: [desc: log.block_number, desc: log.index], - where: log.address_hash == ^address_hash, - limit: ^paging_options.page_size, - select: log, - inner_join: block in Block, - on: block.hash == log.block_hash, - where: block.consensus == true - ) - end + {block_number, transaction_index, log_index} = paging_options.key || {BlockNumber.get_max(), 0, 0} - preloaded_query = - if csv_export? do - base - else - base - |> preload(transaction: [:to_address, :from_address]) - end + base_query = + from(log in Log, + inner_join: transaction in Transaction, + on: transaction.hash == log.transaction_hash, + order_by: [desc: log.block_number, desc: log.index], + where: transaction.block_number < ^block_number, + or_where: transaction.block_number == ^block_number and transaction.index > ^transaction_index, + or_where: + transaction.block_number == ^block_number and transaction.index == ^transaction_index and + log.index > ^log_index, + where: log.address_hash == ^address_hash, + limit: ^paging_options.page_size, + select: log + ) + + wrapped_query = + from( + log in subquery(base_query), + inner_join: transaction in Transaction, + preload: [:transaction, transaction: [to_address: :smart_contract]], + where: + log.block_hash == transaction.block_hash and + log.block_number == transaction.block_number and + log.transaction_hash == transaction.hash, + select: log + ) - preloaded_query - |> page_logs(paging_options) - |> filter_topic(Keyword.get(options, :topic)) + wrapped_query + |> filter_topic(options) |> where_block_number_in_period(from_block, to_block) - |> select_repo(options).all() + |> Repo.all() |> Enum.take(paging_options.page_size) end - defp filter_topic(base_query, nil), do: base_query - - defp filter_topic(base_query, ""), do: base_query - - defp filter_topic(base_query, topic) do + defp filter_topic(base_query, topic: topic) do from(log in base_query, where: log.first_topic == ^topic or log.second_topic == ^topic or log.third_topic == ^topic or @@ -400,6 +673,8 @@ defmodule Explorer.Chain do ) end + defp filter_topic(base_query, _), do: base_query + def where_block_number_in_period(base_query, from_block, to_block) when is_nil(from_block) and not is_nil(to_block) do from(q in base_query, where: q.block_number <= ^to_block @@ -413,7 +688,9 @@ defmodule Explorer.Chain do end def where_block_number_in_period(base_query, from_block, to_block) when is_nil(from_block) and is_nil(to_block) do - base_query + from(q in base_query, + where: 1 + ) end def where_block_number_in_period(base_query, from_block, to_block) do @@ -439,7 +716,7 @@ defmodule Explorer.Chain do address_hash |> Transaction.transactions_with_token_transfers(token_hash) |> Transaction.preload_token_transfers(address_hash) - |> Transaction.handle_paging_options(paging_options) + |> handle_paging_options(paging_options) |> Repo.all() end @@ -473,6 +750,37 @@ defmodule Explorer.Chain do Repo.aggregate(Block, :count, :hash) end + @doc """ + Reward for mining a block. + + The block reward is the sum of the following: + + * Sum of the transaction fees (gas_used * gas_price) for the block + * A static reward for miner (this value may change during the life of the chain) + * The reward for uncle blocks (1/32 * static_reward * number_of_uncles) + + *NOTE* + + Uncles are not currently accounted for. + """ + @spec block_reward(Block.block_number()) :: Wei.t() + def block_reward(block_number) do + query = + from( + block in Block, + left_join: transaction in assoc(block, :transactions), + inner_join: emission_reward in EmissionReward, + on: fragment("? <@ ?", block.number, emission_reward.block_range), + where: block.number == ^block_number, + group_by: emission_reward.reward, + select: %Wei{ + value: coalesce(sum(transaction.gas_used * transaction.gas_price), 0) + emission_reward.reward + } + ) + + Repo.one!(query) + end + @doc """ The `t:Explorer.Chain.Wei.t/0` paid to the miners of the `t:Explorer.Chain.Block.t/0`s with `hash` `Explorer.Chain.Hash.Full.t/0` by the signers of the transactions in those blocks to cover the gas fee @@ -481,34 +789,17 @@ defmodule Explorer.Chain do @spec gas_payment_by_block_hash([Hash.Full.t()]) :: %{Hash.Full.t() => Wei.t()} def gas_payment_by_block_hash(block_hashes) when is_list(block_hashes) do query = - if DenormalizationHelper.denormalization_finished?() do - from( - transaction in Transaction, - where: transaction.block_hash in ^block_hashes and transaction.block_consensus == true, - group_by: transaction.block_hash, - select: {transaction.block_hash, %Wei{value: coalesce(sum(transaction.gas_used * transaction.gas_price), 0)}} - ) - else - from( - block in Block, - left_join: transaction in assoc(block, :transactions), - where: block.hash in ^block_hashes and block.consensus == true, - group_by: block.hash, - select: {block.hash, %Wei{value: coalesce(sum(transaction.gas_used * transaction.gas_price), 0)}} - ) - end - - initial_gas_payments = - block_hashes - |> Enum.map(&{&1, %Wei{value: Decimal.new(0)}}) - |> Enum.into(%{}) - - existing_data = - query - |> Repo.all() - |> Enum.into(%{}) + from( + block in Block, + left_join: transaction in assoc(block, :transactions), + where: block.hash in ^block_hashes and block.consensus == true, + group_by: block.hash, + select: {block.hash, %Wei{value: coalesce(sum(transaction.gas_used * transaction.gas_price), 0)}} + ) - Map.merge(initial_gas_payments, existing_data) + query + |> Repo.all() + |> Enum.into(%{}) end def timestamp_by_block_hash(block_hashes) when is_list(block_hashes) do @@ -537,11 +828,8 @@ defmodule Explorer.Chain do `:key` (a tuple of the lowest/oldest `{index}`) and. Results will be the transactions older than the `index` that are passed. """ - @spec block_to_transactions(Hash.Full.t(), [paging_options | necessity_by_association_option | api?()], true | false) :: - [ - Transaction.t() - ] - def block_to_transactions(block_hash, options \\ [], old_ui? \\ true) when is_list(options) do + @spec block_to_transactions(Hash.Full.t(), [paging_options | necessity_by_association_option]) :: [Transaction.t()] + def block_to_transactions(block_hash, options \\ []) when is_list(options) do necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) options @@ -550,45 +838,8 @@ defmodule Explorer.Chain do |> join(:inner, [transaction], block in assoc(transaction, :block)) |> where([_, block], block.hash == ^block_hash) |> join_associations(necessity_by_association) - |> Transaction.put_has_token_transfers_to_tx(old_ui?) - |> (&if(old_ui?, do: preload(&1, [{:token_transfers, [:token, :from_address, :to_address]}]), else: &1)).() - |> select_repo(options).all() - |> (&if(old_ui?, - do: &1, - else: - Enum.map(&1, fn tx -> preload_token_transfers(tx, @token_transfers_necessity_by_association, options) end) - )).() - end - - @spec execution_node_to_transactions(Hash.Address.t(), [paging_options | necessity_by_association_option | api?()]) :: - [Transaction.t()] - def execution_node_to_transactions(execution_node_hash, options \\ []) when is_list(options) do - necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) - - options - |> Keyword.get(:paging_options, @default_paging_options) - |> fetch_transactions_in_descending_order_by_block_and_index() - |> where(execution_node_hash: ^execution_node_hash) - |> join_associations(necessity_by_association) - |> Transaction.put_has_token_transfers_to_tx(false) - |> (& &1).() - |> select_repo(options).all() - |> (&Enum.map(&1, fn tx -> preload_token_transfers(tx, @token_transfers_necessity_by_association, options) end)).() - end - - @spec block_to_withdrawals( - Hash.Full.t(), - [paging_options | necessity_by_association_option] - ) :: [Withdrawal.t()] - def block_to_withdrawals(block_hash, options \\ []) when is_list(options) do - paging_options = Keyword.get(options, :paging_options, @default_paging_options) - necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) - - block_hash - |> Withdrawal.block_hash_to_withdrawals_query() - |> join_associations(necessity_by_association) - |> handle_withdrawals_paging_options(paging_options) - |> select_repo(options).all() + |> preload([{:token_transfers, [:token, :from_address, :to_address]}]) + |> Repo.all() end @doc """ @@ -600,6 +851,7 @@ defmodule Explorer.Chain do from( tx in Transaction, where: tx.block_hash == ^block_hash, + where: not is_nil(tx.max_priority_fee_per_gas), select: sum(tx.gas_used) ) @@ -613,44 +865,31 @@ defmodule Explorer.Chain do @spec block_to_priority_fee_of_1559_txs(Hash.Full.t()) :: Decimal.t() def block_to_priority_fee_of_1559_txs(block_hash) do block = Repo.get_by(Block, hash: block_hash) + %Wei{value: base_fee_per_gas} = block.base_fee_per_gas - case block.base_fee_per_gas do - %Wei{value: base_fee_per_gas} -> - query = - from( - tx in Transaction, - where: tx.block_hash == ^block_hash, - select: - sum( - fragment( - "CASE - WHEN COALESCE(?,?) = 0 THEN 0 - WHEN COALESCE(?,?) - ? < COALESCE(?,?) THEN (COALESCE(?,?) - ?) * ? - ELSE COALESCE(?,?) * ? END", - tx.max_fee_per_gas, - tx.gas_price, - tx.max_fee_per_gas, - tx.gas_price, - ^base_fee_per_gas, - tx.max_priority_fee_per_gas, - tx.gas_price, - tx.max_fee_per_gas, - tx.gas_price, - ^base_fee_per_gas, - tx.gas_used, - tx.max_priority_fee_per_gas, - tx.gas_price, - tx.gas_used - ) - ) + query = + from( + tx in Transaction, + where: tx.block_hash == ^block_hash, + where: not is_nil(tx.max_priority_fee_per_gas), + select: + sum( + fragment( + "CASE + WHEN ? = 0 THEN 0 + WHEN ? < ? THEN ? + ELSE ? END", + tx.max_fee_per_gas, + tx.max_fee_per_gas - ^base_fee_per_gas, + tx.max_priority_fee_per_gas, + (tx.max_fee_per_gas - ^base_fee_per_gas) * tx.gas_used, + tx.max_priority_fee_per_gas * tx.gas_used + ) ) + ) - result = Repo.one(query) - if result, do: result, else: 0 - - _ -> - 0 - end + result = Repo.one(query) + if result, do: result, else: 0 end @doc """ @@ -667,13 +906,42 @@ defmodule Explorer.Chain do Repo.aggregate(query, :count, :hash) end - @spec check_if_withdrawals_in_block(Hash.Full.t()) :: boolean() - def check_if_withdrawals_in_block(block_hash, options \\ []) do - block_hash - |> Withdrawal.block_hash_to_withdrawals_unordered_query() - |> select_repo(options).exists?() + @spec address_to_incoming_transaction_count(Hash.Address.t()) :: non_neg_integer() + def address_to_incoming_transaction_count(address_hash) do + to_address_query = + from( + transaction in Transaction, + where: transaction.to_address_hash == ^address_hash + ) + + Repo.aggregate(to_address_query, :count, :hash, timeout: :infinity) + end + + @spec address_to_incoming_transaction_gas_usage(Hash.Address.t()) :: Decimal.t() | nil + def address_to_incoming_transaction_gas_usage(address_hash) do + to_address_query = + from( + transaction in Transaction, + where: transaction.to_address_hash == ^address_hash + ) + + Repo.aggregate(to_address_query, :sum, :gas_used, timeout: :infinity) + end + + @spec address_to_outcoming_transaction_gas_usage(Hash.Address.t()) :: Decimal.t() | nil + def address_to_outcoming_transaction_gas_usage(address_hash) do + to_address_query = + from( + transaction in Transaction, + where: transaction.from_address_hash == ^address_hash + ) + + Repo.aggregate(to_address_query, :sum, :gas_used, timeout: :infinity) end + @spec max_incoming_transactions_count() :: non_neg_integer() + def max_incoming_transactions_count, do: @max_incoming_transactions_count + @doc """ How many blocks have confirmed `block` based on the current `max_block_number` @@ -707,8 +975,8 @@ defmodule Explorer.Chain do iex> Explorer.Chain.confirmations(block, block_height: 0) {:ok, 1} """ - @spec confirmations(Block.t() | nil, [{:block_height, block_height()}]) :: - {:ok, non_neg_integer()} | {:error, :non_consensus | :pending} + @spec confirmations(Block.t(), [{:block_height, block_height()}]) :: + {:ok, non_neg_integer()} | {:error, :non_consensus} def confirmations(%Block{consensus: true, number: number}, named_arguments) when is_list(named_arguments) do max_consensus_block_number = Keyword.fetch!(named_arguments, :block_height) @@ -718,8 +986,6 @@ defmodule Explorer.Chain do def confirmations(%Block{consensus: false}, _), do: {:error, :non_consensus} - def confirmations(nil, _), do: {:error, :pending} - @doc """ Creates an address. @@ -775,33 +1041,6 @@ defmodule Explorer.Chain do end end - defp set_address_decompiled(repo, address_hash) do - query = - from( - address in Address, - where: address.hash == ^address_hash - ) - - case repo.update_all(query, set: [decompiled: true]) do - {1, _} -> {:ok, []} - _ -> {:error, "There was an error annotating that the address has been decompiled."} - end - end - - @spec verified_contracts_top(non_neg_integer()) :: [Hash.Address.t()] - def verified_contracts_top(limit) do - query = - from(contract in SmartContract, - inner_join: address in Address, - on: contract.address_hash == address.hash, - order_by: [desc: address.transactions_count], - limit: ^limit, - select: contract.address_hash - ) - - Repo.all(query) - end - @doc """ Converts the `Explorer.Chain.Data.t:t/0` to `iodata` representation that can be written to users efficiently. @@ -855,9 +1094,7 @@ defmodule Explorer.Chain do {:actual, Decimal.new(4)} """ - @spec fee(Transaction.t(), :ether | :gwei | :wei) :: {:maximum, Decimal.t()} | {:actual, Decimal.t() | nil} - def fee(%Transaction{gas: _gas, gas_price: nil, gas_used: nil}, _unit), do: {:maximum, nil} - + @spec fee(%Transaction{gas_used: nil}, :ether | :gwei | :wei) :: {:maximum, Decimal.t()} def fee(%Transaction{gas: gas, gas_price: gas_price, gas_used: nil}, unit) do fee = gas_price @@ -867,8 +1104,7 @@ defmodule Explorer.Chain do {:maximum, fee} end - def fee(%Transaction{gas_price: nil, gas_used: _gas_used}, _unit), do: {:actual, nil} - + @spec fee(%Transaction{gas_used: Decimal.t()}, :ether | :gwei | :wei) :: {:actual, Decimal.t()} def fee(%Transaction{gas_price: gas_price, gas_used: gas_used}, unit) do fee = gas_price @@ -880,84 +1116,31 @@ defmodule Explorer.Chain do @doc """ Checks to see if the chain is down indexing based on the transaction from the - oldest block and the pending operation + oldest block and the `fetch_internal_transactions` pending operation """ - @spec finished_indexing_internal_transactions?([api?]) :: boolean() - def finished_indexing_internal_transactions?(options \\ []) do - internal_transactions_disabled? = - Application.get_env(:indexer, Indexer.Fetcher.InternalTransaction.Supervisor)[:disabled?] or - not Application.get_env(:indexer, Indexer.Supervisor)[:enabled] + @spec finished_indexing?() :: boolean() + def finished_indexing? do + json_rpc_named_arguments = Application.fetch_env!(:indexer, :json_rpc_named_arguments) + variant = Keyword.fetch!(json_rpc_named_arguments, :variant) - if internal_transactions_disabled? do + if variant == EthereumJSONRPC.Ganache || variant == EthereumJSONRPC.Arbitrum do true else - json_rpc_named_arguments = Application.fetch_env!(:indexer, :json_rpc_named_arguments) - variant = Keyword.fetch!(json_rpc_named_arguments, :variant) - - if variant == EthereumJSONRPC.Ganache || variant == EthereumJSONRPC.Arbitrum do - true - else - check_left_blocks_to_index_internal_transactions(options) - end - end - end - - defp check_left_blocks_to_index_internal_transactions(options) do - with {:transactions_exist, true} <- {:transactions_exist, select_repo(options).exists?(Transaction)}, - min_block_number when not is_nil(min_block_number) <- - select_repo(options).aggregate(Transaction, :min, :block_number) do - min_block_number = - min_block_number - |> Decimal.max(Application.get_env(:indexer, :trace_first_block)) - |> Decimal.to_integer() - - query = - from( - block in Block, - join: pending_ops in assoc(block, :pending_operations), - where: block.consensus and block.number == ^min_block_number - ) + with {:transactions_exist, true} <- {:transactions_exist, Repo.exists?(Transaction)}, + min_block_number when not is_nil(min_block_number) <- Repo.aggregate(Transaction, :min, :block_number) do + query = + from( + b in Block, + join: pending_ops in assoc(b, :pending_operations), + where: pending_ops.fetch_internal_transactions, + where: b.consensus and b.number == ^min_block_number + ) - if select_repo(options).exists?(query) do - false + !Repo.exists?(query) else - check_indexing_internal_transactions_threshold() - end - else - {:transactions_exist, false} -> true - nil -> false - end - end - - defp check_indexing_internal_transactions_threshold do - pbo_count = PendingBlockOperationCache.estimated_count() - - if pbo_count < - Application.get_env(:indexer, Indexer.Fetcher.InternalTransaction)[:indexing_finished_threshold] do - true - else - false - end - end - - def finished_indexing_from_ratio?(ratio) do - Decimal.compare(ratio, 1) !== :lt - end - - @doc """ - Checks if indexing of blocks and internal transactions finished aka full indexing - """ - @spec finished_indexing?([api?]) :: boolean() - def finished_indexing?(options \\ []) do - if Application.get_env(:indexer, Indexer.Supervisor)[:enabled] do - indexed_ratio = indexed_ratio_blocks() - - case finished_indexing_from_ratio?(indexed_ratio) do - false -> false - _ -> finished_indexing_internal_transactions?(options) + {:transactions_exist, false} -> true + nil -> false end - else - true end end @@ -995,10 +1178,10 @@ defmodule Explorer.Chain do Optionally it also accepts a boolean to fetch the `has_decompiled_code?` virtual field or not """ - @spec hash_to_address(Hash.Address.t() | binary(), [necessity_by_association_option | api?], boolean()) :: + @spec hash_to_address(Hash.Address.t(), [necessity_by_association_option], boolean()) :: {:ok, Address.t()} | {:error, :not_found} def hash_to_address( - hash, + %Hash{byte_count: unquote(Hash.Address.byte_count())} = hash, options \\ [ necessity_by_association: %{ :contracts_creation_internal_transaction => :optional, @@ -1022,7 +1205,7 @@ defmodule Explorer.Chain do query |> join_associations(necessity_by_association) |> with_decompiled_code_flag(hash, query_decompiled_code_flag) - |> select_repo(options).one() + |> Repo.one() address_updated_result = case address_result do @@ -1030,7 +1213,21 @@ defmodule Explorer.Chain do if smart_contract do address_result else - SmartContract.compose_smart_contract(address_result, hash, options) + address_verified_twin_contract = + Chain.get_minimal_proxy_template(hash) || + Chain.get_address_verified_twin_contract(hash).verified_contract + + if address_verified_twin_contract do + address_verified_twin_contract_updated = + address_verified_twin_contract + |> Map.put(:address_hash, hash) + |> Map.put_new(:metadata_from_verified_twin, true) + + address_result + |> Map.put(:smart_contract, address_verified_twin_contract_updated) + else + address_result + end end _ -> @@ -1082,6 +1279,360 @@ defmodule Explorer.Chain do end end + defp prepare_search_term(string) do + case Regex.scan(~r/[a-zA-Z0-9]+/, string) do + [_ | _] = words -> + term_final = + words + |> Enum.map(fn [word] -> word <> ":*" end) + |> Enum.join(" & ") + + {:some, term_final} + + _ -> + :none + end + end + + defp search_token_query(term) do + from(token in Token, + left_join: bridged in BridgedToken, + on: token.contract_address_hash == bridged.home_token_contract_address_hash, + where: fragment("to_tsvector(symbol || ' ' || name ) @@ to_tsquery(?)", ^term), + select: %{ + address_hash: token.contract_address_hash, + tx_hash: fragment("CAST(NULL AS bytea)"), + block_hash: fragment("CAST(NULL AS bytea)"), + foreign_token_hash: bridged.foreign_token_contract_address_hash, + foreign_chain_id: bridged.foreign_chain_id, + type: "token", + name: token.name, + symbol: token.symbol, + holder_count: token.holder_count, + inserted_at: token.inserted_at, + block_number: 0 + } + ) + end + + defp search_contract_query(term) do + from(smart_contract in SmartContract, + left_join: address in Address, + on: smart_contract.address_hash == address.hash, + where: fragment("to_tsvector(name ) @@ to_tsquery(?)", ^term), + select: %{ + address_hash: smart_contract.address_hash, + tx_hash: fragment("CAST(NULL AS bytea)"), + block_hash: fragment("CAST(NULL AS bytea)"), + foreign_token_hash: fragment("CAST(NULL AS bytea)"), + foreign_chain_id: ^nil, + type: "contract", + name: smart_contract.name, + symbol: ^nil, + holder_count: ^nil, + inserted_at: address.inserted_at, + block_number: 0 + } + ) + end + + defp search_address_query(term) do + case Chain.string_to_address_hash(term) do + {:ok, address_hash} -> + from(address in Address, + left_join: address_name in Address.Name, + on: address.hash == address_name.address_hash, + where: address.hash == ^address_hash, + select: %{ + address_hash: address.hash, + tx_hash: fragment("CAST(NULL AS bytea)"), + block_hash: fragment("CAST(NULL AS bytea)"), + foreign_token_hash: fragment("CAST(NULL AS bytea)"), + foreign_chain_id: ^nil, + type: "address", + name: address_name.name, + symbol: ^nil, + holder_count: ^nil, + inserted_at: address.inserted_at, + block_number: 0 + } + ) + + _ -> + nil + end + end + + defp search_tx_query(term) do + case Chain.string_to_transaction_hash(term) do + {:ok, tx_hash} -> + from(transaction in Transaction, + where: transaction.hash == ^tx_hash, + select: %{ + address_hash: fragment("CAST(NULL AS bytea)"), + tx_hash: transaction.hash, + block_hash: fragment("CAST(NULL AS bytea)"), + foreign_token_hash: fragment("CAST(NULL AS bytea)"), + foreign_chain_id: ^nil, + type: "transaction", + name: ^nil, + symbol: ^nil, + holder_count: ^nil, + inserted_at: transaction.inserted_at, + block_number: 0 + } + ) + + _ -> + nil + end + end + + defp search_block_query(term) do + case Chain.string_to_block_hash(term) do + {:ok, block_hash} -> + from(block in Block, + where: block.hash == ^block_hash, + select: %{ + address_hash: fragment("CAST(NULL AS bytea)"), + tx_hash: fragment("CAST(NULL AS bytea)"), + block_hash: block.hash, + foreign_token_hash: fragment("CAST(NULL AS bytea)"), + foreign_chain_id: ^nil, + type: "block", + name: ^nil, + symbol: ^nil, + holder_count: ^nil, + inserted_at: block.inserted_at, + block_number: block.number + } + ) + + _ -> + case Integer.parse(term) do + {block_number, _} -> + from(block in Block, + where: block.number == ^block_number, + select: %{ + address_hash: fragment("CAST(NULL AS bytea)"), + tx_hash: fragment("CAST(NULL AS bytea)"), + block_hash: block.hash, + foreign_token_hash: fragment("CAST(NULL AS bytea)"), + foreign_chain_id: ^nil, + type: "block", + name: ^nil, + symbol: ^nil, + holder_count: ^nil, + inserted_at: block.inserted_at, + block_number: block.number + } + ) + + _ -> + nil + end + end + end + + def joint_search(paging_options, offset, string) do + case prepare_search_term(string) do + {:some, term} -> + tokens_query = search_token_query(term) + contracts_query = search_contract_query(term) + tx_query = search_tx_query(string) + address_query = search_address_query(string) + block_query = search_block_query(string) + + basic_query = + from( + tokens in subquery(tokens_query), + union: ^contracts_query + ) + + query = + cond do + address_query -> + basic_query + |> union(^address_query) + + tx_query -> + basic_query + |> union(^tx_query) + |> union(^block_query) + + block_query -> + basic_query + |> union(^block_query) + + true -> + basic_query + end + + ordered_query = + from(items in subquery(query), + order_by: [desc_nulls_last: items.holder_count, asc: items.name, desc: items.inserted_at], + limit: ^paging_options.page_size, + offset: ^offset + ) + + paginated_ordered_query = + ordered_query + |> page_search_results(paging_options) + + search_results = Repo.all(paginated_ordered_query) + + search_results + |> Enum.map(fn result -> + result_checksummed_address_hash = + if result.address_hash do + result + |> Map.put(:address_hash, Address.checksum(result.address_hash)) + else + result + end + + result_checksummed = + if result_checksummed_address_hash.foreign_token_hash do + result_checksummed_address_hash + |> Map.put(:foreign_token_hash, Address.checksum(result_checksummed_address_hash.foreign_token_hash)) + else + result_checksummed_address_hash + end + + result_checksummed + end) + + _ -> + [] + end + end + + @spec search_token(String.t()) :: [Token.t()] + def search_token(string) do + case prepare_search_term(string) do + {:some, term} -> + query = + from(token in Token, + where: fragment("to_tsvector(symbol || ' ' || name ) @@ to_tsquery(?)", ^term), + select: %{ + link: token.contract_address_hash, + symbol: token.symbol, + name: token.name, + holder_count: token.holder_count, + type: "token" + }, + order_by: [desc: token.holder_count] + ) + + Repo.all(query) + + _ -> + [] + end + end + + @spec search_contract(String.t()) :: [SmartContract.t()] + def search_contract(string) do + case prepare_search_term(string) do + {:some, term} -> + query = + from(smart_contract in SmartContract, + left_join: address in Address, + on: smart_contract.address_hash == address.hash, + where: fragment("to_tsvector(name ) @@ to_tsquery(?)", ^term), + select: %{ + link: smart_contract.address_hash, + name: smart_contract.name, + inserted_at: address.inserted_at, + type: "contract" + }, + order_by: [desc: smart_contract.inserted_at] + ) + + Repo.all(query) + + _ -> + [] + end + end + + def search_tx(term) do + case Chain.string_to_transaction_hash(term) do + {:ok, tx_hash} -> + query = + from(transaction in Transaction, + where: transaction.hash == ^tx_hash, + select: %{ + link: transaction.hash, + type: "transaction" + } + ) + + Repo.all(query) + + _ -> + [] + end + end + + def search_address(term) do + case Chain.string_to_address_hash(term) do + {:ok, address_hash} -> + query = + from(address in Address, + left_join: address_name in Address.Name, + on: address.hash == address_name.address_hash, + where: address.hash == ^address_hash, + select: %{ + name: address_name.name, + link: address.hash, + type: "address" + } + ) + + Repo.all(query) + + _ -> + [] + end + end + + def search_block(term) do + case Chain.string_to_block_hash(term) do + {:ok, block_hash} -> + query = + from(block in Block, + where: block.hash == ^block_hash, + select: %{ + link: block.hash, + block_number: block.number, + type: "block" + } + ) + + Repo.all(query) + + _ -> + case Integer.parse(term) do + {block_number, _} -> + query = + from(block in Block, + where: block.number == ^block_number, + select: %{ + link: block.hash, + block_number: block.number, + type: "block" + } + ) + + Repo.all(query) + + _ -> + [] + end + end + end + @doc """ Converts `t:Explorer.Chain.Address.t/0` `hash` to the `t:Explorer.Chain.Address.t/0` with that `hash`. @@ -1180,7 +1731,7 @@ defmodule Explorer.Chain do options |> Keyword.get(:necessity_by_association, %{}) |> Map.merge(%{ - [smart_contract: :smart_contract_additional_sources] => :optional + smart_contract_additional_sources: :optional }) query = @@ -1193,27 +1744,32 @@ defmodule Explorer.Chain do query |> join_associations(necessity_by_association) |> with_decompiled_code_flag(hash, query_decompiled_code_flag) - |> select_repo(options).one() + |> Repo.one() address_updated_result = case address_result do %{smart_contract: smart_contract} -> if smart_contract do - CheckBytecodeMatchingOnDemand.trigger_check(address_result, smart_contract) - LookUpSmartContractSourcesOnDemand.trigger_fetch(address_result, smart_contract) - SmartContract.check_and_update_constructor_args(address_result) + check_bytecode_matching(address_result) else - LookUpSmartContractSourcesOnDemand.trigger_fetch(address_result, nil) - address_verified_twin_contract = - EIP1167.get_implementation_address(hash, options) || - SmartContract.get_address_verified_twin_contract(hash, options).verified_contract - - SmartContract.add_twin_info_to_contract(address_result, address_verified_twin_contract, hash) + Chain.get_minimal_proxy_template(hash) || + Chain.get_address_verified_twin_contract(hash).verified_contract + + if address_verified_twin_contract do + address_verified_twin_contract_updated = + address_verified_twin_contract + |> Map.put(:address_hash, hash) + |> Map.put_new(:metadata_from_verified_twin, true) + + address_result + |> Map.put(:smart_contract, address_verified_twin_contract_updated) + else + address_result + end end _ -> - LookUpSmartContractSourcesOnDemand.trigger_fetch(address_result, nil) address_result end @@ -1224,6 +1780,46 @@ defmodule Explorer.Chain do end end + defp check_bytecode_matching(address) do + now = DateTime.utc_now() + json_rpc_named_arguments = Application.get_env(:explorer, :json_rpc_named_arguments) + + if !address.smart_contract.is_changed_bytecode and + address.smart_contract.bytecode_checked_at + |> DateTime.add(@check_bytecode_interval, :second) + |> DateTime.compare(now) != :gt do + case EthereumJSONRPC.fetch_codes( + [%{block_quantity: "latest", address: address.smart_contract.address_hash}], + json_rpc_named_arguments + ) do + {:ok, %EthereumJSONRPC.FetchedCodes{params_list: fetched_codes}} -> + bytecode_from_node = fetched_codes |> List.first() |> Map.get(:code) + bytecode_from_db = "0x" <> (address.contract_code.bytes |> Base.encode16(case: :lower)) + + if bytecode_from_node == bytecode_from_db do + {:ok, smart_contract} = + address.smart_contract + |> Changeset.change(%{bytecode_checked_at: now}) + |> Repo.update() + + %{address | smart_contract: smart_contract} + else + {:ok, smart_contract} = + address.smart_contract + |> Changeset.change(%{bytecode_checked_at: now, is_changed_bytecode: true}) + |> Repo.update() + + %{address | smart_contract: smart_contract} + end + + _ -> + address + end + else + address + end + end + @spec find_decompiled_contract_address(Hash.Address.t()) :: {:ok, Address.t()} | {:error, :not_found} def find_decompiled_contract_address(%Hash{byte_count: unquote(Hash.Address.byte_count())} = hash) do query = @@ -1276,15 +1872,14 @@ defmodule Explorer.Chain do `t:Explorer.Chain.Block.t/0` will not be included in the page `entries`. """ - @spec hash_to_block(Hash.Full.t(), [necessity_by_association_option | api?]) :: - {:ok, Block.t()} | {:error, :not_found} + @spec hash_to_block(Hash.Full.t(), [necessity_by_association_option]) :: {:ok, Block.t()} | {:error, :not_found} def hash_to_block(%Hash{byte_count: unquote(Hash.Full.byte_count())} = hash, options \\ []) when is_list(options) do necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) Block |> where(hash: ^hash) |> join_associations(necessity_by_association) - |> select_repo(options).one() + |> Repo.one() |> case do nil -> {:error, :not_found} @@ -1346,7 +1941,7 @@ defmodule Explorer.Chain do `:required`, and the `t:Explorer.Chain.Transaction.t/0` has no associated record for that association, then the `t:Explorer.Chain.Transaction.t/0` will not be included in the page `entries`. """ - @spec hash_to_transaction(Hash.Full.t(), [necessity_by_association_option | api?]) :: + @spec hash_to_transaction(Hash.Full.t(), [necessity_by_association_option]) :: {:ok, Transaction.t()} | {:error, :not_found} def hash_to_transaction( %Hash{byte_count: unquote(Hash.Full.byte_count())} = hash, @@ -1358,7 +1953,7 @@ defmodule Explorer.Chain do Transaction |> where(hash: ^hash) |> join_associations(necessity_by_association) - |> select_repo(options).one() + |> Repo.one() |> case do nil -> {:error, :not_found} @@ -1368,42 +1963,6 @@ defmodule Explorer.Chain do end end - # preload_to_detect_tt?: we don't need to preload more than one token transfer in case the tx inside the list (we don't show any token transfers on tx tile in new UI) - def preload_token_transfers( - %Transaction{hash: tx_hash, block_hash: block_hash} = transaction, - necessity_by_association, - options, - preload_to_detect_tt? \\ true - ) do - if preload_to_detect_tt? do - transaction - else - limit = if(preload_to_detect_tt?, do: 1, else: @token_transfers_per_transaction_preview + 1) - - token_transfers = - TokenTransfer - |> (&if(is_nil(block_hash), - do: where(&1, [token_transfer], token_transfer.transaction_hash == ^tx_hash), - else: - where( - &1, - [token_transfer], - token_transfer.transaction_hash == ^tx_hash and token_transfer.block_hash == ^block_hash - ) - )).() - |> limit(^limit) - |> order_by([token_transfer], asc: token_transfer.log_index) - |> (&if(preload_to_detect_tt?, do: &1, else: join_associations(&1, necessity_by_association))).() - |> select_repo(options).all() - |> flat_1155_batch_token_transfers() - |> Enum.take(limit) - - %Transaction{transaction | token_transfers: token_transfers} - end - end - - def get_token_transfers_per_transaction_preview_count, do: @token_transfers_per_transaction_preview - @doc """ Converts list of `t:Explorer.Chain.Transaction.t/0` `hashes` to the list of `t:Explorer.Chain.Transaction.t/0`s for those `hashes`. @@ -1432,15 +1991,15 @@ defmodule Explorer.Chain do `:required`, and the `t:Explorer.Chain.Transaction.t/0` has no associated record for that association, then the `t:Explorer.Chain.Transaction.t/0` will not be included in the page `entries`. """ - @spec hashes_to_transactions([Hash.Full.t()], [necessity_by_association_option | api?]) :: [Transaction.t()] | [] + @spec hashes_to_transactions([Hash.Full.t()], [necessity_by_association_option]) :: [Transaction.t()] | [] def hashes_to_transactions(hashes, options \\ []) when is_list(hashes) and is_list(options) do necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) - Transaction.fetch_transactions() + fetch_transactions() |> where([transaction], transaction.hash in ^hashes) |> join_associations(necessity_by_association) |> preload([{:token_transfers, [:token, :from_address, :to_address]}]) - |> select_repo(options).all() + |> Repo.all() end @doc """ @@ -1456,94 +2015,34 @@ defmodule Explorer.Chain do @doc """ The percentage of indexed blocks on the chain. + iex> for index <- 5..9 do + ...> insert(:block, number: index) + ...> Process.sleep(200) + ...> end + iex> Explorer.Chain.indexed_ratio() + Decimal.new(1, 50, -2) + If there are no blocks, the percentage is 0. - iex> Explorer.Chain.indexed_ratio_blocks() + iex> Explorer.Chain.indexed_ratio() Decimal.new(0) """ - @spec indexed_ratio_blocks() :: Decimal.t() - def indexed_ratio_blocks do - if Application.get_env(:indexer, Indexer.Supervisor)[:enabled] do - %{min: min_saved_block_number, max: max_saved_block_number} = BlockNumber.get_all() + @spec indexed_ratio() :: Decimal.t() + def indexed_ratio do + %{min: min, max: max} = BlockNumber.get_all() - min_blockchain_block_number = Application.get_env(:indexer, :first_block) + case {min, max} do + {0, 0} -> + Decimal.new(0) - case {min_saved_block_number, max_saved_block_number} do - {0, 0} -> - Decimal.new(0) - - _ -> - divisor = max_saved_block_number - min_blockchain_block_number + 1 - - ratio = get_ratio(BlockCache.estimated_count(), divisor) - - ratio - |> (&if( - greater_or_equal_0_99(&1) && - min_saved_block_number <= min_blockchain_block_number, - do: Decimal.new(1), - else: &1 - )).() - |> format_indexed_ratio() - end - else - Decimal.new(1) - end - end - - @spec indexed_ratio_internal_transactions() :: Decimal.t() - def indexed_ratio_internal_transactions do - if Application.get_env(:indexer, Indexer.Supervisor)[:enabled] && - not Application.get_env(:indexer, Indexer.Fetcher.InternalTransaction.Supervisor)[:disabled?] do - %{max: max_saved_block_number} = BlockNumber.get_all() - pbo_count = PendingBlockOperationCache.estimated_count() - - min_blockchain_trace_block_number = Application.get_env(:indexer, :trace_first_block) - - case max_saved_block_number do - 0 -> - Decimal.new(0) + _ -> + result = Decimal.div(max - min + 1, max + 1) - _ -> - full_blocks_range = max_saved_block_number - min_blockchain_trace_block_number + 1 - processed_int_txs_for_blocks_count = max(0, full_blocks_range - pbo_count) - - ratio = get_ratio(processed_int_txs_for_blocks_count, full_blocks_range) - - ratio - |> (&if( - greater_or_equal_0_99(&1), - do: Decimal.new(1), - else: &1 - )).() - |> format_indexed_ratio() - end - else - Decimal.new(1) + Decimal.round(result, 2, :down) end end - @spec get_ratio(non_neg_integer(), non_neg_integer()) :: Decimal.t() - defp get_ratio(dividend, divisor) do - if divisor > 0, - do: dividend |> Decimal.div(divisor), - else: Decimal.new(1) - end - - @spec greater_or_equal_0_99(Decimal.t()) :: boolean() - defp greater_or_equal_0_99(value) do - Decimal.compare(value, Decimal.from_float(0.99)) == :gt || - Decimal.compare(value, Decimal.from_float(0.99)) == :eq - end - - @spec format_indexed_ratio(Decimal.t()) :: Decimal.t() - defp format_indexed_ratio(raw_ratio) do - raw_ratio - |> Decimal.round(2, :down) - |> Decimal.min(Decimal.new(1)) - end - @spec fetch_min_block_number() :: non_neg_integer def fetch_min_block_number do query = @@ -1576,20 +2075,30 @@ defmodule Explorer.Chain do 0 end + @spec fetch_count_consensus_block() :: non_neg_integer + def fetch_count_consensus_block do + query = + from(block in Block, + select: count(block.hash), + where: block.consensus == true + ) + + Repo.one!(query, timeout: :infinity) || 0 + end + def fetch_block_by_hash(block_hash) do Repo.get(Block, block_hash) end - def filter_consensus_block_numbers(block_numbers) do + @spec fetch_sum_gas_used() :: non_neg_integer + def fetch_sum_gas_used do query = from( - block in Block, - where: block.number in ^block_numbers, - where: block.consensus == true, - select: block.number + t0 in Transaction, + select: fragment("SUM(t0.gas_used)") ) - Repo.all(query) + Repo.one!(query, timeout: :infinity) || 0 end @doc """ @@ -1624,7 +2133,7 @@ defmodule Explorer.Chain do * ':block_type' - use to filter by type of block; Uncle`, `Reorg`, or `Block` (default). """ - @spec list_blocks([paging_options | necessity_by_association_option | api?]) :: [Block.t()] + @spec list_blocks([paging_options | necessity_by_association_option]) :: [Block.t()] def list_blocks(options \\ []) when is_list(options) do necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) paging_options = Keyword.get(options, :paging_options) || @default_paging_options @@ -1632,22 +2141,22 @@ defmodule Explorer.Chain do cond do block_type == "Block" && !paging_options.key -> - block_from_cache(block_type, paging_options, necessity_by_association, options) + fetch_blocks(block_type, paging_options, necessity_by_association) block_type == "Uncle" && !paging_options.key -> - uncles_from_cache(block_type, paging_options, necessity_by_association, options) + uncles_from_cache(block_type, paging_options, necessity_by_association) true -> - fetch_blocks(block_type, paging_options, necessity_by_association, options) + fetch_blocks(block_type, paging_options, necessity_by_association) end end - defp block_from_cache(block_type, paging_options, necessity_by_association, options) do - case Blocks.take_enough(paging_options.page_size) do + def uncles_from_cache(block_type, paging_options, necessity_by_association) do + case Uncles.take_enough(paging_options.page_size) do nil -> - elements = fetch_blocks(block_type, paging_options, necessity_by_association, options) + elements = fetch_blocks(block_type, paging_options, necessity_by_association) - Blocks.update(elements) + Uncles.update(elements) elements @@ -1656,28 +2165,14 @@ defmodule Explorer.Chain do end end - def uncles_from_cache(block_type, paging_options, necessity_by_association, options) do - case Uncles.take_enough(paging_options.page_size) do - nil -> - elements = fetch_blocks(block_type, paging_options, necessity_by_association, options) - - Uncles.update(elements) - - elements - - blocks -> - blocks - end - end - - defp fetch_blocks(block_type, paging_options, necessity_by_association, options) do + defp fetch_blocks(block_type, paging_options, necessity_by_association) do Block |> Block.block_type_filter(block_type) |> page_blocks(paging_options) |> limit(^paging_options.page_size) |> order_by(desc: :number) |> join_associations(necessity_by_association) - |> select_repo(options).all() + |> Repo.all() end @doc """ @@ -1703,12 +2198,174 @@ defmodule Explorer.Chain do |> Enum.into(%{}) end + @doc """ + Lists the top `t:Explorer.Chain.Address.t/0`'s' in descending order based on coin balance and address hash. + + """ + @spec list_top_addresses :: [{Address.t(), non_neg_integer()}] + def list_top_addresses(options \\ []) do + paging_options = Keyword.get(options, :paging_options, @default_paging_options) + + if is_nil(paging_options.key) do + paging_options.page_size + |> Accounts.take_enough() + |> case do + nil -> + accounts_with_n = fetch_top_addresses(paging_options) + + accounts_with_n + |> Enum.map(fn {address, _n} -> address end) + |> Accounts.update() + + accounts_with_n + + accounts -> + Enum.map( + accounts, + &{&1, + if is_nil(&1.nonce) do + 0 + else + &1.nonce + 1 + end} + ) + end + else + fetch_top_addresses(paging_options) + end + end + + defp fetch_top_addresses(paging_options) do + base_query = + from(a in Address, + where: a.fetched_coin_balance > ^0, + order_by: [desc: a.fetched_coin_balance, asc: a.hash], + preload: [:names], + select: {a, fragment("coalesce(1 + ?, 0)", a.nonce)} + ) + + base_query + |> page_addresses(paging_options) + |> limit(^paging_options.page_size) + |> Repo.all() + end + + @doc """ + Lists the top `t:Explorer.Chain.Token.t/0`'s'. + + """ + @spec list_top_tokens(String.t()) :: [{Token.t(), non_neg_integer()}] + def list_top_tokens(filter, options \\ []) do + paging_options = Keyword.get(options, :paging_options, @default_paging_options) + + fetch_top_tokens(filter, paging_options) + end + + @spec list_top_bridged_tokens(atom(), String.t() | nil, boolean(), [paging_options | necessity_by_association_option]) :: + [ + {Token.t(), BridgedToken.t()} + ] + def list_top_bridged_tokens(destination, filter, from_api, options \\ []) do + paging_options = Keyword.get(options, :paging_options, @default_paging_options) + + fetch_top_bridged_tokens(destination, paging_options, filter, from_api) + end + + defp fetch_top_tokens(filter, paging_options) do + base_query = + from(t in Token, + where: t.total_supply > ^0, + order_by: [desc_nulls_last: t.holder_count, asc: t.name], + preload: [:contract_address] + ) + + base_query_with_paging = + base_query + |> page_tokens(paging_options) + |> limit(^paging_options.page_size) + + query = + if filter && filter !== "" do + base_query_with_paging + |> where(fragment("to_tsvector('english', symbol || ' ' || name ) @@ to_tsquery(?)", ^filter)) + else + base_query_with_paging + end + + query + |> Repo.all() + end + + defp fetch_top_bridged_tokens(destination, paging_options, filter, from_api) do + offset = (max(paging_options.page_number, 1) - 1) * paging_options.page_size + chain_id = translate_destination_to_chain_id(destination) + + if chain_id == :undefined do + [] + else + bridged_tokens_query = + if chain_id do + from(bt in BridgedToken, + select: bt, + where: bt.foreign_chain_id == ^chain_id + ) + else + from(bt in BridgedToken, + select: bt + ) + end + + base_query = + from(t in Token, + right_join: bt in subquery(bridged_tokens_query), + on: t.contract_address_hash == bt.home_token_contract_address_hash, + where: t.total_supply > ^0, + where: t.bridged, + order_by: [desc: t.holder_count, asc: t.name], + select: [t, bt], + preload: [:contract_address] + ) + + base_query_with_paging = + base_query + |> page_tokens(paging_options) + |> limit(^paging_options.page_size) + |> offset(^offset) + + query = + if filter && filter !== "" do + base_query_with_paging + |> where(fragment("to_tsvector('english', symbol || ' ' || name ) @@ to_tsquery(?)", ^filter)) + else + base_query_with_paging + end + + if from_api do + query + |> Repo.replica().all() + else + query + |> Repo.all() + end + end + end + + defp translate_destination_to_chain_id(destination) do + case destination do + :eth -> 1 + :kovan -> 42 + :bsc -> 56 + :poa -> 99 + nil -> nil + _ -> :undefined + end + end + @doc """ Calls `reducer` on a stream of `t:Explorer.Chain.Block.t/0` without `t:Explorer.Chain.Block.Reward.t/0`. """ - def stream_blocks_without_rewards(initial, reducer, limited? \\ false) when is_function(reducer, 2) do + def stream_blocks_without_rewards(initial, reducer) when is_function(reducer, 2) do Block.blocks_without_reward_query() - |> add_fetcher_limit(limited?) |> Repo.stream_reduce(initial, reducer) end @@ -1748,7 +2405,50 @@ defmodule Explorer.Chain do |> page_blocks(paging_options) |> limit(^paging_options.page_size) |> order_by(desc: :number) - |> select_repo(options).all() + |> Repo.all() + end + + def check_if_validated_blocks_at_address(address_hash) do + Repo.exists?(from(b in Block, where: b.miner_hash == ^address_hash)) + end + + def check_if_logs_at_address(address_hash) do + Repo.exists?(from(l in Log, where: l.address_hash == ^address_hash)) + end + + def check_if_internal_transactions_at_address(address_hash) do + internal_transactions_exists_by_created_contract_address_hash = + Repo.exists?(from(it in InternalTransaction, where: it.created_contract_address_hash == ^address_hash)) + + internal_transactions_exists_by_from_address_hash = + Repo.exists?(from(it in InternalTransaction, where: it.from_address_hash == ^address_hash)) + + internal_transactions_exists_by_to_address_hash = + Repo.exists?(from(it in InternalTransaction, where: it.to_address_hash == ^address_hash)) + + internal_transactions_exists_by_created_contract_address_hash || internal_transactions_exists_by_from_address_hash || + internal_transactions_exists_by_to_address_hash + end + + def check_if_token_transfers_at_address(address_hash) do + token_transfers_exists_by_from_address_hash = + Repo.exists?(from(tt in TokenTransfer, where: tt.from_address_hash == ^address_hash)) + + token_transfers_exists_by_to_address_hash = + Repo.exists?(from(tt in TokenTransfer, where: tt.to_address_hash == ^address_hash)) + + token_transfers_exists_by_from_address_hash || + token_transfers_exists_by_to_address_hash + end + + def check_if_tokens_at_address(address_hash) do + Repo.exists?( + from( + tb in CurrentTokenBalance, + where: tb.address_hash == ^address_hash, + where: tb.value > 0 + ) + ) end @doc """ @@ -1759,7 +2459,7 @@ defmodule Explorer.Chain do from( b in Block, join: addr in Address, - on: b.miner_hash == addr.hash, + where: b.miner_hash == addr.hash, select: {b.miner_hash, count(b.miner_hash)}, group_by: b.miner_hash ) @@ -1768,24 +2468,89 @@ defmodule Explorer.Chain do end @doc """ - Return the balance in usd corresponding to this token. Return nil if the fiat_value of the token is not present. + Counts the number of `t:Explorer.Chain.Block.t/0` validated by the address with the given `hash`. """ - def balance_in_fiat(%{fiat_value: fiat_value} = token_balance) when not is_nil(fiat_value) do - token_balance.fiat_value + @spec address_to_validation_count(Hash.Address.t()) :: non_neg_integer() + def address_to_validation_count(hash) do + query = from(block in Block, where: block.miner_hash == ^hash, select: fragment("COUNT(*)")) + + Repo.one(query) + end + + @spec address_to_transaction_count(Address.t()) :: non_neg_integer() + def address_to_transaction_count(address) do + if contract?(address) do + incoming_transaction_count = address_to_incoming_transaction_count(address.hash) + + if incoming_transaction_count == 0 do + total_transactions_sent_by_address(address.hash) + else + incoming_transaction_count + end + else + total_transactions_sent_by_address(address.hash) + end + end + + @spec address_to_token_transfer_count(Address.t()) :: non_neg_integer() + def address_to_token_transfer_count(address) do + query = + from( + token_transfer in TokenTransfer, + where: token_transfer.to_address_hash == ^address.hash, + or_where: token_transfer.from_address_hash == ^address.hash + ) + + Repo.aggregate(query, :count, timeout: :infinity) + end + + @spec address_to_gas_usage_count(Address.t()) :: Decimal.t() | nil + def address_to_gas_usage_count(address) do + if contract?(address) do + incoming_transaction_gas_usage = address_to_incoming_transaction_gas_usage(address.hash) + + cond do + !incoming_transaction_gas_usage -> + address_to_outcoming_transaction_gas_usage(address.hash) + + Decimal.cmp(incoming_transaction_gas_usage, 0) == :eq -> + address_to_outcoming_transaction_gas_usage(address.hash) + + true -> + incoming_transaction_gas_usage + end + else + address_to_outcoming_transaction_gas_usage(address.hash) + end end - def balance_in_fiat(%{token: %{fiat_value: fiat_value, decimals: decimals}}) when nil in [fiat_value, decimals] do + @doc """ + Return the balance in usd corresponding to this token. Return nil if the usd_value of the token is not present. + """ + def balance_in_usd(%{token: %{usd_value: nil}}) do nil end - def balance_in_fiat(%{token: %{fiat_value: fiat_value, decimals: decimals}} = token_balance) do - tokens = CurrencyHelper.divide_decimals(token_balance.value, decimals) - Decimal.mult(tokens, fiat_value) + def balance_in_usd(token_balance) do + tokens = CurrencyHelpers.divide_decimals(token_balance.value, token_balance.token.decimals) + price = token_balance.token.usd_value + Decimal.mult(tokens, price) + end + + def address_tokens_usd_sum(token_balances) do + token_balances + |> Enum.reduce(Decimal.new(0), fn {token_balance, _, _}, acc -> + if token_balance.value && token_balance.token.usd_value do + Decimal.add(acc, balance_in_usd(token_balance)) + else + acc + end + end) end - def contract?(%{contract_code: nil}), do: false + defp contract?(%{contract_code: nil}), do: false - def contract?(%{contract_code: _}), do: true + defp contract?(%{contract_code: _}), do: true @doc """ Returns a stream of unfetched `t:Explorer.Chain.Address.CoinBalance.t/0`. @@ -1814,11 +2579,10 @@ defmodule Explorer.Chain do @spec stream_unfetched_balances( initial :: accumulator, reducer :: - (entry :: %{address_hash: Hash.Address.t(), block_number: Block.block_number()}, accumulator -> accumulator), - limited? :: boolean() + (entry :: %{address_hash: Hash.Address.t(), block_number: Block.block_number()}, accumulator -> accumulator) ) :: {:ok, accumulator} when accumulator: term() - def stream_unfetched_balances(initial, reducer, limited? \\ false) when is_function(reducer, 2) do + def stream_unfetched_balances(initial, reducer) when is_function(reducer, 2) do query = from( balance in CoinBalance, @@ -1826,9 +2590,7 @@ defmodule Explorer.Chain do select: %{address_hash: balance.address_hash, block_number: balance.block_number} ) - query - |> add_coin_balances_fetcher_limit(limited?) - |> Repo.stream_reduce(initial, reducer) + Repo.stream_reduce(query, initial, reducer) end @doc """ @@ -1836,13 +2598,11 @@ defmodule Explorer.Chain do """ @spec stream_unfetched_token_balances( initial :: accumulator, - reducer :: (entry :: TokenBalance.t(), accumulator -> accumulator), - limited? :: boolean() + reducer :: (entry :: TokenBalance.t(), accumulator -> accumulator) ) :: {:ok, accumulator} when accumulator: term() - def stream_unfetched_token_balances(initial, reducer, limited? \\ false) when is_function(reducer, 2) do + def stream_unfetched_token_balances(initial, reducer) when is_function(reducer, 2) do TokenBalance.unfetched_token_balances() - |> add_token_balances_fetcher_limit(limited?) |> Repo.stream_reduce(initial, reducer) end @@ -1850,36 +2610,44 @@ defmodule Explorer.Chain do Returns a stream of all blocks with unfetched internal transactions, using the `pending_block_operation` table. + Only blocks with consensus are returned. + + iex> non_consensus = insert(:block, consensus: false) + iex> insert(:pending_block_operation, block: non_consensus, fetch_internal_transactions: true) iex> unfetched = insert(:block) - iex> insert(:pending_block_operation, block: unfetched, block_number: unfetched.number) + iex> insert(:pending_block_operation, block: unfetched, fetch_internal_transactions: true) + iex> fetched = insert(:block) + iex> insert(:pending_block_operation, block: fetched, fetch_internal_transactions: false) iex> {:ok, number_set} = Explorer.Chain.stream_blocks_with_unfetched_internal_transactions( ...> MapSet.new(), ...> fn number, acc -> ...> MapSet.put(acc, number) ...> end ...> ) + iex> non_consensus.number in number_set + false iex> unfetched.number in number_set true + iex> fetched.hash in number_set + false """ @spec stream_blocks_with_unfetched_internal_transactions( initial :: accumulator, - reducer :: (entry :: term(), accumulator -> accumulator), - limited? :: boolean() + reducer :: (entry :: term(), accumulator -> accumulator) ) :: {:ok, accumulator} when accumulator: term() - def stream_blocks_with_unfetched_internal_transactions(initial, reducer, limited? \\ false) - when is_function(reducer, 2) do + def stream_blocks_with_unfetched_internal_transactions(initial, reducer) when is_function(reducer, 2) do query = from( - po in PendingBlockOperation, - where: not is_nil(po.block_number), - select: po.block_number + b in Block, + join: pending_ops in assoc(b, :pending_operations), + where: pending_ops.fetch_internal_transactions, + where: b.consensus, + select: b.number ) - query - |> add_fetcher_limit(limited?) - |> Repo.stream_reduce(initial, reducer) + Repo.stream_reduce(query, initial, reducer) end def remove_nonconsensus_blocks_from_pending_ops(block_hashes) do @@ -1926,23 +2694,20 @@ defmodule Explorer.Chain do | :value ], initial :: accumulator, - reducer :: (entry :: term(), accumulator -> accumulator), - limited? :: boolean() + reducer :: (entry :: term(), accumulator -> accumulator) ) :: {:ok, accumulator} when accumulator: term() - def stream_transactions_with_unfetched_created_contract_codes(fields, initial, reducer, limited? \\ false) + def stream_transactions_with_unfetched_created_contract_codes(fields, initial, reducer) when is_function(reducer, 2) do query = from(t in Transaction, where: not is_nil(t.block_hash) and not is_nil(t.created_contract_address_hash) and - is_nil(t.created_contract_code_indexed_at) and t.status == ^1, + is_nil(t.created_contract_code_indexed_at), select: ^fields ) - query - |> add_fetcher_limit(limited?) - |> Repo.stream_reduce(initial, reducer) + Repo.stream_reduce(query, initial, reducer) end @spec stream_mined_transactions( @@ -1994,16 +2759,14 @@ defmodule Explorer.Chain do | :value ], initial :: accumulator, - reducer :: (entry :: term(), accumulator -> accumulator), - limited? :: boolean() + reducer :: (entry :: term(), accumulator -> accumulator) ) :: {:ok, accumulator} when accumulator: term() - def stream_pending_transactions(fields, initial, reducer, limited? \\ false) when is_function(reducer, 2) do + def stream_pending_transactions(fields, initial, reducer) when is_function(reducer, 2) do query = Transaction |> pending_transactions_query() |> select(^fields) - |> add_fetcher_limit(limited?) Repo.stream_reduce(query, initial, reducer) end @@ -2018,20 +2781,17 @@ defmodule Explorer.Chain do """ @spec stream_unfetched_uncles( initial :: accumulator, - reducer :: (entry :: term(), accumulator -> accumulator), - limited? :: boolean() + reducer :: (entry :: term(), accumulator -> accumulator) ) :: {:ok, accumulator} when accumulator: term() - def stream_unfetched_uncles(initial, reducer, limited? \\ false) when is_function(reducer, 2) do + def stream_unfetched_uncles(initial, reducer) when is_function(reducer, 2) do query = from(bsdr in Block.SecondDegreeRelation, where: is_nil(bsdr.uncle_fetched_at) and not is_nil(bsdr.index), select: [:nephew_hash, :index] ) - query - |> add_fetcher_limit(limited?) - |> Repo.stream_reduce(initial, reducer) + Repo.stream_reduce(query, initial, reducer) end @doc """ @@ -2087,10 +2847,22 @@ defmodule Explorer.Chain do end @spec block_height() :: block_height() - def block_height(options \\ []) do + def block_height do query = from(block in Block, select: coalesce(max(block.number), 0), where: block.consensus == true) - select_repo(options).one!(query) + Repo.one!(query) + end + + def count_db_decompiled_contracts do + query = from(p in "pg_class", select: p.reltuples, where: p.relname == "decompiled_smart_contracts") + + query + |> Repo.one() + |> decompiled_contracts_count() + end + + defp decompiled_contracts_count(count) do + {:ok, count} end def last_db_block_status do @@ -2122,14 +2894,68 @@ defmodule Explorer.Chain do end end - @spec increment_last_fetched_counter(binary(), non_neg_integer()) :: {non_neg_integer(), nil} - def increment_last_fetched_counter(type, value) do - query = - from(counter in LastFetchedCounter, - where: counter.counter_type == ^type + def get_average_gas_price(num_of_blocks, safelow_percentile, average_percentile, fast_percentile) do + lates_gas_price_query = + from( + block in Block, + left_join: transaction in assoc(block, :transactions), + where: block.consensus == true, + where: transaction.status == ^1, + where: transaction.gas_price > ^0, + group_by: block.number, + order_by: [desc: block.number], + select: min(transaction.gas_price), + limit: ^num_of_blocks ) - Repo.update_all(query, [inc: [value: value]], timeout: :infinity) + latest_gas_prices = + lates_gas_price_query + |> Repo.all(timeout: :infinity) + + latest_ordered_gas_prices = + latest_gas_prices + |> Enum.map(fn %Explorer.Chain.Wei{value: gas_price} -> Decimal.to_integer(gas_price) end) + + safelow_gas_price = gas_price_percentile_to_gwei(latest_ordered_gas_prices, safelow_percentile) + average_gas_price = gas_price_percentile_to_gwei(latest_ordered_gas_prices, average_percentile) + fast_gas_price = gas_price_percentile_to_gwei(latest_ordered_gas_prices, fast_percentile) + + gas_prices = %{ + "slow" => safelow_gas_price, + "average" => average_gas_price, + "fast" => fast_gas_price + } + + {:ok, gas_prices} + catch + error -> + {:error, error} + end + + defp gas_price_percentile_to_gwei(gas_prices, percentile) do + safelow_gas_price_wei = percentile(gas_prices, percentile) + + if safelow_gas_price_wei do + safelow_gas_price_gwei = Wei.to(%Explorer.Chain.Wei{value: Decimal.from_float(safelow_gas_price_wei)}, :gwei) + Decimal.to_float(safelow_gas_price_gwei) |> Float.floor(1) + else + nil + end + end + + @spec percentile(list, number) :: number | nil + defp percentile([], _), do: nil + defp percentile([x], _), do: x + defp percentile(list, 0), do: Enum.min(list) + defp percentile(list, 100), do: Enum.max(list) + + defp percentile(list, n) when is_list(list) and is_number(n) do + s = Enum.sort(list) + r = n / 100.0 * (length(list) - 1) + f = :erlang.trunc(r) + lower = Enum.at(s, f) + upper = Enum.at(s, f + 1) + lower + (upper - lower) * (r - f) end @spec upsert_last_fetched_counter(map()) :: {:ok, LastFetchedCounter.t()} | {:error, Ecto.Changeset.t()} @@ -2142,7 +2968,7 @@ defmodule Explorer.Chain do ) end - def get_last_fetched_counter(type, options \\ []) do + def get_last_fetched_counter(type) do query = from( last_fetched_counter in LastFetchedCounter, @@ -2150,7 +2976,7 @@ defmodule Explorer.Chain do select: last_fetched_counter.value ) - select_repo(options).one(query) || Decimal.new(0) + Repo.one!(query) || Decimal.new(0) end defp block_status({number, timestamp}) do @@ -2166,31 +2992,30 @@ defmodule Explorer.Chain do defp block_status(nil), do: {:error, :no_blocks} - def fetch_min_missing_block_cache(from \\ nil, to \\ nil) do - from_block_number = from || 0 - to_block_number = to || BlockNumber.get_max() + def fetch_min_missing_block_cache do + max_block_number = BlockNumber.get_max() - if to_block_number > 0 do + if max_block_number > 0 do query = from(b in Block, right_join: missing_range in fragment( """ - (SELECT b1.number - FROM generate_series((?)::integer, (?)::integer) AS b1(number) + (SELECT b1.number + FROM generate_series(0, (?)::integer) AS b1(number) WHERE NOT EXISTS (SELECT 1 FROM blocks b2 WHERE b2.number=b1.number AND b2.consensus)) """, - ^from_block_number, - ^to_block_number + ^max_block_number ), on: b.number == missing_range.number, select: min(missing_range.number) ) - Repo.one(query, timeout: :infinity) + query + |> Repo.one(timeout: :infinity) || 0 else - nil + 0 end end @@ -2263,13 +3088,10 @@ defmodule Explorer.Chain do right_join: missing_range in fragment( """ - ( - SELECT distinct b1.number + (SELECT distinct b1.number FROM generate_series((?)::integer, (?)::integer) AS b1(number) WHERE NOT EXISTS - (SELECT 1 FROM blocks b2 WHERE b2.number=b1.number AND b2.consensus) - ORDER BY b1.number DESC - ) + (SELECT 1 FROM blocks b2 WHERE b2.number=b1.number AND b2.consensus)) """, ^range_min, ^range_max @@ -2308,27 +3130,27 @@ defmodule Explorer.Chain do ordered_block_ranges = final_block_ranges |> Enum.sort(fn %Range{first: first1, last: _}, %Range{first: first2, last: _} -> - if range_start <= range_end, do: first1 <= first2, else: first1 >= first2 + if range_start <= range_end do + first1 <= first2 + else + first1 >= first2 + end end) |> Enum.map(fn %Range{first: first, last: last} = range -> if range_start <= range_end do range else - set_new_range(last, first) + if last > first do + %Range{first: last, last: first, step: -1} + else + %Range{first: last, last: first, step: 1} + end end end) ordered_block_ranges end - defp set_new_range(last, first) do - if last > first, do: set_range(last, first, -1), else: set_range(last, first, 1) - end - - defp set_range(last, first, step) do - %Range{first: last, last: first, step: step} - end - defp block_ranges_extend(block_ranges, block_range_start, block_range_end) do # credo:disable-for-next-line block_ranges ++ [Range.new(block_range_start, block_range_end)] @@ -2344,7 +3166,7 @@ defmodule Explorer.Chain do `t:Explorer.Chain.Block.t/0` will not be included in the page `entries`. """ - @spec number_to_block(Block.block_number(), [necessity_by_association_option | api?]) :: + @spec number_to_block(Block.block_number(), [necessity_by_association_option]) :: {:ok, Block.t()} | {:error, :not_found} def number_to_block(number, options \\ []) when is_list(options) do necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) @@ -2352,18 +3174,7 @@ defmodule Explorer.Chain do Block |> where(consensus: true, number: ^number) |> join_associations(necessity_by_association) - |> select_repo(options).one() - |> case do - nil -> {:error, :not_found} - block -> {:ok, block} - end - end - - @spec nonconsensus_block_by_number(Block.block_number(), [api?]) :: {:ok, Block.t()} | {:error, :not_found} - def nonconsensus_block_by_number(number, options) do - Block - |> where(consensus: false, number: ^number) - |> select_repo(options).one() + |> Repo.one() |> case do nil -> {:error, :not_found} block -> {:ok, block} @@ -2394,10 +3205,16 @@ defmodule Explorer.Chain do limit: 1 ) - repo = if from_api, do: Repo.replica(), else: Repo + response = + if from_api do + query + |> Repo.replica().one() + else + query + |> Repo.one() + end - query - |> repo.one(timeout: :infinity) + response |> case do nil -> {:error, :not_found} @@ -2454,7 +3271,7 @@ defmodule Explorer.Chain do iex> newest_first_transactions = 50 |> insert_list(:transaction) |> with_block() |> Enum.reverse() iex> oldest_seen = Enum.at(newest_first_transactions, 9) iex> paging_options = %Explorer.PagingOptions{page_size: 10, key: {oldest_seen.block_number, oldest_seen.index}} - iex> recent_collated_transactions = Explorer.Chain.recent_collated_transactions(true, paging_options: paging_options) + iex> recent_collated_transactions = Explorer.Chain.recent_collated_transactions(paging_options: paging_options) iex> length(recent_collated_transactions) 10 iex> hd(recent_collated_transactions).hash == Enum.at(newest_first_transactions, 10).hash @@ -2470,24 +3287,12 @@ defmodule Explorer.Chain do the `block_number` and `index` that are passed. """ - @spec recent_collated_transactions(true | false, [paging_options | necessity_by_association_option | api?]) :: [ - Transaction.t() - ] - def recent_collated_transactions(old_ui?, options \\ []) - when is_list(options) do + @spec recent_collated_transactions([paging_options | necessity_by_association_option]) :: [Transaction.t()] + def recent_collated_transactions(options \\ []) when is_list(options) do necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) paging_options = Keyword.get(options, :paging_options, @default_paging_options) - method_id_filter = Keyword.get(options, :method) - type_filter = Keyword.get(options, :type) - - fetch_recent_collated_transactions( - old_ui?, - paging_options, - necessity_by_association, - method_id_filter, - type_filter, - options - ) + + fetch_recent_collated_transactions(paging_options, necessity_by_association) end # RAP - random access pagination @@ -2541,32 +3346,17 @@ defmodule Explorer.Chain do def transactions_available_count do Transaction |> where([transaction], not is_nil(transaction.block_number) and not is_nil(transaction.index)) - |> limit(^@limit_showing_transactions) + |> limit(^@limit_showing_transaсtions) |> Repo.aggregate(:count, :hash) end - def fetch_recent_collated_transactions( - old_ui?, - paging_options, - necessity_by_association, - method_id_filter, - type_filter, - options - ) do + def fetch_recent_collated_transactions(paging_options, necessity_by_association) do paging_options - |> Transaction.fetch_transactions() + |> fetch_transactions() |> where([transaction], not is_nil(transaction.block_number) and not is_nil(transaction.index)) - |> apply_filter_by_method_id_to_transactions(method_id_filter) - |> apply_filter_by_tx_type_to_transactions(type_filter) |> join_associations(necessity_by_association) - |> Transaction.put_has_token_transfers_to_tx(old_ui?) - |> (&if(old_ui?, do: preload(&1, [{:token_transfers, [:token, :from_address, :to_address]}]), else: &1)).() - |> select_repo(options).all() - |> (&if(old_ui?, - do: &1, - else: - Enum.map(&1, fn tx -> preload_token_transfers(tx, @token_transfers_necessity_by_association, options) end) - )).() + |> preload([{:token_transfers, [:token, :from_address, :to_address]}]) + |> Repo.all() end @doc """ @@ -2593,26 +3383,19 @@ defmodule Explorer.Chain do Results will be the transactions older than the `inserted_at` and `hash` that are passed. """ - @spec recent_pending_transactions([paging_options | necessity_by_association_option], true | false) :: [ - Transaction.t() - ] - def recent_pending_transactions(options \\ [], old_ui? \\ true) - when is_list(options) do + @spec recent_pending_transactions([paging_options | necessity_by_association_option]) :: [Transaction.t()] + def recent_pending_transactions(options \\ []) when is_list(options) do necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) paging_options = Keyword.get(options, :paging_options, @default_paging_options) - method_id_filter = Keyword.get(options, :method) - type_filter = Keyword.get(options, :type) Transaction - |> Transaction.page_pending_transaction(paging_options) + |> page_pending_transaction(paging_options) |> limit(^paging_options.page_size) |> pending_transactions_query() - |> apply_filter_by_method_id_to_transactions(method_id_filter) - |> apply_filter_by_tx_type_to_transactions(type_filter) - |> order_by([transaction], desc: transaction.inserted_at, asc: transaction.hash) + |> order_by([transaction], desc: transaction.inserted_at, desc: transaction.hash) |> join_associations(necessity_by_association) - |> (&if(old_ui?, do: preload(&1, [{:token_transfers, [:token, :from_address, :to_address]}]), else: &1)).() - |> select_repo(options).all() + |> preload([{:token_transfers, [:token, :from_address, :to_address]}]) + |> Repo.all() end def pending_transactions_query(query) do @@ -2631,6 +3414,32 @@ defmodule Explorer.Chain do |> Repo.all(timeout: :infinity) end + @doc """ + Returns the list of empty blocks from the DB which have not marked with `t:Explorer.Chain.Block.is_empty/0`. + This query used for initializtion of Indexer.EmptyBlocksSanitizer + """ + def unprocessed_empty_blocks_query_list(limit) do + query = + from(block in Block, + as: :block, + where: block.consensus == true, + where: is_nil(block.is_empty), + where: + not exists( + from(transaction in Transaction, + where: transaction.block_number == parent_as(:block).number + ) + ), + select: {block.number, block.hash}, + order_by: [desc: block.number], + limit: ^limit, + offset: 100 + ) + + query + |> Repo.all(timeout: :infinity) + end + @doc """ The `string` must start with `0x`, then is converted to an integer and then to `t:Explorer.Chain.Hash.Address.t/0`. @@ -2668,8 +3477,6 @@ defmodule Explorer.Chain do Hash.Address.cast(string) end - def string_to_address_hash(_), do: :error - @doc """ The `string` must start with `0x`, then is converted to an integer and then to `t:Explorer.Chain.Hash.t/0`. @@ -2695,8 +3502,6 @@ defmodule Explorer.Chain do Hash.Full.cast(string) end - def string_to_block_hash(_), do: :error - @doc """ The `string` must start with `0x`, then is converted to an integer and then to `t:Explorer.Chain.Hash.t/0`. @@ -2722,45 +3527,89 @@ defmodule Explorer.Chain do Hash.Full.cast(string) end - def string_to_transaction_hash(_), do: :error - @doc """ - `t:Explorer.Chain.InternalTransaction/0`s in `t:Explorer.Chain.Transaction.t/0` with `hash`. + Estimated count of `t:Explorer.Chain.Transaction.t/0`. - ## Options + Estimated count of both collated and pending transactions using the transactions table statistics. + """ + @spec transaction_estimated_count() :: non_neg_integer() + def transaction_estimated_count do + cached_value = TransactionCount.get_count() - * `:necessity_by_association` - use to load `t:association/0` as `:required` or `:optional`. If an association is - `:required`, and the `t:Explorer.Chain.InternalTransaction.t/0` has no associated record for that association, - then the `t:Explorer.Chain.InternalTransaction.t/0` will not be included in the list. - * `:paging_options` - a `t:Explorer.PagingOptions.t/0` used to specify the `:page_size` and - `:key` (a tuple of the lowest/oldest `{index}`). Results will be the internal transactions older than - the `index` that is passed. + if is_nil(cached_value) do + %Postgrex.Result{rows: [[rows]]} = + SQL.query!(Repo, "SELECT reltuples::BIGINT AS estimate FROM pg_class WHERE relname='transactions'") - """ + rows + else + cached_value + end + end - @spec all_transaction_to_internal_transactions(Hash.Full.t(), [ - paging_options | necessity_by_association_option | api? - ]) :: [ - InternalTransaction.t() - ] - def all_transaction_to_internal_transactions(hash, options \\ []) when is_list(options) do - necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) - paging_options = Keyword.get(options, :paging_options, @default_paging_options) + @spec total_gas_usage() :: non_neg_integer() + def total_gas_usage do + cached_value = GasUsage.get_sum() - InternalTransaction - |> for_parent_transaction(hash) + if is_nil(cached_value) do + 0 + else + cached_value + end + end + + @doc """ + Estimated count of `t:Explorer.Chain.Block.t/0`. + + Estimated count of consensus blocks. + """ + @spec block_estimated_count() :: non_neg_integer() + def block_estimated_count do + cached_value = BlockCount.get_count() + + if is_nil(cached_value) do + %Postgrex.Result{rows: [[count]]} = Repo.query!("SELECT reltuples FROM pg_class WHERE relname = 'blocks';") + + trunc(count * 0.90) + else + cached_value + end + end + + @doc """ + `t:Explorer.Chain.InternalTransaction/0`s in `t:Explorer.Chain.Transaction.t/0` with `hash`. + + ## Options + + * `:necessity_by_association` - use to load `t:association/0` as `:required` or `:optional`. If an association is + `:required`, and the `t:Explorer.Chain.InternalTransaction.t/0` has no associated record for that association, + then the `t:Explorer.Chain.InternalTransaction.t/0` will not be included in the list. + * `:paging_options` - a `t:Explorer.PagingOptions.t/0` used to specify the `:page_size` and + `:key` (a tuple of the lowest/oldest `{index}`). Results will be the internal transactions older than + the `index` that is passed. + + """ + + @spec all_transaction_to_internal_transactions(Hash.Full.t(), [paging_options | necessity_by_association_option]) :: [ + InternalTransaction.t() + ] + def all_transaction_to_internal_transactions(hash, options \\ []) when is_list(options) do + necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) + paging_options = Keyword.get(options, :paging_options, @default_paging_options) + + InternalTransaction + |> for_parent_transaction(hash) |> join_associations(necessity_by_association) |> InternalTransaction.where_nonpending_block() |> page_internal_transaction(paging_options) |> limit(^paging_options.page_size) |> order_by([internal_transaction], asc: internal_transaction.index) - |> select_repo(options).all() + |> preload(:transaction) + |> Repo.all() end - @spec transaction_to_internal_transactions(Hash.Full.t(), [paging_options | necessity_by_association_option | api?]) :: - [ - InternalTransaction.t() - ] + @spec transaction_to_internal_transactions(Hash.Full.t(), [paging_options | necessity_by_association_option]) :: [ + InternalTransaction.t() + ] def transaction_to_internal_transactions(hash, options \\ []) when is_list(options) do necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) paging_options = Keyword.get(options, :paging_options, @default_paging_options) @@ -2774,8 +3623,8 @@ defmodule Explorer.Chain do |> page_internal_transaction(paging_options) |> limit(^paging_options.page_size) |> order_by([internal_transaction], asc: internal_transaction.index) - |> preload(:block) - |> select_repo(options).all() + |> preload(:transaction) + |> Repo.all() end @doc """ @@ -2791,8 +3640,8 @@ defmodule Explorer.Chain do the `index` that are passed. """ - @spec transaction_to_logs(Hash.Full.t(), [paging_options | necessity_by_association_option | api?]) :: [Log.t()] - def transaction_to_logs(transaction_hash, options \\ []) when is_list(options) do + @spec transaction_to_logs(Hash.Full.t(), boolean(), [paging_options | necessity_by_association_option]) :: [Log.t()] + def transaction_to_logs(transaction_hash, from_api, options \\ []) when is_list(options) do necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) paging_options = Keyword.get(options, :paging_options, @default_paging_options) @@ -2807,13 +3656,18 @@ defmodule Explorer.Chain do query = log_with_transactions |> where([_, transaction], transaction.hash == ^transaction_hash) - |> page_transaction_logs(paging_options) + |> page_logs(paging_options) |> limit(^paging_options.page_size) |> order_by([log], asc: log.index) |> join_associations(necessity_by_association) - query - |> select_repo(options).all() + if from_api do + query + |> Repo.replica().all() + else + query + |> Repo.all() + end end @doc """ @@ -2829,13 +3683,12 @@ defmodule Explorer.Chain do the `index` that are passed. """ - @spec transaction_to_token_transfers(Hash.Full.t(), [paging_options | necessity_by_association_option | api?()]) :: [ + @spec transaction_to_token_transfers(Hash.Full.t(), [paging_options | necessity_by_association_option]) :: [ TokenTransfer.t() ] def transaction_to_token_transfers(transaction_hash, options \\ []) when is_list(options) do necessity_by_association = Keyword.get(options, :necessity_by_association, %{}) - paging_options = options |> Keyword.get(:paging_options, @default_paging_options) |> Map.put(:asc_order, true) - token_type = Keyword.get(options, :token_type) + paging_options = Keyword.get(options, :paging_options, @default_paging_options) TokenTransfer |> join(:inner, [token_transfer], transaction in assoc(token_transfer, :transaction)) @@ -2844,14 +3697,11 @@ defmodule Explorer.Chain do transaction.hash == ^transaction_hash and token_transfer.block_hash == transaction.block_hash and token_transfer.block_number == transaction.block_number ) - |> join(:inner, [tt], token in assoc(tt, :token), as: :token) - |> preload([token: token], [{:token, token}]) - |> TokenTransfer.filter_by_type(token_type) |> TokenTransfer.page_token_transfer(paging_options) |> limit(^paging_options.page_size) - |> order_by([token_transfer], asc: token_transfer.log_index) + |> order_by([token_transfer], asc: token_transfer.inserted_at) |> join_associations(necessity_by_association) - |> select_repo(options).all() + |> Repo.all() end @doc """ @@ -2934,20 +3784,16 @@ defmodule Explorer.Chain do Wei.hex_format(value) ) - revert_reason = + data = case EthereumJSONRPC.json_rpc(req, json_rpc_named_arguments) do {:error, %{data: data}} -> data - {:error, %{message: message}} -> - message - _ -> "" end - formatted_revert_reason = - revert_reason |> format_revert_reason_message() |> (&if(String.valid?(&1), do: &1, else: revert_reason)).() + formatted_revert_reason = format_revert_reason_message(data) if byte_size(formatted_revert_reason) > 0 do transaction @@ -2972,9 +3818,6 @@ defmodule Explorer.Chain do @revert_msg_prefix_4 <> rest -> extract_revert_reason_message_wrapper(rest) - @revert_msg_prefix_5 <> rest -> - extract_revert_reason_message_wrapper(rest) - revert_reason_full -> revert_reason_full end @@ -3009,7 +3852,12 @@ defmodule Explorer.Chain do The `t:Explorer.Chain.Transaction.t/0` or `t:Explorer.Chain.InternalTransaction.t/0` `value` of the `transaction` in `unit`. """ - @spec value(InternalTransaction.t() | Transaction.t(), :wei | :gwei | :ether) :: Wei.wei() | Wei.gwei() | Wei.ether() + @spec value(InternalTransaction.t(), :wei) :: Wei.wei() + @spec value(InternalTransaction.t(), :gwei) :: Wei.gwei() + @spec value(InternalTransaction.t(), :ether) :: Wei.ether() + @spec value(Transaction.t(), :wei) :: Wei.wei() + @spec value(Transaction.t(), :gwei) :: Wei.gwei() + @spec value(Transaction.t(), :ether) :: Wei.ether() def value(%type{value: value}, unit) when type in [InternalTransaction, Transaction] do Wei.to(value, unit) end @@ -3155,16 +4003,394 @@ defmodule Explorer.Chain do end end - defp fetch_transactions_in_ascending_order_by_index(paging_options) do + @doc """ + Inserts a `t:SmartContract.t/0`. + + As part of inserting a new smart contract, an additional record is inserted for + naming the address for reference. + """ + @spec create_smart_contract(map()) :: {:ok, SmartContract.t()} | {:error, Ecto.Changeset.t()} + def create_smart_contract(attrs \\ %{}, external_libraries \\ [], secondary_sources \\ []) do + new_contract = %SmartContract{} + + smart_contract_changeset = + new_contract + |> SmartContract.changeset(attrs) + |> Changeset.put_change(:external_libraries, external_libraries) + + new_contract_additional_source = %SmartContractAdditionalSource{} + + smart_contract_additional_sources_changesets = + if secondary_sources do + secondary_sources + |> Enum.map(fn changeset -> + new_contract_additional_source + |> SmartContractAdditionalSource.changeset(changeset) + end) + else + [] + end + + address_hash = Changeset.get_field(smart_contract_changeset, :address_hash) + + # Enforce ShareLocks tables order (see docs: sharelocks.md) + insert_contract_query = + Multi.new() + |> Multi.run(:set_address_verified, fn repo, _ -> set_address_verified(repo, address_hash) end) + |> Multi.run(:clear_primary_address_names, fn repo, _ -> clear_primary_address_names(repo, address_hash) end) + |> Multi.run(:insert_address_name, fn repo, _ -> + name = Changeset.get_field(smart_contract_changeset, :name) + create_address_name(repo, name, address_hash) + end) + |> Multi.insert(:smart_contract, smart_contract_changeset) + + insert_contract_query_with_additional_sources = + smart_contract_additional_sources_changesets + |> Enum.with_index() + |> Enum.reduce(insert_contract_query, fn {changeset, index}, multi -> + Multi.insert(multi, "smart_contract_additional_source_#{Integer.to_string(index)}", changeset) + end) + + insert_result = + insert_contract_query_with_additional_sources + |> Repo.transaction() + + case insert_result do + {:ok, %{smart_contract: smart_contract}} -> + {:ok, smart_contract} + + {:error, :smart_contract, changeset, _} -> + {:error, changeset} + + {:error, :set_address_verified, message, _} -> + {:error, message} + end + end + + @doc """ + Updates a `t:SmartContract.t/0`. + + Has the similar logic as create_smart_contract/1. + Used in cases when you need to update row in DB contains SmartContract, e.g. in case of changing + status `partially verified` to `fully verified` (re-verify). + """ + @spec update_smart_contract(map()) :: {:ok, SmartContract.t()} | {:error, Ecto.Changeset.t()} + def update_smart_contract(attrs \\ %{}, external_libraries \\ [], secondary_sources \\ []) do + address_hash = Map.get(attrs, :address_hash) + + query = + from( + smart_contract in SmartContract, + where: smart_contract.address_hash == ^address_hash + ) + + query_sources = + from( + source in SmartContractAdditionalSource, + where: source.address_hash == ^address_hash + ) + + _delete_sources = Repo.delete_all(query_sources) + + smart_contract = Repo.one(query) + + smart_contract_changeset = + smart_contract + |> SmartContract.changeset(attrs) + |> Changeset.put_change(:external_libraries, external_libraries) + + new_contract_additional_source = %SmartContractAdditionalSource{} + + smart_contract_additional_sources_changesets = + if secondary_sources do + secondary_sources + |> Enum.map(fn changeset -> + new_contract_additional_source + |> SmartContractAdditionalSource.changeset(changeset) + end) + else + [] + end + + # Enforce ShareLocks tables order (see docs: sharelocks.md) + insert_contract_query = + Multi.new() + |> Multi.update(:smart_contract, smart_contract_changeset) + + insert_contract_query_with_additional_sources = + smart_contract_additional_sources_changesets + |> Enum.with_index() + |> Enum.reduce(insert_contract_query, fn {changeset, index}, multi -> + Multi.insert(multi, "smart_contract_additional_source_#{Integer.to_string(index)}", changeset) + end) + + insert_result = + insert_contract_query_with_additional_sources + |> Repo.transaction() + + case insert_result do + {:ok, %{smart_contract: smart_contract}} -> + {:ok, smart_contract} + + {:error, :smart_contract, changeset, _} -> + {:error, changeset} + + {:error, :set_address_verified, message, _} -> + {:error, message} + end + end + + defp set_address_verified(repo, address_hash) do + query = + from( + address in Address, + where: address.hash == ^address_hash + ) + + case repo.update_all(query, set: [verified: true]) do + {1, _} -> {:ok, []} + _ -> {:error, "There was an error annotating that the address has been verified."} + end + end + + defp set_address_decompiled(repo, address_hash) do + query = + from( + address in Address, + where: address.hash == ^address_hash + ) + + case repo.update_all(query, set: [decompiled: true]) do + {1, _} -> {:ok, []} + _ -> {:error, "There was an error annotating that the address has been decompiled."} + end + end + + defp clear_primary_address_names(repo, address_hash) do + query = + from( + address_name in Address.Name, + where: address_name.address_hash == ^address_hash, + # Enforce Name ShareLocks order (see docs: sharelocks.md) + order_by: [asc: :address_hash, asc: :name], + lock: "FOR UPDATE" + ) + + repo.update_all( + from(n in Address.Name, join: s in subquery(query), on: n.address_hash == s.address_hash and n.name == s.name), + set: [primary: false] + ) + + {:ok, []} + end + + defp create_address_name(repo, name, address_hash) do + params = %{ + address_hash: address_hash, + name: name, + primary: true + } + + %Address.Name{} + |> Address.Name.changeset(params) + |> repo.insert(on_conflict: :nothing, conflict_target: [:address_hash, :name]) + end + + @doc """ + Finds metadata for verification of a contract from verified twins: contracts with the same bytecode + which were verified previously, returns a single t:SmartContract.t/0 + """ + def get_address_verified_twin_contract(address_hash) do + case Repo.get(Address, address_hash) do + nil -> + %{:verified_contract => nil, :additional_sources => nil} + + target_address -> + target_address_hash = target_address.hash + contract_code = target_address.contract_code + + case contract_code do + %Chain.Data{bytes: contract_code_bytes} -> + contract_code_md5 = + Base.encode16(:crypto.hash(:md5, "\\x" <> Base.encode16(contract_code_bytes, case: :lower)), + case: :lower + ) + + verified_contract_twin_query = + from( + address in Address, + inner_join: smart_contract in SmartContract, + on: address.hash == smart_contract.address_hash, + where: fragment("md5(contract_code::text)") == ^contract_code_md5, + where: address.hash != ^target_address_hash, + select: smart_contract, + limit: 1 + ) + + verified_contract_twin = + verified_contract_twin_query + |> Repo.one(timeout: 60_000) + + verified_contract_twin_additional_sources = get_contract_additional_sources(verified_contract_twin) + + %{ + :verified_contract => verified_contract_twin, + :additional_sources => verified_contract_twin_additional_sources + } + + _ -> + %{:verified_contract => nil, :additional_sources => nil} + end + end + end + + def get_minimal_proxy_template(address_hash) do + minimal_proxy_template = + case Repo.get(Address, address_hash) do + nil -> + nil + + target_address -> + contract_code = target_address.contract_code + + case contract_code do + %Chain.Data{bytes: contract_code_bytes} -> + contract_bytecode = Base.encode16(contract_code_bytes, case: :lower) + + get_minimal_proxy_from_template_code(contract_bytecode) + + _ -> + nil + end + end + + minimal_proxy_template + end + + defp get_minimal_proxy_from_template_code(contract_bytecode) do + case contract_bytecode do + "363d3d373d3d3d363d73" <> <