Merge pull request #14912 from MetaMask/Version-v10.16.0

Version v10.16.0 RC
feature/default_network_editable
Dan J Miller 2 years ago committed by GitHub
commit f09ab88891
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      .circleci/config.yml
  2. 4
      .circleci/scripts/chrome-install.sh
  3. 2
      .github/ISSUE_TEMPLATE/bug-report.yml
  4. 16
      .github/PULL_REQUEST_TEMPLATE.md
  5. 2
      .storybook/1.INTRODUCTION.stories.mdx
  6. 29
      .storybook/3.COLORS.stories.mdx
  7. 1921
      .storybook/initial-states/transactions.js
  8. 88
      .storybook/test-data.js
  9. 67
      CHANGELOG.md
  10. 4
      app/_locales/am/messages.json
  11. 2
      app/_locales/ar/messages.json
  12. 4
      app/_locales/bg/messages.json
  13. 4
      app/_locales/bn/messages.json
  14. 4
      app/_locales/ca/messages.json
  15. 4
      app/_locales/da/messages.json
  16. 32
      app/_locales/de/messages.json
  17. 32
      app/_locales/el/messages.json
  18. 109
      app/_locales/en/messages.json
  19. 32
      app/_locales/es/messages.json
  20. 17
      app/_locales/es_419/messages.json
  21. 4
      app/_locales/et/messages.json
  22. 4
      app/_locales/fa/messages.json
  23. 4
      app/_locales/fi/messages.json
  24. 4
      app/_locales/fil/messages.json
  25. 32
      app/_locales/fr/messages.json
  26. 2
      app/_locales/he/messages.json
  27. 30
      app/_locales/hi/messages.json
  28. 4
      app/_locales/hr/messages.json
  29. 2
      app/_locales/hu/messages.json
  30. 30
      app/_locales/id/messages.json
  31. 17
      app/_locales/it/messages.json
  32. 30
      app/_locales/ja/messages.json
  33. 4
      app/_locales/kn/messages.json
  34. 30
      app/_locales/ko/messages.json
  35. 4
      app/_locales/lt/messages.json
  36. 4
      app/_locales/lv/messages.json
  37. 4
      app/_locales/ms/messages.json
  38. 4
      app/_locales/no/messages.json
  39. 17
      app/_locales/ph/messages.json
  40. 4
      app/_locales/pl/messages.json
  41. 32
      app/_locales/pt/messages.json
  42. 17
      app/_locales/pt_BR/messages.json
  43. 4
      app/_locales/ro/messages.json
  44. 32
      app/_locales/ru/messages.json
  45. 4
      app/_locales/sk/messages.json
  46. 4
      app/_locales/sl/messages.json
  47. 4
      app/_locales/sr/messages.json
  48. 4
      app/_locales/sv/messages.json
  49. 4
      app/_locales/sw/messages.json
  50. 36
      app/_locales/tl/messages.json
  51. 34
      app/_locales/tr/messages.json
  52. 4
      app/_locales/uk/messages.json
  53. 32
      app/_locales/vi/messages.json
  54. 34
      app/_locales/zh/messages.json
  55. 17
      app/_locales/zh_CN/messages.json
  56. 4
      app/_locales/zh_TW/messages.json
  57. 5
      app/home.html
  58. 1
      app/manifest/v2/_base.json
  59. 0
      app/manifest/v2/brave.json
  60. 0
      app/manifest/v2/chrome.json
  61. 0
      app/manifest/v2/firefox.json
  62. 0
      app/manifest/v2/opera.json
  63. 82
      app/manifest/v3/_base.json
  64. 1
      app/manifest/v3/brave.json
  65. 7
      app/manifest/v3/chrome.json
  66. 26
      app/manifest/v3/firefox.json
  67. 9
      app/manifest/v3/opera.json
  68. 5
      app/popup.html
  69. 55
      app/scripts/app-init.js
  70. 57
      app/scripts/background.js
  71. 1
      app/scripts/constants/on-ramp.js
  72. 7
      app/scripts/contentscript.js
  73. 20
      app/scripts/controllers/detect-tokens.js
  74. 10
      app/scripts/controllers/metametrics.js
  75. 16
      app/scripts/controllers/metametrics.test.js
  76. 2
      app/scripts/controllers/permissions/flask/snap-permissions.js
  77. 46
      app/scripts/controllers/swaps.js
  78. 9
      app/scripts/controllers/swaps.test.js
  79. 129
      app/scripts/controllers/transactions/index.js
  80. 135
      app/scripts/controllers/transactions/index.test.js
  81. 46
      app/scripts/lib/buy-url.js
  82. 29
      app/scripts/lib/metaRPCClientFactory.js
  83. 17
      app/scripts/lib/metaRPCClientFactory.test.js
  84. 2
      app/scripts/lib/rpc-method-middleware/handlers/add-ethereum-chain.js
  85. 145
      app/scripts/metamask-controller.js
  86. 34
      app/scripts/metamask-controller.test.js
  87. 30
      app/scripts/migrations/072.js
  88. 427
      app/scripts/migrations/072.test.js
  89. 2
      app/scripts/migrations/index.js
  90. 14
      app/scripts/platforms/extension.js
  91. 27
      app/scripts/platforms/extension.test.js
  92. 43
      app/scripts/ui.js
  93. 6
      development/build/manifest.js
  94. 62
      development/build/scripts.js
  95. 2
      development/jest.config.js
  96. 2
      docs/trezor-emulator.md
  97. 10
      jest.config.js
  98. 490
      lavamoat/browserify/beta/policy.json
  99. 517
      lavamoat/browserify/flask/policy.json
  100. 490
      lavamoat/browserify/main/policy.json
  101. Some files were not shown because too many files have changed in this diff Show More

@ -670,6 +670,13 @@ jobs:
- run:
name: test:coverage:jest
command: yarn test:coverage:jest
- run:
name: Validate coverage thresholds
command: |
if ! git diff --exit-code jest.config.js development/jest.config.js; then
echo "Detected changes in coverage thresholds"
exit 1
fi
- persist_to_workspace:
root: .
paths:

@ -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='100.0.4896.60-1'
CHROME_VERSION='102.0.5005.61-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='d7a98777650e8218fef4acc8466d4ddf5e234b97fbc16c33f38f69f9ebfe7b6bb6827a90aad15ea729d7c1bacfa78488c5d5194b531f00f454302dd9c0957e4e'
CHROME_BINARY_SHA512SUM='dd701b99febf7d927657f38716d90f3a0b967ae75dac5f6e8fbf9df632c8a531ccb9f37ee09340ad730b4fe40d0564c1b64201121d2d3e4e503f3f167ca632cd'
wget -O "${CHROME_BINARY}" -t 5 "${CHROME_BINARY_URL}"

@ -1,7 +1,7 @@
name: Bug Report
description: Using MetaMask, but it's not working as you expect?
title: "[Bug]: "
labels: ["bug"]
labels: ["type-bug"]
body:
- type: markdown
attributes:

@ -15,7 +15,7 @@ This is a problem because ...
In order to solve this problem, this pull request ...
-->
## More information
## More Information
<!--
Are there any issues, Slack conversations, Zendesk issues, user stories, etc. reviewers should consult to understand this pull request better? For instance:
@ -36,7 +36,7 @@ Are there any issues, Slack conversations, Zendesk issues, user stories, etc. re
<!-- How does it look now? Drag your file(s) below this line: -->
## Manual testing steps
## Manual Testing Steps
<!--
How should reviewers and QA manually test your changes? For instance:
@ -45,3 +45,15 @@ How should reviewers and QA manually test your changes? For instance:
- Do this
- Then do this
-->
## Pre-Merge Checklist
- [ ] PR template is filled out
- [ ] **IF** this PR fixes a bug, a test that _would have_ caught the bug has been added
- [ ] PR is linked to the appropriate GitHub issue
- [ ] PR has been added to the appropriate release Milestone
### + If there are functional changes:
- [ ] Manual testing complete & passed
- [ ] "Extension QA Board" label has been applied

