Merge pull request #12935 from MetaMask/Version-v10.8.0

Version v10.8.0 RC
feature/default_network_editable
Dan J Miller 3 years ago committed by GitHub
commit bb064c32fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 34
      .circleci/config.yml
  2. 4
      .circleci/scripts/chrome-install.sh
  3. 2
      .circleci/scripts/yarn-audit.sh
  4. 24
      CHANGELOG.md
  5. 3
      README.md
  6. 3
      app/_locales/am/messages.json
  7. 3
      app/_locales/ar/messages.json
  8. 3
      app/_locales/bg/messages.json
  9. 3
      app/_locales/bn/messages.json
  10. 3
      app/_locales/ca/messages.json
  11. 3
      app/_locales/da/messages.json
  12. 3
      app/_locales/de/messages.json
  13. 3
      app/_locales/el/messages.json
  14. 314
      app/_locales/en/messages.json
  15. 40
      app/_locales/es/messages.json
  16. 40
      app/_locales/es_419/messages.json
  17. 3
      app/_locales/et/messages.json
  18. 3
      app/_locales/fa/messages.json
  19. 3
      app/_locales/fi/messages.json
  20. 3
      app/_locales/fil/messages.json
  21. 3
      app/_locales/fr/messages.json
  22. 3
      app/_locales/he/messages.json
  23. 40
      app/_locales/hi/messages.json
  24. 3
      app/_locales/hr/messages.json
  25. 3
      app/_locales/hu/messages.json
  26. 40
      app/_locales/id/messages.json
  27. 40
      app/_locales/it/messages.json
  28. 40
      app/_locales/ja/messages.json
  29. 3
      app/_locales/kn/messages.json
  30. 40
      app/_locales/ko/messages.json
  31. 3
      app/_locales/lt/messages.json
  32. 3
      app/_locales/lv/messages.json
  33. 3
      app/_locales/ms/messages.json
  34. 3
      app/_locales/no/messages.json
  35. 40
      app/_locales/ph/messages.json
  36. 3
      app/_locales/pl/messages.json
  37. 40
      app/_locales/pt_BR/messages.json
  38. 3
      app/_locales/ro/messages.json
  39. 40
      app/_locales/ru/messages.json
  40. 3
      app/_locales/sk/messages.json
  41. 3
      app/_locales/sl/messages.json
  42. 3
      app/_locales/sr/messages.json
  43. 3
      app/_locales/sv/messages.json
  44. 3
      app/_locales/sw/messages.json
  45. 30
      app/_locales/tl/messages.json
  46. 3
      app/_locales/uk/messages.json
  47. 40
      app/_locales/vi/messages.json
  48. 88
      app/_locales/zh_CN/messages.json
  49. 3
      app/_locales/zh_TW/messages.json
  50. 1
      app/images/high-arrow.svg
  51. 26
      app/images/icons/collapse.svg
  52. 28
      app/images/icons/expand.svg
  53. 1
      app/images/low-arrow.svg
  54. 56
      app/images/qrcode-wallet-demo.svg
  55. 11
      app/images/qrcode-wallet-logo.svg
  56. BIN
      app/images/txinsights.png
  57. 15
      app/scripts/controllers/app-state.js
  58. 31
      app/scripts/controllers/preferences.js
  59. 36
      app/scripts/controllers/preferences.test.js
  60. 23
      app/scripts/controllers/swaps.js
  61. 4
      app/scripts/controllers/swaps.test.js
  62. 9
      app/scripts/controllers/transactions/index.js
  63. 25
      app/scripts/lib/message-manager.js
  64. 16
      app/scripts/lib/personal-message-manager.js
  65. 287
      app/scripts/metamask-controller.js
  66. 20
      app/scripts/metamask-controller.test.js
  67. 7
      app/scripts/platforms/extension.js
  68. 20
      development/build/transforms/remove-fenced-code.js
  69. 22
      development/build/transforms/remove-fenced-code.test.js
  70. 2
      development/jest.config.js
  71. 4
      docs/trezor-emulator.md
  72. 6
      jest.config.js
  73. 16
      jest.stories.config.js
  74. 403
      lavamoat/browserify/beta/policy.json
  75. 403
      lavamoat/browserify/flask/policy.json
  76. 403
      lavamoat/browserify/main/policy.json
  77. 3
      lavamoat/build-system/policy-override.json
  78. 215
      lavamoat/build-system/policy.json
  79. 26
      package.json
  80. 62
      patches/@babel+runtime+7.15.4.patch
  81. 13
      patches/acorn+7.4.1.patch
  82. 14
      patches/colors+1.4.0.patch
  83. 7
      patches/object.values+1.1.3.patch
  84. 14
      patches/sass+1.35.2.patch
  85. 11
      shared/constants/gas.js
  86. 10
      shared/constants/hardware-wallets.js
  87. 13
      shared/constants/swaps.js
  88. 16
      shared/modules/conversion.utils.js
  89. 41
      shared/modules/conversion.utils.test.js
  90. 36
      shared/modules/fetch-with-timeout.test.js
  91. 18
      shared/modules/hexstring-utils.test.js
  92. 19
      shared/notifications/index.js
  93. 27
      test/data/mock-estimates.json
  94. 4
      test/e2e/metamask-ui.spec.js
  95. 13
      test/e2e/tests/address-book.spec.js
  96. 3
      test/e2e/tests/from-import-ui.spec.js
  97. 2
      test/e2e/tests/send-edit.spec.js
  98. 4
      test/jest/constants.js
  99. 1
      test/jest/mock-store.js
  100. 1
      ui/components/app/account-menu/account-menu.component.js
  101. Some files were not shown because too many files have changed in this diff Show More

@ -12,7 +12,7 @@ executors:
NODE_OPTIONS: --max_old_space_size=2048
shellcheck:
docker:
- image: koalaman/shellcheck-alpine@sha256:35882cba254810c7de458528011e935ba2c4f3ebcb224275dfa7ebfa930ef294
- image: koalaman/shellcheck-alpine@sha256:dfaf08fab58c158549d3be64fb101c626abc5f16f341b569092577ae207db199
workflows:
test_and_release:
@ -25,10 +25,15 @@ workflows:
only:
- /^Version-v(\d+)[.](\d+)[.](\d+)/
- prep-deps
- test-deps-audit
- test-deps-audit:
requires:
- prep-deps
- test-deps-depcheck:
requires:
- prep-deps
- test-yarn-dedupe:
requires:
- prep-deps
- validate-lavamoat-config:
filters:
branches:
@ -51,9 +56,12 @@ workflows:
- prep-build-test-metrics:
requires:
- prep-deps
- prep-build-storybook:
- test-storybook:
requires:
- prep-deps
- prep-build-storybook:
requires:
- test-storybook
- test-lint:
requires:
- prep-deps
@ -330,6 +338,26 @@ jobs:
root: .
paths:
- storybook-build
test-storybook:
executor: node-browsers
steps:
- checkout
- attach_workspace:
at: .
- run:
name: Test Storybook
command: yarn storybook:test
test-yarn-dedupe:
executor: node-browsers
steps:
- checkout
- attach_workspace:
at: .
- run:
name: Detect yarn lock deduplications
command: yarn yarn-deduplicate && git diff --exit-code yarn.lock
test-lint:
executor: node-browsers

@ -5,12 +5,12 @@ set -u
set -o pipefail
# To get the latest version, see <https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable>
CHROME_VERSION='95.0.4638.69-1'
CHROME_VERSION='96.0.4664.45-1'
CHROME_BINARY="google-chrome-stable_${CHROME_VERSION}_amd64.deb"
CHROME_BINARY_URL="https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/${CHROME_BINARY}"
# To retrieve this checksum, run the `wget` and `shasum` commands below
CHROME_BINARY_SHA512SUM='f07d16ec0a41120c40064d030e9e5240ed740b9b24c50eaede7b9bfd9a9678821c0252b40bfcd57e933a708b08d761482c3be5b3006eee605c41f5dc9e21f456'
CHROME_BINARY_SHA512SUM='98433b003d43627e221faad212cba3df42d7f3d6e31894b1e14a9058069cbcd2bd3c83b3c59ecc1733dab11e36b181fa1d89e33b841a21fd53a8e82bbddc39aa'
wget -O "${CHROME_BINARY}" -t 5 "${CHROME_BINARY_URL}"

@ -1,6 +1,8 @@
#!/usr/bin/env bash
set -e
set -u
set -x
set -o pipefail
# use `improved-yarn-audit` since that allows for exclude