@ -8,7 +8,7 @@ Welcome to the MetaMask Browser Extension Storybook.
## Building locally and Contributing
This document is currently only specific to storybook best practices and component documentation guidelines. This may change in future but for now if you are looking to get a local build of Metamask up and running or contribute to the extension codebase please read the Metamask [README.md](https://github.com/MetaMask/metamask-extension)
This document is currently only specific to storybook best practices and component documentation guidelines. This may change in future but for now if you are looking to get a local build of MetaMask up and running or contribute to the extension codebase please read the MetaMask [README.md](https://github.com/MetaMask/metamask-extension)
## Documentation Guidelines

@ -67,6 +67,7 @@ var(--color-text-muted)
/** Icons */
var(--color-icon-default)
var(--color-icon-alternative)
var(--color-icon-muted)
/** Borders */
@ -75,20 +76,20 @@ var(--color-border-muted)
/** Overlays */
var(--color-overlay-default)
var(--color-overlay-inverse)
var(--color-overlay-inverse) [DEPRECATED]
/** User Actions */
var(--color-primary-default)
var(--color-primary-alternative)
var(--color-primary-muted)
var(--color-primary-inverse)
var(--color-primary-disabled)
var(--color-primary-disabled) [DEPRECATED]
var(--color-secondary-default)
var(--color-secondary-alternative)
var(--color-secondary-muted)
var(--color-secondary-inverse)
var(--color-secondary-disabled)
var(--color-secondary-default) [DEPRECATED]
var(--color-secondary-alternative) [DEPRECATED]
var(--color-secondary-muted) [DEPRECATED]
var(--color-secondary-inverse) [DEPRECATED]
var(--color-secondary-disabled) [DEPRECATED]
/** States */
/** Error */
@ -96,28 +97,28 @@ var(--color-error-default)
var(--color-error-alternative)
var(--color-error-muted)
var(--color-error-inverse)
var(--color-error-disabled)
var(--color-error-disabled) [DEPRECATED]
/** Warning */
var(--color-warning-default)
var(--color-warning-alternative)
var(--color-warning-alternative) [DEPRECATED]
var(--color-warning-muted)
var(--color-warning-inverse)
var(--color-warning-disabled)
var(--color-warning-disabled) [DEPRECATED]
/** Success */
var(--color-success-default)
var(--color-success-alternative)
var(--color-success-alternative) [DEPRECATED]
var(--color-success-muted)
var(--color-success-inverse)
var(--color-success-disabled)
var(--color-success-disabled) [DEPRECATED]
/** Info */
var(--color-info-default)
var(--color-info-alternative)
var(--color-info-alternative) [DEPRECATED]
var(--color-info-muted)
var(--color-info-inverse)
var(--color-info-disabled)
var(--color-info-disabled) [DEPRECATED]
```
### **Component colors** (tier 3)

File diff suppressed because it is too large Load Diff

@ -112,6 +112,65 @@ const state = {
],
metamask: {
tokenList: {
'0x514910771af9ca656af840dff83e8264ecf986ca': {
address: '0x514910771af9ca656af840dff83e8264ecf986ca',
symbol: 'LINK',
decimals: 18,
name: 'ChainLink Token',
iconUrl: 'https://crypto.com/price/coin-data/icon/LINK/color_icon.png',
aggregators: [
'Aave',
'Bancor',
'CMC',
'Crypto.com',
'CoinGecko',
'1inch',
'Paraswap',
'PMM',
'Zapper',
'Zerion',
'0x',
],
occurrences: 12,
unlisted: false
},
'0xc00e94cb662c3520282e6f5717214004a7f26888': {
address: '0xc00e94cb662c3520282e6f5717214004a7f26888',
symbol: 'COMP',
decimals: 18,
name: 'Compound',
iconUrl: 'https://crypto.com/price/coin-data/icon/COMP/color_icon.png',
aggregators: [
'Bancor',
'CMC',
'Crypto.com',
'CoinGecko',
'1inch',
'Paraswap',
'PMM',
'Zapper',
'Zerion',
'0x',
],
occurrences: 12,
unlisted: false
},
'0xfffffffff15abf397da76f1dcc1a1604f45126db': {
address: '0xfffffffff15abf397da76f1dcc1a1604f45126db',
symbol: 'FSW',
decimals: 18,
name: 'Falconswap',
iconUrl: 'https://assets.coingecko.com/coins/images/12256/thumb/falconswap.png?1598534184',
aggregators: [
'CoinGecko',
'1inch',
'Paraswap',
'Zapper',
'Zerion',
],
occurrences: 12,
unlisted: false
},
'0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f': {
address: '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f',
symbol: 'SNX',
@ -425,6 +484,35 @@ const state = {
decimals: 18,
},
],
detectedTokens: [
{
address: "0x514910771AF9Ca656af840dff83E8264EcF986CA",
decimals: 18,
symbol: "LINK",
image: "https://crypto.com/price/coin-data/icon/LINK/color_icon.png",
aggregators:[
"coinGecko","oneInch","paraswap","zapper","zerion"
]
},
{
address: "0xc00e94Cb662C3520282E6f5717214004A7f26888",
decimals: 18,
symbol: "COMP",
image: "https://crypto.com/price/coin-data/icon/COMP/color_icon.png",
aggregators:[
"bancor","cmc","cryptocom","coinGecko","oneInch","paraswap","pmm","zapper","zerion","zeroEx"
]
},
{
address: "0xfffffffFf15AbF397dA76f1dcc1A1604F45126DB",
decimals: 18,
symbol: "FSW",
image: "https://assets.coingecko.com/coins/images/12256/thumb/falconswap.png?1598534184",
aggregators:[
"aave", "cmc","coinGecko","oneInch","paraswap","zapper","zerion"
]
}
],
pendingTokens: {},
customNonceValue: '',
send: {

@ -6,6 +6,68 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [10.16.0]
### Added
- Add friendly error handling screen, when UI fails to connect to background ([#14461](https://github.com/MetaMask/metamask-extension/pull/14461))
- Add fiat onboarding for AVAX and MATIC through Wyre ([#14683](https://github.com/MetaMask/metamask-extension/pull/14683))
- Add Coinbase Pay as fiat onramp option ([#14648](https://github.com/MetaMask/metamask-extension/pull/14648))
- Add search information for Theme dropdown ([#14476](https://github.com/MetaMask/metamask-extension/pull/14476))
- **[FLASK]** Add in-app notifications for snaps ([#14605](https://github.com/MetaMask/metamask-extension/pull/14605))
- **[FLASK]** Add `long-running` snap permission ([#14700](https://github.com/MetaMask/metamask-extension/pull/14700))
### Changed
- Update caret icon color on Home Page for darkmode, from black to white ([#14835](https://github.com/MetaMask/metamask-extension/pull/14835))
- Update the color of the ledger alert text to adhere to design system guidelines ([#14674](https://github.com/MetaMask/metamask-extension/pull/14674))
- Standardize display of connected site's origin data on all confirmation screens ([#14720](https://github.com/MetaMask/metamask-extension/pull/14720))
- Improved app loading performance
- Improve loading performance by patching the "secp256k1" package ([#14677](https://github.com/MetaMask/metamask-extension/pull/14677))
- Patch gridplus-sdk module for improving performance ([#14582](https://github.com/MetaMask/metamask-extension/pull/14582))
- Swaps: ensure that native currency swap amounts are properly displayed on all networks, avoiding a bug where swap received amounts could equal gas costs ([#14821](https://github.com/MetaMask/metamask-extension/pull/14821))
- Swaps: reduce the default slippage from 3% to 2% ([#14863](https://github.com/MetaMask/metamask-extension/pull/14863))
- Swaps: update STX status content page ([#14805](https://github.com/MetaMask/metamask-extension/pull/14805))
- Make STX status timer behaviour dependent on API values
- Change "Swap complete in < X:XX" to "Swap will complete in < X:XX"
- Change "Privately submitting the Swap..." to "Privately submitting your Swap..."
- Swaps: disable STX if a regular tx is in progress ([#14554](https://github.com/MetaMask/metamask-extension/pull/14554))
- Swaps: remove gas editing ([#14673](https://github.com/MetaMask/metamask-extension/pull/14673))
- **[FLASK]** Improve snap install screen ([#14803](https://github.com/MetaMask/metamask-extension/pull/14803), ([#14752](https://github.com/MetaMask/metamask-extension/pull/14752)))
- **[FLASK] BREAKING** Bump `@metamask/key-tree` used by snaps to `4.0.0` ([#14700](https://github.com/MetaMask/metamask-extension/pull/14700))
- **[FLASK]** Stopped showing confirmations for terminated snaps ([#14566](https://github.com/MetaMask/metamask-extension/pull/14566))
### Fixed
- Fix line-wrapping in Edit Nickname screen by decreasing the padding ([#14842](https://github.com/MetaMask/metamask-extension/pull/14842))
- Fix 'Currency Symbol' detection in network settings when using Firefox ([#14810](https://github.com/MetaMask/metamask-extension/pull/14810))
- Fix switching between ETH and USD in the amount field on the send screen ([#13827](https://github.com/MetaMask/metamask-extension/pull/13827))
- Fix addition of 'add recipient' events to the send flow change logs so that 'contact' and 'recent' recipient are correctly distinguished ([#14771](https://github.com/MetaMask/metamask-extension/pull/14771))
- Fix lock button sizing for text exceeding button boundaries ([#14335](https://github.com/MetaMask/metamask-extension/pull/14335))
- Fix all "MetaMask" instances wrongly written as "Metamask"
- ([#14851](https://github.com/MetaMask/metamask-extension/pull/14851))
- ([#14848](https://github.com/MetaMask/metamask-extension/pull/14848))
- Fix design break on the Settings navbar for certain locales ([#14012](https://github.com/MetaMask/metamask-extension/pull/14012))
- Fix missing white spacing for keystone transaction qrcode in darkmode ([#14798](https://github.com/MetaMask/metamask-extension/pull/14798))
- Fix rare bug that could cause unexpected accounts to be generated from Ledger and connected to MetaMask ([#14799](https://github.com/MetaMask/metamask-extension/pull/14799))
- Fix bug that could cause the incorrect token to be selected after editing the token via the send edit flow ([#14721](https://github.com/MetaMask/metamask-extension/pull/14721))
- Fix chain ID field to use the same color pattern as the currency symbol field warning message ([#14627](https://github.com/MetaMask/metamask-extension/pull/14627))
- Fix currency conversion rate on the Edit tx screen ([#14713](https://github.com/MetaMask/metamask-extension/pull/14713))
- Fix sign button so it is enabled after scrolling all the way to the bottom on the sign type data confirmation screen ([#14745](https://github.com/MetaMask/metamask-extension/pull/14745))
- Fix wrong tx type text for `Safe Transaction From` ([#14769](https://github.com/MetaMask/metamask-extension/pull/14769))
- Fix "Site Suggested" tooltip in `EditGasFeeBtn` to only display the origin of dapp suggested gas fee if the origin is provided ([#14734](https://github.com/MetaMask/metamask-extension/pull/14734))
- Fix incorrect line breaks on footer buttons from NetworksTab ([#14733](https://github.com/MetaMask/metamask-extension/pull/14733))
- Fix incorrect currency symbol in the send flow history state logs ([#14726](https://github.com/MetaMask/metamask-extension/pull/14726))
- Fix batch cancel/reject for signature requests ([#13786](https://github.com/MetaMask/metamask-extension/pull/13786))
- Fix "Learn more" dialog broken link from Eth Sign ([#14667](https://github.com/MetaMask/metamask-extension/pull/14667))
- Fix mixed text for Speed up/Cancel information ([#14551](https://github.com/MetaMask/metamask-extension/pull/14551))
- Fix SRP paste duplication ([#14625](https://github.com/MetaMask/metamask-extension/pull/14625))
- Fix onboarding functionality so that users of dapps using our onboarding library are redirected to the dapp after completing onboarding ([#14550](https://github.com/MetaMask/metamask-extension/pull/14550))
- Fix error handling for signature methods so that proper errors are returned to dapps when there is a permissions error ([#14126](https://github.com/MetaMask/metamask-extension/pull/14126))
- Fix `Speed Up` and `Cancel` button styles from `TransactionListItem` consolidating them with `TransactionListItemDetails` buttons ([#14659](https://github.com/MetaMask/metamask-extension/pull/14659))
- Fix to prevent display of misleading or malicious contract method names ([#14937](https://github.com/MetaMask/metamask-extension/pull/14937))
- Swaps: fix wrong colour for the high price impact notification ([#14697](https://github.com/MetaMask/metamask-extension/pull/14697))
- Swaps: fix edge case when missing top assets ([#14688](https://github.com/MetaMask/metamask-extension/pull/14688))
- **[FLASK]** Fix issues with the snap startup process and usage of `WebAssembly` ([#14772](https://github.com/MetaMask/metamask-extension/pull/14772))
- **[FLASK]** Fix issues with snap id encoding ([#14693](https://github.com/MetaMask/metamask-extension/pull/14693))
- **[FLASK]** Fix multiple smaller bugs with snaps ([#14670](https://github.com/MetaMask/metamask-extension/pull/14670))
## [10.15.1]
### Fixed
- Fix Ledger connection failures that can occur after remove all hardware wallet accounts and reconnecting ([#14993](https://github.com/MetaMask/metamask-extension/pull/14993))
@ -25,7 +87,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Ensure theme selection dropdown is discoverable via settings search([#14379](https://github.com/MetaMask/metamask-extension/pull/14379))
- Stop using the 4bytes registry to name contract deployment transactions in the activity list, preventing false method names from being shown for deployments ([#14598](https://github.com/MetaMask/metamask-extension/pull/14598))
- Save send flow user action history in transaction state logs ([#14510](https://github.com/MetaMask/metamask-extension/pull/14510))
- Update Gridplus to use https://github.com/GridPlus/gridplus-sdk/compare/v1.1.6...v1.2.4 ([#14467](https://github.com/MetaMask/metamask-extension/pull/14467))
- Update GridPlus to use https://github.com/GridPlus/gridplus-sdk/compare/v1.1.6...v1.2.4 ([#14467](https://github.com/MetaMask/metamask-extension/pull/14467))
### Fixed
@ -2969,7 +3031,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.15.1...HEAD
[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v10.16.0...HEAD
[10.16.0]: https://github.com/MetaMask/metamask-extension/compare/v10.15.1...v10.16.0
[10.15.1]: https://github.com/MetaMask/metamask-extension/compare/v10.15.0...v10.15.1
[10.15.0]: https://github.com/MetaMask/metamask-extension/compare/v10.14.7...v10.15.0
[10.14.7]: https://github.com/MetaMask/metamask-extension/compare/v10.14.6...v10.14.7

@ -131,10 +131,10 @@
"message": "ማሰሺያዎት አልተደገፈም..."
},
"buyWithWyre": {
"message": "ETH በ Wyre ይግዙ"
"message": "$1 በ Wyre ይግዙ"
},
"buyWithWyreDescription": {
"message": "Wyre ክሬዲት ካርድ ተጠቅመው ETH በቀጥታ በ MetaMask መለያዎ ላይ እንዲያስቀምጡ ያስችልዎታል።"
"message": "Wyre ክሬዲት ካርድ ተጠቅመው $1 በቀጥታ በ MetaMask መለያዎ ላይ እንዲያስቀምጡ ያስችልዎታል።"
},
"bytes": {
"message": "ባይት"

@ -148,7 +148,7 @@
"message": "قم بشراء عملة إيثير بواسطة Wyre"
},
"buyWithWyreDescription": {
"message": "يتيح لك Wyre استخدام بطاقة ائتمان لإيداع ETH مباشرة في حساب MetaMask الخاص بك."
"message": "يتيح لك Wyre استخدام بطاقة ائتمان لإيداع 1$ مباشرة في حساب MetaMask الخاص بك."
},
"bytes": {
"message": "بايتات"

@ -137,10 +137,10 @@
"message": "Браузърът ви не се поддържа ..."
},
"buyWithWyre": {
"message": "Купете ETH с Wyre"
"message": "Купете $1 с Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre ви позволява да използвате кредитна карта, за да депозирате ETH право във вашата MetaMask сметка."
"message": "Wyre ви позволява да използвате кредитна карта, за да депозирате $1 право във вашата MetaMask сметка."
},
"bytes": {
"message": "Байта"

@ -137,10 +137,10 @@
"message": "আপনর বউজর সমরিত নয়..."
},
"buyWithWyre": {
"message": "Wyre দি ETHরয় করন"
"message": "Wyre দি $1রয় করন"
},
"buyWithWyreDescription": {
"message": "Wyre আপনর MetaMask অউন সরসরি ETH জম করত আপন একটিিট কড বযবহর করতয়।"
"message": "Wyre আপনর MetaMask অউন সরসরি $1 জম করত আপন একটিিট কড বযবহর করতয়।"
},
"bytes": {
"message": "বইটস"

@ -137,10 +137,10 @@
"message": "El teu navegador no és suportat..."
},
"buyWithWyre": {
"message": "Compra ETH amb Wyre"
"message": "Compra $1 amb Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre et permet utilitzar una targeta de crèdit per dipositar ETH directe al teu compte MetaMask."
"message": "Wyre et permet utilitzar una targeta de crèdit per dipositar $1 directe al teu compte MetaMask."
},
"cancel": {
"message": "Cancel·la"

@ -137,10 +137,10 @@
"message": "Din browser er ikke understøttet..."
},
"buyWithWyre": {
"message": "Køb ETH med Wyre"
"message": "Køb $1 med Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre lader dig bruge et kreditkort til at indbetale ETH på din MetaMask-konto."
"message": "Wyre lader dig bruge et kreditkort til at indbetale $1 på din MetaMask-konto."
},
"bytes": {
"message": "Byte"

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "Ich stimme zu"
},
"aggregatorFeeCost": {
"message": "Aggregator-Netzwerkgebühr"
},
"airgapVault": {
"message": "AirGap-Tresor"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Netzwerkgebühr für Freigabe und Aggregator"
},
"approvalTxGasCost": {
"message": "Tx-Gaskosten genehmigen"
},
"approve": {
"message": "Genehmigen"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "ETH mit Wyre kaufen"
"message": "$1 mit Wyre kaufen"
},
"buyWithWyreDescription": {
"message": "Wyre ermöglicht Ihnen die Verwendung einer Kreditkarte zum direkten Einzahlen von ETH auf Ihr MetaMask-Konto."
"message": "Wyre ermöglicht Ihnen die Verwendung einer Kreditkarte zum direkten Einzahlen von $1 auf Ihr MetaMask-Konto."
},
"bytes": {
"message": "Bytes"
@ -640,7 +631,7 @@
"message": "Vertragsinteraktion"
},
"convertTokenToNFTDescription": {
"message": "Wir haben festgestellt, dass dieses Asset eine NFT ist. Metamask hat jetzt volle native Unterstützung für NFTs. Möchten Sie es aus Ihrer Tokenliste entfernen und als NFT hinzufügen?"
"message": "Wir haben festgestellt, dass dieses Asset eine NFT ist. MetaMask hat jetzt volle native Unterstützung für NFTs. Möchten Sie es aus Ihrer Tokenliste entfernen und als NFT hinzufügen?"
},
"convertTokenToNFTExistDescription": {
"message": "Wir haben festgestellt, dass dieses Asset als NFT hinzugefügt wurde. Möchten Sie es aus Ihrer Token-Liste entfernen?"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "Externe Erweiterung"
},
"extraApprovalGas": {
"message": "+$1 Genehmigungsgas",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Fehlgeschlagen"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "Sie können Ihre Token immer noch tauschen, selbst während intelligente Transaktionen nicht verfügbar sind."
},
"stxPendingFinalizing": {
"message": "Wird finalisiert ..."
},
"stxPendingOptimizingGas": {
"message": "Gas wird optimiert ..."
},
"stxPendingPrivatelySubmitting": {
"message": "Swap wird privat eingereicht ..."
},
"stxSubDescription": {
"message": "* Intelligente Transaktionen versuchen mehrmals, Ihre Transaktion privat zu übermitteln. Wenn alle Versuche fehlschlagen, wird die Transaktion öffentlich übertragen, um sicherzustellen, dass Ihr Swap erfolgreich durchgeführt wird."
},
@ -3193,10 +3171,6 @@
"message": "Keine Token verfügbar mit $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"
},
"swapCompleteIn": {
"message": "Swap abgeschlossen in <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "Mit Ihrer Hardware-Wallet bestätigen"
},

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "Συμφωνώ"
},
"aggregatorFeeCost": {
"message": "Αμοιβή ανταλλακτηρίου"
},
"airgapVault": {
"message": "Θησαυροφυλάκιο AirGap"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Τέλος έγκρισης και δικτύου ανταλλακτηρίου"
},
"approvalTxGasCost": {
"message": "Έγκριση Tx τέλους συναλλαγής"
},
"approve": {
"message": "Έγκριση"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Αγοράστε ETH με το Wyre"
"message": "Αγοράστε $1 με το Wyre"
},
"buyWithWyreDescription": {
"message": "Το Wyre σας επιτρέπει να χρησιμοποιήσετε μια πιστωτική κάρτα για να καταθέσετε ETH απευθείας στον λογαριασμό σας MetaTask."
"message": "Το Wyre σας επιτρέπει να χρησιμοποιήσετε μια πιστωτική κάρτα για να καταθέσετε $1 απευθείας στον λογαριασμό σας MetaTask."
},
"bytes": {
"message": "Bytes"
@ -640,7 +631,7 @@
"message": "Αλληλεπίδραση Σύμβασης"
},
"convertTokenToNFTDescription": {
"message": "Εντοπίσαμε ότι αυτό το περιουσιακό στοιχείο είναι NFT. Το Metamask υποστηρίζει πλέον εξ'ορισμού πλήρως τα NFT. Θέλετε να το αφαιρέσετε από τη λίστα των token σας και να το προσθέσετε ως NFT;"
"message": "Εντοπίσαμε ότι αυτό το περιουσιακό στοιχείο είναι NFT. Το MetaMask υποστηρίζει πλέον εξ'ορισμού πλήρως τα NFT. Θέλετε να το αφαιρέσετε από τη λίστα των token σας και να το προσθέσετε ως NFT;"
},
"convertTokenToNFTExistDescription": {
"message": "Εντοπίσαμε ότι αυτό το περιουσιακό στοιχείο προστέθηκε ως NFT. Θέλετε να το αφαιρέσετε από τη λίστα των token σας;"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "Εξωτερική Επέκταση"
},
"extraApprovalGas": {
"message": "+$1 τέλος συναλλαγής",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Απέτυχε"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "Μπορείτε να ανταλλάξετε ακόμα τα token σας, ακόμα και αν οι Έξυπνες Συναλλαγές δεν είναι διαθέσιμες."
},
"stxPendingFinalizing": {
"message": "Ολοκλήρωση..."
},
"stxPendingOptimizingGas": {
"message": "Βελτιστοποίηση τελών συναλλαγής..."
},
"stxPendingPrivatelySubmitting": {
"message": "Ιδιωτική υποβολή της Ανταλλαγής..."
},
"stxSubDescription": {
"message": "* Οι Έξυπνες Συναλλαγές θα προσπαθήσουν να υποβάλουν τη συναλλαγή σας ιδιωτικά, πολλές φορές. Εάν όλες οι προσπάθειες αποτύχουν, η συναλλαγή θα μεταδοθεί δημόσια για να διασφαλιστεί η επιτυχής πραγματοποίηση της ανταλλαγής σας."
},
@ -3193,10 +3171,6 @@
"message": "Δεν υπάρχουν διαθέσιμα tokens που να ταιριάζουν σε $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"
},
"swapCompleteIn": {
"message": "Η ανταλλαγή θα ολοκληρωθεί σε <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "Επιβεβαιώστε με το υλικό πορτοφόλι σας"
},

@ -203,9 +203,6 @@
"affirmAgree": {
"message": "I Agree"
},
"aggregatorFeeCost": {
"message": "Aggregator network fee"
},
"airgapVault": {
"message": "AirGap Vault"
},
@ -263,12 +260,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Approval and aggregator network fee"
},
"approvalTxGasCost": {
"message": "Approval Tx Gas Cost"
},
"approve": {
"message": "Approve spend limit"
},
@ -420,6 +411,14 @@
"message": "Buy $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
"buyCryptoWithCoinbasePay": {
"message": "Buy $1 with Coinbase Pay",
"description": "$1 represents the crypto symbol to be purchased"
},
"buyCryptoWithCoinbasePayDescription": {
"message": "You can easily buy or transfer crypto with your Coinbase account.",
"description": "$1 represents the crypto symbol to be purchased"
},
"buyCryptoWithMoonPay": {
"message": "Buy $1 with MoonPay",
"description": "$1 represents the cypto symbol to be purchased"
@ -436,10 +435,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Buy ETH with Wyre"
"message": "Buy $1 with Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre lets you use a debit card to deposit ETH right in to your MetaMask account."
"message": "Easy onboarding for purchases up to $ 1000. Fast interactive high limit purchase verification. Supports Debit/Credit Card, Apple Pay, Bank Transfers. Available in 100+ countries. Tokens deposit into your MetaMask Account"
},
"bytes": {
"message": "Bytes"
@ -626,6 +625,9 @@
"continue": {
"message": "Continue"
},
"continueToCoinbasePay": {
"message": "Continue to Coinbase Pay"
},
"continueToMoonPay": {
"message": "Continue to MoonPay"
},
@ -651,7 +653,7 @@
"message": "Contract Interaction"
},
"convertTokenToNFTDescription": {
"message": "We've detected that this asset is an NFT. Metamask now has full native support for NFTs. Would you like to remove it from your token list and add it as an NFT?"
"message": "We've detected that this asset is an NFT. MetaMask now has full native support for NFTs. Would you like to remove it from your token list and add it as an NFT?"
},
"convertTokenToNFTExistDescription": {
"message": "We’ve detected that this asset has been added as an NFT. Would you like to remove it from your token list?"
@ -1185,10 +1187,6 @@
"externalExtension": {
"message": "External Extension"
},
"extraApprovalGas": {
"message": "+$1 approval gas",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Failed"
},
@ -1476,6 +1474,12 @@
"history": {
"message": "History"
},
"ignoreAll": {
"message": "Ignore all"
},
"ignoreTokenWarning": {
"message": "If you hide tokens, they will not be shown in your wallet. However, you can still add them by searching for them."
},
"import": {
"message": "Import",
"description": "Button to import an account from a selected file"
@ -1525,6 +1529,10 @@
"importWallet": {
"message": "Import wallet"
},
"importWithCount": {
"message": "Import $1",
"description": "$1 will the number of detected tokens that are selected for importing, if all of them are selected then $1 will be all"
},
"importYourExisting": {
"message": "Import your existing wallet using a Secret Recovery Phrase"
},
@ -2035,6 +2043,13 @@
"newToMetaMask": {
"message": "New to MetaMask?"
},
"newTokensImportedMessage": {
"message": "You’ve successfully imported $1.",
"description": "$1 is the string of symbols of all the tokens imported"
},
"newTokensImportedTitle": {
"message": "Token imported"
},
"newTotal": {
"message": "New Total"
},
@ -2051,6 +2066,9 @@
"message": "Nonce is higher than suggested nonce of $1",
"description": "The next nonce according to MetaMask's internal logic"
},
"nft": {
"message": "NFT"
},
"nftTokenIdPlaceholder": {
"message": "Enter the Token ID"
},
@ -2117,6 +2135,9 @@
"notEnoughGas": {
"message": "Not Enough Gas"
},
"notifications": {
"message": "Notifications"
},
"notifications10ActionText": {
"message": "Visit in settings",
"description": "The 'call to action' on the button, or link, of the 'Visit in settings' notification. Upon clicking, users will be taken to settings page."
@ -2237,6 +2258,19 @@
"notifications9Title": {
"message": "👓 We are making transactions easier to read."
},
"notificationsEmptyText": {
"message": "Nothing to see here."
},
"notificationsHeader": {
"message": "Notifications"
},
"notificationsInfos": {
"message": "$1 from $2",
"description": "$1 is the date at which the notification has been dispatched and $2 is the link to the snap that dispatched the notification."
},
"notificationsMarkAllAsRead": {
"message": "Mark all as read"
},
"numberOfNewTokensDetected": {
"message": "$1 new tokens found in this account",
"description": "$1 is the number of new tokens detected"
@ -2411,6 +2445,10 @@
"message": "See address, account balance, activity and suggest transactions to approve",
"description": "The description for the `eth_accounts` permission"
},
"permission_longRunning": {
"message": "Run indefinitely.",
"description": "The description for the `endowment:long-running` permission"
},
"permission_manageBip44Keys": {
"message": "Control your \"$1\" accounts and assets.",
"description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'."
@ -2617,6 +2655,9 @@
"resetWalletWarning": {
"message": "Make sure you’re using the correct Secret Recovery Phrase before proceeding. You will not be able to undo this."
},
"restartMetamask": {
"message": "Restart MetaMask"
},
"restore": {
"message": "Restore"
},
@ -2801,6 +2842,9 @@
"sendAmount": {
"message": "Send Amount"
},
"sendBugReport": {
"message": "Send us a bug report."
},
"sendSpecifiedTokens": {
"message": "Send $1",
"description": "Symbol of the specified token"
@ -3074,6 +3118,9 @@
"message": "Connect your wallet directly to your computer. Unlock your Ledger and open the Ethereum app. For more on using your hardware wallet device, $1.",
"description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key"
},
"stillGettingMessage": {
"message": "Still getting this message?"
},
"storePhrase": {
"message": "Store this phrase in a password manager like 1Password."
},
@ -3126,14 +3173,11 @@
"stxFallbackUnavailable": {
"message": "You can still swap your tokens even while Smart Transactions are unavailable."
},
"stxPendingFinalizing": {
"message": "Finalizing..."
"stxPendingPrivatelySubmittingSwap": {
"message": "Privately submitting your Swap..."
},
"stxPendingOptimizingGas": {
"message": "Optimizing gas..."
},
"stxPendingPrivatelySubmitting": {
"message": "Privately submitting the Swap..."
"stxPendingPubliclySubmittingSwap": {
"message": "Publicly submitting your Swap..."
},
"stxSubDescription": {
"message": "* Smart Transactions will attempt to submit your transaction privately, multiple times. If all attempts fail, the transaction will be broadcast publicly to ensure your Swap successfully goes through."
@ -3145,6 +3189,10 @@
"message": "Your $1 is now available.",
"description": "$1 is a token symbol, e.g. ETH"
},
"stxSwapCompleteIn": {
"message": "Swap will complete in <",
"description": "'<' means 'less than', e.g. Swap will complete in < 2:59"
},
"stxTooltip": {
"message": "Simulate transactions before submitting to decrease transaction costs and reduce failures."
},
@ -3223,10 +3271,6 @@
"message": "No tokens available matching $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"
},
"swapCompleteIn": {
"message": "Swap complete in <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "Confirm with your hardware wallet"
},
@ -3408,6 +3452,10 @@
"swapSlippageNegative": {
"message": "Slippage must be greater or equal to zero"
},
"swapSlippagePercent": {
"message": "$1%",
"description": "$1 is the amount of % for slippage"
},
"swapSource": {
"message": "Liquidity source"
},
@ -3641,6 +3689,10 @@
"tokenSymbol": {
"message": "Token Symbol"
},
"tokensFoundTitle": {
"message": "$1 new tokens found",
"description": "$1 is the number of new tokens detected"
},
"tooltipApproveButton": {
"message": "I understand"
},
@ -3762,6 +3814,9 @@
"message": "We had trouble connecting to your $1, try reviewing $2 and try again.",
"description": "$1 is the wallet device name; $2 is a link to wallet connection guide"
},
"troubleStarting": {
"message": "MetaMask had trouble starting. This error could be intermittent, so try restarting the extension."
},
"troubleTokenBalances": {
"message": "We had trouble loading your token balances. You can view them ",
"description": "Followed by a link (here) to view token balances"

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "Acepto"
},
"aggregatorFeeCost": {
"message": "Cuota de red de agregador"
},
"airgapVault": {
"message": "Bóveda AirGap"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Cuota de red de agregador y aprobación"
},
"approvalTxGasCost": {
"message": "Costo de gas por transacción de aprobación"
},
"approve": {
"message": "Aprobar límite de gastos"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Comprar ETH con Wyre"
"message": "Comprar $1 con Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre le permite usar una tarjeta de débito para depositar ETH directamente en su cuenta de MetaMask."
"message": "Acceso fácil a transacciones de $ 1,000 o menos con verificación rápida y efectiva. Aceptamos tarjetas débito, crédito, Apple Pay y transferencias bancarias en más de 100 países. Tokens serán depósitados en su MetaMask."
},
"bytes": {
"message": "Bytes"
@ -640,7 +631,7 @@
"message": "Interacción con el contrato"
},
"convertTokenToNFTDescription": {
"message": "Hemos detectado que este activo es un NFT. Metamask ahora tiene soporte nativo completo para NFTs. ¿Quieres eliminarlo de tu lista de tokens y añadirlo como un NFT?"
"message": "Hemos detectado que este activo es un NFT. MetaMask ahora tiene soporte nativo completo para NFTs. ¿Quieres eliminarlo de tu lista de tokens y añadirlo como un NFT?"
},
"convertTokenToNFTExistDescription": {
"message": "Hemos detectado que este recurso se ha agregado como NFT. ¿Quiere eliminarlo de su lista de tokens?"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "Extensión externa"
},
"extraApprovalGas": {
"message": "+$1 gas por aprobación",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Con errores"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "Todavía puede intercambiar sus tokens incluso cuando las transacciones inteligentes no están disponibles."
},
"stxPendingFinalizing": {
"message": "Finalizando…"
},
"stxPendingOptimizingGas": {
"message": "Optimizando gas..."
},
"stxPendingPrivatelySubmitting": {
"message": "Enviando el Swap de forma privada..."
},
"stxSubDescription": {
"message": "* Transacciones inteligentes intentará enviar su transacción de forma privada varias veces. Si todos los intentos fallan, la transacción se transmitirá públicamente para garantizar que su swap se realice con éxito."
},
@ -3193,10 +3171,6 @@
"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"
},
"swapCompleteIn": {
"message": "Swap finalizado en <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "Confirmar con la cartera de hardware"
},

@ -179,9 +179,6 @@
"affirmAgree": {
"message": "Acepto"
},
"aggregatorFeeCost": {
"message": "Cuota de red de agregador"
},
"alertDisableTooltip": {
"message": "Esto se puede modificar en \"Configuración > Alertas\""
},
@ -233,12 +230,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Cuota de red de agregador y aprobación"
},
"approvalTxGasCost": {
"message": "Costo de gas por transacción de aprobación"
},
"approve": {
"message": "Aprobar límite de gastos"
},
@ -372,10 +363,10 @@
"message": "Comprar"
},
"buyWithWyre": {
"message": "Comprar ETH con Wyre"
"message": "Comprar $1 con Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre le permite usar una tarjeta de débito para depositar ETH directamente en su cuenta de MetaMask."
"message": "Wyre le permite usar una tarjeta de débito para depositar $1 directamente en su cuenta de MetaMask."
},
"bytes": {
"message": "Bytes"
@ -1047,10 +1038,6 @@
"externalExtension": {
"message": "Extensión externa"
},
"extraApprovalGas": {
"message": "+$1 de gas por aprobación",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Con errores"
},

@ -137,10 +137,10 @@
"message": "Teie lehitsejat ei toetata..."
},
"buyWithWyre": {
"message": "Ostke ETH-d Wyre'iga"
"message": "Ostke $1 -d Wyre'iga"
},
"buyWithWyreDescription": {
"message": "Wyre võimaldab kasutada krediitkaarti, et teha ETH sissemakse otse MetaMaski kontole."
"message": "Wyre võimaldab kasutada krediitkaarti, et teha $1 sissemakse otse MetaMaski kontole."
},
"bytes": {
"message": "Baidid"

@ -137,10 +137,10 @@
"message": "مرورگر شما پشتیبانی نمیشود"
},
"buyWithWyre": {
"message": "ETH را توسط Wyre خریداری نمایید"
"message": "$1 را توسط Wyre خریداری نمایید"
},
"buyWithWyreDescription": {
"message": "Wyre به شما اجازه میدهد تا یک کردیت کارت را جهت پرداخت ETH مستقیمًا به حساب MetaMask تان استفاده نمایید."
"message": "Wyre به شما اجازه میدهد تا یک کردیت کارت را جهت پرداخت 1$ مستقیمًا به حساب MetaMask تان استفاده نمایید."
},
"bytes": {
"message": "بایت ها"

@ -137,10 +137,10 @@
"message": "Selaintasi ei tueta..."
},
"buyWithWyre": {
"message": "Osta ETH:ta Wyrella"
"message": "Osta $1 :ta Wyrella"
},
"buyWithWyreDescription": {
"message": "Wyre antaa sinun käyttää luottokorttia, jotta voit tallettaa ETH:ta suoraan MetaMask-tilillesi."
"message": "Wyre antaa sinun käyttää luottokorttia, jotta voit tallettaa $1 :ta suoraan MetaMask-tilillesi."
},
"bytes": {
"message": "Tavua"

@ -122,10 +122,10 @@
"message": "Hindi sinusuportahan ang iyong Browser..."
},
"buyWithWyre": {
"message": "Bumili ng ETH gamit ang Wyre"
"message": "Bumili ng $1 gamit ang Wyre"
},
"buyWithWyreDescription": {
"message": "Binibigyang-daan ka ng Wyre na gumamit ng credit card para magdeposito ng ETH nang direkta sa iyong MetaMask account."
"message": "Binibigyang-daan ka ng Wyre na gumamit ng credit card para magdeposito ng $1 nang direkta sa iyong MetaMask account."
},
"cancel": {
"message": "Kanselahin"

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "Je suis d’accord"
},
"aggregatorFeeCost": {
"message": "Frais de réseau de l’agrégateur"
},
"airgapVault": {
"message": "Coffre-fort AirGap"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Approbation et frais du réseau d’agrégateur"
},
"approvalTxGasCost": {
"message": "Approbation du coût de carburant Tx"
},
"approve": {
"message": "Approuver"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Acheter des ETH avec Wyre"
"message": "Acheter des $1 avec Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre vous permet d’utiliser une carte de crédit pour déposer des ETH directement sur votre compte MetaMask."
"message": "Wyre vous permet d’utiliser une carte de crédit pour déposer des $1 directement sur votre compte MetaMask."
},
"bytes": {
"message": "Octets"
@ -640,7 +631,7 @@
"message": "Interaction avec un contrat"
},
"convertTokenToNFTDescription": {
"message": "Nous avons détecté que cet actif est un NFT. Metamask prend désormais nativement en charge les NFT. Voulez-vous le retirer de votre liste de tokens et l’ajouter comme un NFT ?"
"message": "Nous avons détecté que cet actif est un NFT. MetaMask prend désormais nativement en charge les NFT. Voulez-vous le retirer de votre liste de tokens et l’ajouter comme un NFT ?"
},
"convertTokenToNFTExistDescription": {
"message": "Nous avons détecté que cet actif a été ajouté en tant que NFT. Souhaitez-vous le retirer de votre liste de tokens ?"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "Extension externe"
},
"extraApprovalGas": {
"message": "+$1 de carburant approuvé",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Échec"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "Vous pouvez toujours faire un swap de tokens, même si les transactions intelligentes ne sont pas disponibles."
},
"stxPendingFinalizing": {
"message": "Finalisation..."
},
"stxPendingOptimizingGas": {
"message": "Optimisation des gas fees..."
},
"stxPendingPrivatelySubmitting": {
"message": "Soumission privée du swap..."
},
"stxSubDescription": {
"message": "* Avec les transactions intelligentes, votre transaction sera soumise plusieurs fois en privé. Si toutes les tentatives échouent, la transaction sera diffusée publiquement pour s’assurer de la réussite de votre swap."
},
@ -3193,10 +3171,6 @@
"message": "Aucun jeton disponible correspondant à $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"
},
"swapCompleteIn": {
"message": "Swap terminé dans <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "Confirmez avec votre portefeuille matériel"
},

@ -140,7 +140,7 @@
"message": "רכישת את'ר עם Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre מאפשרת לך להשתמש בכרטיס אשראי כדי להפקיד ETH ישירות בחשבון ה-MetaMask שלך."
"message": "Wyre מאפשרת לך להשתמש בכרטיס אשראי כדי להפקיד $1 ישירות בחשבון ה-MetaMask שלך."
},
"bytes": {
"message": "בייטים"

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "म सहमत ह"
},
"aggregatorFeeCost": {
"message": "एगटर नटवरक शक"
},
"airgapVault": {
"message": "AirGap कट"
},
@ -252,12 +249,6 @@
"message": "MetaMask Fask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "अनदन और एगटर नटवरक शक"
},
"approvalTxGasCost": {
"message": "अनदन Tx गस कमत"
},
"approve": {
"message": "खरच स अनित कर"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Wyre क जरिETH खर"
"message": "Wyre क जरि$1 खर"
},
"buyWithWyreDescription": {
"message": "Wyre आपक अपन MetaMask ख ETH जम करनिए डिट कड क उपयग करनि।"
"message": "Wyre आपक अपन MetaMask ख $1 जम करनिए डिट कड क उपयग करनि।"
},
"bytes": {
"message": "बइट"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "बहरिर"
},
"extraApprovalGas": {
"message": "+$1 अनदन गस",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "विफल"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "सट लनदन अनपलबध ह पर भ आप अपनकनप कर सकत।"
},
"stxPendingFinalizing": {
"message": "फइनलइज कर रह..."
},
"stxPendingOptimizingGas": {
"message": "गस ऑपिइज कर रह..."
},
"stxPendingPrivatelySubmitting": {
"message": "सप किर पर सबमिट कर रह..."
},
"stxSubDescription": {
"message": "* सट लनदन आपकनदन किर पर, अनक बर जम करनरयस कर। यदि सभरयस विफल ह, तनदन कवजनिक रप सरसित किएगि यह सिित ह सकि आपकप सफलतवक प।"
},
@ -3193,10 +3171,6 @@
"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"
},
"swapCompleteIn": {
"message": "सप प <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "अपनडवयर वट सि कर"
},

@ -137,10 +137,10 @@
"message": "Vaš se preglednik ne podržava..."
},
"buyWithWyre": {
"message": "Kupi ETH Wyerom"
"message": "Kupi $1 Wyerom"
},
"buyWithWyreDescription": {
"message": "Wyreom vam se omogućava korištenje kreditnom karticom za polaganje ETH-a izravno na vaš račun za MetaMask."
"message": "Wyreom vam se omogućava korištenje kreditnom karticom za polaganje $1 -a izravno na vaš račun za MetaMask."
},
"bytes": {
"message": "Bajtovi"

@ -137,7 +137,7 @@
"message": "Az ön böngészője nem támogatott..."
},
"buyWithWyre": {
"message": "Vásároljon ETH-t a Wyre-rel"
"message": "Vásároljon $1 -t a Wyre-rel"
},
"buyWithWyreDescription": {
"message": "A Wyre segítségével egyensen a MetaMaks fiókjában tehet letétbe ETH-t."

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "Saya Setuju"
},
"aggregatorFeeCost": {
"message": "Biaya jaringan agregator"
},
"airgapVault": {
"message": "Brankas AirGap"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Persetujuan dan biaya jaringan agregator"
},
"approvalTxGasCost": {
"message": "Persetujuan Ongkos Jaringan Tx"
},
"approve": {
"message": "Setujui batas penggunaan"
},
@ -425,7 +416,7 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Beli ETH dengan Wyre"
"message": "Beli $1 dengan Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre memungkinkan Anda menggunakan kartu debit untuk menyetorkan ETH langsung di akun MetaMask Anda."
@ -640,7 +631,7 @@
"message": "Interaksi Kontrak"
},
"convertTokenToNFTDescription": {
"message": "Kami mendeteksi bahwa aset ini merupakan NFT. Kini Metamask memiliki dukungan asli penuh untuk NFT. Anda ingin menghapusnya dari daftar token dan menambahkannya sebagai NFT?"
"message": "Kami mendeteksi bahwa aset ini merupakan NFT. Kini MetaMask memiliki dukungan asli penuh untuk NFT. Anda ingin menghapusnya dari daftar token dan menambahkannya sebagai NFT?"
},
"convertTokenToNFTExistDescription": {
"message": "Kami mendeteksi bahwa aset ini telah ditambahkan sebagai NFT. Anda ingin menghapusnya dari daftar token?"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "Ekstensi Eksternal"
},
"extraApprovalGas": {
"message": "+$1 gas yang disetujui",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Gagal"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "Anda masih bisa menukar token meskipun Transaksi Pintar tidak tersedia."
},
"stxPendingFinalizing": {
"message": "Menyelesaikan..."
},
"stxPendingOptimizingGas": {
"message": "Mengoptimalkan gas..."
},
"stxPendingPrivatelySubmitting": {
"message": "Mengirimkan Pertukaran secara pribadi..."
},
"stxSubDescription": {
"message": "* Transaksi Pintar akan mencoba mengirimkan transaksi Anda secara pribadi, beberapa kali. Jika semua upaya gagal, transaksi akan disiarkan secara publik untuk memastikan Pertukaran telah berhasil dilakukan."
},
@ -3193,10 +3171,6 @@
"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"
},
"swapCompleteIn": {
"message": "Pertukaran selesai di <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "Konfirmasikan dengan dompet perangkat keras Anda"
},

@ -67,9 +67,6 @@
"affirmAgree": {
"message": "Acconsento"
},
"aggregatorFeeCost": {
"message": "Tassa per la rete aggregatore"
},
"alertDisableTooltip": {
"message": "Può essere cambiato in \"Impostazioni > Avvisi\""
},
@ -117,12 +114,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Tassa di approvazione per la rete aggregatore"
},
"approvalTxGasCost": {
"message": "Costo Gas Approvazione Tx"
},
"approve": {
"message": "Approva"
},
@ -198,10 +189,10 @@
"message": "Compra"
},
"buyWithWyre": {
"message": "Compra ETH con Wyre"
"message": "Compra $1 con Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre ti consente di usare la carta di credito per depositare ETH direttamente nel tuo account MetaMask."
"message": "Wyre ti consente di usare la carta di credito per depositare $1 direttamente nel tuo account MetaMask."
},
"canToggleInSettings": {
"message": "Puoi riabilitare questa notifica in Impostazioni -> Avvisi."
@ -568,10 +559,6 @@
"externalExtension": {
"message": "Estensione Esterna"
},
"extraApprovalGas": {
"message": "+$1 gas approvazione",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Fallita"
},

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "同意する"
},
"aggregatorFeeCost": {
"message": "アグリゲーター ネットワーク料金"
},
"airgapVault": {
"message": "AirGap Vault"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "承認およびアグリゲーターネットワークの手数料"
},
"approvalTxGasCost": {
"message": "承認送信のガス代"
},
"approve": {
"message": "使用限度額の承認"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "WyreでETHを購入"
"message": "Wyreで $1 を購入"
},
"buyWithWyreDescription": {
"message": "Wyreを使用すると、デビット カードを使用して、ETHをMetaMaskアカウントに直接デポジットできます。"
"message": "Wyreを使用すると、デビット カードを使用して、$1 をMetaMaskアカウントに直接デポジットできます。"
},
"bytes": {
"message": "バイト"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "外部拡張機能"
},
"extraApprovalGas": {
"message": "+$1承認ガス",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "失敗しました"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "スマートトランザクションが利用できなくても、トークンのスワップは可能です。"
},
"stxPendingFinalizing": {
"message": "最終処理中..."
},
"stxPendingOptimizingGas": {
"message": "ガス代を最適化中..."
},
"stxPendingPrivatelySubmitting": {
"message": "スワップを非公開で送信中..."
},
"stxSubDescription": {
"message": "* スマートトランザクションは、非公開でトランザクションのの送信を数回試みます。すべての試みが失敗した場合、スワップが成功するようトランザクションが公開されます。"
},
@ -3193,10 +3171,6 @@
"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"
},
"swapCompleteIn": {
"message": "スワップ完了まで <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "ハードウェアウォレットで確定"
},

@ -137,10 +137,10 @@
"message": "ನಿಮ ಬಸರಬಲಿಿಲ..."
},
"buyWithWyre": {
"message": "Wyre ನಿ ETH ಖರಿಿ"
"message": "Wyre ನಿ $1 ಖರಿಿ"
},
"buyWithWyreDescription": {
"message": "ನಿಮ MetaMask ಖ ETH ಅನ ಜಮಡಲಿ ಬಳಸಲ Wyre ನಿಮಗ ಅನಮತಿತದ."
"message": "ನಿಮ MetaMask ಖ $1 ಅನ ಜಮಡಲಿ ಬಳಸಲ Wyre ನಿಮಗ ಅನಮತಿತದ."
},
"bytes": {
"message": "ಬಗಳ"

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "동의함"
},
"aggregatorFeeCost": {
"message": "애그리게이터 네트워크 수수료"
},
"airgapVault": {
"message": "에어갭 볼트"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "승인 및 애그리게이터 네트워크 수수료"
},
"approvalTxGasCost": {
"message": "승인 Tx 가스 비용"
},
"approve": {
"message": "지출 한도 승인"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Wyre로 ETH 구매"
"message": "Wyre로 $1 구매"
},
"buyWithWyreDescription": {
"message": "Wyre를 사용하면 체크카드를 이용하여 ETH를 MetaMask 계정에 바로 예치할 수 있습니다."
"message": "Wyre를 사용하면 체크카드를 이용하여 $1 를 MetaMask 계정에 바로 예치할 수 있습니다."
},
"bytes": {
"message": "바이트"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "외부 확장"
},
"extraApprovalGas": {
"message": "+$1의 승인 가스",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "실패"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "스마트 거래를 사용할 수 없을 때도 토큰 스왑은 가능합니다."
},
"stxPendingFinalizing": {
"message": "마무리 중..."
},
"stxPendingOptimizingGas": {
"message": "가스비 최적화 중..."
},
"stxPendingPrivatelySubmitting": {
"message": "스왑을 비공개로 제출하는 중..."
},
"stxSubDescription": {
"message": "*스마트 거래는 비공개로 거래를 제출하기 위해 여러 번 시도할 것입니다. 모든 시도가 실패하면 성공적인 스왑을 위해 거래는 공개적으로 브로드캐스트될 것입니다."
},
@ -3193,10 +3171,6 @@
"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"
},
"swapCompleteIn": {
"message": "스왑 완료까지 남은 시간:",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "하드웨어 지갑으로 확인합니다."
},

@ -137,10 +137,10 @@
"message": "Jūsų naršyklė neatpažįstama..."
},
"buyWithWyre": {
"message": "Pirkti ETH su „Wyre“"
"message": "Pirkti $1 su „Wyre“"
},
"buyWithWyreDescription": {
"message": "„Wyre“ leidžia naudotis kreditine kortele norint įnešti ETH tiesiai į jūsų „MetaMask“ paskyrą."
"message": "„Wyre“ leidžia naudotis kreditine kortele norint įnešti $1 tiesiai į jūsų „MetaMask“ paskyrą."
},
"bytes": {
"message": "Baitai"

@ -137,10 +137,10 @@
"message": "Jūsu pārlūkprogramma netiek atbalstīta..."
},
"buyWithWyre": {
"message": "Pirkt ETH ar Wyre"
"message": "Pirkt $1 ar Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre ļauj noguldīt ETH tieši jūsu MetaMask kontā, izmantojot kredītkarti."
"message": "Wyre ļauj noguldīt $1 tieši jūsu MetaMask kontā, izmantojot kredītkarti."
},
"bytes": {
"message": "Baiti"

@ -137,10 +137,10 @@
"message": "Pelayar anda tidak disokong..."
},
"buyWithWyre": {
"message": "Beli ETH dengan Wyre"
"message": "Beli $1 dengan Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre membolehkan anda menggunakan kad kredit untuk mendeposit ETH secara terus ke dalam akaun MetaMask anda."
"message": "Wyre membolehkan anda menggunakan kad kredit untuk mendeposit $1 secara terus ke dalam akaun MetaMask anda."
},
"bytes": {
"message": "Bait"

@ -137,10 +137,10 @@
"message": "Nettleseren din støttes ikke ..."
},
"buyWithWyre": {
"message": "Kjøp ETH med Wyre"
"message": "Kjøp $1 med Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre lar deg bruke et kredittkort for å sette inn ETH rett på MetaMask-kontoen din."
"message": "Wyre lar deg bruke et kredittkort for å sette inn $1 rett på MetaMask-kontoen din."
},
"cancel": {
"message": "Avbryt"

@ -91,9 +91,6 @@
"affirmAgree": {
"message": "Sang-ayon ako"
},
"aggregatorFeeCost": {
"message": "Bayarin sa aggregator network"
},
"alertDisableTooltip": {
"message": "Mababago ito sa \"Mga Setting > Mga Alerto\""
},
@ -141,12 +138,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Bayarin sa pag-apruba at aggregator network"
},
"approvalTxGasCost": {
"message": "Approval Tx Gas Cost"
},
"approve": {
"message": "Aprubahan ang limitasyon sa paggastos"
},
@ -237,10 +228,10 @@
"message": "Bumili"
},
"buyWithWyre": {
"message": "Bumili ng ETH gamit ang Wyre"
"message": "Bumili ng $1 gamit ang Wyre"
},
"buyWithWyreDescription": {
"message": "Binibigyang-daan ka ng Wyre na gumamit ng debit card para mag-deposit ng ETH sa mismong MetaMask account mo."
"message": "Binibigyang-daan ka ng Wyre na gumamit ng debit card para mag-deposit ng $1 sa mismong MetaMask account mo."
},
"bytes": {
"message": "Bytes"
@ -674,10 +665,6 @@
"externalExtension": {
"message": "External Extension"
},
"extraApprovalGas": {
"message": "+$1 na pag-apruba sa gas",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Hindi matagumpay"
},

@ -137,10 +137,10 @@
"message": "Twoja przeglądarka nie jest obsługiwana..."
},
"buyWithWyre": {
"message": "Kup ETH poprzez Wyre"
"message": "Kup $1 poprzez Wyre"
},
"buyWithWyreDescription": {
"message": "Dzięki Wyre możesz użyć karty kredytowej, aby wpłacić ETH bezpośrednio na swoje konto MetaMask."
"message": "Dzięki Wyre możesz użyć karty kredytowej, aby wpłacić $1 bezpośrednio na swoje konto MetaMask."
},
"bytes": {
"message": "Bajty"

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "Concordo"
},
"aggregatorFeeCost": {
"message": "Taxa de rede do agregador"
},
"airgapVault": {
"message": "AirGap Vault"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Taxa de aprovação e da rede do agregador"
},
"approvalTxGasCost": {
"message": "Custo em gás da transação de aprovação"
},
"approve": {
"message": "Aprovar"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Comprar ETH com Wyre"
"message": "Comprar $1 com Wyre"
},
"buyWithWyreDescription": {
"message": "Com o Wyre, você pode usar um cartão de débito para depositar ETH diretamente na sua conta da MetaMask."
"message": "Com o Wyre, você pode usar um cartão de débito para depositar $1 diretamente na sua conta da MetaMask."
},
"bytes": {
"message": "Bytes"
@ -640,7 +631,7 @@
"message": "Interação com contrato"
},
"convertTokenToNFTDescription": {
"message": "Detectamos que esse ativo é um NFT. A Metamask agora oferece suporte nativo a NFTs. Gostaria de removê-lo da sua lista de tokens e adicioná-lo como NFT?"
"message": "Detectamos que esse ativo é um NFT. A MetaMask agora oferece suporte nativo a NFTs. Gostaria de removê-lo da sua lista de tokens e adicioná-lo como NFT?"
},
"convertTokenToNFTExistDescription": {
"message": "Detectamos que esse ativo foi adicionado como NFT. Deseja removê-lo da sua lista de tokens?"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "Extensão externa"
},
"extraApprovalGas": {
"message": "+$1 de gás por aprovação",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Falhou"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "Você ainda pode fazer swap com seus tokens mesmo quando as Transações Inteligentes estiverem indisponíveis."
},
"stxPendingFinalizing": {
"message": "Finalizando..."
},
"stxPendingOptimizingGas": {
"message": "Otimizando as taxas de gás..."
},
"stxPendingPrivatelySubmitting": {
"message": "Enviando a Swap de forma privada..."
},
"stxSubDescription": {
"message": "* A função de Transações Inteligentes tentará enviar a sua transação várias vezes de forma privada. Se todas as tentativas falharem, a transação será transmitida publicamente para garantir que sua Swap seja realizada com sucesso."
},
@ -3193,10 +3171,6 @@
"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"
},
"swapCompleteIn": {
"message": "Swap concluído em <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "Confirme com sua carteira de hardware"
},

@ -179,9 +179,6 @@
"affirmAgree": {
"message": "Concordo"
},
"aggregatorFeeCost": {
"message": "Taxa de rede do agregador"
},
"alertDisableTooltip": {
"message": "Isso pode ser alterado em \"Configurações > Alertas\""
},
@ -233,12 +230,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Taxa de aprovação e da rede do agregador"
},
"approvalTxGasCost": {
"message": "Custo em gás da transação de aprovação"
},
"approve": {
"message": "Aprovar limite de gastos"
},
@ -372,10 +363,10 @@
"message": "Comprar"
},
"buyWithWyre": {
"message": "Comprar ETH com Wyre"
"message": "Comprar $1 com Wyre"
},
"buyWithWyreDescription": {
"message": "Com o Wyre, você pode usar um cartão de débito para depositar ETH diretamente na sua conta da MetaMask."
"message": "Com o Wyre, você pode usar um cartão de débito para depositar $1 diretamente na sua conta da MetaMask."
},
"bytes": {
"message": "Bytes"
@ -1031,10 +1022,6 @@
"externalExtension": {
"message": "Extensão externa"
},
"extraApprovalGas": {
"message": "+$1 de gás por aprovação",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Falhou"
},

@ -137,10 +137,10 @@
"message": "Browserul dvs. nu este compatibil..."
},
"buyWithWyre": {
"message": "Cumpărați ETH cu Wyre"
"message": "Cumpărați $1 cu Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre vă permite să folosiți un card de credit pentru a depune ETH direct în contul dvs. MetaMask."
"message": "Wyre vă permite să folosiți un card de credit pentru a depune $1 direct în contul dvs. MetaMask."
},
"bytes": {
"message": "Octeți"

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "Я согласен(-на)"
},
"aggregatorFeeCost": {
"message": "Комиссия сети агрегатора"
},
"airgapVault": {
"message": "Хранилище AirGap"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Комиссия сети за одобрение и для агрегатора"
},
"approvalTxGasCost": {
"message": "Стоимость газа для утверждения транзакции"
},
"approve": {
"message": "Одобрить лимит расходов"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Купить ETH с помощью Wyre"
"message": "Купить $1 с помощью Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre позволяет использовать дебетовую карту для внесения ETH прямо на ваш счет MetaMask."
"message": "Wyre позволяет использовать дебетовую карту для внесения $1 прямо на ваш счет MetaMask."
},
"bytes": {
"message": "Байты"
@ -640,7 +631,7 @@
"message": "Взаимодействие по контракту"
},
"convertTokenToNFTDescription": {
"message": "Мы обнаружили, что этот актив является NFT. Metamask теперь имеет полную встроенную поддержку NFT. Хотите удалить его из списка токенов и добавить в качестве NFT?"
"message": "Мы обнаружили, что этот актив является NFT. MetaMask теперь имеет полную встроенную поддержку NFT. Хотите удалить его из списка токенов и добавить в качестве NFT?"
},
"convertTokenToNFTExistDescription": {
"message": "Мы обнаружили, что этот актив был добавлен как NFT. Хотите удалить его из списка токенов?"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "Внешнее расширение"
},
"extraApprovalGas": {
"message": "+$1 газа для утверждения",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Не удалось"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "Вы по-прежнему можете обменивать свои токены, даже если смарт-транзакции недоступны."
},
"stxPendingFinalizing": {
"message": "Завершение..."
},
"stxPendingOptimizingGas": {
"message": "Оптимизация газа..."
},
"stxPendingPrivatelySubmitting": {
"message": "Конфиденциальная отправка ооперации обмена..."
},
"stxSubDescription": {
"message": "* Смарт-транзакции попытаются несколько раз отправить вашу транзакцию в конфиденциальном порядке. Если все попытки не увенчаются успехом, транзакция будет показана публично, чтобы гарантировать успешное завершение вашего обмена."
},
@ -3193,10 +3171,6 @@
"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"
},
"swapCompleteIn": {
"message": "Обмен завершится через <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "Подтвердите с помощью аппаратного кошелька"
},

@ -131,10 +131,10 @@
"message": "Váš prehliadač nie je podporovaný..."
},
"buyWithWyre": {
"message": "Kúpte ETH s Wyre"
"message": "Kúpte $1 s Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre vám umožňuje použiť kreditnú kartu na vloženie depozitu ETH priamo na váš účet MetaMask."
"message": "Wyre vám umožňuje použiť kreditnú kartu na vloženie depozitu $1 priamo na váš účet MetaMask."
},
"bytes": {
"message": "Bajty"

@ -137,10 +137,10 @@
"message": "Vaš brskalnik ni podptrt ..."
},
"buyWithWyre": {
"message": "Kupi ETH z Wyre"
"message": "Kupi $1 z Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre vam omogoča, da s kreditno kartico nakažete ETH neposredno na svoj račun MetaMask."
"message": "Wyre vam omogoča, da s kreditno kartico nakažete $1 neposredno na svoj račun MetaMask."
},
"bytes": {
"message": "Bajti"

@ -137,10 +137,10 @@
"message": "Vaš pregledač nije podržan..."
},
"buyWithWyre": {
"message": "Kupite ETH preko servisa Wyre"
"message": "Kupite $1 preko servisa Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre vam dozvoljava da koristite kreditnu karticu kako biste deponovali ETH pravo na vaš MetaMask nalog."
"message": "Wyre vam dozvoljava da koristite kreditnu karticu kako biste deponovali $1 pravo na vaš MetaMask nalog."
},
"bytes": {
"message": "Bajtovi"

@ -137,10 +137,10 @@
"message": "Din webbläsare stöds inte..."
},
"buyWithWyre": {
"message": "Köp ETH med Wyre"
"message": "Köp $1 med Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre låter dig använda ett kreditkort för att sätta in ETH direkt på ditt MetaMask-konto."
"message": "Wyre låter dig använda ett kreditkort för att sätta in $1 direkt på ditt MetaMask-konto."
},
"cancel": {
"message": "Avbryt"

@ -134,10 +134,10 @@
"message": "Kivinjari chaku hakiwezeshwi..."
},
"buyWithWyre": {
"message": "Nunua ETH kwa kutumia Wyre"
"message": "Nunua $1 kwa kutumia Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre inakuwezesha kutumia kadi ya benki kuweka ETH moja kwa moja kwenye akaunti yako ya MetaMask."
"message": "Wyre inakuwezesha kutumia kadi ya benki kuweka $1 moja kwa moja kwenye akaunti yako ya MetaMask."
},
"cancel": {
"message": "Ghairi"

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "Sang-ayon Ako"
},
"aggregatorFeeCost": {
"message": "Bayarin sa aggregator network"
},
"airgapVault": {
"message": "AirGap Vault"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Bayarin sa pag-apruba at aggregator network"
},
"approvalTxGasCost": {
"message": "Pag-apruba Tx Halaga ng Gas"
},
"approve": {
"message": "Aprubahan ang limitasyon sa paggastos"
},
@ -347,7 +338,7 @@
"message": "Panimula"
},
"betaMetamaskDescription": {
"message": "Ang Metamask na pinagkakatiwalaan ng milyun-milyon ay isang ligtas na wallet na ginagawang accessible ang mundo ng web3 para sa lahat."
"message": "Ang MetaMask na pinagkakatiwalaan ng milyun-milyon ay isang ligtas na wallet na ginagawang accessible ang mundo ng web3 para sa lahat."
},
"betaMetamaskDescriptionExplanation": {
"message": "Gamitin ang bersyong ito para subukan ang mga paparating na feature bago ilabas ang mga ito. Ang iyong paggamit at feedback ay nakakatulong sa amin na bumuo ng posibleng pinakamahusay na bersyon ng MetaMask. Ang paggamit mo ng MetaMask Beta ay napapailalim sa aming karaniwang $1 gayundin sa aming $2. Bilang Beta, maaaring tumaas ang panganib ng mga bug. Sa pagpapatuloy, tinatanggap at kinikilala mo ang mga panganib na ito, gayundin ang mga panganib na makikita sa aming Mga Tuntunin at Mga Tuntunin ng Beta.",
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Bumili ng ETH gamit ang Wyre"
"message": "Bumili ng $1 gamit ang Wyre"
},
"buyWithWyreDescription": {
"message": "Nagbibigay-daan sa iyo ang Wyre na gumamit ng debit card para mag-deposit ng ETH sa mismong MetaMask account mo."
"message": "Nagbibigay-daan sa iyo ang Wyre na gumamit ng debit card para mag-deposit ng $1 sa mismong MetaMask account mo."
},
"bytes": {
"message": "Bytes"
@ -640,7 +631,7 @@
"message": "Interaksyon ng Kontrata"
},
"convertTokenToNFTDescription": {
"message": "Natukoy namin na ang asset na ito ay isang NFT. Ang Metamask ay mayroon na ngayong ganap na native support para sa mga NFT. Gusto mo bang alisin ito sa iyong listahan ng token at idagdag ito bilang isang NFT?"
"message": "Natukoy namin na ang asset na ito ay isang NFT. Ang MetaMask ay mayroon na ngayong ganap na native support para sa mga NFT. Gusto mo bang alisin ito sa iyong listahan ng token at idagdag ito bilang isang NFT?"
},
"convertTokenToNFTExistDescription": {
"message": "Napansin namin na naidagdag ang asset na ito bilang NFT. Gusto mo ba itong alisin mula sa listahan ng iyong token?"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "External Extension"
},
"extraApprovalGas": {
"message": "+$1 na pag-apruba sa gas",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Hindi matagumpay"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "Maaari mo parin papalitan ang iyong mga token kahit na hindi available ang mga Smart Transaction."
},
"stxPendingFinalizing": {
"message": "Isinasapinal..."
},
"stxPendingOptimizingGas": {
"message": "Pinapahusay ang gas..."
},
"stxPendingPrivatelySubmitting": {
"message": "Pribadong isinusumite ang Pagpapalit..."
},
"stxSubDescription": {
"message": "* Susubukan ng mga Smart Transaction na isumite nang pribado ang iyong transaksyon, maraming beses. Kapag nabigo ang lahat ng pagsubok, ipapakita sa publiko ang transaksyon upang matiyak na ang Pagpapalit ay naging matagupay."
},
@ -3193,10 +3171,6 @@
"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"
},
"swapCompleteIn": {
"message": "Kumpleto na ang pagpapalit sa <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "Kumpirmahin gamit ang iyong hardware wallet"
},
@ -3946,7 +3920,7 @@
"message": "Magsimula na tayo"
},
"welcomeToMetaMaskIntro": {
"message": "Ang Metamask na pinagkakatiwalaan ng milyun-milyon ay isang ligtas na wallet na ginagawang accessible ang mundo ng web3 para sa lahat."
"message": "Ang MetaMask na pinagkakatiwalaan ng milyun-milyon ay isang ligtas na wallet na ginagawang accessible ang mundo ng web3 para sa lahat."
},
"whatsNew": {
"message": "Ano'ng bago",

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "Kabul Ediyorum"
},
"aggregatorFeeCost": {
"message": "Toplayıcı ağ ücreti"
},
"airgapVault": {
"message": "AirGap Kasası"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Onaylayıcı ve toplayıcı ağ ücreti"
},
"approvalTxGasCost": {
"message": "Onaylayıcı İşlem Gaz Maliyeti"
},
"approve": {
"message": "Harcama limitini onayla"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Wyre ile ETH satın al"
"message": "Wyre ile $1 satın al"
},
"buyWithWyreDescription": {
"message": "Wyre, doğrudan MetaMask hesabınıza ETH yatırma işlemleri için banka kartı kullanmanıza izin verir."
"message": "Wyre, doğrudan MetaMask hesabınıza $1 yatırma işlemleri için banka kartı kullanmanıza izin verir."
},
"bytes": {
"message": "Bayt"
@ -640,7 +631,7 @@
"message": "Sözleşme Etkileşimi"
},
"convertTokenToNFTDescription": {
"message": "Bu varlığın bir NFT olduğunu tespit ettik. Metamask artık NFT'ler için tam yerel desteğe sahiptir. Bunu token listenden çıkarmak ve bir NFT olarak eklemek ister misin?"
"message": "Bu varlığın bir NFT olduğunu tespit ettik. MetaMask artık NFT'ler için tam yerel desteğe sahiptir. Bunu token listenden çıkarmak ve bir NFT olarak eklemek ister misin?"
},
"convertTokenToNFTExistDescription": {
"message": "Bu varlığın bir NFT olarak eklendiğini tespit ettik. Token listenden çıkarmak ister misin?"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "Harici Uzantı"
},
"extraApprovalGas": {
"message": "+1$ onay gazı",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Başarısız oldu"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "Akıllı İşlemler kullanılamazken bile token'larını değiştirebilirsin."
},
"stxPendingFinalizing": {
"message": "Sonuçlandırılıyor..."
},
"stxPendingOptimizingGas": {
"message": "Gas optimize ediliyor..."
},
"stxPendingPrivatelySubmitting": {
"message": "Takas özel olarak gönderiliyor..."
},
"stxSubDescription": {
"message": "* Akıllı İşlemler, işlemini birden çok kez özel olarak göndermeye çalışır. Tüm denemeler başarısız olursa Takas'ının başarılı bir şekilde gerçekleşmesini sağlamak için işlem herkese açık olarak yayınlanacaktır."
},
@ -3193,10 +3171,6 @@
"message": "$1 ile eşleşen token yok",
"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"
},
"swapCompleteIn": {
"message": "Değiştirme işlemi şu süre içinde tamamlandı <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "Donanım cüzdanınızla onaylayın"
},
@ -3511,7 +3485,7 @@
"message": "Hesaplarınızı ve bilgilerinizi mobil cihazınızla senkronize edebilirsiniz. MetaMask mobil uygulamasını açın, \"Ayarlar\" kısmına gidin ve \"Tarayıcı Uzantısından Senkronize Et\" seçeneğine dokunun"
},
"syncWithMobileDescNewUsers": {
"message": "Metamask Mobil uygulamasını ilk defa açıyorsanız telefonunuzdaki adımları izleyin."
"message": "MetaMask Mobil uygulamasını ilk defa açıyorsanız telefonunuzdaki adımları izleyin."
},
"syncWithMobileScanThisCode": {
"message": "MetaMask mobil uygulamanızla bu kodu tarayın"

@ -137,10 +137,10 @@
"message": "Ваш браузер не підтримується..."
},
"buyWithWyre": {
"message": "Купити ETH через Wyre"
"message": "Купити $1 через Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre дає змогу використовувати кредитну картку для внесення валюти ETH безпосередньо у свій гаманець MetaMask."
"message": "Wyre дає змогу використовувати кредитну картку для внесення валюти $1 безпосередньо у свій гаманець MetaMask."
},
"bytes": {
"message": "Байти"

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "Tôi đồng ý"
},
"aggregatorFeeCost": {
"message": "Phí mạng cho trình tổng hợp"
},
"airgapVault": {
"message": "AirGap Vault"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "Phí mạng cho trình tổng hợp và việc phê duyệt"
},
"approvalTxGasCost": {
"message": "Chi phí gas cho giao dịch phê duyệt"
},
"approve": {
"message": "Phê duyệt giới hạn chi tiêu"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Mua ETH qua Wyre"
"message": "Mua $1 qua Wyre"
},
"buyWithWyreDescription": {
"message": "Wyre cho phép bạn dùng thẻ ghi nợ để nạp ETH trực tiếp vào tài khoản MetaMask của mình."
"message": "Wyre cho phép bạn dùng thẻ ghi nợ để nạp $1 trực tiếp vào tài khoản MetaMask của mình."
},
"bytes": {
"message": "Byte"
@ -640,7 +631,7 @@
"message": "Tương tác với hợp đồng"
},
"convertTokenToNFTDescription": {
"message": "Chúng tôi phát hiện tài sản này là một NFT. Metamask hiện đã hỗ trợ gốc đầy đủ cho NFT. Bạn có muốn xóa tài sản khỏi danh sách token và thêm tài sản dưới dạng NFT không?"
"message": "Chúng tôi phát hiện tài sản này là một NFT. MetaMask hiện đã hỗ trợ gốc đầy đủ cho NFT. Bạn có muốn xóa tài sản khỏi danh sách token và thêm tài sản dưới dạng NFT không?"
},
"convertTokenToNFTExistDescription": {
"message": "Chúng tôi phát hiện tài sản này đã được thêm dưới dạng NFT. Bạn có muốn xóa tài sản khỏi danh sách token không?"
@ -1174,10 +1165,6 @@
"externalExtension": {
"message": "Tiện ích bên ngoài"
},
"extraApprovalGas": {
"message": "+$1 gas phê duyệt",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "Không thành công"
},
@ -3096,15 +3083,6 @@
"stxFallbackUnavailable": {
"message": "Bạn vẫn có thể hoán đổi token ngay cả khi Giao dịch thông minh không khả dụng."
},
"stxPendingFinalizing": {
"message": "Đang hoàn thành..."
},
"stxPendingOptimizingGas": {
"message": "Đang tối ưu gas..."
},
"stxPendingPrivatelySubmitting": {
"message": "Đang gửi yêu cầu Hoán đổi riêng tư..."
},
"stxSubDescription": {
"message": "* Giao dịch thông minh sẽ cố gắng gửi giao dịch của bạn nhiều lần theo cách riêng tư. Nếu tất cả các lần thử đều không thành công, giao dịch sẽ được phát công khai để đảm bảo Hoán đổi của bạn được thực hiện thành công."
},
@ -3193,10 +3171,6 @@
"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"
},
"swapCompleteIn": {
"message": "Hoán đổi xong sau <",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "Xác nhận ví cứng của bạn"
},

@ -192,9 +192,6 @@
"affirmAgree": {
"message": "我同意"
},
"aggregatorFeeCost": {
"message": "聚合器网络费用"
},
"airgapVault": {
"message": "AirGap Vault"
},
@ -252,12 +249,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "批准和聚合器网络费用"
},
"approvalTxGasCost": {
"message": "批准 Tx 燃料成本"
},
"approve": {
"message": "批准消费限额"
},
@ -425,10 +416,10 @@
"description": "$1 represents the crypto symbol to be purchased"
},
"buyWithWyre": {
"message": "使用 Wyre 购买 ETH"
"message": "使用 Wyre 购买 $1"
},
"buyWithWyreDescription": {
"message": "您可以通过 Wyre 使用借记卡将 ETH 存入您的 MetaMask 账户。"
"message": "您可以通过 Wyre 使用借记卡将 $1 存入您的 MetaMask 账户。"
},
"bytes": {
"message": "字节"
@ -1177,10 +1168,6 @@
"externalExtension": {
"message": "外部扩展程序"
},
"extraApprovalGas": {
"message": "额外的 $1 批准燃料",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "失败"
},
@ -1672,7 +1659,7 @@
"message": "打开和解锁 Ledger Live 应用程序"
},
"ledgerConnectionPreferenceDescription": {
"message": "自定义连接您的 Ledger 到 Metamask 的方式。建议使用 $1,但也可使用其他选项。请在这里阅读更多信息:$2",
"message": "自定义连接您的 Ledger 到 MetaMask 的方式。建议使用 $1,但也可使用其他选项。请在这里阅读更多信息:$2",
"description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message."
},
"ledgerDeviceOpenFailureMessage": {
@ -2171,7 +2158,7 @@
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionThree": {
"message": "在 Metamask 中与您的 Ledger 账户交互时,将打开一个新选项卡,并且将要求您打开 Ledger Live 应用程序。应用程序打开后,您将被要求允许 WebSocket 连接到您的 MetaMask 账户。就是这样!",
"message": "在 MetaMask 中与您的 Ledger 账户交互时,将打开一个新选项卡,并且将要求您打开 Ledger Live 应用程序。应用程序打开后,您将被要求允许 WebSocket 连接到您的 MetaMask 账户。就是这样!",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionTwo": {
@ -3102,15 +3089,6 @@
"stxFallbackUnavailable": {
"message": "即使智能交易不可用,您仍然可以交换代币。"
},
"stxPendingFinalizing": {
"message": "最终确定中..."
},
"stxPendingOptimizingGas": {
"message": "正在优化燃料......"
},
"stxPendingPrivatelySubmitting": {
"message": "正在隐秘提交交换......"
},
"stxSubDescription": {
"message": "*智能交易将尝试多次隐秘提交您的交易。如果所有尝试都失败,交易将会公开广播,以确保您的交换能成功进行。"
},
@ -3199,10 +3177,6 @@
"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"
},
"swapCompleteIn": {
"message": "交换将在此时间內完成<",
"description": "'<' means 'less than', e.g. Swap complete in < 2:59"
},
"swapConfirmWithHwWallet": {
"message": "使用您的硬件钱包确认"
},

@ -179,9 +179,6 @@
"affirmAgree": {
"message": "我同意"
},
"aggregatorFeeCost": {
"message": "聚集器网络手续费"
},
"alertDisableTooltip": {
"message": "这个可以在“设置 > 提醒”中进行更改"
},
@ -233,12 +230,6 @@
"message": "MetaMask Flask",
"description": "The name of the application (Flask)"
},
"approvalAndAggregatorTxFeeCost": {
"message": "批准聚合商网络手续费"
},
"approvalTxGasCost": {
"message": "批准交易燃料成本"
},
"approve": {
"message": "批准消费限额"
},
@ -372,10 +363,10 @@
"message": "购买"
},
"buyWithWyre": {
"message": "使用 Wyre 购买 ETH"
"message": "使用 Wyre 购买 $1"
},
"buyWithWyreDescription": {
"message": "您可以通过 Wyre 使用信用卡将 ETH 存入您的 MetaMask 账户。"
"message": "您可以通过 Wyre 使用信用卡将 $1 存入您的 MetaMask 账户。"
},
"bytes": {
"message": "字节"
@ -1017,10 +1008,6 @@
"externalExtension": {
"message": "外部扩展"
},
"extraApprovalGas": {
"message": "+$1 批准燃料",
"description": "Expresses an additional gas amount the user will have to pay, on top of some other displayed amount. $1 is a decimal amount of gas"
},
"failed": {
"message": "失败"
},

@ -140,10 +140,10 @@
"message": "買"
},
"buyWithWyre": {
"message": "用 Wyre 購買 ETH"
"message": "用 Wyre 購買 $1"
},
"buyWithWyreDescription": {
"message": "Wyre 讓你使用信用卡在 MetaMask 帳號中直接存入 ETH。"
"message": "Wyre 讓你使用信用卡在 MetaMask 帳號中直接存入 $1 。"
},
"bytes": {
"message": "位元組"

@ -8,7 +8,10 @@
<link rel="stylesheet" type="text/css" href="./index-rtl.css" title="rtl" disabled>
</head>
<body>
<div id="app-content"></div>
<div id="app-content">
<img class="loading-logo" src="./images/logo/metamask-fox.svg" alt="" />
<img class="loading-spinner" src="./images/spinner.gif" alt="" />
</div>
<div id="popover-content"></div>
<script src="./globalthis.js" type="text/javascript" charset="utf-8"></script>
<script src="./sentry-install.js" type="text/javascript" charset="utf-8"></script>

@ -66,6 +66,7 @@
"clipboardWrite",
"http://localhost:8545/",
"https://*.infura.io/",
"https://chainid.network/chains.json",
"https://lattice.gridplus.io/*",
"activeTab",
"webRequest",

@ -0,0 +1,82 @@
{
"action": {
"default_icon": {
"16": "images/icon-16.png",
"19": "images/icon-19.png",
"32": "images/icon-32.png",
"38": "images/icon-38.png",
"64": "images/icon-64.png",
"128": "images/icon-128.png",
"512": "images/icon-512.png"
},
"default_title": "MetaMask",
"default_popup": "popup.html"
},
"author": "https://metamask.io",
"background": {
"service_worker": "app-init.js"
},
"commands": {
"_execute_browser_action": {
"suggested_key": {
"windows": "Alt+Shift+M",
"mac": "Alt+Shift+M",
"chromeos": "Alt+Shift+M",
"linux": "Alt+Shift+M"
}
}
},
"content_scripts": [
{
"matches": ["file://*/*", "http://*/*", "https://*/*"],
"js": [
"disable-console.js",
"globalthis.js",
"lockdown-install.js",
"lockdown-run.js",
"lockdown-more.js",
"contentscript.js"
],
"run_at": "document_start",
"all_frames": true
},
{
"matches": ["*://connect.trezor.io/*/popup.html"],
"js": ["vendor/trezor/content-script.js"]
}
],
"default_locale": "en",
"description": "__MSG_appDescription__",
"icons": {
"16": "images/icon-16.png",
"19": "images/icon-19.png",
"32": "images/icon-32.png",
"38": "images/icon-38.png",
"48": "images/icon-48.png",
"64": "images/icon-64.png",
"128": "images/icon-128.png",
"512": "images/icon-512.png"
},
"manifest_version": 3,
"name": "__MSG_appName__",
"permissions": [
"storage",
"unlimitedStorage",
"clipboardWrite",
"http://localhost:8545/",
"https://*.infura.io/",
"https://chainid.network/chains.json",
"https://lattice.gridplus.io/*",
"activeTab",
"webRequest",
"*://*.eth/",
"notifications"
],
"short_name": "__MSG_appName__",
"web_accessible_resources": [
{
"resources": ["inpage.js", "phishing.html"],
"matches": ["http://*/*", "https://*/*"]
}
]
}

@ -0,0 +1,7 @@
{
"externally_connectable": {
"matches": ["https://metamask.io/*"],
"ids": ["*"]
},
"minimum_chrome_version": "66"
}

@ -0,0 +1,26 @@
{
"applications": {
"gecko": {
"id": "webextension@metamask.io",
"strict_min_version": "68.0"
}
},
"background": {
"page": "background.html",
"persistent": true
},
"browser_action": {
"default_icon": {
"16": "images/icon-16.png",
"19": "images/icon-19.png",
"32": "images/icon-32.png",
"38": "images/icon-38.png",
"64": "images/icon-64.png",
"128": "images/icon-128.png",
"512": "images/icon-512.png"
},
"default_title": "MetaMask",
"default_popup": "popup.html"
},
"manifest_version": 2
}

@ -0,0 +1,9 @@
{
"permissions": [
"storage",
"tabs",
"clipboardWrite",
"clipboardRead",
"http://localhost:8545/"
]
}

@ -8,7 +8,10 @@
<link rel="stylesheet" type="text/css" href="./index-rtl.css" title="rtl" disabled>
</head>
<body style="width:357px; height:600px;">
<div id="app-content"></div>
<div id="app-content">
<img class="loading-logo" src="./images/logo/metamask-fox.svg" alt="" />
<img class="loading-spinner" src="./images/spinner.gif" alt="" />
</div>
<div id="popover-content"></div>
<script src="./globalthis.js" type="text/javascript" charset="utf-8"></script>
<script src="./sentry-install.js" type="text/javascript" charset="utf-8"></script>

@ -0,0 +1,55 @@
// eslint-disable-next-line import/unambiguous
function tryImport(...fileNames) {
try {
// eslint-disable-next-line
importScripts(...fileNames);
return true;
} catch (e) {
console.error(e);
return false;
}
}
function importAllScripts() {
const startImportScriptsTime = Date.now();
// applyLavaMoat has been hard coded to "true" as
// tryImport('./runtime-cjs.js') is giving issue with XMLHttpRequest object which is not avaialble to service worker.
// we need to dynamically inject values of applyLavaMoat once this is fixed.
const applyLavaMoat = true;
tryImport('./globalthis.js');
tryImport('./sentry-install.js');
if (applyLavaMoat) {
tryImport('./runtime-lavamoat.js');
tryImport('./lockdown-more.js');
tryImport('./policy-load.js');
} else {
tryImport('./lockdown-install.js');
tryImport('./lockdown-more.js');
tryImport('./lockdown-run.js');
tryImport('./runtime-cjs.js');
}
const fileList = [
// The list of files is injected at build time by replacing comment below with comma separated strings of file names
/** FILE NAMES */
];
fileList.forEach((fileName) => tryImport(fileName));
// for performance metrics/reference
console.log(
`SCRIPTS IMPORT COMPLETE in Seconds: ${
(Date.now() - startImportScriptsTime) / 1000
}`,
);
}
// Placing script import call here ensures that scripts are inported each time service worker is activated.
importAllScripts();
/**
* An open issue is changes in this file break during hot reloading. Reason is dynamic injection of "FILE NAMES".
* Developers need to restart local server if they change this file.
*/

@ -23,6 +23,7 @@ import {
REJECT_NOTFICIATION_CLOSE,
REJECT_NOTFICIATION_CLOSE_SIG,
} from '../../shared/constants/metametrics';
import { isManifestV3 } from '../../shared/modules/mv3.utils';
import migrations from './migrations';
import Migrator from './lib/migrator';
import ExtensionPlatform from './platforms/extension';
@ -45,6 +46,14 @@ import { getPlatform } from './lib/util';
const { sentry } = global;
const firstTimeState = { ...rawFirstTimeState };
const metamaskInternalProcessHash = {
[ENVIRONMENT_TYPE_POPUP]: true,
[ENVIRONMENT_TYPE_NOTIFICATION]: true,
[ENVIRONMENT_TYPE_FULLSCREEN]: true,
};
const metamaskBlockedPorts = ['trezor-connect'];
log.setDefaultLevel(process.env.METAMASK_DEBUG ? 'debug' : 'info');
const platform = new ExtensionPlatform();
@ -73,8 +82,23 @@ const ONE_SECOND_IN_MILLISECONDS = 1_000;
// Timeout for initializing phishing warning page.
const PHISHING_WARNING_PAGE_TIMEOUT = ONE_SECOND_IN_MILLISECONDS;
/**
* In case of MV3 we attach a "onConnect" event listener as soon as the application is initialised.
* Reason is that in case of MV3 a delay in doing this was resulting in missing first connect event after service worker is re-activated.
*/
const initApp = async (remotePort) => {
browser.runtime.onConnect.removeListener(initApp);
await initialize(remotePort);
log.info('MetaMask initialization complete.');
};
if (isManifestV3()) {
browser.runtime.onConnect.addListener(initApp);
} else {
// initialization flow
initialize().catch(log.error);
}
/**
* @typedef {import('../../shared/constants/transaction').TransactionMeta} TransactionMeta
@ -134,12 +158,13 @@ initialize().catch(log.error);
/**
* Initializes the MetaMask controller, and sets up all platform configuration.
*
* @param {string} remotePort - remote application port connecting to extension.
* @returns {Promise} Setup complete.
*/
async function initialize() {
async function initialize(remotePort) {
const initState = await loadStateFromPersistence();
const initLangCode = await getFirstPreferredLangCode();
await setupController(initState, initLangCode);
await setupController(initState, initLangCode, remotePort);
await loadPhishingWarningPage();
log.info('MetaMask initialization complete.');
}
@ -278,9 +303,10 @@ async function loadStateFromPersistence() {
*
* @param {Object} initState - The initial state to start the controller with, matches the state that is emitted from the controller.
* @param {string} initLangCode - The region code for the language preferred by the current user.
* @param {string} remoteSourcePort - remote application port connecting to extension.
* @returns {Promise} After setup is complete.
*/
function setupController(initState, initLangCode) {
function setupController(initState, initLangCode, remoteSourcePort) {
//
// MetaMask Controller
//
@ -367,17 +393,13 @@ function setupController(initState, initLangCode) {
//
// connect to other contexts
//
if (isManifestV3() && remoteSourcePort) {
connectRemote(remoteSourcePort);
}
browser.runtime.onConnect.addListener(connectRemote);
browser.runtime.onConnectExternal.addListener(connectExternal);
const metamaskInternalProcessHash = {
[ENVIRONMENT_TYPE_POPUP]: true,
[ENVIRONMENT_TYPE_NOTIFICATION]: true,
[ENVIRONMENT_TYPE_FULLSCREEN]: true,
};
const metamaskBlockedPorts = ['trezor-connect'];
const isClientOpenStatus = () => {
return (
popupIsOpen ||
@ -445,6 +467,13 @@ function setupController(initState, initLangCode) {
controller.isClientOpen = true;
controller.setupTrustedCommunication(portStream, remotePort.sender);
if (isManifestV3()) {
// Message below if captured by UI code in app/scripts/ui.js which will trigger UI initialisation
// This ensures that UI is initialised only after background is ready
// It fixes the issue of blank screen coming when extension is loaded, the issue is very frequent in MV3
remotePort.postMessage({ name: 'CONNECTION_READY' });
}
if (processName === ENVIRONMENT_TYPE_POPUP) {
popupIsOpen = true;
endOfStream(portStream, () => {
@ -566,9 +595,15 @@ function setupController(initState, initLangCode) {
if (count) {
label = String(count);
}
// browserAction has been replaced by action in MV3
if (isManifestV3()) {
browser.action.setBadgeText({ text: label });
browser.action.setBadgeBackgroundColor({ color: '#037DD6' });
} else {
browser.browserAction.setBadgeText({ text: label });
browser.browserAction.setBadgeBackgroundColor({ color: '#037DD6' });
}
}
function getUnapprovedTransactionCount() {
const unapprovedTxCount = controller.txController.getUnapprovedTxCount();

@ -1,2 +1,3 @@
export const TRANSAK_API_KEY = '25ac1309-a49b-4411-b20e-5e56c61a5b1c'; // It's a public key, which will be included in a URL for Transak.
export const MOONPAY_API_KEY = 'pk_live_WbCpe6PxSIcGPCSd6lKCbJNRht7uy'; // Publishable key.
export const COINBASEPAY_API_KEY = 'ab4b8829-a59d-44d3-accc-de77e4f18df2'; // Publishable key.

@ -6,6 +6,8 @@ import browser from 'webextension-polyfill';
import PortStream from 'extension-port-stream';
import { obj as createThoughStream } from 'through2';
import { isManifestV3 } from '../../shared/modules/mv3.utils';
// These require calls need to use require to be statically recognized by browserify
const fs = require('fs');
const path = require('path');
@ -54,7 +56,12 @@ function injectScript(content) {
const container = document.head || document.documentElement;
const scriptTag = document.createElement('script');
scriptTag.setAttribute('async', 'false');
// Inline scripts do not work in MV3 due to more strict security policy
if (isManifestV3()) {
scriptTag.setAttribute('src', browser.runtime.getURL('inpage.js'));
} else {
scriptTag.textContent = content;
}
container.insertBefore(scriptTag, container.children[0]);
container.removeChild(scriptTag);
} catch (error) {

@ -6,6 +6,9 @@ import { MINUTE } from '../../../shared/constants/time';
import { MAINNET_CHAIN_ID } from '../../../shared/constants/network';
import { isTokenDetectionEnabledForNetwork } from '../../../shared/modules/network.utils';
import { isEqualCaseInsensitive } from '../../../shared/modules/string-utils';
import { TOKEN_STANDARDS } from '../../../ui/helpers/constants/common';
import { ASSET_TYPES } from '../../../shared/constants/transaction';
import { EVENT, EVENT_NAMES } from '../../../shared/constants/metametrics';
// By default, poll every 3 minutes
const DEFAULT_INTERVAL = MINUTE * 3;
@ -26,6 +29,7 @@ export default class DetectTokensController {
* @param config.tokenList
* @param config.tokensController
* @param config.assetsContractController
* @param config.trackMetaMetricsEvent
*/
constructor({
interval = DEFAULT_INTERVAL,
@ -35,6 +39,7 @@ export default class DetectTokensController {
tokenList,
tokensController,
assetsContractController = null,
trackMetaMetricsEvent,
} = {}) {
this.assetsContractController = assetsContractController;
this.tokensController = tokensController;
@ -51,6 +56,7 @@ export default class DetectTokensController {
this.detectedTokens = process.env.TOKEN_DETECTION_V2
? this.tokensController?.state.detectedTokens
: [];
this._trackMetaMetricsEvent = trackMetaMetricsEvent;
preferences?.store.subscribe(({ selectedAddress, useTokenDetection }) => {
if (
@ -162,6 +168,7 @@ export default class DetectTokensController {
let tokensWithBalance = [];
if (process.env.TOKEN_DETECTION_V2) {
const eventTokensDetails = [];
if (result) {
const nonZeroTokenAddresses = Object.keys(result);
for (const nonZeroTokenAddress of nonZeroTokenAddresses) {
@ -172,6 +179,9 @@ export default class DetectTokensController {
iconUrl,
aggregators,
} = tokenList[nonZeroTokenAddress];
eventTokensDetails.push(`${symbol} - ${address}`);
tokensWithBalance.push({
address,
symbol,
@ -180,7 +190,17 @@ export default class DetectTokensController {
aggregators,
});
}
if (tokensWithBalance.length > 0) {
this._trackMetaMetricsEvent({
event: EVENT_NAMES.TOKEN_DETECTED,
category: EVENT.CATEGORIES.WALLET,
properties: {
tokens: eventTokensDetails,
token_standard: TOKEN_STANDARDS.ERC20,
asset_type: ASSET_TYPES.TOKEN,
},
});
await this.tokensController.addDetectedTokens(tokensWithBalance);
}
}

@ -558,6 +558,15 @@ export default class MetaMetricsController {
[TRAITS.NETWORKS_ADDED]: metamaskState.frequentRpcListDetail.map(
(rpc) => rpc.chainId,
),
[TRAITS.NETWORKS_WITHOUT_TICKER]: metamaskState.frequentRpcListDetail.reduce(
(networkList, currentNetwork) => {
if (!currentNetwork.ticker) {
networkList.push(currentNetwork.chainId);
}
return networkList;
},
[],
),
[TRAITS.NFT_AUTODETECTION_ENABLED]: metamaskState.useCollectibleDetection,
[TRAITS.NUMBER_OF_ACCOUNTS]: Object.values(metamaskState.identities)
.length,
@ -571,6 +580,7 @@ export default class MetaMetricsController {
[TRAITS.OPENSEA_API_ENABLED]: metamaskState.openSeaEnabled,
[TRAITS.THREE_BOX_ENABLED]: metamaskState.threeBoxSyncingAllowed,
[TRAITS.THEME]: metamaskState.theme || 'default',
[TRAITS.TOKEN_DETECTION_ENABLED]: metamaskState.useTokenDetection,
};
if (!this.previousTraits) {

@ -9,8 +9,10 @@ import {
} from '../../../shared/constants/metametrics';
import waitUntilCalled from '../../../test/lib/wait-until-called';
import {
ETH_SYMBOL,
MAINNET_CHAIN_ID,
ROPSTEN_CHAIN_ID,
TEST_ETH_SYMBOL,
} from '../../../shared/constants/network';
import MetaMetricsController from './metametrics';
import { NETWORK_EVENTS } from './network';
@ -673,8 +675,9 @@ describe('MetaMetricsController', function () {
},
allTokens: MOCK_ALL_TOKENS,
frequentRpcListDetail: [
{ chainId: MAINNET_CHAIN_ID },
{ chainId: ROPSTEN_CHAIN_ID },
{ chainId: MAINNET_CHAIN_ID, ticker: ETH_SYMBOL },
{ chainId: ROPSTEN_CHAIN_ID, ticker: TEST_ETH_SYMBOL },
{ chainId: '0xaf' },
],
identities: [{}, {}],
ledgerTransportType: 'web-hid',
@ -682,12 +685,14 @@ describe('MetaMetricsController', function () {
threeBoxSyncingAllowed: false,
useCollectibleDetection: false,
theme: 'default',
useTokenDetection: true,
});
assert.deepEqual(traits, {
[TRAITS.ADDRESS_BOOK_ENTRIES]: 3,
[TRAITS.LEDGER_CONNECTION_TYPE]: 'web-hid',
[TRAITS.NETWORKS_ADDED]: [MAINNET_CHAIN_ID, ROPSTEN_CHAIN_ID],
[TRAITS.NETWORKS_ADDED]: [MAINNET_CHAIN_ID, ROPSTEN_CHAIN_ID, '0xaf'],
[TRAITS.NETWORKS_WITHOUT_TICKER]: ['0xaf'],
[TRAITS.NFT_AUTODETECTION_ENABLED]: false,
[TRAITS.NUMBER_OF_ACCOUNTS]: 2,
[TRAITS.NUMBER_OF_NFT_COLLECTIONS]: 3,
@ -696,6 +701,7 @@ describe('MetaMetricsController', function () {
[TRAITS.OPENSEA_API_ENABLED]: true,
[TRAITS.THREE_BOX_ENABLED]: false,
[TRAITS.THEME]: 'default',
[TRAITS.TOKEN_DETECTION_ENABLED]: true,
});
});
@ -717,6 +723,7 @@ describe('MetaMetricsController', function () {
threeBoxSyncingAllowed: false,
useCollectibleDetection: false,
theme: 'default',
useTokenDetection: true,
});
const updatedTraits = metaMetricsController._buildUserTraitsObject({
@ -737,6 +744,7 @@ describe('MetaMetricsController', function () {
threeBoxSyncingAllowed: false,
useCollectibleDetection: false,
theme: 'default',
useTokenDetection: true,
});
assert.deepEqual(updatedTraits, {
@ -765,6 +773,7 @@ describe('MetaMetricsController', function () {
threeBoxSyncingAllowed: false,
useCollectibleDetection: true,
theme: 'default',
useTokenDetection: true,
});
const updatedTraits = metaMetricsController._buildUserTraitsObject({
@ -783,6 +792,7 @@ describe('MetaMetricsController', function () {
threeBoxSyncingAllowed: false,
useCollectibleDetection: true,
theme: 'default',
useTokenDetection: true,
});
assert.equal(updatedTraits, null);

@ -1,4 +1,4 @@
import { endowmentPermissionBuilders } from '@metamask/controllers';
import { endowmentPermissionBuilders } from '@metamask/snap-controllers';
import {
restrictedMethodPermissionBuilders,
selectHooks,

@ -19,6 +19,11 @@ import {
SWAPS_CHAINID_CONTRACT_ADDRESS_MAP,
} from '../../../shared/constants/swaps';
import { GAS_ESTIMATE_TYPES } from '../../../shared/constants/gas';
import {
FALLBACK_SMART_TRANSACTIONS_REFRESH_TIME,
FALLBACK_SMART_TRANSACTIONS_DEADLINE,
FALLBACK_SMART_TRANSACTIONS_MAX_FEE_MULTIPLIER,
} from '../../../shared/constants/smartTransactions';
import { isSwapsDefaultTokenAddress } from '../../../shared/modules/swaps.utils';
@ -41,8 +46,6 @@ const POLL_COUNT_LIMIT = 3;
// If for any reason the MetaSwap API fails to provide a refresh time,
// provide a reasonable fallback to avoid further errors
const FALLBACK_QUOTE_REFRESH_TIME = MINUTE;
const FALLBACK_SMART_TRANSACTION_REFRESH_TIME = SECOND * 10;
const FALLBACK_SMART_TRANSACTIONS_DEADLINE = 180;
function calculateGasEstimateWithRefund(
maxGas = MAX_GAS_LIMIT,
@ -86,8 +89,9 @@ const initialState = {
saveFetchedQuotes: false,
swapsQuoteRefreshTime: FALLBACK_QUOTE_REFRESH_TIME,
swapsQuotePrefetchingRefreshTime: FALLBACK_QUOTE_REFRESH_TIME,
swapsStxBatchStatusRefreshTime: FALLBACK_SMART_TRANSACTION_REFRESH_TIME,
swapsStxGetTransactionsRefreshTime: FALLBACK_SMART_TRANSACTION_REFRESH_TIME,
swapsStxBatchStatusRefreshTime: FALLBACK_SMART_TRANSACTIONS_REFRESH_TIME,
swapsStxGetTransactionsRefreshTime: FALLBACK_SMART_TRANSACTIONS_REFRESH_TIME,
swapsStxMaxFeeMultiplier: FALLBACK_SMART_TRANSACTIONS_MAX_FEE_MULTIPLIER,
swapsFeatureFlags: {},
},
};
@ -129,13 +133,13 @@ export default class SwapsController {
});
}
async fetchSwapsRefreshRates(chainId) {
async fetchSwapsNetworkConfig(chainId) {
const response = await fetchWithCache(
getBaseApi('network', chainId),
{ method: 'GET' },
{ cacheRefreshTime: 600000 },
);
const { refreshRates } = response || {};
const { refreshRates, parameters = {} } = response || {};
if (
!refreshRates ||
typeof refreshRates.quotes !== 'number' ||
@ -152,35 +156,39 @@ export default class SwapsController {
stxGetTransactions: refreshRates.stxGetTransactions * 1000,
stxBatchStatus: refreshRates.stxBatchStatus * 1000,
stxStatusDeadline: refreshRates.stxStatusDeadline,
stxMaxFeeMultiplier: parameters.stxMaxFeeMultiplier,
};
}
// Sets the refresh rate for quote updates from the MetaSwap API
async _setSwapsRefreshRates() {
// Sets the network config from the MetaSwap API.
async _setSwapsNetworkConfig() {
const chainId = this._getCurrentChainId();
let swapsRefreshRates;
let swapsNetworkConfig;
try {
swapsRefreshRates = await this.fetchSwapsRefreshRates(chainId);
swapsNetworkConfig = await this.fetchSwapsNetworkConfig(chainId);
} catch (e) {
console.error('Request for swaps quote refresh time failed: ', e);
console.error('Request for Swaps network config failed: ', e);
}
const { swapsState: latestSwapsState } = this.store.getState();
this.store.updateState({
swapsState: {
...latestSwapsState,
swapsQuoteRefreshTime:
swapsRefreshRates?.quotes || FALLBACK_QUOTE_REFRESH_TIME,
swapsNetworkConfig?.quotes || FALLBACK_QUOTE_REFRESH_TIME,
swapsQuotePrefetchingRefreshTime:
swapsRefreshRates?.quotesPrefetching || FALLBACK_QUOTE_REFRESH_TIME,
swapsNetworkConfig?.quotesPrefetching || FALLBACK_QUOTE_REFRESH_TIME,
swapsStxGetTransactionsRefreshTime:
swapsRefreshRates?.stxGetTransactions ||
FALLBACK_SMART_TRANSACTION_REFRESH_TIME,
swapsNetworkConfig?.stxGetTransactions ||
FALLBACK_SMART_TRANSACTIONS_REFRESH_TIME,
swapsStxBatchStatusRefreshTime:
swapsRefreshRates?.stxBatchStatus ||
FALLBACK_SMART_TRANSACTION_REFRESH_TIME,
swapsNetworkConfig?.stxBatchStatus ||
FALLBACK_SMART_TRANSACTIONS_REFRESH_TIME,
swapsStxStatusDeadline:
swapsRefreshRates?.stxStatusDeadline ||
swapsNetworkConfig?.stxStatusDeadline ||
FALLBACK_SMART_TRANSACTIONS_DEADLINE,
swapsStxMaxFeeMultiplier:
swapsNetworkConfig?.stxMaxFeeMultiplier ||
FALLBACK_SMART_TRANSACTIONS_MAX_FEE_MULTIPLIER,
},
});
}
@ -253,7 +261,7 @@ export default class SwapsController {
this._fetchTradesInfo(fetchParams, {
...fetchParamsMetaData,
}),
this._setSwapsRefreshRates(),
this._setSwapsNetworkConfig(),
]);
const {

@ -13,6 +13,10 @@ import { ETH_SWAPS_TOKEN_OBJECT } from '../../../shared/constants/swaps';
import { createTestProviderTools } from '../../../test/stub/provider';
import { SECOND } from '../../../shared/constants/time';
import { GAS_ESTIMATE_TYPES } from '../../../shared/constants/gas';
import {
FALLBACK_SMART_TRANSACTIONS_REFRESH_TIME,
FALLBACK_SMART_TRANSACTIONS_MAX_FEE_MULTIPLIER,
} from '../../../shared/constants/smartTransactions';
import SwapsController, { utils } from './swaps';
import { NETWORK_EVENTS } from './network';
@ -134,8 +138,9 @@ const EMPTY_INIT_STATE = {
swapsFeatureFlags: {},
swapsQuoteRefreshTime: 60000,
swapsQuotePrefetchingRefreshTime: 60000,
swapsStxBatchStatusRefreshTime: 10000,
swapsStxGetTransactionsRefreshTime: 10000,
swapsStxBatchStatusRefreshTime: FALLBACK_SMART_TRANSACTIONS_REFRESH_TIME,
swapsStxGetTransactionsRefreshTime: FALLBACK_SMART_TRANSACTIONS_REFRESH_TIME,
swapsStxMaxFeeMultiplier: FALLBACK_SMART_TRANSACTIONS_MAX_FEE_MULTIPLIER,
swapsUserFeeLevel: '',
saveFetchedQuotes: false,
},

@ -18,10 +18,12 @@ import {
getChainType,
} from '../../lib/util';
import { TRANSACTION_NO_CONTRACT_ERROR_KEY } from '../../../../ui/helpers/constants/error-keys';
import { calcGasTotal } from '../../../../ui/pages/send/send.utils';
import { getSwapsTokensReceivedFromTxMeta } from '../../../../ui/pages/swaps/swaps.util';
import {
hexWEIToDecGWEI,
decimalToHex,
hexWEIToDecETH,
} from '../../../../ui/helpers/utils/conversions.util';
import {
TRANSACTION_STATUSES,
@ -39,6 +41,7 @@ import {
PRIORITY_LEVELS,
} from '../../../../shared/constants/gas';
import { decGWEIToHexWEI } from '../../../../shared/modules/conversion.utils';
import { isSwapsDefaultTokenAddress } from '../../../../shared/modules/swaps.utils';
import { EVENT } from '../../../../shared/constants/metametrics';
import {
HARDFORKS,
@ -58,6 +61,7 @@ import PendingTransactionTracker from './pending-tx-tracker';
import * as txUtils from './lib/util';
const MAX_MEMSTORE_TX_LIST_SIZE = 100; // Number of transactions (by unique nonces) to keep in memory
const UPDATE_POST_TX_BALANCE_TIMEOUT = 5000;
const SWAP_TRANSACTION_TYPES = [
TRANSACTION_TYPES.SWAP,
@ -443,7 +447,7 @@ export default class TransactionController extends EventEmitter {
* @param {string} editableParams.gasPrice
* @returns {TransactionMeta} the txMeta of the updated transaction
*/
updateEditableParams(txId, { data, from, to, value, gas, gasPrice }) {
async updateEditableParams(txId, { data, from, to, value, gas, gasPrice }) {
this._throwErrorIfNotUnapprovedTx(txId, 'updateEditableParams');
const editableParams = {
@ -459,7 +463,20 @@ export default class TransactionController extends EventEmitter {
// only update what is defined
editableParams.txParams = pickBy(editableParams.txParams);
// update transaction type in case it has changes
const transactionBeforeEdit = this._getTransaction(txId);
const { type } = await determineTransactionType(
{
...transactionBeforeEdit.txParams,
...editableParams.txParams,
},
this.query,
);
editableParams.type = type;
const note = `Update Editable Params for ${txId}`;
this._updateTransaction(txId, editableParams, note);
return this._getTransaction(txId);
}
@ -1450,6 +1467,39 @@ export default class TransactionController extends EventEmitter {
this._trackTransactionMetricsEvent(txMeta, TRANSACTION_EVENTS.SUBMITTED);
}
async updatePostTxBalance({ txMeta, txId, numberOfAttempts = 6 }) {
const postTxBalance = await this.query.getBalance(txMeta.txParams.from);
const latestTxMeta = this.txStateManager.getTransaction(txId);
const approvalTxMeta = latestTxMeta.approvalTxId
? this.txStateManager.getTransaction(latestTxMeta.approvalTxId)
: null;
latestTxMeta.postTxBalance = postTxBalance.toString(16);
const isDefaultTokenAddress = isSwapsDefaultTokenAddress(
txMeta.destinationTokenAddress,
txMeta.chainId,
);
if (
isDefaultTokenAddress &&
txMeta.preTxBalance === latestTxMeta.postTxBalance &&
numberOfAttempts > 0
) {
setTimeout(() => {
// If postTxBalance is the same as preTxBalance, try it again.
this.updatePostTxBalance({
txMeta,
txId,
numberOfAttempts: numberOfAttempts - 1,
});
}, UPDATE_POST_TX_BALANCE_TIMEOUT);
} else {
this.txStateManager.updateTransaction(
latestTxMeta,
'transactions#confirmTransaction - add postTxBalance',
);
this._trackSwapsMetrics(latestTxMeta, approvalTxMeta);
}
}
/**
* Sets the status of the transaction to confirmed and sets the status of nonce duplicates as
* dropped if the txParams have data it will fetch the txReceipt
@ -1513,21 +1563,10 @@ export default class TransactionController extends EventEmitter {
);
if (txMeta.type === TRANSACTION_TYPES.SWAP) {
const postTxBalance = await this.query.getBalance(txMeta.txParams.from);
const latestTxMeta = this.txStateManager.getTransaction(txId);
const approvalTxMeta = latestTxMeta.approvalTxId
? this.txStateManager.getTransaction(latestTxMeta.approvalTxId)
: null;
latestTxMeta.postTxBalance = postTxBalance.toString(16);
this.txStateManager.updateTransaction(
latestTxMeta,
'transactions#confirmTransaction - add postTxBalance',
);
this._trackSwapsMetrics(latestTxMeta, approvalTxMeta);
await this.updatePostTxBalance({
txMeta,
txId,
});
}
} catch (err) {
log.error(err);
@ -1585,21 +1624,10 @@ export default class TransactionController extends EventEmitter {
);
if (txMeta.type === TRANSACTION_TYPES.SWAP) {
const postTxBalance = await this.query.getBalance(txMeta.txParams.from);
const latestTxMeta = this.txStateManager.getTransaction(txId);
const approvalTxMeta = latestTxMeta.approvalTxId
? this.txStateManager.getTransaction(latestTxMeta.approvalTxId)
: null;
latestTxMeta.postTxBalance = postTxBalance.toString(16);
this.txStateManager.updateTransaction(
latestTxMeta,
'transactions#confirmTransaction - add postTxBalance',
);
this._trackSwapsMetrics(latestTxMeta, approvalTxMeta);
await this.updatePostTxBalance({
txMeta,
txId,
});
}
} catch (err) {
log.error(err);
@ -1877,6 +1905,30 @@ export default class TransactionController extends EventEmitter {
this.memStore.updateState({ unapprovedTxs, currentNetworkTxList });
}
_calculateTransactionsCost(txMeta, approvalTxMeta) {
let approvalGasCost = '0x0';
if (approvalTxMeta?.txReceipt) {
approvalGasCost = calcGasTotal(
approvalTxMeta.txReceipt.gasUsed,
approvalTxMeta.txReceipt.effectiveGasPrice,
);
}
const tradeGasCost = calcGasTotal(
txMeta.txReceipt.gasUsed,
txMeta.txReceipt.effectiveGasPrice,
);
const tradeAndApprovalGasCost = new BigNumber(tradeGasCost, 16)
.plus(approvalGasCost, 16)
.toString(16);
return {
approvalGasCostInEth: Number(hexWEIToDecETH(approvalGasCost)),
tradeGasCostInEth: Number(hexWEIToDecETH(tradeGasCost)),
tradeAndApprovalGasCostInEth: Number(
hexWEIToDecETH(tradeAndApprovalGasCost),
),
};
}
_trackSwapsMetrics(txMeta, approvalTxMeta) {
if (this._getParticipateInMetrics() && txMeta.swapMetaData) {
if (txMeta.txReceipt.status === '0x0') {
@ -1911,6 +1963,11 @@ export default class TransactionController extends EventEmitter {
.round(2)}%`
: null;
const transactionsCost = this._calculateTransactionsCost(
txMeta,
approvalTxMeta,
);
this._trackMetaMetricsEvent({
event: 'Swap Completed',
category: EVENT.CATEGORIES.SWAPS,
@ -1919,6 +1976,10 @@ export default class TransactionController extends EventEmitter {
token_to_amount_received: tokensReceived,
quote_vs_executionRatio: quoteVsExecutionRatio,
estimated_vs_used_gasRatio: estimatedVsUsedGasRatio,
approval_gas_cost_in_eth: transactionsCost.approvalGasCostInEth,
trade_gas_cost_in_eth: transactionsCost.tradeGasCostInEth,
trade_and_approval_gas_cost_in_eth:
transactionsCost.tradeAndApprovalGasCostInEth,
},
});
}
@ -2005,6 +2066,10 @@ export default class TransactionController extends EventEmitter {
gasParams.estimate_used = estimateUsed;
}
if (extraParams?.gas_used) {
gasParams.gas_used = extraParams.gas_used;
}
const gasParamsInGwei = this._getGasValuesInGWEI(gasParams);
let eip1559Version = '0';
@ -2035,8 +2100,8 @@ export default class TransactionController extends EventEmitter {
: TRANSACTION_ENVELOPE_TYPE_NAMES.LEGACY,
first_seen: time,
gas_limit: gasLimit,
...gasParamsInGwei,
...extraParams,
...gasParamsInGwei,
};
return { properties, sensitiveProperties };

@ -1470,7 +1470,7 @@ describe('Transaction Controller', function () {
gas_edit_type: 'none',
network: '42',
referrer: ORIGIN_METAMASK,
source: 'user',
source: EVENT.SOURCE.TRANSACTION.USER,
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
asset_type: ASSET_TYPES.NATIVE,
@ -1549,7 +1549,7 @@ describe('Transaction Controller', function () {
gas_edit_type: 'none',
network: '42',
referrer: ORIGIN_METAMASK,
source: 'user',
source: EVENT.SOURCE.TRANSACTION.USER,
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
asset_type: ASSET_TYPES.NATIVE,
@ -1638,7 +1638,7 @@ describe('Transaction Controller', function () {
gas_edit_type: 'none',
network: '42',
referrer: 'other',
source: 'dapp',
source: EVENT.SOURCE.TRANSACTION.DAPP,
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
asset_type: ASSET_TYPES.NATIVE,
@ -1719,7 +1719,7 @@ describe('Transaction Controller', function () {
gas_edit_type: 'none',
network: '42',
referrer: 'other',
source: 'dapp',
source: EVENT.SOURCE.TRANSACTION.DAPP,
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
asset_type: ASSET_TYPES.NATIVE,
@ -1800,7 +1800,7 @@ describe('Transaction Controller', function () {
gas_edit_type: 'none',
network: '42',
referrer: 'other',
source: 'dapp',
source: EVENT.SOURCE.TRANSACTION.DAPP,
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
asset_type: ASSET_TYPES.NATIVE,
@ -1859,7 +1859,7 @@ describe('Transaction Controller', function () {
properties: {
network: '42',
referrer: 'other',
source: 'dapp',
source: EVENT.SOURCE.TRANSACTION.DAPP,
type: TRANSACTION_TYPES.SIMPLE_SEND,
chain_id: '0x2a',
eip_1559_version: '0',
@ -1936,7 +1936,7 @@ describe('Transaction Controller', function () {
gas_edit_type: 'none',
network: '42',
referrer: 'other',
source: 'dapp',
source: EVENT.SOURCE.TRANSACTION.DAPP,
type: TRANSACTION_TYPES.SIMPLE_SEND,
account_type: 'MetaMask',
asset_type: ASSET_TYPES.NATIVE,
@ -2245,4 +2245,125 @@ describe('Transaction Controller', function () {
assert.equal(result.destinationTokenAddress, VALID_ADDRESS_TWO); // not updated even though it's passed in to update
});
});
describe('updateEditableParams', function () {
let txStateManager;
beforeEach(function () {
txStateManager = txController.txStateManager;
txStateManager.addTransaction({
id: '1',
status: TRANSACTION_STATUSES.UNAPPROVED,
metamaskNetworkId: currentNetworkId,
txParams: {
gas: '0x001',
gasPrice: '0x002',
// max fees can not be mixed with gasPrice
// maxPriorityFeePerGas: '0x003',
// maxFeePerGas: '0x004',
to: VALID_ADDRESS,
from: VALID_ADDRESS,
},
estimateUsed: '0x005',
estimatedBaseFee: '0x006',
decEstimatedBaseFee: '6',
type: 'simpleSend',
userEditedGasLimit: '0x008',
userFeeLevel: 'medium',
});
});
it('updates editible params when type changes from simple send to token transfer', async function () {
// test update gasFees
await txController.updateEditableParams('1', {
data:
'0xa9059cbb000000000000000000000000e18035bf8712672935fdb4e5e431b1a0183d2dfc0000000000000000000000000000000000000000000000000de0b6b3a7640000',
});
const result = txStateManager.getTransaction('1');
assert.equal(
result.txParams.data,
'0xa9059cbb000000000000000000000000e18035bf8712672935fdb4e5e431b1a0183d2dfc0000000000000000000000000000000000000000000000000de0b6b3a7640000',
);
assert.equal(result.type, TRANSACTION_TYPES.TOKEN_METHOD_TRANSFER);
});
it('updates editible params when type changes from token transfer to simple send', async function () {
// test update gasFees
txStateManager.addTransaction({
id: '2',
status: TRANSACTION_STATUSES.UNAPPROVED,
metamaskNetworkId: currentNetworkId,
txParams: {
gas: '0x001',
gasPrice: '0x002',
// max fees can not be mixed with gasPrice
// maxPriorityFeePerGas: '0x003',
// maxFeePerGas: '0x004',
to: VALID_ADDRESS,
from: VALID_ADDRESS,
data:
'0xa9059cbb000000000000000000000000e18035bf8712672935fdb4e5e431b1a0183d2dfc0000000000000000000000000000000000000000000000000de0b6b3a7640000',
},
estimateUsed: '0x005',
estimatedBaseFee: '0x006',
decEstimatedBaseFee: '6',
type: TRANSACTION_TYPES.TOKEN_METHOD_TRANSFER,
userEditedGasLimit: '0x008',
userFeeLevel: 'medium',
});
await txController.updateEditableParams('2', {
data: '0x',
});
const result = txStateManager.getTransaction('2');
assert.equal(result.txParams.data, '0x');
assert.equal(result.type, TRANSACTION_TYPES.SIMPLE_SEND);
});
it('updates editible params when type changes from simpleSend to contract interaction', async function () {
// test update gasFees
txStateManager.addTransaction({
id: '3',
status: TRANSACTION_STATUSES.UNAPPROVED,
metamaskNetworkId: currentNetworkId,
txParams: {
gas: '0x001',
gasPrice: '0x002',
// max fees can not be mixed with gasPrice
// maxPriorityFeePerGas: '0x003',
// maxFeePerGas: '0x004',
to: VALID_ADDRESS,
from: VALID_ADDRESS,
},
estimateUsed: '0x005',
estimatedBaseFee: '0x006',
decEstimatedBaseFee: '6',
type: TRANSACTION_TYPES.TOKEN_METHOD_TRANSFER,
userEditedGasLimit: '0x008',
userFeeLevel: 'medium',
});
providerResultStub.eth_getCode = '0x5';
await txController.updateEditableParams('3', {
data: '0x123',
});
const result = txStateManager.getTransaction('3');
assert.equal(result.txParams.data, '0x123');
assert.equal(result.type, TRANSACTION_TYPES.CONTRACT_INTERACTION);
});
it('updates editible params when type does not change', async function () {
// test update gasFees
await txController.updateEditableParams('1', {
data: '0x123',
gas: '0xabc',
from: VALID_ADDRESS_TWO,
});
const result = txStateManager.getTransaction('1');
assert.equal(result.txParams.data, '0x123');
assert.equal(result.txParams.gas, '0xabc');
assert.equal(result.txParams.from, VALID_ADDRESS_TWO);
assert.equal(result.txParams.to, VALID_ADDRESS);
assert.equal(result.txParams.gasPrice, '0x002');
assert.equal(result.type, TRANSACTION_TYPES.SIMPLE_SEND);
});
});
});

@ -7,24 +7,32 @@ import {
MAINNET_CHAIN_ID,
RINKEBY_CHAIN_ID,
ROPSTEN_CHAIN_ID,
MAINNET_NETWORK_ID,
BUYABLE_CHAINS_MAP,
} from '../../../shared/constants/network';
import { SECOND } from '../../../shared/constants/time';
import getFetchWithTimeout from '../../../shared/modules/fetch-with-timeout';
import { TRANSAK_API_KEY, MOONPAY_API_KEY } from '../constants/on-ramp';
import {
TRANSAK_API_KEY,
MOONPAY_API_KEY,
COINBASEPAY_API_KEY,
} from '../constants/on-ramp';
const fetchWithTimeout = getFetchWithTimeout(SECOND * 30);
/**
* Create a Wyre purchase URL.
*
* @param {string} address - Ethereum destination address
* @param {string} walletAddress - Ethereum destination address
* @param {string} chainId - Current chain ID
* @returns String
*/
const createWyrePurchaseUrl = async (address) => {
const fiatOnRampUrlApi = `${SWAPS_API_V2_BASE_URL}/networks/${MAINNET_NETWORK_ID}/fiatOnRampUrl?serviceName=wyre&destinationAddress=${address}`;
const wyrePurchaseUrlFallback = `https://pay.sendwyre.com/purchase?dest=ethereum:${address}&destCurrency=ETH&accountId=AC-7AG3W4XH4N2&paymentMethod=debit-card`;
const createWyrePurchaseUrl = async (walletAddress, chainId) => {
const { wyre = {} } = BUYABLE_CHAINS_MAP[chainId];
const { srn, currencyCode } = wyre;
const networkId = parseInt(chainId, 16);
const fiatOnRampUrlApi = `${SWAPS_API_V2_BASE_URL}/networks/${networkId}/fiatOnRampUrl?serviceName=wyre&destinationAddress=${walletAddress}`;
const wyrePurchaseUrlFallback = `https://pay.sendwyre.com/purchase?dest=${srn}:${walletAddress}&destCurrency=${currencyCode}&accountId=AC-7AG3W4XH4N2&paymentMethod=debit-card`;
try {
const response = await fetchWithTimeout(fiatOnRampUrlApi, {
method: 'GET',
@ -108,6 +116,28 @@ const createMoonPayUrl = async (walletAddress, chainId) => {
return '';
};
/**
* Create a Coinbase Pay Checkout URL.
*
* @param {string} walletAddress - Ethereum destination address
* @param {string} chainId - Current chain ID
* @returns String
*/
const createCoinbasePayUrl = (walletAddress, chainId) => {
const { coinbasePayCurrencies } = BUYABLE_CHAINS_MAP[chainId];
const queryParams = new URLSearchParams({
appId: COINBASEPAY_API_KEY,
attribution: 'extension',
destinationWallets: JSON.stringify([
{
address: walletAddress,
assets: coinbasePayCurrencies,
},
]),
});
return `https://pay.coinbase.com/buy?${queryParams}`;
};
/**
* Gives the caller a url at which the user can acquire eth, depending on the network they are in
*
@ -127,11 +157,13 @@ export default async function getBuyUrl({ chainId, address, service }) {
switch (service) {
case 'wyre':
return await createWyrePurchaseUrl(address);
return await createWyrePurchaseUrl(address, chainId);
case 'transak':
return createTransakUrl(address, chainId);
case 'moonpay':
return createMoonPayUrl(address, chainId);
case 'coinbase':
return createCoinbasePayUrl(address, chainId);
case 'metamask-faucet':
return 'https://faucet.metamask.io/';
case 'rinkeby-faucet':

@ -1,6 +1,7 @@
import { EthereumRpcError } from 'eth-rpc-errors';
import SafeEventEmitter from 'safe-event-emitter';
import createRandomId from '../../../shared/modules/random-id';
import { TEN_SECONDS_IN_MILLISECONDS } from '../../../ui/helpers/constants/critical-error';
class MetaRPCClient {
constructor(connectionStream) {
@ -10,6 +11,25 @@ class MetaRPCClient {
this.requests = new Map();
this.connectionStream.on('data', this.handleResponse.bind(this));
this.connectionStream.on('end', this.close.bind(this));
this.responseHandled = {};
}
send(id, payload, cb) {
this.requests.set(id, cb);
this.connectionStream.write(payload);
this.responseHandled[id] = false;
if (payload.method === 'getState') {
setTimeout(() => {
if (!this.responseHandled[id] && cb) {
delete this.responseHandled[id];
return cb(new Error('No response from RPC'), null);
}
delete this.responseHandled[id];
// needed for linter to pass
return true;
}, TEN_SECONDS_IN_MILLISECONDS);
}
}
onNotification(handler) {
@ -34,6 +54,8 @@ class MetaRPCClient {
const isNotification = id === undefined && error === undefined;
const cb = this.requests.get(id);
this.responseHandled[id] = true;
if (method && params && !isNotification) {
// dont handle server-side to client-side requests
return;
@ -79,14 +101,13 @@ const metaRPCClientFactory = (connectionStream) => {
const cb = p[p.length - 1];
const params = p.slice(0, -1);
const id = createRandomId();
object.requests.set(id, cb);
object.connectionStream.write({
const payload = {
jsonrpc: '2.0',
method: property,
params,
id,
});
};
object.send(id, payload, cb);
};
},
});

@ -131,4 +131,21 @@ describe('metaRPCClientFactory', () => {
},
});
});
it('should be able to handle no message within TIMEOUT secs', async () => {
jest.useFakeTimers();
const streamTest = createThoughStream();
const metaRPCClient = metaRPCClientFactory(streamTest);
const errorPromise = new Promise((_resolve, reject) =>
metaRPCClient.getState('bad', (error, _) => {
reject(error);
}),
);
jest.runOnlyPendingTimers();
await expect(errorPromise).rejects.toThrow('No response from RPC');
jest.useRealTimers();
});
});

@ -278,7 +278,7 @@ async function addEthereumChainHandler(
network: firstValidRPCUrl,
symbol: ticker,
block_explorer_url: firstValidBlockExplorerUrl,
source: 'dapp',
source: EVENT.SOURCE.TRANSACTION.DAPP,
},
});

@ -42,12 +42,15 @@ import {
SubjectMetadataController,
///: BEGIN:ONLY_INCLUDE_IN(flask)
RateLimitController,
NotificationController,
///: END:ONLY_INCLUDE_IN
} from '@metamask/controllers';
import SmartTransactionsController from '@metamask/smart-transactions-controller';
///: BEGIN:ONLY_INCLUDE_IN(flask)
import { SnapController } from '@metamask/snap-controllers';
import { IframeExecutionService } from '@metamask/iframe-execution-environment-service';
import {
SnapController,
IframeExecutionService,
} from '@metamask/snap-controllers';
///: END:ONLY_INCLUDE_IN
import {
@ -403,7 +406,7 @@ export default class MetamaskController extends EventEmitter {
name: 'CurrencyRateController',
});
this.currencyRateController = new CurrencyRateController({
includeUSDRate: true,
includeUsdRate: true,
messenger: currencyRateMessenger,
state: {
...initState.CurrencyController,
@ -638,9 +641,8 @@ export default class MetamaskController extends EventEmitter {
///: BEGIN:ONLY_INCLUDE_IN(flask)
this.workerController = new IframeExecutionService({
onError: this.onExecutionEnvironmentError.bind(this),
iframeUrl: new URL(
'https://metamask.github.io/iframe-execution-environment/0.4.4',
'https://metamask.github.io/iframe-execution-environment/0.4.6',
),
messenger: this.controllerMessenger.getRestricted({
name: 'ExecutionService',
@ -666,7 +668,7 @@ export default class MetamaskController extends EventEmitter {
});
this.snapController = new SnapController({
endowmentPermissionNames: Object.values(EndowmentPermissions),
environmentEndowmentPermissions: Object.values(EndowmentPermissions),
terminateAllSnaps: this.workerController.terminateAllSnaps.bind(
this.workerController,
),
@ -684,6 +686,13 @@ export default class MetamaskController extends EventEmitter {
messenger: snapControllerMessenger,
});
this.notificationController = new NotificationController({
messenger: this.controllerMessenger.getRestricted({
name: 'NotificationController',
}),
state: initState.NotificationController,
});
this.rateLimitController = new RateLimitController({
messenger: this.controllerMessenger.getRestricted({
name: 'RateLimitController',
@ -702,6 +711,15 @@ export default class MetamaskController extends EventEmitter {
);
return null;
},
showInAppNotification: (origin, message) => {
this.controllerMessenger.call(
'NotificationController:show',
origin,
message,
);
return null;
},
},
});
///: END:ONLY_INCLUDE_IN
@ -714,6 +732,9 @@ export default class MetamaskController extends EventEmitter {
network: this.networkController,
keyringMemStore: this.keyringController.memStore,
tokenList: this.tokenListController,
trackMetaMetricsEvent: this.metaMetricsController.trackEvent.bind(
this.metaMetricsController,
),
}))
: (this.detectTokensController = new DetectTokensController({
preferences: this.preferencesController,
@ -1000,6 +1021,7 @@ export default class MetamaskController extends EventEmitter {
CollectiblesController: this.collectiblesController,
///: BEGIN:ONLY_INCLUDE_IN(flask)
SnapController: this.snapController,
NotificationController: this.notificationController,
///: END:ONLY_INCLUDE_IN
});
@ -1040,6 +1062,7 @@ export default class MetamaskController extends EventEmitter {
CollectiblesController: this.collectiblesController,
///: BEGIN:ONLY_INCLUDE_IN(flask)
SnapController: this.snapController,
NotificationController: this.notificationController,
///: END:ONLY_INCLUDE_IN
},
controllerMessenger: this.controllerMessenger,
@ -1115,7 +1138,7 @@ export default class MetamaskController extends EventEmitter {
type: MESSAGE_TYPE.SNAP_CONFIRM,
requestData: confirmationData,
}),
showNotification: (origin, args) =>
showNativeNotification: (origin, args) =>
this.controllerMessenger.call(
'RateLimitController:call',
origin,
@ -1123,6 +1146,14 @@ export default class MetamaskController extends EventEmitter {
origin,
args.message,
),
showInAppNotification: (origin, args) =>
this.controllerMessenger.call(
'RateLimitController:call',
origin,
'showInAppNotification',
origin,
args.message,
),
updateSnapState: this.controllerMessenger.call.bind(
this.controllerMessenger,
'SnapController:updateSnapState',
@ -1130,6 +1161,25 @@ export default class MetamaskController extends EventEmitter {
}),
};
}
/**
* Deletes the specified notifications from state.
*
* @param {string[]} ids - The notifications ids to delete.
*/
dismissNotifications(ids) {
this.notificationController.dismiss(ids);
}
/**
* Updates the readDate attribute of the specified notifications.
*
* @param {string[]} ids - The notifications ids to mark as read.
*/
markNotificationsAsRead(ids) {
this.notificationController.markRead(ids);
}
///: END:ONLY_INCLUDE_IN
/**
@ -1227,6 +1277,26 @@ export default class MetamaskController extends EventEmitter {
});
},
);
this.controllerMessenger.subscribe(
`${this.snapController.name}:snapTerminated`,
(snapId) => {
const approvals = Object.values(
this.approvalController.state.pendingApprovals,
).filter(
(approval) =>
approval.origin === snapId &&
approval.type === MESSAGE_TYPE.SNAP_CONFIRM,
);
for (const approval of approvals) {
this.approvalController.reject(
approval.id,
new Error('Snap was terminated.'),
);
}
},
);
///: END:ONLY_INCLUDE_IN
}
@ -1242,12 +1312,17 @@ export default class MetamaskController extends EventEmitter {
},
version,
// account mgmt
getAccounts: async ({ origin }) => {
getAccounts: async (
{ origin },
{ suppressUnauthorizedError = true } = {},
) => {
if (origin === ORIGIN_METAMASK) {
const selectedAddress = this.preferencesController.getSelectedAddress();
return selectedAddress ? [selectedAddress] : [];
} else if (this.isUnlocked()) {
return await this.getPermittedAccounts(origin);
return await this.getPermittedAccounts(origin, {
suppressUnauthorizedError,
});
}
return []; // changing this is a breaking change
},
@ -1728,7 +1803,9 @@ export default class MetamaskController extends EventEmitter {
),
disableSnap: this.snapController.disableSnap.bind(this.snapController),
enableSnap: this.snapController.enableSnap.bind(this.snapController),
removeSnap: this.removeSnap.bind(this),
removeSnap: this.snapController.removeSnap.bind(this.snapController),
dismissNotifications: this.dismissNotifications.bind(this),
markNotificationsAsRead: this.markNotificationsAsRead.bind(this),
///: END:ONLY_INCLUDE_IN
// swaps
@ -1792,9 +1869,6 @@ export default class MetamaskController extends EventEmitter {
fetchSmartTransactionFees: smartTransactionsController.getFees.bind(
smartTransactionsController,
),
estimateSmartTransactionsGas: smartTransactionsController.estimateGas.bind(
smartTransactionsController,
),
submitSignedTransactions: smartTransactionsController.submitSignedTransactions.bind(
smartTransactionsController,
),
@ -2016,7 +2090,7 @@ export default class MetamaskController extends EventEmitter {
// This must be set as soon as possible to communicate to the
// keyring's iframe and have the setting initialized properly
// Optimistically called to not block Metamask login due to
// Optimistically called to not block MetaMask login due to
// Ledger Keyring GitHub downtime
const transportPreference = this.preferencesController.getLedgerTransportPreference();
this.setLedgerTransportPreference(transportPreference);
@ -2188,7 +2262,7 @@ export default class MetamaskController extends EventEmitter {
// This must be set as soon as possible to communicate to the
// keyring's iframe and have the setting initialized properly
// Optimistically called to not block Metamask login due to
// Optimistically called to not block MetaMask login due to
// Ledger Keyring GitHub downtime
const transportPreference = this.preferencesController.getLedgerTransportPreference();
@ -2537,17 +2611,24 @@ export default class MetamaskController extends EventEmitter {
* array if no accounts are permitted.
*
* @param {string} origin - The origin whose exposed accounts to retrieve.
* @param {boolean} [suppressUnauthorizedError] - Suppresses the unauthorized error.
* @returns {Promise<string[]>} The origin's permitted accounts, or an empty
* array.
*/
async getPermittedAccounts(origin) {
async getPermittedAccounts(
origin,
{ suppressUnauthorizedError = true } = {},
) {
try {
return await this.permissionController.executeRestrictedMethod(
origin,
RestrictedMethods.eth_accounts,
);
} catch (error) {
if (error.code === rpcErrorCodes.provider.unauthorized) {
if (
suppressUnauthorizedError &&
error.code === rpcErrorCodes.provider.unauthorized
) {
return [];
}
throw error;
@ -3375,17 +3456,6 @@ export default class MetamaskController extends EventEmitter {
}
///: BEGIN:ONLY_INCLUDE_IN(flask)
/**
* For snaps running in workers.
*
* @param snapId
* @param error
*/
onExecutionEnvironmentError(snapId, error) {
this.snapController.stopPlugin(snapId);
this.snapController.addSnapError(error);
}
/**
* For snaps running in workers.
*
@ -4150,23 +4220,4 @@ export default class MetamaskController extends EventEmitter {
return this.keyringController.setLocked();
}
///: BEGIN:ONLY_INCLUDE_IN(flask)
// SNAPS
/**
* Removes the specified snap, and all of its associated permissions.
* If we didn't revoke the permission to access the snap from all subjects,
* they could just reinstall without any confirmation.
*
* TODO: This should be implemented in `SnapController.removeSnap` via a controller action.
*
* @param {{ id: string, permissionName: string }} snap - The wrapper object of the snap to remove.
*/
removeSnap(snap) {
this.snapController.removeSnap(snap.id);
this.permissionController.revokePermissionForAllSubjects(
snap.permissionName,
);
}
///: END:ONLY_INCLUDE_IN
}

@ -18,6 +18,8 @@ import { addHexPrefix } from './lib/util';
const Ganache = require('../../test/e2e/ganache');
const NOTIFICATION_ID = 'NHL8f2eSSTn9TKBamRLiU';
const firstTimeState = {
config: {},
NetworkController: {
@ -32,6 +34,17 @@ const firstTimeState = {
},
},
},
NotificationController: {
notifications: {
[NOTIFICATION_ID]: {
id: NOTIFICATION_ID,
origin: 'local:http://localhost:8086/',
createdDate: 1652967897732,
readDate: null,
message: 'Hello, http://localhost:8086!',
},
},
},
};
const ganacheServer = new Ganache();
@ -1233,6 +1246,27 @@ describe('MetaMaskController', function () {
assert.deepEqual(metamaskController.getState(), oldState);
});
});
describe('markNotificationsAsRead', function () {
it('marks the notification as read', function () {
metamaskController.markNotificationsAsRead([NOTIFICATION_ID]);
const readNotification = metamaskController.getState().notifications[
NOTIFICATION_ID
];
assert.notEqual(readNotification.readDate, null);
});
});
describe('dismissNotifications', function () {
it('deletes the notification from state', function () {
metamaskController.dismissNotifications([NOTIFICATION_ID]);
const state = metamaskController.getState().notifications;
assert.ok(
!Object.values(state).includes(NOTIFICATION_ID),
'Object should not include the deleted notification',
);
});
});
});
function deferredPromise() {

@ -0,0 +1,30 @@
import { cloneDeep } from 'lodash';
const version = 72;
/**
* Should empty the `knownMethodData` object in PreferencesController
*/
export default {
version,
async migrate(originalVersionedData) {
const versionedData = cloneDeep(originalVersionedData);
versionedData.meta.version = version;
const state = versionedData.data;
const newState = transformState(state);
versionedData.data = newState;
return versionedData;
},
};
function transformState(state) {
const PreferencesController = state?.PreferencesController || {};
return {
...state,
PreferencesController: {
...PreferencesController,
knownMethodData: {},
},
};
}

@ -0,0 +1,427 @@
import migration72 from './072';
describe('migration #72', () => {
it('should update the version metadata', async () => {
const oldStorage = {
meta: {
version: 71,
},
data: {},
};
const newStorage = await migration72.migrate(oldStorage);
expect(newStorage.meta).toStrictEqual({
version: 72,
});
});
it('should empty knownMethodData object in PreferencesController', async () => {
const oldStorage = {
meta: {
version: 71,
},
data: {
PreferencesController: {
knownMethodData: {
'0x095ea7b3': {
name: 'Approve',
params: [
{
type: 'address',
},
{
type: 'uint256',
},
],
},
'0x1249c58b': {
name: 'Mint',
params: [],
},
'0x1688f0b9': {
name: 'Create Proxy With Nonce',
params: [
{
type: 'address',
},
{
type: 'bytes',
},
{
type: 'uint256',
},
],
},
'0x18cbafe5': {
name: 'Swap Exact Tokens For E T H',
params: [
{
type: 'uint256',
},
{
type: 'uint256',
},
{
type: 'address[]',
},
{
type: 'address',
},
{
type: 'uint256',
},
],
},
'0x23b872dd': {
name: 'Transfer From',
params: [
{
type: 'address',
},
{
type: 'address',
},
{
type: 'uint256',
},
],
},
'0x2e1a7d4d': {
name: 'Withdraw',
params: [
{
type: 'uint256',
},
],
},
'0x2e7ba6ef': {
name: 'Claim',
params: [
{
type: 'uint256',
},
{
type: 'address',
},
{
type: 'uint256',
},
{
type: 'bytes32[]',
},
],
},
'0x2eb2c2d6': {
name: 'Safe Batch Transfer From',
params: [
{
type: 'address',
},
{
type: 'address',
},
{
type: 'uint256[]',
},
{
type: 'uint256[]',
},
{
type: 'bytes',
},
],
},
'0x3671f8cf': {},
'0x41441d3b': {
name: 'Enter Staking',
params: [
{
type: 'uint256',
},
],
},
'0x441a3e70': {
name: 'Withdraw',
params: [
{
type: 'uint256',
},
{
type: 'uint256',
},
],
},
'0x6f652e1a': {
name: 'Create Order',
params: [
{
type: 'address',
},
{
type: 'uint256',
},
{
type: 'uint256',
},
{
type: 'uint256',
},
],
},
'0x8dbdbe6d': {
name: 'Deposit',
params: [
{
type: 'uint256',
},
{
type: 'uint256',
},
{
type: 'address',
},
],
},
'0x8ed955b9': {
name: 'Harvest All',
params: [],
},
'0xa22cb465': {
name: 'Set Approval For All',
params: [
{
type: 'address',
},
{
type: 'bool',
},
],
},
'0xa9059cbb': {
name: 'Transfer',
params: [
{
type: 'address',
},
{
type: 'uint256',
},
],
},
'0xab834bab': {
name: 'Atomic Match_',
params: [
{
type: 'address[14]',
},
{
type: 'uint256[18]',
},
{
type: 'uint8[8]',
},
{
type: 'bytes',
},
{
type: 'bytes',
},
{
type: 'bytes',
},
{
type: 'bytes',
},
{
type: 'bytes',
},
{
type: 'bytes',
},
{
type: 'uint8[2]',
},
{
type: 'bytes32[5]',
},
],
},
'0xd0e30db0': {
name: 'Deposit',
params: [],
},
'0xddd81f82': {
name: 'Register Proxy',
params: [],
},
'0xded9382a': {
name: 'Remove Liquidity E T H With Permit',
params: [
{
type: 'address',
},
{
type: 'uint256',
},
{
type: 'uint256',
},
{
type: 'uint256',
},
{
type: 'address',
},
{
type: 'uint256',
},
{
type: 'bool',
},
{
type: 'uint8',
},
{
type: 'bytes32',
},
{
type: 'bytes32',
},
],
},
'0xe2bbb158': {
name: 'Deposit',
params: [
{
type: 'uint256',
},
{
type: 'uint256',
},
],
},
'0xf305d719': {
name: 'Add Liquidity E T H',
params: [
{
type: 'address',
},
{
type: 'uint256',
},
{
type: 'uint256',
},
{
type: 'uint256',
},
{
type: 'address',
},
{
type: 'uint256',
},
],
},
},
},
},
};
const newStorage = await migration72.migrate(oldStorage);
expect(newStorage).toStrictEqual({
meta: {
version: 72,
},
data: {
PreferencesController: {
knownMethodData: {},
},
},
});
});
it('should preserve other PreferencesController state', async () => {
const oldStorage = {
meta: {
version: 71,
},
data: {
PreferencesController: {
currentLocale: 'en',
dismissSeedBackUpReminder: false,
ipfsGateway: 'dweb.link',
knownMethodData: {
'0xd0e30db0': {
name: 'Deposit',
params: [],
},
'0xddd81f82': {
name: 'Register Proxy',
params: [],
},
},
openSeaEnabled: false,
useTokenDetection: false,
},
},
};
const newStorage = await migration72.migrate(oldStorage);
expect(newStorage).toStrictEqual({
meta: {
version: 72,
},
data: {
PreferencesController: {
currentLocale: 'en',
dismissSeedBackUpReminder: false,
ipfsGateway: 'dweb.link',
knownMethodData: {},
openSeaEnabled: false,
useTokenDetection: false,
},
},
});
});
it('should not change state in controllers other than PreferencesController', async () => {
const oldStorage = {
meta: {
version: 71,
},
data: {
PreferencesController: {
knownMethodData: {
'0xd0e30db0': {
name: 'Deposit',
params: [],
},
'0xddd81f82': {
name: 'Register Proxy',
params: [],
},
},
},
data: {
FooController: { a: 'b' },
},
},
};
const newStorage = await migration72.migrate(oldStorage);
expect(newStorage).toStrictEqual({
meta: {
version: 72,
},
data: {
PreferencesController: {
knownMethodData: {},
},
data: {
FooController: { a: 'b' },
},
},
});
});
});

@ -75,6 +75,7 @@ import m068 from './068';
import m069 from './069';
import m070 from './070';
import m071 from './071';
import m072 from './072';
const migrations = [
m002,
@ -147,6 +148,7 @@ const migrations = [
m069,
m070,
m071,
m072,
];
export default migrations;

@ -90,13 +90,17 @@ export default class ExtensionPlatform {
if (versionParts.length < 4) {
throw new Error(`Version missing build number: '${version}'`);
}
// On Chrome, a more descriptive representation of the version is stored
// in the `version_name` field for display purposes.
// On Chrome, a more descriptive representation of the version is stored in the
// `version_name` field for display purposes. We use this field instead of the `version`
// field on Chrome for non-main builds (i.e. Flask, Beta) because we want to show the
// version in the SemVer-compliant format "v[major].[minor].[patch]-[build-type].[build-number]",
// yet Chrome does not allow letters in the `version` field.
return versionName;
} else if (versionParts.length !== 3) {
// A fourth version part is sometimes present for "rollback" Chrome builds
} else if (![3, 4].includes(versionParts.length)) {
throw new Error(`Invalid version: ${version}`);
} else if (versionParts[2].match(/[^\d]/u)) {
// On Firefox, the build type and build version are in the fourth part of the version.
// On Firefox, the build type and build version are in the third part of the version.
const [major, minor, patchAndPrerelease] = versionParts;
const matches = patchAndPrerelease.match(/^(\d+)([A-Za-z]+)(\d)+$/u);
if (matches === null) {
@ -106,7 +110,7 @@ export default class ExtensionPlatform {
return `${major}.${minor}.${patch}-${buildType}.${buildVersion}`;
}
// If there is no `version_name` and there are only 3 version parts, then this is not a
// If there is no `version_name` and there are only 3 or 4 version parts, then this is not a
// prerelease and the version requires no modification.
return version;
}

@ -25,6 +25,15 @@ describe('extension platform', () => {
expect(version).toBe('1.2.3');
});
it('should return rollback version', () => {
browser.runtime.getManifest.mockReturnValue({ version: '1.2.3.1' });
const extensionPlatform = new ExtensionPlatform();
const version = extensionPlatform.getVersion();
expect(version).toBe('1.2.3.1');
});
it('should return SemVer-formatted version for Chrome style manifest of prerelease', () => {
browser.runtime.getManifest.mockReturnValue({
version: '1.2.3.0',
@ -60,24 +69,6 @@ describe('extension platform', () => {
);
});
it('should throw error if version name is missing from Chrome style prerelease manifest', () => {
browser.runtime.getManifest.mockReturnValue({
version: '1.2.3.0',
});
const extensionPlatform = new ExtensionPlatform();
expect(() => extensionPlatform.getVersion()).toThrow('Invalid version:');
});
it('should throw error if version includes four parts in a Firefox style manifest', () => {
browser.runtime.getManifest.mockReturnValue({
version: '1.2.3.4',
});
const extensionPlatform = new ExtensionPlatform();
expect(() => extensionPlatform.getVersion()).toThrow('Invalid version:');
});
it('should throw error if build version is missing from Firefox style prerelease manifest', () => {
browser.runtime.getManifest.mockReturnValue({
version: '1.2.3beta',

@ -16,6 +16,9 @@ import {
ENVIRONMENT_TYPE_FULLSCREEN,
ENVIRONMENT_TYPE_POPUP,
} from '../../shared/constants/app';
import { isManifestV3 } from '../../shared/modules/mv3.utils';
import { SUPPORT_LINK } from '../../ui/helpers/constants/common';
import { getErrorHtml } from '../../ui/helpers/utils/error-utils';
import ExtensionPlatform from './platforms/extension';
import { setupMultiplex } from './lib/stream-utils';
import { getEnvironmentType } from './lib/util';
@ -24,6 +27,21 @@ import metaRPCClientFactory from './lib/metaRPCClientFactory';
start().catch(log.error);
async function start() {
async function displayCriticalError(container, err, metamaskState) {
const html = await getErrorHtml(SUPPORT_LINK, metamaskState);
container.innerHTML = html;
const button = document.getElementById('critical-error-button');
button.addEventListener('click', (_) => {
browser.runtime.reload();
});
log.error(err.stack);
throw err;
}
// create platform global
global.platform = new ExtensionPlatform();
@ -32,24 +50,31 @@ async function start() {
// setup stream to background
const extensionPort = browser.runtime.connect({ name: windowType });
const connectionStream = new PortStream(extensionPort);
const activeTab = await queryCurrentActiveTab(windowType);
initializeUiWithTab(activeTab);
function displayCriticalError(container, err) {
container.innerHTML =
'<div class="critical-error">The MetaMask app failed to load: please open and close MetaMask again to restart.</div>';
container.style.height = '80px';
log.error(err.stack);
throw err;
/**
* In case of MV3 the issue of blank screen was very frequent, it is caused by UI initialising before background is ready to send state.
* Code below ensures that UI is rendered only after background is ready.
*/
if (isManifestV3()) {
extensionPort.onMessage.addListener((message) => {
if (message?.name === 'CONNECTION_READY') {
initializeUiWithTab(activeTab);
}
});
} else {
initializeUiWithTab(activeTab);
}
function initializeUiWithTab(tab) {
const container = document.getElementById('app-content');
initializeUi(tab, container, connectionStream, (err, store) => {
if (err) {
displayCriticalError(container, err);
// if there's an error, store will be = metamaskState
displayCriticalError(container, err, store);
return;
}
@ -90,7 +115,7 @@ async function queryCurrentActiveTab(windowType) {
function initializeUi(activeTab, container, connectionStream, cb) {
connectToAccountManager(connectionStream, (err, backgroundConnection) => {
if (err) {
cb(err);
cb(err, null);
return;
}

@ -2,7 +2,9 @@ const { promises: fs } = require('fs');
const path = require('path');
const { mergeWith, cloneDeep } = require('lodash');
const baseManifest = require('../../app/manifest/_base.json');
const baseManifest = process.env.ENABLE_MV3
? require('../../app/manifest/v3/_base.json')
: require('../../app/manifest/v2/_base.json');
const { BuildType } = require('../lib/build-type');
const { createTask, composeSeries } = require('./task');
@ -24,7 +26,7 @@ function createManifestTasks({
'..',
'..',
'app',
'manifest',
process.env.ENABLE_MV3 ? 'manifest/v3' : 'manifest/v2',
`${platform}.json`,
),
);

@ -365,6 +365,50 @@ function createScriptTasks({
}
}
// Function generates app-init.js for browsers chrome, brave and opera.
// It dynamically injects list of files generated in the build.
async function bundleMV3AppInitialiser({
jsBundles,
browserPlatforms,
buildType,
devMode,
ignoredFiles,
testing,
policyOnly,
shouldLintFenceFiles,
}) {
const label = 'app-init';
// TODO: remove this filter for firefox once MV3 is supported in it
const mv3BrowserPlatforms = browserPlatforms.filter(
(platform) => platform !== 'firefox',
);
const fileList = jsBundles.reduce(
(result, file) => `${result}'${file}',\n `,
'',
);
await createNormalBundle({
browserPlatforms: mv3BrowserPlatforms,
buildType,
destFilepath: 'app-init.js',
devMode,
entryFilepath: './app/scripts/app-init.js',
ignoredFiles,
label,
testing,
policyOnly,
shouldLintFenceFiles,
})();
mv3BrowserPlatforms.forEach((browser) => {
const appInitFile = `./dist/${browser}/app-init.js`;
const fileContent = readFileSync('./app/scripts/app-init.js', 'utf8');
const fileOutput = fileContent.replace('/** FILE NAMES */', fileList);
writeFileSync(appInitFile, fileOutput);
});
console.log(`Bundle end: service worker app-init.js`);
}
function createFactoredBuild({
applyLavaMoat,
browserPlatforms,
@ -477,7 +521,7 @@ function createFactoredBuild({
});
// wait for bundle completion for postprocessing
events.on('bundleDone', () => {
events.on('bundleDone', async () => {
// Skip HTML generation if nothing is to be written to disk
if (policyOnly) {
return;
@ -523,6 +567,22 @@ function createFactoredBuild({
browserPlatforms,
applyLavaMoat,
});
if (process.env.ENABLE_MV3) {
const jsBundles = [
...commonSet.values(),
...groupSet.values(),
].map((label) => `./${label}.js`);
await bundleMV3AppInitialiser({
jsBundles,
browserPlatforms,
buildType,
devMode,
ignoredFiles,
testing,
policyOnly,
shouldLintFenceFiles,
});
}
break;
}
case 'content-script': {

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

@ -1,6 +1,6 @@
# Using the TREZOR simulator
You can install the TREZOR emulator and use it with Metamask.
You can install the TREZOR emulator and use it with MetaMask.
Here is how:
## 1 - Install the TREZOR Bridge

@ -6,13 +6,13 @@ module.exports = {
],
coverageDirectory: './jest-coverage/main',
coveragePathIgnorePatterns: ['.stories.js', '.snap'],
coverageReporters: ['html', 'text-summary'],
coverageReporters: ['html', 'text-summary', 'json-summary'],
coverageThreshold: {
global: {
branches: 35,
functions: 37,
lines: 43,
statements: 43,
branches: 44,
functions: 42,
lines: 52,
statements: 52,
},
'./app/scripts/controllers/permissions/**/*.js': {
branches: 100,

@ -921,7 +921,7 @@
"3box>ipfs>async": true,
"3box>ipfs>bs58": true,
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>multihashing-async": true,
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>secp256k1": true
"eth-trezor-keyring>hdkey>secp256k1": true
}
},
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>multihashing-async": {
@ -939,15 +939,6 @@
"ethers>@ethersproject/keccak256>js-sha3": true
}
},
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>secp256k1": {
"packages": {
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"eth-sig-util>ethereumjs-util>secp256k1>drbg.js": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"3box>ipfs>libp2p-crypto>multihashing-async": {
"globals": {
"crypto": true,
@ -2073,8 +2064,8 @@
"3box>ipfs>libp2p-crypto": true,
"3box>orbit-db>orbit-db-cache>level-js": true,
"3box>orbit-db>orbit-db-keystore>levelup": true,
"3box>orbit-db>orbit-db-keystore>libp2p-crypto-secp256k1>secp256k1": true,
"3box>orbit-db>orbit-db-keystore>lru": true,
"eth-trezor-keyring>hdkey>secp256k1": true,
"ethereumjs-wallet>safe-buffer": true
}
},
@ -2119,16 +2110,6 @@
"pumpify>inherits": true
}
},
"3box>orbit-db>orbit-db-keystore>libp2p-crypto-secp256k1>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"3box>orbit-db>orbit-db-keystore>lru": {
"packages": {
"browserify>events": true,
@ -2221,7 +2202,7 @@
},
"@babel/runtime": {
"packages": {
"addons-linter>regenerator-runtime": true
"@storybook/api>regenerator-runtime": true
}
},
"@download/blockies": {
@ -2397,11 +2378,16 @@
},
"@keystonehq/bc-ur-registry-eth>hdkey": {
"packages": {
"@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": true,
"browserify>assert": true,
"browserify>crypto-browserify": true,
"ethereumjs-wallet>bs58check": true,
"ethereumjs-wallet>safe-buffer": true,
"ganache>secp256k1": true
"ethereumjs-wallet>safe-buffer": true
}
},
"@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"@keystonehq/metamask-airgapped-keyring": {
@ -2942,12 +2928,13 @@
},
"@metamask/controllers>web3-provider-engine>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": true,
"@metamask/controllers>web3-provider-engine>ethereumjs-util>keccak": true,
"@metamask/controllers>web3-provider-engine>ethereumjs-util>secp256k1": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -2959,23 +2946,6 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"@metamask/controllers>web3-provider-engine>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"@metamask/controllers>web3-provider-engine>ethereumjs-util>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"@metamask/controllers>web3-provider-engine>semaphore": {
"globals": {
"define": true,
@ -3014,12 +2984,13 @@
},
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>ethjs-util": true,
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>keccak": true,
"@metamask/eth-ledger-bridge-keyring>hdkey>secp256k1": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -3031,29 +3002,12 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"@metamask/eth-ledger-bridge-keyring>hdkey": {
"packages": {
"@metamask/eth-ledger-bridge-keyring>hdkey>secp256k1": true,
"browserify>assert": true,
"browserify>crypto-browserify": true,
"eth-trezor-keyring>hdkey>coinstring": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"@metamask/eth-ledger-bridge-keyring>hdkey>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"eth-trezor-keyring>hdkey>secp256k1": true,
"ethereumjs-wallet>safe-buffer": true
}
},
@ -3150,11 +3104,6 @@
"URL": true
}
},
"@metamask/iframe-execution-environment-service>nanoid": {
"globals": {
"crypto.getRandomValues": true
}
},
"@metamask/jazzicon": {
"globals": {
"document.createElement": true,
@ -3270,179 +3219,77 @@
"packages": {
"@metamask/controllers": true,
"@metamask/rpc-methods>@metamask/key-tree": true,
"@metamask/rpc-methods>@metamask/utils": true,
"@metamask/snap-controllers": true,
"eth-rpc-errors": true
}
},
"@metamask/rpc-methods>@metamask/key-tree": {
"packages": {
"@metamask/rpc-methods>@metamask/key-tree>bip39": true,
"browserify>buffer": true,
"browserify>crypto-browserify": true,
"browserify>insert-module-globals>is-buffer": true,
"ethereumjs-util>ethereum-cryptography>keccak": true,
"ganache>secp256k1": true
}
},
"@metamask/rpc-methods>@metamask/key-tree>bip39": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>pbkdf2": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>randombytes": true
"@metamask/rpc-methods>@metamask/key-tree>@noble/ed25519": true,
"@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": true,
"@metamask/rpc-methods>@metamask/key-tree>@noble/secp256k1": true,
"@metamask/rpc-methods>@metamask/key-tree>@scure/base": true,
"@metamask/rpc-methods>@metamask/key-tree>@scure/bip39": true,
"browserify>buffer": true
}
},
"@metamask/smart-transactions-controller": {
"@metamask/rpc-methods>@metamask/key-tree>@noble/ed25519": {
"globals": {
"URLSearchParams": true,
"clearInterval": true,
"console.error": true,
"console.log": true,
"fetch": true,
"setInterval": true,
"setTimeout": true
"crypto": true
},
"packages": {
"@metamask/controllers>isomorphic-fetch": true,
"@metamask/smart-transactions-controller>@metamask/controllers": true,
"@metamask/smart-transactions-controller>bignumber.js": true,
"@metamask/smart-transactions-controller>fast-json-patch": true,
"ethers": true,
"lodash": true
"browserify>browser-resolve": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers": {
"@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": {
"globals": {
"Headers": true,
"URL": true,
"clearInterval": true,
"clearTimeout": true,
"console.error": true,
"console.log": true,
"fetch": true,
"setInterval": true,
"TextEncoder": true,
"crypto": true,
"setTimeout": true
},
"packages": {
"@ethereumjs/common": true,
"@ethereumjs/tx": true,
"@metamask/contract-metadata": true,
"@metamask/controllers>abort-controller": true,
"@metamask/controllers>async-mutex": true,
"@metamask/controllers>eth-phishing-detect": true,
"@metamask/controllers>isomorphic-fetch": true,
"@metamask/controllers>multiformats": true,
"@metamask/controllers>web3-provider-engine": true,
"@metamask/metamask-eth-abis": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": true,
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": true,
"@metamask/smart-transactions-controller>@metamask/controllers>nanoid": true,
"@storybook/api>fast-deep-equal": true,
"browserify>buffer": true,
"browserify>events": true,
"deep-freeze-strict": true,
"eth-ens-namehash": true,
"eth-json-rpc-infura": true,
"eth-keyring-controller": true,
"eth-query": true,
"eth-rpc-errors": true,
"eth-sig-util": true,
"ethereumjs-util": true,
"ethers": true,
"ethjs>ethjs-unit": true,
"immer": true,
"json-rpc-engine": true,
"jsonschema": true,
"punycode": true,
"single-call-balance-checker-abi": true,
"uuid": true,
"web3": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": {
"@metamask/rpc-methods>@metamask/key-tree>@noble/secp256k1": {
"globals": {
"clearInterval": true,
"setInterval": true
"crypto": true
},
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"browserify>buffer": true,
"ethjs>ethjs-filter": true,
"ethjs>ethjs-provider-http": true,
"ethjs>ethjs-unit": true,
"ethjs>ethjs-util": true,
"ethjs>number-to-bn": true
"browserify>browser-resolve": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"browserify>buffer": true,
"ethjs>number-to-bn": true
"@metamask/rpc-methods>@metamask/key-tree>@scure/base": {
"globals": {
"TextDecoder": true,
"TextEncoder": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": {
"@metamask/rpc-methods>@metamask/key-tree>@scure/bip39": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"ethjs-query>babel-runtime": true,
"ethjs>ethjs-filter": true,
"ethjs>ethjs-util": true,
"promise-to-callback": true
"@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": true,
"@metamask/rpc-methods>@metamask/key-tree>@scure/base": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": {
"@metamask/rpc-methods>@metamask/utils": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"browserify>buffer": true,
"ethjs>number-to-bn": true
"@storybook/api>fast-deep-equal": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": {
"@metamask/smart-transactions-controller": {
"globals": {
"console": true
},
"packages": {
"ethjs-query>babel-runtime": true,
"ethjs-query>ethjs-format": true,
"ethjs-query>ethjs-rpc": true,
"promise-to-callback": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": {
"packages": {
"browserify>process": true
}
"URLSearchParams": true,
"clearInterval": true,
"console.error": true,
"console.log": true,
"fetch": true,
"setInterval": true
},
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": true,
"@truffle/codec>utf8": true,
"browserify>buffer": true,
"browserify>crypto-browserify": true,
"ethereumjs-util": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-wallet>aes-js": true,
"ethereumjs-wallet>bs58check": true,
"ethereumjs-wallet>randombytes": true,
"ethers>@ethersproject/json-wallets>scrypt-js": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": {
"globals": {
"crypto": true,
"msCrypto": true
"@metamask/controllers": true,
"@metamask/controllers>isomorphic-fetch": true,
"@metamask/smart-transactions-controller>bignumber.js": true,
"@metamask/smart-transactions-controller>fast-json-patch": true,
"ethers": true,
"lodash": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>nanoid": {
@ -3473,6 +3320,9 @@
"console.info": true,
"console.log": true,
"console.warn": true,
"document.body.appendChild": true,
"document.createElement": true,
"document.getElementById": true,
"fetch": true,
"setTimeout": true
},
@ -3480,6 +3330,7 @@
"@metamask/controllers": true,
"@metamask/post-message-stream": true,
"@metamask/providers>@metamask/object-multiplex": true,
"@metamask/rpc-methods>@metamask/utils": true,
"@metamask/snap-controllers>@metamask/execution-environments": true,
"@metamask/snap-controllers>@metamask/obs-store": true,
"@metamask/snap-controllers>ajv": true,
@ -3687,7 +3538,7 @@
"@ngraveio/bc-ur>bignumber.js": true,
"@ngraveio/bc-ur>crc": true,
"@ngraveio/bc-ur>jsbi": true,
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"pubnub>cbor-sync": true
@ -3709,12 +3560,6 @@
"define": true
}
},
"@ngraveio/bc-ur>sha.js": {
"packages": {
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"@popperjs/core": {
"globals": {
"Element": true,
@ -3825,6 +3670,11 @@
"localforage": true
}
},
"@storybook/api>regenerator-runtime": {
"globals": {
"regeneratorRuntime": "write"
}
},
"@storybook/api>util-deprecate": {
"globals": {
"console.trace": true,
@ -4144,9 +3994,10 @@
"setTimeout": true
}
},
"addons-linter>regenerator-runtime": {
"globals": {
"regeneratorRuntime": "write"
"addons-linter>sha.js": {
"packages": {
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"analytics-node": {
@ -4337,7 +4188,7 @@
},
"browserify>crypto-browserify>create-hmac": {
"packages": {
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>create-hash>cipher-base": true,
"ethereumjs-util>create-hash>ripemd160": true,
@ -4362,10 +4213,13 @@
"browserify>crypto-browserify>pbkdf2": {
"globals": {
"crypto": true,
"process": true
"process": true,
"queueMicrotask": true,
"setImmediate": true,
"setTimeout": true
},
"packages": {
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"browserify>process": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>create-hash>ripemd160": true,
@ -4495,12 +4349,7 @@
},
"browserify>string_decoder": {
"packages": {
"browserify>string_decoder>safe-buffer": true
}
},
"browserify>string_decoder>safe-buffer": {
"packages": {
"browserify>buffer": true
"ethereumjs-wallet>safe-buffer": true
}
},
"browserify>timers-browserify": {
@ -4800,12 +4649,13 @@
},
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true,
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>keccak": true,
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>secp256k1": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -4817,84 +4667,41 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-keyring-controller": {
"packages": {
"browserify>buffer": true,
"browserify>events": true,
"eth-keyring-controller>bip39": true,
"eth-keyring-controller>@metamask/bip39": true,
"eth-keyring-controller>@metamask/eth-hd-keyring": true,
"eth-keyring-controller>browser-passworder": true,
"eth-keyring-controller>eth-hd-keyring": true,
"eth-keyring-controller>eth-simple-keyring": true,
"eth-keyring-controller>obs-store": true,
"eth-sig-util": true,
"ethereumjs-util": true,
"loglevel": true
"eth-sig-util": true
}
},
"eth-keyring-controller>bip39": {
"globals": {
"console.log": true
},
"eth-keyring-controller>@metamask/bip39": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>pbkdf2": true,
"eth-keyring-controller>bip39>unorm": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>randombytes": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-keyring-controller>bip39>unorm": {
"globals": {
"define": true
}
},
"eth-keyring-controller>browser-passworder": {
"globals": {
"btoa": true,
"crypto": true
},
"packages": {
"eth-keyring-controller>browser-passworder>browserify-unibabel": true
}
},
"eth-keyring-controller>browser-passworder>browserify-unibabel": {
"globals": {
"atob": true,
"btoa": true
"ethereumjs-wallet>randombytes": true
}
},
"eth-keyring-controller>eth-hd-keyring": {
"eth-keyring-controller>@metamask/eth-hd-keyring": {
"packages": {
"browserify>buffer": true,
"eth-keyring-controller>bip39": true,
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet": true,
"eth-keyring-controller>@metamask/bip39": true,
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet": true,
"eth-keyring-controller>eth-simple-keyring": true,
"eth-sig-util": true
"eth-trezor-keyring>@metamask/eth-sig-util": true
}
},
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet": {
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet": {
"packages": {
"@truffle/codec>utf8": true,
"browserify>buffer": true,
"browserify>crypto-browserify": true,
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet>uuid": true,
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet>uuid": true,
"ethereumjs-util": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-wallet>aes-js": true,
@ -4903,12 +4710,27 @@
"ethers>@ethersproject/json-wallets>scrypt-js": true
}
},
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet>uuid": {
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet>uuid": {
"globals": {
"crypto": true,
"msCrypto": true
}
},
"eth-keyring-controller>browser-passworder": {
"globals": {
"btoa": true,
"crypto": true
},
"packages": {
"eth-keyring-controller>browser-passworder>browserify-unibabel": true
}
},
"eth-keyring-controller>browser-passworder>browserify-unibabel": {
"globals": {
"atob": true,
"btoa": true
}
},
"eth-keyring-controller>eth-simple-keyring": {
"packages": {
"browserify>buffer": true,
@ -4964,8 +4786,8 @@
"eth-lattice-keyring>bn.js": true,
"eth-lattice-keyring>gridplus-sdk": true,
"eth-lattice-keyring>rlp": true,
"ethereumjs-util": true,
"ganache>secp256k1": true
"eth-lattice-keyring>secp256k1": true,
"ethereumjs-util": true
}
},
"eth-lattice-keyring>bn.js": {
@ -4994,11 +4816,11 @@
"eth-lattice-keyring>gridplus-sdk>borc": true,
"eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": true,
"eth-lattice-keyring>gridplus-sdk>rlp": true,
"eth-lattice-keyring>gridplus-sdk>secp256k1": true,
"ethereumjs-wallet>aes-js": true,
"ethereumjs-wallet>bs58check": true,
"ethers>@ethersproject/keccak256>js-sha3": true,
"ethers>@ethersproject/sha2>hash.js": true,
"ganache>secp256k1": true,
"lodash": true,
"pubnub>superagent": true
}
@ -5063,11 +4885,21 @@
"TextEncoder": true
}
},
"eth-lattice-keyring>gridplus-sdk>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"eth-lattice-keyring>rlp": {
"globals": {
"TextEncoder": true
}
},
"eth-lattice-keyring>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"eth-method-registry": {
"packages": {
"ethjs": true
@ -5095,12 +4927,13 @@
},
"eth-sig-util>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"eth-sig-util>ethereumjs-util>ethjs-util": true,
"eth-sig-util>ethereumjs-util>keccak": true,
"eth-sig-util>ethereumjs-util>secp256k1": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -5112,34 +4945,6 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"eth-sig-util>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"eth-sig-util>ethereumjs-util>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-sig-util>ethereumjs-util>secp256k1>bip66": {
"packages": {
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-sig-util>ethereumjs-util>secp256k1>drbg.js": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>create-hmac": true
}
},
"eth-trezor-keyring": {
"globals": {
"setTimeout": true
@ -5203,11 +5008,23 @@
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"eth-trezor-keyring>hdkey>secp256k1>bip66": true,
"eth-trezor-keyring>hdkey>secp256k1>drbg.js": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-trezor-keyring>hdkey>secp256k1>bip66": {
"packages": {
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-trezor-keyring>hdkey>secp256k1>drbg.js": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>create-hmac": true
}
},
"eth-trezor-keyring>trezor-connect": {
"globals": {
"__TREZOR_CONNECT_SRC": true,
@ -5284,7 +5101,7 @@
},
"ethereumjs-util>create-hash": {
"packages": {
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"ethereumjs-util>create-hash>cipher-base": true,
"ethereumjs-util>create-hash>md5.js": true,
"ethereumjs-util>create-hash>ripemd160": true,
@ -5308,11 +5125,22 @@
},
"ethereumjs-util>create-hash>md5.js>hash-base": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-util>create-hash>md5.js>hash-base>readable-stream": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"ethereumjs-util>create-hash>md5.js>hash-base>readable-stream": {
"packages": {
"@storybook/api>util-deprecate": true,
"browserify>browser-resolve": true,
"browserify>buffer": true,
"browserify>events": true,
"browserify>process": true,
"browserify>string_decoder": true,
"pumpify>inherits": true
}
},
"ethereumjs-util>create-hash>ripemd160": {
"packages": {
"browserify>buffer": true,
@ -5326,19 +5154,17 @@
"browserify>buffer": true,
"browserify>crypto-browserify>create-hmac": true,
"ethereumjs-util>ethereum-cryptography>keccak": true,
"ethereumjs-util>ethereum-cryptography>secp256k1": true,
"ethereumjs-wallet>bs58check": true,
"ethereumjs-wallet>randombytes": true,
"ethereumjs-wallet>safe-buffer": true,
"ethers>@ethersproject/sha2>hash.js": true,
"ganache>secp256k1": true
"ethers>@ethersproject/sha2>hash.js": true
}
},
"ethereumjs-util>ethereum-cryptography>blakejs": {
"globals": {
"TextEncoder": true,
"console.log": true
},
"packages": {
"browserify>buffer": true
}
},
"ethereumjs-util>ethereum-cryptography>browserify-aes": {
@ -5373,6 +5199,11 @@
"pumpify>inherits": true
}
},
"ethereumjs-util>ethereum-cryptography>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"ethereumjs-util>ethjs-util": {
"packages": {
"browserify>buffer": true,
@ -5947,7 +5778,7 @@
"ethjs-query>babel-runtime": {
"packages": {
"@babel/runtime": true,
"addons-linter>regenerator-runtime": true,
"@storybook/api>regenerator-runtime": true,
"ethjs-query>babel-runtime>core-js": true
}
},
@ -6050,11 +5881,6 @@
"define": true
}
},
"ganache>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"globalthis>define-properties": {
"packages": {
"nock>deep-equal>object-keys": true

@ -921,7 +921,7 @@
"3box>ipfs>async": true,
"3box>ipfs>bs58": true,
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>multihashing-async": true,
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>secp256k1": true
"eth-trezor-keyring>hdkey>secp256k1": true
}
},
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>multihashing-async": {
@ -939,15 +939,6 @@
"ethers>@ethersproject/keccak256>js-sha3": true
}
},
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>secp256k1": {
"packages": {
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"eth-sig-util>ethereumjs-util>secp256k1>drbg.js": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"3box>ipfs>libp2p-crypto>multihashing-async": {
"globals": {
"crypto": true,
@ -2073,8 +2064,8 @@
"3box>ipfs>libp2p-crypto": true,
"3box>orbit-db>orbit-db-cache>level-js": true,
"3box>orbit-db>orbit-db-keystore>levelup": true,
"3box>orbit-db>orbit-db-keystore>libp2p-crypto-secp256k1>secp256k1": true,
"3box>orbit-db>orbit-db-keystore>lru": true,
"eth-trezor-keyring>hdkey>secp256k1": true,
"ethereumjs-wallet>safe-buffer": true
}
},
@ -2119,16 +2110,6 @@
"pumpify>inherits": true
}
},
"3box>orbit-db>orbit-db-keystore>libp2p-crypto-secp256k1>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"3box>orbit-db>orbit-db-keystore>lru": {
"packages": {
"browserify>events": true,
@ -2221,7 +2202,7 @@
},
"@babel/runtime": {
"packages": {
"addons-linter>regenerator-runtime": true
"@storybook/api>regenerator-runtime": true
}
},
"@download/blockies": {
@ -2397,11 +2378,16 @@
},
"@keystonehq/bc-ur-registry-eth>hdkey": {
"packages": {
"@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": true,
"browserify>assert": true,
"browserify>crypto-browserify": true,
"ethereumjs-wallet>bs58check": true,
"ethereumjs-wallet>safe-buffer": true,
"ganache>secp256k1": true
"ethereumjs-wallet>safe-buffer": true
}
},
"@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"@keystonehq/metamask-airgapped-keyring": {
@ -2942,12 +2928,13 @@
},
"@metamask/controllers>web3-provider-engine>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": true,
"@metamask/controllers>web3-provider-engine>ethereumjs-util>keccak": true,
"@metamask/controllers>web3-provider-engine>ethereumjs-util>secp256k1": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -2959,23 +2946,6 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"@metamask/controllers>web3-provider-engine>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"@metamask/controllers>web3-provider-engine>ethereumjs-util>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"@metamask/controllers>web3-provider-engine>semaphore": {
"globals": {
"define": true,
@ -3014,12 +2984,13 @@
},
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>ethjs-util": true,
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>keccak": true,
"@metamask/eth-ledger-bridge-keyring>hdkey>secp256k1": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -3031,29 +3002,12 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"@metamask/eth-ledger-bridge-keyring>hdkey": {
"packages": {
"@metamask/eth-ledger-bridge-keyring>hdkey>secp256k1": true,
"browserify>assert": true,
"browserify>crypto-browserify": true,
"eth-trezor-keyring>hdkey>coinstring": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"@metamask/eth-ledger-bridge-keyring>hdkey>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"eth-trezor-keyring>hdkey>secp256k1": true,
"ethereumjs-wallet>safe-buffer": true
}
},
@ -3150,38 +3104,6 @@
"URL": true
}
},
"@metamask/iframe-execution-environment-service": {
"globals": {
"clearTimeout": true,
"document.body.appendChild": true,
"document.createElement": true,
"document.getElementById": true,
"setTimeout": true
},
"packages": {
"@metamask/iframe-execution-environment-service>json-rpc-middleware-stream": true,
"@metamask/iframe-execution-environment-service>nanoid": true,
"@metamask/post-message-stream": true,
"@metamask/snap-controllers": true,
"@metamask/snap-controllers>@metamask/execution-environments": true,
"json-rpc-engine": true,
"pump": true
}
},
"@metamask/iframe-execution-environment-service>json-rpc-middleware-stream": {
"globals": {
"setTimeout": true
},
"packages": {
"json-rpc-engine>@metamask/safe-event-emitter": true,
"readable-stream": true
}
},
"@metamask/iframe-execution-environment-service>nanoid": {
"globals": {
"crypto.getRandomValues": true
}
},
"@metamask/jazzicon": {
"globals": {
"document.createElement": true,
@ -3297,179 +3219,77 @@
"packages": {
"@metamask/controllers": true,
"@metamask/rpc-methods>@metamask/key-tree": true,
"@metamask/rpc-methods>@metamask/utils": true,
"@metamask/snap-controllers": true,
"eth-rpc-errors": true
}
},
"@metamask/rpc-methods>@metamask/key-tree": {
"packages": {
"@metamask/rpc-methods>@metamask/key-tree>bip39": true,
"browserify>buffer": true,
"browserify>crypto-browserify": true,
"browserify>insert-module-globals>is-buffer": true,
"ethereumjs-util>ethereum-cryptography>keccak": true,
"ganache>secp256k1": true
}
},
"@metamask/rpc-methods>@metamask/key-tree>bip39": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>pbkdf2": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>randombytes": true
"@metamask/rpc-methods>@metamask/key-tree>@noble/ed25519": true,
"@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": true,
"@metamask/rpc-methods>@metamask/key-tree>@noble/secp256k1": true,
"@metamask/rpc-methods>@metamask/key-tree>@scure/base": true,
"@metamask/rpc-methods>@metamask/key-tree>@scure/bip39": true,
"browserify>buffer": true
}
},
"@metamask/smart-transactions-controller": {
"@metamask/rpc-methods>@metamask/key-tree>@noble/ed25519": {
"globals": {
"URLSearchParams": true,
"clearInterval": true,
"console.error": true,
"console.log": true,
"fetch": true,
"setInterval": true,
"setTimeout": true
"crypto": true
},
"packages": {
"@metamask/controllers>isomorphic-fetch": true,
"@metamask/smart-transactions-controller>@metamask/controllers": true,
"@metamask/smart-transactions-controller>bignumber.js": true,
"@metamask/smart-transactions-controller>fast-json-patch": true,
"ethers": true,
"lodash": true
"browserify>browser-resolve": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers": {
"@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": {
"globals": {
"Headers": true,
"URL": true,
"clearInterval": true,
"clearTimeout": true,
"console.error": true,
"console.log": true,
"fetch": true,
"setInterval": true,
"TextEncoder": true,
"crypto": true,
"setTimeout": true
},
"packages": {
"@ethereumjs/common": true,
"@ethereumjs/tx": true,
"@metamask/contract-metadata": true,
"@metamask/controllers>abort-controller": true,
"@metamask/controllers>async-mutex": true,
"@metamask/controllers>eth-phishing-detect": true,
"@metamask/controllers>isomorphic-fetch": true,
"@metamask/controllers>multiformats": true,
"@metamask/controllers>web3-provider-engine": true,
"@metamask/metamask-eth-abis": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": true,
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": true,
"@metamask/smart-transactions-controller>@metamask/controllers>nanoid": true,
"@storybook/api>fast-deep-equal": true,
"browserify>buffer": true,
"browserify>events": true,
"deep-freeze-strict": true,
"eth-ens-namehash": true,
"eth-json-rpc-infura": true,
"eth-keyring-controller": true,
"eth-query": true,
"eth-rpc-errors": true,
"eth-sig-util": true,
"ethereumjs-util": true,
"ethers": true,
"ethjs>ethjs-unit": true,
"immer": true,
"json-rpc-engine": true,
"jsonschema": true,
"punycode": true,
"single-call-balance-checker-abi": true,
"uuid": true,
"web3": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": {
"@metamask/rpc-methods>@metamask/key-tree>@noble/secp256k1": {
"globals": {
"clearInterval": true,
"setInterval": true
"crypto": true
},
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"browserify>buffer": true,
"ethjs>ethjs-filter": true,
"ethjs>ethjs-provider-http": true,
"ethjs>ethjs-unit": true,
"ethjs>ethjs-util": true,
"ethjs>number-to-bn": true
"browserify>browser-resolve": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"browserify>buffer": true,
"ethjs>number-to-bn": true
"@metamask/rpc-methods>@metamask/key-tree>@scure/base": {
"globals": {
"TextDecoder": true,
"TextEncoder": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": {
"@metamask/rpc-methods>@metamask/key-tree>@scure/bip39": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"ethjs-query>babel-runtime": true,
"ethjs>ethjs-filter": true,
"ethjs>ethjs-util": true,
"promise-to-callback": true
"@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": true,
"@metamask/rpc-methods>@metamask/key-tree>@scure/base": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": {
"@metamask/rpc-methods>@metamask/utils": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"browserify>buffer": true,
"ethjs>number-to-bn": true
"@storybook/api>fast-deep-equal": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": {
"@metamask/smart-transactions-controller": {
"globals": {
"console": true
},
"packages": {
"ethjs-query>babel-runtime": true,
"ethjs-query>ethjs-format": true,
"ethjs-query>ethjs-rpc": true,
"promise-to-callback": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": {
"packages": {
"browserify>process": true
}
"URLSearchParams": true,
"clearInterval": true,
"console.error": true,
"console.log": true,
"fetch": true,
"setInterval": true
},
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": true,
"@truffle/codec>utf8": true,
"browserify>buffer": true,
"browserify>crypto-browserify": true,
"ethereumjs-util": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-wallet>aes-js": true,
"ethereumjs-wallet>bs58check": true,
"ethereumjs-wallet>randombytes": true,
"ethers>@ethersproject/json-wallets>scrypt-js": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": {
"globals": {
"crypto": true,
"msCrypto": true
"@metamask/controllers": true,
"@metamask/controllers>isomorphic-fetch": true,
"@metamask/smart-transactions-controller>bignumber.js": true,
"@metamask/smart-transactions-controller>fast-json-patch": true,
"ethers": true,
"lodash": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>nanoid": {
@ -3500,6 +3320,9 @@
"console.info": true,
"console.log": true,
"console.warn": true,
"document.body.appendChild": true,
"document.createElement": true,
"document.getElementById": true,
"fetch": true,
"setTimeout": true
},
@ -3507,6 +3330,7 @@
"@metamask/controllers": true,
"@metamask/post-message-stream": true,
"@metamask/providers>@metamask/object-multiplex": true,
"@metamask/rpc-methods>@metamask/utils": true,
"@metamask/snap-controllers>@metamask/execution-environments": true,
"@metamask/snap-controllers>@metamask/obs-store": true,
"@metamask/snap-controllers>ajv": true,
@ -3714,7 +3538,7 @@
"@ngraveio/bc-ur>bignumber.js": true,
"@ngraveio/bc-ur>crc": true,
"@ngraveio/bc-ur>jsbi": true,
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"pubnub>cbor-sync": true
@ -3736,12 +3560,6 @@
"define": true
}
},
"@ngraveio/bc-ur>sha.js": {
"packages": {
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"@popperjs/core": {
"globals": {
"Element": true,
@ -3852,6 +3670,11 @@
"localforage": true
}
},
"@storybook/api>regenerator-runtime": {
"globals": {
"regeneratorRuntime": "write"
}
},
"@storybook/api>util-deprecate": {
"globals": {
"console.trace": true,
@ -4171,9 +3994,10 @@
"setTimeout": true
}
},
"addons-linter>regenerator-runtime": {
"globals": {
"regeneratorRuntime": "write"
"addons-linter>sha.js": {
"packages": {
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"analytics-node": {
@ -4364,7 +4188,7 @@
},
"browserify>crypto-browserify>create-hmac": {
"packages": {
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>create-hash>cipher-base": true,
"ethereumjs-util>create-hash>ripemd160": true,
@ -4389,10 +4213,13 @@
"browserify>crypto-browserify>pbkdf2": {
"globals": {
"crypto": true,
"process": true
"process": true,
"queueMicrotask": true,
"setImmediate": true,
"setTimeout": true
},
"packages": {
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"browserify>process": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>create-hash>ripemd160": true,
@ -4522,12 +4349,7 @@
},
"browserify>string_decoder": {
"packages": {
"browserify>string_decoder>safe-buffer": true
}
},
"browserify>string_decoder>safe-buffer": {
"packages": {
"browserify>buffer": true
"ethereumjs-wallet>safe-buffer": true
}
},
"browserify>timers-browserify": {
@ -4827,12 +4649,13 @@
},
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true,
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>keccak": true,
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>secp256k1": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -4844,84 +4667,41 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-keyring-controller": {
"packages": {
"browserify>buffer": true,
"browserify>events": true,
"eth-keyring-controller>bip39": true,
"eth-keyring-controller>@metamask/bip39": true,
"eth-keyring-controller>@metamask/eth-hd-keyring": true,
"eth-keyring-controller>browser-passworder": true,
"eth-keyring-controller>eth-hd-keyring": true,
"eth-keyring-controller>eth-simple-keyring": true,
"eth-keyring-controller>obs-store": true,
"eth-sig-util": true,
"ethereumjs-util": true,
"loglevel": true
"eth-sig-util": true
}
},
"eth-keyring-controller>bip39": {
"globals": {
"console.log": true
},
"eth-keyring-controller>@metamask/bip39": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>pbkdf2": true,
"eth-keyring-controller>bip39>unorm": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>randombytes": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-keyring-controller>bip39>unorm": {
"globals": {
"define": true
}
},
"eth-keyring-controller>browser-passworder": {
"globals": {
"btoa": true,
"crypto": true
},
"packages": {
"eth-keyring-controller>browser-passworder>browserify-unibabel": true
}
},
"eth-keyring-controller>browser-passworder>browserify-unibabel": {
"globals": {
"atob": true,
"btoa": true
"ethereumjs-wallet>randombytes": true
}
},
"eth-keyring-controller>eth-hd-keyring": {
"eth-keyring-controller>@metamask/eth-hd-keyring": {
"packages": {
"browserify>buffer": true,
"eth-keyring-controller>bip39": true,
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet": true,
"eth-keyring-controller>@metamask/bip39": true,
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet": true,
"eth-keyring-controller>eth-simple-keyring": true,
"eth-sig-util": true
"eth-trezor-keyring>@metamask/eth-sig-util": true
}
},
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet": {
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet": {
"packages": {
"@truffle/codec>utf8": true,
"browserify>buffer": true,
"browserify>crypto-browserify": true,
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet>uuid": true,
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet>uuid": true,
"ethereumjs-util": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-wallet>aes-js": true,
@ -4930,12 +4710,27 @@
"ethers>@ethersproject/json-wallets>scrypt-js": true
}
},
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet>uuid": {
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet>uuid": {
"globals": {
"crypto": true,
"msCrypto": true
}
},
"eth-keyring-controller>browser-passworder": {
"globals": {
"btoa": true,
"crypto": true
},
"packages": {
"eth-keyring-controller>browser-passworder>browserify-unibabel": true
}
},
"eth-keyring-controller>browser-passworder>browserify-unibabel": {
"globals": {
"atob": true,
"btoa": true
}
},
"eth-keyring-controller>eth-simple-keyring": {
"packages": {
"browserify>buffer": true,
@ -4991,8 +4786,8 @@
"eth-lattice-keyring>bn.js": true,
"eth-lattice-keyring>gridplus-sdk": true,
"eth-lattice-keyring>rlp": true,
"ethereumjs-util": true,
"ganache>secp256k1": true
"eth-lattice-keyring>secp256k1": true,
"ethereumjs-util": true
}
},
"eth-lattice-keyring>bn.js": {
@ -5021,11 +4816,11 @@
"eth-lattice-keyring>gridplus-sdk>borc": true,
"eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": true,
"eth-lattice-keyring>gridplus-sdk>rlp": true,
"eth-lattice-keyring>gridplus-sdk>secp256k1": true,
"ethereumjs-wallet>aes-js": true,
"ethereumjs-wallet>bs58check": true,
"ethers>@ethersproject/keccak256>js-sha3": true,
"ethers>@ethersproject/sha2>hash.js": true,
"ganache>secp256k1": true,
"lodash": true,
"pubnub>superagent": true
}
@ -5090,11 +4885,21 @@
"TextEncoder": true
}
},
"eth-lattice-keyring>gridplus-sdk>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"eth-lattice-keyring>rlp": {
"globals": {
"TextEncoder": true
}
},
"eth-lattice-keyring>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"eth-method-registry": {
"packages": {
"ethjs": true
@ -5122,12 +4927,13 @@
},
"eth-sig-util>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"eth-sig-util>ethereumjs-util>ethjs-util": true,
"eth-sig-util>ethereumjs-util>keccak": true,
"eth-sig-util>ethereumjs-util>secp256k1": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -5139,34 +4945,6 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"eth-sig-util>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"eth-sig-util>ethereumjs-util>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-sig-util>ethereumjs-util>secp256k1>bip66": {
"packages": {
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-sig-util>ethereumjs-util>secp256k1>drbg.js": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>create-hmac": true
}
},
"eth-trezor-keyring": {
"globals": {
"setTimeout": true
@ -5230,11 +5008,23 @@
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"eth-trezor-keyring>hdkey>secp256k1>bip66": true,
"eth-trezor-keyring>hdkey>secp256k1>drbg.js": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-trezor-keyring>hdkey>secp256k1>bip66": {
"packages": {
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-trezor-keyring>hdkey>secp256k1>drbg.js": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>create-hmac": true
}
},
"eth-trezor-keyring>trezor-connect": {
"globals": {
"__TREZOR_CONNECT_SRC": true,
@ -5311,7 +5101,7 @@
},
"ethereumjs-util>create-hash": {
"packages": {
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"ethereumjs-util>create-hash>cipher-base": true,
"ethereumjs-util>create-hash>md5.js": true,
"ethereumjs-util>create-hash>ripemd160": true,
@ -5335,11 +5125,22 @@
},
"ethereumjs-util>create-hash>md5.js>hash-base": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-util>create-hash>md5.js>hash-base>readable-stream": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"ethereumjs-util>create-hash>md5.js>hash-base>readable-stream": {
"packages": {
"@storybook/api>util-deprecate": true,
"browserify>browser-resolve": true,
"browserify>buffer": true,
"browserify>events": true,
"browserify>process": true,
"browserify>string_decoder": true,
"pumpify>inherits": true
}
},
"ethereumjs-util>create-hash>ripemd160": {
"packages": {
"browserify>buffer": true,
@ -5353,19 +5154,17 @@
"browserify>buffer": true,
"browserify>crypto-browserify>create-hmac": true,
"ethereumjs-util>ethereum-cryptography>keccak": true,
"ethereumjs-util>ethereum-cryptography>secp256k1": true,
"ethereumjs-wallet>bs58check": true,
"ethereumjs-wallet>randombytes": true,
"ethereumjs-wallet>safe-buffer": true,
"ethers>@ethersproject/sha2>hash.js": true,
"ganache>secp256k1": true
"ethers>@ethersproject/sha2>hash.js": true
}
},
"ethereumjs-util>ethereum-cryptography>blakejs": {
"globals": {
"TextEncoder": true,
"console.log": true
},
"packages": {
"browserify>buffer": true
}
},
"ethereumjs-util>ethereum-cryptography>browserify-aes": {
@ -5400,6 +5199,11 @@
"pumpify>inherits": true
}
},
"ethereumjs-util>ethereum-cryptography>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"ethereumjs-util>ethjs-util": {
"packages": {
"browserify>buffer": true,
@ -5974,7 +5778,7 @@
"ethjs-query>babel-runtime": {
"packages": {
"@babel/runtime": true,
"addons-linter>regenerator-runtime": true,
"@storybook/api>regenerator-runtime": true,
"ethjs-query>babel-runtime>core-js": true
}
},
@ -6077,11 +5881,6 @@
"define": true
}
},
"ganache>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"globalthis>define-properties": {
"packages": {
"nock>deep-equal>object-keys": true

@ -921,7 +921,7 @@
"3box>ipfs>async": true,
"3box>ipfs>bs58": true,
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>multihashing-async": true,
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>secp256k1": true
"eth-trezor-keyring>hdkey>secp256k1": true
}
},
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>multihashing-async": {
@ -939,15 +939,6 @@
"ethers>@ethersproject/keccak256>js-sha3": true
}
},
"3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>secp256k1": {
"packages": {
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"eth-sig-util>ethereumjs-util>secp256k1>drbg.js": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"3box>ipfs>libp2p-crypto>multihashing-async": {
"globals": {
"crypto": true,
@ -2073,8 +2064,8 @@
"3box>ipfs>libp2p-crypto": true,
"3box>orbit-db>orbit-db-cache>level-js": true,
"3box>orbit-db>orbit-db-keystore>levelup": true,
"3box>orbit-db>orbit-db-keystore>libp2p-crypto-secp256k1>secp256k1": true,
"3box>orbit-db>orbit-db-keystore>lru": true,
"eth-trezor-keyring>hdkey>secp256k1": true,
"ethereumjs-wallet>safe-buffer": true
}
},
@ -2119,16 +2110,6 @@
"pumpify>inherits": true
}
},
"3box>orbit-db>orbit-db-keystore>libp2p-crypto-secp256k1>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"3box>orbit-db>orbit-db-keystore>lru": {
"packages": {
"browserify>events": true,
@ -2221,7 +2202,7 @@
},
"@babel/runtime": {
"packages": {
"addons-linter>regenerator-runtime": true
"@storybook/api>regenerator-runtime": true
}
},
"@download/blockies": {
@ -2397,11 +2378,16 @@
},
"@keystonehq/bc-ur-registry-eth>hdkey": {
"packages": {
"@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": true,
"browserify>assert": true,
"browserify>crypto-browserify": true,
"ethereumjs-wallet>bs58check": true,
"ethereumjs-wallet>safe-buffer": true,
"ganache>secp256k1": true
"ethereumjs-wallet>safe-buffer": true
}
},
"@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"@keystonehq/metamask-airgapped-keyring": {
@ -2942,12 +2928,13 @@
},
"@metamask/controllers>web3-provider-engine>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": true,
"@metamask/controllers>web3-provider-engine>ethereumjs-util>keccak": true,
"@metamask/controllers>web3-provider-engine>ethereumjs-util>secp256k1": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -2959,23 +2946,6 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"@metamask/controllers>web3-provider-engine>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"@metamask/controllers>web3-provider-engine>ethereumjs-util>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"@metamask/controllers>web3-provider-engine>semaphore": {
"globals": {
"define": true,
@ -3014,12 +2984,13 @@
},
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>ethjs-util": true,
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>keccak": true,
"@metamask/eth-ledger-bridge-keyring>hdkey>secp256k1": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -3031,29 +3002,12 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"@metamask/eth-ledger-bridge-keyring>hdkey": {
"packages": {
"@metamask/eth-ledger-bridge-keyring>hdkey>secp256k1": true,
"browserify>assert": true,
"browserify>crypto-browserify": true,
"eth-trezor-keyring>hdkey>coinstring": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"@metamask/eth-ledger-bridge-keyring>hdkey>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"eth-trezor-keyring>hdkey>secp256k1": true,
"ethereumjs-wallet>safe-buffer": true
}
},
@ -3150,11 +3104,6 @@
"URL": true
}
},
"@metamask/iframe-execution-environment-service>nanoid": {
"globals": {
"crypto.getRandomValues": true
}
},
"@metamask/jazzicon": {
"globals": {
"document.createElement": true,
@ -3270,179 +3219,77 @@
"packages": {
"@metamask/controllers": true,
"@metamask/rpc-methods>@metamask/key-tree": true,
"@metamask/rpc-methods>@metamask/utils": true,
"@metamask/snap-controllers": true,
"eth-rpc-errors": true
}
},
"@metamask/rpc-methods>@metamask/key-tree": {
"packages": {
"@metamask/rpc-methods>@metamask/key-tree>bip39": true,
"browserify>buffer": true,
"browserify>crypto-browserify": true,
"browserify>insert-module-globals>is-buffer": true,
"ethereumjs-util>ethereum-cryptography>keccak": true,
"ganache>secp256k1": true
}
},
"@metamask/rpc-methods>@metamask/key-tree>bip39": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>pbkdf2": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>randombytes": true
"@metamask/rpc-methods>@metamask/key-tree>@noble/ed25519": true,
"@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": true,
"@metamask/rpc-methods>@metamask/key-tree>@noble/secp256k1": true,
"@metamask/rpc-methods>@metamask/key-tree>@scure/base": true,
"@metamask/rpc-methods>@metamask/key-tree>@scure/bip39": true,
"browserify>buffer": true
}
},
"@metamask/smart-transactions-controller": {
"@metamask/rpc-methods>@metamask/key-tree>@noble/ed25519": {
"globals": {
"URLSearchParams": true,
"clearInterval": true,
"console.error": true,
"console.log": true,
"fetch": true,
"setInterval": true,
"setTimeout": true
"crypto": true
},
"packages": {
"@metamask/controllers>isomorphic-fetch": true,
"@metamask/smart-transactions-controller>@metamask/controllers": true,
"@metamask/smart-transactions-controller>bignumber.js": true,
"@metamask/smart-transactions-controller>fast-json-patch": true,
"ethers": true,
"lodash": true
"browserify>browser-resolve": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers": {
"@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": {
"globals": {
"Headers": true,
"URL": true,
"clearInterval": true,
"clearTimeout": true,
"console.error": true,
"console.log": true,
"fetch": true,
"setInterval": true,
"TextEncoder": true,
"crypto": true,
"setTimeout": true
},
"packages": {
"@ethereumjs/common": true,
"@ethereumjs/tx": true,
"@metamask/contract-metadata": true,
"@metamask/controllers>abort-controller": true,
"@metamask/controllers>async-mutex": true,
"@metamask/controllers>eth-phishing-detect": true,
"@metamask/controllers>isomorphic-fetch": true,
"@metamask/controllers>multiformats": true,
"@metamask/controllers>web3-provider-engine": true,
"@metamask/metamask-eth-abis": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": true,
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": true,
"@metamask/smart-transactions-controller>@metamask/controllers>nanoid": true,
"@storybook/api>fast-deep-equal": true,
"browserify>buffer": true,
"browserify>events": true,
"deep-freeze-strict": true,
"eth-ens-namehash": true,
"eth-json-rpc-infura": true,
"eth-keyring-controller": true,
"eth-query": true,
"eth-rpc-errors": true,
"eth-sig-util": true,
"ethereumjs-util": true,
"ethers": true,
"ethjs>ethjs-unit": true,
"immer": true,
"json-rpc-engine": true,
"jsonschema": true,
"punycode": true,
"single-call-balance-checker-abi": true,
"uuid": true,
"web3": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": {
"@metamask/rpc-methods>@metamask/key-tree>@noble/secp256k1": {
"globals": {
"clearInterval": true,
"setInterval": true
"crypto": true
},
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"browserify>buffer": true,
"ethjs>ethjs-filter": true,
"ethjs>ethjs-provider-http": true,
"ethjs>ethjs-unit": true,
"ethjs>ethjs-util": true,
"ethjs>number-to-bn": true
"browserify>browser-resolve": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"browserify>buffer": true,
"ethjs>number-to-bn": true
"@metamask/rpc-methods>@metamask/key-tree>@scure/base": {
"globals": {
"TextDecoder": true,
"TextEncoder": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": {
"@metamask/rpc-methods>@metamask/key-tree>@scure/bip39": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"ethjs-query>babel-runtime": true,
"ethjs>ethjs-filter": true,
"ethjs>ethjs-util": true,
"promise-to-callback": true
"@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": true,
"@metamask/rpc-methods>@metamask/key-tree>@scure/base": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": {
"@metamask/rpc-methods>@metamask/utils": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true,
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": true,
"browserify>buffer": true,
"ethjs>number-to-bn": true
"@storybook/api>fast-deep-equal": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": {
"@metamask/smart-transactions-controller": {
"globals": {
"console": true
},
"packages": {
"ethjs-query>babel-runtime": true,
"ethjs-query>ethjs-format": true,
"ethjs-query>ethjs-rpc": true,
"promise-to-callback": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>js-sha3": {
"packages": {
"browserify>process": true
}
"URLSearchParams": true,
"clearInterval": true,
"console.error": true,
"console.log": true,
"fetch": true,
"setInterval": true
},
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": {
"packages": {
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": true,
"@truffle/codec>utf8": true,
"browserify>buffer": true,
"browserify>crypto-browserify": true,
"ethereumjs-util": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-wallet>aes-js": true,
"ethereumjs-wallet>bs58check": true,
"ethereumjs-wallet>randombytes": true,
"ethers>@ethersproject/json-wallets>scrypt-js": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": {
"globals": {
"crypto": true,
"msCrypto": true
"@metamask/controllers": true,
"@metamask/controllers>isomorphic-fetch": true,
"@metamask/smart-transactions-controller>bignumber.js": true,
"@metamask/smart-transactions-controller>fast-json-patch": true,
"ethers": true,
"lodash": true
}
},
"@metamask/smart-transactions-controller>@metamask/controllers>nanoid": {
@ -3473,6 +3320,9 @@
"console.info": true,
"console.log": true,
"console.warn": true,
"document.body.appendChild": true,
"document.createElement": true,
"document.getElementById": true,
"fetch": true,
"setTimeout": true
},
@ -3480,6 +3330,7 @@
"@metamask/controllers": true,
"@metamask/post-message-stream": true,
"@metamask/providers>@metamask/object-multiplex": true,
"@metamask/rpc-methods>@metamask/utils": true,
"@metamask/snap-controllers>@metamask/execution-environments": true,
"@metamask/snap-controllers>@metamask/obs-store": true,
"@metamask/snap-controllers>ajv": true,
@ -3687,7 +3538,7 @@
"@ngraveio/bc-ur>bignumber.js": true,
"@ngraveio/bc-ur>crc": true,
"@ngraveio/bc-ur>jsbi": true,
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"pubnub>cbor-sync": true
@ -3709,12 +3560,6 @@
"define": true
}
},
"@ngraveio/bc-ur>sha.js": {
"packages": {
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"@popperjs/core": {
"globals": {
"Element": true,
@ -3825,6 +3670,11 @@
"localforage": true
}
},
"@storybook/api>regenerator-runtime": {
"globals": {
"regeneratorRuntime": "write"
}
},
"@storybook/api>util-deprecate": {
"globals": {
"console.trace": true,
@ -4144,9 +3994,10 @@
"setTimeout": true
}
},
"addons-linter>regenerator-runtime": {
"globals": {
"regeneratorRuntime": "write"
"addons-linter>sha.js": {
"packages": {
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"analytics-node": {
@ -4337,7 +4188,7 @@
},
"browserify>crypto-browserify>create-hmac": {
"packages": {
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>create-hash>cipher-base": true,
"ethereumjs-util>create-hash>ripemd160": true,
@ -4362,10 +4213,13 @@
"browserify>crypto-browserify>pbkdf2": {
"globals": {
"crypto": true,
"process": true
"process": true,
"queueMicrotask": true,
"setImmediate": true,
"setTimeout": true
},
"packages": {
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"browserify>process": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>create-hash>ripemd160": true,
@ -4495,12 +4349,7 @@
},
"browserify>string_decoder": {
"packages": {
"browserify>string_decoder>safe-buffer": true
}
},
"browserify>string_decoder>safe-buffer": {
"packages": {
"browserify>buffer": true
"ethereumjs-wallet>safe-buffer": true
}
},
"browserify>timers-browserify": {
@ -4800,12 +4649,13 @@
},
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true,
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>keccak": true,
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>secp256k1": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -4817,84 +4667,41 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-keyring-controller": {
"packages": {
"browserify>buffer": true,
"browserify>events": true,
"eth-keyring-controller>bip39": true,
"eth-keyring-controller>@metamask/bip39": true,
"eth-keyring-controller>@metamask/eth-hd-keyring": true,
"eth-keyring-controller>browser-passworder": true,
"eth-keyring-controller>eth-hd-keyring": true,
"eth-keyring-controller>eth-simple-keyring": true,
"eth-keyring-controller>obs-store": true,
"eth-sig-util": true,
"ethereumjs-util": true,
"loglevel": true
"eth-sig-util": true
}
},
"eth-keyring-controller>bip39": {
"globals": {
"console.log": true
},
"eth-keyring-controller>@metamask/bip39": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>pbkdf2": true,
"eth-keyring-controller>bip39>unorm": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>randombytes": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-keyring-controller>bip39>unorm": {
"globals": {
"define": true
}
},
"eth-keyring-controller>browser-passworder": {
"globals": {
"btoa": true,
"crypto": true
},
"packages": {
"eth-keyring-controller>browser-passworder>browserify-unibabel": true
}
},
"eth-keyring-controller>browser-passworder>browserify-unibabel": {
"globals": {
"atob": true,
"btoa": true
"ethereumjs-wallet>randombytes": true
}
},
"eth-keyring-controller>eth-hd-keyring": {
"eth-keyring-controller>@metamask/eth-hd-keyring": {
"packages": {
"browserify>buffer": true,
"eth-keyring-controller>bip39": true,
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet": true,
"eth-keyring-controller>@metamask/bip39": true,
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet": true,
"eth-keyring-controller>eth-simple-keyring": true,
"eth-sig-util": true
"eth-trezor-keyring>@metamask/eth-sig-util": true
}
},
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet": {
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet": {
"packages": {
"@truffle/codec>utf8": true,
"browserify>buffer": true,
"browserify>crypto-browserify": true,
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet>uuid": true,
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet>uuid": true,
"ethereumjs-util": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-wallet>aes-js": true,
@ -4903,12 +4710,27 @@
"ethers>@ethersproject/json-wallets>scrypt-js": true
}
},
"eth-keyring-controller>eth-hd-keyring>ethereumjs-wallet>uuid": {
"eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet>uuid": {
"globals": {
"crypto": true,
"msCrypto": true
}
},
"eth-keyring-controller>browser-passworder": {
"globals": {
"btoa": true,
"crypto": true
},
"packages": {
"eth-keyring-controller>browser-passworder>browserify-unibabel": true
}
},
"eth-keyring-controller>browser-passworder>browserify-unibabel": {
"globals": {
"atob": true,
"btoa": true
}
},
"eth-keyring-controller>eth-simple-keyring": {
"packages": {
"browserify>buffer": true,
@ -4964,8 +4786,8 @@
"eth-lattice-keyring>bn.js": true,
"eth-lattice-keyring>gridplus-sdk": true,
"eth-lattice-keyring>rlp": true,
"ethereumjs-util": true,
"ganache>secp256k1": true
"eth-lattice-keyring>secp256k1": true,
"ethereumjs-util": true
}
},
"eth-lattice-keyring>bn.js": {
@ -4994,11 +4816,11 @@
"eth-lattice-keyring>gridplus-sdk>borc": true,
"eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": true,
"eth-lattice-keyring>gridplus-sdk>rlp": true,
"eth-lattice-keyring>gridplus-sdk>secp256k1": true,
"ethereumjs-wallet>aes-js": true,
"ethereumjs-wallet>bs58check": true,
"ethers>@ethersproject/keccak256>js-sha3": true,
"ethers>@ethersproject/sha2>hash.js": true,
"ganache>secp256k1": true,
"lodash": true,
"pubnub>superagent": true
}
@ -5063,11 +4885,21 @@
"TextEncoder": true
}
},
"eth-lattice-keyring>gridplus-sdk>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"eth-lattice-keyring>rlp": {
"globals": {
"TextEncoder": true
}
},
"eth-lattice-keyring>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"eth-method-registry": {
"packages": {
"ethjs": true
@ -5095,12 +4927,13 @@
},
"eth-sig-util>ethereumjs-util": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>assert": true,
"browserify>buffer": true,
"eth-sig-util>ethereumjs-util>ethjs-util": true,
"eth-sig-util>ethereumjs-util>keccak": true,
"eth-sig-util>ethereumjs-util>secp256k1": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-util>ethereum-cryptography": true,
"ethereumjs-util>rlp": true,
"ethereumjs-wallet>safe-buffer": true
}
@ -5112,34 +4945,6 @@
"ethjs>ethjs-util>strip-hex-prefix": true
}
},
"eth-sig-util>ethereumjs-util>keccak": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"eth-sig-util>ethereumjs-util>secp256k1": {
"packages": {
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-sig-util>ethereumjs-util>secp256k1>bip66": {
"packages": {
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-sig-util>ethereumjs-util>secp256k1>drbg.js": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>create-hmac": true
}
},
"eth-trezor-keyring": {
"globals": {
"setTimeout": true
@ -5203,11 +5008,23 @@
"3box>ethers>elliptic": true,
"bn.js": true,
"browserify>insert-module-globals>is-buffer": true,
"eth-sig-util>ethereumjs-util>secp256k1>bip66": true,
"eth-trezor-keyring>hdkey>secp256k1>bip66": true,
"eth-trezor-keyring>hdkey>secp256k1>drbg.js": true,
"ethereumjs-util>create-hash": true,
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-trezor-keyring>hdkey>secp256k1>bip66": {
"packages": {
"ethereumjs-wallet>safe-buffer": true
}
},
"eth-trezor-keyring>hdkey>secp256k1>drbg.js": {
"packages": {
"browserify>buffer": true,
"browserify>crypto-browserify>create-hmac": true
}
},
"eth-trezor-keyring>trezor-connect": {
"globals": {
"__TREZOR_CONNECT_SRC": true,
@ -5284,7 +5101,7 @@
},
"ethereumjs-util>create-hash": {
"packages": {
"@ngraveio/bc-ur>sha.js": true,
"addons-linter>sha.js": true,
"ethereumjs-util>create-hash>cipher-base": true,
"ethereumjs-util>create-hash>md5.js": true,
"ethereumjs-util>create-hash>ripemd160": true,
@ -5308,11 +5125,22 @@
},
"ethereumjs-util>create-hash>md5.js>hash-base": {
"packages": {
"browserify>stream-browserify": true,
"ethereumjs-util>create-hash>md5.js>hash-base>readable-stream": true,
"ethereumjs-wallet>safe-buffer": true,
"pumpify>inherits": true
}
},
"ethereumjs-util>create-hash>md5.js>hash-base>readable-stream": {
"packages": {
"@storybook/api>util-deprecate": true,
"browserify>browser-resolve": true,
"browserify>buffer": true,
"browserify>events": true,
"browserify>process": true,
"browserify>string_decoder": true,
"pumpify>inherits": true
}
},
"ethereumjs-util>create-hash>ripemd160": {
"packages": {
"browserify>buffer": true,
@ -5326,19 +5154,17 @@
"browserify>buffer": true,
"browserify>crypto-browserify>create-hmac": true,
"ethereumjs-util>ethereum-cryptography>keccak": true,
"ethereumjs-util>ethereum-cryptography>secp256k1": true,
"ethereumjs-wallet>bs58check": true,
"ethereumjs-wallet>randombytes": true,
"ethereumjs-wallet>safe-buffer": true,
"ethers>@ethersproject/sha2>hash.js": true,
"ganache>secp256k1": true
"ethers>@ethersproject/sha2>hash.js": true
}
},
"ethereumjs-util>ethereum-cryptography>blakejs": {
"globals": {
"TextEncoder": true,
"console.log": true
},
"packages": {
"browserify>buffer": true
}
},
"ethereumjs-util>ethereum-cryptography>browserify-aes": {
@ -5373,6 +5199,11 @@
"pumpify>inherits": true
}
},
"ethereumjs-util>ethereum-cryptography>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"ethereumjs-util>ethjs-util": {
"packages": {
"browserify>buffer": true,
@ -5947,7 +5778,7 @@
"ethjs-query>babel-runtime": {
"packages": {
"@babel/runtime": true,
"addons-linter>regenerator-runtime": true,
"@storybook/api>regenerator-runtime": true,
"ethjs-query>babel-runtime>core-js": true
}
},
@ -6050,11 +5881,6 @@
"define": true
}
},
"ganache>secp256k1": {
"packages": {
"3box>ethers>elliptic": true
}
},
"globalthis>define-properties": {
"packages": {
"nock>deep-equal>object-keys": true

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

Loading…
Cancel
Save