@ -6,13 +6,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [10.8.0]
### Added
- [#12881](https://github.com/MetaMask/metamask-extension/pull/12881): Feature: Transaction Insights
- Users can now see much greater details on contract interaction transactions
- These transaction details are integrated with new popups for viewing and editing address book information
- These details are also viewable within the transaction details popup
- [#12627](https://github.com/MetaMask/metamask-extension/pull/12627): Add support for eip-1559 on Trezor Model T and Trezor Model One
- [#12065](https://github.com/MetaMask/metamask-extension/pull/12065): Support QR code based hardware wallet signing
- Includes specific support for the Keystone hardware wallet
### Changed
- [#12842](https://github.com/MetaMask/metamask-extension/pull/12842): Improve performance of the swaps feature
- [#12776](https://github.com/MetaMask/metamask-extension/pull/12776): Hide the token detection announcement when the token detection is ON
- [#12828](https://github.com/MetaMask/metamask-extension/pull/12828): Clear the clipboard after the seed phrase is pasted into the import flow
- [#12576](https://github.com/MetaMask/metamask-extension/pull/12576): Show warning message when gas estimation estimates fail
### Fixed
- [#12802](https://github.com/MetaMask/metamask-extension/pull/12802): Fix bug causing occasional swaps failures for token pairs with highly precise exchange rates
- [#12679](https://github.com/MetaMask/metamask-extension/pull/12679): Ensure eth_sign callback fires even when data submitted is invalid
## [10.7.1]
### Fixed
- [#13005](https://github.com/MetaMask/metamask-extension/pull/13005): Fix connection to RPC urls with query strings.
## [10.7.0]
### Changed
- [#12643](https://github.com/MetaMask/metamask-extension/pull/12643): Reject popup confirmations on close
- [#12566](https://github.com/MetaMask/metamask-extension/pull/12566): Enable LavaMoat for the webapp background
- [#12399](https://github.com/MetaMask/metamask-extension/pull/12399): Update the "Account Details" view
- Change "Close" icon color from gray -> black
@ -2633,7 +2652,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Uncategorized
- Added the ability to restore accounts from seed words.
[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v10.7.1...HEAD
[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v10.8.0...HEAD
[10.8.0]: https://github.com/MetaMask/metamask-extension/compare/v10.7.1...v10.8.0
[10.7.1]: https://github.com/MetaMask/metamask-extension/compare/v10.7.0...v10.7.1
[10.7.0]: https://github.com/MetaMask/metamask-extension/compare/v10.6.4...v10.7.0
[10.6.4]: https://github.com/MetaMask/metamask-extension/compare/v10.6.3...v10.6.4

@ -1,8 +1,5 @@
# MetaMask Browser Extension
Hey! We are hiring JavaScript Engineers! [Apply here](https://boards.greenhouse.io/consensys/jobs/2572388)!
---
You can find the latest version of MetaMask on [our official website](https://metamask.io/). For help using MetaMask, visit our [User Support Site](https://metamask.zendesk.com/hc/en-us).
For [general questions](https://community.metamask.io/c/learn/26), [feature requests](https://community.metamask.io/c/feature-requests-ideas/13), or [developer questions](https://community.metamask.io/c/developer-questions/11), visit our [Community Forum](https://community.metamask.io/).

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "ተቀድቷል"
},
"copiedTransactionId": {
"message": "የተቀዳ የግብይት መለያ ቁጥር"
},
"copyAddress": {
"message": "አድራሻን ወደ ቅንጥብ ሰሌዳ ቅዳ"
},

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "تم النسخ."
},
"copiedTransactionId": {
"message": "تم نسخ معرف المعاملة"
},
"copyAddress": {
"message": "نسخ العنوان إلى الحافظة"
},

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Копирано!"
},
"copiedTransactionId": {
"message": "Копиран идентификационен номер на транзакцията"
},
"copyAddress": {
"message": "Копирайте адреса в клипборда"
},

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "কপি কর হয়!"
},
"copiedTransactionId": {
"message": "কপি করনদর আইডি"
},
"copyAddress": {
"message": "কিপবি কপি করন"
},

@ -215,9 +215,6 @@
"copiedExclamation": {
"message": "S'ha copiat!"
},
"copiedTransactionId": {
"message": "ID de transacció copiada"
},
"copyAddress": {
"message": "Copiar adreça al porta-retalls"
},

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Kopieret!"
},
"copiedTransactionId": {
"message": "Kopieret transaktions-id"
},
"copyAddress": {
"message": "Kopier adresse til udklipsholder"
},

@ -209,9 +209,6 @@
"copiedExclamation": {
"message": "Kopiert!"
},
"copiedTransactionId": {
"message": "Transaktions-ID kopiert"
},
"copyAddress": {
"message": "Adresse in die Zwischenablage kopieren"
},

@ -215,9 +215,6 @@
"copiedExclamation": {
"message": "Έγινε αντιγραφή!"
},
"copiedTransactionId": {
"message": "Αντιγράφηκε το Αναγνωριστικό Συναλλαγής"
},
"copyAddress": {
"message": "Αντιγράψτε τη διεύθυνση στο πρόχειρο"
},

@ -1,4 +1,49 @@
{
"QRHardwareInvalidTransactionTitle": {
"message": "Error"
},
"QRHardwareMismatchedSignId": {
"message": "Incongruent transaction data. Please check the transaction details."
},
"QRHardwarePubkeyAccountOutOfRange": {
"message": "No more accounts. If you would like to access another account unlisted below, please reconnect your hardware wallet and select it."
},
"QRHardwareScanInstructions": {
"message": "Place the QR code in front of your camera. The screen is blurred, but it will not affect the reading."
},
"QRHardwareSignRequestCancel": {
"message": "Reject"
},
"QRHardwareSignRequestDescription": {
"message": "After you’ve signed with your wallet, click on 'Get Signature' to receive the signature"
},
"QRHardwareSignRequestGetSignature": {
"message": "Get Signature"
},
"QRHardwareSignRequestSubtitle": {
"message": "Scan the QR code with your wallet"
},
"QRHardwareSignRequestTitle": {
"message": "Request Signature"
},
"QRHardwareUnknownQRCodeTitle": {
"message": "Error"
},
"QRHardwareUnknownWalletQRCode": {
"message": "Invalid QR code. Please scan the sync QR code of the hardware wallet."
},
"QRHardwareWalletImporterTitle": {
"message": "Scan QR Code"
},
"QRHardwareWalletSteps1Description": {
"message": "Connect an airgapped hardware wallet that communicates through QR-codes. Officially supported airgapped hardware wallets include:"
},
"QRHardwareWalletSteps1Title": {
"message": "QR-based HW Wallet"
},
"QRHardwareWalletSteps2Description": {
"message": "AirGap Vault & Ngrave (Coming Soon)"
},
"about": {
"message": "About"
},
@ -41,7 +86,7 @@
"message": "Activity"
},
"activityLog": {
"message": "activity log"
"message": "Activity log"
},
"add": {
"message": "Add"
@ -49,6 +94,9 @@
"addANetwork": {
"message": "Add a network"
},
"addANickname": {
"message": "Add a nickname"
},
"addAcquiredTokens": {
"message": "Add the tokens you've acquired using MetaMask"
},
@ -85,9 +133,15 @@
"addFriendsAndAddresses": {
"message": "Add friends and addresses you trust"
},
"addMemo": {
"message": "Add memo"
},
"addNFT": {
"message": "Add NFT"
},
"addNFTLowerCase": {
"message": "add NFT"
},
"addNetwork": {
"message": "Add Network"
},
@ -112,12 +166,21 @@
"advanced": {
"message": "Advanced"
},
"advancedBaseGasFeeToolTip": {
"message": "Any difference between your max base fee and the current base fee will be refunded after completion."
},
"advancedGasFeeModalTitle": {
"message": "Advanced gas fee"
},
"advancedGasPriceTitle": {
"message": "Gas price"
},
"advancedOptions": {
"message": "Advanced Options"
},
"advancedPriorityFeeToolTip": {
"message": "Priority fee (aka “miner tip”) goes directly to miners and incentivizes them to prioritize your transaction."
},
"advancedSettingsDescription": {
"message": "Access developer features, download State Logs, Reset Account, setup test networks and custom RPC"
},
@ -291,10 +354,6 @@
"message": "Swap",
"description": "This is used with viewOnEtherscan e.g View Swap on Etherscan"
},
"blockExplorerTransactionAction": {
"message": "Transaction",
"description": "This is used with viewOnCustomBlockExplorer and viewOnEtherscan e.g View Transaction on Etherscan"
},
"blockExplorerUrl": {
"message": "Block Explorer URL"
},
@ -317,6 +376,9 @@
"builtAroundTheWorld": {
"message": "MetaMask is designed and built around the world."
},
"busy": {
"message": "Busy"
},
"buy": {
"message": "Buy"
},
@ -347,6 +409,9 @@
"cancelPopoverTitle": {
"message": "Cancel transaction"
},
"cancelSpeedUp": {
"message": "cancel or speed up a tranaction."
},
"cancellationGasFee": {
"message": "Cancellation Gas Fee"
},
@ -512,15 +577,15 @@
"copiedExclamation": {
"message": "Copied!"
},
"copiedTransactionId": {
"message": "Copied Transaction ID"
},
"copyAddress": {
"message": "Copy address to clipboard"
},
"copyPrivateKey": {
"message": "This is your private key (click to copy)"
},
"copyRawTransactionData": {
"message": "Copy raw transaction data"
},
"copyToClipboard": {
"message": "Copy to clipboard"
},
@ -560,6 +625,9 @@
"currentLanguage": {
"message": "Current Language"
},
"currentTitle": {
"message": "Current:"
},
"currentlyUnavailable": {
"message": "Unavailable on this network"
},
@ -581,6 +649,9 @@
"dappSuggested": {
"message": "Site suggested"
},
"dappSuggestedShortLabel": {
"message": "Site"
},
"dappSuggestedTooltip": {
"message": "$1 has recommended this price.",
"description": "$1 represents the Dapp's origin"
@ -591,6 +662,9 @@
"dataBackupFoundInfo": {
"message": "Some of your account data was backed up during a previous installation of MetaMask. This could include your settings, contacts, and tokens. Would you like to restore this data now?"
},
"dataHex": {
"message": "Hex"
},
"decimal": {
"message": "Token Decimal"
},
@ -689,6 +763,12 @@
"edit": {
"message": "Edit"
},
"editANickname": {
"message": "Edit nickname"
},
"editAddressNickname": {
"message": "Edit address nickname"
},
"editContact": {
"message": "Edit Contact"
},
@ -710,6 +790,9 @@
"editGasEducationModalTitle": {
"message": "How to choose?"
},
"editGasFeeModalTitle": {
"message": "Edit gas fee"
},
"editGasHigh": {
"message": "High"
},
@ -755,21 +838,12 @@
"editGasPriceTooltip": {
"message": "This network requires a “Gas price” field when submitting a transaction. Gas price is the amount you will pay pay per unit of gas."
},
"editGasSubTextAmount": {
"message": "$1 $2",
"description": "$1 will be passed the editGasSubTextAmountLabel and $2 will be passed the amount in either cryptocurrency or fiat"
},
"editGasSubTextAmountLabel": {
"message": "Max amount:",
"description": "This is meant to be used as the $1 substitution editGasSubTextAmount"
},
"editGasSubTextFee": {
"message": "$1 $2",
"description": "$1 will be passed the editGasSubTextFeeLabel and $2 will be passed the fee amount in either cryptocurrency or fiat"
},
"editGasSubTextFeeLabel": {
"message": "Max fee:",
"description": "$1 represents a dollar amount"
"message": "Max fee:"
},
"editGasTitle": {
"message": "Edit priority"
@ -783,6 +857,12 @@
"editGasTooLowWarningTooltip": {
"message": "This lowers your maximum fee but if network traffic increases your transaction may be delayed or fail."
},
"editInGwei": {
"message": "Edit in GWEI"
},
"editInMultiplier": {
"message": "Edit in multiplier"
},
"editNonceField": {
"message": "Edit Nonce"
},
@ -795,6 +875,16 @@
"enableFromSettings": {
"message": " Enable it from Settings."
},
"enableOpenSeaAPI": {
"message": "Enable OpenSea API"
},
"enableOpenSeaAPIDescription": {
"message": "Use OpenSea's API to fetch NFT data. NFT auto-detection relies on OpenSea's API, and will not be available when this is turned off."
},
"enableToken": {
"message": "enable $1",
"description": "$1 is a token symbol, e.g. ETH"
},
"encryptionPublicKeyNotice": {
"message": "$1 would like your public encryption key. By consenting, this site will be able to compose encrypted messages to you.",
"description": "$1 is the web3 site name"
@ -966,6 +1056,21 @@
"message": "File import not working? Click here!",
"description": "Helps user import their account from a JSON file"
},
"flaskExperimentalText1": {
"message": "Using Flask can greatly increase your risk of fund loss:"
},
"flaskExperimentalText2": {
"message": "if you use it to install non-trustworthy Snaps"
},
"flaskExperimentalText3": {
"message": "if you do not review confirmations before approving changes"
},
"flaskExperimentalText4": {
"message": "if you interact with unfamiliar smart contracts"
},
"flaskExperimentalText5": {
"message": "Using Flask gives you much greater discretion in using the power of MetaMask, and that discretion is yours. Do you accept these risks as well as extra responsibility for your wallet's safety?"
},
"followUsOnTwitter": {
"message": "Follow us on Twitter"
},
@ -1011,6 +1116,9 @@
"message": "Gas limit must be at least $1",
"description": "$1 is the custom gas limit, in decimal."
},
"gasOption": {
"message": "Gas option"
},
"gasPrice": {
"message": "Gas Price (GWEI)"
},
@ -1029,13 +1137,18 @@
"gasPriceInfoTooltipContent": {
"message": "Gas price specifies the amount of Ether you are willing to pay for each unit of gas."
},
"gasPriceLabel": {
"message": "Gas price"
"gasTimingHoursShort": {
"message": "$1 hrs",
"description": "$1 represents a number of hours"
},
"gasTimingMinutes": {
"message": "$1 minutes",
"description": "$1 represents a number of minutes"
},
"gasTimingMinutesShort": {
"message": "$1 min",
"description": "$1 represents a number of minutes"
},
"gasTimingNegative": {
"message": "Maybe in $1",
"description": "$1 represents an amount of time"
@ -1048,6 +1161,10 @@
"message": "$1 seconds",
"description": "$1 represents a number of seconds"
},
"gasTimingSecondsShort": {
"message": "$1 sec",
"description": "$1 represents a number of seconds"
},
"gasTimingVeryPositive": {
"message": "Very likely in < $1",
"description": "$1 represents an amount of time"
@ -1276,6 +1393,12 @@
"message": "JSON File",
"description": "format for importing an account"
},
"keystone": {
"message": "Keystone"
},
"keystoneTutorial": {
"message": " (Tutorials)"
},
"knownAddressRecipient": {
"message": "Known contract address."
},
@ -1291,8 +1414,15 @@
"layer1Fees": {
"message": "Layer 1 fees"
},
"learmMoreAboutGas": {
"message": "Want to $1 about gas?"
},
"learnCancelSpeeedup": {
"message": "Learn how to $1",
"description": "$1 is link to cancel or speed up transactions"
},
"learnMore": {
"message": "Learn more"
"message": "learn more"
},
"learnScamRisk": {
"message": "scams and security risks."
@ -1496,6 +1626,9 @@
"mobileSyncWarning": {
"message": "The 'Sync with extension' feature is temporarily disabled. If you want to use your extension wallet on MetaMask mobile, then on your mobile app: go back to the wallet setup options and select the 'Import with Secret Recovery Phrase' option. Use your extension wallet's secret phrase to then import your wallet into mobile."
},
"multiplier": {
"message": "multiplier"
},
"mustSelectOne": {
"message": "Must select at least 1 token."
},
@ -1558,6 +1691,9 @@
"networkSettingsDescription": {
"message": "Add and edit custom RPC networks"
},
"networkStatus": {
"message": "Network status"
},
"networkURL": {
"message": "Network URL"
},
@ -1580,12 +1716,24 @@
"message": "Account $1",
"description": "Default name of next account to be created on create account screen"
},
"newCollectibleAddFailed": {
"message": "Collectible was not added because: $1"
},
"newCollectibleAddedMessage": {
"message": "Collectible was successfully added!"
},
"newContact": {
"message": "New Contact"
},
"newContract": {
"message": "New Contract"
},
"newNFTsDetected": {
"message": "New NFTs detected"
},
"newNFTsDetectedInfo": {
"message": "One or more new NFTs were detected in your wallet."
},
"newNetworkAdded": {
"message": "“$1” was successfully added!"
},
@ -1614,6 +1762,9 @@
"nfts": {
"message": "NFTs"
},
"nickname": {
"message": "Nickname"
},
"noAccountsFound": {
"message": "No accounts found for the given search query"
},
@ -1653,6 +1804,9 @@
"nonceFieldHeading": {
"message": "Custom Nonce"
},
"notBusy": {
"message": "Not busy"
},
"notCurrentAccount": {
"message": "Is this the correct account? It's different from the currently selected account in your wallet"
},
@ -1739,6 +1893,15 @@
"message": "Ledger connection improvement",
"description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device."
},
"notifications9DescriptionOne": {
"message": "We now provide you with more insights on the 'Data' tab when confirming smart contract transactions."
},
"notifications9DescriptionTwo": {
"message": "You can now get a better understanding of your transaction’s details before confirming, and more easily add transaction addresses to your address book, helping you make safe and informed decisions."
},
"notifications9Title": {
"message": "👓 We are making transactions easier to read."
},
"ofTextNofM": {
"message": "of"
},
@ -1861,6 +2024,16 @@
"pending": {
"message": "Pending"
},
"pendingTransactionInfo": {
"message": "This transaction will not process until that one is complete."
},
"pendingTransactionMultiple": {
"message": "You have ($1) pending transactions."
},
"pendingTransactionSingle": {
"message": "You have (1) pending transaction.",
"description": "$1 is count of pending transactions"
},
"permissionCheckedIconDescription": {
"message": "You have approved this permission"
},
@ -1893,6 +2066,9 @@
"primaryCurrencySettingDescription": {
"message": "Select native to prioritize displaying values in the native currency of the chain (e.g. ETH). Select Fiat to prioritize displaying values in your selected fiat currency."
},
"priorityFee": {
"message": "Priority Fee"
},
"privacyMsg": {
"message": "Privacy Policy"
},
@ -1906,6 +2082,9 @@
"privateNetwork": {
"message": "Private Network"
},
"proceedWithTransaction": {
"message": "I want to proceed anyway"
},
"proposedApprovalLimit": {
"message": "Proposed Approval Limit"
},
@ -2180,6 +2359,9 @@
"selectHdPath": {
"message": "Select HD Path"
},
"selectNFTPrivacyPreference": {
"message": "Select NFT privacy preference"
},
"selectPathHelp": {
"message": "If you don't see the accounts you expect, try switching the HD path."
},
@ -2287,6 +2469,12 @@
"signed": {
"message": "Signed"
},
"simulationErrorMessage": {
"message": "This transaction is expected to fail. Trying to execute it is expected to be expensive but fail, and is not recommended."
},
"simulationErrorMessageV2": {
"message": "We were not able to estimate gas. There might be an error in the contract and this transaction may fail."
},
"skip": {
"message": "Skip"
},
@ -2339,6 +2527,9 @@
"spendLimitTooLarge": {
"message": "Spend limit too large"
},
"stable": {
"message": "Stable"
},
"stateLogError": {
"message": "Error in retrieving state logs."
},
@ -2427,8 +2618,9 @@
"message": "You need $1 more $2 to complete this swap",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "A better quote is available"
"swapBestOfNQuotes": {
"message": "Best of $1 quotes.",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapBuildQuotePlaceHolderText": {
"message": "No tokens available matching $1",
@ -2459,12 +2651,9 @@
"message": "This is required and gives MetaMask permission to swap your $1.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "Estimated network fee"
},
"swapEstimatedNetworkFeeSummary": {
"message": "The “$1” is what we expect the actual fee to be. The exact amount depends on network conditions.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
"swapEnableTokenForSwapping": {
"message": "This will $1 for swapping",
"description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'"
},
"swapEstimatedNetworkFees": {
"message": "Estimated network fees"
@ -2511,16 +2700,13 @@
"swapHighSlippageWarning": {
"message": "Slippage amount is very high."
},
"swapIncludesMMFee": {
"message": "Includes a $1% MetaMask fee.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapLowSlippageError": {
"message": "Transaction may fail, max slippage too low."
},
"swapMaxNetworkFeeInfo": {
"message": "“$1” is the most you’ll spend. When the network is volatile this can be a large amount.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "Max network fee"
},
"swapMaxSlippage": {
"message": "Max slippage"
},
@ -2531,13 +2717,10 @@
"message": "We find the best price from the top liquidity sources, every time. A fee of $1% is automatically factored into this quote.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 quotes",
"swapNQuotesWithDot": {
"message": "$1 quotes.",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "The network fee covers the cost of processing your swap and storing it on the $1 network. MetaMask does not profit from this fee."
},
"swapNewQuoteIn": {
"message": "New quotes in $1",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -2572,10 +2755,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "If the price changes between the time your order is placed and confirmed it’s called \"slippage\". Your Swap will automatically cancel if slippage exceeds your \"slippage tolerance\" setting."
},
"swapQuoteIncludesRate": {
"message": "Quote includes a $1% MetaMask fee",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "Quote $1 of $2",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -2583,9 +2762,6 @@
"swapQuoteSource": {
"message": "Quote source"
},
"swapQuotesAreRefreshed": {
"message": "Quotes are refreshed often to reflect current market conditions."
},
"swapQuotesExpiredErrorDescription": {
"message": "Please request new quotes to get the latest rates."
},
@ -2646,9 +2822,6 @@
"swapSwapTo": {
"message": "Swap to"
},
"swapThisWillAllowApprove": {
"message": "This will allow $1 to be swapped."
},
"swapToConfirmWithHwWallet": {
"message": "to confirm with your hardware wallet"
},
@ -2691,9 +2864,6 @@
"swapUnknown": {
"message": "Unknown"
},
"swapUsingBestQuote": {
"message": "Using the best quote"
},
"swapVerifyTokenExplanation": {
"message": "Multiple tokens can use the same name and symbol. Check $1 to verify this is the token you're looking for.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
@ -2793,6 +2963,9 @@
"thisWillCreate": {
"message": "This will create a new wallet and Secret Recovery Phrase"
},
"time": {
"message": "Time"
},
"tips": {
"message": "Tips"
},
@ -2846,6 +3019,18 @@
"transactionCreated": {
"message": "Transaction created with a value of $1 at $2."
},
"transactionData": {
"message": "Transaction data"
},
"transactionDecodingAccreditationDecoded": {
"message": "Decoded by Truffle"
},
"transactionDecodingAccreditationVerified": {
"message": "Verified contract on $1"
},
"transactionDecodingUnsupportedNetworkError": {
"message": "Transaction decoding is not available for chainId $1"
},
"transactionDetailDappGasMoreInfo": {
"message": "Site suggested"
},
@ -2947,9 +3132,18 @@
"tryAgain": {
"message": "Try again"
},
"tryAnywayOption": {
"message": "I will try anyway"
},
"turnOnTokenDetection": {
"message": "Turn on enhanced token detection"
},
"twelveHrTitle": {
"message": "12hr:"
},
"txInsightsNotSupported": {
"message": "Transaction insights not supported for this contract at this time."
},
"typePassword": {
"message": "Type your MetaMask password"
},
@ -3008,6 +3202,12 @@
"urlExistsErrorMsg": {
"message": "This URL is currently used by the $1 network."
},
"useCollectibleDetection": {
"message": "Autodetect NFTs"
},
"useCollectibleDetectionDescription": {
"message": "Displaying NFTs media & data may expose your IP address to centralized servers. Third-party APIs (like OpenSea) are used to detect NFTs in your wallet. This exposes your account address with those services. Leave this disabled if you don’t want the app to pull data from those those services."
},
"usePhishingDetection": {
"message": "Use Phishing Detection"
},
@ -3023,6 +3223,9 @@
"usedByClients": {
"message": "Used by a variety of different clients"
},
"userAccepts": {
"message": "I accept"
},
"userName": {
"message": "Username"
},
@ -3053,6 +3256,9 @@
"viewMore": {
"message": "View More"
},
"viewOnBlockExplorer": {
"message": "View on block explorer"
},
"viewOnCustomBlockExplorer": {
"message": "View $1 at $2",
"description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL"

@ -416,9 +416,6 @@
"copiedExclamation": {
"message": "¡Copiado!"
},
"copiedTransactionId": {
"message": "Id. de transacción copiado"
},
"copyAddress": {
"message": "Copiar dirección al Portapapeles"
},
@ -1816,9 +1813,6 @@
"message": "Necesita $1 más $2 para completar este canje",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "Hay una mejor cotización disponible"
},
"swapBuildQuotePlaceHolderText": {
"message": "No hay tokens disponibles que coincidan con $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1845,13 +1839,6 @@
"message": "Esta acción es obligatoria y le da permiso a MetaMask para canjear su $1.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "Cuota de red estimada"
},
"swapEstimatedNetworkFeeSummary": {
"message": "“$1” es la cuota real que esperamos que sea. El monto exacto depende de las condiciones de la red.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "Cuotas de red estimadas"
},
@ -1887,13 +1874,6 @@
"swapLowSlippageError": {
"message": "Es posible que la transacción tenga errores, el desfase máximo es demasiado bajo."
},
"swapMaxNetworkFeeInfo": {
"message": "“$1” es el máximo que gastará. Cuando la red es volátil, puede ser un monto grande.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "Cuota máxima de red"
},
"swapMaxSlippage": {
"message": "Desfase máximo"
},
@ -1904,13 +1884,6 @@
"message": "Buscamos el mejor precio en las fuentes de liquidez más importantes, todo el tiempo. Se incorpora de manera automática a esta cotización una cuota del $1 %.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 cotizaciones",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "La cuota de red cubre el costo de procesamiento del canje y su almacenamiento en la red de $1. MetaMask no se beneficia de esta cuota."
},
"swapNewQuoteIn": {
"message": "Cotizaciones nuevas en $1",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1945,10 +1918,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "Si el precio cambia entre el momento en que hace el pedido y cuando se confirma, se denomina \"desfase\". El canje se cancelará automáticamente si el desfase supera lo establecido en la configuración \"tolerancia de desfase\"."
},
"swapQuoteIncludesRate": {
"message": "La cotización incluye una cuota de MetaMask de $1 %",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "Cotización $1 de $2",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1956,9 +1925,6 @@
"swapQuoteSource": {
"message": "Fuente de la cotización"
},
"swapQuotesAreRefreshed": {
"message": "Las cotizaciones se actualizan con frecuencia para reflejar las condiciones actuales del mercado."
},
"swapQuotesExpiredErrorDescription": {
"message": "Solicite cotizaciones nuevas para tener los costos más recientes."
},
@ -2019,9 +1985,6 @@
"swapSwapTo": {
"message": "Canjear a"
},
"swapThisWillAllowApprove": {
"message": "Esto permitirá canjear $1."
},
"swapToConfirmWithHwWallet": {
"message": "confirmar con la cartera de hardware"
},
@ -2060,9 +2023,6 @@
"swapUnknown": {
"message": "Desconocido"
},
"swapUsingBestQuote": {
"message": "Uso de la mejor cotización"
},
"swapVerifyTokenExplanation": {
"message": "Varios tokens pueden usar el mismo nombre y símbolo. Revise $1 para comprobar que este es el token que busca.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -416,9 +416,6 @@
"copiedExclamation": {
"message": "¡Copiado!"
},
"copiedTransactionId": {
"message": "Id. de transacción copiado"
},
"copyAddress": {
"message": "Copiar dirección al Portapapeles"
},
@ -1816,9 +1813,6 @@
"message": "Necesita $1 más $2 para completar este canje",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "Hay una mejor cotización disponible"
},
"swapBuildQuotePlaceHolderText": {
"message": "No hay tokens disponibles que coincidan con $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1845,13 +1839,6 @@
"message": "Esta acción es obligatoria y le da permiso a MetaMask para canjear su $1.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "Cuota de red estimada"
},
"swapEstimatedNetworkFeeSummary": {
"message": "“$1” es la cuota real que esperamos que sea. El monto exacto depende de las condiciones de la red.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "Cuotas de red estimadas"
},
@ -1887,13 +1874,6 @@
"swapLowSlippageError": {
"message": "Es posible que la transacción tenga errores, el desfase máximo es demasiado bajo."
},
"swapMaxNetworkFeeInfo": {
"message": "“$1” es el máximo que gastará. Cuando la red es volátil, puede ser un monto grande.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "Cuota máxima de red"
},
"swapMaxSlippage": {
"message": "Desfase máximo"
},
@ -1904,13 +1884,6 @@
"message": "Buscamos el mejor precio en las fuentes de liquidez más importantes, todo el tiempo. Se incorpora de manera automática a esta cotización una cuota del $1 %.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 cotizaciones",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "La cuota de red cubre el costo de procesamiento del canje y su almacenamiento en la red de $1. MetaMask no se beneficia de esta cuota."
},
"swapNewQuoteIn": {
"message": "Cotizaciones nuevas en $1",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1945,10 +1918,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "Si el precio cambia entre el momento en que hace el pedido y cuando se confirma, se denomina \"desfase\". El canje se cancelará automáticamente si el desfase supera lo establecido en la configuración \"tolerancia de desfase\"."
},
"swapQuoteIncludesRate": {
"message": "La cotización incluye una cuota de MetaMask de $1 %",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "Cotización $1 de $2",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1956,9 +1925,6 @@
"swapQuoteSource": {
"message": "Fuente de la cotización"
},
"swapQuotesAreRefreshed": {
"message": "Las cotizaciones se actualizan con frecuencia para reflejar las condiciones actuales del mercado."
},
"swapQuotesExpiredErrorDescription": {
"message": "Solicite cotizaciones nuevas para tener los costos más recientes."
},
@ -2019,9 +1985,6 @@
"swapSwapTo": {
"message": "Canjear a"
},
"swapThisWillAllowApprove": {
"message": "Esto permitirá canjear $1."
},
"swapToConfirmWithHwWallet": {
"message": "confirmar con la cartera de hardware"
},
@ -2060,9 +2023,6 @@
"swapUnknown": {
"message": "Desconocido"
},
"swapUsingBestQuote": {
"message": "Uso de la mejor cotización"
},
"swapVerifyTokenExplanation": {
"message": "Varios tokens pueden usar el mismo nombre y símbolo. Revise $1 para comprobar que este es el token que busca.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Kopeeritud!"
},
"copiedTransactionId": {
"message": "Kopeeritud tehingu ID"
},
"copyAddress": {
"message": "Kopeeri aadress lõikelauale"
},

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "کپی شد!"
},
"copiedTransactionId": {
"message": "آی دی معامله کاپی شده"
},
"copyAddress": {
"message": "کاپی آدرس به کلیپ بورد"
},

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Kopioitu"
},
"copiedTransactionId": {
"message": "Kopioitu tapahtuman tunnus"
},
"copyAddress": {
"message": "Kopioi osoite leikepöydälle"
},

@ -197,9 +197,6 @@
"copiedExclamation": {
"message": "Nakopya!"
},
"copiedTransactionId": {
"message": "Nakopya ang Transaction ID"
},
"copyAddress": {
"message": "Kopyahin ang address sa clipboard"
},

@ -209,9 +209,6 @@
"copiedExclamation": {
"message": "Copié!"
},
"copiedTransactionId": {
"message": "ID de transaction copié"
},
"copyAddress": {
"message": "Copier l'addresse dans le presse-papier"
},

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "הועתק!"
},
"copiedTransactionId": {
"message": "מזהה עסקה הועתק"
},
"copyAddress": {
"message": "העתק כתובת ללוח"
},

@ -416,9 +416,6 @@
"copiedExclamation": {
"message": "कि गय!"
},
"copiedTransactionId": {
"message": "क गई लनदन ID"
},
"copyAddress": {
"message": "किपबड पर पत कर"
},
@ -1816,9 +1813,6 @@
"message": "इस सप क करनिए आपक $1 और $2 क आवशयकत",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "एक बहतर उदधरण उपलबध ह"
},
"swapBuildQuotePlaceHolderText": {
"message": "$1 किन वई भकन उपलबध नह",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1845,13 +1839,6 @@
"message": "यह आवशयक ह और MetaMask क आपक $1 कप करन अनमति।",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "अनित नटवरक शक"
},
"swapEstimatedNetworkFeeSummary": {
"message": "“$1” वह शक ह, जिसक हम वतविक रप स उमद करत। सटक रिटवरक किि पर निभर करत।",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "अनित नटवरक शक"
},
@ -1887,13 +1874,6 @@
"swapLowSlippageError": {
"message": "लनदन विफल ह सकत, अधिकतम सिज बहत कम ह सकत।"
},
"swapMaxNetworkFeeInfo": {
"message": "आप सबस अधिक “$1” खरच करत। जब नटवरक असिर ह, त यह एक बडि सकत।",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "अधिकतम नटवरक शक"
},
"swapMaxSlippage": {
"message": "अधिकतम सिज"
},
@ -1904,13 +1884,6 @@
"message": "हम हर बर शष चलनिि सबस अचय प। इस उदधरण म $1% कक सवतिल ह।",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 उदधरण",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "नटवरक शक आपकप कित करनक और उस $1 नटवरक पर सरह करन कवर करत। MetaMask इस शक सभ नह कम।"
},
"swapNewQuoteIn": {
"message": "$1 म नए उदधरण",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1945,10 +1918,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "यदि आपक ऑरडर किए ज और पििए ज समय कच मय म परिवरतन ह, त इस \"सिज\" कह। यदििज आपक \"सिज टलरस\" सिग स अधिक ह, त आपकप सवत रदद हएग।"
},
"swapQuoteIncludesRate": {
"message": "उदधरण म $1% क MetaMask शक शिल ह",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "$2 म $1 उदधरण",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1956,9 +1925,6 @@
"swapQuoteSource": {
"message": "उदधरण कत"
},
"swapQuotesAreRefreshed": {
"message": "वरतमन बर कििरतििित करनिए उदधरण अकसर त रहत।"
},
"swapQuotesExpiredErrorDescription": {
"message": "कपय नवनतम दरत करनिए नए उदधरण अनध कर।"
},
@ -2019,9 +1985,6 @@
"swapSwapTo": {
"message": "इसमप कर"
},
"swapThisWillAllowApprove": {
"message": "यह $1 कप करन अनमति।"
},
"swapToConfirmWithHwWallet": {
"message": "अपनडवयर वट सि करनिए"
},
@ -2060,9 +2023,6 @@
"swapUnknown": {
"message": "अजत"
},
"swapUsingBestQuote": {
"message": "सरतम उदधरण क उपयग करन"
},
"swapVerifyTokenExplanation": {
"message": "एकिक टकन एक हम और परतक क उपयग कर सकत। यह सतित करनिए $1 कच करि यह वहकन ह, जिसक आप तलश कर रह।",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Kopirano!"
},
"copiedTransactionId": {
"message": "Kopirana identifikacijska oznaka transakcije"
},
"copyAddress": {
"message": "Kopiraj adresu u međuspremnik"
},

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Kimásolva!"
},
"copiedTransactionId": {
"message": "Másolt tranzakció-azonosító"
},
"copyAddress": {
"message": "Másolja a címet a vágólapra"
},

@ -416,9 +416,6 @@
"copiedExclamation": {
"message": "Disalin!"
},
"copiedTransactionId": {
"message": "ID Transaksi yang Disalin"
},
"copyAddress": {
"message": "Salin alamat ke clipboard"
},
@ -1816,9 +1813,6 @@
"message": "Anda memerlukan $1 lagi $2 untuk menyelesaikan penukaran ini",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "Kuota yang lebih baik tersedia"
},
"swapBuildQuotePlaceHolderText": {
"message": "Tidak ada token yang cocok yang tersedia $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1845,13 +1839,6 @@
"message": "Ini wajib dan memberikan MetaMask izin untuk menukar $1 Anda.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "Biaya jaringan yang diperkirakan"
},
"swapEstimatedNetworkFeeSummary": {
"message": "“$1” adalah yang kami harapkan untuk biaya yang seharusnya. Jumlah yang tepat tergantung pada kondisi jaringan.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "Biaya jaringan yang diperkirakan"
},
@ -1887,13 +1874,6 @@
"swapLowSlippageError": {
"message": "Transaksi bisa gagal, slippage maks. terlalu rendah."
},
"swapMaxNetworkFeeInfo": {
"message": "“$1” adalah yang paling banyak yang akan Anda gunakan. Bila jaringan tidak stabil ini bisa menjadi jumlah yang besar.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "Biaya jaringan maks."
},
"swapMaxSlippage": {
"message": "Maks. slippage"
},
@ -1904,13 +1884,6 @@
"message": "Kami menemukan harga terbaik dari sumber likuiditas teratas, setiap waktu. Biaya sebesar $1% otomatis diperhitungkan ke kuota ini.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 kuota",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "Biaya jaringan mencakup biaya pemrosesan penukaran Anda dan menyimpannya di jaringan $1. MetaMask tidak mendapatkan keuntungan dari biaya ini."
},
"swapNewQuoteIn": {
"message": "Kuota baru di $1",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1945,10 +1918,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "Jika harga berubah antara waktu pesanan Anda ditempatkan dan dikonfirmasi, ini disebut \"slippage\". Penukaran Anda akan otomatis dibatalkan jika slippage melebihi pengaturan \"toleransi slippage\"."
},
"swapQuoteIncludesRate": {
"message": "Kuota mencakup biaya MetaMask $1%",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "Kuota $1 dari $2",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1956,9 +1925,6 @@
"swapQuoteSource": {
"message": "Sumber kuota"
},
"swapQuotesAreRefreshed": {
"message": "Kuota disegarkan sering kali untuk menerapkan kondisi pasar terkini."
},
"swapQuotesExpiredErrorDescription": {
"message": "Silakan minta kuota baru untuk mendapatkan tarif terbaru."
},
@ -2019,9 +1985,6 @@
"swapSwapTo": {
"message": "Tukar untuk"
},
"swapThisWillAllowApprove": {
"message": "Ini akan memungkinkan $1 untuk ditukar."
},
"swapToConfirmWithHwWallet": {
"message": "untuk mengonfirmasikan dengan dompet perangkat keras Anda"
},
@ -2060,9 +2023,6 @@
"swapUnknown": {
"message": "Tidak diketahui"
},
"swapUsingBestQuote": {
"message": "Menggunakan kuota terbaik"
},
"swapVerifyTokenExplanation": {
"message": "Beberapa token dapat menggunakan simbol dan nama yang sama. Periksa $1 untuk memverifikasi inilah token yang Anda cari.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -356,9 +356,6 @@
"copiedExclamation": {
"message": "Copiato!"
},
"copiedTransactionId": {
"message": "ID Transazione Copiato"
},
"copyAddress": {
"message": "Copia l'indirizzo"
},
@ -1478,9 +1475,6 @@
"message": "Devi avere $1 $2 in più per completare lo scambio",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "È disponibile una quotazione migliore"
},
"swapBuildQuotePlaceHolderText": {
"message": "Non ci sono token disponibile con questo nome $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1498,13 +1492,6 @@
"message": "Questo è richiesto e darà a MetaMask il permesso di scambiare $1.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "Tassa di rete stimata"
},
"swapEstimatedNetworkFeeSummary": {
"message": "La “$1” è ciò che ci aspettiamo possa essere la tassa reale. L'importo esatto dipende dalle condizioni della rete.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "Tasse di rete stimate"
},
@ -1526,13 +1513,6 @@
"swapLowSlippageError": {
"message": "La transazione può fallire, il massimo slippage è troppo basso."
},
"swapMaxNetworkFeeInfo": {
"message": "“$1” è il massimo che spenderai. Quando la rete è volatile può essere un importo alto.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "Tassa di rete massima"
},
"swapMaxSlippage": {
"message": "Slippage massimo"
},
@ -1543,13 +1523,6 @@
"message": "Troviamo i migliori prezzi dalle sorgenti di liquidità migliori, sempre. Una tassa del $1% è automaticamente aggiunta ad ogni quotazione, ciò serve a supportare lo sviluppo in modo da rendere MetaMask sempre migliore.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 quotazioni",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "La tassa di rete copre il costo di processamento dello scambio e della memorizzazione nella rete $1. MetaMask non trae profitto da questa tassa."
},
"swapNewQuoteIn": {
"message": "Nuove quotazioni in $1",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1575,10 +1548,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "Si chiama \"slippage\" la differenza tra il prezzo quando il tuo ordine viene inserito e quando viene confermato. Lo scambio sarà annullato automaticamente se lo slippage supera il \"massimo slippage\" impostato."
},
"swapQuoteIncludesRate": {
"message": "La quotazione include la tassa del $1% di MetaMask",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "Quotazione $1 di $2",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1586,9 +1555,6 @@
"swapQuoteSource": {
"message": "Sorgente della quota"
},
"swapQuotesAreRefreshed": {
"message": "Le quotazioni sono aggiornate spesso per riflettere le condizioni di mercato correnti."
},
"swapQuotesExpiredErrorDescription": {
"message": "Richiedi nuove quotazioni per ottenere le ultime tariffe."
},
@ -1646,9 +1612,6 @@
"swapSwapTo": {
"message": "Scambia a"
},
"swapThisWillAllowApprove": {
"message": "Questo permetterà di scambiare $1."
},
"swapTokenAvailable": {
"message": "I $1 sono stati aggiunti al tuo account.",
"description": "This message is shown after a swap is successful and communicates the exact amount of tokens the user has received for a swap. The $1 is a decimal number of tokens followed by the token symbol."
@ -1674,9 +1637,6 @@
"swapUnknown": {
"message": "Sconosciuto"
},
"swapUsingBestQuote": {
"message": "Quotazione migliore"
},
"swapVerifyTokenExplanation": {
"message": "Più token possono usare lo stesso nome e simbolo. Verifica su $1 che questo sia il token che stai cercando.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -416,9 +416,6 @@
"copiedExclamation": {
"message": "コピーされました!"
},
"copiedTransactionId": {
"message": "コピーされたトランザクション ID"
},
"copyAddress": {
"message": "アドレスをクリップボードにコピー"
},
@ -1816,9 +1813,6 @@
"message": "このスワップを完了するには、さらに $1 個の $2 が必要です。",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "より適切な見積もりが利用可能です"
},
"swapBuildQuotePlaceHolderText": {
"message": "$1 と一致するトークンがありません",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1845,13 +1839,6 @@
"message": "これは必須であり、$1 をスワップするための MetaMask 許可を付与します。",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "推定のネットワーク手数料"
},
"swapEstimatedNetworkFeeSummary": {
"message": "“$1” は予定する実際の手数料です。正確な額はネットワークの状態によって異なります。",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "推定のネットワーク手数料"
},
@ -1887,13 +1874,6 @@
"swapLowSlippageError": {
"message": "トランザクションが失敗する可能性があります。最大スリッページが低すぎます。"
},
"swapMaxNetworkFeeInfo": {
"message": "“$1” は使用する最大量です。ネットワークが不安定なときは、これは大きな量になることがあります。",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "最大ネットワーク手数料"
},
"swapMaxSlippage": {
"message": "最大スリッページ"
},
@ -1904,13 +1884,6 @@
"message": "当社は毎回最上位の流動性のソースから最良の価格を見つけます。$1 の手数料が自動的にこの見積もりに含まれます。",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 の見積もり",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "ネットワーク手数料には、スワップを処理して $1 ネットワーク上に保管する費用も含まれています。MetaMask は手数料から利益を得ません。"
},
"swapNewQuoteIn": {
"message": "$1 での新規の見積もり",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1945,10 +1918,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "注文した時点と注文が承認された時点で価格が変わることを \"スリッページ\" と呼びます。スリッページが \"最大スリッページ\" 設定を超える場合、スワップは自動的にキャンセルされます。"
},
"swapQuoteIncludesRate": {
"message": "見積もりには $1% の MetaMask 手数料が含まれています",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "$2 個中の $1 個の見積もり",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1956,9 +1925,6 @@
"swapQuoteSource": {
"message": "見積もりのソース"
},
"swapQuotesAreRefreshed": {
"message": "現在のマーケット状態を反映するために、見積もりはたびたび更新されます。"
},
"swapQuotesExpiredErrorDescription": {
"message": "最新のレートを取得するには、新しい見積もりを要求してください。"
},
@ -2019,9 +1985,6 @@
"swapSwapTo": {
"message": "スワップ先"
},
"swapThisWillAllowApprove": {
"message": "これにより、$1 のスワップが可能になります。"
},
"swapToConfirmWithHwWallet": {
"message": "ハードウェア ウォレットで確認する"
},
@ -2060,9 +2023,6 @@
"swapUnknown": {
"message": "不明です"
},
"swapUsingBestQuote": {
"message": "最良の見積もりを使用する"
},
"swapVerifyTokenExplanation": {
"message": "複数のトークンが同じ名前とシンボルを使用できます。$1 をチェックして、これが探しているトークンであることを確認します。",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "ನಕಲಿಸಲಿ!"
},
"copiedTransactionId": {
"message": "ವಯವಹರ ID ಅನ ನಕಲಿಸಲಿ"
},
"copyAddress": {
"message": "ವಿಸವನಿ ನಕಲಿಿ"
},

@ -416,9 +416,6 @@
"copiedExclamation": {
"message": "복사 완료!"
},
"copiedTransactionId": {
"message": "거래 ID 복사됨"
},
"copyAddress": {
"message": "주소를 클립보드에 복사"
},
@ -1816,9 +1813,6 @@
"message": "이 스왑을 완료하려면 $1개의 추가 $2이(가) 필요합니다.",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "더 나은 견적이 있습니다."
},
"swapBuildQuotePlaceHolderText": {
"message": "$1와(과) 일치하는 토큰이 없습니다.",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1845,13 +1839,6 @@
"message": "필수이며 MetaMask에게 $1을(를) 스왑할 권한을 부여합니다.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "예상 네트워크 수수료"
},
"swapEstimatedNetworkFeeSummary": {
"message": "'$1'은(는) 당사가 예상하는 실제 수수료입니다. 정확한 금액은 네트워크 상태에 따라 달라집니다.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "예상 네트워크 수수료"
},
@ -1887,13 +1874,6 @@
"swapLowSlippageError": {
"message": "거래가 실패할 수도 있습니다. 최대 슬리패지가 너무 낮습니다."
},
"swapMaxNetworkFeeInfo": {
"message": "“$1”이(가) 최대 지출 금액입니다. 네트워크가 불안정한 경우 금액이 증가할 수 있습니다.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "최대 네트워크 수수료"
},
"swapMaxSlippage": {
"message": "최대 슬리패지"
},
@ -1904,13 +1884,6 @@
"message": "당사는 매번 최상의 유동성 소스에서 최적의 가격을 찾습니다. 이 견적에는 $1%의 수수료가 자동으로 반영됩니다.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 견적",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "네트워크 수수료에는 스왑을 처리하고 $1 네트워크에 보관하는 비용이 포함됩니다. MetaMask는 이 수수료로 수익을 얻지 않습니다."
},
"swapNewQuoteIn": {
"message": "$1의 새 견적",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1945,10 +1918,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "주문 시점과 확인 시점 사이에 가격이 변동되는 현상을 \"슬리패지\"라고 합니다. 슬리패지가 \"최대 슬리패지\" 설정을 초과하면 스왑이 자동으로 취소됩니다."
},
"swapQuoteIncludesRate": {
"message": "견적에는 $1% MetaMask 요금이 포함됩니다.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "$2의 $1 견적",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1956,9 +1925,6 @@
"swapQuoteSource": {
"message": "견적 소스"
},
"swapQuotesAreRefreshed": {
"message": "견적은 현재 시장 상황을 반영하도록 자주 갱신됩니다."
},
"swapQuotesExpiredErrorDescription": {
"message": "새 견적을 요청해 최신 요율을 확인하세요."
},
@ -2019,9 +1985,6 @@
"swapSwapTo": {
"message": "다음으로 스왑"
},
"swapThisWillAllowApprove": {
"message": "$1이(가) 스왑될 수 있도록 허용합니다."
},
"swapToConfirmWithHwWallet": {
"message": "하드웨어 지갑으로 확인하기 위해"
},
@ -2060,9 +2023,6 @@
"swapUnknown": {
"message": "알 수 없음"
},
"swapUsingBestQuote": {
"message": "최고 견적을 사용 중"
},
"swapVerifyTokenExplanation": {
"message": "여러 토큰이 같은 이름과 기호를 사용할 수 있습니다. $1을(를) 확인하여 원하는 토큰인지 확인하세요.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Nukopijuota!"
},
"copiedTransactionId": {
"message": "Nukopijuotas operacijos ID"
},
"copyAddress": {
"message": "Kopijuoti adresą į iškarpinę"
},

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Nokopēts!"
},
"copiedTransactionId": {
"message": "Nokopētais darījuma ID"
},
"copyAddress": {
"message": "Iekopēt adresi starpliktuvē"
},

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Disalin!"
},
"copiedTransactionId": {
"message": "ID Transaksi yang Disalin"
},
"copyAddress": {
"message": "Salin alamat kepada papan klip"
},

@ -215,9 +215,6 @@
"copiedExclamation": {
"message": "Kopiert!"
},
"copiedTransactionId": {
"message": "Kopiert transaksjonsidentifikasjon"
},
"copyAddress": {
"message": "Kopier adresse til utklippstavlen "
},

@ -416,9 +416,6 @@
"copiedExclamation": {
"message": "Nakopya na!"
},
"copiedTransactionId": {
"message": "Nakopya ang Transaction ID"
},
"copyAddress": {
"message": "Kopyahin ang address sa clipboard"
},
@ -1816,9 +1813,6 @@
"message": "Kailangan mo ng $1 pa $2 para makumpleto ang pag-swap na ito",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "May available na mas magandang quote"
},
"swapBuildQuotePlaceHolderText": {
"message": "Walang available na token na tumutugma sa $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1845,13 +1839,6 @@
"message": "Kinakailangan ito at nagbibigay ito ng pahintulot sa MetaMask na i-swap ang iyong $1.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "Tinatayang bayarin sa network"
},
"swapEstimatedNetworkFeeSummary": {
"message": "Ang “$1” ay ang inaasahan naming magiging aktuwal na bayarin. Ang eksaktong halaga ay nakadepende sa mga kundisyon ng network.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "Mga tinatayang bayarin sa network"
},
@ -1887,13 +1874,6 @@
"swapLowSlippageError": {
"message": "Posibleng hindi magtagumpay ang transaksyon, masyadong mababa ang max na slippage."
},
"swapMaxNetworkFeeInfo": {
"message": "“$1” ang pinakamalaking gagastusin mo. Kapag volatile ang network, maaaring malaking halaga ito.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "Max na bayarin sa network"
},
"swapMaxSlippage": {
"message": "Max na slippage"
},
@ -1904,13 +1884,6 @@
"message": "Hinahanap namin ang pinakasulit na presyo mula sa mga nangungunang pinagkukunan ng liquidity, sa lahat ng pagkakataon. Awtomatikong fina-factor ang bayaring $1% sa quote na ito.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 quote",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "Kasama sa bayarin sa network ang gastusin sa pagproseso ng iyong pag-swap at pag-store nito sa $1 network. Hindi kumikita ang MetaMask mula sa bayaring ito."
},
"swapNewQuoteIn": {
"message": "Mga bagong quote sa $1",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1945,10 +1918,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "Kung magbabago ang presyo sa pagitan ng oras ng pag-order mo at sa oras na nakumpirma ito, tinatawag itong \"slippage\". Awtomatikong makakansela ang iyong Pag-swap kung lalampas ang slippage sa iyong setting na \"tolerance ng slippage.\""
},
"swapQuoteIncludesRate": {
"message": "Kasama sa quote ang $1% bayarin sa MetaMask",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "Quote $1 ng $2",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1956,9 +1925,6 @@
"swapQuoteSource": {
"message": "Pinagkunan ng quote"
},
"swapQuotesAreRefreshed": {
"message": "Madalas na nire-refresh ang mga quote para maipakita ang mga kasalukuyang kundisyon ng market."
},
"swapQuotesExpiredErrorDescription": {
"message": "Mag-request ng mga bagong quote para makuha ang mga pinakabagong rate."
},
@ -2019,9 +1985,6 @@
"swapSwapTo": {
"message": "I-swap sa"
},
"swapThisWillAllowApprove": {
"message": "Mabibigyang-daan nito ang $1 na ma-swap."
},
"swapToConfirmWithHwWallet": {
"message": "para kumpirmahin ang iyong hardware wallet"
},
@ -2060,9 +2023,6 @@
"swapUnknown": {
"message": "Hindi Alam"
},
"swapUsingBestQuote": {
"message": "Gamit ang pinakamagandang quote"
},
"swapVerifyTokenExplanation": {
"message": "Maaaring gamitin ng maraming token ang iisang pangalan at simbolo. Suriin ang $1 para ma-verify na ito ang token na hinahanap mo.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Skopiowane!"
},
"copiedTransactionId": {
"message": "Skopiowano identyfikator transakcji"
},
"copyAddress": {
"message": "Skopiuj adres do schowka"
},

@ -416,9 +416,6 @@
"copiedExclamation": {
"message": "Copiado!"
},
"copiedTransactionId": {
"message": "ID da transação copiado"
},
"copyAddress": {
"message": "Copiar endereço para área de transferência"
},
@ -1816,9 +1813,6 @@
"message": "Você precisa de $1 mais $2 para concluir este swap",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "Uma cotação melhor está disponível"
},
"swapBuildQuotePlaceHolderText": {
"message": "Nenhum token disponível correspondente a $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1845,13 +1839,6 @@
"message": "Isso é obrigatório e dá ao MetaMask permissão para fazer o swap do seu $1.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "Taxa de rede estimada"
},
"swapEstimatedNetworkFeeSummary": {
"message": "O “$1” é o que esperamos que a taxa real seja. O valor exato depende das condições de rede.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "Taxas de rede estimadas"
},
@ -1887,13 +1874,6 @@
"swapLowSlippageError": {
"message": "A transação pode falhar; slippage máximo baixo demais."
},
"swapMaxNetworkFeeInfo": {
"message": "“$1” é o máximo que você gastará. Quando a rede for volátil, esse poderá ser um grande valor.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "Taxa máxima de rede"
},
"swapMaxSlippage": {
"message": "Slippage máximo"
},
@ -1904,13 +1884,6 @@
"message": "Encontramos o melhor preço das principais fontes de liquidez – todas as vezes. Uma taxa de $1% é automaticamente fatorada nesta cotação.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 cotações",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "A taxa de rede abrange o custo de processamento do seu swap e o armazenamento dele na rede $1. O MetaMask não lucra com essa taxa."
},
"swapNewQuoteIn": {
"message": "Novas cotações em $1",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1945,10 +1918,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "Quando o preço varia entre o momento em que seu pedido é feito e o momento em que é confirmado, isso recebe o nome de \"slippage\". Seu swap será automaticamente cancelado se o slippage for superior à configuração \"tolerância de slippage\"."
},
"swapQuoteIncludesRate": {
"message": "A cotação inclui uma taxa de $1% do MetaMask",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "Cotação $1 de $2",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1956,9 +1925,6 @@
"swapQuoteSource": {
"message": "Fonte da cotação"
},
"swapQuotesAreRefreshed": {
"message": "As cotações são atualizadas com frequência para refletir as condições atuais do mercado."
},
"swapQuotesExpiredErrorDescription": {
"message": "Solicite novas cotações para obter as tarifas mais recentes."
},
@ -2019,9 +1985,6 @@
"swapSwapTo": {
"message": "Swap para"
},
"swapThisWillAllowApprove": {
"message": "isso permitirá o swap de $1."
},
"swapToConfirmWithHwWallet": {
"message": "para confirmar com sua carteira de hardware"
},
@ -2060,9 +2023,6 @@
"swapUnknown": {
"message": "Desconhecido"
},
"swapUsingBestQuote": {
"message": "Usando a melhor cotação"
},
"swapVerifyTokenExplanation": {
"message": "Vários tokens podem usar o mesmo nome e símbolo. Confira $1 para verificar se esse é o token que você está buscando.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Copiat!"
},
"copiedTransactionId": {
"message": "ID-ul tranzacției a fost copiat"
},
"copyAddress": {
"message": "Copiere adresă în clipboard"
},

@ -416,9 +416,6 @@
"copiedExclamation": {
"message": "Скопировано!"
},
"copiedTransactionId": {
"message": "Скопированный идентификатор транзакции"
},
"copyAddress": {
"message": "Скопировать адрес в буфер обмена"
},
@ -1816,9 +1813,6 @@
"message": "Вам нужно еще $1 $2 для завершения этого свопа",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "Есть лучшая котировка"
},
"swapBuildQuotePlaceHolderText": {
"message": "Нет доступных токенов соответствующих $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1845,13 +1839,6 @@
"message": "Это необходимо и дает MetaMask разрешение на своп вашего $1.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "Ориентировочная комиссия сети"
},
"swapEstimatedNetworkFeeSummary": {
"message": "«$1» — это ожидаемая нами реальная комиссия. Точная сумма зависит от условий сети.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "Ориентировочные комиссии сети"
},
@ -1887,13 +1874,6 @@
"swapLowSlippageError": {
"message": "Транзакции могут завершиться неудачей, максимальное проскальзывание слишком мало."
},
"swapMaxNetworkFeeInfo": {
"message": "«$1» — это максимальная сумма, которую вы потратите. Когда сеть нестабильна, это может быть большая сумма.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "Максимальная комиссия за сеть"
},
"swapMaxSlippage": {
"message": "Максимальное проскальзывание"
},
@ -1904,13 +1884,6 @@
"message": "Мы всегда находим лучшую цену из лучших источников ликвидности. В эту котировку автоматически включается комиссия в размере $1%.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "Котировок: $1",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "Сетевая комиссия покрывает стоимость обработки вашего свопа и его хранения в сети $1. MetaMask не получает прибыли от этой комиссии."
},
"swapNewQuoteIn": {
"message": "Новые котировки в $1",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1945,10 +1918,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "Изменение цены в период между размещением заказа и подтверждением называется проскальзыванием. Своп будет автоматически отменен, если фактическое проскальзывание превысит установленное допустимое значение."
},
"swapQuoteIncludesRate": {
"message": "Котировка включает $1% MetaMask fee",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "Котировка $1 из $2",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1956,9 +1925,6 @@
"swapQuoteSource": {
"message": "Источник котировки"
},
"swapQuotesAreRefreshed": {
"message": "Котировки часто обновляются, чтобы отражать текущие рыночные условия."
},
"swapQuotesExpiredErrorDescription": {
"message": "Запрашивайте новые котировки, чтобы узнать последние цены."
},
@ -2019,9 +1985,6 @@
"swapSwapTo": {
"message": "Своп на"
},
"swapThisWillAllowApprove": {
"message": "Это позволит обмен $1."
},
"swapToConfirmWithHwWallet": {
"message": "подтвердить с помощью аппаратного кошелька"
},
@ -2060,9 +2023,6 @@
"swapUnknown": {
"message": "Неизвестный"
},
"swapUsingBestQuote": {
"message": "Используется лучшая котировка"
},
"swapVerifyTokenExplanation": {
"message": "Несколько токенов могут использовать одно и то же имя и символ. Убедитесь, что это именно тот токен, который вы ищете, на $1.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -212,9 +212,6 @@
"copiedExclamation": {
"message": "Zkopírováno!"
},
"copiedTransactionId": {
"message": "Kopírované ID transakcie"
},
"copyAddress": {
"message": "Kopírovať adresu do schránky"
},

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Kopirano!"
},
"copiedTransactionId": {
"message": "ID transakcije skopirana"
},
"copyAddress": {
"message": "Kopiraj naslov v odložišče"
},

@ -215,9 +215,6 @@
"copiedExclamation": {
"message": "Kopirano!"
},
"copiedTransactionId": {
"message": "Kopiran identifikator transakcije"
},
"copyAddress": {
"message": "Kopirajte adresu u ostavu"
},

@ -212,9 +212,6 @@
"copiedExclamation": {
"message": "Kopierades!"
},
"copiedTransactionId": {
"message": "Kopierade transaktions-ID"
},
"copyAddress": {
"message": "Kopiera adress till urklipp"
},

@ -212,9 +212,6 @@
"copiedExclamation": {
"message": "Imenakiliwa!"
},
"copiedTransactionId": {
"message": "Imenakili Utambulisho wa Muamala"
},
"copyAddress": {
"message": "Nakili anwani kwenye ubao wa kunakilia"
},

@ -344,9 +344,6 @@
"copiedExclamation": {
"message": "Nakopya na!"
},
"copiedTransactionId": {
"message": "Nakopya ang ID ng Transaksyon"
},
"copyAddress": {
"message": "Kopyahin ang address sa clipboard"
},
@ -1486,13 +1483,6 @@
"message": "Kinakailangan ito at nagbibigay ito ng pahintulot sa MetaMask na i-swap ang iyong $1.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "Tinatayang bayarin sa network"
},
"swapEstimatedNetworkFeeSummary": {
"message": "Ang “$1” ay ang inaasahan naming magiging aktuwal na bayarin. Ang eksaktong halaga ay nakadepende sa mga kundisyon ng network.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "Mga tinatayang bayarin sa network"
},
@ -1514,13 +1504,6 @@
"swapLowSlippageError": {
"message": "Maaaring hindi magtagumpay ang transaksyon, masyadong mababa ang max na slippage."
},
"swapMaxNetworkFeeInfo": {
"message": "Aang “$1” ay ang pinakamalaking gagastusin mo. Kapag volatile ang network, maaaring malaking halaga ito.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "Max na bayarin sa network"
},
"swapMaxSlippage": {
"message": "Max na slippage"
},
@ -1531,9 +1514,6 @@
"message": "Hinahanap namin ang pinakasulit na presyo mula sa mga nangungunang pinagkukunan ng liquidity, sa lahat ng pagkakataon. Ang bayarin na $1% ay awtomatikong fina-factor sa bawat quote, na sumusuporta sa kasalukuyang development para mas mapahusay ang MetaMask.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNetworkFeeSummary": {
"message": "Kasama sa bayarin sa network ang gastusin sa pagproseso ng iyong pag-swap at pag-store nito sa $1 network. Hindi kumikita ang MetaMask mula sa bayaring ito."
},
"swapNewQuoteIn": {
"message": "Mga bagong quote sa $1",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1551,10 +1531,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "Kung magbabago ang presyo sa pagitan ng oras ng pag-order mo at sa oras na nakumpirma ito, tinatawag itong \"slippage\". Awtomatikong makakansela ang iyong Pag-swap kung lalampas ang slippage sa iyong setting na \"max slippage\"."
},
"swapQuoteIncludesRate": {
"message": "Kasama sa quote ang $1% bayarin sa MetaMask",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "Quote $1 ng $2",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1562,9 +1538,6 @@
"swapQuoteSource": {
"message": "Pinagkunan ng quote"
},
"swapQuotesAreRefreshed": {
"message": "Madalas na nire-refresh ang mga quote para maipakita ang mga kasalukuyang kundisyon ng market."
},
"swapQuotesExpiredErrorDescription": {
"message": "Mag-request ng mga bagong quote para makuha ang mga pinakabagong rate."
},
@ -1619,9 +1592,6 @@
"swapSwapTo": {
"message": "Palitan ng"
},
"swapThisWillAllowApprove": {
"message": "Mabibigyang-daan nito ang $1 na ma-swap."
},
"swapTokenAvailable": {
"message": "Naidagdag na ang $1 sa iyong account.",
"description": "This message is shown after a swap is successful and communicates the exact amount of tokens the user has received for a swap. The $1 is a decimal number of tokens followed by the token symbol."

@ -218,9 +218,6 @@
"copiedExclamation": {
"message": "Скопійовано!"
},
"copiedTransactionId": {
"message": "ID Скопійованої транзакції"
},
"copyAddress": {
"message": "Копіювати адресу в буфер обміну"
},

@ -416,9 +416,6 @@
"copiedExclamation": {
"message": "Đã sao chép!"
},
"copiedTransactionId": {
"message": "Đã sao chép mã giao dịch"
},
"copyAddress": {
"message": "Sao chép địa chỉ vào khay nhớ tạm"
},
@ -1816,9 +1813,6 @@
"message": "Bạn cần $1 $2 nữa để hoàn tất giao dịch hoán đổi này",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "Có một báo giá tốt hơn"
},
"swapBuildQuotePlaceHolderText": {
"message": "Không có token nào khớp với $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1845,13 +1839,6 @@
"message": "Thao tác này là bắt buộc và cấp cho MetaMask quyền hoán đổi $1 của bạn.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "Phí mạng ước tính"
},
"swapEstimatedNetworkFeeSummary": {
"message": "“$1” là giá trị mà chúng tôi dự kiến sẽ là khoản phí thực sự. Số tiền chính xác phụ thuộc vào tình trạng mạng.",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "Phí mạng ước tính"
},
@ -1887,13 +1874,6 @@
"swapLowSlippageError": {
"message": "Giao dịch có thể không thành công, mức trượt giá tối đa quá thấp."
},
"swapMaxNetworkFeeInfo": {
"message": "“$1” là mức chi tiêu cao nhất của bạn. Khi mạng không ổn định, đây có thể là số tiền lớn.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "Phí mạng tối đa"
},
"swapMaxSlippage": {
"message": "Mức trượt giá tối đa"
},
@ -1904,13 +1884,6 @@
"message": "Chúng tôi luôn tìm giá tốt nhất từ các nguồn thanh khoản hàng đầu. Phí $1% được tự động tính vào báo giá này.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 báo giá",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "Phí mạng dùng để chi trả chi phí xử lý giao dịch hoán đổi của bạn và lưu trữ giao dịch đó trên mạng $1. MetaMask không thu lợi từ khoản phí này."
},
"swapNewQuoteIn": {
"message": "Báo giá mới sẽ có sau $1",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1945,10 +1918,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "Khi giá giữa thời điểm đặt lệnh và thời điểm xác nhận lệnh thay đổi, hiện tượng này được gọi là \"trượt giá\". Giao dịch hoán đổi của bạn sẽ tự động hủy nếu mức trượt giá vượt quá \"mức trượt giá cho phép\" đã đặt."
},
"swapQuoteIncludesRate": {
"message": "Báo giá có bao gồm khoản phí $1% cho MetaMask",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "Báo giá $1/$2",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1956,9 +1925,6 @@
"swapQuoteSource": {
"message": "Nguồn báo giá"
},
"swapQuotesAreRefreshed": {
"message": "Báo giá được làm mới thường xuyên để thể hiện tình trạng hiện tại của thị trường."
},
"swapQuotesExpiredErrorDescription": {
"message": "Vui lòng yêu cầu báo giá mới để biết các mức tỷ lệ mới nhất."
},
@ -2019,9 +1985,6 @@
"swapSwapTo": {
"message": "Hoán đổi sang"
},
"swapThisWillAllowApprove": {
"message": "Thao tác này sẽ cho phép hoán đổi $1."
},
"swapToConfirmWithHwWallet": {
"message": "để xác nhận ví cứng của bạn"
},
@ -2060,9 +2023,6 @@
"swapUnknown": {
"message": "Không xác định"
},
"swapUsingBestQuote": {
"message": "Sử dụng báo giá tốt nhất"
},
"swapVerifyTokenExplanation": {
"message": "Nhiều token có thể dùng cùng một tên và ký hiệu. Hãy kiểm tra $1 để xác minh xem đây có phải là token bạn đang tìm kiếm không.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -1,4 +1,46 @@
{
"QRHardwareInvalidTransactionTitle": {
"message": "非法交易"
},
"QRHardwareMismatchedSignId": {
"message": "扫描的签名二维码不属于当前交易,请检查交易详情后重试。"
},
"QRHardwarePubkeyAccountOutOfRange": {
"message": "暂无更多账户,若想切换到其他账户,请在硬件钱包中选择想要的账户重新同步。"
},
"QRHardwareScanInstructions": {
"message": "为了保护您的隐私,屏幕是模糊的,但不影响对二维码的读取。"
},
"QRHardwareSignRequestCancel": {
"message": "拒绝该交易"
},
"QRHardwareSignRequestDescription": {
"message": "硬件钱包扫描上方二维码完成签名后,点击“获取签名”按钮扫描已签名的二维码"
},
"QRHardwareSignRequestGetSignature": {
"message": "获取签名"
},
"QRHardwareSignRequestSubtitle": {
"message": "用硬件钱包扫描二维码"
},
"QRHardwareSignRequestTitle": {
"message": "获取签名"
},
"QRHardwareUnknownQRCodeTitle": {
"message": "非法二维码"
},
"QRHardwareUnknownWalletQRCode": {
"message": "请扫描硬件钱包的同步二维码。"
},
"QRHardwareWalletImporterTitle": {
"message": "扫描二维码"
},
"QRHardwareWalletSteps1Description": {
"message": "该类硬件钱包通过二维码实现通讯交互,做到完全脱网。官方支持的钱包有:"
},
"QRHardwareWalletSteps2Description": {
"message": "AirGap Vault & Ngrave (即将上线)"
},
"about": {
"message": "关于"
},
@ -353,9 +395,6 @@
"copiedExclamation": {
"message": "已复制"
},
"copiedTransactionId": {
"message": "交易 ID 复制成功"
},
"copyAddress": {
"message": "复制地址到剪贴板"
},
@ -835,6 +874,12 @@
"message": "JSON 文件",
"description": "format for importing an account"
},
"keystone": {
"message": "铠石钱包"
},
"keystoneTutorial": {
"message": " (使用教程)"
},
"knownAddressRecipient": {
"message": "已知接收方地址。"
},
@ -1472,9 +1517,6 @@
"message": "您还需 $1 $2 来完成这笔兑换",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapBetterQuoteAvailable": {
"message": "有一个可用的更优报价"
},
"swapBuildQuotePlaceHolderText": {
"message": "没有匹配的代币符合 $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -1492,13 +1534,6 @@
"message": "这是必须的,并且允许 MetaMask 兑换您的 $1。",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
},
"swapEstimatedNetworkFee": {
"message": "预计网络手续费"
},
"swapEstimatedNetworkFeeSummary": {
"message": "“$1”是我们预计的实际产生费用。具体数额视网络情况而定。",
"description": "$1 will be the translation of swapEstimatedNetworkFee, with the font bolded"
},
"swapEstimatedNetworkFees": {
"message": "预计网络手续费"
},
@ -1520,13 +1555,6 @@
"swapLowSlippageError": {
"message": "交易可能失败,最大滑点过低。"
},
"swapMaxNetworkFeeInfo": {
"message": "“$1”是您最多所话费的数量,当网络不稳定时,这可能是一个大的数额。",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
"message": "最大网络手续费"
},
"swapMaxSlippage": {
"message": "最大滑点"
},
@ -1537,13 +1565,6 @@
"message": "我们每次都能从顶级流动性资源中找到最好的价格。每次报价都会自动收取1%的手续费用,以支持 MetaMask 的持续发展,使其更加完善。",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
"message": "$1 个报价",
"description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen"
},
"swapNetworkFeeSummary": {
"message": "网络手续费包括处理您的兑换和在以太坊($1)网络上存储的成本。MetaMask 不从这笔费用中获利。"
},
"swapNewQuoteIn": {
"message": "$1 后更新报价",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
@ -1569,10 +1590,6 @@
"swapQuoteDetailsSlippageInfo": {
"message": "如果在您下订单和确认订单之间的价格发生了变化,这就叫做\"滑点\"。如果滑点超过您的\"最大滑点\"设置,您的兑换将自动取消。"
},
"swapQuoteIncludesRate": {
"message": "报价包含 $1% MetaMask 手续费",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
"message": "报价 $1 / $2",
"description": "A count of loaded quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of quotes to load."
@ -1580,9 +1597,6 @@
"swapQuoteSource": {
"message": "报价来源"
},
"swapQuotesAreRefreshed": {
"message": "报价会经常刷新,以反映当前的市场状况。"
},
"swapQuotesExpiredErrorDescription": {
"message": "请请求新的报价,以获得最新的价格。"
},
@ -1637,9 +1651,6 @@
"swapSwapTo": {
"message": "兑换到"
},
"swapThisWillAllowApprove": {
"message": "这样将允许 $1 用于兑换。"
},
"swapTokenAvailable": {
"message": "您的 $1 已添加到您的账户。",
"description": "This message is shown after a swap is successful and communicates the exact amount of tokens the user has received for a swap. The $1 is a decimal number of tokens followed by the token symbol."
@ -1654,9 +1665,6 @@
"swapUnknown": {
"message": "未知的"
},
"swapUsingBestQuote": {
"message": "使用最好的报价"
},
"swapVerifyTokenExplanation": {
"message": "多个代币可以使用相同的名称和符号。检查 $1(以太坊浏览器)以确认这是您正在寻找的代币。",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."

@ -227,9 +227,6 @@
"copiedExclamation": {
"message": "已複製!"
},
"copiedTransactionId": {
"message": "已複製的交易 ID"
},
"copyAddress": {
"message": "複製到剪貼簿"
},

@ -0,0 +1 @@
<svg width="14" height="14" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4.022 4.82c0 .275.22.469.483.482l3.26-.082L3.8 9.183a.451.451 0 0 0 0 .663l.442.442c.18.18.47.193.663 0l3.963-3.964-.082 3.232a.49.49 0 0 0 .47.497h.607a.484.484 0 0 0 .47-.47V4.199a.46.46 0 0 0-.456-.456H4.49a.484.484 0 0 0-.47.47v.607Z" fill="#219E37"/></svg>

After

Width:  |  Height:  |  Size: 347 B

@ -0,0 +1,26 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="16" height="16" fill="#E5E5E5"/>
<g clip-path="url(#clip0_0_1)">
<rect width="413" height="679" transform="translate(-57 -402)" fill="white"/>
<g filter="url(#filter0_d_0_1)">
<path d="M-31 -376C-31 -380.418 -27.4183 -384 -23 -384H321C325.418 -384 329 -380.418 329 -376V252C329 256.418 325.418 260 321 260H-23C-27.4183 260 -31 256.418 -31 252V-376Z" fill="white"/>
</g>
<circle cx="8" cy="8" r="7.5" fill="#F2F3F4" stroke="#D6D9DC"/>
<line x1="4.1001" y1="7.83325" x2="11.7668" y2="7.83325" stroke="#D6D9DC" stroke-linecap="round"/>
</g>
<rect x="-2918.5" y="-1621.5" width="9747" height="4874" stroke="black"/>
<defs>
<filter id="filter0_d_0_1" x="-58" y="-409" width="414" height="698" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="13.5"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.12594 0 0 0 0 0.182502 0 0 0 0 0.305378 0 0 0 0.26 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_0_1"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_0_1" result="shape"/>
</filter>
<clipPath id="clip0_0_1">
<rect width="413" height="679" fill="white" transform="translate(-57 -402)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,28 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="16" height="16" fill="#E5E5E5"/>
<g clip-path="url(#clip0_0_1)">
<rect width="413" height="679" transform="translate(-57 -546)" fill="white"/>
<g filter="url(#filter0_d_0_1)">
<path d="M-31 -520C-31 -524.418 -27.4183 -528 -23 -528H321C325.418 -528 329 -524.418 329 -520V108C329 112.418 325.418 116 321 116H-23C-27.4183 116 -31 112.418 -31 108V-520Z" fill="white"/>
</g>
<line x1="7.5" y1="-128" x2="7.49999" y2="8" stroke="#D6D9DC"/>
<circle cx="8" cy="8" r="7.5" fill="white" stroke="#D6D9DC"/>
<line x1="4.1001" y1="7.83325" x2="11.7668" y2="7.83325" stroke="#D6D9DC" stroke-linecap="round"/>
<line x1="8.1001" y1="4.16699" x2="8.1001" y2="11.8337" stroke="#D6D9DC" stroke-linecap="round"/>
</g>
<rect x="-2918.5" y="-1765.5" width="9747" height="4874" stroke="black"/>
<defs>
<filter id="filter0_d_0_1" x="-58" y="-553" width="414" height="698" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="13.5"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.12594 0 0 0 0 0.182502 0 0 0 0 0.305378 0 0 0 0.26 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_0_1"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_0_1" result="shape"/>
</filter>
<clipPath id="clip0_0_1">
<rect width="413" height="679" fill="white" transform="translate(-57 -546)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1 @@
<svg width="13" height="13" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9.296 8.42c0-.276-.22-.47-.483-.483l-3.26.083 3.964-3.964a.451.451 0 0 0 0-.663l-.442-.442a.463.463 0 0 0-.662 0L4.449 6.915l.083-3.232a.49.49 0 0 0-.47-.497h-.607a.484.484 0 0 0-.47.47v5.386a.46.46 0 0 0 .456.456h5.386a.484.484 0 0 0 .47-.47V8.42Z" fill="#D73A49"/></svg>

After

Width:  |  Height:  |  Size: 358 B

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="297px" height="101px" viewBox="0 0 297 101" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>png-chahua</title>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="png-chahua" transform="translate(1.000000, 0.000000)">
<g id="P-1">
<g id="png-key" transform="translate(0.000000, 22.000000)">
<circle id="oval" stroke="#3098DC" fill="#D9F0FF" cx="32" cy="32" r="32"></circle>
<g id="png_logo" transform="translate(15.850003, 11.617735)">
<path d="M13.4677287,26.0869239 C13.6814978,26.2099569 13.8780148,26.3607837 14.0521451,26.5354635 L20.8323207,33.3370367 C22.2800205,34.7893053 22.3263651,37.1092074 20.9740009,38.6170536 L20.8237527,38.7754247 C20.8235032,38.7756734 20.8232537,38.7759221 20.8230041,38.7761707 L19.8377351,39.7578004 C18.7942353,40.7974458 17.2102004,41.0696737 15.8794816,40.438055 L8.37983921,36.8783886 C6.63920381,36.052205 5.89789413,33.9713871 6.7240777,32.2307517 C6.76351709,32.1476593 6.80622708,32.066159 6.85210754,31.986442 L9.6565953,27.1136614 C10.425485,25.7777203 12.1317875,25.3180342 13.4677287,26.0869239 Z M16.4259709,0.276152586 C16.7491885,0.460847609 17.0173036,0.728398213 17.2026794,1.05122584 L18.5283228,3.35980278 C19.1466826,4.43666186 19.1460308,5.76104031 18.5266115,6.83729026 L3.68360588,32.6272236 C3.39176095,33.1343083 2.7441005,33.3087947 2.23701577,33.0169497 C2.07620665,32.9243985 1.94252531,32.7912356 1.8493499,32.6307873 C1.23868219,31.579216 0.773046665,30.4498818 0.465104842,29.2734937 L0.222743083,28.3476321 C-0.230049649,26.6178897 0.0132040067,24.7795765 0.900309637,23.2271354 L13.5700193,1.05505383 C14.1435809,0.0513169242 15.422234,-0.297409042 16.4259709,0.276152586 Z M22.314756,10.7149284 C22.7424128,10.9610537 23.0971746,11.3161563 23.3428892,11.7440492 L26.2513718,16.8089476 C27.0189573,18.1456385 26.5576062,19.8514916 25.2209153,20.6190771 C24.7979802,20.8619446 24.3187864,20.9897452 23.8310788,20.9897452 L17.4043388,20.9897452 C16.0556092,20.9897452 14.9622479,19.8963838 14.9622479,18.5476542 C14.9622479,18.1201149 15.0744902,17.7000673 15.2877511,17.3295143 L18.5036388,11.7417258 C19.2725074,10.4057726 20.9788028,9.94605968 22.314756,10.7149284 Z" id="combine" fill="#000000"></path>
<path d="M31.1744255,25.3821635 C31.8384048,26.538444 31.6433147,27.9964878 30.6987072,28.937535 L27.4928953,32.1312641 C26.2639847,33.3541704 24.2764867,33.3507256 23.0518226,32.1235666 L17.3441941,26.3978915 C16.6640589,25.7156057 16.6658022,24.6111453 17.348088,23.9310101 C17.6750575,23.6050712 18.1179052,23.422047 18.5795817,23.422047 L27.7885506,23.422047 C29.1867243,23.422047 30.4781713,24.1696784 31.1744255,25.3821635 Z" id="path" fill="#2161FF"></path>
</g>
</g>
<path d="M83,17.0235687 L73.4978847,30 L64.0002855,17.0235687 L73.4973317,22.4634417 L73.4978847,22.4646936 L83,17.0235687 Z M73.4973317,11.0923553 L82.9936676,15.2782188 L73.4978847,20.720593 L64.0002855,15.2782188 L73.4973317,11.0923553 Z M73.4970462,0 L82.9936676,15.2781544 L73.4978847,11.0897901 L64,15.2781544 L73.4970462,0 Z" id="combine" fill="#3098DC" fill-rule="nonzero"></path>
<g id="png-key" transform="translate(64.000000, 77.000000)" fill-rule="nonzero">
<g id="Airgap_Logo_sideways_color-xs">
<path d="M9.79205788,0.504426266 C9.79205788,0.0716219234 9.47417837,-0.113865652 9.09272297,0.0716219234 C9.09272297,0.0716219234 7.56690134,0.937230609 6.35895922,1.49369334 C4.96028939,2.11198525 2.73513285,2.73027717 1.33646303,2.97759394 C0.446400413,3.16308152 0.319248611,3.71954424 0.25567271,4.21417778 C0.192096809,5.01795727 0.128520908,6.00722434 0.128520908,6.81100384 C0.0649450067,8.91319636 -0.125782697,11.0772181 0.128520908,13.1175814 C0.25567271,14.3541652 0.637128117,15.7762367 1.20931123,16.8891621 C2.09937384,18.4967211 3.24374006,19.9806217 4.57883399,21.2172055 C5.97750381,22.4537894 9.02914707,23.8758608 9.02914707,23.8758608 C9.47417837,24.0613484 9.79205788,23.8758608 9.79205788,23.3812273 L9.79205788,0.504426266 Z" id="path" fill="#3098DC"></path>
<path d="M12.2079421,23.4430564 C12.2079421,23.8758608 12.5258216,24.1231776 12.9708529,23.93769 C12.9708529,23.93769 16.0224962,22.5156186 17.421166,21.2790347 C18.8198358,20.0424509 19.9642021,18.5585503 20.7906888,16.9509913 C21.3628719,15.8380658 21.7443273,14.4159944 21.8714791,13.1794106 C22.1257827,11.1390473 21.935055,8.91319636 21.8714791,6.87283303 C21.8714791,6.06905353 21.8079032,5.07978646 21.7443273,4.27600697 C21.6807514,3.71954424 21.5535996,3.16308152 20.663537,3.03942313 C19.2648671,2.79210637 17.0397106,2.17381445 15.6410408,1.55552253 C14.4966746,0.999059801 12.907277,0.133451115 12.907277,0.133451115 C12.5258216,-0.113865652 12.2079421,0.0716219234 12.2079421,0.566255458 L12.2079421,23.4430564 L12.2079421,23.4430564 Z" id="path" fill="#3098DC"></path>
<path d="M9.85563378,1.18454738 L9.8542943,3.37036304 C9.98221357,3.6905739 10.2954143,3.90503182 10.6821205,3.90503182 L10.6821205,3.90503182 L11.3814554,3.90503182 L11.3814554,4.09051939 L9.85479032,4.08954738 L9.85479032,8.54154738 L12.8437011,8.54222121 L12.8437011,13.7358733 L9.85479032,13.7355474 L9.85479032,17.8165474 L12.907277,17.8166 C13.8609156,17.8166 14.5602505,18.5585503 14.5602505,19.424159 C14.5602505,20.2897677 13.8609156,21.031718 12.907277,21.031718 L9.85479032,21.0315474 L9.85563378,22.9484229 L9.53775427,22.8247645 C8.01193265,22.1446434 6.42253512,21.4026931 5.214593,20.2897677 C3.94307498,19.1768422 2.92586056,17.6929416 2.16294974,16.2708702 C1.65434253,15.2816031 1.33646303,14.0450193 1.20931123,12.9320938 C0.955007622,11.0772181 1.14573533,9.16051313 1.20931123,7.30563737 C1.20931123,6.3163703 1.27288713,5.26527404 1.40003893,4.21417778 C1.40003893,4.21417778 4.26095448,3.53405667 6.29538332,2.79210637 C7.50332544,2.29747283 8.64769166,1.8028393 9.85563378,1.18454738 Z" id="combine" fill="#FFFFFF"></path>
<path d="M12.3350939,1.18454738 C13.4158842,1.8028393 14.5602505,2.35930202 15.7681926,2.79210637 C17.7390455,3.59588586 20.663537,4.21417778 20.663537,4.21417778 L20.663537,4.21417778 L20.8542647,7.36746656 C20.9178406,9.22234232 21.0449924,11.1390473 20.8542647,12.993923 C20.7271129,14.1068485 20.4092334,15.3434323 19.9006262,16.3326994 C19.0741394,17.7547708 18.1205009,19.2386714 16.8489829,20.3515969 C15.5774649,21.4645223 14.0516433,22.2064726 12.5258216,22.8865937 L12.5258216,22.8865937 L12.3350939,23.0102521 L12.3343299,17.8165474 L8.32981215,17.8166 C7.56690134,17.8166 6.99471823,17.1983081 6.99471823,16.4563578 C6.99471823,15.7144075 7.63047724,15.1579447 8.32981215,15.1579447 L12.3343299,15.1575474 L12.3343299,12.3135474 L10.8728482,12.3138019 C10.3006651,12.3138019 9.85563378,11.8191684 9.85563378,11.2627056 C9.85563378,10.9631464 9.98460231,10.699423 10.1929484,10.5197638 L8.39338805,10.5207553 C7.24902183,10.5207553 6.35895922,9.59331747 6.42253512,8.54222121 C6.42253512,7.49112495 7.31259773,6.62551626 8.39338805,6.62551626 L12.3343299,6.62454738 Z" id="combine" fill="#3098DC"></path>
<path d="M14.5602505,6.56368707 L4.83313759,6.56368707 C4.07022678,6.56368707 3.49804367,5.94539515 3.49804367,5.20344485 C3.49804367,4.46149455 4.13380268,3.90503182 4.83313759,3.90503182 L14.5602505,3.90503182 C15.3231613,3.90503182 15.8953444,4.52332374 15.8953444,5.26527404 C15.8317685,6.00722434 15.2595854,6.56368707 14.5602505,6.56368707 Z" id="path" fill="#FFFFFF"></path>
<path d="M14.0516433,15.1579447 L4.83313759,15.1579447 C4.00665088,15.1579447 3.37089187,14.5396528 3.37089187,13.7358733 C3.37089187,12.9320938 4.00665088,12.3138019 4.83313759,12.3138019 L14.1152192,12.3138019 C14.9417059,12.3138019 15.5774649,12.9320938 15.5774649,13.7358733 C15.5774649,14.5396528 14.87813,15.1579447 14.0516433,15.1579447 L14.0516433,15.1579447 Z" id="path" fill="#FFFFFF"></path>
</g>
</g>
</g>
<g id="Group" transform="translate(187.000000, 17.000000)">
<g id="cp" stroke="#3098DC">
<path d="M10,0 L98,0 C100.209139,-4.05812251e-16 102,1.790861 102,4 L102,69 L102,69 L6,69 L6,4 C6,1.790861 7.790861,2.18216909e-15 10,0 Z" id="rectangle" fill="#FFFFFF"></path>
<rect id="rectangle" fill="#FFFFFF" x="10.5" y="4.5" width="87" height="57"></rect>
<rect id="rectangle" fill="#D9F0FF" x="0" y="66" width="108" height="7" rx="1"></rect>
</g>
<g id="5" transform="translate(35.000000, 17.000000)" fill-rule="nonzero">
<g id="4">
<path d="M35.7940726,0.865647154 L37.3076975,5.33187939 L36.0572619,11.2664578 L35.3130052,12.3918268 L36.2488109,13.108213 L35.0978726,14.1466087 L35.8822714,14.7050297 L34.478956,16.3199413 L37.0166977,24.0476925 L34.9619918,30.9406553 L27.2570674,28.8445942 L25.4588663,30.2992958 L22.489449,32.3310811 L15.4970666,32.3310811 L12.5415596,30.2997394 L10.7428766,28.8445914 L3.03908343,30.9403669 L0.996819559,24.0470926 L3.50539453,16.3206129 L2.11516087,14.7068706 L2.90215816,14.146619 L1.74643066,13.1038982 L2.66706954,12.387498 L1.5590983,11.552182 L0.692123065,5.33103555 L2.19338019,0.865960951 L13.1228366,4.89862071 L24.8771779,4.89862071 L35.7940726,0.865647154 Z" id="symbol" stroke="#3098DC" stroke-width="1.33783784"></path>
<path d="M20.5,27.5 L21,30 L16.5,30 L17,27.5 L20.5,27.5 Z M14.3439693,19.0321194 L15.8156414,22.0321194 L10.8156414,20.6010552 L14.3439693,19.0321194 Z M23.2820965,19.0321194 L26.8156414,20.6010552 L21.8156414,22.0321194 L23.2820965,19.0321194 Z" id="combine" fill="#3098DC"></path>
</g>
</g>
</g>
<g id="code" transform="translate(82.000000, 37.000000)">
<g id="p-2" transform="translate(26.000000, 0.000000)" fill="#3098DC" fill-rule="nonzero">
<g id="qr_code">
<path d="M1.94444444,11.6666667 L9.72222222,11.6666667 C10.7961092,11.6666667 11.6666667,10.7961092 11.6666667,9.72222222 L11.6666667,1.94444444 C11.6666667,0.870557431 10.7961092,0 9.72222222,0 L1.94444444,0 C0.870557431,0 0,0.870557431 0,1.94444444 L0,9.72222222 C0,10.7961092 0.870557431,11.6666667 1.94444444,11.6666667 Z M3.88888889,3.88888889 L7.77777778,3.88888889 L7.77777778,7.77777778 L3.88888889,7.77777778 L3.88888889,3.88888889 Z M0.972222222,19.4444444 L2.91666667,19.4444444 C3.45361017,19.4444444 3.88888889,19.0091657 3.88888889,18.4722222 L3.88888889,16.5277778 C3.88888889,15.9908343 3.45361017,15.5555556 2.91666667,15.5555556 L0.972222222,15.5555556 C0.435278715,15.5555556 0,15.9908343 0,16.5277778 L0,18.4722222 C0,19.0091657 0.435278715,19.4444444 0.972222222,19.4444444 Z M9.72222222,23.3333333 L1.94444444,23.3333333 C0.870557431,23.3333333 0,24.2038908 0,25.2777778 L0,33.0555556 C0,34.1294426 0.870557431,35 1.94444444,35 L9.72222222,35 C10.7961092,35 11.6666667,34.1294426 11.6666667,33.0555556 L11.6666667,25.2777778 C11.6666667,24.2038908 10.7961092,23.3333333 9.72222222,23.3333333 Z M7.77777778,31.1111111 L3.88888889,31.1111111 L3.88888889,27.2222222 L7.77777778,27.2222222 L7.77777778,31.1111111 Z M28.1944444,35 L34.0277778,35 C34.5647213,35 35,34.5647213 35,34.0277778 L35,28.1944444 C35,27.6575009 34.5647213,27.2222222 34.0277778,27.2222222 L32.0833333,27.2222222 C31.5463898,27.2222222 31.1111111,27.6575009 31.1111111,28.1944444 L31.1111111,31.1111111 L27.2222222,31.1111111 L27.2222222,34.0277778 C27.2222222,34.5647213 27.6575009,35 28.1944444,35 Z M33.0555556,0 L25.2777778,0 C24.2038908,0 23.3333333,0.870557431 23.3333333,1.94444444 L23.3333333,9.72222222 C23.3333333,10.7961092 24.2038908,11.6666667 25.2777778,11.6666667 L33.0555556,11.6666667 C34.1294426,11.6666667 35,10.7961092 35,9.72222222 L35,1.94444444 C35,0.870557431 34.1294426,0 33.0555556,0 Z M31.1111111,7.77777778 L27.2222222,7.77777778 L27.2222222,3.88888889 L31.1111111,3.88888889 L31.1111111,7.77777778 Z M8.75,15.5555556 C8.21305649,15.5555556 7.77777778,15.9908343 7.77777778,16.5277778 L7.77777778,18.4722222 C7.77777778,19.0091657 8.21305649,19.4444444 8.75,19.4444444 L15.5555556,19.4444444 L15.5555556,15.5555556 L8.75,15.5555556 Z M15.5555556,22.3611111 C15.5555556,22.8980546 15.9908343,23.3333333 16.5277778,23.3333333 L19.4444444,23.3333333 L19.4444444,26.25 C19.4444444,26.7869435 19.8797232,27.2222222 20.4166667,27.2222222 L23.3333333,27.2222222 L23.3333333,19.4444444 L15.5555556,19.4444444 L15.5555556,22.3611111 Z M15.5555556,32.0833333 L15.5555556,34.0277778 C15.5555556,34.5647213 15.9908343,35 16.5277778,35 L22.3611111,35 C22.8980546,35 23.3333333,34.5647213 23.3333333,34.0277778 L23.3333333,31.1111111 L16.5277778,31.1111111 C15.9908343,31.1111111 15.5555556,31.5463898 15.5555556,32.0833333 Z M34.0277778,15.5555556 L24.3055556,15.5555556 C23.768612,15.5555556 23.3333333,15.9908343 23.3333333,16.5277778 L23.3333333,19.4444444 L27.2222222,19.4444444 L27.2222222,22.3611111 C27.2222222,22.8980546 27.6575009,23.3333333 28.1944444,23.3333333 L30.1388889,23.3333333 C30.6758324,23.3333333 31.1111111,22.8980546 31.1111111,22.3611111 L31.1111111,19.4444444 L34.0277778,19.4444444 C34.5647213,19.4444444 35,19.0091657 35,18.4722222 L35,16.5277778 C35,15.9908343 34.5647213,15.5555556 34.0277778,15.5555556 Z M27.2222222,31.1111111 L27.2222222,27.2222222 L23.3333333,27.2222222 L23.3333333,31.1111111 L27.2222222,31.1111111 Z M16.5277778,7.77777778 L18.4722222,7.77777778 C19.0091657,7.77777778 19.4444444,7.34249906 19.4444444,6.80555556 L19.4444444,0.972222222 C19.4444444,0.435278715 19.0091657,0 18.4722222,0 L16.5277778,0 C15.9908343,0 15.5555556,0.435278715 15.5555556,0.972222222 L15.5555556,6.80555556 C15.5555556,7.34249906 15.9908343,7.77777778 16.5277778,7.77777778 Z M19.4444444,14.5833333 L19.4444444,12.6388889 C19.4444444,12.1019454 19.0091657,11.6666667 18.4722222,11.6666667 L16.5277778,11.6666667 C15.9908343,11.6666667 15.5555556,12.1019454 15.5555556,12.6388889 L15.5555556,15.5555556 L18.4722222,15.5555556 C19.0091657,15.5555556 19.4444444,15.1202768 19.4444444,14.5833333 Z" id="Icon-color"></path>
</g>
</g>
<g id="4" transform="translate(73.000000, 12.000000)">
<rect id="path" fill="#3098DC" x="0" y="5" width="14" height="1"></rect>
<polyline id="path" stroke="#3098DC" points="8 0 14 5.5 8 10.5"></polyline>
</g>
<g id="4" transform="translate(7.000000, 17.250000) scale(-1, 1) translate(-7.000000, -17.250000) translate(0.000000, 12.000000)">
<rect id="path" fill="#3098DC" x="0" y="5" width="14" height="1"></rect>
<polyline id="path" stroke="#3098DC" points="8 0 14 5.5 8 10.5"></polyline>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

@ -16,6 +16,7 @@ export default class AppStateController extends EventEmitter {
onInactiveTimeout,
showUnlockRequest,
preferencesStore,
qrHardwareStore,
} = opts;
super();
@ -31,7 +32,9 @@ export default class AppStateController extends EventEmitter {
recoveryPhraseReminderHasBeenShown: false,
recoveryPhraseReminderLastShown: new Date().getTime(),
showTestnetMessageInDropdown: true,
trezorModel: null,
...initState,
qrHardware: {},
});
this.timer = null;
@ -48,6 +51,10 @@ export default class AppStateController extends EventEmitter {
}
});
qrHardwareStore.subscribe((state) => {
this.store.updateState({ qrHardware: state });
});
const { preferences } = preferencesStore.getState();
this._setInactiveTimeout(preferences.autoLockTimeLimit);
}
@ -237,4 +244,12 @@ export default class AppStateController extends EventEmitter {
setShowTestnetMessageInDropdown(showTestnetMessageInDropdown) {
this.store.updateState({ showTestnetMessageInDropdown });
}
/**
* Sets a property indicating the model of the user's Trezor hardware wallet
* @returns {void}
*/
setTrezorModel(trezorModel) {
this.store.updateState({ trezorModel });
}
}

@ -37,6 +37,8 @@ export default class PreferencesController {
// set to true means the dynamic list from the API is being used
// set to false will be using the static list from contract-metadata
useTokenDetection: false,
useCollectibleDetection: false,
openSeaEnabled: false,
advancedGasFee: null,
// WARNING: Do not use feature flags for security-sensitive things.
@ -130,6 +132,35 @@ export default class PreferencesController {
this.store.updateState({ useTokenDetection: val });
}
/**
* Setter for the `useCollectibleDetection` property
*
* @param {boolean} val - Whether or not the user prefers to autodetect collectibles.
*
*/
setUseCollectibleDetection(val) {
const { openSeaEnabled } = this.store.getState();
if (val && !openSeaEnabled) {
throw new Error(
'useCollectibleDetection cannot be enabled if openSeaEnabled is false',
);
}
this.store.updateState({ useCollectibleDetection: val });
}
/**
* Setter for the `openSeaEnabled` property
*
* @param {boolean} val - Whether or not the user prefers to use the OpenSea API for collectibles data.
*
*/
setOpenSeaEnabled(val) {
this.store.updateState({ openSeaEnabled: val });
if (!val) {
this.store.updateState({ useCollectibleDetection: false });
}
}
/**
* Setter for the `advancedGasFee` property
*

@ -267,6 +267,42 @@ describe('preferences controller', function () {
});
});
describe('setUseCollectibleDetection', function () {
it('should default to false', function () {
const state = preferencesController.store.getState();
assert.equal(state.useCollectibleDetection, false);
});
it('should set the useCollectibleDetection property in state', function () {
assert.equal(
preferencesController.store.getState().useCollectibleDetection,
false,
);
preferencesController.setOpenSeaEnabled(true);
preferencesController.setUseCollectibleDetection(true);
assert.equal(
preferencesController.store.getState().useCollectibleDetection,
true,
);
});
});
describe('setOpenSeaEnabled', function () {
it('should default to false', function () {
const state = preferencesController.store.getState();
assert.equal(state.openSeaEnabled, false);
});
it('should set the openSeaEnabled property in state', function () {
assert.equal(
preferencesController.store.getState().openSeaEnabled,
false,
);
preferencesController.setOpenSeaEnabled(true);
assert.equal(preferencesController.store.getState().openSeaEnabled, true);
});
});
describe('setAdvancedGasFee', function () {
it('should default to null', function () {
const state = preferencesController.store.getState();

@ -79,7 +79,6 @@ const initialState = {
topAggId: null,
routeState: '',
swapsFeatureIsLive: true,
useNewSwapsApi: false,
saveFetchedQuotes: false,
swapsQuoteRefreshTime: FALLBACK_QUOTE_REFRESH_TIME,
swapsQuotePrefetchingRefreshTime: FALLBACK_QUOTE_REFRESH_TIME,
@ -123,9 +122,9 @@ export default class SwapsController {
});
}
async fetchSwapsRefreshRates(chainId, useNewSwapsApi) {
async fetchSwapsRefreshRates(chainId) {
const response = await fetchWithCache(
getBaseApi('network', chainId, useNewSwapsApi),
getBaseApi('network', chainId),
{ method: 'GET' },
{ cacheRefreshTime: 600000 },
);
@ -149,13 +148,9 @@ export default class SwapsController {
// Sets the refresh rate for quote updates from the MetaSwap API
async _setSwapsRefreshRates() {
const chainId = this._getCurrentChainId();
const { swapsState } = this.store.getState();
let swapsRefreshRates;
try {
swapsRefreshRates = await this.fetchSwapsRefreshRates(
chainId,
swapsState.useNewSwapsApi,
);
swapsRefreshRates = await this.fetchSwapsRefreshRates(chainId);
} catch (e) {
console.error('Request for swaps quote refresh time failed: ', e);
}
@ -210,11 +205,7 @@ export default class SwapsController {
) {
const { chainId } = fetchParamsMetaData;
const {
swapsState: {
useNewSwapsApi,
quotesPollingLimitEnabled,
saveFetchedQuotes,
},
swapsState: { quotesPollingLimitEnabled, saveFetchedQuotes },
} = this.store.getState();
if (!fetchParams) {
@ -242,7 +233,6 @@ export default class SwapsController {
let [newQuotes] = await Promise.all([
this._fetchTradesInfo(fetchParams, {
...fetchParamsMetaData,
useNewSwapsApi,
}),
this._setSwapsRefreshRates(),
]);
@ -574,9 +564,9 @@ export default class SwapsController {
setSwapsLiveness(swapsLiveness) {
const { swapsState } = this.store.getState();
const { swapsFeatureIsLive, useNewSwapsApi } = swapsLiveness;
const { swapsFeatureIsLive } = swapsLiveness;
this.store.updateState({
swapsState: { ...swapsState, swapsFeatureIsLive, useNewSwapsApi },
swapsState: { ...swapsState, swapsFeatureIsLive },
});
}
@ -588,7 +578,6 @@ export default class SwapsController {
tokens: swapsState.tokens,
fetchParams: swapsState.fetchParams,
swapsFeatureIsLive: swapsState.swapsFeatureIsLive,
useNewSwapsApi: swapsState.useNewSwapsApi,
swapsQuoteRefreshTime: swapsState.swapsQuoteRefreshTime,
swapsQuotePrefetchingRefreshTime:
swapsState.swapsQuotePrefetchingRefreshTime,

@ -131,7 +131,6 @@ const EMPTY_INIT_STATE = {
topAggId: null,
routeState: '',
swapsFeatureIsLive: true,
useNewSwapsApi: false,
swapsQuoteRefreshTime: 60000,
swapsQuotePrefetchingRefreshTime: 60000,
swapsUserFeeLevel: '',
@ -707,7 +706,6 @@ describe('SwapsController', function () {
assert.strictEqual(
fetchTradesInfoStub.calledOnceWithExactly(MOCK_FETCH_PARAMS, {
...MOCK_FETCH_METADATA,
useNewSwapsApi: false,
}),
true,
);
@ -885,7 +883,6 @@ describe('SwapsController', function () {
const tokens = 'test';
const fetchParams = 'test';
const swapsFeatureIsLive = false;
const useNewSwapsApi = false;
const swapsQuoteRefreshTime = 0;
const swapsQuotePrefetchingRefreshTime = 0;
swapsController.store.updateState({
@ -893,7 +890,6 @@ describe('SwapsController', function () {
tokens,
fetchParams,
swapsFeatureIsLive,
useNewSwapsApi,
swapsQuoteRefreshTime,
swapsQuotePrefetchingRefreshTime,
},

@ -33,6 +33,7 @@ import {
GAS_ESTIMATE_TYPES,
GAS_RECOMMENDATIONS,
CUSTOM_GAS_ESTIMATE,
PRIORITY_LEVELS,
} from '../../../../shared/constants/gas';
import { decGWEIToHexWEI } from '../../../../shared/modules/conversion.utils';
import {
@ -438,7 +439,11 @@ export default class TransactionController extends EventEmitter {
) {
txMeta.txParams.maxFeePerGas = txMeta.txParams.gasPrice;
txMeta.txParams.maxPriorityFeePerGas = txMeta.txParams.gasPrice;
txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE;
if (process.env.EIP_1559_V2) {
txMeta.userFeeLevel = PRIORITY_LEVELS.DAPP_SUGGESTED;
} else {
txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE;
}
} else {
if (
(defaultMaxFeePerGas &&
@ -448,6 +453,8 @@ export default class TransactionController extends EventEmitter {
txMeta.origin === 'metamask'
) {
txMeta.userFeeLevel = GAS_RECOMMENDATIONS.MEDIUM;
} else if (process.env.EIP_1559_V2) {
txMeta.userFeeLevel = PRIORITY_LEVELS.DAPP_SUGGESTED;
} else {
txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE;
}

@ -79,9 +79,9 @@ export default class MessageManager extends EventEmitter {
* @returns {promise} after signature has been
*
*/
addUnapprovedMessageAsync(msgParams, req) {
return new Promise((resolve, reject) => {
const msgId = this.addUnapprovedMessage(msgParams, req);
async addUnapprovedMessageAsync(msgParams, req) {
const msgId = this.addUnapprovedMessage(msgParams, req);
return await new Promise((resolve, reject) => {
// await finished
this.once(`${msgId}:finished`, (data) => {
switch (data.status) {
@ -93,6 +93,10 @@ export default class MessageManager extends EventEmitter {
'MetaMask Message Signature: User denied message signature.',
),
);
case 'errored':
return reject(
new Error(`MetaMask Message Signature: ${data.error}`),
);
default:
return reject(
new Error(
@ -233,6 +237,19 @@ export default class MessageManager extends EventEmitter {
this._setMsgStatus(msgId, 'rejected');
}
/**
* Sets a Message status to 'errored' via a call to this._setMsgStatus.
*
* @param {number} msgId - The id of the Message to error
*
*/
errorMessage(msgId, error) {
const msg = this.getMsg(msgId);
msg.error = error;
this._updateMsg(msg);
this._setMsgStatus(msgId, 'errored');
}
/**
* Clears all unapproved messages from memory.
*/
@ -304,7 +321,7 @@ export default class MessageManager extends EventEmitter {
* @returns {string} A hex string conversion of the buffer data
*
*/
function normalizeMsgData(data) {
export function normalizeMsgData(data) {
if (data.slice(0, 2) === '0x') {
// data is already hex
return data;

@ -107,6 +107,9 @@ export default class PersonalMessageManager extends EventEmitter {
),
);
return;
case 'errored':
reject(new Error(`MetaMask Message Signature: ${data.error}`));
return;
default:
reject(
new Error(
@ -254,6 +257,19 @@ export default class PersonalMessageManager extends EventEmitter {
this._setMsgStatus(msgId, 'rejected');
}
/**
* Sets a Message status to 'errored' via a call to this._setMsgStatus.
*
* @param {number} msgId - The id of the Message to error
*
*/
errorMessage(msgId, error) {
const msg = this.getMsg(msgId);
msg.error = error;
this._updateMsg(msg);
this._setMsgStatus(msgId, 'errored');
}
/**
* Clears all unapproved messages from memory.
*/

@ -15,8 +15,10 @@ import log from 'loglevel';
import TrezorKeyring from 'eth-trezor-keyring';
import LedgerBridgeKeyring from '@metamask/eth-ledger-bridge-keyring';
import LatticeKeyring from 'eth-lattice-keyring';
import { MetaMaskKeyring as QRHardwareKeyring } from '@keystonehq/metamask-airgapped-keyring';
import EthQuery from 'eth-query';
import nanoid from 'nanoid';
import { ethErrors } from 'eth-rpc-errors';
import { captureException } from '@sentry/browser';
import {
AddressBookController,
@ -29,6 +31,9 @@ import {
TokenListController,
TokensController,
TokenRatesController,
CollectiblesController,
AssetsContractController,
CollectibleDetectionController,
} from '@metamask/controllers';
import { TRANSACTION_STATUSES } from '../../shared/constants/transaction';
import {
@ -37,7 +42,10 @@ import {
SWAPS_CLIENT_ID,
} from '../../shared/constants/swaps';
import { MAINNET_CHAIN_ID } from '../../shared/constants/network';
import { KEYRING_TYPES } from '../../shared/constants/hardware-wallets';
import {
DEVICE_NAMES,
KEYRING_TYPES,
} from '../../shared/constants/hardware-wallets';
import { UI_NOTIFICATIONS } from '../../shared/notifications';
import { toChecksumHexAddress } from '../../shared/modules/hexstring-utils';
import { MILLISECOND } from '../../shared/constants/time';
@ -61,7 +69,7 @@ import AlertController from './controllers/alert';
import OnboardingController from './controllers/onboarding';
import ThreeBoxController from './controllers/threebox';
import IncomingTransactionsController from './controllers/incoming-transactions';
import MessageManager from './lib/message-manager';
import MessageManager, { normalizeMsgData } from './lib/message-manager';
import DecryptMessageManager from './lib/decrypt-message-manager';
import EncryptionPublicKeyManager from './lib/encryption-public-key-manager';
import PersonalMessageManager from './lib/personal-message-manager';
@ -175,6 +183,59 @@ export default class MetamaskController extends EventEmitter {
state: initState.TokensController,
});
this.assetsContractController = new AssetsContractController({
provider: this.provider,
});
this.collectiblesController = new CollectiblesController({
onPreferencesStateChange: this.preferencesController.store.subscribe.bind(
this.preferencesController.store,
),
onNetworkStateChange: this.networkController.store.subscribe.bind(
this.networkController.store,
),
getAssetName: this.assetsContractController.getAssetName.bind(
this.assetsContractController,
),
getAssetSymbol: this.assetsContractController.getAssetSymbol.bind(
this.assetsContractController,
),
getCollectibleTokenURI: this.assetsContractController.getCollectibleTokenURI.bind(
this.assetsContractController,
),
getOwnerOf: this.assetsContractController.getOwnerOf.bind(
this.assetsContractController,
),
balanceOfERC1155Collectible: this.assetsContractController.balanceOfERC1155Collectible.bind(
this.assetsContractController,
),
uriERC1155Collectible: this.assetsContractController.uriERC1155Collectible.bind(
this.assetsContractController,
),
});
process.env.COLLECTIBLES_V1 &&
(this.collectibleDetectionController = new CollectibleDetectionController(
{
onCollectiblesStateChange: (listener) =>
this.collectiblesController.subscribe(listener),
onPreferencesStateChange: this.preferencesController.store.subscribe.bind(
this.preferencesController.store,
),
onNetworkStateChange: this.networkController.store.subscribe.bind(
this.networkController.store,
),
getOpenSeaApiKey: () => this.collectiblesController.openSeaApiKey,
getBalancesInSingleCall: this.assetsContractController.getBalancesInSingleCall.bind(
this.assetsContractController,
),
addCollectible: this.collectiblesController.addCollectible.bind(
this.collectiblesController,
),
getCollectiblesState: () => this.collectiblesController.state,
},
));
this.metaMetricsController = new MetaMetricsController({
segment,
preferencesStore: this.preferencesController.store,
@ -231,6 +292,8 @@ export default class MetamaskController extends EventEmitter {
},
});
this.qrHardwareKeyring = new QRHardwareKeyring();
this.appStateController = new AppStateController({
addUnlockListener: this.on.bind(this, 'unlock'),
isUnlocked: this.isUnlocked.bind(this),
@ -238,6 +301,7 @@ export default class MetamaskController extends EventEmitter {
onInactiveTimeout: () => this.setLocked(),
showUnlockRequest: opts.showUserConfirmation,
preferencesStore: this.preferencesController.store,
qrHardwareStore: this.qrHardwareKeyring.getMemStore(),
});
const currencyRateMessenger = this.controllerMessenger.getRestricted({
@ -377,6 +441,7 @@ export default class MetamaskController extends EventEmitter {
TrezorKeyring,
LedgerBridgeKeyring,
LatticeKeyring,
QRHardwareKeyring,
];
this.keyringController = new KeyringController({
keyringTypes: additionalKeyrings,
@ -525,6 +590,7 @@ export default class MetamaskController extends EventEmitter {
console.error(error);
}
});
this.networkController.lookupNetwork();
this.messageManager = new MessageManager({
metricsEvent: this.metaMetricsController.trackEvent.bind(
@ -611,6 +677,7 @@ export default class MetamaskController extends EventEmitter {
GasFeeController: this.gasFeeController,
TokenListController: this.tokenListController,
TokensController: this.tokensController,
CollectiblesController: this.collectiblesController,
});
this.memStore = new ComposableObservableStore({
@ -645,6 +712,7 @@ export default class MetamaskController extends EventEmitter {
GasFeeController: this.gasFeeController,
TokenListController: this.tokenListController,
TokensController: this.tokensController,
CollectiblesController: this.collectiblesController,
},
controllerMessenger: this.controllerMessenger,
});
@ -826,6 +894,7 @@ export default class MetamaskController extends EventEmitter {
threeBoxController,
txController,
tokensController,
collectiblesController,
} = this;
return {
@ -843,6 +912,14 @@ export default class MetamaskController extends EventEmitter {
this.preferencesController.setUseTokenDetection,
this.preferencesController,
),
setUseCollectibleDetection: nodeify(
this.preferencesController.setUseCollectibleDetection,
this.preferencesController,
),
setOpenSeaEnabled: nodeify(
this.preferencesController.setOpenSeaEnabled,
this.preferencesController,
),
setIpfsGateway: this.setIpfsGateway.bind(this),
setParticipateInMetaMetrics: this.setParticipateInMetaMetrics.bind(this),
setCurrentLocale: this.setCurrentLocale.bind(this),
@ -880,6 +957,28 @@ export default class MetamaskController extends EventEmitter {
this,
),
// qr hardware devices
submitQRHardwareCryptoHDKey: nodeify(
this.qrHardwareKeyring.submitCryptoHDKey,
this.qrHardwareKeyring,
),
submitQRHardwareCryptoAccount: nodeify(
this.qrHardwareKeyring.submitCryptoAccount,
this.qrHardwareKeyring,
),
cancelSyncQRHardware: nodeify(
this.qrHardwareKeyring.cancelSync,
this.qrHardwareKeyring,
),
submitQRHardwareSignature: nodeify(
this.qrHardwareKeyring.submitSignature,
this.qrHardwareKeyring,
),
cancelQRHardwareSignRequest: nodeify(
this.qrHardwareKeyring.cancelSignRequest,
this.qrHardwareKeyring,
),
// mobile
fetchInfoToSync: nodeify(this.fetchInfoToSync, this),
@ -948,6 +1047,27 @@ export default class MetamaskController extends EventEmitter {
preferencesController,
),
// CollectiblesController
addCollectible: nodeify(
collectiblesController.addCollectible,
collectiblesController,
),
addCollectibleVerifyOwnership: nodeify(
collectiblesController.addCollectibleVerifyOwnership,
collectiblesController,
),
removeAndIgnoreCollectible: nodeify(
collectiblesController.removeAndIgnoreCollectible,
collectiblesController,
),
removeCollectible: nodeify(
collectiblesController.removeCollectible,
collectiblesController,
),
// AddressController
setAddressBook: nodeify(
this.addressBookController.set,
@ -1008,9 +1128,7 @@ export default class MetamaskController extends EventEmitter {
),
createCancelTransaction: nodeify(this.createCancelTransaction, this),
createSpeedUpTransaction: nodeify(this.createSpeedUpTransaction, this),
isNonceTaken: nodeify(txController.isNonceTaken, txController),
estimateGas: nodeify(this.estimateGas, this),
getPendingNonce: nodeify(this.getPendingNonce, this),
getNextNonce: nodeify(this.getNextNonce, this),
addUnapprovedTransaction: nodeify(
txController.addUnapprovedTransaction,
@ -1094,13 +1212,6 @@ export default class MetamaskController extends EventEmitter {
permissionsController.approvePermissionsRequest,
permissionsController,
),
clearPermissions: permissionsController.clearPermissions.bind(
permissionsController,
),
getApprovedAccounts: nodeify(
permissionsController.getAccounts,
permissionsController,
),
rejectPermissionsRequest: nodeify(
permissionsController.rejectPermissionsRequest,
permissionsController,
@ -1255,6 +1366,14 @@ export default class MetamaskController extends EventEmitter {
this.detectTokensController.detectNewTokens,
this.detectTokensController,
),
// DetectCollectibleController
detectCollectibles: process.env.COLLECTIBLES_V1
? nodeify(
this.collectibleDetectionController.detectCollectibles,
this.collectibleDetectionController,
)
: null,
};
}
@ -1574,13 +1693,16 @@ export default class MetamaskController extends EventEmitter {
async getKeyringForDevice(deviceName, hdPath = null) {
let keyringName = null;
switch (deviceName) {
case 'trezor':
case DEVICE_NAMES.TREZOR:
keyringName = TrezorKeyring.type;
break;
case 'ledger':
case DEVICE_NAMES.LEDGER:
keyringName = LedgerBridgeKeyring.type;
break;
case 'lattice':
case DEVICE_NAMES.QR:
keyringName = QRHardwareKeyring.type;
break;
case DEVICE_NAMES.LATTICE:
keyringName = LatticeKeyring.type;
break;
default:
@ -1597,9 +1719,14 @@ export default class MetamaskController extends EventEmitter {
if (hdPath && keyring.setHdPath) {
keyring.setHdPath(hdPath);
}
if (deviceName === 'lattice') {
if (deviceName === DEVICE_NAMES.LATTICE) {
keyring.appName = 'MetaMask';
}
if (deviceName === 'trezor') {
const model = keyring.getModel();
this.appStateController.setTrezorModel(model);
}
keyring.network = this.networkController.getProviderConfig().type;
return keyring;
@ -1667,6 +1794,18 @@ export default class MetamaskController extends EventEmitter {
return true;
}
/**
* get hardware account label
*
* @return string label
* */
getAccountLabel(name, index, hdPathDescription) {
return `${name[0].toUpperCase()}${name.slice(1)} ${
parseInt(index, 10) + 1
} ${hdPathDescription || ''}`.trim();
}
/**
* Imports an account from a Trezor or Ledger device.
*
@ -1687,10 +1826,12 @@ export default class MetamaskController extends EventEmitter {
this.preferencesController.setAddresses(newAccounts);
newAccounts.forEach((address) => {
if (!oldAccounts.includes(address)) {
const label = `${deviceName[0].toUpperCase()}${deviceName.slice(1)} ${
parseInt(index, 10) + 1
} ${hdPathDescription || ''}`.trim();
// Set the account label to Trezor 1 / Ledger 1, etc
const label = this.getAccountLabel(
deviceName === DEVICE_NAMES.QR ? keyring.getName() : deviceName,
index,
hdPathDescription,
);
// Set the account label to Trezor 1 / Ledger 1 / QR Hardware 1, etc
this.preferencesController.setAccountLabel(address, label);
// Select the account
this.preferencesController.setSelectedAddress(address);
@ -1852,14 +1993,22 @@ export default class MetamaskController extends EventEmitter {
* @param {Object} msgParams - The params passed to eth_sign.
* @param {Function} cb - The callback function called with the signature.
*/
newUnsignedMessage(msgParams, req) {
const promise = this.messageManager.addUnapprovedMessageAsync(
msgParams,
req,
);
this.sendUpdate();
this.opts.showUserConfirmation();
return promise;
async newUnsignedMessage(msgParams, req) {
const data = normalizeMsgData(msgParams.data);
let promise;
// 64 hex + "0x" at the beginning
// This is needed because Ethereum's EcSign works only on 32 byte numbers
// For 67 length see: https://github.com/MetaMask/metamask-extension/pull/12679/files#r749479607
if (data.length === 66 || data.length === 67) {
promise = this.messageManager.addUnapprovedMessageAsync(msgParams, req);
this.sendUpdate();
this.opts.showUserConfirmation();
} else {
throw ethErrors.rpc.invalidParams(
'eth_sign requires 32 byte message hash',
);
}
return await promise;
}
/**
@ -1868,24 +2017,23 @@ export default class MetamaskController extends EventEmitter {
* @param {Object} msgParams - The params passed to eth_call.
* @returns {Promise<Object>} Full state update.
*/
signMessage(msgParams) {
async signMessage(msgParams) {
log.info('MetaMaskController - signMessage');
const msgId = msgParams.metamaskId;
// sets the status op the message to 'approved'
// and removes the metamaskId for signing
return this.messageManager
.approveMessage(msgParams)
.then((cleanMsgParams) => {
// signs the message
return this.keyringController.signMessage(cleanMsgParams);
})
.then((rawSig) => {
// tells the listener that the message has been signed
// and can be returned to the dapp
this.messageManager.setMsgStatusSigned(msgId, rawSig);
return this.getState();
});
try {
// sets the status op the message to 'approved'
// and removes the metamaskId for signing
const cleanMsgParams = await this.messageManager.approveMessage(
msgParams,
);
const rawSig = await this.keyringController.signMessage(cleanMsgParams);
this.messageManager.setMsgStatusSigned(msgId, rawSig);
return this.getState();
} catch (error) {
log.info('MetaMaskController - eth_sign failed', error);
this.messageManager.errorMessage(msgId, error);
throw error;
}
}
/**
@ -1932,23 +2080,27 @@ export default class MetamaskController extends EventEmitter {
* @param {Object} msgParams - The params of the message to sign & return to the Dapp.
* @returns {Promise<Object>} A full state update.
*/
signPersonalMessage(msgParams) {
async signPersonalMessage(msgParams) {
log.info('MetaMaskController - signPersonalMessage');
const msgId = msgParams.metamaskId;
// sets the status op the message to 'approved'
// and removes the metamaskId for signing
return this.personalMessageManager
.approveMessage(msgParams)
.then((cleanMsgParams) => {
// signs the message
return this.keyringController.signPersonalMessage(cleanMsgParams);
})
.then((rawSig) => {
// tells the listener that the message has been signed
// and can be returned to the dapp
this.personalMessageManager.setMsgStatusSigned(msgId, rawSig);
return this.getState();
});
try {
const cleanMsgParams = await this.personalMessageManager.approveMessage(
msgParams,
);
const rawSig = await this.keyringController.signPersonalMessage(
cleanMsgParams,
);
// tells the listener that the message has been signed
// and can be returned to the dapp
this.personalMessageManager.setMsgStatusSigned(msgId, rawSig);
return this.getState();
} catch (error) {
log.info('MetaMaskController - eth_personalSign failed', error);
this.personalMessageManager.errorMessage(msgId, error);
throw error;
}
}
/**
@ -2095,6 +2247,12 @@ export default class MetamaskController extends EventEmitter {
});
}
case KEYRING_TYPES.QR: {
return Promise.reject(
new Error('QR hardware does not support eth_getEncryptionPublicKey.'),
);
}
default: {
const promise = this.encryptionPublicKeyManager.addUnapprovedMessageAsync(
msgParams,
@ -2227,17 +2385,10 @@ export default class MetamaskController extends EventEmitter {
}
/**
* Method to return a boolean if the keyring for the currently selected
* account is a ledger or trezor keyring.
* TODO: remove this method when Ledger and Trezor release their supported
* client utilities for EIP-1559
* @returns {boolean} true if the keyring type supports EIP-1559
*/
async getCurrentAccountEIP1559Compatibility(fromAddress) {
const address =
fromAddress || this.preferencesController.getSelectedAddress();
const keyring = await this.keyringController.getKeyringForAccount(address);
return keyring.type !== KEYRING_TYPES.TREZOR;
async getCurrentAccountEIP1559Compatibility() {
return true;
}
//=============================================================================
@ -3187,6 +3338,12 @@ export default class MetamaskController extends EventEmitter {
* Locks MetaMask
*/
setLocked() {
const [trezorKeyring] = this.keyringController.getKeyringsByType(
KEYRING_TYPES.TREZOR,
);
if (trezorKeyring) {
trezorKeyring.dispose();
}
return this.keyringController.setLocked();
}
}

@ -607,12 +607,12 @@ describe('MetaMaskController', function () {
sinon.spy(metamaskController.preferencesController, 'setSelectedAddress');
sinon.spy(metamaskController.preferencesController, 'setAccountLabel');
await metamaskController
.connectHardware('trezor', 0, `m/44/0'/0'`)
.connectHardware('trezor', 0, `m/44'/1'/0'/0`)
.catch(() => null);
await metamaskController.unlockHardwareWalletAccount(
accountToUnlock,
'trezor',
`m/44/0'/0'`,
`m/44'/1'/0'/0`,
);
});
@ -835,7 +835,8 @@ describe('MetaMaskController', function () {
let msgParams, metamaskMsgs, messages, msgId;
const address = '0xc42edfcc21ed14dda456aa0756c153f7985d8813';
const data = '0x43727970746f6b697474696573';
const data =
'0x0000000000000000000000000000000000000043727970746f6b697474696573';
beforeEach(async function () {
sandbox.stub(metamaskController, 'getBalance');
@ -885,6 +886,19 @@ describe('MetaMaskController', function () {
assert.equal(messages[0].status, TRANSACTION_STATUSES.REJECTED);
});
it('checks message length', async function () {
msgParams = {
from: address,
data: '0xDEADBEEF',
};
try {
await metamaskController.newUnsignedMessage(msgParams);
} catch (error) {
assert.equal(error.message, 'eth_sign requires 32 byte message hash');
}
});
it('errors when signing a message', async function () {
try {
await metamaskController.signMessage(messages[0].msgParams);

@ -118,13 +118,14 @@ export default class ExtensionPlatform {
) {
let extensionURL = extension.runtime.getURL('home.html');
if (route) {
extensionURL += `#${route}`;
}
if (queryString) {
extensionURL += `?${queryString}`;
}
if (route) {
extensionURL += `#${route}`;
}
this.openTab({ url: extensionURL });
if (
getEnvironmentType() !== ENVIRONMENT_TYPE_BACKGROUND &&

@ -41,11 +41,16 @@ class RemoveFencedCodeTransform extends Transform {
// stream, immediately before the "end" event is emitted.
// It applies the transform to the concatenated file contents.
_flush(end) {
const [fileContent, didModify] = removeFencedCode(
this.filePath,
this.buildType,
Buffer.concat(this._fileBuffers).toString('utf8'),
);
let fileContent, didModify;
try {
[fileContent, didModify] = removeFencedCode(
this.filePath,
this.buildType,
Buffer.concat(this._fileBuffers).toString('utf8'),
);
} catch (error) {
return end(error);
}
const pushAndEnd = () => {
this.push(fileContent);
@ -53,12 +58,11 @@ class RemoveFencedCodeTransform extends Transform {
};
if (this.shouldLintTransformedFiles && didModify) {
lintTransformedFile(fileContent, this.filePath)
return lintTransformedFile(fileContent, this.filePath)
.then(pushAndEnd)
.catch((error) => end(error));
} else {
pushAndEnd();
}
return pushAndEnd();
}
}

@ -161,6 +161,28 @@ describe('build/transforms/remove-fenced-code', () => {
});
});
it('handles error during code fence removal or parsing', async () => {
const fileContent = getMinimalFencedCode().concat(
'///: END:ONLY_INCLUDE_IN',
);
const stream = createRemoveFencedCodeTransform('main')(mockJsFileName);
await new Promise((resolve) => {
stream.on('error', (error) => {
expect(error.message).toStrictEqual(
expect.stringContaining(
'A valid fence consists of two fence lines, but the file contains an uneven number, "3", of fence lines.',
),
);
expect(lintTransformedFileMock).toHaveBeenCalledTimes(0);
resolve();
});
stream.end(fileContent);
});
});
it('handles transformed file lint failure', async () => {
lintTransformedFileMock.mockImplementationOnce(() =>
Promise.reject(new Error('lint failure')),

@ -2,7 +2,7 @@ module.exports = {
displayName: '/development',
collectCoverageFrom: ['<rootDir>/**/*.js'],
coverageDirectory: '../jest-coverage/development/',
coverageReporters: ['json', 'lcov', 'text', 'clover'],
coverageReporters: ['html', 'text-summary'],
coverageThreshold: {
'./development/build/transforms/**/*.js': {
branches: 100,

@ -13,7 +13,7 @@ Follow this instructions: https://github.com/trezor/trezor-core/blob/master/docs
## 3 - Restart the bridge with emulator support (Mac OSx instructions)
`
```
# stop any existing instance of trezord
killall trezord
@ -22,4 +22,4 @@ Follow this instructions: https://github.com/trezor/trezor-core/blob/master/docs
# launch the emulator
~/trezor-core/emu.sh
`
````

@ -2,7 +2,7 @@ module.exports = {
collectCoverageFrom: ['<rootDir>/ui/**/*.js', '<rootDir>/shared/**/*.js'],
coverageDirectory: './jest-coverage/main',
coveragePathIgnorePatterns: ['.stories.js', '.snap'],
coverageReporters: ['json', 'lcov', 'text', 'clover'],
coverageReporters: ['html', 'text-summary'],
coverageThreshold: {
global: {
branches: 35,
@ -23,4 +23,8 @@ module.exports = {
'<rootDir>/app/scripts/platforms/*.test.js',
],
testTimeout: 2500,
transform: {
'^.+\\.[tj]sx?$': 'babel-jest',
'^.+\\.mdx$': '@storybook/addon-docs/jest-transform-mdx',
},
};

@ -0,0 +1,16 @@
/* eslint-disable import/unambiguous */
module.exports = {
coverageDirectory: './jest-coverage/storybook',
coverageReporters: ['html', 'text-summary'],
// TODO: enable resetMocks
// resetMocks: true,
restoreMocks: true,
setupFiles: ['<rootDir>/test/setup.js', '<rootDir>/test/env.js'],
setupFilesAfterEnv: ['<rootDir>/test/jest/setup.js'],
testMatch: ['<rootDir>/ui/**/*stories.test.js'],
testTimeout: 2500,
transform: {
'^.+\\.[tj]sx?$': 'babel-jest',
'^.+\\.mdx$': '@storybook/addon-docs/jest-transform-mdx',
},
};

@ -412,6 +412,47 @@
"Intl.getCanonicalLocales": true
}
},
"@keystonehq/base-eth-keyring": {
"packages": {
"@ethereumjs/tx": true,
"@keystonehq/bc-ur-registry-eth": true,
"buffer": true,
"ethereumjs-util": true,
"hdkey": true,
"uuid": true
}
},
"@keystonehq/bc-ur-registry": {
"globals": {
"define": true
},
"packages": {
"@ngraveio/bc-ur": true,
"bs58check": true,
"buffer": true
}
},
"@keystonehq/bc-ur-registry-eth": {
"packages": {
"@keystonehq/bc-ur-registry": true,
"buffer": true,
"ethereumjs-util": true,
"hdkey": true,
"uuid": true
}
},
"@keystonehq/metamask-airgapped-keyring": {
"packages": {
"@ethereumjs/tx": true,
"@keystonehq/base-eth-keyring": true,
"@keystonehq/bc-ur-registry-eth": true,
"@metamask/obs-store": true,
"buffer": true,
"events": true,
"rlp": true,
"uuid": true
}
},
"@material-ui/core": {
"globals": {
"Image": true,
@ -526,6 +567,7 @@
"ethjs-util": true,
"events": true,
"human-standard-collectible-abi": true,
"human-standard-multi-collectible-abi": true,
"human-standard-token-abi": true,
"immer": true,
"isomorphic-fetch": true,
@ -618,6 +660,18 @@
"events": true
}
},
"@ngraveio/bc-ur": {
"packages": {
"@apocentre/alias-sampling": true,
"assert": true,
"bignumber.js": true,
"buffer": true,
"cbor-sync": true,
"crc": true,
"jsbi": true,
"sha.js": true
}
},
"@popperjs/core": {
"globals": {
"Element": true,
@ -737,6 +791,83 @@
"util": true
}
},
"@truffle/abi-utils": {
"packages": {
"change-case": true,
"faker": true,
"fast-check": true
}
},
"@truffle/code-utils": {
"packages": {
"buffer": true,
"cbor": true
}
},
"@truffle/codec": {
"packages": {
"@truffle/abi-utils": true,
"@truffle/compile-common": true,
"big.js": true,
"bn.js": true,
"buffer": true,
"cbor": true,
"debug": true,
"lodash.clonedeep": true,
"lodash.escaperegexp": true,
"lodash.partition": true,
"lodash.sum": true,
"semver": true,
"utf8": true,
"util": true,
"web3-utils": true
}
},
"@truffle/compile-common": {
"packages": {
"@truffle/error": true,
"colors": true,
"path-browserify": true
}
},
"@truffle/decoder": {
"packages": {
"@truffle/abi-utils": true,
"@truffle/codec": true,
"@truffle/compile-common": true,
"@truffle/source-map-utils": true,
"bn.js": true,
"debug": true,
"web3-utils": true
}
},
"@truffle/source-map-utils": {
"packages": {
"@truffle/code-utils": true,
"@truffle/codec": true,
"debug": true,
"json-pointer": true,
"node-interval-tree": true,
"web3-utils": true
}
},
"@zxing/browser": {
"globals": {
"HTMLElement": true,
"HTMLImageElement": true,
"HTMLVideoElement": true,
"URL.createObjectURL": true,
"clearTimeout": true,
"console.error": true,
"console.warn": true,
"document": true,
"navigator": true,
"setTimeout": true
},
"packages": {
"@zxing/library": true
}
},
"@zxing/library": {
"globals": {
"TextDecoder": true,
@ -922,6 +1053,11 @@
"buffer": true
}
},
"big.js": {
"globals": {
"define": true
}
},
"bignumber.js": {
"globals": {
"crypto": true,
@ -974,6 +1110,9 @@
}
},
"bn.js": {
"globals": {
"Buffer": true
},
"packages": {
"browser-resolve": true
}
@ -1098,6 +1237,62 @@
"buffer": true
}
},
"call-bind": {
"packages": {
"function-bind": true,
"get-intrinsic": true
}
},
"camel-case": {
"packages": {
"no-case": true,
"upper-case": true
}
},
"cbor": {
"globals": {
"TextDecoder": true
},
"packages": {
"bignumber.js": true,
"buffer": true,
"is-buffer": true,
"nofilter": true,
"stream-browserify": true,
"url": true,
"util": true
}
},
"cbor-sync": {
"globals": {
"define": true
},
"packages": {
"buffer": true
}
},
"change-case": {
"packages": {
"camel-case": true,
"constant-case": true,
"dot-case": true,
"header-case": true,
"is-lower-case": true,
"is-upper-case": true,
"lower-case": true,
"lower-case-first": true,
"no-case": true,
"param-case": true,
"pascal-case": true,
"path-case": true,
"sentence-case": true,
"snake-case": true,
"swap-case": true,
"title-case": true,
"upper-case": true,
"upper-case-first": true
}
},
"cids": {
"packages": {
"buffer": true,
@ -1152,6 +1347,22 @@
"color-name": true
}
},
"colors": {
"globals": {
"console.log": true
},
"packages": {
"os-browserify": true,
"process": true,
"util": true
}
},
"constant-case": {
"packages": {
"snake-case": true,
"upper-case": true
}
},
"cookiejar": {
"globals": {
"console.warn": true
@ -1159,7 +1370,7 @@
},
"copy-to-clipboard": {
"globals": {
"clipboardData.setData": true,
"clipboardData": true,
"console.error": true,
"console.warn": true,
"document.body.appendChild": true,
@ -1190,6 +1401,11 @@
"is-buffer": true
}
},
"crc": {
"packages": {
"buffer": true
}
},
"crc-32": {
"globals": {
"DO_NOT_EXPORT_CRC": true,
@ -1406,6 +1622,11 @@
"@babel/runtime": true
}
},
"dot-case": {
"packages": {
"no-case": true
}
},
"drbg.js": {
"packages": {
"buffer": true,
@ -1489,12 +1710,6 @@
"prr": true
}
},
"es-abstract": {
"packages": {
"function-bind": true,
"has-symbols": true
}
},
"eth-block-tracker": {
"globals": {
"clearTimeout": true,
@ -1662,6 +1877,11 @@
"trezor-connect": true
}
},
"ethereum-bloom-filters": {
"packages": {
"js-sha3": true
}
},
"ethereum-cryptography": {
"packages": {
"assert": true,
@ -1886,6 +2106,24 @@
"chrome": true
}
},
"faker": {
"globals": {
"console.error": true,
"console.log": true,
"dbg": "write"
}
},
"fast-check": {
"globals": {
"clearTimeout": true,
"console.log": true,
"setTimeout": true
},
"packages": {
"buffer": true,
"pure-rand": true
}
},
"fast-json-patch": {
"globals": {
"addEventListener": true,
@ -1933,6 +2171,18 @@
"webkitRTCSessionDescription": true
}
},
"get-intrinsic": {
"globals": {
"AggregateError": true,
"FinalizationRegistry": true,
"WeakRef": true
},
"packages": {
"function-bind": true,
"has": true,
"has-symbols": true
}
},
"get-params": {
"globals": {
"GetParams": "write"
@ -1975,6 +2225,11 @@
"sparse-array": true
}
},
"has": {
"packages": {
"function-bind": true
}
},
"has-binary2": {
"globals": {
"Blob": true,
@ -2006,12 +2261,19 @@
"hdkey": {
"packages": {
"assert": true,
"bs58check": true,
"coinstring": true,
"crypto-browserify": true,
"safe-buffer": true,
"secp256k1": true
}
},
"header-case": {
"packages": {
"no-case": true,
"upper-case": true
}
},
"heap": {
"globals": {
"define": true
@ -2495,11 +2757,22 @@
"multihashes": true
}
},
"is-lower-case": {
"packages": {
"lower-case": true
}
},
"is-regex": {
"packages": {
"call-bind": true,
"has-symbols": true
}
},
"is-upper-case": {
"packages": {
"upper-case": true
}
},
"iso-random-stream": {
"globals": {
"crypto": true,
@ -2558,6 +2831,16 @@
"console.warn": true
}
},
"jsbi": {
"globals": {
"define": true
}
},
"json-pointer": {
"packages": {
"foreach": true
}
},
"json-rpc-engine": {
"packages": {
"@metamask/safe-event-emitter": true,
@ -2645,6 +2928,7 @@
"packages": {
"buffer": true,
"inherits": true,
"readable-stream": true,
"safe-buffer": true,
"stream-browserify": true
}
@ -3099,12 +3383,22 @@
"util": true
}
},
"lower-case-first": {
"packages": {
"lower-case": true
}
},
"lru": {
"packages": {
"events": true,
"inherits": true
}
},
"lru-cache": {
"packages": {
"yallist": true
}
},
"ltgt": {
"packages": {
"is-buffer": true
@ -3274,6 +3568,11 @@
"crypto-browserify": true
}
},
"no-case": {
"packages": {
"lower-case": true
}
},
"node-forge": {
"globals": {
"Blob": true,
@ -3298,6 +3597,11 @@
"timers-browserify": true
}
},
"node-interval-tree": {
"packages": {
"shallowequal": true
}
},
"nodeify": {
"globals": {
"setTimeout": true
@ -3309,6 +3613,13 @@
"timers-browserify": true
}
},
"nofilter": {
"packages": {
"buffer": true,
"stream-browserify": true,
"util": true
}
},
"nonce-tracker": {
"packages": {
"assert": true,
@ -3504,6 +3815,11 @@
"p-map": true
}
},
"param-case": {
"packages": {
"no-case": true
}
},
"parse-asn1": {
"packages": {
"asn1.js": true,
@ -3513,11 +3829,22 @@
"pbkdf2": true
}
},
"pascal-case": {
"packages": {
"camel-case": true,
"upper-case-first": true
}
},
"path-browserify": {
"packages": {
"process": true
}
},
"path-case": {
"packages": {
"no-case": true
}
},
"path-to-regexp": {
"packages": {
"isarray": true
@ -3768,6 +4095,17 @@
"define": true
}
},
"qrcode.react": {
"globals": {
"Path2D": true,
"devicePixelRatio": true
},
"packages": {
"prop-types": true,
"qr.js": true,
"react": true
}
},
"rabin-wasm": {
"globals": {
"Blob": true,
@ -4074,8 +4412,7 @@
"console": true
},
"packages": {
"@babel/runtime": true,
"symbol-observable": true
"@babel/runtime": true
}
},
"redux-devtools-core": {
@ -4114,8 +4451,8 @@
},
"regexp.prototype.flags": {
"packages": {
"define-properties": true,
"es-abstract": true
"call-bind": true,
"define-properties": true
}
},
"relative-url": {
@ -4260,9 +4597,16 @@
"console": true
},
"packages": {
"lru-cache": true,
"process": true
}
},
"sentence-case": {
"packages": {
"no-case": true,
"upper-case-first": true
}
},
"set-immediate-shim": {
"globals": {
"setTimeout.apply": true
@ -4307,6 +4651,11 @@
"readable-stream": true
}
},
"snake-case": {
"packages": {
"no-case": true
}
},
"socket.io-client": {
"globals": {
"clearTimeout": true,
@ -4457,6 +4806,12 @@
"component-emitter": true
}
},
"swap-case": {
"packages": {
"lower-case": true,
"upper-case": true
}
},
"textarea-caret": {
"globals": {
"document.body.appendChild": true,
@ -4503,6 +4858,12 @@
"console": true
}
},
"title-case": {
"packages": {
"no-case": true,
"upper-case": true
}
},
"toggle-selection": {
"globals": {
"document.activeElement": true,
@ -4597,6 +4958,11 @@
"buffer": true
}
},
"upper-case-first": {
"packages": {
"upper-case": true
}
},
"url": {
"packages": {
"punycode": true,
@ -4711,6 +5077,21 @@
"uuid": true
}
},
"web3-utils": {
"globals": {
"setTimeout": true
},
"packages": {
"bn.js": true,
"eth-lib": true,
"ethereum-bloom-filters": true,
"ethjs-unit": true,
"is-buffer": true,
"number-to-bn": true,
"randombytes": true,
"utf8": true
}
},
"webrtcsupport": {
"globals": {
"AudioContext": true,

@ -412,6 +412,47 @@
"Intl.getCanonicalLocales": true
}
},
"@keystonehq/base-eth-keyring": {
"packages": {
"@ethereumjs/tx": true,
"@keystonehq/bc-ur-registry-eth": true,
"buffer": true,
"ethereumjs-util": true,
"hdkey": true,
"uuid": true
}
},
"@keystonehq/bc-ur-registry": {
"globals": {
"define": true
},
"packages": {
"@ngraveio/bc-ur": true,
"bs58check": true,
"buffer": true
}
},
"@keystonehq/bc-ur-registry-eth": {
"packages": {
"@keystonehq/bc-ur-registry": true,
"buffer": true,
"ethereumjs-util": true,
"hdkey": true,
"uuid": true
}
},
"@keystonehq/metamask-airgapped-keyring": {
"packages": {
"@ethereumjs/tx": true,
"@keystonehq/base-eth-keyring": true,
"@keystonehq/bc-ur-registry-eth": true,
"@metamask/obs-store": true,
"buffer": true,
"events": true,
"rlp": true,
"uuid": true
}
},
"@material-ui/core": {
"globals": {
"Image": true,
@ -526,6 +567,7 @@
"ethjs-util": true,
"events": true,
"human-standard-collectible-abi": true,
"human-standard-multi-collectible-abi": true,
"human-standard-token-abi": true,
"immer": true,
"isomorphic-fetch": true,
@ -618,6 +660,18 @@
"events": true
}
},
"@ngraveio/bc-ur": {
"packages": {
"@apocentre/alias-sampling": true,
"assert": true,
"bignumber.js": true,
"buffer": true,
"cbor-sync": true,
"crc": true,
"jsbi": true,
"sha.js": true
}
},
"@popperjs/core": {
"globals": {
"Element": true,
@ -737,6 +791,83 @@
"util": true
}
},
"@truffle/abi-utils": {
"packages": {
"change-case": true,
"faker": true,
"fast-check": true
}
},
"@truffle/code-utils": {
"packages": {
"buffer": true,
"cbor": true
}
},
"@truffle/codec": {
"packages": {
"@truffle/abi-utils": true,
"@truffle/compile-common": true,
"big.js": true,
"bn.js": true,
"buffer": true,
"cbor": true,
"debug": true,
"lodash.clonedeep": true,
"lodash.escaperegexp": true,
"lodash.partition": true,
"lodash.sum": true,
"semver": true,
"utf8": true,
"util": true,
"web3-utils": true
}
},
"@truffle/compile-common": {
"packages": {
"@truffle/error": true,
"colors": true,
"path-browserify": true
}
},
"@truffle/decoder": {
"packages": {
"@truffle/abi-utils": true,
"@truffle/codec": true,
"@truffle/compile-common": true,
"@truffle/source-map-utils": true,
"bn.js": true,
"debug": true,
"web3-utils": true
}
},
"@truffle/source-map-utils": {
"packages": {
"@truffle/code-utils": true,
"@truffle/codec": true,
"debug": true,
"json-pointer": true,
"node-interval-tree": true,
"web3-utils": true
}
},
"@zxing/browser": {
"globals": {
"HTMLElement": true,
"HTMLImageElement": true,
"HTMLVideoElement": true,
"URL.createObjectURL": true,
"clearTimeout": true,
"console.error": true,
"console.warn": true,
"document": true,
"navigator": true,
"setTimeout": true
},
"packages": {
"@zxing/library": true
}
},
"@zxing/library": {
"globals": {
"TextDecoder": true,
@ -922,6 +1053,11 @@
"buffer": true
}
},
"big.js": {
"globals": {
"define": true
}
},
"bignumber.js": {
"globals": {
"crypto": true,
@ -974,6 +1110,9 @@
}
},
"bn.js": {
"globals": {
"Buffer": true
},
"packages": {
"browser-resolve": true
}
@ -1098,6 +1237,62 @@
"buffer": true
}
},
"call-bind": {
"packages": {
"function-bind": true,
"get-intrinsic": true
}
},
"camel-case": {
"packages": {
"no-case": true,
"upper-case": true
}
},
"cbor": {
"globals": {
"TextDecoder": true
},
"packages": {
"bignumber.js": true,
"buffer": true,
"is-buffer": true,
"nofilter": true,
"stream-browserify": true,
"url": true,
"util": true
}
},
"cbor-sync": {
"globals": {
"define": true
},
"packages": {
"buffer": true
}
},
"change-case": {
"packages": {
"camel-case": true,
"constant-case": true,
"dot-case": true,
"header-case": true,
"is-lower-case": true,
"is-upper-case": true,
"lower-case": true,
"lower-case-first": true,
"no-case": true,
"param-case": true,
"pascal-case": true,
"path-case": true,
"sentence-case": true,
"snake-case": true,
"swap-case": true,
"title-case": true,
"upper-case": true,
"upper-case-first": true
}
},
"cids": {
"packages": {
"buffer": true,
@ -1152,6 +1347,22 @@
"color-name": true
}
},
"colors": {
"globals": {
"console.log": true
},
"packages": {
"os-browserify": true,
"process": true,
"util": true
}
},
"constant-case": {
"packages": {
"snake-case": true,
"upper-case": true
}
},
"cookiejar": {
"globals": {
"console.warn": true
@ -1159,7 +1370,7 @@
},
"copy-to-clipboard": {
"globals": {
"clipboardData.setData": true,
"clipboardData": true,
"console.error": true,
"console.warn": true,
"document.body.appendChild": true,
@ -1190,6 +1401,11 @@
"is-buffer": true
}
},
"crc": {
"packages": {
"buffer": true
}
},
"crc-32": {
"globals": {
"DO_NOT_EXPORT_CRC": true,
@ -1406,6 +1622,11 @@
"@babel/runtime": true
}
},
"dot-case": {
"packages": {
"no-case": true
}
},
"drbg.js": {
"packages": {
"buffer": true,
@ -1489,12 +1710,6 @@
"prr": true
}
},
"es-abstract": {
"packages": {
"function-bind": true,
"has-symbols": true
}
},
"eth-block-tracker": {
"globals": {
"clearTimeout": true,
@ -1662,6 +1877,11 @@
"trezor-connect": true
}
},
"ethereum-bloom-filters": {
"packages": {
"js-sha3": true
}
},
"ethereum-cryptography": {
"packages": {
"assert": true,
@ -1886,6 +2106,24 @@
"chrome": true
}
},
"faker": {
"globals": {
"console.error": true,
"console.log": true,
"dbg": "write"
}
},
"fast-check": {
"globals": {
"clearTimeout": true,
"console.log": true,
"setTimeout": true
},
"packages": {
"buffer": true,
"pure-rand": true
}
},
"fast-json-patch": {
"globals": {
"addEventListener": true,
@ -1933,6 +2171,18 @@
"webkitRTCSessionDescription": true
}
},
"get-intrinsic": {
"globals": {
"AggregateError": true,
"FinalizationRegistry": true,
"WeakRef": true
},
"packages": {
"function-bind": true,
"has": true,
"has-symbols": true
}
},
"get-params": {
"globals": {
"GetParams": "write"
@ -1975,6 +2225,11 @@
"sparse-array": true
}
},
"has": {
"packages": {
"function-bind": true
}
},
"has-binary2": {
"globals": {
"Blob": true,
@ -2006,12 +2261,19 @@
"hdkey": {
"packages": {
"assert": true,
"bs58check": true,
"coinstring": true,
"crypto-browserify": true,
"safe-buffer": true,
"secp256k1": true
}
},
"header-case": {
"packages": {
"no-case": true,
"upper-case": true
}
},
"heap": {
"globals": {
"define": true
@ -2495,11 +2757,22 @@
"multihashes": true
}
},
"is-lower-case": {
"packages": {
"lower-case": true
}
},
"is-regex": {
"packages": {
"call-bind": true,
"has-symbols": true
}
},
"is-upper-case": {
"packages": {
"upper-case": true
}
},
"iso-random-stream": {
"globals": {
"crypto": true,
@ -2558,6 +2831,16 @@
"console.warn": true
}
},
"jsbi": {
"globals": {
"define": true
}
},
"json-pointer": {
"packages": {
"foreach": true
}
},
"json-rpc-engine": {
"packages": {
"@metamask/safe-event-emitter": true,
@ -2645,6 +2928,7 @@
"packages": {
"buffer": true,
"inherits": true,
"readable-stream": true,
"safe-buffer": true,
"stream-browserify": true
}
@ -3099,12 +3383,22 @@
"util": true
}
},
"lower-case-first": {
"packages": {
"lower-case": true
}
},
"lru": {
"packages": {
"events": true,
"inherits": true
}
},
"lru-cache": {
"packages": {
"yallist": true
}
},
"ltgt": {
"packages": {
"is-buffer": true
@ -3274,6 +3568,11 @@
"crypto-browserify": true
}
},
"no-case": {
"packages": {
"lower-case": true
}
},
"node-forge": {
"globals": {
"Blob": true,
@ -3298,6 +3597,11 @@
"timers-browserify": true
}
},
"node-interval-tree": {
"packages": {
"shallowequal": true
}
},
"nodeify": {
"globals": {
"setTimeout": true
@ -3309,6 +3613,13 @@
"timers-browserify": true
}
},
"nofilter": {
"packages": {
"buffer": true,
"stream-browserify": true,
"util": true
}
},
"nonce-tracker": {
"packages": {
"assert": true,
@ -3504,6 +3815,11 @@
"p-map": true
}
},
"param-case": {
"packages": {
"no-case": true
}
},
"parse-asn1": {
"packages": {
"asn1.js": true,
@ -3513,11 +3829,22 @@
"pbkdf2": true
}
},
"pascal-case": {
"packages": {
"camel-case": true,
"upper-case-first": true
}
},
"path-browserify": {
"packages": {
"process": true
}
},
"path-case": {
"packages": {
"no-case": true
}
},
"path-to-regexp": {
"packages": {
"isarray": true
@ -3768,6 +4095,17 @@
"define": true
}
},
"qrcode.react": {
"globals": {
"Path2D": true,
"devicePixelRatio": true
},
"packages": {
"prop-types": true,
"qr.js": true,
"react": true
}
},
"rabin-wasm": {
"globals": {
"Blob": true,
@ -4074,8 +4412,7 @@
"console": true
},
"packages": {
"@babel/runtime": true,
"symbol-observable": true
"@babel/runtime": true
}
},
"redux-devtools-core": {
@ -4114,8 +4451,8 @@
},
"regexp.prototype.flags": {
"packages": {
"define-properties": true,
"es-abstract": true
"call-bind": true,
"define-properties": true
}
},
"relative-url": {
@ -4260,9 +4597,16 @@
"console": true
},
"packages": {
"lru-cache": true,
"process": true
}
},
"sentence-case": {
"packages": {
"no-case": true,
"upper-case-first": true
}
},
"set-immediate-shim": {
"globals": {
"setTimeout.apply": true
@ -4307,6 +4651,11 @@
"readable-stream": true
}
},
"snake-case": {
"packages": {
"no-case": true
}
},
"socket.io-client": {
"globals": {
"clearTimeout": true,
@ -4457,6 +4806,12 @@
"component-emitter": true
}
},
"swap-case": {
"packages": {
"lower-case": true,
"upper-case": true
}
},
"textarea-caret": {
"globals": {
"document.body.appendChild": true,
@ -4503,6 +4858,12 @@
"console": true
}
},
"title-case": {
"packages": {
"no-case": true,
"upper-case": true
}
},
"toggle-selection": {
"globals": {
"document.activeElement": true,
@ -4597,6 +4958,11 @@
"buffer": true
}
},
"upper-case-first": {
"packages": {
"upper-case": true
}
},
"url": {
"packages": {
"punycode": true,
@ -4711,6 +5077,21 @@
"uuid": true
}
},
"web3-utils": {
"globals": {
"setTimeout": true
},
"packages": {
"bn.js": true,
"eth-lib": true,
"ethereum-bloom-filters": true,
"ethjs-unit": true,
"is-buffer": true,
"number-to-bn": true,
"randombytes": true,
"utf8": true
}
},
"webrtcsupport": {
"globals": {
"AudioContext": true,

@ -412,6 +412,47 @@
"Intl.getCanonicalLocales": true
}
},
"@keystonehq/base-eth-keyring": {
"packages": {
"@ethereumjs/tx": true,
"@keystonehq/bc-ur-registry-eth": true,
"buffer": true,
"ethereumjs-util": true,
"hdkey": true,
"uuid": true
}
},
"@keystonehq/bc-ur-registry": {
"globals": {
"define": true
},
"packages": {
"@ngraveio/bc-ur": true,
"bs58check": true,
"buffer": true
}
},
"@keystonehq/bc-ur-registry-eth": {
"packages": {
"@keystonehq/bc-ur-registry": true,
"buffer": true,
"ethereumjs-util": true,
"hdkey": true,
"uuid": true
}
},
"@keystonehq/metamask-airgapped-keyring": {
"packages": {
"@ethereumjs/tx": true,
"@keystonehq/base-eth-keyring": true,
"@keystonehq/bc-ur-registry-eth": true,
"@metamask/obs-store": true,
"buffer": true,
"events": true,
"rlp": true,
"uuid": true
}
},
"@material-ui/core": {
"globals": {
"Image": true,
@ -526,6 +567,7 @@
"ethjs-util": true,
"events": true,
"human-standard-collectible-abi": true,
"human-standard-multi-collectible-abi": true,
"human-standard-token-abi": true,
"immer": true,
"isomorphic-fetch": true,
@ -618,6 +660,18 @@
"events": true
}
},
"@ngraveio/bc-ur": {
"packages": {
"@apocentre/alias-sampling": true,
"assert": true,
"bignumber.js": true,
"buffer": true,
"cbor-sync": true,
"crc": true,
"jsbi": true,
"sha.js": true
}
},
"@popperjs/core": {
"globals": {
"Element": true,
@ -737,6 +791,83 @@
"util": true
}
},
"@truffle/abi-utils": {
"packages": {
"change-case": true,
"faker": true,
"fast-check": true
}
},
"@truffle/code-utils": {
"packages": {
"buffer": true,
"cbor": true
}
},
"@truffle/codec": {
"packages": {
"@truffle/abi-utils": true,
"@truffle/compile-common": true,
"big.js": true,
"bn.js": true,
"buffer": true,
"cbor": true,
"debug": true,
"lodash.clonedeep": true,
"lodash.escaperegexp": true,
"lodash.partition": true,
"lodash.sum": true,
"semver": true,
"utf8": true,
"util": true,
"web3-utils": true
}
},
"@truffle/compile-common": {
"packages": {
"@truffle/error": true,
"colors": true,
"path-browserify": true
}
},
"@truffle/decoder": {
"packages": {
"@truffle/abi-utils": true,
"@truffle/codec": true,
"@truffle/compile-common": true,
"@truffle/source-map-utils": true,
"bn.js": true,
"debug": true,
"web3-utils": true
}
},
"@truffle/source-map-utils": {
"packages": {
"@truffle/code-utils": true,
"@truffle/codec": true,
"debug": true,
"json-pointer": true,
"node-interval-tree": true,
"web3-utils": true
}
},
"@zxing/browser": {
"globals": {
"HTMLElement": true,
"HTMLImageElement": true,
"HTMLVideoElement": true,
"URL.createObjectURL": true,
"clearTimeout": true,
"console.error": true,
"console.warn": true,
"document": true,
"navigator": true,
"setTimeout": true
},
"packages": {
"@zxing/library": true
}
},
"@zxing/library": {
"globals": {
"TextDecoder": true,
@ -922,6 +1053,11 @@
"buffer": true
}
},
"big.js": {
"globals": {
"define": true
}
},
"bignumber.js": {
"globals": {
"crypto": true,
@ -974,6 +1110,9 @@
}
},
"bn.js": {
"globals": {
"Buffer": true
},
"packages": {
"browser-resolve": true
}
@ -1098,6 +1237,62 @@
"buffer": true
}
},
"call-bind": {
"packages": {
"function-bind": true,
"get-intrinsic": true
}
},
"camel-case": {
"packages": {
"no-case": true,
"upper-case": true
}
},
"cbor": {
"globals": {
"TextDecoder": true
},
"packages": {
"bignumber.js": true,
"buffer": true,
"is-buffer": true,
"nofilter": true,
"stream-browserify": true,
"url": true,
"util": true
}
},
"cbor-sync": {
"globals": {
"define": true
},
"packages": {
"buffer": true
}
},
"change-case": {
"packages": {
"camel-case": true,
"constant-case": true,
"dot-case": true,
"header-case": true,
"is-lower-case": true,
"is-upper-case": true,
"lower-case": true,
"lower-case-first": true,
"no-case": true,
"param-case": true,
"pascal-case": true,
"path-case": true,
"sentence-case": true,
"snake-case": true,
"swap-case": true,
"title-case": true,
"upper-case": true,
"upper-case-first": true
}
},
"cids": {
"packages": {
"buffer": true,
@ -1152,6 +1347,22 @@
"color-name": true
}
},
"colors": {
"globals": {
"console.log": true
},
"packages": {
"os-browserify": true,
"process": true,
"util": true
}
},
"constant-case": {
"packages": {
"snake-case": true,
"upper-case": true
}
},
"cookiejar": {
"globals": {
"console.warn": true
@ -1159,7 +1370,7 @@
},
"copy-to-clipboard": {
"globals": {
"clipboardData.setData": true,
"clipboardData": true,
"console.error": true,
"console.warn": true,
"document.body.appendChild": true,
@ -1190,6 +1401,11 @@
"is-buffer": true
}
},
"crc": {
"packages": {
"buffer": true
}
},
"crc-32": {
"globals": {
"DO_NOT_EXPORT_CRC": true,
@ -1406,6 +1622,11 @@
"@babel/runtime": true
}
},
"dot-case": {
"packages": {
"no-case": true
}
},
"drbg.js": {
"packages": {
"buffer": true,
@ -1489,12 +1710,6 @@
"prr": true
}
},
"es-abstract": {
"packages": {
"function-bind": true,
"has-symbols": true
}
},
"eth-block-tracker": {
"globals": {
"clearTimeout": true,
@ -1662,6 +1877,11 @@
"trezor-connect": true
}
},
"ethereum-bloom-filters": {
"packages": {
"js-sha3": true
}
},
"ethereum-cryptography": {
"packages": {
"assert": true,
@ -1886,6 +2106,24 @@
"chrome": true
}
},
"faker": {
"globals": {
"console.error": true,
"console.log": true,
"dbg": "write"
}
},
"fast-check": {
"globals": {
"clearTimeout": true,
"console.log": true,
"setTimeout": true
},
"packages": {
"buffer": true,
"pure-rand": true
}
},
"fast-json-patch": {
"globals": {
"addEventListener": true,
@ -1933,6 +2171,18 @@
"webkitRTCSessionDescription": true
}
},
"get-intrinsic": {
"globals": {
"AggregateError": true,
"FinalizationRegistry": true,
"WeakRef": true
},
"packages": {
"function-bind": true,
"has": true,
"has-symbols": true
}
},
"get-params": {
"globals": {
"GetParams": "write"
@ -1975,6 +2225,11 @@
"sparse-array": true
}
},
"has": {
"packages": {
"function-bind": true
}
},
"has-binary2": {
"globals": {
"Blob": true,
@ -2006,12 +2261,19 @@
"hdkey": {
"packages": {
"assert": true,
"bs58check": true,
"coinstring": true,
"crypto-browserify": true,
"safe-buffer": true,
"secp256k1": true
}
},
"header-case": {
"packages": {
"no-case": true,
"upper-case": true
}
},
"heap": {
"globals": {
"define": true
@ -2495,11 +2757,22 @@
"multihashes": true
}
},
"is-lower-case": {
"packages": {
"lower-case": true
}
},
"is-regex": {
"packages": {
"call-bind": true,
"has-symbols": true
}
},
"is-upper-case": {
"packages": {
"upper-case": true
}
},
"iso-random-stream": {
"globals": {
"crypto": true,
@ -2558,6 +2831,16 @@
"console.warn": true
}
},
"jsbi": {
"globals": {
"define": true
}
},
"json-pointer": {
"packages": {
"foreach": true
}
},
"json-rpc-engine": {
"packages": {
"@metamask/safe-event-emitter": true,
@ -2645,6 +2928,7 @@
"packages": {
"buffer": true,
"inherits": true,
"readable-stream": true,
"safe-buffer": true,
"stream-browserify": true
}
@ -3099,12 +3383,22 @@
"util": true
}
},
"lower-case-first": {
"packages": {
"lower-case": true
}
},
"lru": {
"packages": {
"events": true,
"inherits": true
}
},
"lru-cache": {
"packages": {
"yallist": true
}
},
"ltgt": {
"packages": {
"is-buffer": true
@ -3274,6 +3568,11 @@
"crypto-browserify": true
}
},
"no-case": {
"packages": {
"lower-case": true
}
},
"node-forge": {
"globals": {
"Blob": true,
@ -3298,6 +3597,11 @@
"timers-browserify": true
}
},
"node-interval-tree": {
"packages": {
"shallowequal": true
}
},
"nodeify": {
"globals": {
"setTimeout": true
@ -3309,6 +3613,13 @@
"timers-browserify": true
}
},
"nofilter": {
"packages": {
"buffer": true,
"stream-browserify": true,
"util": true
}
},
"nonce-tracker": {
"packages": {
"assert": true,
@ -3504,6 +3815,11 @@
"p-map": true
}
},
"param-case": {
"packages": {
"no-case": true
}
},
"parse-asn1": {
"packages": {
"asn1.js": true,
@ -3513,11 +3829,22 @@
"pbkdf2": true
}
},
"pascal-case": {
"packages": {
"camel-case": true,
"upper-case-first": true
}
},
"path-browserify": {
"packages": {
"process": true
}
},
"path-case": {
"packages": {
"no-case": true
}
},
"path-to-regexp": {
"packages": {
"isarray": true
@ -3768,6 +4095,17 @@
"define": true
}
},
"qrcode.react": {
"globals": {
"Path2D": true,
"devicePixelRatio": true
},
"packages": {
"prop-types": true,
"qr.js": true,
"react": true
}
},
"rabin-wasm": {
"globals": {
"Blob": true,
@ -4074,8 +4412,7 @@
"console": true
},
"packages": {
"@babel/runtime": true,
"symbol-observable": true
"@babel/runtime": true
}
},
"redux-devtools-core": {
@ -4114,8 +4451,8 @@
},
"regexp.prototype.flags": {
"packages": {
"define-properties": true,
"es-abstract": true
"call-bind": true,
"define-properties": true
}
},
"relative-url": {
@ -4260,9 +4597,16 @@
"console": true
},
"packages": {
"lru-cache": true,
"process": true
}
},
"sentence-case": {
"packages": {
"no-case": true,
"upper-case-first": true
}
},
"set-immediate-shim": {
"globals": {
"setTimeout.apply": true
@ -4307,6 +4651,11 @@
"readable-stream": true
}
},
"snake-case": {
"packages": {
"no-case": true
}
},
"socket.io-client": {
"globals": {
"clearTimeout": true,
@ -4457,6 +4806,12 @@
"component-emitter": true
}
},
"swap-case": {
"packages": {
"lower-case": true,
"upper-case": true
}
},
"textarea-caret": {
"globals": {
"document.body.appendChild": true,
@ -4503,6 +4858,12 @@
"console": true
}
},
"title-case": {
"packages": {
"no-case": true,
"upper-case": true
}
},
"toggle-selection": {
"globals": {
"document.activeElement": true,
@ -4597,6 +4958,11 @@
"buffer": true
}
},
"upper-case-first": {
"packages": {
"upper-case": true
}
},
"url": {
"packages": {
"punycode": true,
@ -4711,6 +5077,21 @@
"uuid": true
}
},
"web3-utils": {
"globals": {
"setTimeout": true
},
"packages": {
"bn.js": true,
"eth-lib": true,
"ethereum-bloom-filters": true,
"ethjs-unit": true,
"is-buffer": true,
"number-to-bn": true,
"randombytes": true,
"utf8": true
}
},
"webrtcsupport": {
"globals": {
"AudioContext": true,

@ -29,7 +29,8 @@
},
"eslint-module-utils": {
"packages": {
"eslint-import-resolver-node": true
"eslint-import-resolver-node": true,
"@babel/eslint-parser": true
}
},
"node-sass": {

@ -12,19 +12,23 @@
"@babel/core": {
"builtin": {
"fs": true,
"module": true,
"path": true,
"url": true
"url": true,
"v8": true
},
"globals": {
"console.log": true,
"process.cwd": true,
"process.env.BABEL_ENV": true,
"process.env.BABEL_SHOW_CONFIG_FOR": true,
"process.env.NODE_ENV": true
"process.env.NODE_ENV": true,
"process.versions.node": true
},
"packages": {
"@babel/code-frame": true,
"@babel/generator": true,
"@babel/helper-compilation-targets": true,
"@babel/helper-module-transforms": true,
"@babel/helpers": true,
"@babel/parser": true,
@ -35,8 +39,6 @@
"debug": true,
"gensync": true,
"json5": true,
"lodash": true,
"resolve": true,
"semver": true,
"source-map": true
}
@ -76,22 +78,9 @@
"@babel/types": true
}
},
"@babel/helper-builder-react-jsx": {
"packages": {
"@babel/helper-annotate-as-pure": true,
"@babel/types": true
}
},
"@babel/helper-builder-react-jsx-experimental": {
"packages": {
"@babel/helper-annotate-as-pure": true,
"@babel/helper-module-imports": true,
"@babel/types": true
}
},
"@babel/helper-compilation-targets": {
"globals": {
"console.log": true,
"console.warn": true,
"process.versions.node": true
},
"packages": {
@ -107,6 +96,7 @@
},
"packages": {
"@babel/core": true,
"@babel/helper-annotate-as-pure": true,
"@babel/helper-function-name": true,
"@babel/helper-member-expression-to-functions": true,
"@babel/helper-optimise-call-expression": true,
@ -121,11 +111,22 @@
"regexpu-core": true
}
},
"@babel/helper-define-map": {
"@babel/helper-define-polyfill-provider": {
"builtin": {
"path": true
},
"globals": {
"console.log": true,
"console.warn": true,
"process.exitCode": "write",
"process.versions.node": true
},
"packages": {
"@babel/helper-function-name": true,
"@babel/types": true,
"lodash": true
"@babel/core": true,
"@babel/helper-compilation-targets": true,
"@babel/helper-plugin-utils": true,
"lodash.debounce": true,
"resolve": true
}
},
"@babel/helper-explode-assignable-expression": {
@ -177,8 +178,7 @@
"@babel/helper-validator-identifier": true,
"@babel/template": true,
"@babel/traverse": true,
"@babel/types": true,
"lodash": true
"@babel/types": true
}
},
"@babel/helper-optimise-call-expression": {
@ -237,6 +237,14 @@
"js-tokens": true
}
},
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
"packages": {
"@babel/core": true,
"@babel/helper-plugin-utils": true,
"@babel/helper-skip-transparent-expression-wrappers": true,
"@babel/plugin-proposal-optional-chaining": true
}
},
"@babel/plugin-proposal-async-generator-functions": {
"packages": {
"@babel/core": true,
@ -251,6 +259,13 @@
"@babel/helper-plugin-utils": true
}
},
"@babel/plugin-proposal-class-static-block": {
"packages": {
"@babel/helper-create-class-features-plugin": true,
"@babel/helper-plugin-utils": true,
"@babel/plugin-syntax-class-static-block": true
}
},
"@babel/plugin-proposal-dynamic-import": {
"packages": {
"@babel/helper-plugin-utils": true,
@ -292,7 +307,9 @@
},
"@babel/plugin-proposal-object-rest-spread": {
"packages": {
"@babel/compat-data": true,
"@babel/core": true,
"@babel/helper-compilation-targets": true,
"@babel/helper-plugin-utils": true,
"@babel/plugin-syntax-object-rest-spread": true,
"@babel/plugin-transform-parameters": true
@ -318,6 +335,14 @@
"@babel/helper-plugin-utils": true
}
},
"@babel/plugin-proposal-private-property-in-object": {
"packages": {
"@babel/helper-annotate-as-pure": true,
"@babel/helper-create-class-features-plugin": true,
"@babel/helper-plugin-utils": true,
"@babel/plugin-syntax-private-property-in-object": true
}
},
"@babel/plugin-proposal-unicode-property-regex": {
"packages": {
"@babel/helper-create-regexp-features-plugin": true,
@ -334,6 +359,11 @@
"@babel/helper-plugin-utils": true
}
},
"@babel/plugin-syntax-class-static-block": {
"packages": {
"@babel/helper-plugin-utils": true
}
},
"@babel/plugin-syntax-dynamic-import": {
"packages": {
"@babel/helper-plugin-utils": true
@ -384,6 +414,11 @@
"@babel/helper-plugin-utils": true
}
},
"@babel/plugin-syntax-private-property-in-object": {
"packages": {
"@babel/helper-plugin-utils": true
}
},
"@babel/plugin-syntax-top-level-await": {
"packages": {
"@babel/helper-plugin-utils": true
@ -418,7 +453,6 @@
"packages": {
"@babel/core": true,
"@babel/helper-annotate-as-pure": true,
"@babel/helper-define-map": true,
"@babel/helper-function-name": true,
"@babel/helper-optimise-call-expression": true,
"@babel/helper-plugin-utils": true,
@ -554,7 +588,9 @@
},
"@babel/plugin-transform-react-display-name": {
"builtin": {
"path": true
"path.basename": true,
"path.dirname": true,
"path.extname": true
},
"packages": {
"@babel/core": true,
@ -564,30 +600,15 @@
"@babel/plugin-transform-react-jsx": {
"packages": {
"@babel/core": true,
"@babel/helper-builder-react-jsx": true,
"@babel/helper-builder-react-jsx-experimental": true,
"@babel/helper-annotate-as-pure": true,
"@babel/helper-module-imports": true,
"@babel/helper-plugin-utils": true,
"@babel/plugin-syntax-jsx": true
}
},
"@babel/plugin-transform-react-jsx-development": {
"packages": {
"@babel/core": true,
"@babel/helper-builder-react-jsx-experimental": true,
"@babel/helper-plugin-utils": true,
"@babel/plugin-syntax-jsx": true
}
},
"@babel/plugin-transform-react-jsx-self": {
"packages": {
"@babel/core": true,
"@babel/helper-plugin-utils": true
}
},
"@babel/plugin-transform-react-jsx-source": {
"packages": {
"@babel/core": true,
"@babel/helper-plugin-utils": true
"@babel/plugin-transform-react-jsx": true
}
},
"@babel/plugin-transform-react-pure-annotations": {
@ -673,11 +694,12 @@
"packages": {
"@babel/compat-data": true,
"@babel/helper-compilation-targets": true,
"@babel/helper-module-imports": true,
"@babel/helper-plugin-utils": true,
"@babel/helper-validator-option": true,
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": true,
"@babel/plugin-proposal-async-generator-functions": true,
"@babel/plugin-proposal-class-properties": true,
"@babel/plugin-proposal-class-static-block": true,
"@babel/plugin-proposal-dynamic-import": true,
"@babel/plugin-proposal-export-namespace-from": true,
"@babel/plugin-proposal-json-strings": true,
@ -688,9 +710,11 @@
"@babel/plugin-proposal-optional-catch-binding": true,
"@babel/plugin-proposal-optional-chaining": true,
"@babel/plugin-proposal-private-methods": true,
"@babel/plugin-proposal-private-property-in-object": true,
"@babel/plugin-proposal-unicode-property-regex": true,
"@babel/plugin-syntax-async-generators": true,
"@babel/plugin-syntax-class-properties": true,
"@babel/plugin-syntax-class-static-block": true,
"@babel/plugin-syntax-dynamic-import": true,
"@babel/plugin-syntax-export-namespace-from": true,
"@babel/plugin-syntax-json-strings": true,
@ -700,6 +724,7 @@
"@babel/plugin-syntax-object-rest-spread": true,
"@babel/plugin-syntax-optional-catch-binding": true,
"@babel/plugin-syntax-optional-chaining": true,
"@babel/plugin-syntax-private-property-in-object": true,
"@babel/plugin-syntax-top-level-await": true,
"@babel/plugin-transform-arrow-functions": true,
"@babel/plugin-transform-async-to-generator": true,
@ -735,6 +760,9 @@
"@babel/plugin-transform-unicode-regex": true,
"@babel/preset-modules": true,
"@babel/types": true,
"babel-plugin-polyfill-corejs2": true,
"babel-plugin-polyfill-corejs3": true,
"babel-plugin-polyfill-regenerator": true,
"core-js-compat": true,
"semver": true
}
@ -742,11 +770,10 @@
"@babel/preset-react": {
"packages": {
"@babel/helper-plugin-utils": true,
"@babel/helper-validator-option": true,
"@babel/plugin-transform-react-display-name": true,
"@babel/plugin-transform-react-jsx": true,
"@babel/plugin-transform-react-jsx-development": true,
"@babel/plugin-transform-react-jsx-self": true,
"@babel/plugin-transform-react-jsx-source": true,
"@babel/plugin-transform-react-pure-annotations": true
}
},
@ -760,13 +787,13 @@
"@babel/traverse": {
"globals": {
"console.log": true,
"console.trace": true,
"process.env.NODE_ENV": true
"console.trace": true
},
"packages": {
"@babel/code-frame": true,
"@babel/generator": true,
"@babel/helper-function-name": true,
"@babel/helper-hoist-variables": true,
"@babel/helper-split-export-declaration": true,
"@babel/parser": true,
"@babel/types": true,
@ -781,7 +808,6 @@
},
"packages": {
"@babel/helper-validator-identifier": true,
"lodash": true,
"to-fast-properties": true
}
},
@ -945,11 +971,6 @@
"define": true
}
},
"acorn-dynamic-import": {
"packages": {
"acorn": true
}
},
"acorn-jsx": {
"packages": {
"acorn": true
@ -958,7 +979,6 @@
"acorn-node": {
"packages": {
"acorn": true,
"acorn-dynamic-import": true,
"acorn-walk": true,
"xtend": true
}
@ -1117,13 +1137,33 @@
"packages": {
"browserslist": true,
"caniuse-lite": true,
"colorette": true,
"normalize-range": true,
"num2fraction": true,
"picocolors": true,
"postcss": true,
"postcss-value-parser": true
}
},
"babel-plugin-polyfill-corejs2": {
"packages": {
"@babel/compat-data": true,
"@babel/core": true,
"@babel/helper-define-polyfill-provider": true,
"semver": true
}
},
"babel-plugin-polyfill-corejs3": {
"packages": {
"@babel/core": true,
"@babel/helper-define-polyfill-provider": true,
"core-js-compat": true
}
},
"babel-plugin-polyfill-regenerator": {
"packages": {
"@babel/helper-define-polyfill-provider": true
}
},
"babelify": {
"builtin": {
"path.extname": true,
@ -1675,7 +1715,7 @@
},
"deps-sort": {
"packages": {
"shasum": true,
"shasum-object": true,
"through2": true
}
},
@ -1773,15 +1813,9 @@
}
},
"es-abstract": {
"globals": {
"AggregateError": true,
"FinalizationRegistry": true,
"WeakRef": true
},
"packages": {
"call-bind": true,
"es-to-primitive": true,
"function-bind": true,
"get-intrinsic": true,
"has": true,
"has-symbols": true,
@ -3069,7 +3103,6 @@
"labeled-stream-splicer": {
"packages": {
"inherits": true,
"isarray": true,
"stream-splicer": true
}
},
@ -3196,6 +3229,12 @@
"define": true
}
},
"lodash.debounce": {
"globals": {
"clearTimeout": true,
"setTimeout": true
}
},
"log-symbols": {
"globals": {
"process.env.CI": true,
@ -3489,7 +3528,6 @@
"packages": {
"call-bind": true,
"define-properties": true,
"es-abstract": true,
"has-symbols": true,
"object-keys": true
}
@ -3534,14 +3572,6 @@
"make-iterator": true
}
},
"object.values": {
"packages": {
"call-bind": true,
"define-properties": true,
"es-abstract": true,
"has": true
}
},
"once": {
"packages": {
"wrappy": true
@ -3670,6 +3700,16 @@
"through": true
}
},
"picocolors": {
"builtin": {
"tty.isatty": true
},
"globals": {
"process.argv.includes": true,
"process.env": true,
"process.platform": true
}
},
"picomatch": {
"builtin": {
"path.basename": true,
@ -3727,6 +3767,7 @@
},
"packages": {
"chalk": true,
"picocolors": true,
"source-map": true,
"supports-color": true
}
@ -3767,13 +3808,9 @@
}
},
"postcss-selector-parser": {
"builtin": {
"util.deprecate": true
},
"packages": {
"cssesc": true,
"indexes-of": true,
"uniq": true
"util-deprecate": true
}
},
"postcss-syntax": {
@ -3861,6 +3898,11 @@
"pump": true
}
},
"qs": {
"packages": {
"side-channel": true
}
},
"quote-stream": {
"globals": {
"Buffer": true
@ -4272,6 +4314,17 @@
"json-stable-stringify": true
}
},
"shasum-object": {
"builtin": {
"crypto.createHash": true
},
"globals": {
"Buffer.isBuffer": true
},
"packages": {
"fast-safe-stringify": true
}
},
"shebang-command": {
"packages": {
"shebang-regex": true
@ -5200,8 +5253,8 @@
"yaml": {
"globals": {
"Buffer": true,
"_YAML_SILENCE_DEPRECATION_WARNINGS": true,
"_YAML_SILENCE_WARNINGS": true,
"YAML_SILENCE_DEPRECATION_WARNINGS": true,
"YAML_SILENCE_WARNINGS": true,
"atob": true,
"btoa": true,
"console.warn": true,

@ -1,6 +1,6 @@
{
"name": "metamask-crx",
"version": "10.7.1",
"version": "10.8.0",
"private": true,
"repository": {
"type": "git",
@ -60,6 +60,7 @@
"start:dev": "concurrently -k -n build,react,redux yarn:start yarn:devtools:react yarn:devtools:redux",
"announce": "node development/announcer.js",
"storybook": "start-storybook -p 6006 -c .storybook -s ./app,./.storybook/images",
"storybook:test": "jest --config=./jest.stories.config.js",
"storybook:build": "build-storybook -c .storybook -o storybook-build -s ./app,./.storybook/images",
"storybook:deploy": "storybook-to-ghpages --existing-output-dir storybook-build --remote storybook --branch master",
"update-changelog": "auto-changelog update",
@ -106,9 +107,11 @@
"@ethereumjs/tx": "^3.2.1",
"@formatjs/intl-relativetimeformat": "^5.2.6",
"@fortawesome/fontawesome-free": "^5.13.0",
"@keystonehq/bc-ur-registry-eth": "^0.6.8",
"@keystonehq/metamask-airgapped-keyring": "0.2.1",
"@material-ui/core": "^4.11.0",
"@metamask/contract-metadata": "^1.28.0",
"@metamask/controllers": "^17.0.0",
"@metamask/controllers": "^20.1.0",
"@metamask/eth-ledger-bridge-keyring": "^0.10.0",
"@metamask/eth-token-tracker": "^3.0.1",
"@metamask/etherscan-link": "^2.1.0",
@ -117,11 +120,15 @@
"@metamask/obs-store": "^5.0.0",
"@metamask/post-message-stream": "^4.0.0",
"@metamask/providers": "^8.1.1",
"@ngraveio/bc-ur": "^1.1.6",
"@popperjs/core": "^2.4.0",
"@reduxjs/toolkit": "^1.6.2",
"@sentry/browser": "^6.0.0",
"@sentry/integrations": "^6.0.0",
"@zxing/library": "^0.8.0",
"@truffle/codec": "^0.11.18",
"@truffle/decoder": "^5.1.0",
"@zxing/browser": "^0.0.10",
"@zxing/library": "0.8.0",
"analytics-node": "^3.4.0-beta.3",
"await-semaphore": "^0.1.1",
"base32-encode": "^1.2.0",
@ -145,7 +152,7 @@
"eth-query": "^2.1.2",
"eth-rpc-errors": "^4.0.2",
"eth-sig-util": "^3.0.0",
"eth-trezor-keyring": "^0.7.0",
"eth-trezor-keyring": "^0.9.1",
"ethereum-ens-network-map": "^1.0.2",
"ethereumjs-abi": "^0.6.4",
"ethereumjs-util": "^7.0.10",
@ -181,6 +188,7 @@
"pump": "^3.0.0",
"punycode": "^2.1.1",
"qrcode-generator": "1.4.1",
"qrcode.react": "^1.0.1",
"react": "^16.12.0",
"react-dnd": "^3.0.2",
"react-dnd-html5-backend": "^7.4.4",
@ -206,6 +214,7 @@
"swappable-obj-proxy": "^1.1.0",
"textarea-caret": "^3.0.1",
"unicode-confusables": "^0.1.1",
"uuid": "^8.3.2",
"valid-url": "^1.0.9",
"web3": "^0.20.7",
"web3-stream-provider": "^4.0.0"
@ -253,9 +262,10 @@
"babelify": "^10.0.0",
"bify-module-groups": "^1.0.0",
"brfs": "^2.0.2",
"browser-util-inspect": "^0.2.0",
"browserify": "^16.5.1",
"chalk": "^3.0.0",
"chromedriver": "^95.0.0",
"chromedriver": "^96.0.0",
"concurrently": "^5.2.0",
"copy-webpack-plugin": "^6.0.3",
"cross-spawn": "^7.0.3",
@ -299,7 +309,7 @@
"jest": "^26.6.3",
"jsdom": "^11.2.0",
"koa": "^2.7.0",
"lavamoat": "^5.3.4",
"lavamoat": "^5.3.5",
"lavamoat-browserify": "^14.0.3",
"lavamoat-viz": "^6.0.9",
"lockfile-lint": "^4.0.0",
@ -373,7 +383,9 @@
"@lavamoat/preinstall-always-fail": false,
"fsevents": false,
"node-hid": false,
"usb": false
"usb": false,
"blake-hash": false,
"protobufjs": false
}
}
}

@ -0,0 +1,62 @@
diff --git a/node_modules/@babel/runtime/helpers/extends.js b/node_modules/@babel/runtime/helpers/extends.js
index eaf9547..d0474f5 100644
--- a/node_modules/@babel/runtime/helpers/extends.js
+++ b/node_modules/@babel/runtime/helpers/extends.js
@@ -1,20 +1,5 @@
function _extends() {
- module.exports = _extends = Object.assign || function (target) {
- for (var i = 1; i < arguments.length; i++) {
- var source = arguments[i];
-
- for (var key in source) {
- if (Object.prototype.hasOwnProperty.call(source, key)) {
- target[key] = source[key];
- }
- }
- }
-
- return target;
- };
-
- module.exports["default"] = module.exports, module.exports.__esModule = true;
- return _extends.apply(this, arguments);
+ return Object.assign(...arguments)
}
module.exports = _extends;
diff --git a/node_modules/@babel/runtime/helpers/getPrototypeOf.js b/node_modules/@babel/runtime/helpers/getPrototypeOf.js
index a6916eb..e01b2d6 100644
--- a/node_modules/@babel/runtime/helpers/getPrototypeOf.js
+++ b/node_modules/@babel/runtime/helpers/getPrototypeOf.js
@@ -1,9 +1,5 @@
function _getPrototypeOf(o) {
- module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
- return o.__proto__ || Object.getPrototypeOf(o);
- };
- module.exports["default"] = module.exports, module.exports.__esModule = true;
- return _getPrototypeOf(o);
+ return Object.getPrototypeOf(o);
}
module.exports = _getPrototypeOf;
diff --git a/node_modules/@babel/runtime/helpers/setPrototypeOf.js b/node_modules/@babel/runtime/helpers/setPrototypeOf.js
index 415797b..63312f2 100644
--- a/node_modules/@babel/runtime/helpers/setPrototypeOf.js
+++ b/node_modules/@babel/runtime/helpers/setPrototypeOf.js
@@ -1,12 +1,7 @@
function _setPrototypeOf(o, p) {
- module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
- o.__proto__ = p;
- return o;
- };
-
- module.exports["default"] = module.exports, module.exports.__esModule = true;
- return _setPrototypeOf(o, p);
-}
+ o.__proto__ = p;
+ return o;
+};
module.exports = _setPrototypeOf;
module.exports["default"] = module.exports, module.exports.__esModule = true;
\ No newline at end of file

@ -0,0 +1,13 @@
diff --git a/node_modules/acorn/dist/acorn.js b/node_modules/acorn/dist/acorn.js
index 0523f0e..9d3d5c2 100644
--- a/node_modules/acorn/dist/acorn.js
+++ b/node_modules/acorn/dist/acorn.js
@@ -1835,7 +1835,7 @@
if (checkClashes) {
if (has(checkClashes, expr.name))
{ this.raiseRecoverable(expr.start, "Argument name clash"); }
- checkClashes[expr.name] = true;
+ Object.defineProperty(checkClashes, expr.name, { value: true, writable: true, enumerable: true, configurable: true })
}
if (bindingType !== BIND_NONE && bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); }
break

@ -0,0 +1,14 @@
diff --git a/node_modules/colors/lib/extendStringPrototype.js b/node_modules/colors/lib/extendStringPrototype.js
index 46fd386..c7d0fc5 100644
--- a/node_modules/colors/lib/extendStringPrototype.js
+++ b/node_modules/colors/lib/extendStringPrototype.js
@@ -5,7 +5,8 @@ module['exports'] = function() {
// Extends prototype of native string object to allow for "foo".red syntax
//
var addProperty = function(color, func) {
- String.prototype.__defineGetter__(color, func);
+ // remove prototype mutation so this plays well with LavaMoat
+ // String.prototype.__defineGetter__(color, func);
};
addProperty('strip', function() {

@ -1,17 +1,18 @@
diff --git a/node_modules/object.values/index.js b/node_modules/object.values/index.js
index b8ba091..2dc8083 100644
index abf0449..2dc8083 100644
--- a/node_modules/object.values/index.js
+++ b/node_modules/object.values/index.js
@@ -1,17 +1,3 @@
@@ -1,18 +1,3 @@
'use strict';
-var define = require('define-properties');
-var callBind = require('call-bind');
-
-var implementation = require('./implementation');
-var getPolyfill = require('./polyfill');
-var shim = require('./shim');
-
-var polyfill = getPolyfill();
-var polyfill = callBind(getPolyfill(), Object);
-
-define(polyfill, {
- getPolyfill: getPolyfill,

@ -1,25 +1,29 @@
diff --git a/node_modules/sass/sass.dart.js b/node_modules/sass/sass.dart.js
index fedd867..fef6a8f 100644
index 512d612..1374f5e 100644
--- a/node_modules/sass/sass.dart.js
+++ b/node_modules/sass/sass.dart.js
@@ -16,6 +16,9 @@ self.scheduleImmediate = self.setImmediate
@@ -16,6 +16,10 @@ self.scheduleImmediate = typeof setImmediate !== "undefined"
// CommonJS globals.
self.exports = exports;
+// realm bridge utility functions
+exports.bridgeJson = (target) => JSON.parse(JSON.stringify(target))
+exports.bridgeFn = (target) => ((...args) => target(...args))
+
// Node.js specific exports, check to see if they exist & or polyfilled
if (typeof process !== "undefined") {
@@ -3616,10 +3619,6 @@ self.fs = require("fs");
@@ -3700,13 +3704,6 @@ self.fs = require("fs");
return C.PlainJavaScriptObject_methods;
if (proto === Object.prototype)
return C.PlainJavaScriptObject_methods;
- if (typeof $constructor == "function") {
- Object.defineProperty($constructor, J.JS_INTEROP_INTERCEPTOR_TAG(), {value: C.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
- t1 = $._JS_INTEROP_INTERCEPTOR_TAG;
- if (t1 == null)
- t1 = $._JS_INTEROP_INTERCEPTOR_TAG = init.getIsolateTag("_$dart_js");
- Object.defineProperty($constructor, t1, {value: C.UnknownJavaScriptObject_methods, enumerable: false, writable: true, configurable: true});
- return C.UnknownJavaScriptObject_methods;
- }
return C.UnknownJavaScriptObject_methods;
},
JS_INTEROP_INTERCEPTOR_TAG: function() {
JSArray_JSArray$fixed: function($length, $E) {

@ -30,6 +30,17 @@ export const GAS_RECOMMENDATIONS = {
HIGH: 'high',
};
/**
* These represent types of gas estimation
*/
export const PRIORITY_LEVELS = {
LOW: 'low',
MEDIUM: 'medium',
HIGH: 'high',
CUSTOM: 'custom',
DAPP_SUGGESTED: 'dappSuggested',
};
/**
* Represents the user customizing their gas preference
*/

@ -1,5 +1,5 @@
/**
* Accounts can be instantiated from simple, HD or the two hardware wallet
* Accounts can be instantiated from simple, HD or the multiple hardware wallet
* keyring types. Both simple and HD are treated as default but we do special
* case accounts managed by a hardware wallet.
*/
@ -7,6 +7,14 @@ export const KEYRING_TYPES = {
LEDGER: 'Ledger Hardware',
TREZOR: 'Trezor Hardware',
LATTICE: 'Lattice Hardware',
QR: 'QR Hardware Wallet Device',
};
export const DEVICE_NAMES = {
LEDGER: 'ledger',
TREZOR: 'trezor',
QR: 'QR Hardware',
LATTICE: 'lattice',
};
/**

@ -84,12 +84,7 @@ export const WBNB_CONTRACT_ADDRESS =
export const WMATIC_CONTRACT_ADDRESS =
'0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270';
const METASWAP_ETH_API_HOST = 'https://api.metaswap.codefi.network';
const METASWAP_BSC_API_HOST = 'https://bsc-api.metaswap.codefi.network';
const SWAPS_TESTNET_CHAIN_ID = '0x539';
const SWAPS_TESTNET_HOST = 'https://metaswap-api.airswap-dev.codefi.network';
export const SWAPS_API_V2_BASE_URL = 'https://api2.metaswap.codefi.network';
export const SWAPS_DEV_API_V2_BASE_URL =
@ -111,14 +106,6 @@ export const ALLOWED_SWAPS_CHAIN_IDS = {
[RINKEBY_CHAIN_ID]: true,
};
// This is mapping for v1 URLs and will be removed once we migrate to v2.
export const METASWAP_CHAINID_API_HOST_MAP = {
[MAINNET_CHAIN_ID]: METASWAP_ETH_API_HOST,
[SWAPS_TESTNET_CHAIN_ID]: `${SWAPS_API_V2_BASE_URL}/networks/1`,
[BSC_CHAIN_ID]: METASWAP_BSC_API_HOST,
[RINKEBY_CHAIN_ID]: SWAPS_TESTNET_HOST,
};
export const SWAPS_CHAINID_CONTRACT_ADDRESS_MAP = {
[MAINNET_CHAIN_ID]: MAINNET_CONTRACT_ADDRESS,
[SWAPS_TESTNET_CHAIN_ID]: TESTNET_CONTRACT_ADDRESS,

@ -229,6 +229,21 @@ const multiplyCurrencies = (a, b, options = {}) => {
});
};
const divideCurrencies = (a, b, options = {}) => {
const { dividendBase, divisorBase, ...conversionOptions } = options;
if (!isValidBase(dividendBase) || !isValidBase(divisorBase)) {
throw new Error('Must specify valid dividendBase and divisorBase');
}
const value = getBigNumber(a, dividendBase).div(getBigNumber(b, divisorBase));
return converter({
value,
...conversionOptions,
});
};
const conversionGreaterThan = ({ ...firstProps }, { ...secondProps }) => {
const firstValue = converter({ ...firstProps });
const secondValue = converter({ ...secondProps });
@ -291,4 +306,5 @@ export {
decGWEIToHexWEI,
toBigNumber,
toNormalizedDenomination,
divideCurrencies,
};

@ -1,5 +1,9 @@
import BigNumber from 'bignumber.js';
import { addCurrencies, conversionUtil } from './conversion.utils';
import {
addCurrencies,
conversionUtil,
divideCurrencies,
} from './conversion.utils';
describe('conversion utils', () => {
describe('addCurrencies()', () => {
@ -163,4 +167,39 @@ describe('conversion utils', () => {
).toStrictEqual('1.5');
});
});
describe('divideCurrencies()', () => {
it('should correctly divide decimal values', () => {
const result = divideCurrencies(9, 3, {
dividendBase: 10,
divisorBase: 10,
});
expect(result.toNumber()).toStrictEqual(3);
});
it('should correctly divide hexadecimal values', () => {
const result = divideCurrencies(1000, 0xa, {
dividendBase: 16,
divisorBase: 16,
});
expect(result.toNumber()).toStrictEqual(0x100);
});
it('should correctly divide hexadecimal value from decimal value', () => {
const result = divideCurrencies(0x3e8, 0xa, {
dividendBase: 16,
divisorBase: 16,
});
expect(result.toNumber()).toStrictEqual(0x100);
});
it('should throw error for wrong base value', () => {
expect(() => {
divideCurrencies(0x3e8, 0xa, {
dividendBase: 10.5,
divisorBase: 7,
});
}).toThrow('Must specify valid dividendBase and divisorBase');
});
});
});

@ -2,8 +2,8 @@ import nock from 'nock';
import { MILLISECOND, SECOND } from '../constants/time';
import getFetchWithTimeout from './fetch-with-timeout';
describe('getFetchWithTimeout', function () {
it('fetches a url', async function () {
describe('getFetchWithTimeout', () => {
it('fetches a url', async () => {
nock('https://api.infura.io').get('/money').reply(200, '{"hodl": false}');
const fetchWithTimeout = getFetchWithTimeout(SECOND * 30);
@ -15,7 +15,7 @@ describe('getFetchWithTimeout', function () {
});
});
it('throws when the request hits a custom timeout', async function () {
it('throws when the request hits a custom timeout', async () => {
nock('https://api.infura.io')
.get('/moon')
.delay(SECOND * 2)
@ -23,19 +23,14 @@ describe('getFetchWithTimeout', function () {
const fetchWithTimeout = getFetchWithTimeout(MILLISECOND * 123);
const fetchWithTimeoutThrowsError = async () => {
await expect(async () => {
await fetchWithTimeout('https://api.infura.io/moon').then((r) =>
r.json(),
);
throw new Error('Request should throw');
};
await expect(fetchWithTimeoutThrowsError()).rejects.toThrow(
'The user aborted a request.',
);
}).rejects.toThrow('The user aborted a request.');
});
it('should abort the request when the custom timeout is hit', async function () {
it('should abort the request when the custom timeout is hit', async () => {
nock('https://api.infura.io')
.get('/moon')
.delay(SECOND * 2)
@ -43,29 +38,24 @@ describe('getFetchWithTimeout', function () {
const fetchWithTimeout = getFetchWithTimeout(MILLISECOND * 123);
const fetchWithTimeoutThrowsError = async () => {
await expect(async () => {
await fetchWithTimeout('https://api.infura.io/moon').then((r) =>
r.json(),
);
throw new Error('Request should be aborted');
};
await expect(fetchWithTimeoutThrowsError()).rejects.toThrow(
'The user aborted a request.',
);
}).rejects.toThrow('The user aborted a request.');
});
it('throws on invalid timeout', async function () {
expect(() => getFetchWithTimeout()).toThrow(
it('throws on invalid timeout', async () => {
await expect(() => getFetchWithTimeout()).toThrow(
'Must specify positive integer timeout.',
);
expect(() => getFetchWithTimeout(-1)).toThrow(
await expect(() => getFetchWithTimeout(-1)).toThrow(
'Must specify positive integer timeout.',
);
expect(() => getFetchWithTimeout({})).toThrow(
await expect(() => getFetchWithTimeout({})).toThrow(
'Must specify positive integer timeout.',
);
expect(() => getFetchWithTimeout(true)).toThrow(
await expect(() => getFetchWithTimeout(true)).toThrow(
'Must specify positive integer timeout.',
);
});

@ -6,51 +6,51 @@ describe('hexstring utils', function () {
it('should allow 40-char non-prefixed hex', function () {
const address = 'fdea65c8e26263f6d9a1b5de9555d2931a33b825';
const result = isValidHexAddress(address);
expect(result).toBe(true);
expect(result).toStrictEqual(true);
});
it('should allow 42-char prefixed hex', function () {
const address = '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825';
const result = isValidHexAddress(address);
expect(result).toBe(true);
expect(result).toStrictEqual(true);
});
it('should NOT allow 40-char non-prefixed hex when allowNonPrefixed is false', function () {
const address = 'fdea65c8e26263f6d9a1b5de9555d2931a33b825';
const result = isValidHexAddress(address, { allowNonPrefixed: false });
expect(result).toBe(false);
expect(result).toStrictEqual(false);
});
it('should NOT allow any length of non hex-prefixed string', function () {
const address = 'fdea65c8e26263f6d9a1b5de9555d2931a33b85';
const result = isValidHexAddress(address);
expect(result).toBe(false);
expect(result).toStrictEqual(false);
});
it('should NOT allow less than 42 character hex-prefixed string', function () {
const address = '0xfdea65ce26263f6d9a1b5de9555d2931a33b85';
const result = isValidHexAddress(address);
expect(result).toBe(false);
expect(result).toStrictEqual(false);
});
it('should recognize correct capitalized checksum', function () {
const address = '0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825';
const result = isValidHexAddress(address, { mixedCaseUseChecksum: true });
expect(result).toBe(true);
expect(result).toStrictEqual(true);
});
it('should recognize incorrect capitalized checksum', function () {
const address = '0xFDea65C8e26263F6d9A1B5de9555D2931A33b825';
const result = isValidHexAddress(address, { mixedCaseUseChecksum: true });
expect(result).toBe(false);
expect(result).toStrictEqual(false);
});
it('should recognize this sample hashed address', function () {
const address = '0x5Fda30Bb72B8Dfe20e48A00dFc108d0915BE9Bb0';
const result = isValidHexAddress(address, { mixedCaseUseChecksum: true });
const hashed = toChecksumAddress(address.toLowerCase());
expect(hashed).toBe(address);
expect(result).toBe(true);
expect(hashed).toStrictEqual(address);
expect(result).toStrictEqual(true);
});
});
});

@ -38,6 +38,14 @@ export const UI_NOTIFICATIONS = {
id: 8,
date: '2021-11-01',
},
9: {
id: 9,
date: '2021-12-07',
image: {
src: 'images/txinsights.png',
width: '80%',
},
},
};
export const getTranslatedUINoficiations = (t, locale) => {
@ -113,5 +121,16 @@ export const getTranslatedUINoficiations = (t, locale) => {
),
actionText: t('notifications8ActionText'),
},
9: {
...UI_NOTIFICATIONS[9],
title: t('notifications9Title'),
description: [
t('notifications9DescriptionOne'),
t('notifications9DescriptionTwo'),
],
date: new Intl.DateTimeFormat(formattedLocale).format(
new Date(UI_NOTIFICATIONS[9].date),
),
},
};
};

@ -0,0 +1,27 @@
{
"fee-market": {
"gasEstimateType": "fee-market",
"gasFeeEstimates": {
"low": {
"minWaitTimeEstimate": 180000,
"maxWaitTimeEstimate": 300000,
"suggestedMaxPriorityFeePerGas": "3",
"suggestedMaxFeePerGas": "53"
},
"medium": {
"minWaitTimeEstimate": 15000,
"maxWaitTimeEstimate": 60000,
"suggestedMaxPriorityFeePerGas": "7",
"suggestedMaxFeePerGas": "70"
},
"high": {
"minWaitTimeEstimate": 0,
"maxWaitTimeEstimate": 15000,
"suggestedMaxPriorityFeePerGas": "10",
"suggestedMaxFeePerGas": "100"
},
"estimatedBaseFee": "50"
},
"estimatedGasFeeTimeBounds": {}
}
}

@ -349,14 +349,14 @@ describe('MetaMask', function () {
});
it('displays the token transfer data', async function () {
await driver.clickElement({ text: 'Data', tag: 'button' });
await driver.clickElement({ text: 'Hex', tag: 'button' });
await driver.delay(regularDelayMs);
const functionType = await driver.findElement(
'.confirm-page-container-content__function-type',
);
const functionTypeText = await functionType.getText();
assert.equal(functionTypeText, 'Transfer');
assert(functionTypeText.match('Transfer'));
const tokenAmount = await driver.findElement(
'.confirm-page-container-summary__title-text',

@ -34,13 +34,16 @@ describe('Address Book', function () {
await driver.clickElement('.dialog.send__dialog.dialog--message');
// wait for address book modal to be visible
const addressModal = await driver.findElement('span .modal');
const addressModal = await driver.findElement('.nickname-popover');
await driver.findElement('.add-to-address-book-modal');
await driver.fill('.add-to-address-book-modal__input', 'Test Name 1');
await driver.clickElement(
'.add-to-address-book-modal__footer .btn-primary',
await driver.clickElement('.nickname-popover__footer-button');
await driver.findElement('.update-nickname__wrapper');
await driver.fill(
'.update-nickname__content__text-field input',
'Test Name 1',
);
await driver.clickElement('.update-nickname__save');
// wait for address book modal to be removed from DOM
await addressModal.waitForElementState('hidden');

@ -1,5 +1,5 @@
const { strict: assert } = require('assert');
const { withFixtures, regularDelayMs } = require('../helpers');
const { withFixtures, regularDelayMs, largeDelayMs } = require('../helpers');
const enLocaleMessages = require('../../../app/_locales/en/messages.json');
describe('Metamask Import UI', function () {
@ -318,6 +318,7 @@ describe('Metamask Import UI', function () {
// should open the TREZOR Connect popup
await driver.clickElement('.hw-connect__btn:nth-of-type(2)');
await driver.delay(largeDelayMs * 2);
await driver.clickElement({ text: 'Continue', tag: 'button' });
await driver.waitUntilXWindowHandles(2);
const allWindows = await driver.getAllWindowHandles();

@ -62,7 +62,7 @@ describe('Editing Confirm Transaction', function () {
// has correct updated value on the confirm screen the transaction
const editedTransactionAmounts = await driver.findElements(
'.transaction-detail-item__row .transaction-detail-item__detail-text .currency-display-component__text',
'.transaction-detail-item__row .transaction-detail-item__detail-values .currency-display-component__text:last-of-type',
);
const editedTransactionAmount = editedTransactionAmounts[0];
assert.equal(await editedTransactionAmount.getText(), '0.0008');

@ -1,2 +1,2 @@
export const METASWAP_BASE_URL = 'https://api.metaswap.codefi.network';
export const METASWAP_API_V2_BASE_URL = 'https://api2.metaswap.codefi.network';
export const METASWAP_BASE_URL = 'https://api2.metaswap.codefi.network';
export const GAS_API_URL = 'https://gas-api.metaswap.codefi.network';

@ -221,7 +221,6 @@ export const createSwapsMockStore = () => {
topAggId: 'TEST_AGG_BEST',
routeState: '',
swapsFeatureIsLive: false,
useNewSwapsApi: false,
},
useTokenDetection: true,
tokenList: {

@ -239,6 +239,7 @@ export default class AccountMenu extends Component {
case KEYRING_TYPES.TREZOR:
case KEYRING_TYPES.LEDGER:
case KEYRING_TYPES.LATTICE:
case KEYRING_TYPES.QR:
label = t('hardware');
break;
case 'Simple Key Pair':

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

Loading…
Cancel
Save