Merge branch 'develop' into master-sync

feature/default_network_editable
ryanml 3 years ago
commit 53c358e207
  1. 10
      .circleci/config.yml
  2. 3
      .circleci/scripts/chrome-install.sh
  3. 2
      .eslintrc.js
  4. 4
      .storybook/test-data.js
  5. 1615
      CHANGELOG.md
  6. 2
      README.md
  7. 3
      app/_locales/am/messages.json
  8. 3
      app/_locales/ar/messages.json
  9. 3
      app/_locales/bg/messages.json
  10. 3
      app/_locales/bn/messages.json
  11. 3
      app/_locales/ca/messages.json
  12. 3
      app/_locales/cs/messages.json
  13. 3
      app/_locales/da/messages.json
  14. 3
      app/_locales/de/messages.json
  15. 3
      app/_locales/el/messages.json
  16. 195
      app/_locales/en/messages.json
  17. 173
      app/_locales/es/messages.json
  18. 127
      app/_locales/es_419/messages.json
  19. 3
      app/_locales/et/messages.json
  20. 3
      app/_locales/fa/messages.json
  21. 3
      app/_locales/fi/messages.json
  22. 3
      app/_locales/fil/messages.json
  23. 3
      app/_locales/fr/messages.json
  24. 3
      app/_locales/he/messages.json
  25. 120
      app/_locales/hi/messages.json
  26. 3
      app/_locales/hn/messages.json
  27. 3
      app/_locales/hr/messages.json
  28. 3
      app/_locales/ht/messages.json
  29. 3
      app/_locales/hu/messages.json
  30. 120
      app/_locales/id/messages.json
  31. 3
      app/_locales/it/messages.json
  32. 127
      app/_locales/ja/messages.json
  33. 3
      app/_locales/kn/messages.json
  34. 396
      app/_locales/ko/messages.json
  35. 3
      app/_locales/lt/messages.json
  36. 3
      app/_locales/lv/messages.json
  37. 3
      app/_locales/ms/messages.json
  38. 3
      app/_locales/nl/messages.json
  39. 3
      app/_locales/no/messages.json
  40. 90
      app/_locales/ph/messages.json
  41. 3
      app/_locales/pl/messages.json
  42. 3
      app/_locales/pt/messages.json
  43. 138
      app/_locales/pt_BR/messages.json
  44. 3
      app/_locales/ro/messages.json
  45. 122
      app/_locales/ru/messages.json
  46. 3
      app/_locales/sk/messages.json
  47. 3
      app/_locales/sl/messages.json
  48. 3
      app/_locales/sr/messages.json
  49. 3
      app/_locales/sv/messages.json
  50. 3
      app/_locales/sw/messages.json
  51. 3
      app/_locales/ta/messages.json
  52. 3
      app/_locales/th/messages.json
  53. 3
      app/_locales/tl/messages.json
  54. 3
      app/_locales/tr/messages.json
  55. 3
      app/_locales/uk/messages.json
  56. 128
      app/_locales/vi/messages.json
  57. 3
      app/_locales/zh_CN/messages.json
  58. 3
      app/_locales/zh_TW/messages.json
  59. 12
      app/background.html
  60. 12
      app/home.html
  61. 4
      app/images/camera.svg
  62. 3
      app/images/connect-white.svg
  63. 5
      app/images/copy.svg
  64. 3
      app/images/forward-carrat.svg
  65. 3
      app/images/help.svg
  66. 3
      app/images/icons/blue-circle-info.svg
  67. 3
      app/images/icons/green-circle-check.svg
  68. 1
      app/images/icons/hamburger.svg
  69. 1
      app/images/icons/info.svg
  70. 11
      app/images/loginglogo.svg
  71. BIN
      app/images/logo.png
  72. 3
      app/images/meta-shield.svg
  73. 3
      app/images/mm-bolt.svg
  74. 7
      app/images/mm-secure.svg
  75. 6
      app/images/open.svg
  76. 18
      app/images/sleuth.svg
  77. 132
      app/images/source-logos-all.svg
  78. 5
      app/images/switch_acc.svg
  79. 112
      app/images/transak.svg
  80. 4
      app/manifest/_base.json
  81. 12
      app/notification.html
  82. 4
      app/phishing.html
  83. 12
      app/popup.html
  84. 1
      app/scripts/constants/on-ramp.js
  85. 3
      app/scripts/controllers/detect-tokens.test.js
  86. 34
      app/scripts/controllers/incoming-transactions.js
  87. 120
      app/scripts/controllers/incoming-transactions.test.js
  88. 8
      app/scripts/controllers/network/createInfuraClient.js
  89. 71
      app/scripts/controllers/network/network-controller.test.js
  90. 86
      app/scripts/controllers/network/network.js
  91. 15
      app/scripts/controllers/preferences.js
  92. 21
      app/scripts/controllers/preferences.test.js
  93. 2
      app/scripts/controllers/swaps.js
  94. 234
      app/scripts/controllers/transactions/index.js
  95. 80
      app/scripts/controllers/transactions/index.test.js
  96. 139
      app/scripts/controllers/transactions/lib/util.js
  97. 261
      app/scripts/controllers/transactions/lib/util.test.js
  98. 5
      app/scripts/controllers/transactions/tx-gas-utils.js
  99. 13
      app/scripts/controllers/transactions/tx-gas-utils.test.js
  100. 36
      app/scripts/controllers/transactions/tx-state-manager.js
  101. Some files were not shown because too many files have changed in this diff Show More

@ -343,7 +343,7 @@ jobs:
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:chrome
yarn test:e2e:chrome --retries 2
fi
no_output_timeout: 20m
- store_artifacts:
@ -370,7 +370,7 @@ jobs:
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:chrome:metrics
yarn test:e2e:chrome:metrics --retries 2
fi
no_output_timeout: 20m
- store_artifacts:
@ -397,7 +397,7 @@ jobs:
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:firefox
yarn test:e2e:firefox --retries 2
fi
no_output_timeout: 20m
- store_artifacts:
@ -424,7 +424,7 @@ jobs:
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:firefox:metrics
yarn test:e2e:firefox:metrics --retries 2
fi
no_output_timeout: 20m
- store_artifacts:
@ -448,7 +448,7 @@ jobs:
command: mv ./builds-test ./builds
- run:
name: Run page load benchmark
command: yarn benchmark:chrome --out test-artifacts/chrome/benchmark/pageload.json
command: yarn benchmark:chrome --out test-artifacts/chrome/benchmark/pageload.json --retries 2
- store_artifacts:
path: test-artifacts
destination: test-artifacts

@ -14,7 +14,10 @@ wget -O "${CHROME_BINARY}" -t 5 "${CHROME_BINARY_URL}"
if [[ $(shasum -a 512 "${CHROME_BINARY}" | cut '--delimiter= ' -f1) != "${CHROME_BINARY_SHA512SUM}" ]]
then
echo "Google Chrome binary checksum did not match."
exit 1
else
echo "Google Chrome binary checksum verified."
fi
(sudo dpkg -i "${CHROME_BINARY}" || sudo apt-get -fy install)

@ -154,7 +154,7 @@ module.exports = {
'babel.config.js',
'nyc.config.js',
'stylelint.config.js',
'app/scripts/runLockdown.js',
'app/scripts/lockdown-run.js',
'development/**/*.js',
'test/e2e/**/*.js',
'test/lib/wait-until-called.js',

@ -260,7 +260,7 @@ const state = {
}
},
"assetImages": {
"0xad6d458402f60fd3bd25163575031acdce07538d": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xaD6D458402F60fD3Bd25163575031ACDce07538D/logo.png"
"0xad6d458402f60fd3bd25163575031acdce07538d": "./images/logo.png"
},
"hiddenTokens": [],
"suggestedTokens": {},
@ -271,7 +271,7 @@ const state = {
"ipfsGateway": "dweb.link",
"infuraBlocked": false,
"migratedPrivacyMode": false,
"selectedAddress": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"selectedAddress": "0x9d0ba4ddac06032527b140912ec808ab9451b788",
"metaMetricsId": "0xc2377d11fec1c3b7dd88c4854240ee5e3ed0d9f63b00456d98d80320337b827f",
"conversionDate": 1620710825.03,
"conversionRate": 3910.28,

File diff suppressed because it is too large Load Diff

@ -5,7 +5,7 @@ Hey! We are hiring JavaScript Engineers! [Apply here](https://boards.greenhouse.
You can find the latest version of MetaMask on [our official website](https://metamask.io/). For help using MetaMask, visit our [User Support Site](https://metamask.zendesk.com/hc/en-us).
For [general questions](https://metamask.zendesk.com/hc/en-us/community/topics/360000682532-General), [feature requests](https://metamask.zendesk.com/hc/en-us/community/topics/360000682552-Feature-Requests-Ideas), or [developer questions](https://metamask.zendesk.com/hc/en-us/community/topics/360001751291-Developer-Questions), visit our [Community Forum](https://metamask.zendesk.com/hc/en-us/community/topics).
For [general questions](https://community.metamask.io/c/learn/26), [feature requests](https://community.metamask.io/c/feature-requests-ideas/13), or [developer questions](https://community.metamask.io/c/developer-questions/11), visit our [Community Forum](https://community.metamask.io/).
MetaMask supports Firefox, Google Chrome, and Chromium-based browsers. We recommend using the latest available browser version.

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "ማሰሺያዎት አልተደገፈም..."
},
"builtInCalifornia": {
"message": "MetaMask ካሊፎርኒያ ውስጥ ተዘጋጅቶ የተገነባ ነው።"
},
"buyWithWyre": {
"message": "ETH በ Wyre ይግዙ"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "متصفحك غير مدعوم..."
},
"builtInCalifornia": {
"message": "تم تصميم وإنشاء MetaMask في ولاية كاليفورنيا."
},
"buyWithWyre": {
"message": "قم بشراء عملة إيثير بواسطة Wyre"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Браузърът ви не се поддържа ..."
},
"builtInCalifornia": {
"message": "MetaMask е проектиран и създаден в Калифорния."
},
"buyWithWyre": {
"message": "Купете ETH с Wyre"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "আপনর বউজর সমরিত নয়..."
},
"builtInCalifornia": {
"message": "MetaMask কিিিইন কর এবিিত।"
},
"buyWithWyre": {
"message": "Wyre দি ETH করয় করন"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "El teu navegador no és suportat..."
},
"builtInCalifornia": {
"message": "MetaMask ha estat dissenyat i desenvolupat a Califòrnia."
},
"buyWithWyre": {
"message": "Compra ETH amb Wyre"
},

@ -46,9 +46,6 @@
"blockiesIdenticon": {
"message": "Použít Blockies Identicon"
},
"builtInCalifornia": {
"message": "MetaMask je navržen a vytvořen v Kalifornii."
},
"cancel": {
"message": "Zrušit"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Din browser er ikke understøttet..."
},
"builtInCalifornia": {
"message": "MetaMask er designet og bygget i Californien."
},
"buyWithWyre": {
"message": "Køb ETH med Wyre"
},

@ -140,9 +140,6 @@
"browserNotSupported": {
"message": "Ihr Browser wird nicht unterstützt …"
},
"builtInCalifornia": {
"message": "MetaMask wurde in Kalifornien entwickelt und gebaut."
},
"buyWithWyre": {
"message": "ETH mit Wyre kaufen"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Το Πρόγραμμα Περιήγησής σας δεν υποστηρίζεται..."
},
"builtInCalifornia": {
"message": "Το MetaMask έχει σχεδιαστεί και αναπτυχθεί στην Καλιφόρνια."
},
"buyWithWyre": {
"message": "Αγοράστε ETH με το Wyre"
},

@ -97,9 +97,15 @@
"addTokens": {
"message": "Add Tokens"
},
"addressBookIcon": {
"message": "Address book icon"
},
"advanced": {
"message": "Advanced"
},
"advancedGasPriceTitle": {
"message": "Gas price"
},
"advancedOptions": {
"message": "Advanced Options"
},
@ -150,6 +156,9 @@
"amount": {
"message": "Amount"
},
"amountGasFee": {
"message": "Amount + Gas Fee"
},
"amountWithColon": {
"message": "Amount:"
},
@ -223,7 +232,7 @@
"message": "This secret code is required to recover your wallet in case you lose your device, forget your password, have to re-install MetaMask, or want to access your wallet on another device."
},
"backupApprovalNotice": {
"message": "Backup your Secret Recovery code to keep your wallet and funds secure."
"message": "Backup your Secret Recovery Phrase to keep your wallet and funds secure."
},
"backupNow": {
"message": "Backup now"
@ -253,15 +262,21 @@
"browserNotSupported": {
"message": "Your Browser is not supported..."
},
"builContactList": {
"buildContactList": {
"message": "Build your contact list"
},
"builtInCalifornia": {
"message": "MetaMask is designed and built in California."
"builtAroundTheWorld": {
"message": "MetaMask is designed and built around the world."
},
"buy": {
"message": "Buy"
},
"buyWithTransak": {
"message": "Buy ETH with Transak"
},
"buyWithTransakDescription": {
"message": "Transak supports debit card and bank transfers (depending on location) in 59+ countries. ETH deposits into your MetaMask account."
},
"buyWithWyre": {
"message": "Buy ETH with Wyre"
},
@ -277,6 +292,9 @@
"cancel": {
"message": "Cancel"
},
"cancelPopoverTitle": {
"message": "Cancel transaction"
},
"cancellationGasFee": {
"message": "Cancellation Gas Fee"
},
@ -310,6 +328,9 @@
"confirmSecretBackupPhrase": {
"message": "Confirm your Secret Backup Phrase"
},
"confirmSeedPhrase": {
"message": "Confirm Seed Phrase"
},
"confirmed": {
"message": "Confirmed"
},
@ -414,6 +435,9 @@
"continue": {
"message": "Continue"
},
"continueToTransak": {
"message": "Continue to Transak"
},
"continueToWyre": {
"message": "Continue to Wyre"
},
@ -456,6 +480,9 @@
"createAccount": {
"message": "Create Account"
},
"createNewWallet": {
"message": "Create a new wallet"
},
"createPassword": {
"message": "Create Password"
},
@ -492,6 +519,9 @@
"customToken": {
"message": "Custom Token"
},
"data": {
"message": "Data"
},
"dataBackupFoundInfo": {
"message": "Some of your account data was backed up during a previous installation of MetaMask. This could include your settings, contacts, and tokens. Would you like to restore this data now?"
},
@ -599,6 +629,64 @@
"editContact": {
"message": "Edit Contact"
},
"editGasEducationButtonText": {
"message": "How should I choose?"
},
"editGasEducationHighExplanation": {
"message": "This is best for swaps or other time sensitive transactions. If a swap takes too long to process it will often fail and you may lose funds."
},
"editGasEducationLearnMoreLinkText": {
"message": "Learn more about customizing gas."
},
"editGasEducationLowExplanation": {
"message": "Low A lower gas fee should only be selected for transactions where processing time is less important. With a lower fee, it can be be hard to predict when (or if) your transaction with be successful."
},
"editGasEducationMediumExplanation": {
"message": "A medium gas fee is good for sending, withdrawing or other non-time sensitive but important transactions."
},
"editGasEducationModalIntro": {
"message": "The right gas amount to select depends on the type of transaction and how important it is."
},
"editGasEducationModalTitle": {
"message": "How to choose?"
},
"editGasHigh": {
"message": "High"
},
"editGasLimitTooltip": {
"message": "Gas limit is the maximum units of gas you are willing to use. Units of gas are a multiplier to “Max priority fee” and “Max fee”."
},
"editGasLow": {
"message": "Low"
},
"editGasMaxFeeLow": {
"message": "Max fee too low for network conditions"
},
"editGasMaxFeeTooltip": {
"message": "The max fee is the most you’ll pay (base fee + priority fee)."
},
"editGasMaxPriorityFeeLow": {
"message": "Max priority fee too low for network conditions"
},
"editGasMaxPriorityFeeTooltip": {
"message": "Max priority fee (aka “miner tip”) goes directly to miners and incentivizes them to prioritize your transaction. You’ll most often pay your max setting"
},
"editGasMedium": {
"message": "Medium"
},
"editGasPriceTooltip": {
"message": "This network requires a “Gas price” field when submitting a transaction. Gas price is the amount you will pay pay per unit of gas."
},
"editGasTitle": {
"message": "Edit priority"
},
"editGasTooLow": {
"message": "Unknown processing time"
},
"editGasTotalBannerSubtitle": {
"message": "Up to $1 ($2)",
"display": "$1 represents a fiat value"
},
"editNonceField": {
"message": "Edit Nonce"
},
@ -786,6 +874,19 @@
"functionType": {
"message": "Function Type"
},
"gasDisplayAcknowledgeDappButtonText": {
"message": "Edit suggested gas fee"
},
"gasDisplayDappWarning": {
"message": "This gas fee has been suggested by $1. It’s using legacy gas estimation which may be inaccurate. However, editing this gas fee may cause a problem with your transaction. Please reach out to $1 if you have questions.",
"description": "$1 represents the Dapp's origin"
},
"gasFee": {
"message": "Gas Fee"
},
"gasFeeEstimate": {
"message": "Estimate"
},
"gasLimit": {
"message": "Gas Limit"
},
@ -1070,9 +1171,19 @@
"makeAnotherSwap": {
"message": "Create a new swap"
},
"makeSureNoOneWatching": {
"message": "Make sure no one is watching your screen",
"description": "Warning to users to be care while creating and saving their new seed phrase"
},
"max": {
"message": "Max"
},
"maxFee": {
"message": "Max fee"
},
"maxPriorityFee": {
"message": "Max priority fee"
},
"memo": {
"message": "memo"
},
@ -1367,6 +1478,9 @@
"onlyConnectTrust": {
"message": "Only connect with sites you trust."
},
"optional": {
"message": "Optional"
},
"optionalBlockExplorerUrl": {
"message": "Block Explorer URL (optional)"
},
@ -1391,6 +1505,12 @@
"passwordNotLongEnough": {
"message": "Password not long enough"
},
"passwordSetupDetails": {
"message": "This password will unlock your MetaMask wallet only on this device. MetaMask can not recover this password."
},
"passwordTermsWarning": {
"message": "I understand that MetaMask cannot recover this password for me. $1"
},
"passwordsDontMatch": {
"message": "Passwords Don't Match"
},
@ -1466,6 +1586,9 @@
"recipientAddressPlaceholder": {
"message": "Search, public address (0x), or ENS"
},
"recommendedGasLabel": {
"message": "Recommended"
},
"recoveryPhraseReminderBackupStart": {
"message": "Start here"
},
@ -1611,12 +1734,21 @@
"secretPhrase": {
"message": "Enter your secret phrase here to restore your vault."
},
"secureWallet": {
"message": "Secure Wallet"
},
"securityAndPrivacy": {
"message": "Security & Privacy"
},
"securitySettingsDescription": {
"message": "Privacy settings and wallet Secret Recovery Phrase"
},
"seedPhraseConfirm": {
"message": "Confirm Secret Recovery Phrase"
},
"seedPhraseEnterMissingWords": {
"message": "Confirm Secret Recovery Phrase"
},
"seedPhraseIntroSidebarBulletFour": {
"message": "Write down and store in multiple secret places."
},
@ -1662,6 +1794,12 @@
"seedPhraseReq": {
"message": "Secret Recovery Phrases contain 12, 15, 18, 21, or 24 words"
},
"seedPhraseWriteDownDetails": {
"message": "Write down this 12-word Secret Recovery Phrase and save it in a place that you trust and only you can access."
},
"seedPhraseWriteDownHeader": {
"message": "Write down your Secret Recovery Phrase"
},
"selectAHigherGasFee": {
"message": "Select a higher gas fee to accelerate the processing of your transaction.*"
},
@ -1721,6 +1859,9 @@
"settings": {
"message": "Settings"
},
"show": {
"message": "Show"
},
"showAdvancedGasInline": {
"message": "Advanced gas controls"
},
@ -1784,6 +1925,15 @@
"speedUpCancellation": {
"message": "Speed up this cancellation"
},
"speedUpExplanation": {
"message": "We’ve updated the gas fee based on current network conditions and have increased it by at least 10% (required by the network)."
},
"speedUpPopoverTitle": {
"message": "Speed up transaction"
},
"speedUpTooltipText": {
"message": "New gas fee"
},
"speedUpTransaction": {
"message": "Speed up this transaction"
},
@ -2198,6 +2348,9 @@
"symbolBetweenZeroTwelve": {
"message": "Symbol must be 11 characters or fewer."
},
"syncInProgress": {
"message": "Sync in progress"
},
"syncWithMobile": {
"message": "Sync with mobile"
},
@ -2289,6 +2442,28 @@
"transactionCreated": {
"message": "Transaction created with a value of $1 at $2."
},
"transactionDetailDappGasHeading": {
"message": "$1 suggested gas fee",
"description": "$1 represents a dapp origin"
},
"transactionDetailDappGasTooltip": {
"message": "This gas fee suggestion is using legacy gas estimation which may be inaccurate."
},
"transactionDetailGasHeading": {
"message": "Estimated gas fee"
},
"transactionDetailGasTooltipConversion": {
"message": "Learn more about gas fees"
},
"transactionDetailGasTooltipExplanation": {
"message": "Gas fees are set by the network and fluctuate based on network traffic and transaction complexity."
},
"transactionDetailGasTooltipIntro": {
"message": "Gas fees are paid to crypto miners who process transactions on the Ethereum network. MetaMask does not profit from gas fees."
},
"transactionDetailGasTotalSubtitle": {
"message": "Amount + gas fee"
},
"transactionDropped": {
"message": "Transaction dropped at $2."
},
@ -2304,6 +2479,15 @@
"transactionFee": {
"message": "Transaction Fee"
},
"transactionHistoryBaseFee": {
"message": "Base fee (GWEI)"
},
"transactionHistoryEffectiveGasPrice": {
"message": "Effective gas price"
},
"transactionHistoryPriorityFee": {
"message": "Priority fee (GWEI)"
},
"transactionResubmitted": {
"message": "Transaction resubmitted with gas fee increased to $1 at $2"
},
@ -2424,6 +2608,9 @@
"viewContact": {
"message": "View Contact"
},
"viewFullTransactionDetails": {
"message": "View full transaction details"
},
"viewMore": {
"message": "View More"
},

@ -6,7 +6,7 @@
"message": "Versión, centro de soporte técnico e información de contacto"
},
"acceleratingATransaction": {
"message": "* Usar un precio de gas más alto para acelerar una transacción aumenta las posibilidades de un procesamiento más rápido en la red, pero esto no siempre se garantiza."
"message": "* Usar un precio de gas más alto para acelerar una transacción aumenta las posibilidades de un procesamiento más rápido en la red, pero esto no siempre se garantiza."
},
"acceptTermsOfUse": {
"message": "Leí y estoy de acuerdo con $1",
@ -52,6 +52,10 @@
"addContact": {
"message": "Agregar contacto"
},
"addCustomTokenByContractAddress": {
"message": "¿No encuentra un token? Puede agregar cualquier token si copia su dirección. Puede encontrar la dirección de contrato del token en $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Esto permitirá que la red se utilice en MetaMask."
},
@ -85,7 +89,7 @@
"message": "Agregar a la libreta de direcciones"
},
"addToAddressBookModalPlaceholder": {
"message": "p. ej., John D."
"message": "p. ej., John D."
},
"addToken": {
"message": "Agregar token"
@ -249,12 +253,9 @@
"browserNotSupported": {
"message": "El explorador no es compatible…"
},
"builContactList": {
"buildContactList": {
"message": "Cree su lista de contactos"
},
"builtInCalifornia": {
"message": "MetaMask se diseñó y compiló en California."
},
"buy": {
"message": "Comprar"
},
@ -268,7 +269,7 @@
"message": "Bytes"
},
"canToggleInSettings": {
"message": "Puede volver a activar esta notificación desde Configuración > Alertas."
"message": "Puede volver a activar esta notificación desde Configuración -> Alertas."
},
"cancel": {
"message": "Cancelar"
@ -285,8 +286,11 @@
"chainIdDefinition": {
"message": "El identificador de cadena que se utiliza para firmar transacciones en esta red."
},
"chainIdExistsErrorMsg": {
"message": "En este momento, la red $1 está utilizando este identificador de cadena."
},
"chromeRequiredForHardwareWallets": {
"message": "Debe usar MetaMask en Google Chrome para poder conectarse a su cartera de hardware."
"message": "Debe usar MetaMask en Google Chrome para poder conectarse a su cartera de hardware."
},
"clickToRevealSeed": {
"message": "Haga clic aquí para revelar las palabras secretas"
@ -410,6 +414,9 @@
"continueToWyre": {
"message": "Continuar a Wyre"
},
"contract": {
"message": "Contrato"
},
"contractAddressError": {
"message": "Está enviando tokens a la dirección de contrato del token. Esto puede provocar la pérdida de los tokens."
},
@ -572,7 +579,7 @@
"message": "No volver a mostrar"
},
"downloadGoogleChrome": {
"message": "Descargar Google Chrome"
"message": "Descargar Google Chrome"
},
"downloadSecretBackup": {
"message": "Descargue esta frase secreta de respaldo y guárdela en un medio de almacenamiento o disco duro externo cifrado."
@ -626,6 +633,10 @@
"endOfFlowMessage6": {
"message": "Si necesita volver a crear una copia de seguridad de la frase secreta de recuperación, puede encontrarla en Configuración -> Seguridad."
},
"endOfFlowMessage7": {
"message": "Si tiene preguntas o nota movimientos sospechosos, comuníquese con soporte técnico $1.",
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
},
"endOfFlowMessage8": {
"message": "MetaMask no puede recuperar la frase secreta de recuperación."
},
@ -770,7 +781,7 @@
"message": "El límite de gas es la cantidad máxima de unidades de gas que está dispuesto a gastar."
},
"gasLimitTooLow": {
"message": "El límite de gas debe ser al menos 21 000"
"message": "El límite de gas debe ser al menos 21 000"
},
"gasLimitTooLowWithDynamicFee": {
"message": "El límite de gas debe ser al menos $1",
@ -885,6 +896,16 @@
"importAccountSeedPhrase": {
"message": "Importar una cuenta con la frase secreta de recuperación"
},
"importAccountText": {
"message": "o $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importTokenQuestion": {
"message": "¿Desea importar el token?"
},
"importTokenWarning": {
"message": "Toda persona puede crear un token con cualquier nombre, incluso versiones falsas de tokens existentes. ¡Agréguelo y realice transacciones bajo su propio riesgo!"
},
"importWallet": {
"message": "Importar cartera"
},
@ -956,7 +977,7 @@
"message": "Número no válido. Quite todos los ceros iniciales."
},
"invalidRPC": {
"message": "Dirección URL de RPC no válida"
"message": "Dirección URL de RPC no válida"
},
"invalidSeedPhrase": {
"message": "Frase secreta de recuperación no válida"
@ -1023,7 +1044,7 @@
"message": "Cargando tokens…"
},
"localhost": {
"message": "Host local 8545"
"message": "Host local 8545"
},
"lock": {
"message": "Bloquear"
@ -1110,7 +1131,7 @@
"message": "Escriba su contraseña para confirmar que es usted."
},
"mustSelectOne": {
"message": "Debe seleccionar al menos 1 token."
"message": "Debe seleccionar al menos 1 token."
},
"myAccounts": {
"message": "Mis cuentas"
@ -1160,10 +1181,10 @@
"message": "Agregar y editar redes RPC personalizadas"
},
"networkURL": {
"message": "Dirección URL de la red"
"message": "Dirección URL de la red"
},
"networkURLDefinition": {
"message": "La dirección URL que se utilizó para acceder a esta red."
"message": "La dirección URL que se utilizó para acceder a esta red."
},
"networks": {
"message": "Redes"
@ -1191,7 +1212,7 @@
"message": "Red nueva"
},
"newPassword": {
"message": "Contraseña nueva (mín. de 8 caracteres)"
"message": "Contraseña nueva (mín. de 8 caracteres)"
},
"newToMetaMask": {
"message": "¿Es nuevo en MetaMask?"
@ -1287,6 +1308,22 @@
"message": "Su \"frase de recuperación\" ahora se llama \"frase secreta de recuperación.\"",
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
},
"notifications6DescriptionOne": {
"message": "A partir de la versión 91 de Chrome, la API que habilitaba nuestro soporte para Ledger (U2F) ya no es compatible con carteras de hardware. MetaMask ha implementado un nuevo soporte para Ledger Live mediante el cual usted puede seguir conectándose a su dispositivo Ledger a través de la aplicación de escritorio Ledger Live.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionThree": {
"message": "Cuando interactúe con su cuenta de Ledger a través de MetaMask, se abrirá una nueva pestaña y se le pedirá que abra la aplicación Ledger Live. Una vez que se abra la aplicación, se le pedirá que otorgue permiso para establecer una conexión WebSocket con su cuenta de MetaMask. ¡Eso es todo!",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionTwo": {
"message": "A fin de habilitar el soporte para Live Ledger, haga clic en Configuración > Avanzada > Utilizar Ledger Live.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6Title": {
"message": "Actualización del soporte para Ledger destinada a usuarios de Chrome",
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
},
"ofTextNofM": {
"message": "de"
},
@ -1372,7 +1409,7 @@
"message": "Moneda principal"
},
"primaryCurrencySettingDescription": {
"message": "Seleccione Nativa para dar prioridad a mostrar los valores en la moneda nativa de la cadena (p. ej., ETH). Seleccione Fiduciaria para dar prioridad a mostrar los valores en la moneda fiduciaria seleccionada."
"message": "Seleccione Nativa para dar prioridad a mostrar los valores en la moneda nativa de la cadena (p. ej., ETH). Seleccione Fiduciaria para dar prioridad a mostrar los valores en la moneda fiduciaria seleccionada."
},
"privacyMsg": {
"message": "Política de privacidad"
@ -1414,6 +1451,30 @@
"recipientAddressPlaceholder": {
"message": "Búsqueda, dirección pública (0x) o ENS"
},
"recoveryPhraseReminderBackupStart": {
"message": "Iniciar aquí"
},
"recoveryPhraseReminderConfirm": {
"message": "Entendido"
},
"recoveryPhraseReminderHasBackedUp": {
"message": "Guarde siempre su frase secreta de recuperación en un lugar seguro y secreto."
},
"recoveryPhraseReminderHasNotBackedUp": {
"message": "¿Necesita volver a crear una copia de seguridad de su frase secreta de recuperación?"
},
"recoveryPhraseReminderItemOne": {
"message": "No comparta nunca su frase secreta de recuperación con nadie."
},
"recoveryPhraseReminderItemTwo": {
"message": "El equipo de MetaMask nunca le pedirá su frase secreta de recuperación."
},
"recoveryPhraseReminderSubText": {
"message": "Mediante su frase secreta de recuperación, se controlan todas sus cuentas."
},
"recoveryPhraseReminderTitle": {
"message": "Proteja sus fondos."
},
"reject": {
"message": "Rechazar"
},
@ -1421,7 +1482,7 @@
"message": "Rechazar todo"
},
"rejectTxsDescription": {
"message": "Está a punto de rechazar $1 transacciones en lote."
"message": "Está a punto de rechazar $1 transacciones en lote."
},
"rejectTxsN": {
"message": "Rechazar $1 transacciones"
@ -1439,7 +1500,7 @@
"message": "Quitar cuenta"
},
"removeAccountDescription": {
"message": "Esta cuenta se quitará de la cartera. Antes de continuar, asegúrese de tener la frase secreta de recuperación original o la clave privada de esta cuenta importada. Puede importar o crear cuentas nuevamente desde el menú desplegable de la cuenta."
"message": "Esta cuenta se quitará de la cartera. Antes de continuar, asegúrese de tener la frase secreta de recuperación original o la clave privada de esta cuenta importada. Puede importar o crear cuentas nuevamente en la lista desplegable de la cuenta. "
},
"requestsAwaitingAcknowledgement": {
"message": "solicitudes en espera de confirmación"
@ -1536,11 +1597,47 @@
"message": "Ingrese su frase secreta aquí para restaurar su bóveda."
},
"securityAndPrivacy": {
"message": "Seguridad y privacidad"
"message": "Seguridad y privacidad"
},
"securitySettingsDescription": {
"message": "Configuración de privacidad y frase secreta de recuperación de la cartera"
},
"seedPhraseIntroSidebarBulletFour": {
"message": "Escríbala y guárdela en varios lugares secretos."
},
"seedPhraseIntroSidebarBulletOne": {
"message": "Guárdela en un administrador de contraseñas"
},
"seedPhraseIntroSidebarBulletThree": {
"message": "Guárdela en una caja fuerte."
},
"seedPhraseIntroSidebarBulletTwo": {
"message": "Guárdela en una bóveda bancaria."
},
"seedPhraseIntroSidebarCopyOne": {
"message": "Su frase secreta de recuperación es la “llave maestra” de su cartera y sus fondos."
},
"seedPhraseIntroSidebarCopyThree": {
"message": "Si alguien le pide su frase de recuperación, es posible que tenga intenciones de estafarlo."
},
"seedPhraseIntroSidebarCopyTwo": {
"message": "Nunca comparta su frase secreta de recuperación, ni siquiera con MetaMask."
},
"seedPhraseIntroSidebarTitleOne": {
"message": "¿Qué es una frase de recuperación?"
},
"seedPhraseIntroSidebarTitleThree": {
"message": "¿Debería compartir mi frase de recuperación?"
},
"seedPhraseIntroSidebarTitleTwo": {
"message": "¿Cómo guardo mi frase de recuperación?"
},
"seedPhraseIntroTitle": {
"message": "Proteger su cartera"
},
"seedPhraseIntroTitleCopy": {
"message": "Antes de comenzar, mire este breve video para aprender sobre su frase de recuperación y sobre cómo mantener segura su cartera."
},
"seedPhrasePlaceholder": {
"message": "Separar cada palabra con un solo espacio"
},
@ -1548,7 +1645,7 @@
"message": "Pegar la frase secreta de recuperación desde el Portapapeles"
},
"seedPhraseReq": {
"message": "Las frases secretas de recuperación contienen 12, 15, 18, 21 o 24 palabras"
"message": "Las frases secretas de recuperación contienen 12, 15, 18, 21 o 24 palabras"
},
"selectAHigherGasFee": {
"message": "Seleccione una cuota de gas más alta para acelerar el procesamiento de la transacción.*"
@ -1867,7 +1964,7 @@
"message": "Cuota de MetaMask"
},
"swapMetaMaskFeeDescription": {
"message": "Buscamos el mejor precio en las fuentes de liquidez más importantes, todo el tiempo. Se incorpora de manera automática a esta cotización una cuota del $1 %.",
"message": "Buscamos el mejor precio en las fuentes de liquidez más importantes, todo el tiempo. Se incorpora de manera automática a esta cotización una cuota del $1 %.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
@ -1890,9 +1987,18 @@
"description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts."
},
"swapPriceDifferenceTitle": {
"message": "Diferencia de precio de ~$1 %",
"message": "Diferencia de precio de ~$1 %",
"description": "$1 is a number (ex: 1.23) that represents the price difference."
},
"swapPriceImpactTooltip": {
"message": "El impacto sobre el precio es la diferencia entre el precio actual del mercado y el monto recibido durante la ejecución de la transacción. El impacto sobre el precio es una función del tamaño de su transacción respecto de la dimensión del fondo de liquidez."
},
"swapPriceUnavailableDescription": {
"message": "No se pudo determinar el impacto sobre el precio debido a la falta de datos de los precios del mercado. Antes de realizar el canje, confirme que está de acuerdo con la cantidad de tokens que está a punto de recibir."
},
"swapPriceUnavailableTitle": {
"message": "Antes de continuar, verifique su tasa"
},
"swapProcessing": {
"message": "Procesamiento"
},
@ -1903,7 +2009,7 @@
"message": "Si el precio cambia entre el momento en que hace el pedido y cuando se confirma, se denomina \"desfase\". El canje se cancelará automáticamente si el desfase supera lo establecido en la configuración \"tolerancia de desfase\"."
},
"swapQuoteIncludesRate": {
"message": "La cotización incluye una cuota de MetaMask de $1 %",
"message": "La cotización incluye una cuota de MetaMask de $1 %",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
@ -1994,6 +2100,9 @@
"message": "Canjear $1 por $2",
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
},
"swapTokenVerificationAddedManually": {
"message": "Este token se añadió de forma manual."
},
"swapTokenVerificationMessage": {
"message": "Siempre confirme la dirección del token en $1.",
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
@ -2009,7 +2118,7 @@
"message": "Transacción completa"
},
"swapTwoTransactions": {
"message": "2 transacciones"
"message": "2 transacciones"
},
"swapUnknown": {
"message": "Desconocido"
@ -2026,13 +2135,13 @@
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
},
"swapZeroSlippage": {
"message": "0 % de desfase"
"message": "0 % de desfase"
},
"swapsAdvancedOptions": {
"message": "Opciones avanzadas"
},
"swapsExcessiveSlippageWarning": {
"message": "El monto del desfase es muy alto, por lo que recibirá una tasa de conversión desfavorable. Disminuya su tolerancia de desfase a un valor menor al 15 %."
"message": "El monto del desfase es muy alto, por lo que recibirá una tasa de conversión desfavorable. Disminuya su tolerancia de desfase a un valor menor al 15 %."
},
"swapsMaxSlippage": {
"message": "Tolerancia de desfase"
@ -2072,7 +2181,7 @@
"message": "Símbolo"
},
"symbolBetweenZeroTwelve": {
"message": "El símbolo debe tener 11 caracteres o menos."
"message": "El símbolo debe tener 11 caracteres o menos."
},
"syncWithMobile": {
"message": "Sincronizar con dispositivo móvil"
@ -2261,7 +2370,7 @@
"message": "Las direcciones URL requieren el prefijo HTTP/HTTPS adecuado."
},
"urlExistsErrorMsg": {
"message": "La dirección URL ya está en la lista de redes existentes"
"message": "En este momento, la red $1 está utilizando esta dirección URL."
},
"usePhishingDetection": {
"message": "Usar detección de phishing"
@ -2283,6 +2392,10 @@
"message": "Comprobar este token en $1",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"verifyThisUnconfirmedTokenOn": {
"message": "Verifique este token en $1 y asegúrese de que sea el token con el que quiere realizar la transacción.",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"viewAccount": {
"message": "Ver cuenta"
},
@ -2317,7 +2430,7 @@
"message": "Frase secreta de recuperación de la cartera"
},
"web3ShimUsageNotification": {
"message": "Parece que el sitio web actual intentó utilizar la API de window.web3 que se eliminó. Si el sitio no funciona, haga clic en $1 para obtener más información.",
"message": "Parece que el sitio web actual intentó utilizar la API de window.web3 que se eliminó. Si el sitio no funciona, haga clic en $1 para obtener más información.",
"description": "$1 is a clickable link."
},
"welcome": {

@ -6,7 +6,7 @@
"message": "Versión, centro de soporte técnico e información de contacto"
},
"acceleratingATransaction": {
"message": "* Usar un precio de gas más alto para acelerar una transacción aumenta las posibilidades de un procesamiento más rápido en la red, pero esto no siempre se garantiza."
"message": "* Usar un precio de gas más alto para acelerar una transacción aumenta las posibilidades de un procesamiento más rápido en la red, pero esto no siempre se garantiza."
},
"acceptTermsOfUse": {
"message": "Leí y estoy de acuerdo con $1",
@ -52,6 +52,10 @@
"addContact": {
"message": "Agregar contacto"
},
"addCustomTokenByContractAddress": {
"message": "¿No encuentra un token? Puede agregar cualquier token si copia su dirección. Puede encontrar la dirección de contrato del token en $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Esto permitirá que la red se utilice en MetaMask."
},
@ -85,7 +89,7 @@
"message": "Agregar a la libreta de direcciones"
},
"addToAddressBookModalPlaceholder": {
"message": "p. ej., John D."
"message": "p. ej., John D."
},
"addToken": {
"message": "Agregar token"
@ -249,12 +253,9 @@
"browserNotSupported": {
"message": "El explorador no es compatible…"
},
"builContactList": {
"buildContactList": {
"message": "Cree su lista de contactos"
},
"builtInCalifornia": {
"message": "MetaMask se diseñó y compiló en California."
},
"buy": {
"message": "Comprar"
},
@ -268,7 +269,7 @@
"message": "Bytes"
},
"canToggleInSettings": {
"message": "Puede volver a activar esta notificación desde Configuración > Alertas."
"message": "Puede volver a activar esta notificación desde Configuración -> Alertas."
},
"cancel": {
"message": "Cancelar"
@ -285,8 +286,11 @@
"chainIdDefinition": {
"message": "El identificador de cadena que se utiliza para firmar transacciones en esta red."
},
"chainIdExistsErrorMsg": {
"message": "En este momento, la red $1 está utilizando este identificador de cadena."
},
"chromeRequiredForHardwareWallets": {
"message": "Debe usar MetaMask en Google Chrome para poder conectarse a su cartera de hardware."
"message": "Debe usar MetaMask en Google Chrome para poder conectarse a su cartera de hardware."
},
"clickToRevealSeed": {
"message": "Haga clic aquí para revelar las palabras secretas"
@ -410,6 +414,9 @@
"continueToWyre": {
"message": "Continuar a Wyre"
},
"contract": {
"message": "Contrato"
},
"contractAddressError": {
"message": "Está enviando tokens a la dirección de contrato del token. Esto puede provocar la pérdida de los tokens."
},
@ -572,7 +579,7 @@
"message": "No volver a mostrar"
},
"downloadGoogleChrome": {
"message": "Descargar Google Chrome"
"message": "Descargar Google Chrome"
},
"downloadSecretBackup": {
"message": "Descargue esta frase secreta de respaldo y guárdela en un medio de almacenamiento o disco duro externo cifrado."
@ -774,7 +781,7 @@
"message": "El límite de gas es la cantidad máxima de unidades de gas que está dispuesto a gastar."
},
"gasLimitTooLow": {
"message": "El límite de gas debe ser al menos 21 000"
"message": "El límite de gas debe ser al menos 21 000"
},
"gasLimitTooLowWithDynamicFee": {
"message": "El límite de gas debe ser al menos $1",
@ -893,6 +900,12 @@
"message": "o $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importTokenQuestion": {
"message": "¿Desea importar el token?"
},
"importTokenWarning": {
"message": "Toda persona puede crear un token con cualquier nombre, incluso versiones falsas de tokens existentes. ¡Agréguelo y realice transacciones bajo su propio riesgo!"
},
"importWallet": {
"message": "Importar cartera"
},
@ -964,7 +977,7 @@
"message": "Número no válido. Quite todos los ceros iniciales."
},
"invalidRPC": {
"message": "Dirección URL de RPC no válida"
"message": "Dirección URL de RPC no válida"
},
"invalidSeedPhrase": {
"message": "Frase secreta de recuperación no válida"
@ -1031,7 +1044,7 @@
"message": "Cargando tokens…"
},
"localhost": {
"message": "Host local 8545"
"message": "Host local 8545"
},
"lock": {
"message": "Bloquear"
@ -1118,7 +1131,7 @@
"message": "Escriba su contraseña para confirmar que es usted."
},
"mustSelectOne": {
"message": "Debe seleccionar al menos 1 token."
"message": "Debe seleccionar al menos 1 token."
},
"myAccounts": {
"message": "Mis cuentas"
@ -1168,10 +1181,10 @@
"message": "Agregar y editar redes RPC personalizadas"
},
"networkURL": {
"message": "Dirección URL de la red"
"message": "Dirección URL de la red"
},
"networkURLDefinition": {
"message": "La dirección URL que se utilizó para acceder a esta red."
"message": "La dirección URL que se utilizó para acceder a esta red."
},
"networks": {
"message": "Redes"
@ -1199,7 +1212,7 @@
"message": "Red nueva"
},
"newPassword": {
"message": "Contraseña nueva (mín. de 8 caracteres)"
"message": "Contraseña nueva (mín. de 8 caracteres)"
},
"newToMetaMask": {
"message": "¿Es nuevo en MetaMask?"
@ -1295,6 +1308,22 @@
"message": "Su \"frase de recuperación\" ahora se llama \"frase secreta de recuperación.\"",
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
},
"notifications6DescriptionOne": {
"message": "A partir de la versión 91 de Chrome, la API que habilitaba nuestro soporte para Ledger (U2F) ya no es compatible con carteras de hardware. MetaMask ha implementado un nuevo soporte para Ledger Live mediante el cual usted puede seguir conectándose a su dispositivo Ledger a través de la aplicación de escritorio Ledger Live.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionThree": {
"message": "Cuando interactúe con su cuenta de Ledger a través de MetaMask, se abrirá una nueva pestaña y se le pedirá que abra la aplicación Ledger Live. Una vez que se abra la aplicación, se le pedirá que otorgue permiso para establecer una conexión WebSocket con su cuenta de MetaMask. ¡Eso es todo!",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionTwo": {
"message": "A fin de habilitar el soporte para Live Ledger, haga clic en Configuración > Avanzada > Utilizar Ledger Live.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6Title": {
"message": "Actualización del soporte para Ledger destinada a usuarios de Chrome",
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
},
"ofTextNofM": {
"message": "de"
},
@ -1380,7 +1409,7 @@
"message": "Moneda principal"
},
"primaryCurrencySettingDescription": {
"message": "Seleccione Nativa para dar prioridad a mostrar los valores en la moneda nativa de la cadena (p. ej., ETH). Seleccione Fiduciaria para dar prioridad a mostrar los valores en la moneda fiduciaria seleccionada."
"message": "Seleccione Nativa para dar prioridad a mostrar los valores en la moneda nativa de la cadena (p. ej., ETH). Seleccione Fiduciaria para dar prioridad a mostrar los valores en la moneda fiduciaria seleccionada."
},
"privacyMsg": {
"message": "Política de privacidad"
@ -1422,6 +1451,30 @@
"recipientAddressPlaceholder": {
"message": "Búsqueda, dirección pública (0x) o ENS"
},
"recoveryPhraseReminderBackupStart": {
"message": "Iniciar aquí"
},
"recoveryPhraseReminderConfirm": {
"message": "Entendido"
},
"recoveryPhraseReminderHasBackedUp": {
"message": "Guarde siempre su frase secreta de recuperación en un lugar seguro y secreto."
},
"recoveryPhraseReminderHasNotBackedUp": {
"message": "¿Necesita volver a crear una copia de seguridad de su frase secreta de recuperación?"
},
"recoveryPhraseReminderItemOne": {
"message": "No comparta nunca su frase secreta de recuperación con nadie."
},
"recoveryPhraseReminderItemTwo": {
"message": "El equipo de MetaMask nunca le pedirá su frase secreta de recuperación."
},
"recoveryPhraseReminderSubText": {
"message": "Mediante su frase secreta de recuperación, se controlan todas sus cuentas."
},
"recoveryPhraseReminderTitle": {
"message": "Proteja sus fondos."
},
"reject": {
"message": "Rechazar"
},
@ -1429,7 +1482,7 @@
"message": "Rechazar todo"
},
"rejectTxsDescription": {
"message": "Está a punto de rechazar $1 transacciones en lote."
"message": "Está a punto de rechazar $1 transacciones en lote."
},
"rejectTxsN": {
"message": "Rechazar $1 transacciones"
@ -1544,7 +1597,7 @@
"message": "Ingrese su frase secreta aquí para restaurar su bóveda."
},
"securityAndPrivacy": {
"message": "Seguridad y privacidad"
"message": "Seguridad y privacidad"
},
"securitySettingsDescription": {
"message": "Configuración de privacidad y frase secreta de recuperación de la cartera"
@ -1592,7 +1645,7 @@
"message": "Pegar la frase secreta de recuperación desde el Portapapeles"
},
"seedPhraseReq": {
"message": "Las frases secretas de recuperación contienen 12, 15, 18, 21 o 24 palabras"
"message": "Las frases secretas de recuperación contienen 12, 15, 18, 21 o 24 palabras"
},
"selectAHigherGasFee": {
"message": "Seleccione una cuota de gas más alta para acelerar el procesamiento de la transacción.*"
@ -1911,7 +1964,7 @@
"message": "Cuota de MetaMask"
},
"swapMetaMaskFeeDescription": {
"message": "Buscamos el mejor precio en las fuentes de liquidez más importantes, todo el tiempo. Se incorpora de manera automática a esta cotización una cuota del $1 %.",
"message": "Buscamos el mejor precio en las fuentes de liquidez más importantes, todo el tiempo. Se incorpora de manera automática a esta cotización una cuota del $1 %.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapNQuotes": {
@ -1934,9 +1987,18 @@
"description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts."
},
"swapPriceDifferenceTitle": {
"message": "Diferencia de precio de ~$1 %",
"message": "Diferencia de precio de ~$1 %",
"description": "$1 is a number (ex: 1.23) that represents the price difference."
},
"swapPriceImpactTooltip": {
"message": "El impacto sobre el precio es la diferencia entre el precio actual del mercado y el monto recibido durante la ejecución de la transacción. El impacto sobre el precio es una función del tamaño de su transacción respecto de la dimensión del fondo de liquidez."
},
"swapPriceUnavailableDescription": {
"message": "No se pudo determinar el impacto sobre el precio debido a la falta de datos de los precios del mercado. Antes de realizar el canje, confirme que está de acuerdo con la cantidad de tokens que está a punto de recibir."
},
"swapPriceUnavailableTitle": {
"message": "Antes de continuar, verifique su tasa"
},
"swapProcessing": {
"message": "Procesamiento"
},
@ -1947,7 +2009,7 @@
"message": "Si el precio cambia entre el momento en que hace el pedido y cuando se confirma, se denomina \"desfase\". El canje se cancelará automáticamente si el desfase supera lo establecido en la configuración \"tolerancia de desfase\"."
},
"swapQuoteIncludesRate": {
"message": "La cotización incluye una cuota de MetaMask de $1 %",
"message": "La cotización incluye una cuota de MetaMask de $1 %",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapQuoteNofN": {
@ -2038,6 +2100,9 @@
"message": "Canjear $1 por $2",
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
},
"swapTokenVerificationAddedManually": {
"message": "Este token se añadió de forma manual."
},
"swapTokenVerificationMessage": {
"message": "Siempre confirme la dirección del token en $1.",
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
@ -2053,7 +2118,7 @@
"message": "Transacción completa"
},
"swapTwoTransactions": {
"message": "2 transacciones"
"message": "2 transacciones"
},
"swapUnknown": {
"message": "Desconocido"
@ -2070,13 +2135,13 @@
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
},
"swapZeroSlippage": {
"message": "0 % de desfase"
"message": "0 % de desfase"
},
"swapsAdvancedOptions": {
"message": "Opciones avanzadas"
},
"swapsExcessiveSlippageWarning": {
"message": "El monto del desfase es muy alto, por lo que recibirá una tasa de conversión desfavorable. Disminuya su tolerancia de desfase a un valor menor al 15 %."
"message": "El monto del desfase es muy alto, por lo que recibirá una tasa de conversión desfavorable. Disminuya su tolerancia de desfase a un valor menor al 15 %."
},
"swapsMaxSlippage": {
"message": "Tolerancia de desfase"
@ -2116,7 +2181,7 @@
"message": "Símbolo"
},
"symbolBetweenZeroTwelve": {
"message": "El símbolo debe tener 11 caracteres o menos."
"message": "El símbolo debe tener 11 caracteres o menos."
},
"syncWithMobile": {
"message": "Sincronizar con dispositivo móvil"
@ -2305,7 +2370,7 @@
"message": "Las direcciones URL requieren el prefijo HTTP/HTTPS adecuado."
},
"urlExistsErrorMsg": {
"message": "La dirección URL ya está en la lista de redes existentes"
"message": "En este momento, la red $1 está utilizando esta dirección URL."
},
"usePhishingDetection": {
"message": "Usar detección de phishing"
@ -2327,6 +2392,10 @@
"message": "Comprobar este token en $1",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"verifyThisUnconfirmedTokenOn": {
"message": "Verifique este token en $1 y asegúrese de que sea el token con el que quiere realizar la transacción.",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"viewAccount": {
"message": "Ver cuenta"
},
@ -2361,7 +2430,7 @@
"message": "Frase secreta de recuperación de la cartera"
},
"web3ShimUsageNotification": {
"message": "Parece que el sitio web actual intentó utilizar la API de window.web3 que se eliminó. Si el sitio no funciona, haga clic en $1 para obtener más información.",
"message": "Parece que el sitio web actual intentó utilizar la API de window.web3 que se eliminó. Si el sitio no funciona, haga clic en $1 para obtener más información.",
"description": "$1 is a clickable link."
},
"welcome": {

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Teie lehitsejat ei toetata..."
},
"builtInCalifornia": {
"message": "MetaMask on projekteeritud ja loodud Californias."
},
"buyWithWyre": {
"message": "Ostke ETH-d Wyre'iga"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "مرورگر شما پشتیبانی نمیشود"
},
"builtInCalifornia": {
"message": "MetaMask در کالیفورنیا طراحی و ساخته شده است."
},
"buyWithWyre": {
"message": "ETH را توسط Wyre خریداری نمایید"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Selaintasi ei tueta..."
},
"builtInCalifornia": {
"message": "MetaMask on suunniteltu ja koottu Kaliforniassa."
},
"buyWithWyre": {
"message": "Osta ETH:ta Wyrella"
},

@ -128,9 +128,6 @@
"browserNotSupported": {
"message": "Hindi sinusuportahan ang iyong Browser..."
},
"builtInCalifornia": {
"message": "Ang MetaMask ay dinisenyo at binuo sa California."
},
"buyWithWyre": {
"message": "Bumili ng ETH gamit ang Wyre"
},

@ -137,9 +137,6 @@
"browserNotSupported": {
"message": "Votre navigateur internet n'est pas supporté..."
},
"builtInCalifornia": {
"message": "MetaMask est designé et developpé en Californie."
},
"buyWithWyre": {
"message": "Acheter ETH avec Wyre"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "הדפדפן שלך אינו נתמך..."
},
"builtInCalifornia": {
"message": "MetaMask תוכנן ונבנה בקליפורניה."
},
"buyWithWyre": {
"message": "רכישת את'ר עם Wyre"
},

@ -52,6 +52,10 @@
"addContact": {
"message": "सपरक ज"
},
"addCustomTokenByContractAddress": {
"message": "टकन नहिल रह? आप अपन पतिपककर मअल रप सिकन क सकत। टकन अनध पत $1 पर मिल सकत।",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "इसस इस नटवरक क MetaMask कदर उपयग करन अनमतिि।"
},
@ -249,12 +253,9 @@
"browserNotSupported": {
"message": "आपकउजर समरित नह..."
},
"builContactList": {
"buildContactList": {
"message": "अपनपरक स बन"
},
"builtInCalifornia": {
"message": "MetaMask किििइन और निित कि गय।"
},
"buy": {
"message": "खर"
},
@ -285,6 +286,9 @@
"chainIdDefinition": {
"message": "इस नटवरक किए लन-दन पर हसषर करनिए उपयग कन ID।"
},
"chainIdExistsErrorMsg": {
"message": "यह चन ID वरतमन म $1 नटवरक द उपयग कि।"
},
"chromeRequiredForHardwareWallets": {
"message": "अपनडवयर वट स कनट करनिए आपक Google Chrome पर MetaMask क उपयग करन आवशयकत।"
},
@ -410,6 +414,9 @@
"continueToWyre": {
"message": "Wyre पर ज रख"
},
"contract": {
"message": "अनध"
},
"contractAddressError": {
"message": "आप टकन क अनध पत पर टकन भज रह। इसक परिमसवरप इन टकनकसन ह सकत।"
},
@ -624,7 +631,11 @@
"message": "फििग सवधन रह! MetaMask कभ अनस ह आपकत रिकवर नह।"
},
"endOfFlowMessage6": {
"message": "यदि आपक अपनत रिकवरिर सकअप ल आवशयकत, त आप इसिस -> सरक सकत।"
"message": "यदि आपक अपनत रिकवरिर सकअप ल आवशयकत, त आप इसिग -> सरक सकत।"
},
"endOfFlowMessage7": {
"message": "यदि आपक कभछ पछनछ गडबड लग, त हम सहयत $1 सपरक कर।",
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
},
"endOfFlowMessage8": {
"message": "MetaMask आपकत रिकवरनरत नह कर सकत।"
@ -885,6 +896,16 @@
"importAccountSeedPhrase": {
"message": "गत रिकवरथ एक ख आयत कर"
},
"importAccountText": {
"message": "य $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importTokenQuestion": {
"message": "टकन क आयत कर?"
},
"importTokenWarning": {
"message": "कई भिम कथ एक टकन बन सकत, जिसमकन क नकलकरण शिल ह। अपनिम पर ज और वर कर!"
},
"importWallet": {
"message": "वट आयत कर"
},
@ -1287,6 +1308,22 @@
"message": "आपक \"सड फ\" क अब आपक \"गत रिकवर\" कह।",
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
},
"notifications6DescriptionOne": {
"message": "Chrome ककरण 91 स, वह API ज हम Ledger सपट (U2F) क सकषम करत वह अब हडवयर वट क समरथन नह करत। MetaMask न एक नय Ledger Live सपट लि, जिसक मदद स आप Ledger Live डकटप ऐप कयम स अपन Ledger डिइस स कनट करन रख सकत।",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionThree": {
"message": "MetaMask म अपन Ledger ख पर कम करत समय, एक नयब खल जएग और आपक Ledger Live ऐप खलनिए कहएग। ऐप खलनद, आपक अपन MetaMask खिए एक WebSocket कनशन क अनमतििए कहएग। बस इतन!",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionTwo": {
"message": "आप सिग > उननत > Ledger Live क उपयग कर पर किक करक Ledger Live सहयत सकषम कर सकत।",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6Title": {
"message": "Chrome उपयगकरिए Ledger सहयत अदयतन",
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
},
"ofTextNofM": {
"message": "/"
},
@ -1414,6 +1451,30 @@
"recipientAddressPlaceholder": {
"message": "खज, सवजनिक पत (0x) य ENS"
},
"recoveryPhraseReminderBackupStart": {
"message": "यहभ कर"
},
"recoveryPhraseReminderConfirm": {
"message": "समझ गय"
},
"recoveryPhraseReminderHasBackedUp": {
"message": "अपनत रिकवर हमरकित और गत सन पर रख।"
},
"recoveryPhraseReminderHasNotBackedUp": {
"message": "अपनत रिकवरिर सकअप करन आवशयकत?"
},
"recoveryPhraseReminderItemOne": {
"message": "कभ अपनत रिकवरिथ स न कर"
},
"recoveryPhraseReminderItemTwo": {
"message": "MetaMask टम कभ आपकत रिकवर नह"
},
"recoveryPhraseReminderSubText": {
"message": "आपकत रिकवर आपक सभिित करत।"
},
"recoveryPhraseReminderTitle": {
"message": "अपन धन करकित रख"
},
"reject": {
"message": "असर कर"
},
@ -1541,6 +1602,42 @@
"securitySettingsDescription": {
"message": "गपनयतिस और वट कत रिकवर"
},
"seedPhraseIntroSidebarBulletFour": {
"message": "लिख ल और कई गत सर कर।"
},
"seedPhraseIntroSidebarBulletOne": {
"message": "पसवरड मजर म सह"
},
"seedPhraseIntroSidebarBulletThree": {
"message": "सििट बस मर कर।"
},
"seedPhraseIntroSidebarBulletTwo": {
"message": "बक कि रख।"
},
"seedPhraseIntroSidebarCopyOne": {
"message": "आपकिकवर आपकट और धन किए “मटर क” ह।"
},
"seedPhraseIntroSidebarCopyThree": {
"message": "यदिई वयकि आपकिकवरगत, त सबस अधिक सवनि आपकरयस कर रह।"
},
"seedPhraseIntroSidebarCopyTwo": {
"message": "कभ अपनिकवर न कर, MetaMask कथ भ नह!"
},
"seedPhraseIntroSidebarTitleOne": {
"message": "रिकवर?"
},
"seedPhraseIntroSidebarTitleThree": {
"message": "क अपनिकवर करनिए?"
},
"seedPhraseIntroSidebarTitleTwo": {
"message": "म अपनिकवर सह?"
},
"seedPhraseIntroTitle": {
"message": "अपनट करकित कर"
},
"seedPhraseIntroTitleCopy": {
"message": "शआत करन पहल, अपनिकवर और अपनट करकित रखन तरननिए यह छ-सि।"
},
"seedPhrasePlaceholder": {
"message": "परतक शबद क एक रिि अलग कर"
},
@ -2003,6 +2100,9 @@
"message": "$1 स $2 मप कर",
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
},
"swapTokenVerificationAddedManually": {
"message": "इस टकन कअल रप स गय।"
},
"swapTokenVerificationMessage": {
"message": "हम $1 पर टकन पति कर।",
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
@ -2270,7 +2370,7 @@
"message": "URL क उपयत HTTP/HTTPS उपसरग क आवशयकत।"
},
"urlExistsErrorMsg": {
"message": "URL नटवरक क पहलद ह"
"message": "यह URL वरतमन म $1 नटवरक द उपयग कि"
},
"usePhishingDetection": {
"message": "फििग डिशन क उपयग कर"
@ -2292,6 +2392,10 @@
"message": "इस टकन क $1 पर सतित कर",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"verifyThisUnconfirmedTokenOn": {
"message": "इस टकन क $1 पर सतित कर और सिित करि यह वहकन हिसस आप वर करनहत।",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"viewAccount": {
"message": "ख"
},
@ -2325,6 +2429,10 @@
"walletSeedRestore": {
"message": "वट कत रिकवर"
},
"web3ShimUsageNotification": {
"message": "हमनि वरतमन वबसइट न हटए गए window.web3 API क उपयग करनिश क। यदिइट म गडबड लगत, तपय अधिक जनकिए $1 पर किक कर।",
"description": "$1 is a clickable link."
},
"welcome": {
"message": "MetaMask म आपकगत ह"
},

@ -43,9 +43,6 @@
"blockiesIdenticon": {
"message": "बज पहचन क उपयग कर"
},
"builtInCalifornia": {
"message": "मक किििइन और बन गय।"
},
"cancel": {
"message": "रदद कर"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Vaš se preglednik ne podržava..."
},
"builtInCalifornia": {
"message": "MetaMask je osmišljen i izrađen u Kaliforniji."
},
"buyWithWyre": {
"message": "Kupi ETH Wyerom"
},

@ -73,9 +73,6 @@
"browserNotSupported": {
"message": "Navigatè ou a pa sipòte..."
},
"builtInCalifornia": {
"message": "MetaMask fèt e bati nan California."
},
"cancel": {
"message": "Anile"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Az ön böngészője nem támogatott..."
},
"builtInCalifornia": {
"message": "A MetaMaskot Kaliforniában tervezték és hozták létre."
},
"buyWithWyre": {
"message": "Vásároljon ETH-t a Wyre-rel"
},

@ -52,6 +52,10 @@
"addContact": {
"message": "Tambah kontak"
},
"addCustomTokenByContractAddress": {
"message": "Tidak dapat menemukan token? Anda dapat menambahkan token secara manual dengan menempelkan alamatnya. Alamat kontrak token dapat ditemukan di $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Ini akan memungkinkan jaringan ini digunakan dengan MetaMask."
},
@ -249,12 +253,9 @@
"browserNotSupported": {
"message": "Browser Anda tidak didukung..."
},
"builContactList": {
"buildContactList": {
"message": "Buat daftar kontak Anda"
},
"builtInCalifornia": {
"message": "MetaMask didesain dan didirikan di California."
},
"buy": {
"message": "Beli"
},
@ -285,6 +286,9 @@
"chainIdDefinition": {
"message": "ID rantai digunakan untuk menandatangani transaksi untuk jaringan ini."
},
"chainIdExistsErrorMsg": {
"message": "ID Rantai ini saat ini digunakan oleh jaringan $1."
},
"chromeRequiredForHardwareWallets": {
"message": "Anda perlu menggunakan MetaMask di Google Chrome untuk terhubung ke Dompet Perangkat Keras Anda."
},
@ -410,6 +414,9 @@
"continueToWyre": {
"message": "Lanjutkan ke Wyre"
},
"contract": {
"message": "Kontrak"
},
"contractAddressError": {
"message": "Anda mengirim token ke alamat kontrak token. Ini dapat mengakibatkan token ini hilang."
},
@ -626,6 +633,10 @@
"endOfFlowMessage6": {
"message": "Jika Anda perlu mencadangkan Frasa Pemulihan Rahasia lagi, Anda dapat menemukannya di Pengaturan -> Keamanan."
},
"endOfFlowMessage7": {
"message": "Jika Anda memiliki pertanyaan atau melihat sesuatu yang mencurigakan, hubungi dukungan $1 kami.",
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
},
"endOfFlowMessage8": {
"message": "MetaMask tidak dapat memulihkan Frasa Pemulihan Rahasia Anda."
},
@ -885,6 +896,16 @@
"importAccountSeedPhrase": {
"message": "Impor akun dengan Frasa Pemulihan Rahasia"
},
"importAccountText": {
"message": "atau $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importTokenQuestion": {
"message": "Impor token?"
},
"importTokenWarning": {
"message": "Siapa pun dapat membuat token dengan nama apa pun, termasuk versi palsu dari token yang ada. Tambahkan dan perdagangkan dengan risiko Anda sendiri!"
},
"importWallet": {
"message": "Impor dompet"
},
@ -1287,6 +1308,22 @@
"message": "\"Frasa Pemulihan\" Anda kini disebut \"Frasa Pemulihan Rahasia.\"",
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
},
"notifications6DescriptionOne": {
"message": "Pada Chrome versi 91, API yang memungkinkan dukungan Ledger (U2F) kami tidak lagi mendukung dompet perangkat keras. MetaMask telah menerapkan dukungan Ledger Live baru yang memungkinkan Anda terus terhubung ke perangkat Ledger Anda melalui aplikasi desktop Ledger Live.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionThree": {
"message": "Saat berinteraksi dengan akun Ledger Anda di MetaMask, tab baru akan terbuka dan Anda akan diminta untuk membuka aplikasi Ledger Live. Setelah aplikasi tersebut terbuka, Anda akan diminta untuk mengizinkan koneksi WebSocket ke akun MetaMask Anda. Tidak diperlukan tindakan lebih lanjut.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionTwo": {
"message": "Anda dapat mengaktifkan dukungan Ledger Live dengan mengklik Pengaturan > Lanjutan > Gunakan Ledger Live.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6Title": {
"message": "Pembaruan Dukungan Ledger untuk Pengguna Chrome",
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
},
"ofTextNofM": {
"message": "dari"
},
@ -1414,6 +1451,30 @@
"recipientAddressPlaceholder": {
"message": "Cari, alamat publik (0x), atau ENS"
},
"recoveryPhraseReminderBackupStart": {
"message": "Mulai di sini"
},
"recoveryPhraseReminderConfirm": {
"message": "Mengerti"
},
"recoveryPhraseReminderHasBackedUp": {
"message": "Jaga selalu Frasa Pemulihan Rahasia Anda di tempat yang aman dan rahasia"
},
"recoveryPhraseReminderHasNotBackedUp": {
"message": "Perlu mencadangkan Frasa Pemulihan Rahasia Anda lagi?"
},
"recoveryPhraseReminderItemOne": {
"message": "Jangan membagikan Frasa Pemulihan Rahasia Anda kepada siapa pun"
},
"recoveryPhraseReminderItemTwo": {
"message": "Tim MetaMask tidak akan pernah meminta Frasa Pemulihan Rahasia Anda"
},
"recoveryPhraseReminderSubText": {
"message": "Frasa Pemulihan Rahasia Anda mengendalikan semua akun Anda."
},
"recoveryPhraseReminderTitle": {
"message": "Lindungi dana Anda"
},
"reject": {
"message": "Tolak"
},
@ -1439,7 +1500,7 @@
"message": "Hapus akun"
},
"removeAccountDescription": {
"message": "Akun ini akan dihapus dari dompet Anda. Pastikan Anda memiliki Frasa Pemulihan Rahasia asli atau kunci privat untuk akun impor ini sebelum melanjutkan. Anda dapat mengimpor atau membuat akun lagi dari drop down akun. "
"message": "Akun ini akan dihapus dari dompet Anda. Pastikan Anda memiliki Frasa Pemulihan Rahasia asli atau kunci privat untuk akun impor ini sebelum melanjutkan. Anda dapat mengimpor atau membuat akun lagi dari akun drop down. "
},
"requestsAwaitingAcknowledgement": {
"message": "permintaan menunggu untuk diakui"
@ -1541,6 +1602,42 @@
"securitySettingsDescription": {
"message": "Pengaturan privasi dan Frasa Pemulihan Rahasia dompet"
},
"seedPhraseIntroSidebarBulletFour": {
"message": "Tuliskan dan simpan di beberapa tempat rahasia."
},
"seedPhraseIntroSidebarBulletOne": {
"message": "Simpan dalam pengelola kata sandi"
},
"seedPhraseIntroSidebarBulletThree": {
"message": "Simpan di kotak deposit yang aman."
},
"seedPhraseIntroSidebarBulletTwo": {
"message": "Simpan di vault bank."
},
"seedPhraseIntroSidebarCopyOne": {
"message": "Frasa pemulihan Anda adalah “kunci induk” ke dompet dan dana Anda."
},
"seedPhraseIntroSidebarCopyThree": {
"message": "Jika seseorang menanyakan frasa pemulihan Anda, kemungkinan mereka akan mencoba menipu Anda."
},
"seedPhraseIntroSidebarCopyTwo": {
"message": "Jangan pernah membagikan frasa pemulihan Anda bahkan kepada MetaMask!"
},
"seedPhraseIntroSidebarTitleOne": {
"message": "Apa itu frasa pemulihan?"
},
"seedPhraseIntroSidebarTitleThree": {
"message": "Haruskah saya membagikan frasa pemulihan saya?"
},
"seedPhraseIntroSidebarTitleTwo": {
"message": "Bagaimana cara menyimpan frasa pemulihan saya?"
},
"seedPhraseIntroTitle": {
"message": "Amankan dompet Anda"
},
"seedPhraseIntroTitleCopy": {
"message": "Sebelum memulai, lihat video singkat ini untuk mempelajari tentang frasa pemulihan Anda dan cara menjaga keamanan dompet Anda."
},
"seedPhrasePlaceholder": {
"message": "Pisahkan setiap kata dengan satu spasi"
},
@ -2003,6 +2100,9 @@
"message": "Tukar $1 untuk $2",
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
},
"swapTokenVerificationAddedManually": {
"message": "Token ini telah ditambahkan secara manual."
},
"swapTokenVerificationMessage": {
"message": "Selalu konfirmasikan alamat token di $1.",
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
@ -2270,7 +2370,7 @@
"message": "URL memerlukan awalan HTTP/HTTPS yang sesuai."
},
"urlExistsErrorMsg": {
"message": "URL sudah ada dalam daftar jaringan yang ada"
"message": "URL ini saat ini digunakan oleh jaringan $1."
},
"usePhishingDetection": {
"message": "Menggunakan Deteksi Phishing"
@ -2292,6 +2392,10 @@
"message": "Verifikasikan token ini di $1",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"verifyThisUnconfirmedTokenOn": {
"message": "Verifikasi token ini di $1 dan pastikan ini adalah token yang ingin Anda perdagangkan.",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"viewAccount": {
"message": "Lihat Akun"
},
@ -2325,6 +2429,10 @@
"walletSeedRestore": {
"message": "Frasa Pemulihan Rahasia Dompet"
},
"web3ShimUsageNotification": {
"message": "Kami melihat situs web saat ini mencoba menggunakan API window.web3 yang dihapus. Jika situs tersebut tampak bermasalah, silakan klik $1 untuk informasi selengkapnya.",
"description": "$1 is a clickable link."
},
"welcome": {
"message": "Selamat datang di MetaMask"
},

@ -217,9 +217,6 @@
"browserNotSupported": {
"message": "Il tuo Browser non è supportato..."
},
"builtInCalifornia": {
"message": "MetaMask è progettato e realizzato in California."
},
"buy": {
"message": "Compra"
},

@ -52,6 +52,10 @@
"addContact": {
"message": "連絡先の追加"
},
"addCustomTokenByContractAddress": {
"message": "トークンを発見できませんか?アドレスをペーストすることで手動でトークンを追加することができます。トークン コントラクト アドレスは $1 にあります。",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "これにより、このネットワークは MetaMask 内で使用できるようになります。"
},
@ -109,7 +113,7 @@
"message": "アグリゲーター ネットワーク料金"
},
"alertDisableTooltip": {
"message": "\"設定 > 警告\" の設定で変更できます"
"message": "これは、[\"設定 > 警告\"] で変更できます"
},
"alertSettingsUnconnectedAccount": {
"message": "選択した未接続のアカウントを使用して Web サイトをブラウズしています"
@ -249,12 +253,9 @@
"browserNotSupported": {
"message": "ご使用のブラウザーはサポートされていません..."
},
"builContactList": {
"buildContactList": {
"message": "連絡先リストを作成する"
},
"builtInCalifornia": {
"message": "MetaMask はカリフォルニアで設計および作成されました。"
},
"buy": {
"message": "購入"
},
@ -285,6 +286,9 @@
"chainIdDefinition": {
"message": "このネットワークのトランザクションの署名に使用されるチェーン ID。"
},
"chainIdExistsErrorMsg": {
"message": "このチェーン ID は現在 $1 ネットワークで使用しています。"
},
"chromeRequiredForHardwareWallets": {
"message": "ハードウェア ウォレットに接続するには、MetaMask on Google Chrome を使用する必要があります。"
},
@ -410,6 +414,9 @@
"continueToWyre": {
"message": "Wyre に進む"
},
"contract": {
"message": "コントラクト"
},
"contractAddressError": {
"message": "トークンのコントラクト アドレスにトークンを送信しています。これにより、これらのトークンが失われる可能性があります。"
},
@ -624,7 +631,11 @@
"message": "フィッシングにご注意ください!MetaMask の動作として、シークレット リカバリー フレーズを要求することは絶対にありません。"
},
"endOfFlowMessage6": {
"message": "シークレット リカバリー フレーズを再度バックアップする場合は、[設定] -> [セキュリティとプライバシー] にアクセスしてください。"
"message": "シークレット リカバリー フレーズを再度バックアップする場合は、[設定] -> [セキュリティ] でそれを見つけることができます。"
},
"endOfFlowMessage7": {
"message": "ご質問、または不審な点がある場合は、当社のサポート $1 までお問い合わせください。",
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
},
"endOfFlowMessage8": {
"message": "MetaMask はシークレット リカバリー フレーズを復元できません。"
@ -885,6 +896,16 @@
"importAccountSeedPhrase": {
"message": "シークレット リカバリー フレーズを使用してアカウントをインポートする:"
},
"importAccountText": {
"message": "または $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importTokenQuestion": {
"message": "トークンをインポートしますか?"
},
"importTokenWarning": {
"message": "誰でも既存のトークンの偽バージョンを含めて、任意の名前でトークンを作成することができます。自己責任で追加およびトレードしてください。"
},
"importWallet": {
"message": "ウォレットのインポート"
},
@ -1287,6 +1308,22 @@
"message": "これで、\"シード フレーズ\" は \"シークレット リカバリー フレーズ\" と呼ばれます。",
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
},
"notifications6DescriptionOne": {
"message": "Chrome バージョン 91 以降は、レジャーのサポート (U2F) を可能にした API がハードウェア ウォレットをサポートしなくなります。MetaMask では、ユーザーがレジャー ライブのデスクトップ アプリを介して、レジャー デバイスに継続的に接続することができる新しいレジャー ライブのサポートを導入しました。",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionThree": {
"message": "MetaMask のレジャーのアカウントを使用する際は、新しいタブが開き、レジャー ライブのアプリを開くよう指示されます。アプリが開いたら、WebSocket 接続を MetaMask のアカウントに許可するよう指示されます。以上です。",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionTwo": {
"message": "[設定] > [詳細] > [レジャー ライブを使用] の順にクリックすることで、レジャー ライブのサポートを有効にすることができます。",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6Title": {
"message": "Chrome ユーザー向けのレジャーのサポートの更新",
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
},
"ofTextNofM": {
"message": "中の"
},
@ -1414,6 +1451,30 @@
"recipientAddressPlaceholder": {
"message": "検索、パブリック アドレス (0x)、または ENS"
},
"recoveryPhraseReminderBackupStart": {
"message": "ここから開始"
},
"recoveryPhraseReminderConfirm": {
"message": "OK"
},
"recoveryPhraseReminderHasBackedUp": {
"message": "シークレット リカバリー フレーズは常に安全かつ秘密の場所に保管してください"
},
"recoveryPhraseReminderHasNotBackedUp": {
"message": "シークレット リカバリー フレーズのバックアップが必要ですか?"
},
"recoveryPhraseReminderItemOne": {
"message": "シークレット リカバリー フレーズは誰とも決して共有しないでください"
},
"recoveryPhraseReminderItemTwo": {
"message": "MetaMask チームが、ユーザーのシークレット リカバリー フレーズを確認することは絶対にありません"
},
"recoveryPhraseReminderSubText": {
"message": "シークレット リカバリー フレーズは、ご利用のすべてのアカウントを制御します。"
},
"recoveryPhraseReminderTitle": {
"message": "資産を保護してください"
},
"reject": {
"message": "拒否"
},
@ -1541,6 +1602,42 @@
"securitySettingsDescription": {
"message": "プライバシーの設定とシークレット リカバリー フレーズ"
},
"seedPhraseIntroSidebarBulletFour": {
"message": "書き留めて、複数の秘密の場所に保存します。"
},
"seedPhraseIntroSidebarBulletOne": {
"message": "パスワード マネージャーに保存する"
},
"seedPhraseIntroSidebarBulletThree": {
"message": "セーフティ ボックスに保管する。"
},
"seedPhraseIntroSidebarBulletTwo": {
"message": "銀行の金庫に保管する。"
},
"seedPhraseIntroSidebarCopyOne": {
"message": "あなたのリカバリー フレーズは、ウォレットと資金への「マスターキー」です。"
},
"seedPhraseIntroSidebarCopyThree": {
"message": "誰かがあなたのリカバリー フレーズを尋ねてきたら、おそらくあなたを騙そうとしているのです。"
},
"seedPhraseIntroSidebarCopyTwo": {
"message": "MetaMask を共有しても、リカバリ フレーズは決して共有しないでください。"
},
"seedPhraseIntroSidebarTitleOne": {
"message": "リカバリー フレーズとは何ですか?"
},
"seedPhraseIntroSidebarTitleThree": {
"message": "リカバリーフレーズは共有すべきですか?"
},
"seedPhraseIntroSidebarTitleTwo": {
"message": "リカバリー フレーズはどのように保存すべきですか?"
},
"seedPhraseIntroTitle": {
"message": "ウォレットの保護"
},
"seedPhraseIntroTitleCopy": {
"message": "始める前に、この短いビデオを見て、リカバリー フレーズとウォレットを安全に保つ方法について確認してください。"
},
"seedPhrasePlaceholder": {
"message": "単語ごとにスペースを 1 つ置いて分離します"
},
@ -1893,6 +1990,15 @@
"message": "約 $1% の価格差",
"description": "$1 is a number (ex: 1.23) that represents the price difference."
},
"swapPriceImpactTooltip": {
"message": "プライスインパクトとは、現在の市場価格と取引の約定時に受け取った金額の差のことです。プライスインパクトとは、流動性プールの大きさに対するあなたのトレードの大きさを表わす関数です。"
},
"swapPriceUnavailableDescription": {
"message": "市場価格のデータが不足しているため、プライスインパクトを測定できませんでした。スワップする前に、これから受領するトークンの額に問題がないか確認してください。"
},
"swapPriceUnavailableTitle": {
"message": "続行する前にレートを確認してください"
},
"swapProcessing": {
"message": "処理中"
},
@ -1994,6 +2100,9 @@
"message": "$1 を $2 にスワップ",
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
},
"swapTokenVerificationAddedManually": {
"message": "このトークンは手動で追加されました。"
},
"swapTokenVerificationMessage": {
"message": "常に $1 のトークン アドレスを確認してください。",
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
@ -2261,7 +2370,7 @@
"message": "URL には適切な HTTP/HTTPS プレフィックスが必要です。"
},
"urlExistsErrorMsg": {
"message": "URL はネットワークの既存のリストに既に存在します"
"message": "この URL は現在 $1 ネットワークで使用しています。"
},
"usePhishingDetection": {
"message": "フィッシング検出を使用"
@ -2283,6 +2392,10 @@
"message": "このトークンを $1 で検証",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"verifyThisUnconfirmedTokenOn": {
"message": "このトークンを $1 で検証して、それがトレードしたいトークンであることを確認してください。",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"viewAccount": {
"message": "アカウントを表示"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "ನಿಮ ಬಸರಬಲಿಿಲ..."
},
"builtInCalifornia": {
"message": "MetaMask ಅನಿಸಗಿಸಲಿ ಮತಿಿದಲಿಿಿಸಲಿ."
},
"buyWithWyre": {
"message": "Wyre ನಿ ETH ಖರಿಿ"
},

File diff suppressed because it is too large Load Diff

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Jūsų naršyklė neatpažįstama..."
},
"builtInCalifornia": {
"message": "„MetaMask“ suprojektuota ir įdiegta Kalifornijoje."
},
"buyWithWyre": {
"message": "Pirkti ETH su „Wyre“"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Jūsu pārlūkprogramma netiek atbalstīta..."
},
"builtInCalifornia": {
"message": "MetaMask ir izstrādāta un izveidota Kalifornijā."
},
"buyWithWyre": {
"message": "Pirkt ETH ar Wyre"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Pelayar anda tidak disokong..."
},
"builtInCalifornia": {
"message": "MetaMask direka dan dibina di California."
},
"buyWithWyre": {
"message": "Beli ETH dengan Wyre"
},

@ -40,9 +40,6 @@
"blockiesIdenticon": {
"message": "Gebruik Blockies Identicon"
},
"builtInCalifornia": {
"message": "MetaMask is ontworpen en gebouwd in Californië."
},
"cancel": {
"message": "Annuleer"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Nettleseren din støttes ikke ..."
},
"builtInCalifornia": {
"message": "MetaMask ble bygget og designet i California."
},
"buyWithWyre": {
"message": "Kjøp ETH med Wyre"
},

@ -6,7 +6,7 @@
"message": "Bersyon, support center, at impormasyon sa pakikipag-ugnayan"
},
"acceleratingATransaction": {
"message": "* Kapag in-accelerate ang transaksyon sa pamamagitan ng paggamit ng mas mataas na presyo ng gas, mas magiging malaki ang tsansang mas mabilis na maproseso ng network, pero hindi ito palaging ginagarantiya."
"message": "* Kapag in-accelerate ang transaksyon sa pamamagitan ng paggamit ng mas mataas na presyo ng gas, mas magiging malaki ang tsansang mas mabilis na maiproseso ng network, pero hindi ito palaging ginagarantiya."
},
"acceptTermsOfUse": {
"message": "Nabasa ko at sumasang-ayon ako sa $1",
@ -52,6 +52,10 @@
"addContact": {
"message": "Magdagdag ng contact"
},
"addCustomTokenByContractAddress": {
"message": "Walang makitang token? Puwede kang manual na magdagdag ng anumang token sa pamamagitan ng pag-paste ng address nito. Makikita ang mga address ng kontrata ng token sa $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Bibigyang-daan nito na magamit ang network na ito sa MetaMask."
},
@ -249,12 +253,9 @@
"browserNotSupported": {
"message": "Hindi sinusuportahan ang iyong Browser..."
},
"builContactList": {
"buildContactList": {
"message": "Buuin ang iyong listahan ng contact"
},
"builtInCalifornia": {
"message": "Ang MetaMask ay idinisenyo at binuo sa California."
},
"buy": {
"message": "Bumili"
},
@ -285,6 +286,9 @@
"chainIdDefinition": {
"message": "Ginagamit ang chain ID para maglagda ng mga transaksyon para sa network na ito."
},
"chainIdExistsErrorMsg": {
"message": "Kasalukuyang ginagamit ng $1 network ang Chain ID na ito."
},
"chromeRequiredForHardwareWallets": {
"message": "Kailangan mong gamitin ang MetaMask sa Google Chrome para maikonekta sa iyong Hardware Wallet."
},
@ -410,6 +414,9 @@
"continueToWyre": {
"message": "Magpatuloy sa Wyre"
},
"contract": {
"message": "Kontrata"
},
"contractAddressError": {
"message": "Magpapadala ka ng mga token sa address ng kontrata ng token. Posible itong magresulta sa pagkawala ng mga token na ito."
},
@ -641,7 +648,7 @@
"description": "$1 is the return value of eth_chainId from an RPC endpoint"
},
"ensNotFoundOnCurrentNetwork": {
"message": "Hindi nahanapa ang ENS name sa kasalukuyang network. Subukang lumipat sa Ethereum Mainnet."
"message": "Hindi nahanap ang ENS name sa kasalukuyang network. Subukang lumipat sa Ethereum Mainnet."
},
"ensRegistrationError": {
"message": "Nagka-error sa pag-register ng ENS name"
@ -694,7 +701,7 @@
"message": "Mga Tinatantyang Tagal ng Pagproseso"
},
"ethGasPriceFetchWarning": {
"message": "Ibinibigay ang backup na presyo ng gas dahil hindi available ang pangunahing serbisyo sa pagtatantiya ng gas sa ngayon."
"message": "Ibinibigay ang backup na presyo ng gas dahil hindi available ang pangunahing serbisyo sa pagtatantya ng gas sa ngayon."
},
"eth_accounts": {
"message": "Tingnan ang mga address ng iyong mga pinapayagang account (kinakailangan)",
@ -793,7 +800,7 @@
"message": "Sobrang Baba ng Presyo ng Gas"
},
"gasPriceFetchFailed": {
"message": "Hindi nagtagumpay ang pagtatantiya ng presyo ng gas dahil sa error sa network."
"message": "Hindi nagtagumpay ang pagtatantya ng presyo ng gas dahil sa error sa network."
},
"gasPriceInfoTooltipContent": {
"message": "Tinutukoy ng presyo ng gas ang halaga ng Ether na handa mong bayaran para sa bawat unit ng gas."
@ -893,6 +900,12 @@
"message": "o $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importTokenQuestion": {
"message": "Mag-import ng token?"
},
"importTokenWarning": {
"message": "Sinuman ay makakagawa ng token na may anumang pangalan, kasama ang mga pekeng bersyon ng mga token na mayroon na. Magdagdag at mag-trade sa sarili mong pananagutan!"
},
"importWallet": {
"message": "Mag-import ng wallet"
},
@ -1022,7 +1035,7 @@
"message": "Mga Link"
},
"loadMore": {
"message": "Matuto Pa"
"message": "Mag-load Pa"
},
"loading": {
"message": "Nilo-load..."
@ -1127,7 +1140,7 @@
"message": "Pangalan"
},
"needEtherInWallet": {
"message": "Para makaugnayan ang mga decentralized ma application gamit ang MetaMask, kakailanganin mo ang Ether sa iyong wallet."
"message": "Para makaugnayan ang mga decentralized na application gamit ang MetaMask, kakailanganin mo ang Ether sa iyong wallet."
},
"needHelp": {
"message": "Kailangan ng tulong? Makipag-ugnayan sa $1",
@ -1162,7 +1175,7 @@
"message": "Testnet"
},
"networkSettingsChainIdDescription": {
"message": "Ginagaamit ang chain ID sa paglagda ng mga transaksyon. Dapat itong tumugma sa chain ID na ibinalik ng network. Puwede kang maglagay ng decimal o '0x'-prefixed hexadecimal number, pero ipapakita namin ang numero sa decimal."
"message": "Ginagamit ang chain ID sa paglagda ng mga transaksyon. Dapat itong tumugma sa chain ID na ibinalik ng network. Puwede kang maglagay ng decimal o '0x'-prefixed hexadecimal number, pero ipapakita namin ang numero sa decimal."
},
"networkSettingsDescription": {
"message": "Magdagdag at mag-edit ng mga custom na RPC network"
@ -1214,7 +1227,7 @@
"message": "Susunod"
},
"nextNonceWarning": {
"message": "Mas mataas ang noncesa iminumungkahing nonce na $1",
"message": "Mas mataas ang nonce sa iminumungkahing nonce na $1",
"description": "The next nonce according to MetaMask's internal logic"
},
"noAccountsFound": {
@ -1295,6 +1308,22 @@
"message": "Tinatawag na ngayong \"Secret Recovery Phrase\" mo ang iyong \"Seed Phrase.\"",
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
},
"notifications6DescriptionOne": {
"message": "Simula sa Chrome version 91, hindi na susuportahan ng API na nag-enable sa aming Ledger support (U2F) ang mga hardware wallet. Nagpatupad ang MetaMask ng bagong Ledger Live support na nagbibigay-daan sa iyong patuloy na ikonekta ang Ledger device mo sa pamamagitan ng Ledger Live desktop app.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionThree": {
"message": "Kapag ginagamit ang iyong Ledger account sa MetaMask, may bagong tab na magbubukas at hihilingin sa iyong buksan ang Ledger Live app. Kapag nagbukas ang app, hihilingin sa iyong payagan ang isang koneksyon ng WebSocket sa MetaMask account mo. Iyon lang!",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionTwo": {
"message": "Puwede mong i-enable ang Ledger Live support sa pamamagitan ng pag-click sa Mga Setting > Advanced > Gamitin ang Ledger Live.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6Title": {
"message": "Update sa Ledger Support para sa Mga Chrome User",
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
},
"ofTextNofM": {
"message": "ng"
},
@ -1422,6 +1451,30 @@
"recipientAddressPlaceholder": {
"message": "Maghanap, pampublikong address (0x), o ENS"
},
"recoveryPhraseReminderBackupStart": {
"message": "Magsimula rito"
},
"recoveryPhraseReminderConfirm": {
"message": "OK"
},
"recoveryPhraseReminderHasBackedUp": {
"message": "Palaging panatilihin ang iyong Secret Recovery Phrase sa isang ligtas at lihim na lugar"
},
"recoveryPhraseReminderHasNotBackedUp": {
"message": "Kailangan ulit i-back up ang Secret Recovery Phrase mo?"
},
"recoveryPhraseReminderItemOne": {
"message": "Huwag kailanman ipaalam sa iba ang iyong Secret Recovery Phrase"
},
"recoveryPhraseReminderItemTwo": {
"message": "Hindi kailanman hihingin ng MetaMask team ang iyong Secret Recovery Phrase"
},
"recoveryPhraseReminderSubText": {
"message": "Kinokontrol ng iyong Secret Recovery Phrase ang lahat ng iyong account."
},
"recoveryPhraseReminderTitle": {
"message": "Protektahan ang iyong pondo!"
},
"reject": {
"message": "Tanggihan"
},
@ -1866,7 +1919,7 @@
"message": "Ito ay pagtatantya ng bayarin sa network na gagamitin para kumpletuhin ang iyong pag-swap. Posibleng magbago ang aktuwal na halaga ayon sa mga kundisyon ng network."
},
"swapFailedErrorDescriptionWithSupportLink": {
"message": "May mga hindi pagtatagumpay sa transkasyon na nangyayari at narito kami para tumulong. Kung magpapatuloy ang isyung ito, puwede kang makipag-ugnayan sa aming suporta sa customer sa $1 para sa karagdagang tulong.",
"message": "May mga hindi pagtatagumpay sa transaksyon na nangyayari at narito kami para tumulong. Kung magpapatuloy ang isyung ito, puwede kang makipag-ugnayan sa aming suporta sa customer sa $1 para sa karagdagang tulong.",
"description": "This message is shown to a user if their swap fails. The $1 will be replaced by support.metamask.io"
},
"swapFailedErrorTitle": {
@ -1898,7 +1951,7 @@
"message": "Posibleng hindi magtagumpay ang transaksyon, masyadong mababa ang max na slippage."
},
"swapMaxNetworkFeeInfo": {
"message": "Aang “$1” ay ang pinakamalaking gagastusin mo. Kapag volatile ang network, maaaring malaking halaga ito.",
"message": "“$1” ang pinakamalaking gagastusin mo. Kapag volatile ang network, maaaring malaking halaga ito.",
"description": "$1 will be the translation of swapMaxNetworkFees, with the font bolded"
},
"swapMaxNetworkFees": {
@ -2047,6 +2100,9 @@
"message": "I-swap ang $1 sa $2",
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
},
"swapTokenVerificationAddedManually": {
"message": "Manual na idinagdag ang token na ito."
},
"swapTokenVerificationMessage": {
"message": "Palaging kumpirmahin ang address ng token sa $1.",
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
@ -2314,7 +2370,7 @@
"message": "Kinakailangan ng mga URL ang naaangkop na HTTP/HTTPS prefix."
},
"urlExistsErrorMsg": {
"message": "Nasa kasalukuyang listahan ng mga network na ang URL"
"message": "Kasalukuyang ginagamit ng $1 network ang URL na ito."
},
"usePhishingDetection": {
"message": "Gumamit ng Pag-detect ng Phishing"
@ -2336,6 +2392,10 @@
"message": "I-verify ang token na ito sa $1",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"verifyThisUnconfirmedTokenOn": {
"message": "I-verify ang token na ito sa $1 at tiyaking ito ang token na gusto mong i-trade.",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"viewAccount": {
"message": "Tingnan ang Account"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Twoja przeglądarka nie jest obsługiwana..."
},
"builtInCalifornia": {
"message": "MetaMask został zaprojektowany i stworzony w Kaliforni."
},
"buyWithWyre": {
"message": "Kup ETH poprzez Wyre"
},

@ -43,9 +43,6 @@
"blockiesIdenticon": {
"message": "Usar Blockies Identicon"
},
"builtInCalifornia": {
"message": "MetaMask é desenhada e construída na California."
},
"cancel": {
"message": "Cancelar"
},

@ -52,6 +52,10 @@
"addContact": {
"message": "Adicionar contato"
},
"addCustomTokenByContractAddress": {
"message": "Não conseguiu encontrar um token? Cole o endereço para adicionar manualmente qualquer token. Os endereços de contato do token podem ser encontrados em $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Isso permitirá esta rede ser usada dentro do MetaMask."
},
@ -249,12 +253,9 @@
"browserNotSupported": {
"message": "Seu navegador não é compatível..."
},
"builContactList": {
"buildContactList": {
"message": "Crie sua lista de contatos"
},
"builtInCalifornia": {
"message": "O MetaMask é projetado e construído na Califórnia."
},
"buy": {
"message": "Comprar"
},
@ -285,6 +286,9 @@
"chainIdDefinition": {
"message": "O ID da chain usado para assinar transações para essa rede."
},
"chainIdExistsErrorMsg": {
"message": "O ID da chain é usado no momento pela rede $1."
},
"chromeRequiredForHardwareWallets": {
"message": "Você precisa usar MetaMask no Google Chrome para se conectar com sua carteira de hardware."
},
@ -410,6 +414,9 @@
"continueToWyre": {
"message": "Continuar para o Wyre"
},
"contract": {
"message": "Contrato"
},
"contractAddressError": {
"message": "Você está enviando tokens ao endereço de contrato do token. Isso pode resultar na perda destes tokens."
},
@ -626,6 +633,10 @@
"endOfFlowMessage6": {
"message": "Se você precisar fazer backup da sua Frase de recuperação secreta novamente, encontre-a em Configurações -> Segurança."
},
"endOfFlowMessage7": {
"message": "Se você tiver alguma pergunta ou vir algo suspeito, entre em contato com o atendimento ao cliente em $1.",
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
},
"endOfFlowMessage8": {
"message": "O MetaMask não pode recuperar sua Frase de recuperação secreta."
},
@ -885,6 +896,16 @@
"importAccountSeedPhrase": {
"message": "Importe uma conta com a Frase de recuperação secreta"
},
"importAccountText": {
"message": "ou $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importTokenQuestion": {
"message": "Importar token?"
},
"importTokenWarning": {
"message": "Qualquer pessoa pode criar um token com um nome, incluindo versões falsas de tokens existentes. Adicione e negocie, assumindo o risco sozinho!"
},
"importWallet": {
"message": "Importar carteira"
},
@ -961,6 +982,12 @@
"invalidSeedPhrase": {
"message": "Frase de recuperação secreta inválida"
},
"ipfsGateway": {
"message": "Gateway IPFS"
},
"ipfsGatewayDescription": {
"message": "Informe o URL do gateway de CID do IPFS para usar com resolução de conteúdo de ENS."
},
"jsonFile": {
"message": "Arquivo JSON",
"description": "format for importing an account"
@ -1104,7 +1131,7 @@
"message": "Informe sua senha para confirmar que é você mesmo!"
},
"mustSelectOne": {
"message": "Selecione pelo menos 1 token."
"message": "Selecione pelo menos 1 token."
},
"myAccounts": {
"message": "Minhas contas"
@ -1281,8 +1308,24 @@
"message": "A sua \"Frase Semente\" agora é chamada de sua \"Frase Secreta de Recuperação.\"",
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
},
"notifications6DescriptionOne": {
"message": "A partir do Chrome versão 91, a API que permitia nosso suporte ao Ledger (U2F) não é mais compatível com carteiras de hardware. O MetaMask implementou um novo suporte ao Ledger Live que permite continuar conectando o seu dispositivo Ledger device por meio do aplicativo de desktop Ledger Live.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionThree": {
"message": "Ao interagir com sua conta do Ledger no MetaMask, uma nova aba será aberta e você deverá abrir o aplicativo Ledger Live. Quando o aplicativo for aberto, você precisará permitir uma conexão do WebSocket com sua conta do MetaMask. É isso!",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionTwo": {
"message": "Você pode habilitar o suporte do Ledger Live clicando em Configurações > Avançadas > Usar Ledger Live.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6Title": {
"message": "Atualização de suporte do Ledger para usuários do Chrome",
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
},
"ofTextNofM": {
"message": " de "
"message": "de"
},
"off": {
"message": "Desativado"
@ -1408,6 +1451,30 @@
"recipientAddressPlaceholder": {
"message": "Busca, endereço público (0x) ou ENS"
},
"recoveryPhraseReminderBackupStart": {
"message": "Iniciar aqui"
},
"recoveryPhraseReminderConfirm": {
"message": "Entendi"
},
"recoveryPhraseReminderHasBackedUp": {
"message": "Mantenha sempre o sigilo e proteja a sua Frase de Recuperação Secreta."
},
"recoveryPhraseReminderHasNotBackedUp": {
"message": "Precisa fazer backup da sua Frase de recuperação Secreta novamente?"
},
"recoveryPhraseReminderItemOne": {
"message": "Nunca compartilhe a sua Frase de recuperação secreta com ninguém"
},
"recoveryPhraseReminderItemTwo": {
"message": "A equipe do MetaMask jamais pedirá sua Frase de recuperação secreta."
},
"recoveryPhraseReminderSubText": {
"message": "Sua Frase de recuperação secreta controla todas as suas contas."
},
"recoveryPhraseReminderTitle": {
"message": "Proteja seu dinheiro"
},
"reject": {
"message": "Rejeitar"
},
@ -1456,6 +1523,16 @@
"restoreAccountWithSeed": {
"message": "Restaure sua conta com a Frase de recuperação secreta"
},
"restoreWalletPreferences": {
"message": "Encontramos um backup dos seus dados de $1. Gostaria de restaurar as preferências da sua carteira?",
"description": "$1 is the date at which the data was backed up"
},
"retryTransaction": {
"message": "Refazer transação"
},
"reusedTokenNameWarning": {
"message": "O token aqui reutiliza um símbolo de outro token que você observa; isso pode causar confusões ou induzir ao erro."
},
"revealSeedWords": {
"message": "Revelar Frase de recuperação secreta"
},
@ -1525,6 +1602,42 @@
"securitySettingsDescription": {
"message": "Configurações de privacidade e Frase de recuperação secreta"
},
"seedPhraseIntroSidebarBulletFour": {
"message": "Anote e guarde em vários locais secretos."
},
"seedPhraseIntroSidebarBulletOne": {
"message": "Salve em um gerenciador de senhas"
},
"seedPhraseIntroSidebarBulletThree": {
"message": "Guarde dentro de um cofre."
},
"seedPhraseIntroSidebarBulletTwo": {
"message": "Guarde em um cofre-forte bancário."
},
"seedPhraseIntroSidebarCopyOne": {
"message": "A sua frase de recuperação é a “chave-mestra” para sua carteira e seus fundos."
},
"seedPhraseIntroSidebarCopyThree": {
"message": "Caso alguém lhe peça a sua frase de recuperação, essa pessoa provavelmente está tentando dar um golpe em você."
},
"seedPhraseIntroSidebarCopyTwo": {
"message": "Jamais compartilhe a sua frase de recuperação, mesmo com o MetaMask!"
},
"seedPhraseIntroSidebarTitleOne": {
"message": "O que é uma frase de recuperação?"
},
"seedPhraseIntroSidebarTitleThree": {
"message": "Devo compartilhar minha frase de recuperação?"
},
"seedPhraseIntroSidebarTitleTwo": {
"message": "Como salvo minha frase de recuperação?"
},
"seedPhraseIntroTitle": {
"message": "Proteger sua carteira"
},
"seedPhraseIntroTitleCopy": {
"message": "Antes de iniciar, assista esse vídeo curto para aprender sobre sua frase de recuperação e sobre como manter sua carteira segura."
},
"seedPhrasePlaceholder": {
"message": "Separe cada palavra com um único espaço"
},
@ -1987,6 +2100,9 @@
"message": "Swap $1 para $2",
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
},
"swapTokenVerificationAddedManually": {
"message": "Este token foi adicionado manualmente."
},
"swapTokenVerificationMessage": {
"message": "Sempre confirme o endereço do token em $1.",
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
@ -2254,7 +2370,7 @@
"message": "Os URLs precisam do prefixo HTTP/HTTPS adequado."
},
"urlExistsErrorMsg": {
"message": "O URL já está presente na lista de redes existente"
"message": "O ID da chain é usado no momento pela rede $1."
},
"usePhishingDetection": {
"message": "Usar detecção de phishing"
@ -2276,6 +2392,10 @@
"message": "Verificar este token em $1",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"verifyThisUnconfirmedTokenOn": {
"message": "Verifique este token em $1 garanta que seja o token que você deseja negociar.",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"viewAccount": {
"message": "Exibir conta"
},
@ -2309,6 +2429,10 @@
"walletSeedRestore": {
"message": "Frase de recuperação secreta da carteira"
},
"web3ShimUsageNotification": {
"message": "Percebemos que o site atual tentou usar a API window.web3 removida. Se o site parecer estar corrompido, clique em $1 para obter mais informações.",
"description": "$1 is a clickable link."
},
"welcome": {
"message": "Bem-vindo(a) ao MetaMask"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Browserul dvs. nu este compatibil..."
},
"builtInCalifornia": {
"message": "MetaMask este concepută și creată în California."
},
"buyWithWyre": {
"message": "Cumpărați ETH cu Wyre"
},

@ -52,6 +52,10 @@
"addContact": {
"message": "Добавить контакт"
},
"addCustomTokenByContractAddress": {
"message": "Невозможно найти токен? Вы можете вручную добавить любой токен, вставив его адрес. Контактные адреса токена можно найти на $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Это позволит использовать ее в MetaMask."
},
@ -249,12 +253,9 @@
"browserNotSupported": {
"message": "Ваш браузер не поддерживается..."
},
"builContactList": {
"buildContactList": {
"message": "Создайте список контактов"
},
"builtInCalifornia": {
"message": "MetaMask разработан и построен в Калифорнии."
},
"buy": {
"message": "Купить"
},
@ -280,11 +281,14 @@
"message": "Отменено"
},
"chainId": {
"message": "Идентификатор цепи"
"message": "Идентификатор цепочки"
},
"chainIdDefinition": {
"message": "Идентификатор цепочки, используемый для подписания транзакций для этой сети."
},
"chainIdExistsErrorMsg": {
"message": "Этот идентификатор цепочки в настоящее время используется сетью $1."
},
"chromeRequiredForHardwareWallets": {
"message": "Вам необходимо использовать MetaMask в Google Chrome, чтобы подключиться к аппаратному кошельку."
},
@ -410,6 +414,9 @@
"continueToWyre": {
"message": "Продолжить к Wyre"
},
"contract": {
"message": "Контракт"
},
"contractAddressError": {
"message": "Вы отправляете токены на адрес контракта токена. Это может привести к потере токенов."
},
@ -626,6 +633,10 @@
"endOfFlowMessage6": {
"message": "Если вам нужно снова создать резервную копию секретной фразы восстановления, вы можете найти ее в Настройки -> Безопасность."
},
"endOfFlowMessage7": {
"message": "Если у вас возникнут вопросы или вы увидите что-то подозрительное, обратитесь в службу поддержки $1.",
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
},
"endOfFlowMessage8": {
"message": "Просто помните, что MetaMask не может восстановить секретную фразу восстановления."
},
@ -885,6 +896,16 @@
"importAccountSeedPhrase": {
"message": "Импортировать счет с секретной фразой восстановления"
},
"importAccountText": {
"message": "или $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importTokenQuestion": {
"message": "Импортировать токен?"
},
"importTokenWarning": {
"message": "Кто угодно может создать токен с любым именем, включая поддельные версии существующих токенов. Добавляйте и торгуйте на свой страх и риск!"
},
"importWallet": {
"message": "Импортировать кошелек"
},
@ -1287,6 +1308,22 @@
"message": "Исходная фраза теперь называется секретной фразой восстановления.",
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
},
"notifications6DescriptionOne": {
"message": "Начиная с Chrome версии 91, API, обеспечивающий поддержку нашего Ledger (U2F), аппаратные кошельки больше не поддерживаются. MetaMask реализовала новую поддержку Ledger Live, которая позволяет продолжать подключаться к устройству Ledger через настольное приложение Ledger Live.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionThree": {
"message": "При взаимодействии с вашим счетом Ledger в MetaMask откроется новая вкладка, и вам будет предложено открыть приложение Ledger Live. Когда приложение откроется, вам будет предложено разрешить WebSocket-соединение с вашим счетом MetaMask. Вот и все!",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionTwo": {
"message": "Вы можете включить поддержку Ledger Live, нажав «Настройки» > «Дополнительно» > «Использовать Ledger Live».",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6Title": {
"message": "Обновление поддержки Ledger для пользователей Chrome",
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
},
"ofTextNofM": {
"message": "из"
},
@ -1414,6 +1451,30 @@
"recipientAddressPlaceholder": {
"message": "Поиск, публичный адрес (0x) или ENS"
},
"recoveryPhraseReminderBackupStart": {
"message": "Начать здесь"
},
"recoveryPhraseReminderConfirm": {
"message": "Понятно"
},
"recoveryPhraseReminderHasBackedUp": {
"message": "Всегда храните свою секретную фразу восстановления в надежном и секретном месте"
},
"recoveryPhraseReminderHasNotBackedUp": {
"message": "Нужно снова сделать резервную копию секретной фразы восстановления?"
},
"recoveryPhraseReminderItemOne": {
"message": "Никогда никому не сообщайте свою секретную фразу восстановления"
},
"recoveryPhraseReminderItemTwo": {
"message": "Команда MetaMask никогда неожиданно не запросит вашу секретную фразу восстановления"
},
"recoveryPhraseReminderSubText": {
"message": "Ваша секретная фраза восстановления контролирует все ваши счета."
},
"recoveryPhraseReminderTitle": {
"message": "Защитите свои активы"
},
"reject": {
"message": "Отклонить"
},
@ -1473,7 +1534,7 @@
"message": "Токен здесь повторно использует символ из другого токена, который вы смотрите, это может запутать или ввести в заблуждение."
},
"revealSeedWords": {
"message": "Показать секретную фразу восстановления"
"message": "Раскрыть секретную фразу восстановления"
},
"revealSeedWordsDescription": {
"message": "Если вы меняете браузер или переходите на другой компьютер, вам понадобится эта секретная фраза восстановления для доступа к своим счетам. Сохраните ее в безопасном секретном месте."
@ -1541,6 +1602,42 @@
"securitySettingsDescription": {
"message": "Настройки конфиденциальности и секретная фраза восстановления кошелька"
},
"seedPhraseIntroSidebarBulletFour": {
"message": "Запишите и храните в нескольких секретных местах."
},
"seedPhraseIntroSidebarBulletOne": {
"message": "В диспетчере паролей."
},
"seedPhraseIntroSidebarBulletThree": {
"message": "В банковской ячейке."
},
"seedPhraseIntroSidebarBulletTwo": {
"message": "В банковском сейфе."
},
"seedPhraseIntroSidebarCopyOne": {
"message": "Фраза восстановления — это главный ключ к кошельку и средствам в нем."
},
"seedPhraseIntroSidebarCopyThree": {
"message": "Если кто-нибудь интересуется вашей фразой восстановления, этот человек, скорее всего, пытается вас обмануть."
},
"seedPhraseIntroSidebarCopyTwo": {
"message": "Не сообщайте свою фразу восстановления никому, даже сотрудникам MetaMask."
},
"seedPhraseIntroSidebarTitleOne": {
"message": "Что такое фраза восстановления?"
},
"seedPhraseIntroSidebarTitleThree": {
"message": "Можно ли сообщать кому-либо свою фразу восстановления?"
},
"seedPhraseIntroSidebarTitleTwo": {
"message": "Как хранить фразу восстановления?"
},
"seedPhraseIntroTitle": {
"message": "Защитите свой кошелек"
},
"seedPhraseIntroTitleCopy": {
"message": "Прежде чем приступить к работе, посмотрите это короткое видео о том, что такое фраза восстановления и как обезопасить кошелек."
},
"seedPhrasePlaceholder": {
"message": "Отделяйте каждое слово одним пробелом"
},
@ -2003,6 +2100,9 @@
"message": "Своп $1 на $2",
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
},
"swapTokenVerificationAddedManually": {
"message": "Этот токен был добавлен вручную."
},
"swapTokenVerificationMessage": {
"message": "Всегда проверяйте адрес токена на $1.",
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
@ -2270,7 +2370,7 @@
"message": "Для URL требуется соответствующий префикс HTTP/HTTPS."
},
"urlExistsErrorMsg": {
"message": "URL уже присутствует в имеющемся списке сетей"
"message": "Это URL в настоящее время используется сетью $1."
},
"usePhishingDetection": {
"message": "Использовать обнаружение фишинга"
@ -2292,6 +2392,10 @@
"message": "Проверить этот токен на $1",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"verifyThisUnconfirmedTokenOn": {
"message": "Проверьте этот токен на $1 и убедитесь, что это тот токен, которым вы хотите торговать.",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"viewAccount": {
"message": "Посмотреть счет"
},
@ -2325,6 +2429,10 @@
"walletSeedRestore": {
"message": "Секретная фраза восстановления кошелька"
},
"web3ShimUsageNotification": {
"message": "Мы заметили, что текущий веб-сайт пытался использовать удаленный API window.web3. Если сайт не работает, нажмите $1 для получения дополнительной информации.",
"description": "$1 is a clickable link."
},
"welcome": {
"message": "Добро пожаловать в MetaMask"
},

@ -137,9 +137,6 @@
"browserNotSupported": {
"message": "Váš prehliadač nie je podporovaný..."
},
"builtInCalifornia": {
"message": "MetaMask je navržen a vytvořen v Kalifornii."
},
"buyWithWyre": {
"message": "Kúpte ETH s Wyre"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Vaš brskalnik ni podptrt ..."
},
"builtInCalifornia": {
"message": "MetaMask je zasnovan in ustvarjen v Kaliforniji."
},
"buyWithWyre": {
"message": "Kupi ETH z Wyre"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Vaš pregledač nije podržan..."
},
"builtInCalifornia": {
"message": "MetaMask je dizajniran i izgrađen u Kaliforniji."
},
"buyWithWyre": {
"message": "Kupite ETH preko servisa Wyre"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Din webbläsare stöds inte..."
},
"builtInCalifornia": {
"message": "MetaMask är skapat och utformat i Kalifornien."
},
"buyWithWyre": {
"message": "Köp ETH med Wyre"
},

@ -140,9 +140,6 @@
"browserNotSupported": {
"message": "Kivinjari chaku hakiwezeshwi..."
},
"builtInCalifornia": {
"message": "MetaMask imeundwa na kutengenezwa California."
},
"buyWithWyre": {
"message": "Nunua ETH kwa kutumia Wyre"
},

@ -55,9 +55,6 @@
"blockiesIdenticon": {
"message": "பி ஐடி பயன"
},
"builtInCalifornia": {
"message": "மடமஸ வடிவமகபபட கலிிி கடடபபடளத."
},
"cancel": {
"message": "ரத"
},

@ -49,9 +49,6 @@
"blockiesIdenticon": {
"message": "ใชงาน Blockies Identicon"
},
"builtInCalifornia": {
"message": "MetaMask ออกแบบและพฒนาทแคลฟอรเนย"
},
"cancel": {
"message": "ยกเลก"
},

@ -211,9 +211,6 @@
"browserNotSupported": {
"message": "Hindi sinusuportahan ang iyong Browser..."
},
"builtInCalifornia": {
"message": "Ang MetaMask ay idinisenyo at binuo sa California."
},
"buy": {
"message": "Bilhin"
},

@ -46,9 +46,6 @@
"blockiesIdenticon": {
"message": "Blockies Identicon kullan"
},
"builtInCalifornia": {
"message": "MetaMask California'da tasarlandı ve yaratıldı"
},
"cancel": {
"message": "Vazgeç"
},

@ -143,9 +143,6 @@
"browserNotSupported": {
"message": "Ваш браузер не підтримується..."
},
"builtInCalifornia": {
"message": "MetaMask розроблено й створено в Каліфорнії."
},
"buyWithWyre": {
"message": "Купити ETH через Wyre"
},

@ -52,6 +52,10 @@
"addContact": {
"message": "Thêm người liên hệ"
},
"addCustomTokenByContractAddress": {
"message": "Bạn không tìm thấy token? Bạn có thể dán địa chỉ của bất kỳ token nào để thêm token đó theo cách thủ công. Bạn có thể tìm thấy địa chỉ hợp đồng token trên $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Thao tác này sẽ cho phép sử dụng mạng này trong MetaMask."
},
@ -249,12 +253,9 @@
"browserNotSupported": {
"message": "Trình duyệt của bạn không được hỗ trợ..."
},
"builContactList": {
"buildContactList": {
"message": "Xây dựng danh sách liên hệ của bạn"
},
"builtInCalifornia": {
"message": "MetaMask được thiết kế và phát triển tại California."
},
"buy": {
"message": "Mua"
},
@ -285,6 +286,9 @@
"chainIdDefinition": {
"message": "Mã chuỗi được dùng để ký các giao dịch cho mạng này."
},
"chainIdExistsErrorMsg": {
"message": "Mạng $1 hiện đang sử dụng mã chuỗi này."
},
"chromeRequiredForHardwareWallets": {
"message": "Bạn cần sử dụng MetaMask trên Google Chrome để kết nối với Ví cứng của bạn."
},
@ -410,6 +414,9 @@
"continueToWyre": {
"message": "Tiếp tục chuyển đến Wyre"
},
"contract": {
"message": "Hợp đồng"
},
"contractAddressError": {
"message": "Bạn đang gửi token đến địa chỉ hợp đồng của token. Điều này có thể khiến bạn bị mất những token này."
},
@ -624,7 +631,11 @@
"message": "Hãy cẩn thận với hoạt động lừa đảo! MetaMask sẽ không bao giờ tự ý hỏi Cụm mật khẩu khôi phục bí mật của bạn."
},
"endOfFlowMessage6": {
"message": "Nếu bạn cần sao lưu lại Cụm mật khẩu khôi phục bí mật, bạn có thể tìm thấy chức năng này trong Cài đặt -> Bảo mật."
"message": "Nếu bạn cần sao lưu lại Cụm mật khẩu khôi phục bí mật, bạn có thể tìm thấy chức năng này trong phần Cài đặt -> Bảo mật."
},
"endOfFlowMessage7": {
"message": "Nếu bạn có thắc mắc hoặc thấy điều gì đó đáng ngờ, hãy liên hệ với bộ phận hỗ trợ của chúng tôi $1.",
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
},
"endOfFlowMessage8": {
"message": "MetaMask không thể khôi phục Cụm mật khẩu khôi phục bí mật của bạn."
@ -885,6 +896,16 @@
"importAccountSeedPhrase": {
"message": "Nhập một tài khoản bằng Cụm mật khẩu khôi phục bí mật"
},
"importAccountText": {
"message": "hoặc $1",
"description": "$1 represents the text from `importAccountLinkText` as a link"
},
"importTokenQuestion": {
"message": "Bạn muốn nhập token?"
},
"importTokenWarning": {
"message": "Bất kỳ ai cũng tạo được token bằng bất kỳ tên nào, kể cả phiên bản giả của token hiện có. Bạn tự chịu rủi ro khi thêm và giao dịch!"
},
"importWallet": {
"message": "Nhập ví"
},
@ -1287,6 +1308,22 @@
"message": "Từ giờ, \"Cụm mật khẩu gốc\" sẽ được gọi là \"Cụm mật khẩu khôi phục bí mật.\"",
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
},
"notifications6DescriptionOne": {
"message": "Kể từ phiên bản Chrome 91, API từng cho phép hỗ trợ Ledger (U2F) của chúng tôi không còn hỗ trợ ví cứng nữa. MetaMask đã triển khai một tính năng hỗ trợ Ledger Live mới cho phép bạn tiếp tục kết nối với thiết bị Ledger của mình thông qua ứng dụng Ledger Live trên máy tính.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionThree": {
"message": "Khi tương tác với tài khoản Ledger của bạn trong MetaMask, một tab mới sẽ mở ra và bạn sẽ được yêu cầu mở ứng dụng Ledger Live. Khi ứng dụng này mở ra, bạn sẽ được yêu cầu cho phép kết nối WebSocket với tài khoản MetaMask của mình. Đơn giản vậy thôi!",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionTwo": {
"message": "Bạn có thể kích hoạt tính năng hỗ trợ Ledger Live bằng cách nhấp vào phần Cài đặt > Nâng cao > Sử dụng Ledger Live.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6Title": {
"message": "Thông tin cập nhật về việc hỗ trợ Ledger cho người dùng Chrome",
"description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update"
},
"ofTextNofM": {
"message": "trên"
},
@ -1414,6 +1451,30 @@
"recipientAddressPlaceholder": {
"message": "Tìm kiếm, địa chỉ công khai (0x) hoặc ENS"
},
"recoveryPhraseReminderBackupStart": {
"message": "Bắt đầu tại đây"
},
"recoveryPhraseReminderConfirm": {
"message": "Đã hiểu"
},
"recoveryPhraseReminderHasBackedUp": {
"message": "Luôn lưu giữ Cụm mật khẩu khôi phục bí mật ở nơi an toàn và bí mật"
},
"recoveryPhraseReminderHasNotBackedUp": {
"message": "Bạn cần sao lưu lại Cụm mật khẩu khôi phục bí mật?"
},
"recoveryPhraseReminderItemOne": {
"message": "Tuyệt đối không cho ai biết Cụm mật khẩu khôi phục bí mật"
},
"recoveryPhraseReminderItemTwo": {
"message": "Nhóm MetaMask sẽ không bao giờ hỏi Cụm mật khẩu khôi phục bí mật của bạn"
},
"recoveryPhraseReminderSubText": {
"message": "Cụm mật khẩu khôi phục bí mật sẽ kiểm soát mọi thứ trong tài khoản của bạn."
},
"recoveryPhraseReminderTitle": {
"message": "Bảo vệ tiền của bạn"
},
"reject": {
"message": "Từ chối"
},
@ -1439,7 +1500,7 @@
"message": "Xóa tài khoản"
},
"removeAccountDescription": {
"message": "Tài khoản này sẽ được xóa khỏi ví của bạn. Xin đảm bảo rằng bạn có Cụm mật khẩu khôi phục bí mật ban đầu hoặc khóa riêng tư cho tài khoản được nhập trước khi tiếp tục. Bạn có thể nhập hoặc tạo lại tài khoản từ trình đơn tài khoản thả xuống. "
"message": "Tài khoản này sẽ được xóa khỏi ví của bạn. Hãy đảm bảo rằng bạn có Cụm mật khẩu khôi phục bí mật ban đầu hoặc khóa riêng tư cho tài khoản được nhập trước khi tiếp tục. Bạn có thể nhập hoặc tạo lại tài khoản từ trình đơn tài khoản thả xuống. "
},
"requestsAwaitingAcknowledgement": {
"message": "yêu cầu đang chờ xác nhận"
@ -1473,10 +1534,10 @@
"message": "Một token trong đây sử dụng lại ký hiệu của một token khác mà bạn thấy, điều này có thể gây nhầm lẫn hoặc mang tính lừa dối."
},
"revealSeedWords": {
"message": "Hiện cụm mật khẩu khôi phục bí mật"
"message": "Hiện Cụm mật khẩu khôi phục bí mật"
},
"revealSeedWordsDescription": {
"message": "Nếu thay đổi trình duyệt hoặc chuyển máy tính, bạn sẽ cần Cụm mật khẩu khôi phục bí mật này để truy cập tài khoản của mình. Hãy lưu cụm mật khẩu gốc này ở nơi an toàn và bí mật."
"message": "Nếu thay đổi trình duyệt hoặc chuyển máy tính, bạn sẽ cần Cụm mật khẩu khôi phục bí mật này để truy cập tài khoản của mình. Hãy lưu Cụm mật khẩu khôi phục bí mật này ở nơi an toàn và bí mật."
},
"revealSeedWordsTitle": {
"message": "Cụm mật khẩu khôi phục bí mật"
@ -1541,6 +1602,42 @@
"securitySettingsDescription": {
"message": "Các cài đặt quyền riêng tư và Cụm mật khẩu khôi phục bí mật của ví"
},
"seedPhraseIntroSidebarBulletFour": {
"message": "Viết ra và cất ở nhiều nơi bí mật."
},
"seedPhraseIntroSidebarBulletOne": {
"message": "Lưu trong một trình quản lý mật khẩu"
},
"seedPhraseIntroSidebarBulletThree": {
"message": "Lưu giữ trong hộp ký gửi an toàn."
},
"seedPhraseIntroSidebarBulletTwo": {
"message": "Lưu giữ trong két an toàn."
},
"seedPhraseIntroSidebarCopyOne": {
"message": "Cụm mật khẩu khôi phục bí mật là “chìa khóa chính” để truy cập ví và số tiền của bạn."
},
"seedPhraseIntroSidebarCopyThree": {
"message": "Nếu ai đó hỏi bạn cụm mật khẩu khôi phục bí mật, thì họ đang cố gắng lừa đảo bạn."
},
"seedPhraseIntroSidebarCopyTwo": {
"message": "Đừng bao giờ cho ai biết cụm mật khẩu khôi phục bí mật, kể cả MetaMask!"
},
"seedPhraseIntroSidebarTitleOne": {
"message": "Cụm mật khẩu khôi phục là gì?"
},
"seedPhraseIntroSidebarTitleThree": {
"message": "Tôi có nên cho ai biết cụm mật khẩu khôi phục bí mật của mình không?"
},
"seedPhraseIntroSidebarTitleTwo": {
"message": "Tôi lưu cụm mật khẩu khôi phục của mình bằng cách nào?"
},
"seedPhraseIntroTitle": {
"message": "Bảo mật cho ví của bạn"
},
"seedPhraseIntroTitleCopy": {
"message": "Trước khi bắt đầu, hãy xem video ngắn này để tìm hiểu thêm về cụm mật khẩu khôi phục bí mật của bạn và cách bảo vệ ví của bạn."
},
"seedPhrasePlaceholder": {
"message": "Phân tách mỗi từ bằng một dấu cách"
},
@ -1841,7 +1938,7 @@
"message": "Đang hoàn tất..."
},
"swapFromTo": {
"message": "Hoán đổi $1 sang $2",
"message": "Giao dịch hoán đổi $1 sang $2",
"description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token"
},
"swapGasFeesSplit": {
@ -2003,6 +2100,9 @@
"message": "Hoán đổi $1 sang $2",
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
},
"swapTokenVerificationAddedManually": {
"message": "Token này đã được thêm theo cách thủ công."
},
"swapTokenVerificationMessage": {
"message": "Luôn xác nhận địa chỉ token trên $1.",
"description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover."
@ -2270,7 +2370,7 @@
"message": "URL phải có tiền tố HTTP/HTTPS phù hợp."
},
"urlExistsErrorMsg": {
"message": "URL đã có trong danh sách mạng hiện tại"
"message": "Mạng $1 hiện đang sử dụng URL này."
},
"usePhishingDetection": {
"message": "Sử dụng tính năng Phát hiện lừa đảo"
@ -2292,6 +2392,10 @@
"message": "Xác minh token này trên $1",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"verifyThisUnconfirmedTokenOn": {
"message": "Hãy xác minh token này trên $1 và đảm bảo đây là token bạn muốn giao dịch.",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"viewAccount": {
"message": "Xem tài khoản"
},
@ -2325,6 +2429,10 @@
"walletSeedRestore": {
"message": "Cụm mật khẩu khôi phục bí mật của ví"
},
"web3ShimUsageNotification": {
"message": "Chúng tôi nhận thấy rằng trang web hiện tại đã cố dùng API window.web3 đã bị xóa. Nếu trang web có vẻ như đã bị lỗi, vui lòng nhấp vào $1 để biết thêm thông tin.",
"description": "$1 is a clickable link."
},
"welcome": {
"message": "Chào mừng bạn đến với MetaMask"
},

@ -217,9 +217,6 @@
"browserNotSupported": {
"message": "您的浏览器不支持该功能……"
},
"builtInCalifornia": {
"message": "MetaMask在加利福尼亚设计和制造。"
},
"buy": {
"message": "购买"
},

@ -149,9 +149,6 @@
"browserNotSupported": {
"message": "您的瀏覽器尚未支援..."
},
"builtInCalifornia": {
"message": "MetaMask 是在加州設計製造"
},
"buy": {
"message": "買"
},

@ -5,11 +5,13 @@
</head>
<body>
<script src="./globalthis.js" type="text/javascript" charset="utf-8"></script>
<script src="./initSentry.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown.js" type="text/javascript" charset="utf-8"></script>
<script src="./runLockdown.js" type="text/javascript" charset="utf-8"></script>
<script src="./bg-libs.js" type="text/javascript" charset="utf-8"></script>
<script src="./background.js" type="text/javascript" charset="utf-8"></script>
<script src="./sentry-install.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown-install.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown-run.js" type="text/javascript" charset="utf-8"></script>
<script src="./runtime-cjs.js" type="text/javascript" charset="utf-8"></script>
{{@each(it.jsBundles) => val}}
<script src="{{val}}" type="text/javascript" charset="utf-8"></script>
{{/each}}
<script src="./chromereload.js" type="text/javascript" charset="utf-8"></script>
</body>
</html>

@ -11,10 +11,12 @@
<div id="app-content"></div>
<div id="popover-content"></div>
<script src="./globalthis.js" type="text/javascript" charset="utf-8"></script>
<script src="./initSentry.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown.js" type="text/javascript" charset="utf-8"></script>
<script src="./runLockdown.js" type="text/javascript" charset="utf-8"></script>
<script src="./ui-libs.js" type="text/javascript" charset="utf-8"></script>
<script src="./ui.js" type="text/javascript" charset="utf-8"></script>
<script src="./sentry-install.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown-install.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown-run.js" type="text/javascript" charset="utf-8"></script>
<script src="./runtime-cjs.js" type="text/javascript" charset="utf-8"></script>
{{@each(it.jsBundles) => val}}
<script src="{{val}}" type="text/javascript" charset="utf-8"></script>
{{/each}}
</body>
</html>

@ -1,4 +0,0 @@
<svg fill="#f7861c" height="24" viewBox="113.789 0 24.088 24" width="24.088" xmlns="http://www.w3.org/2000/svg">
<path d="M134.613 6.85h-3.499l-2.035-2.009-.006-.006-.004-.003a1.698 1.698 0 00-1.189-.482h-4.23c-.491 0-.93.209-1.238.539l-.003-.005-1.991 1.966h-3.571c-.935 0-1.691.747-1.691 1.667v10c0 .92.757 1.668 1.691 1.668h17.768a1.68 1.68 0 001.691-1.668v-10a1.682 1.682 0 00-1.693-1.667zm.846 11.668a.843.843 0 01-.846.834h-17.768a.841.841 0 01-.846-.834v-10c0-.459.38-.833.846-.833h3.922l.248-.245 1.024-1.011.021.062.971-1.035a.843.843 0 01.618-.271h4.23c.223 0 .435.086.602.247l2.033 2.008.247.245H134.613c.465 0 .846.374.846.833z"/>
<path d="M125.729 9.351c-2.104 0-3.808 1.678-3.808 3.749 0 2.072 1.703 3.752 3.808 3.752 2.104 0 3.808-1.68 3.808-3.752s-1.704-3.749-3.808-3.749zm0 6.667c-1.633 0-2.962-1.31-2.962-2.918s1.329-2.916 2.962-2.916 2.961 1.307 2.961 2.916-1.328 2.918-2.961 2.918z"/>
</svg>

Before

Width:  |  Height:  |  Size: 920 B

@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.6483 7.41741C14.3482 7.41741 15.8272 8.36346 16.5874 9.75779L18.8081 8.36985C17.5833 6.23784 15.2835 4.802 12.6483 4.802C9.11954 4.802 6.19214 7.37666 5.64216 10.7499H2.125C1.50368 10.7499 1 11.2536 1 11.8749C1 12.4962 1.50368 12.9999 2.125 12.9999H5.63386C6.16206 16.3987 9.1014 18.9999 12.6483 18.9999C15.2235 18.9999 17.4784 17.6287 18.7228 15.5766L16.5042 14.1901C15.7225 15.5041 14.2882 16.3845 12.6483 16.3845C10.1721 16.3845 8.16472 14.3772 8.16472 11.901C8.16472 9.42476 10.1721 7.41741 12.6483 7.41741ZM11.7002 11.9999C11.7002 12.5522 12.1479 12.9999 12.7002 12.9999C13.2525 12.9999 13.7002 12.5522 13.7002 11.9999C13.7002 11.4476 13.2525 10.9999 12.7002 10.9999C12.1479 10.9999 11.7002 11.4476 11.7002 11.9999ZM12.7002 14.9999C11.0433 14.9999 9.7002 13.6568 9.7002 11.9999C9.7002 10.3431 11.0433 8.99992 12.7002 8.99992C13.9109 8.99992 14.9542 9.71715 15.4282 10.7499H21.8751C22.4965 10.7499 23.0001 11.2536 23.0001 11.8749C23.0001 12.4962 22.4965 12.9999 21.8751 12.9999H15.5295C15.1177 14.1651 14.0064 14.9999 12.7002 14.9999Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

@ -1,5 +0,0 @@
<svg fill="#f7861c" height="24" viewBox="189.192 0 24.088 24" width="24.088" xmlns="http://www.w3.org/2000/svg">
<path d="M204.655 7.169h-8.962a1.99 1.99 0 00-1.991 1.991v8.963c0 1.1.892 1.99 1.991 1.99h8.962a1.99 1.99 0 001.991-1.99V9.16c0-1.1-.89-1.991-1.991-1.991zm.996 10.954a.995.995 0 01-.996.994h-8.962a.995.995 0 01-.995-.994V9.16c0-.55.446-.996.995-.996h8.962c.55 0 .996.446.996.996z"/>
<path d="M196.689 11.152h6.969v-.996h-6.969zM196.689 13.144h6.969v-.996h-6.969zM196.689 15.135h6.969v-.996h-6.969zM196.689 17.126h3.982v-.994h-3.982z"/>
<path d="M207.643 4.182h-8.962a1.99 1.99 0 00-1.991 1.991h.995c0-.549.446-.996.996-.996h8.962c.549 0 .995.447.995.996v8.962c0 .55-.446.997-.995.997v.994a1.99 1.99 0 001.991-1.991V6.172a1.99 1.99 0 00-1.991-1.99z"/>
</svg>

Before

Width:  |  Height:  |  Size: 783 B

@ -1,3 +0,0 @@
<svg height="48.381" viewBox="0 0 15 45.357" width="16" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0v7.5l10 15-10 15v7.857L15 22.5z" fill="#f7861c" fill-rule="evenodd"/>
</svg>

Before

Width:  |  Height:  |  Size: 186 B

@ -1,3 +0,0 @@
<svg height="24" viewBox="51.64 0 24.088 24" width="24.088" xmlns="http://www.w3.org/2000/svg">
<path d="M67.495 2.012C65.976.858 64.266.461 62.096.461c-1.646 0-3.053.337-4.168 1.087-1.646 1.121-2.419 3.003-2.419 5.979h4.241c0-.794-.078-1.65.385-2.384.465-.734 1.11-1.297 2.22-1.297 1.126 0 1.707.325 2.254.999.464.574.641 1.258.641 1.987 0 .63-.321 1.209-.701 1.734a3.713 3.713 0 01-.834.85s-2.293 1.364-3.098 2.656c-.602.961-.817 2.166-.866 3.606-.006.105.031.32.396.32h3.412s.388-.243.393-.342c.021-.526.089-1.331.183-1.635.182-.575.534-1.076 1.087-1.507l1.144-.791c1.032-.807 1.854-1.463 2.22-1.982.623-.851 1.06-1.899 1.06-3.142-.002-2.024-.749-3.521-2.151-4.587zm-5.691 16.183c-1.431-.044-2.613.95-2.661 2.501-.046 1.557 1.075 2.578 2.512 2.623 1.489.044 2.645-.916 2.688-2.468.045-1.552-1.049-2.612-2.539-2.656z"/>
</svg>

Before

Width:  |  Height:  |  Size: 833 B

@ -1,3 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7.2 5.6H8.8V4H7.2V5.6ZM8 14.4C4.472 14.4 1.6 11.528 1.6 8C1.6 4.472 4.472 1.6 8 1.6C11.528 1.6 14.4 4.472 14.4 8C14.4 11.528 11.528 14.4 8 14.4ZM8 0C6.94943 0 5.90914 0.206926 4.93853 0.608964C3.96793 1.011 3.08601 1.60028 2.34315 2.34315C0.842855 3.84344 0 5.87827 0 8C0 10.1217 0.842855 12.1566 2.34315 13.6569C3.08601 14.3997 3.96793 14.989 4.93853 15.391C5.90914 15.7931 6.94943 16 8 16C10.1217 16 12.1566 15.1571 13.6569 13.6569C15.1571 12.1566 16 10.1217 16 8C16 6.94943 15.7931 5.90914 15.391 4.93853C14.989 3.96793 14.3997 3.08601 13.6569 2.34315C12.914 1.60028 12.0321 1.011 11.0615 0.608964C10.0909 0.206926 9.05058 0 8 0ZM7.2 12H8.8V7.2H7.2V12Z" fill="#037DD6"/>
</svg>

Before

Width:  |  Height:  |  Size: 787 B

@ -1,3 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.4 8C14.4 9.69739 13.7257 11.3253 12.5255 12.5255C11.3253 13.7257 9.69739 14.4 8 14.4C6.30261 14.4 4.67475 13.7257 3.47452 12.5255C2.27428 11.3253 1.6 9.69739 1.6 8C1.6 6.30261 2.27428 4.67475 3.47452 3.47452C4.67475 2.27428 6.30261 1.6 8 1.6C8.608 1.6 9.2 1.688 9.76 1.848L11.016 0.592C10.088 0.208 9.072 0 8 0C6.94943 0 5.90914 0.206926 4.93853 0.608964C3.96793 1.011 3.08601 1.60028 2.34315 2.34315C0.842855 3.84344 0 5.87827 0 8C0 10.1217 0.842855 12.1566 2.34315 13.6569C3.08601 14.3997 3.96793 14.989 4.93853 15.391C5.90914 15.7931 6.94943 16 8 16C10.1217 16 12.1566 15.1571 13.6569 13.6569C15.1571 12.1566 16 10.1217 16 8H14.4ZM4.728 6.464L3.6 7.6L7.2 11.2L15.2 3.2L14.072 2.064L7.2 8.936L4.728 6.464Z" fill="#28A745"/>
</svg>

Before

Width:  |  Height:  |  Size: 842 B

@ -1 +0,0 @@
<svg fill="none" height="15" viewBox="0 0 20 15" width="20" xmlns="http://www.w3.org/2000/svg"><g fill="#6a737d"><rect height="3" rx="1.5" width="20"/><rect height="3" rx="1.5" width="20" y="6"/><rect height="3" rx="1.5" width="20" y="12"/></g></svg>

Before

Width:  |  Height:  |  Size: 250 B

@ -1 +0,0 @@
<svg fill="none" height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#6a737d"><path clip-rule="evenodd" d="m7.99984 2.00001c-3.31371 0-6 2.68629-6 5.99999s2.68629 6 6 6c3.31366 0 5.99996-2.6863 5.99996-6s-2.6863-5.99999-5.99996-5.99999zm-7.333336 5.99999c0-4.05008 3.283246-7.333328 7.333336-7.333328 4.05006 0 7.33336 3.283248 7.33336 7.333328 0 4.0501-3.2833 7.3333-7.33336 7.3333-4.05009 0-7.333336-3.2832-7.333336-7.3333z" fill-rule="evenodd"/><path clip-rule="evenodd" d="m7.99984 7.33334c.36819 0 .66666.29847.66666.66666v2.6667c0 .3682-.29847.6666-.66666.6666s-.66667-.2984-.66667-.6666v-2.6667c0-.36819.29848-.66666.66667-.66666z" fill-rule="evenodd"/><path d="m8.6665 5.33334c0 .36819-.29847.66666-.66666.66666s-.66667-.29847-.66667-.66666.29848-.66667.66667-.66667.66666.29848.66666.66667z"/></g></svg>

Before

Width:  |  Height:  |  Size: 847 B

@ -1,11 +0,0 @@
<svg height="128" width="128" xmlns="http://www.w3.org/2000/svg">
<mask id="a" fill="#fff">
<path d="M0 82.118h126.527V0H0z" fill-rule="evenodd"/>
</mask>
<g fill="#1b243d" fill-rule="evenodd">
<path d="M7.881 97.273a2.224 2.224 0 00-.67-.534 1.739 1.739 0 00-.808-.198H1v8.536h.958v-7.674h4.268c.2 0 .381.052.54.157s.294.237.404.397c.11.159.193.337.253.533s.088.386.088.568c0 .164-.022.337-.068.52-.045.182-.12.35-.226.506s-.234.283-.389.383-.343.15-.56.15H4.993v.862h1.437c.283 0 .55-.066.8-.198s.472-.31.664-.533c.191-.224.341-.48.451-.767s.164-.59.164-.91c0-.356-.057-.688-.17-.998s-.268-.577-.459-.8M17.43 102.116a3.52 3.52 0 01-.746 1.073 3.598 3.598 0 01-1.094.739c-.415.183-.855.274-1.32.274s-.905-.091-1.32-.274a3.499 3.499 0 01-1.088-.74 3.57 3.57 0 01-.739-1.072 3.125 3.125 0 01-.273-1.293c0-.447.091-.878.273-1.293s.429-.777.739-1.088a3.63 3.63 0 011.094-.745c.42-.187.862-.28 1.328-.28.464 0 .904.093 1.319.28s.778.436 1.088.745c.31.31.556.673.739 1.088.182.415.273.846.273 1.293 0 .456-.091.887-.273 1.293m-.089-4.351c-.388-.387-.846-.695-1.375-.923s-1.094-.342-1.696-.342-1.168.114-1.696.342c-.53.228-.988.536-1.375.923a4.384 4.384 0 00-.924 1.369 4.155 4.155 0 00-.342 1.675c0 .593.114 1.152.342 1.676a4.324 4.324 0 002.299 2.291c.528.229 1.094.342 1.696.342s1.167-.113 1.696-.342a4.346 4.346 0 001.375-.923c.387-.387.695-.843.923-1.368a4.156 4.156 0 00.342-1.676c0-.592-.114-1.151-.342-1.675a4.398 4.398 0 00-.923-1.37M27.225 97.273a2.249 2.249 0 00-.67-.534 1.739 1.739 0 00-.808-.198h-5.403v8.536h.957v-7.674h4.269c.2 0 .38.052.54.157.159.105.294.237.404.397.109.159.193.337.253.533.059.196.088.386.088.568 0 .164-.023.337-.068.52-.046.182-.121.35-.226.506s-.234.283-.39.383a1.01 1.01 0 01-.56.15h-1.314l2.285 4.46h1.026l-1.82-3.598c.283 0 .55-.066.8-.198s.47-.31.658-.533c.186-.224.334-.48.444-.767.109-.287.164-.59.164-.91 0-.356-.057-.688-.171-.998s-.267-.577-.458-.8M36.87 96.54h-7.457v.862h3.242v7.674h.958v-7.673h3.256zM36.308 105.077h6.115l-.589-.861h-4.02l2.967-6.075 3.448 6.936h1.067l-4.515-8.987zM47.786 96.54h-.958v8.536h6.499v-.86h-5.541zM67.047 104.27l-5.403-7.729h-1.6v8.536H61v-7.743l5.5 7.743h1.504v-8.536h-.958zM69.92 105.077h6.498v-.861h-5.54v-6.813h5.54v-.862H69.92z"/>
<path d="M71.218 78.479h4.091v-.861h-4.091zM77.292 74.403h3.242v7.674h.958v-7.674h3.256v-.862h-7.456zM95.828 81.366L91.67 73.09l-4.09 8.208V73.54h-.958v8.536h1.642L91.67 75.1l3.448 6.977h1.67V73.54h-.959zM106.02 79.116a3.585 3.585 0 01-1.84 1.812c-.415.183-.855.274-1.32.274s-.905-.091-1.32-.274a3.499 3.499 0 01-1.088-.74 3.57 3.57 0 01-.739-1.072 3.125 3.125 0 01-.273-1.293c0-.447.091-.878.273-1.293s.43-.777.74-1.088a3.63 3.63 0 011.093-.745c.42-.187.863-.28 1.328-.28s.905.093 1.32.28a3.66 3.66 0 011.087.745c.31.31.556.673.74 1.088.181.415.272.846.272 1.293 0 .456-.09.887-.273 1.293m-.089-4.351c-.388-.387-.846-.695-1.375-.923s-1.094-.342-1.696-.342-1.168.114-1.696.342c-.53.228-.988.536-1.375.923a4.384 4.384 0 00-.924 1.369 4.155 4.155 0 00-.342 1.675c0 .593.114 1.152.342 1.676a4.324 4.324 0 002.299 2.291c.528.229 1.094.342 1.696.342s1.167-.113 1.696-.342a4.346 4.346 0 001.375-.923c.388-.387.695-.843.923-1.368a4.156 4.156 0 00.342-1.676c0-.592-.114-1.151-.342-1.675a4.381 4.381 0 00-.923-1.37M115.815 74.273a2.236 2.236 0 00-.67-.534 1.739 1.739 0 00-.808-.198h-5.403v8.536h.957v-7.674h4.27c.2 0 .38.052.54.157.158.105.293.237.403.397.11.159.193.337.253.533s.088.386.088.568c0 .164-.023.337-.068.52-.046.182-.12.35-.226.506s-.234.283-.39.383a1.01 1.01 0 01-.56.15h-1.314l2.285 4.46h1.026l-1.82-3.598c.283 0 .55-.066.801-.198.25-.132.47-.31.657-.533.186-.224.334-.48.444-.767.11-.287.164-.59.164-.91 0-.356-.057-.688-.17-.998s-.268-.577-.459-.8M126.527 73.54h-1.04l-2.12 4.31 2.12 4.227h1.04l-2.093-4.227zM119.208 73.54h-.958v8.536h.958v-3.802h2.9v-.863h-2.9zM72.463 48.06c-5.114 0-10.873-1.958-16.216-5.515-.481-.32-1.004-.311-1.168.019-.165.33.09.857.572 1.177 5.797 3.859 12.046 5.984 17.594 5.984 4.597 0 8.294-1.444 10.69-4.177 2.35-2.678 3.253-6.346 2.61-10.606-.065-.438-.527-.906-1.031-1.046-.503-.14-.858.102-.792.54.592 3.926-.24 7.307-2.406 9.775-2.208 2.519-5.616 3.849-9.853 3.849M84.508 28.475c-.216-.46-.764-.833-1.223-.833-.46 0-.657.373-.442.833.402.854.751 1.714 1.037 2.556.154.456.672.873 1.156.932a.868.868 0 00.112.008c.411 0 .626-.306.483-.725a26.647 26.647 0 00-1.123-2.771M71.577 13.692c-6-4.171-12.501-6.468-18.307-6.468-4.643 0-8.363 1.47-10.757 4.254-2.316 2.69-3.205 6.52-2.503 10.78.072.44.538.906 1.04 1.04.093.024.18.036.26.036.358 0 .579-.23.52-.59-.646-3.926.174-7.455 2.308-9.936 2.206-2.564 5.634-3.92 9.915-3.92 5.35 0 11.343 2.117 16.873 5.962.475.33 1.005.339 1.185.019s-.06-.847-.534-1.177M42.636 25.918c-.156-.456-.673-.874-1.157-.933s-.75.262-.594.718c.309.913.687 1.845 1.123 2.771.214.46.762.832 1.222.832s.658-.372.442-.832a24.811 24.811 0 01-1.036-2.556M48.954 5.599a.766.766 0 00.12-.01 21.005 21.005 0 013.31-.251c.46 0 .656-.373.441-.833-.216-.46-.764-.832-1.224-.832-1.23 0-2.423.09-3.546.27-.423.068-.538.49-.257.946.256.413.751.71 1.156.71" mask="url(#a)" transform="translate(1 23)"/>
<path d="M38.456 28.475c3.134 6.669 8.685 12.927 15.63 17.62.238.162.487.242.699.242.214 0 .389-.082.475-.247.17-.326-.08-.854-.56-1.177-6.477-4.38-11.655-10.216-14.58-16.438-2.42-5.15-3.055-10.024-1.836-14.095 1.18-3.944 4.108-6.851 8.243-8.186.385-.124.427-.583.095-1.026-.333-.443-.913-.7-1.297-.577-4.434 1.432-7.573 4.548-8.838 8.774-1.306 4.365-.625 9.589 1.969 15.11M77.442 51.359a21.003 21.003 0 01-3.311.253c-.46 0-.657.372-.44.832.215.459.763.832 1.223.832 1.23 0 2.423-.091 3.547-.271.422-.067.537-.49.256-.945-.281-.454-.852-.768-1.275-.701M88.059 28.474c-3.134-6.668-8.684-12.926-15.627-17.619-.478-.324-1.004-.32-1.174.005-.17.327.08.854.558 1.177 6.478 4.38 11.655 10.216 14.579 16.437 2.369 5.04 3.028 9.831 1.906 13.854-1.084 3.89-3.854 6.821-7.8 8.25-.375.137-.401.603-.06 1.042.28.357.716.586 1.072.586a.663.663 0 00.229-.037c4.229-1.534 7.198-4.674 8.36-8.844 1.203-4.313.497-9.448-2.043-14.85" mask="url(#a)" transform="translate(1 23)"/>
<path d="M36.572 28.475c-.216-.46-.764-.833-1.224-.833-.46 0-.657.373-.441.833 2.796 5.948 7.293 11.64 13.007 16.465.269.227.582.348.842.348.167 0 .313-.05.41-.154.248-.268.09-.787-.352-1.161-5.378-4.54-9.611-9.9-12.242-15.498M56.817 49.565a52.978 52.978 0 01-4.954-3.201c-.469-.341-1.007-.367-1.204-.06-.196.309.025.835.493 1.176a56.127 56.127 0 005.262 3.399c.207.119.414.176.592.176.248 0 .442-.111.507-.322.111-.363-.2-.886-.696-1.168M75.8 55.16c-4.868 0-10.25-1.321-15.57-3.823-.506-.238-.958-.112-1.01.282-.053.394.314.905.82 1.143 5.651 2.659 11.371 4.063 16.542 4.063.46 0 .656-.372.441-.832-.217-.46-.764-.832-1.224-.832M71.843 8.673a53.081 53.081 0 0110.553 8.787c3.203 3.468 5.743 7.174 7.548 11.014.216.46.763.832 1.223.832s.657-.372.441-.832c-1.917-4.079-4.615-8.016-8.02-11.702a56.342 56.342 0 00-11.209-9.334c-.486-.308-1-.282-1.148.06-.148.341.126.867.612 1.175M64.115 4.657a48.191 48.191 0 014.428 2.09 1.2 1.2 0 00.555.154c.26 0 .46-.12.516-.348.09-.375-.24-.894-.74-1.162a51.183 51.183 0 00-4.704-2.219c-.507-.207-.931-.044-.947.366-.015.411.385.911.892 1.12M50.716 1.788c2.948 0 6.07.478 9.276 1.419.103.03.2.045.29.045.346 0 .567-.218.522-.565-.057-.435-.51-.907-1.016-1.056-3.408-1-6.723-1.508-9.855-1.508-.459 0-.657.373-.44.833.215.459.763.832 1.223.832M36.791 1.572c.31-.21.234-.712-.168-1.12-.402-.409-.979-.57-1.29-.359-3.009 2.043-5.134 4.845-6.315 8.327-.12.358.181.881.674 1.171.213.124.426.185.61.185.242 0 .433-.106.502-.309 1.12-3.3 3.134-5.957 5.987-7.895M29.356 10.908c-.503-.25-.967-.14-1.036.246a21.216 21.216 0 00-.287 2.495c-.022.407.37.91.878 1.124.154.065.3.096.43.096.3 0 .514-.162.53-.445.045-.805.136-1.6.272-2.365.068-.386-.284-.9-.787-1.15M96.823 47.358c-.493-.29-.991-.233-1.112.124-1.12 3.3-3.135 5.957-5.988 7.895-.309.21-.234.712.168 1.12.283.288.651.453.953.453.128 0 .245-.03.337-.093 3.01-2.045 5.135-4.847 6.316-8.328.12-.358-.181-.882-.674-1.171M97.608 41.939c-.507-.211-.934-.05-.952.358-.04.884-.135 1.756-.284 2.592-.068.386.284.902.787 1.152.182.089.36.133.515.133.272 0 .477-.133.52-.38.157-.881.258-1.801.3-2.735.018-.408-.378-.91-.886-1.12M70.794 44.51c-8.842 0-19.416-7.194-23.571-16.036-4.156-8.84-.343-16.035 8.499-16.035s19.416 7.194 23.57 16.035c4.156 8.842.344 16.035-8.498 16.035M54.94 10.775c-9.76 0-13.968 7.94-9.382 17.7 4.587 9.76 16.258 17.7 26.018 17.7s13.968-7.94 9.382-17.7c-4.587-9.76-16.26-17.7-26.018-17.7M36.994 5.788c-.446-.37-1.004-.45-1.247-.178-1.528 1.714-2.616 3.766-3.233 6.1-.098.37.227.89.725 1.163.199.109.397.162.567.162.256 0 .454-.118.512-.34.582-2.198 1.606-4.13 3.045-5.743.242-.273.077-.793-.37-1.164M90.57 51.558c1.633-1.757 2.788-3.883 3.432-6.318.098-.37-.226-.892-.725-1.164s-.982-.193-1.08.178c-.606 2.293-1.694 4.295-3.231 5.95-.25.266-.091.787.352 1.16.269.227.582.348.842.348.167 0 .312-.05.41-.154" mask="url(#a)" transform="translate(1 23)"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

@ -1,3 +0,0 @@
<svg fill="none" height="24" width="20" xmlns="http://www.w3.org/2000/svg">
<path clip-rule="evenodd" d="M0 9.715V3.572l10-2.7 10 2.7v6.143c0 6.33-4.2 11.69-10 13.52-5.8-1.83-10-7.19-10-13.52zm15.388 1.013l.235.17-.541.639.824 2.563-.763 2.616-2.67-.738-.517.426-1.055.733H9.098l-1.054-.733-.518-.426-2.67.738L4.1 14.1l.819-2.563-.542-.639.236-.17-.377-.346.287-.227-.376-.288.254-.19-.4-1.93.593-1.792 3.818 1.433h3.178l3.818-1.433L16 7.748l-.396 1.93.25.189-.377.288.287.227zm-8.003 2.437l1.086-.5.452.958zm3.384.458l.45-.959 1.088.501zM9.242 14.9h1.2l.209.166.117 1.112-.108-.11H9.027l-.104.11.112-1.112z" fill="#fff" fill-rule="evenodd"/>
</svg>

Before

Width:  |  Height:  |  Size: 654 B

@ -1,3 +0,0 @@
<svg viewBox="0 0 252 251.7" xmlns="http://www.w3.org/2000/svg">
<path d="M211.3 103.9h-60.7c-2 0-3.6-1.6-3.6-3.6V3.6c0-3.5-4.5-5-6.6-2.2l-102.7 140c-1.8 2.4 0 5.8 2.9 5.8h60.7c2 0 3.6 1.6 3.6 3.6v96.6c0 3.5 4.5 5 6.6 2.2l102.7-140c1.8-2.3.1-5.7-2.9-5.7z" fill="#757575"/>
</svg>

Before

Width:  |  Height:  |  Size: 284 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.9 KiB

@ -1,6 +0,0 @@
<svg height="28" width="28" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<path d="M27 14c0 7.18-5.82 13-13 13S1 21.18 1 14 6.82 1 14 1s13 5.82 13 13z" stroke="#4a4a4a"/>
<path d="M7 18s1.787-6.164 7.762-6.164V9L20 13.373 14.762 18v-2.836S10.54 14.463 7 18" fill="#4a4a4a"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 337 B

@ -1,18 +0,0 @@
<svg viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg">
<path d="M33 36v-1a6 6 0 00-6-6H9a6 6 0 00-6 6v1z" fill="#66757f"/>
<path d="M12 27.482C13.672 29.057 15.746 30 18 30s4.327-.944 6-2.518V26H12z" fill="#ef9645"/>
<path d="M26.75 20.435c1.188.208 2.619.129 2.416.917-.479 1.854-2.604 1.167-2.979 1.188-.375.02.563-2.105.563-2.105z" fill="#66757f"/>
<path d="M27.062 20.645c1.875.25 2.541.416 1.166.958-.772.305-2.243 4.803-3.331 4.118-1.087-.685 2.165-5.076 2.165-5.076z" fill="#292f33"/>
<path d="M9.255 20.435c-1.188.208-2.619.129-2.416.917.479 1.854 2.604 1.167 2.979 1.188.375.02-.563-2.105-.563-2.105z" fill="#66757f"/>
<path d="M8.943 20.645c-1.875.25-2.541.416-1.166.958.772.305 2.243 4.803 3.331 4.118s-2.165-5.076-2.165-5.076z" fill="#292f33"/>
<path d="M8.055 11.031c-1.953 0-2.305 3.164-.664 3.594 0 0-1.367 3.32 1.953 3.32-.547-1.68-1.562-4.414-.781-6.406m19.38-.508c1.953 0 2.305 3.164.664 3.594 0 0 1.367 3.32-1.953 3.32.547-1.68 1.562-4.414.781-6.406" fill="#ffac33"/>
<ellipse cx="18" cy="15.5" fill="#ffdc5d" rx="10" ry="12.5"/>
<path d="M14 17a1 1 0 01-1-1v-1a1 1 0 012 0v1a1 1 0 01-1 1zm8 0a1 1 0 01-1-1v-1a1 1 0 112 0v1a1 1 0 01-1 1z" fill="#662113"/>
<path d="M19 20.5a.5.5 0 01-.5.5h-1a.5.5 0 010-1h1a.5.5 0 01.5.5z" fill="#c1694f"/>
<path clip-rule="evenodd" d="M7.657 14.788c.148.147.888.591 1.036 1.034s.445 2.954 1.333 3.693c.916.762 4.37.478 5.032.149 1.48-.738 1.662-2.798 1.924-3.842.148-.591 1.036-.591 1.036-.591s.888 0 1.036.591c.262 1.044.444 3.104 1.924 3.841.662.33 4.116.614 5.034-.147.887-.739 1.183-3.25 1.331-3.694.146-.443.888-.886 1.035-1.034.148-.148.148-.739 0-.887-.296-.295-3.788-.559-7.548-.148-.75.082-1.035.295-2.812.295-1.776 0-2.062-.214-2.812-.295-3.759-.411-7.252-.148-7.548.148-.149.148-.149.74-.001.887z" fill="#292f33" fill-rule="evenodd"/>
<path d="M7.858 8.395S9.217-.506 13.79.023c3.512.406 4.89.825 7.833.097 1.947-.482 4.065 1.136 5.342 4.379a27.72 27.72 0 011.224 4.041s3.938-.385 4.165 1.732c.228 2.117-4.354 4.716-15.889 4.716C10 14.987 3.33 12.63 3.013 10.657s4.845-2.262 4.845-2.262z" fill="#66757f"/>
<path d="M8.125 7.15s-.27 1.104-.406 1.871c-.136.768.226 1.296 2.705 1.824 3.287.7 10.679.692 15.058-.383 1.759-.432 2.886-.72 2.751-1.583-.167-1.068-.196-1.066-.541-2.208 0 0-1.477.502-3.427.96-2.66.624-9.964.911-13.481.144-1.874-.41-2.659-.625-2.659-.625zm-.136 13.953c-.354.145 2.921 1.378 7.48 1.458 4.771.084 6.234.39 5.146 1.459-1.146 1.125-.852 2.894-.771 3.418s2.047 1.916 2.208 2.56c.161.645-1.229 5.961-1.229 5.961l-8.729-.252c-2.565-8.844-2.883-8.501-4.105-13.604-.241-1.008 0-1 0-1z" fill="#292f33"/>
<path d="M6.989 21.144c-.354.146 2.921 1.378 7.48 1.458 4.771.084 6.234.39 5.146 1.459-1.146 1.125-.664 2.894-.583 3.418s1.859 1.916 2.021 2.561c.16.644-1.231 5.96-1.231 5.96l-8.729-.252c-2.565-8.844-2.883-8.501-4.105-13.604-.24-1.008.001-1 .001-1z" fill="#66757f"/>
<path d="M28.052 21.103c.354.145-2.921 1.378-7.479 1.458-4.771.084-6.234.39-5.146 1.459 1.146 1.125 2.976 2.892 2.896 3.416-.081.524-4.172 1.918-4.333 2.562-.161.645 1.229 5.961 1.229 5.961l8.729-.252c2.565-8.844 2.883-8.501 4.104-13.604.241-1.008 0-1 0-1z" fill="#292f33"/>
<path d="M28.958 21.103c.354.145-2.921 1.378-7.479 1.458-4.771.084-6.234.39-5.146 1.459 1.146 1.125 2.977 2.892 2.896 3.416s-4.172 1.918-4.333 2.562c-.161.645 1.229 5.961 1.229 5.961l8.657.01c2.565-8.844 2.955-8.763 4.177-13.866.24-1.008-.001-1-.001-1z" fill="#66757f"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 118 KiB

@ -1,5 +0,0 @@
<svg fill="#f7861c" height="24" viewBox="78.469 0 29.477 24" width="29.477" xmlns="http://www.w3.org/2000/svg">
<path d="M90.437 9.087c0 1.669 1.423 4.766 3.177 4.766 1.755 0 3.177-3.097 3.177-4.766 0-1.668-1.422-3.021-3.177-3.021s-3.177 1.352-3.177 3.021z"/>
<path d="M93.613 17.091h4.042c1.108 0 1.503-.249 1.503-.84 0-1.21-1.158-2.147-2.867-2.62-.713.861-1.619 1.467-2.678 1.467-1.057 0-1.964-.605-2.676-1.467-1.709.473-2.867 1.41-2.867 2.62 0 .591.395.84 1.502.84zM86.392 4.841a10.252 10.252 0 017.268-3.006c1.47 0 2.892.304 4.225.902.166.075.36.039.488-.09l.558-.556a.438.438 0 00-.121-.705A12.001 12.001 0 0093.66.22c-1.545 0-3.052.292-4.478.869a11.794 11.794 0 00-3.933 2.609 11.798 11.798 0 00-3.325 6.495 12.001 12.001 0 00.17 4.684l-.732-.497a.438.438 0 00-.608.117l-.45.664a.44.44 0 00.117.609l2.638 1.787.259.177a.437.437 0 00.345.063.437.437 0 00.264-.18l1.965-2.897a.44.44 0 00-.118-.608l-.665-.45a.436.436 0 00-.607.116l-.741 1.093a10.333 10.333 0 01-.22-4.541 10.19 10.19 0 012.851-5.489z"/>
<path d="M106.979 8.028a.44.44 0 00-.226-.248l-2.443-1.142-.727-.34a.44.44 0 00-.583.211l-1.482 3.17a.438.438 0 00.212.582l.728.34a.442.442 0 00.335.015.439.439 0 00.247-.226l.509-1.087c.43 1.52.505 3.12.213 4.694a10.211 10.211 0 01-2.832 5.382 10.257 10.257 0 01-7.268 3.005c-1.393 0-2.743-.273-4.018-.812a.44.44 0 00-.48.095l-.561.561a.438.438 0 00.129.709A12.015 12.015 0 0093.661 24a11.862 11.862 0 008.412-3.478 11.803 11.803 0 003.304-6.378 11.895 11.895 0 00-.273-5.281l.939.439a.438.438 0 00.583-.211l.34-.727a.43.43 0 00.013-.336z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 2066.8 800" style="enable-background:new 0 0 2066.8 800;" xml:space="preserve">
<style type="text/css">
.st0{fill:url(#SVGID_1_);}
.st1{fill:#2970E2;}
.st2{fill:#D1D9E6;}
.st3{fill:#FFFFFF;}
.st4{fill:url(#SVGID_2_);}
</style>
<g id="transparent_1_">
<g id="logo_4_">
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="119.932" y1="155.9459" x2="624.022" y2="547.843" gradientTransform="matrix(1 0 0 1 0 50)">
<stop offset="0.1304" style="stop-color:#3495F7"/>
<stop offset="0.3063" style="stop-color:#2B87F2"/>
<stop offset="0.6392" style="stop-color:#1461E5"/>
<stop offset="0.7232" style="stop-color:#0E57E1"/>
</linearGradient>
<path class="st0" d="M566.4,640.4H175.3c-22,0-39.8-17.8-39.8-39.8V201.5c0-22,17.8-39.8,39.8-39.8h391.2
c22,0,39.8,17.8,39.8,39.8v399.1C606.3,622.5,588.5,640.4,566.4,640.4z"/>
<path class="st1" d="M606.3,451.6v148.9c0,22-17.8,39.8-39.8,39.8H417.6L606.3,451.6z"/>
<g>
<g>
<g>
<path class="st2" d="M293.4,449.7l138.9-144.4c10.6-10.6,27.2-9.8,38.3,1.2l80.3,77.4c8.5,8.2,8.3,24.4,0.4,33.1
c-10.3,10.3-21.9,11-37.5,0.4l-58.2-63L309.3,493.5c-9.8,7.6-19.8,14-35.2,4.1c-5.3-7.1,5.2-21,1.1-25.1L293.4,449.7z"/>
</g>
<g>
<path class="st2" d="M287.1,498.2c-11.9-0.4-21.2-8.1-21.2-17.3l0.7-165.1c0-9.1,8.5-20.2,20.4-20.6
c15.8,0,22.7,12.8,22.7,22.3v163.8C309.8,490.8,299.5,498.5,287.1,498.2z"/>
</g>
<g>
<path class="st2" d="M449.1,502.7c-14.7,0-20.9-10.9-20.9-19.5V331.8c0-8.5,9.1-18.9,20.9-19.3c12.3-0.4,22.5,10,22.5,18.9
v149.7C471.6,491.7,464.3,502.7,449.1,502.7z"/>
</g>
</g>
<g>
<g>
<path class="st3" d="M282.1,500c-9.1-0.4-16.2-8.1-16.2-17.3V317.6c0-9.1,7.1-20.2,16.2-20.6c9.5-0.4,17.5,10.6,17.5,20.2v166
C299.6,492.7,291.7,500.4,282.1,500z"/>
</g>
<g>
<path class="st3" d="M444.5,501.7c-9.3,0-16.9-10.8-16.9-20.2V318.9c0-9.3,7.6-16.9,16.9-16.9c9.3,0,16.9,7.6,16.9,16.9v162.7
C461.3,490.8,453.8,501.7,444.5,501.7z"/>
</g>
<g>
<path class="st3" d="M282.8,498.4c-5.5,0-11-2.1-15.1-6.3l-76.5-76.7c-8.3-8.4-8.3-21.9,0.1-30.3c8.4-8.3,21.9-8.3,30.3,0.1
l61.6,62l147.4-140.3c8.3-7.9,21.3-7.9,29.6,0.1l80.2,77.4c8.5,8.2,8.7,21.7,0.6,30.3c-8.1,8.5-21.7,8.7-30.3,0.6l-65.5-63.1
L297.5,492.5C293.4,496.4,288.1,498.4,282.8,498.4z"/>
</g>
</g>
<path class="st3" d="M429.7,378.8l-9.3,8.8c0,0,2.6-14.7-4.9-7.6c-7.6,7.2,11.6-18.2,11.6-18.2l3.9,4.9L429.7,378.8z"/>
<path class="st3" d="M461.3,376.6c0,0,0.5-9,10.3,6.4v-12.1l-10.6-5.5L461.3,376.6z"/>
<path class="st3" d="M299.7,419.2c0,0,1.4,10,10.2-2.9v12.1l-10.6,5.5L299.7,419.2z"/>
</g>
</g>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="712.4824" y1="419.8029" x2="1947.4551" y2="419.8029">
<stop offset="0" style="stop-color:#3495F7"/>
<stop offset="0.4939" style="stop-color:#1461E5"/>
<stop offset="1" style="stop-color:#0E57E1"/>
</linearGradient>
<path class="st4" d="M809.3,337.3l2.1,0.7c0.3,5.7,0.5,16.4,0.5,32.1c0,1-1.5,1.4-4.5,1.4h-20.7c-1.9,0-2.9,1.5-2.9,4.5v122.8
c0,0.2-0.4,0.5-1.2,1.1c-0.8,0.6-1.3,0.8-1.7,0.8h-37.4l-1.7-1.4c-0.5-0.5-0.7-37.8-0.7-111.9v-14.8c-19.2,0-28.8-1.2-28.8-3.6
v-30.5c0-0.2,0.6-0.6,1.9-1.4h42.8c2.2,0.3,3.6,0.6,4,0.7c0.5,0,0.7-0.2,0.7-0.7H809.3z M868.1,336.9h65.9
c15.1,0,28.4,5.5,39.9,16.5c11.5,11,17.3,24.2,17.3,39.4c0,11.9-3.4,22.2-10.1,30.9c-6.7,8.7-15.8,15.5-27.3,20.2
c-0.5,0-0.7,0.4-0.7,1.2v0.2c0.2,0.2,0.2,0.3,0.2,0.5l40.7,49.7c0.5,0.8,1,1.7,1.4,2.6s0.8,1.6,1.1,2c0.2,0.4,0.4,0.7,0.4,0.8
c0,0.5-2.6,0.9-7.9,1.3c-5.2,0.4-8.7,0.6-10.5,0.6c-1.3,0-2.1-0.2-2.6-0.7h-25.5c-1.6-0.2-2.9-1-4-2.6l-33.1-39
c-0.2-0.2-0.5-0.6-1-1.2c-0.5-0.6-1-1.1-1.4-1.4c-0.5-0.3-1-0.5-1.4-0.5c-0.3,0-0.7,1-1.2,3.1v38.6c0,1.3-0.5,1.9-1.4,1.9h-32.4
c-2.9,0-4.8-0.6-5.7-1.9c-1-1.3-1.6-3.4-1.9-6.4c0-14.1,0.1-32,0.4-53.7c0.2-21.7,0.4-38,0.4-48.9c0-1.7-0.1-8.1-0.2-19l-0.5-16.4
C867.4,343.1,867.8,337.2,868.1,336.9z M948.3,392.3c0-4.4-1-8.3-3.1-11.7c-4-6.2-12.2-9.3-24.8-9.3c-2.2,0-5.6,0.2-10,0.5
l-2.1,2.4c0,2.1-0.1,5.3-0.2,9.6c-0.2,4.4-0.3,8.1-0.4,11.1c-0.1,3-0.1,5.2-0.1,6.4c0,10.6,1,16.6,2.9,17.9h2.6
c13.2-0.3,22.3-2.1,27.5-5.5C945.8,410.4,948.3,403.3,948.3,392.3z M1102.8,335h28.3c0.8,0,3.1,4.4,6.8,13.1
c3.7,8.7,5.6,13.6,5.6,14.5c3.3,8.7,21.3,53.1,54,133c0,2.2-1,3.6-2.9,4.2c-1.9,0.6-5.4,0.8-10.5,0.8l-12.1-0.2
c-8.1-0.2-14.2-0.2-18.3-0.2c-0.3-1-1-2.6-1.9-5c-1-2.4-1.7-4.2-2.3-5.5c-0.6-1.3-1.4-2.9-2.5-4.8c-1.1-1.9-2.3-3.6-3.6-5.2
c-1.1,0-3.3-0.2-6.7-0.6c-3.3-0.4-6.3-0.6-9-0.6l-29.8,0.5c-0.5,0-1.9-0.1-4.3-0.2c-2.4-0.2-3.7-0.2-3.8-0.2
c-2.9,0-5.3,3.7-7.4,11.2c-2.1,7.5-3.8,11.7-5.2,12.6c-4.3,0.2-9.6,0-15.8-0.4c-6.3-0.4-11.5-0.6-15.8-0.6c-6.7,0-10-1-10-2.9
c0-0.3,0-0.7,0.1-1.2c0.1-0.5,0.1-0.8,0.1-1l13.8-40c2.1-4.1,4.6-10.3,7.5-18.6c2.9-8.2,4.8-13.3,5.6-15.2
c3.2-8.2,8.6-22,16.3-41.2c7.7-19.2,13.5-34,17.5-44.5C1096.8,335.6,1098.8,335,1102.8,335z M1105.2,446.1h6.2
c11.4-0.3,17.1-1,17.1-1.9c0-2.9-2.5-10.1-7.4-21.7c-1.9-4.6-3-7.1-3.3-7.6l-3.1-7.4c-0.8,0-3.5,5.5-8,16.4
c-4.5,10.9-6.8,17.4-6.8,19.3C1099.9,445.1,1101.7,446.1,1105.2,446.1z M1388.2,426.3c0,0.3-0.1,1-0.2,2.1
c-0.2,1.1-0.3,2.2-0.5,3.3l-0.2,1.4c0,6.8,0.2,17.1,0.5,30.7c0.3,13.6,0.5,23.8,0.5,30.5c0,4.6-1,6.9-2.9,6.9h-30.9
c-2.5,0-4.4-0.9-5.5-2.6l-29.3-43.8c-0.2-0.6-0.9-1.7-2.1-3.1c-1.3-1.4-1.9-2.2-1.9-2.4l-24-34.7l-2.9-3.1l-0.5,1
c0,58.9-0.7,88.3-2.1,88.3h-37.6l-1.4-0.7c0-12.2,0.2-33.2,0.5-63c0.3-29.8,0.5-51.8,0.5-66.3c0-10.9-0.2-19.2-0.5-24.8l1-6.9
l4.8-1l30,1c0.8,0,1.7,0.8,2.9,2.4c1.1,1.6,1.8,2.9,2.1,3.8l22.4,32.4c0.3,0.6,0.9,1.5,1.8,2.7c0.9,1.2,1.5,2.1,1.8,2.7l30.7,42.1
c0.5,1.1,1.1,1.7,1.9,1.7c0.5,0,0.7-0.2,0.7-0.7v-85.9l1.4-1.2c0.2-0.2,3.6-0.2,10.2-0.2c18.7,0,28.1,0.3,28.1,1l1,1.4V426.3z
M1513.3,448.5c-2.4-2.4-5.4-4.8-9.2-7.3c-3.7-2.5-8-5.1-12.9-7.9c-4.8-2.8-7.8-4.6-8.9-5.4c-20.5-13-30.7-28.7-30.7-47.1
c0-15.4,5.4-26.9,16.2-34.5c10.8-7.6,24.8-11.4,41.9-11.4c9.4,0,18.8,1.9,28.3,5.7c1.7,0.6,4.6,1.9,8.4,3.8c3.9,1.9,5.8,3.3,5.8,4
l-0.2,1.2c0,0.2-0.2,0.4-0.5,0.8c-0.3,0.4-0.5,0.8-0.5,1.1c-4.9,10.2-9.7,18.4-14.3,24.8c-0.2,0.5-0.6,0.7-1.2,0.7
c-0.6,0-4.3-1.3-10.9-3.9c-6.7-2.6-11.8-3.9-15.5-3.9c-3.5,0-6.7,1-9.8,2.9c-3,1.9-4.5,4.5-4.5,7.9c0,4.3,2.4,8.3,7.1,12.1
c3.2,2.4,9.5,6.6,19,12.6c2.1,1.4,4.8,3.3,8.1,5.6c3.3,2.3,5.9,4.1,7.9,5.5c1.9,1.3,4,3,6.4,5c2.4,2,4.4,3.9,5.9,5.8
c3.8,4.9,6.4,9.4,7.7,13.3c1.3,4,2,8.8,2,14.5c0,14.9-5.6,27.2-16.9,36.8c-11.3,9.6-24.7,14.4-40.2,14.4c-17,0-32.9-4.1-47.8-12.4
c-6.7-4.1-10-6.6-10-7.4v-1c7-12.7,12.8-22.5,17.4-29.5c2.2,0,4.8,1.1,7.7,3.3c2.9,2.2,4.6,3.4,5.1,3.6c8.4,4.3,18,6.4,28.8,6.4
c9.4,0,14-3.5,14-10.5C1517.4,455.2,1516,452,1513.3,448.5z M1671.1,335h28.3c0.8,0,3.1,4.4,6.8,13.1c3.7,8.7,5.6,13.6,5.6,14.5
c3.3,8.7,21.3,53.1,54,133c0,2.2-1,3.6-2.9,4.2c-1.9,0.6-5.4,0.8-10.5,0.8l-12.1-0.2c-8.1-0.2-14.2-0.2-18.3-0.2
c-0.3-1-1-2.6-1.9-5c-1-2.4-1.7-4.2-2.3-5.5c-0.6-1.3-1.4-2.9-2.5-4.8c-1.1-1.9-2.3-3.6-3.6-5.2c-1.1,0-3.3-0.2-6.7-0.6
c-3.3-0.4-6.3-0.6-9-0.6l-29.8,0.5c-0.5,0-1.9-0.1-4.3-0.2c-2.4-0.2-3.7-0.2-3.8-0.2c-2.9,0-5.3,3.7-7.4,11.2
c-2.1,7.5-3.8,11.7-5.2,12.6c-4.3,0.2-9.6,0-15.8-0.4c-6.3-0.4-11.5-0.6-15.8-0.6c-6.7,0-10-1-10-2.9c0-0.3,0-0.7,0.1-1.2
c0.1-0.5,0.1-0.8,0.1-1l13.8-40c2.1-4.1,4.6-10.3,7.5-18.6c2.9-8.2,4.8-13.3,5.6-15.2c3.2-8.2,8.6-22,16.3-41.2
c7.7-19.2,13.5-34,17.5-44.5C1665.1,335.6,1667.2,335,1671.1,335z M1673.5,446.1h6.2c11.4-0.3,17.1-1,17.1-1.9
c0-2.9-2.5-10.1-7.4-21.7c-1.9-4.6-3-7.1-3.3-7.6l-3.1-7.4c-0.8,0-3.5,5.5-8,16.4s-6.8,17.4-6.8,19.3
C1668.3,445.1,1670,446.1,1673.5,446.1z M1851.1,334c4.9,0,7.4,0.9,7.4,2.6v48.6c0,1.6,0.2,2.4,0.5,2.4c1.1,0,2.5-1,4.2-3.1
c1.7-2.1,3.4-4.4,5.1-7c1.7-2.6,3.1-4.3,4-5.1l26.7-36.2c0.8-1,1.9-1.4,3.3-1.4h35.2l5.7,1c0.3,0,0.5,0.3,0.5,1
c0,1.1-0.2,1.8-0.5,2.1l-10.2,16.2l-1.4,1l-30.5,40.7c-0.5,0.5-0.7,1.1-0.7,1.9c0,1.1,0.2,2.1,0.7,2.9l46.2,95.4c0,0.2,0,0.4,0,0.7
l0.2,0.7c0,2.7-4.8,4-14.3,4c-5.6,0-12-0.2-19.4-0.7c-7.4-0.5-11.5-0.7-12.3-0.7l-1.7-1.2c-1-1-9.8-19.3-26.7-55
c-0.2-1.3-1.3-3.8-3.3-7.6c-0.5,0-2.3,2.2-5.6,6.7c-3.3,4.4-5,7.1-5.4,7.9c0,2.9,0,7.5,0.1,13.8c0.1,6.3,0.1,12.3,0.1,17.8
c0,11.3-1.3,17.1-3.8,17.6c-3.2,0-7.1,0.1-11.9,0.4c-4.8,0.2-8,0.4-9.8,0.4c-2.7,0-6.3-0.3-10.9-1c-4.6-0.6-6.9-1.2-6.9-1.7v-81.9
c1-7.6,1.4-12,1.4-13.1c0-7.1-0.3-17.8-1-32.1c-0.6-14.3-1-24.9-1-31.9c0-2.9,0.6-4.6,1.9-5.2C1825.4,334.2,1836.6,334,1851.1,334z
"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

@ -33,8 +33,8 @@
"js": [
"disable-console.js",
"globalthis.js",
"lockdown.js",
"runLockdown.js",
"lockdown-install.js",
"lockdown-run.js",
"contentscript.js"
],
"run_at": "document_start",

@ -34,10 +34,12 @@
</div>
<div id="popover-content"></div>
<script src="./globalthis.js" type="text/javascript" charset="utf-8"></script>
<script src="./initSentry.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown.js" type="text/javascript" charset="utf-8"></script>
<script src="./runLockdown.js" type="text/javascript" charset="utf-8"></script>
<script src="./ui-libs.js" type="text/javascript" charset="utf-8"></script>
<script src="./ui.js" type="text/javascript" charset="utf-8"></script>
<script src="./sentry-install.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown-install.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown-run.js" type="text/javascript" charset="utf-8"></script>
<script src="./runtime-cjs.js" type="text/javascript" charset="utf-8"></script>
{{@each(it.jsBundles) => val}}
<script src="{{val}}" type="text/javascript" charset="utf-8"></script>
{{/each}}
</body>
</html>

@ -3,8 +3,8 @@
<head>
<title>Ethereum Phishing Detection - MetaMask</title>
<script src="./globalthis.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown.js" type="text/javascript" charset="utf-8"></script>
<script src="./runLockdown.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown-install.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown-run.js" type="text/javascript" charset="utf-8"></script>
<script src="./phishing-detect.js"></script>
<link rel="stylesheet" type="text/css" href="./index.css" title="ltr">
<link rel="stylesheet" type="text/css" href="./index-rtl.css" title="rtl" disabled>

@ -11,10 +11,12 @@
<div id="app-content"></div>
<div id="popover-content"></div>
<script src="./globalthis.js" type="text/javascript" charset="utf-8"></script>
<script src="./initSentry.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown.js" type="text/javascript" charset="utf-8"></script>
<script src="./runLockdown.js" type="text/javascript" charset="utf-8"></script>
<script src="./ui-libs.js" type="text/javascript" charset="utf-8"></script>
<script src="./ui.js" type="text/javascript" charset="utf-8"></script>
<script src="./sentry-install.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown-install.js" type="text/javascript" charset="utf-8"></script>
<script src="./lockdown-run.js" type="text/javascript" charset="utf-8"></script>
<script src="./runtime-cjs.js" type="text/javascript" charset="utf-8"></script>
{{@each(it.jsBundles) => val}}
<script src="{{val}}" type="text/javascript" charset="utf-8"></script>
{{/each}}
</body>
</html>

@ -0,0 +1 @@
export const TRANSAK_API_KEY = '25ac1309-a49b-4411-b20e-5e56c61a5b1c'; // It's a public key, which will be included in a URL for Transak.

@ -30,6 +30,9 @@ describe('DetectTokensController', function () {
'0x7e57e2',
'0xbc86727e770de68b1060c91f6bb6945c73e10388',
]);
sandbox
.stub(network, 'getLatestBlock')
.callsFake(() => Promise.resolve({}));
sandbox
.stub(preferences, '_detectIsERC721')
.returns(Promise.resolve(false));

@ -34,8 +34,10 @@ const fetchWithTimeout = getFetchWithTimeout(SECOND * 30);
* @typedef {Object} EtherscanTransaction
* @property {string} blockNumber - The number of the block this transaction was found in, in decimal
* @property {string} from - The hex-prefixed address of the sender
* @property {string} gas - The gas limit, in decimal WEI
* @property {string} gasPrice - The gas price, in decimal WEI
* @property {string} gas - The gas limit, in decimal GWEI
* @property {string} [gasPrice] - The gas price, in decimal WEI
* @property {string} [maxFeePerGas] - The maximum fee per gas, inclusive of tip, in decimal WEI
* @property {string} [maxPriorityFeePerGas] - The maximum tip per gas in decimal WEI
* @property {string} hash - The hex-prefixed transaction hash
* @property {string} isError - Whether the transaction was confirmed or failed (0 for confirmed, 1 for failed)
* @property {string} nonce - The transaction nonce, in decimal
@ -267,6 +269,25 @@ export default class IncomingTransactionsController {
etherscanTransaction.isError === '0'
? TRANSACTION_STATUSES.CONFIRMED
: TRANSACTION_STATUSES.FAILED;
const txParams = {
from: etherscanTransaction.from,
gas: bnToHex(new BN(etherscanTransaction.gas)),
nonce: bnToHex(new BN(etherscanTransaction.nonce)),
to: etherscanTransaction.to,
value: bnToHex(new BN(etherscanTransaction.value)),
};
if (etherscanTransaction.gasPrice) {
txParams.gasPrice = bnToHex(new BN(etherscanTransaction.gasPrice));
} else if (etherscanTransaction.maxFeePerGas) {
txParams.maxFeePerGas = bnToHex(
new BN(etherscanTransaction.maxFeePerGas),
);
txParams.maxPriorityFeePerGas = bnToHex(
new BN(etherscanTransaction.maxPriorityFeePerGas),
);
}
return {
blockNumber: etherscanTransaction.blockNumber,
id: createId(),
@ -274,14 +295,7 @@ export default class IncomingTransactionsController {
metamaskNetworkId: CHAIN_ID_TO_NETWORK_ID_MAP[chainId],
status,
time,
txParams: {
from: etherscanTransaction.from,
gas: bnToHex(new BN(etherscanTransaction.gas)),
gasPrice: bnToHex(new BN(etherscanTransaction.gasPrice)),
nonce: bnToHex(new BN(etherscanTransaction.nonce)),
to: etherscanTransaction.to,
value: bnToHex(new BN(etherscanTransaction.value)),
},
txParams,
hash: etherscanTransaction.hash,
type: TRANSACTION_TYPES.INCOMING,
};

@ -103,15 +103,34 @@ function getMockBlockTracker() {
/**
* Returns a transaction object matching the expected format returned
* by the Etherscan API
*
* @param {string} [toAddress] - The hex-prefixed address of the recipient
* @param {number} [blockNumber] - The block number for the transaction
* @param {Object} [params] - options bag
* @param {string} [params.toAddress] - The hex-prefixed address of the recipient
* @param {number} [params.blockNumber] - The block number for the transaction
* @param {boolean} [params.useEIP1559] - Use EIP-1559 gas fields
* @param
* @returns {EtherscanTransaction}
*/
const getFakeEtherscanTransaction = (
const getFakeEtherscanTransaction = ({
toAddress = MOCK_SELECTED_ADDRESS,
blockNumber = 10,
) => {
useEIP1559 = false,
hash = '0xfake',
} = {}) => {
if (useEIP1559) {
return {
blockNumber: blockNumber.toString(),
from: '0xfake',
gas: '0',
maxFeePerGas: '10',
maxPriorityFeePerGas: '1',
hash,
isError: '0',
nonce: '100',
timeStamp: '16000000000000',
to: toAddress,
value: '0',
};
}
return {
blockNumber: blockNumber.toString(),
from: '0xfake',
@ -243,7 +262,13 @@ describe('IncomingTransactionsController', function () {
200,
JSON.stringify({
status: '1',
result: [getFakeEtherscanTransaction()],
result: [
getFakeEtherscanTransaction(),
getFakeEtherscanTransaction({
hash: '0xfakeeip1559',
useEIP1559: true,
}),
],
}),
);
const updateStateStub = sinon.stub(
@ -263,6 +288,9 @@ describe('IncomingTransactionsController', function () {
const actualStateWithoutGenerated = cloneDeep(actualState);
delete actualStateWithoutGenerated?.incomingTransactions?.['0xfake']?.id;
delete actualStateWithoutGenerated?.incomingTransactions?.[
'0xfakeeip1559'
]?.id;
assert.ok(
typeof generatedTxId === 'number' && generatedTxId > 0,
@ -290,6 +318,24 @@ describe('IncomingTransactionsController', function () {
value: '0x0',
},
},
'0xfakeeip1559': {
blockNumber: '10',
hash: '0xfakeeip1559',
metamaskNetworkId: ROPSTEN_NETWORK_ID,
chainId: ROPSTEN_CHAIN_ID,
status: TRANSACTION_STATUSES.CONFIRMED,
time: 16000000000000000,
type: TRANSACTION_TYPES.INCOMING,
txParams: {
from: '0xfake',
gas: '0x0',
maxFeePerGas: '0xa',
maxPriorityFeePerGas: '0x1',
nonce: '0x64',
to: '0x0101',
value: '0x0',
},
},
},
incomingTxLastFetchedBlockByChainId: {
...getNonEmptyInitState().incomingTxLastFetchedBlockByChainId,
@ -509,7 +555,11 @@ describe('IncomingTransactionsController', function () {
200,
JSON.stringify({
status: '1',
result: [getFakeEtherscanTransaction(NEW_MOCK_SELECTED_ADDRESS)],
result: [
getFakeEtherscanTransaction({
toAddress: NEW_MOCK_SELECTED_ADDRESS,
}),
],
}),
);
const updateStateStub = sinon.stub(
@ -586,7 +636,9 @@ describe('IncomingTransactionsController', function () {
// reply with a valid request for any supported network, so that this test has every opportunity to fail
nockEtherscanApiForAllChains({
status: '1',
result: [getFakeEtherscanTransaction(NEW_MOCK_SELECTED_ADDRESS)],
result: [
getFakeEtherscanTransaction({ toAddress: NEW_MOCK_SELECTED_ADDRESS }),
],
});
const updateStateStub = sinon.stub(
incomingTransactionsController.store,
@ -954,7 +1006,9 @@ describe('IncomingTransactionsController', function () {
describe('_getNewIncomingTransactions', function () {
const ADDRESS_TO_FETCH_FOR = '0xfakeaddress';
const FETCHED_TX = getFakeEtherscanTransaction(ADDRESS_TO_FETCH_FOR);
const FETCHED_TX = getFakeEtherscanTransaction({
toAddress: ADDRESS_TO_FETCH_FOR,
});
const mockFetch = sinon.stub().returns(
Promise.resolve({
json: () => Promise.resolve({ status: '1', result: [FETCHED_TX] }),
@ -1212,5 +1266,53 @@ describe('IncomingTransactionsController', function () {
type: TRANSACTION_TYPES.INCOMING,
});
});
it('should return the expected data when the tx uses EIP-1559 fields', function () {
const incomingTransactionsController = new IncomingTransactionsController(
{
blockTracker: getMockBlockTracker(),
...getMockNetworkControllerMethods(ROPSTEN_CHAIN_ID),
preferencesController: getMockPreferencesController(),
initState: getNonEmptyInitState(),
},
);
const result = incomingTransactionsController._normalizeTxFromEtherscan(
{
timeStamp: '4444',
isError: '0',
blockNumber: 333,
from: '0xa',
gas: '11',
maxFeePerGas: '12',
maxPriorityFeePerGas: '1',
nonce: '13',
to: '0xe',
value: '15',
hash: '0xg',
},
ROPSTEN_CHAIN_ID,
);
assert.deepStrictEqual(result, {
blockNumber: 333,
id: 54321,
metamaskNetworkId: ROPSTEN_NETWORK_ID,
chainId: ROPSTEN_CHAIN_ID,
status: TRANSACTION_STATUSES.CONFIRMED,
time: 4444000,
txParams: {
from: '0xa',
gas: '0xb',
maxFeePerGas: '0xc',
maxPriorityFeePerGas: '0x1',
nonce: '0xd',
to: '0xe',
value: '0xf',
},
hash: '0xg',
type: TRANSACTION_TYPES.INCOMING,
});
});
});
});

@ -1,8 +1,8 @@
import { createScaffoldMiddleware, mergeMiddleware } from 'json-rpc-engine';
import createBlockReRefMiddleware from 'eth-json-rpc-middleware/block-ref';
import createBlockRefMiddleware from 'eth-json-rpc-middleware/block-ref';
import createRetryOnEmptyMiddleware from 'eth-json-rpc-middleware/retryOnEmpty';
import createBlockCacheMiddleware from 'eth-json-rpc-middleware/block-cache';
import createInflightMiddleware from 'eth-json-rpc-middleware/inflight-cache';
import createInflightCacheMiddleware from 'eth-json-rpc-middleware/inflight-cache';
import createBlockTrackerInspectorMiddleware from 'eth-json-rpc-middleware/block-tracker-inspector';
import providerFromMiddleware from 'eth-json-rpc-middleware/providerFromMiddleware';
import createInfuraMiddleware from 'eth-json-rpc-infura';
@ -23,8 +23,8 @@ export default function createInfuraClient({ network, projectId }) {
const networkMiddleware = mergeMiddleware([
createNetworkAndChainIdMiddleware({ network }),
createBlockCacheMiddleware({ blockTracker }),
createInflightMiddleware(),
createBlockReRefMiddleware({ blockTracker, provider: infuraProvider }),
createInflightCacheMiddleware(),
createBlockRefMiddleware({ blockTracker, provider: infuraProvider }),
createRetryOnEmptyMiddleware({ blockTracker, provider: infuraProvider }),
createBlockTrackerInspectorMiddleware({ blockTracker }),
infuraMiddleware,

@ -1,11 +1,13 @@
import { strict as assert } from 'assert';
import sinon from 'sinon';
import { getNetworkDisplayName } from './util';
import NetworkController from './network';
import NetworkController, { NETWORK_EVENTS } from './network';
describe('NetworkController', function () {
describe('controller', function () {
let networkController;
let getLatestBlockStub;
let setProviderTypeAndWait;
const noop = () => undefined;
const networkControllerProviderConfig = {
getAccounts: noop,
@ -13,7 +15,21 @@ describe('NetworkController', function () {
beforeEach(function () {
networkController = new NetworkController();
getLatestBlockStub = sinon
.stub(networkController, 'getLatestBlock')
.callsFake(() => Promise.resolve({}));
networkController.setInfuraProjectId('foo');
setProviderTypeAndWait = () =>
new Promise((resolve) => {
networkController.on(NETWORK_EVENTS.NETWORK_DID_CHANGE, () => {
resolve();
});
networkController.setProviderType('mainnet');
});
});
afterEach(function () {
getLatestBlockStub.reset();
});
describe('#provider', function () {
@ -67,6 +83,59 @@ describe('NetworkController', function () {
);
});
});
describe('#getEIP1559Compatibility', function () {
it('should return false when baseFeePerGas is not in the block header', async function () {
networkController.initializeProvider(networkControllerProviderConfig);
const supportsEIP1559 = await networkController.getEIP1559Compatibility();
assert.equal(supportsEIP1559, false);
});
it('should return true when baseFeePerGas is in block header', async function () {
networkController.initializeProvider(networkControllerProviderConfig);
getLatestBlockStub.callsFake(() =>
Promise.resolve({ baseFeePerGas: '0xa ' }),
);
const supportsEIP1559 = await networkController.getEIP1559Compatibility();
assert.equal(supportsEIP1559, true);
});
it('should store EIP1559 support in state to reduce calls to getLatestBlock', async function () {
networkController.initializeProvider(networkControllerProviderConfig);
getLatestBlockStub.callsFake(() =>
Promise.resolve({ baseFeePerGas: '0xa ' }),
);
await networkController.getEIP1559Compatibility();
const supportsEIP1559 = await networkController.getEIP1559Compatibility();
assert.equal(getLatestBlockStub.calledOnce, true);
assert.equal(supportsEIP1559, true);
});
it('should clear stored EIP1559 support when changing networks', async function () {
networkController.initializeProvider(networkControllerProviderConfig);
networkController.consoleThis = true;
getLatestBlockStub.callsFake(() =>
Promise.resolve({ baseFeePerGas: '0xa ' }),
);
await networkController.getEIP1559Compatibility();
assert.equal(
networkController.networkDetails.getState().EIPS[1559],
true,
);
getLatestBlockStub.callsFake(() => Promise.resolve({}));
await setProviderTypeAndWait('mainnet');
assert.equal(
networkController.networkDetails.getState().EIPS[1559],
undefined,
);
await networkController.getEIP1559Compatibility();
assert.equal(
networkController.networkDetails.getState().EIPS[1559],
false,
);
assert.equal(getLatestBlockStub.calledTwice, true);
});
});
});
describe('utils', function () {

@ -51,6 +51,10 @@ const defaultProviderConfig = {
...defaultProviderConfigOpts,
};
const defaultNetworkDetailsState = {
EIPS: { 1559: undefined },
};
export const NETWORK_EVENTS = {
// Fired after the actively selected network is changed
NETWORK_DID_CHANGE: 'networkDidChange',
@ -74,10 +78,21 @@ export default class NetworkController extends EventEmitter {
this.providerStore.getState(),
);
this.networkStore = new ObservableStore('loading');
// We need to keep track of a few details about the current network
// Ideally we'd merge this.networkStore with this new store, but doing so
// will require a decent sized refactor of how we're accessing network
// state. Currently this is only used for detecting EIP 1559 support but
// can be extended to track other network details.
this.networkDetails = new ObservableStore(
opts.networkDetails || {
...defaultNetworkDetailsState,
},
);
this.store = new ComposedStore({
provider: this.providerStore,
previousProviderStore: this.previousProviderStore,
network: this.networkStore,
networkDetails: this.networkDetails,
});
// provider and block tracker
@ -120,6 +135,45 @@ export default class NetworkController extends EventEmitter {
return { provider, blockTracker };
}
/**
* Method to return the latest block for the current network
* @returns {Object} Block header
*/
getLatestBlock() {
return new Promise((resolve, reject) => {
const { provider } = this.getProviderAndBlockTracker();
const ethQuery = new EthQuery(provider);
ethQuery.sendAsync(
{ method: 'eth_getBlockByNumber', params: ['latest', false] },
(err, block) => {
if (err) {
return reject(err);
}
return resolve(block);
},
);
});
}
/**
* Method to check if the block header contains fields that indicate EIP 1559
* support (baseFeePerGas).
* @returns {Promise<boolean>} true if current network supports EIP 1559
*/
async getEIP1559Compatibility() {
const { EIPS } = this.networkDetails.getState();
if (process.env.SHOW_EIP_1559_UI === false) {
return false;
}
if (EIPS[1559] !== undefined) {
return EIPS[1559];
}
const latestBlock = await this.getLatestBlock();
const supportsEIP1559 = latestBlock.baseFeePerGas !== undefined;
this.setNetworkEIPSupport(1559, supportsEIP1559);
return supportsEIP1559;
}
verifyNetwork() {
// Check network when restoring connectivity:
if (this.isNetworkLoading()) {
@ -135,6 +189,26 @@ export default class NetworkController extends EventEmitter {
this.networkStore.putState(network);
}
/**
* Set EIP support indication in the networkDetails store
* @param {number} EIPNumber - The number of the EIP to mark support for
* @param {boolean} isSupported - True if the EIP is supported
*/
setNetworkEIPSupport(EIPNumber, isSupported) {
this.networkDetails.updateState({
EIPS: {
[EIPNumber]: isSupported,
},
});
}
/**
* Reset EIP support to default (no support)
*/
clearNetworkDetails() {
this.networkDetails.putState({ ...defaultNetworkDetailsState });
}
isNetworkLoading() {
return this.getNetworkState() === 'loading';
}
@ -154,6 +228,8 @@ export default class NetworkController extends EventEmitter {
'NetworkController - lookupNetwork aborted due to missing chainId',
);
this.setNetworkState('loading');
// keep network details in sync with network state
this.clearNetworkDetails();
return;
}
@ -174,10 +250,14 @@ export default class NetworkController extends EventEmitter {
if (initialNetwork === currentNetwork) {
if (err) {
this.setNetworkState('loading');
// keep network details in sync with network state
this.clearNetworkDetails();
return;
}
this.setNetworkState(networkVersion);
// look up EIP-1559 support
this.getEIP1559Compatibility();
}
});
}
@ -298,9 +378,15 @@ export default class NetworkController extends EventEmitter {
}
_switchNetwork(opts) {
// Indicate to subscribers that network is about to change
this.emit(NETWORK_EVENTS.NETWORK_WILL_CHANGE);
// Set loading state
this.setNetworkState('loading');
// Reset network details
this.clearNetworkDetails();
// Configure the provider appropriately
this._configureProvider(opts);
// Notify subscribers that network has changed
this.emit(NETWORK_EVENTS.NETWORK_DID_CHANGE, opts.type);
}

@ -15,7 +15,7 @@ import {
} from '../../../shared/modules/hexstring-utils';
import { NETWORK_EVENTS } from './network';
const ERC721METADATA_INTERFACE_ID = '0x5b5e139f';
const ERC721_INTERFACE_ID = '0x80ac58cd';
export default class PreferencesController {
/**
@ -51,6 +51,7 @@ export default class PreferencesController {
useNonceField: false,
usePhishDetect: true,
dismissSeedBackUpReminder: false,
useStaticTokenList: false,
// WARNING: Do not use feature flags for security-sensitive things.
// Feature flag toggling is available in the global namespace
@ -138,6 +139,16 @@ export default class PreferencesController {
this.store.updateState({ usePhishDetect: val });
}
/**
* Setter for the `useStaticTokenList` property
*
* @param {boolean} val - Whether or not the user prefers to use the static token list or dynamic token list from the API
*
*/
setUseStaticTokenList(val) {
this.store.updateState({ useStaticTokenList: val });
}
/**
* Setter for the `firstTimeFlowType` property
*
@ -803,7 +814,7 @@ export default class PreferencesController {
);
return await tokenContract
.supportsInterface(ERC721METADATA_INTERFACE_ID)
.supportsInterface(ERC721_INTERFACE_ID)
.catch((error) => {
console.log('error', error);
log.debug(error);

@ -30,6 +30,9 @@ describe('preferences controller', function () {
network.initializeProvider(networkControllerProviderConfig);
provider = network.getProviderAndBlockTracker().provider;
sandbox
.stub(network, 'getLatestBlock')
.callsFake(() => Promise.resolve({}));
sandbox.stub(network, 'getCurrentChainId').callsFake(() => currentChainId);
sandbox
.stub(network, 'getProviderConfig')
@ -866,4 +869,22 @@ describe('preferences controller', function () {
);
});
});
describe('setUseStaticTokenList', function () {
it('should default to false', function () {
const state = preferencesController.store.getState();
assert.equal(state.useStaticTokenList, false);
});
it('should set the useStaticTokenList property in state', function () {
assert.equal(
preferencesController.store.getState().useStaticTokenList,
false,
);
preferencesController.setUseStaticTokenList(true);
assert.equal(
preferencesController.store.getState().useStaticTokenList,
true,
);
});
});
});

@ -6,7 +6,7 @@ import { mapValues, cloneDeep } from 'lodash';
import abi from 'human-standard-token-abi';
import { calcTokenAmount } from '../../../ui/helpers/utils/token-util';
import { calcGasTotal } from '../../../ui/pages/send/send.utils';
import { conversionUtil } from '../../../ui/helpers/utils/conversion-util';
import { conversionUtil } from '../../../shared/modules/conversion.utils';
import {
DEFAULT_ERC20_APPROVE_GAS,
QUOTES_EXPIRED_ERROR,

@ -1,10 +1,11 @@
import EventEmitter from 'safe-event-emitter';
import { ObservableStore } from '@metamask/obs-store';
import Transaction from 'ethereumjs-tx';
import { bufferToHex, keccak, toBuffer, isHexString } from 'ethereumjs-util';
import EthQuery from 'ethjs-query';
import { ethErrors } from 'eth-rpc-errors';
import abi from 'human-standard-token-abi';
import Common from '@ethereumjs/common';
import { TransactionFactory } from '@ethereumjs/tx';
import { ethers } from 'ethers';
import NonceTracker from 'nonce-tracker';
import log from 'loglevel';
@ -23,10 +24,16 @@ import { hexWEIToDecGWEI } from '../../../../ui/helpers/utils/conversions.util';
import {
TRANSACTION_STATUSES,
TRANSACTION_TYPES,
TRANSACTION_ENVELOPE_TYPES,
} from '../../../../shared/constants/transaction';
import { METAMASK_CONTROLLER_EVENTS } from '../../metamask-controller';
import { GAS_LIMITS } from '../../../../shared/constants/gas';
import { CHAIN_ID_TO_GAS_LIMIT_BUFFER_MAP } from '../../../../shared/constants/network';
import {
HARDFORKS,
MAINNET,
NETWORK_TYPE_RPC,
CHAIN_ID_TO_GAS_LIMIT_BUFFER_MAP,
} from '../../../../shared/constants/network';
import { isEIP1559Transaction } from '../../../../shared/modules/transaction.utils';
import TransactionStateManager from './tx-state-manager';
import TxGasUtil from './tx-gas-utils';
@ -45,6 +52,16 @@ export const TRANSACTION_EVENTS = {
SUBMITTED: 'Transaction Submitted',
};
/**
* @typedef {Object} CustomGasSettings
* @property {string} [gas] - The gas limit to use for the transaction
* @property {string} [gasPrice] - The gasPrice to use for a legacy transaction
* @property {string} [maxFeePerGas] - The maximum amount to pay per gas on a
* EIP-1559 transaction
* @property {string} [maxPriorityFeePerGas] - The maximum amount of paid fee
* to be distributed to miner in an EIP-1559 transaction
*/
/**
Transaction Controller is an aggregate of sub-controllers and trackers
composing them in a way to be exposed to the metamask controller
@ -65,7 +82,7 @@ export const TRANSACTION_EVENTS = {
@param {Object} opts.networkStore - an observable store for network number
@param {Object} opts.blockTracker - An instance of eth-blocktracker
@param {Object} opts.provider - A network provider.
@param {Function} opts.signTransaction - function the signs an ethereumjs-tx
@param {Function} opts.signTransaction - function the signs an @ethereumjs/tx
@param {Object} opts.getPermittedAccounts - get accounts that an origin has permissions for
@param {Function} opts.signTransaction - ethTx signer that returns a rawTx
@param {number} [opts.txHistoryLimit] - number *optional* for limiting how many transactions are in state
@ -77,6 +94,8 @@ export default class TransactionController extends EventEmitter {
super();
this.networkStore = opts.networkStore || new ObservableStore({});
this._getCurrentChainId = opts.getCurrentChainId;
this.getProviderConfig = opts.getProviderConfig;
this.getEIP1559Compatibility = opts.getEIP1559Compatibility;
this.preferencesStore = opts.preferencesStore || new ObservableStore({});
this.provider = opts.provider;
this.getPermittedAccounts = opts.getPermittedAccounts;
@ -158,6 +177,58 @@ export default class TransactionController extends EventEmitter {
return integerChainId;
}
/**
* @ethereumjs/tx uses @ethereumjs/common as a configuration tool for
* specifying which chain, network, hardfork and EIPs to support for
* a transaction. By referencing this configuration, and analyzing the fields
* specified in txParams, @ethereumjs/tx is able to determine which EIP-2718
* transaction type to use.
* @returns {Common} common configuration object
*/
async getCommonConfiguration() {
const { type, nickname: name } = this.getProviderConfig();
const supportsEIP1559 = await this.getEIP1559Compatibility();
// This logic below will have to be updated each time a hardfork happens
// that carries with it a new Transaction type. It is inconsequential for
// hardforks that do not include new types.
const hardfork = supportsEIP1559 ? HARDFORKS.LONDON : HARDFORKS.BERLIN;
// type will be one of our default network names or 'rpc'. the default
// network names are sufficient configuration, simply pass the name as the
// chain argument in the constructor.
if (type !== NETWORK_TYPE_RPC) {
return new Common({
chain: type,
hardfork,
});
}
// For 'rpc' we need to use the same basic configuration as mainnet,
// since we only support EVM compatible chains, and then override the
// name, chainId and networkId properties. This is done using the
// `forCustomChain` static method on the Common class.
const chainId = parseInt(this._getCurrentChainId(), 16);
const networkId = this.networkStore.getState();
const customChainParams = {
name,
chainId,
// It is improbable for a transaction to be signed while the network
// is loading for two reasons.
// 1. Pending, unconfirmed transactions are wiped on network change
// 2. The UI is unusable (loading indicator) when network is loading.
// setting the networkId to 0 is for type safety and to explicity lead
// the transaction to failing if a user is able to get to this branch
// on a custom network that requires valid network id. I have not ran
// into this limitation on any network I have attempted, even when
// hardcoding networkId to 'loading'.
networkId: networkId === 'loading' ? 0 : parseInt(networkId, 10),
};
return Common.forCustomChain(MAINNET, customChainParams, hardfork);
}
/**
Adds a tx to the txlist
@emits ${txMeta.id}:unapproved
@ -251,6 +322,7 @@ export default class TransactionController extends EventEmitter {
*/
let txMeta = this.txStateManager.generateTxMeta({
txParams: normalizedTxParams,
origin,
});
if (origin === 'metamask') {
@ -274,8 +346,6 @@ export default class TransactionController extends EventEmitter {
}
}
txMeta.origin = origin;
const { type, getCodeResponse } = await this._determineTransactionType(
txParams,
);
@ -329,7 +399,12 @@ export default class TransactionController extends EventEmitter {
if (simulationFails) {
txMeta.simulationFails = simulationFails;
}
if (defaultGasPrice && !txMeta.txParams.gasPrice) {
if (
defaultGasPrice &&
!txMeta.txParams.gasPrice &&
!txMeta.txParams.maxPriorityFeePerGas &&
!txMeta.txParams.maxFeePerGas
) {
txMeta.txParams.gasPrice = defaultGasPrice;
}
if (defaultGasLimit && !txMeta.txParams.gas) {
@ -344,7 +419,10 @@ export default class TransactionController extends EventEmitter {
* @returns {Promise<string|undefined>} The default gas price
*/
async _getDefaultGasPrice(txMeta) {
if (txMeta.txParams.gasPrice) {
if (
txMeta.txParams.gasPrice ||
(txMeta.txParams.maxFeePerGas && txMeta.txParams.maxPriorityFeePerGas)
) {
return undefined;
}
const gasPrice = await this.query.gasPrice();
@ -402,32 +480,105 @@ export default class TransactionController extends EventEmitter {
return { gasLimit, simulationFails };
}
/**
* Given a TransactionMeta object, generate new gas params such that if the
* transaction was an EIP1559 transaction, it only has EIP1559 gas fields,
* otherwise it only has gasPrice. Will use whatever custom values are
* specified in customGasSettings, or falls back to incrementing by a percent
* which is defined by specifying a numerator. 11 is a 10% bump, 12 would be
* a 20% bump, and so on.
* @param {import(
* '../../../../shared/constants/transaction'
* ).TransactionMeta} originalTxMeta - Original transaction to use as base
* @param {CustomGasSettings} [customGasSettings] - overrides for the gas
* fields to use instead of the multiplier
* @param {number} [incrementNumerator] - Numerator from which to generate a
* percentage bump of gas price. E.g 11 would be a 10% bump over base.
* @returns {{ newGasParams: CustomGasSettings, previousGasParams: CustomGasSettings }}
*/
generateNewGasParams(
originalTxMeta,
customGasSettings = {},
incrementNumerator = 11,
) {
const { txParams } = originalTxMeta;
const previousGasParams = {};
const newGasParams = {};
if (customGasSettings.gasLimit) {
newGasParams.gas = customGasSettings?.gas ?? GAS_LIMITS.SIMPLE;
}
if (isEIP1559Transaction(originalTxMeta)) {
previousGasParams.maxFeePerGas = txParams.maxFeePerGas;
previousGasParams.maxPriorityFeePerGas = txParams.maxPriorityFeePerGas;
newGasParams.maxFeePerGas =
customGasSettings?.maxFeePerGas ||
bnToHex(
BnMultiplyByFraction(
hexToBn(txParams.maxFeePerGas),
incrementNumerator,
10,
),
);
newGasParams.maxPriorityFeePerGas =
customGasSettings?.maxPriorityFeePerGas ||
bnToHex(
BnMultiplyByFraction(
hexToBn(txParams.maxPriorityFeePerGas),
incrementNumerator,
10,
),
);
} else {
previousGasParams.gasPrice = txParams.gasPrice;
newGasParams.gasPrice =
customGasSettings?.gasPrice ||
bnToHex(
BnMultiplyByFraction(
hexToBn(txParams.gasPrice),
incrementNumerator,
10,
),
);
}
return { previousGasParams, newGasParams };
}
/**
* Creates a new approved transaction to attempt to cancel a previously submitted transaction. The
* new transaction contains the same nonce as the previous, is a basic ETH transfer of 0x value to
* the sender's address, and has a higher gasPrice than that of the previous transaction.
* @param {number} originalTxId - the id of the txMeta that you want to attempt to cancel
* @param {string} [customGasPrice] - the hex value to use for the cancel transaction
* @param {CustomGasSettings} [customGasSettings] - overrides to use for gas
* params instead of allowing this method to generate them
* @returns {txMeta}
*/
async createCancelTransaction(originalTxId, customGasPrice, customGasLimit) {
async createCancelTransaction(originalTxId, customGasSettings) {
const originalTxMeta = this.txStateManager.getTransaction(originalTxId);
const { txParams } = originalTxMeta;
const { gasPrice: lastGasPrice, from, nonce } = txParams;
const { from, nonce } = txParams;
const { previousGasParams, newGasParams } = this.generateNewGasParams(
originalTxMeta,
{
...customGasSettings,
// We want to override the previous transactions gasLimit because it
// will now be a simple send instead of whatever it was before such
// as a token transfer or contract call.
gasLimit: customGasSettings.gasLimit || GAS_LIMITS.SIMPLE,
},
);
const newGasPrice =
customGasPrice ||
bnToHex(BnMultiplyByFraction(hexToBn(lastGasPrice), 11, 10));
const newTxMeta = this.txStateManager.generateTxMeta({
txParams: {
from,
to: from,
nonce,
gas: customGasLimit || GAS_LIMITS.SIMPLE,
value: '0x0',
gasPrice: newGasPrice,
...newGasParams,
},
lastGasPrice,
previousGasParams,
loadingDefaults: false,
status: TRANSACTION_STATUSES.APPROVED,
type: TRANSACTION_TYPES.CANCEL,
@ -444,34 +595,30 @@ export default class TransactionController extends EventEmitter {
* the same gas limit and a 10% higher gas price, though it is possible to set a custom value for
* each instead.
* @param {number} originalTxId - the id of the txMeta that you want to speed up
* @param {string} [customGasPrice] - The new custom gas price, in hex
* @param {string} [customGasLimit] - The new custom gas limt, in hex
* @param {CustomGasSettings} [customGasSettings] - overrides to use for gas
* params instead of allowing this method to generate them
* @returns {txMeta}
*/
async createSpeedUpTransaction(originalTxId, customGasPrice, customGasLimit) {
async createSpeedUpTransaction(originalTxId, customGasSettings) {
const originalTxMeta = this.txStateManager.getTransaction(originalTxId);
const { txParams } = originalTxMeta;
const { gasPrice: lastGasPrice } = txParams;
const newGasPrice =
customGasPrice ||
bnToHex(BnMultiplyByFraction(hexToBn(lastGasPrice), 11, 10));
const { previousGasParams, newGasParams } = this.generateNewGasParams(
originalTxMeta,
customGasSettings,
);
const newTxMeta = this.txStateManager.generateTxMeta({
txParams: {
...txParams,
gasPrice: newGasPrice,
...newGasParams,
},
lastGasPrice,
previousGasParams,
loadingDefaults: false,
status: TRANSACTION_STATUSES.APPROVED,
type: TRANSACTION_TYPES.RETRY,
});
if (customGasLimit) {
newTxMeta.txParams.gas = customGasLimit;
}
this.addTransaction(newTxMeta);
await this.approveTransaction(newTxMeta.id);
return newTxMeta;
@ -530,9 +677,9 @@ export default class TransactionController extends EventEmitter {
customNonceValue = Number(customNonceValue);
nonceLock = await this.nonceTracker.getNonceLock(fromAddress);
// add nonce to txParams
// if txMeta has lastGasPrice then it is a retry at same nonce with higher
// gas price transaction and their for the nonce should not be calculated
const nonce = txMeta.lastGasPrice
// if txMeta has previousGasParams then it is a retry at same nonce with
// higher gas settings and therefor the nonce should not be recalculated
const nonce = txMeta.previousGasParams
? txMeta.txParams.nonce
: nonceLock.nextNonce;
const customOrNonce =
@ -581,17 +728,26 @@ export default class TransactionController extends EventEmitter {
const txMeta = this.txStateManager.getTransaction(txId);
// add network/chain id
const chainId = this.getChainId();
const txParams = { ...txMeta.txParams, chainId };
const type = isEIP1559Transaction(txMeta)
? TRANSACTION_ENVELOPE_TYPES.FEE_MARKET
: TRANSACTION_ENVELOPE_TYPES.LEGACY;
const txParams = {
type,
...txMeta.txParams,
chainId,
gasLimit: txMeta.txParams.gas,
};
// sign tx
const fromAddress = txParams.from;
const ethTx = new Transaction(txParams);
await this.signEthTx(ethTx, fromAddress);
const common = await this.getCommonConfiguration();
const unsignedEthTx = TransactionFactory.fromTxData(txParams, { common });
const signedEthTx = await this.signEthTx(unsignedEthTx, fromAddress);
// add r,s,v values for provider request purposes see createMetamaskMiddleware
// and JSON rpc standard for further explanation
txMeta.r = bufferToHex(ethTx.r);
txMeta.s = bufferToHex(ethTx.s);
txMeta.v = bufferToHex(ethTx.v);
txMeta.r = bufferToHex(signedEthTx.r);
txMeta.s = bufferToHex(signedEthTx.s);
txMeta.v = bufferToHex(signedEthTx.v);
this.txStateManager.updateTransaction(
txMeta,
@ -600,7 +756,7 @@ export default class TransactionController extends EventEmitter {
// set state to signed
this.txStateManager.setTxStatusSigned(txMeta.id);
const rawTx = bufferToHex(ethTx.serialize());
const rawTx = bufferToHex(signedEthTx.serialize());
return rawTx;
}

@ -1,7 +1,7 @@
import { strict as assert } from 'assert';
import EventEmitter from 'events';
import { toBuffer } from 'ethereumjs-util';
import EthTx from 'ethereumjs-tx';
import { TransactionFactory } from '@ethereumjs/tx';
import { ObservableStore } from '@metamask/obs-store';
import sinon from 'sinon';
@ -20,6 +20,9 @@ import TransactionController, { TRANSACTION_EVENTS } from '.';
const noop = () => true;
const currentNetworkId = '42';
const currentChainId = '0x2a';
const providerConfig = {
type: 'kovan',
};
const VALID_ADDRESS = '0x0000000000000000000000000000000000000000';
const VALID_ADDRESS_TWO = '0x0000000000000000000000000000000000000001';
@ -36,6 +39,7 @@ describe('Transaction Controller', function () {
};
provider = createTestProviderTools({ scaffold: providerResultStub })
.provider;
fromAccount = getTestAccounts()[0];
const blockTrackerStub = new EventEmitter();
blockTrackerStub.getCurrentBlock = noop;
@ -46,13 +50,14 @@ describe('Transaction Controller', function () {
return '0xee6b2800';
},
networkStore: new ObservableStore(currentNetworkId),
getEIP1559Compatibility: () => Promise.resolve(true),
txHistoryLimit: 10,
blockTracker: blockTrackerStub,
signTransaction: (ethTx) =>
new Promise((resolve) => {
ethTx.sign(fromAccount.key);
resolve();
resolve(ethTx.sign(fromAccount.key));
}),
getProviderConfig: () => providerConfig,
getPermittedAccounts: () => undefined,
getCurrentChainId: () => currentChainId,
getParticipateInMetrics: () => false,
@ -565,8 +570,8 @@ describe('Transaction Controller', function () {
noop,
);
const rawTx = await txController.signTransaction('1');
const ethTx = new EthTx(toBuffer(rawTx));
assert.equal(ethTx.getChainId(), 42);
const ethTx = TransactionFactory.fromSerializedData(toBuffer(rawTx));
assert.equal(ethTx.common.chainIdBN().toNumber(), 42);
});
});
@ -734,11 +739,11 @@ describe('Transaction Controller', function () {
const addTransactionArgs = addTransactionSpy.getCall(0).args[0];
assert.deepEqual(addTransactionArgs.txParams, expectedTxParams);
const { lastGasPrice, type } = addTransactionArgs;
const { previousGasParams, type } = addTransactionArgs;
assert.deepEqual(
{ lastGasPrice, type },
{ gasPrice: previousGasParams.gasPrice, type },
{
lastGasPrice: '0xa',
gasPrice: '0xa',
type: TRANSACTION_TYPES.RETRY,
},
);
@ -757,17 +762,70 @@ describe('Transaction Controller', function () {
assert.deepEqual(result.txParams, expectedTxParams);
const { lastGasPrice, type } = result;
const { previousGasParams, type } = result;
assert.deepEqual(
{ lastGasPrice, type },
{ gasPrice: previousGasParams.gasPrice, type },
{
lastGasPrice: '0xa',
gasPrice: '0xa',
type: TRANSACTION_TYPES.RETRY,
},
);
});
});
describe('#signTransaction', function () {
let fromTxDataSpy;
beforeEach(function () {
fromTxDataSpy = sinon.spy(TransactionFactory, 'fromTxData');
});
afterEach(function () {
fromTxDataSpy.restore();
});
it('sets txParams.type to 0x0 (non-EIP-1559)', async function () {
txController.txStateManager._addTransactionsToState([
{
status: TRANSACTION_STATUSES.UNAPPROVED,
id: 1,
metamaskNetworkId: currentNetworkId,
history: [{}],
txParams: {
from: VALID_ADDRESS_TWO,
to: VALID_ADDRESS,
gasPrice: '0x77359400',
gas: '0x7b0d',
nonce: '0x4b',
},
},
]);
await txController.signTransaction('1');
assert.equal(fromTxDataSpy.getCall(0).args[0].type, '0x0');
});
it('sets txParams.type to 0x2 (EIP-1559)', async function () {
txController.txStateManager._addTransactionsToState([
{
status: TRANSACTION_STATUSES.UNAPPROVED,
id: 2,
metamaskNetworkId: currentNetworkId,
history: [{}],
txParams: {
from: VALID_ADDRESS_TWO,
to: VALID_ADDRESS,
maxFeePerGas: '0x77359400',
maxPriorityFeePerGas: '0x77359400',
gas: '0x7b0d',
nonce: '0x4b',
},
},
]);
await txController.signTransaction('2');
assert.equal(fromTxDataSpy.getCall(0).args[0].type, '0x2');
});
});
describe('#publishTransaction', function () {
let hash, txMeta, trackTransactionMetricsEventSpy;

@ -1,17 +1,23 @@
import { ethErrors } from 'eth-rpc-errors';
import { addHexPrefix } from '../../../lib/util';
import { TRANSACTION_STATUSES } from '../../../../../shared/constants/transaction';
import {
TRANSACTION_ENVELOPE_TYPES,
TRANSACTION_STATUSES,
} from '../../../../../shared/constants/transaction';
import { isValidHexAddress } from '../../../../../shared/modules/hexstring-utils';
const normalizers = {
from: (from) => addHexPrefix(from),
from: addHexPrefix,
to: (to, lowerCase) =>
lowerCase ? addHexPrefix(to).toLowerCase() : addHexPrefix(to),
nonce: (nonce) => addHexPrefix(nonce),
value: (value) => addHexPrefix(value),
data: (data) => addHexPrefix(data),
gas: (gas) => addHexPrefix(gas),
gasPrice: (gasPrice) => addHexPrefix(gasPrice),
nonce: addHexPrefix,
value: addHexPrefix,
data: addHexPrefix,
gas: addHexPrefix,
gasPrice: addHexPrefix,
maxFeePerGas: addHexPrefix,
maxPriorityFeePerGas: addHexPrefix,
type: addHexPrefix,
};
export function normalizeAndValidateTxParams(txParams, lowerCase = true) {
@ -38,6 +44,78 @@ export function normalizeTxParams(txParams, lowerCase = true) {
return normalizedTxParams;
}
/**
* Given two fields, ensure that the second field is not included in txParams,
* and if it is throw an invalidParams error.
* @param {Object} txParams - the transaction parameters object
* @param {string} fieldBeingValidated - the current field being validated
* @param {string} mutuallyExclusiveField - the field to ensure is not provided
* @throws {ethErrors.rpc.invalidParams} - throws if mutuallyExclusiveField is
* present in txParams.
*/
function ensureMutuallyExclusiveFieldsNotProvided(
txParams,
fieldBeingValidated,
mutuallyExclusiveField,
) {
if (typeof txParams[mutuallyExclusiveField] !== 'undefined') {
throw ethErrors.rpc.invalidParams(
`Invalid transaction params: specified ${fieldBeingValidated} but also included ${mutuallyExclusiveField}, these cannot be mixed`,
);
}
}
/**
* Ensures that the provided value for field is a string, throws an
* invalidParams error if field is not a string.
* @param {Object} txParams - the transaction parameters object
* @param {string} field - the current field being validated
* @throws {ethErrors.rpc.invalidParams} - throws if field is not a string
*/
function ensureFieldIsString(txParams, field) {
if (typeof txParams[field] !== 'string') {
throw ethErrors.rpc.invalidParams(
`Invalid transaction params: ${field} is not a string. got: (${txParams[field]})`,
);
}
}
/**
* Ensures that the provided txParams has the proper 'type' specified for the
* given field, if it is provided. If types do not match throws an
* invalidParams error.
* @param {Object} txParams - the transaction parameters object
* @param {'gasPrice' | 'maxFeePerGas' | 'maxPriorityFeePerGas'} field - the
* current field being validated
* @throws {ethErrors.rpc.invalidParams} - throws if type does not match the
* expectations for provided field.
*/
function ensureProperTransactionEnvelopeTypeProvided(txParams, field) {
switch (field) {
case 'maxFeePerGas':
case 'maxPriorityFeePerGas':
if (
txParams.type &&
txParams.type !== TRANSACTION_ENVELOPE_TYPES.FEE_MARKET
) {
throw ethErrors.rpc.invalidParams(
`Invalid transaction envelope type: specified type "${txParams.type}" but including maxFeePerGas and maxPriorityFeePerGas requires type: "${TRANSACTION_ENVELOPE_TYPES.FEE_MARKET}"`,
);
}
break;
case 'gasPrice':
default:
if (
txParams.type &&
txParams.type === TRANSACTION_ENVELOPE_TYPES.FEE_MARKET
) {
throw ethErrors.rpc.invalidParams(
`Invalid transaction envelope type: specified type "${txParams.type}" but included a gasPrice instead of maxFeePerGas and maxPriorityFeePerGas`,
);
}
}
}
/**
* Validates the given tx parameters
* @param {Object} txParams - the tx params
@ -64,12 +142,43 @@ export function validateTxParams(txParams) {
case 'to':
validateRecipient(txParams);
break;
case 'gasPrice':
ensureProperTransactionEnvelopeTypeProvided(txParams, 'gasPrice');
ensureMutuallyExclusiveFieldsNotProvided(
txParams,
'gasPrice',
'maxFeePerGas',
);
ensureMutuallyExclusiveFieldsNotProvided(
txParams,
'gasPrice',
'maxPriorityFeePerGas',
);
ensureFieldIsString(txParams, 'gasPrice');
break;
case 'maxFeePerGas':
ensureProperTransactionEnvelopeTypeProvided(txParams, 'maxFeePerGas');
ensureMutuallyExclusiveFieldsNotProvided(
txParams,
'maxFeePerGas',
'gasPrice',
);
ensureFieldIsString(txParams, 'maxFeePerGas');
break;
case 'maxPriorityFeePerGas':
ensureProperTransactionEnvelopeTypeProvided(
txParams,
'maxPriorityFeePerGas',
);
ensureMutuallyExclusiveFieldsNotProvided(
txParams,
'maxPriorityFeePerGas',
'gasPrice',
);
ensureFieldIsString(txParams, 'maxPriorityFeePerGas');
break;
case 'value':
if (typeof value !== 'string') {
throw ethErrors.rpc.invalidParams(
`Invalid transaction params: ${key} is not a string. got: (${value})`,
);
}
ensureFieldIsString(txParams, 'value');
if (value.toString().includes('-')) {
throw ethErrors.rpc.invalidParams(
`Invalid transaction value "${value}": not a positive number.`,
@ -90,11 +199,7 @@ export function validateTxParams(txParams) {
}
break;
default:
if (typeof value !== 'string') {
throw ethErrors.rpc.invalidParams(
`Invalid transaction params: ${key} is not a string. got: (${value})`,
);
}
ensureFieldIsString(txParams, key);
}
});
}

@ -1,4 +1,6 @@
import { strict as assert } from 'assert';
import { TRANSACTION_ENVELOPE_TYPES } from '../../../../../shared/constants/transaction';
import { BURN_ADDRESS } from '../../../../../shared/modules/hexstring-utils';
import * as txUtils from './util';
describe('txUtils', function () {
@ -48,6 +50,239 @@ describe('txUtils', function () {
message: 'Invalid transaction value "-0x01": not a positive number.',
});
});
describe('when validating gasPrice', function () {
it('should error when specifying incorrect type', function () {
const txParams = {
gasPrice: '0x1',
type: TRANSACTION_ENVELOPE_TYPES.FEE_MARKET,
to: BURN_ADDRESS,
};
assert.throws(
() => {
txUtils.validateTxParams(txParams);
},
{
message: `Invalid transaction envelope type: specified type "0x2" but included a gasPrice instead of maxFeePerGas and maxPriorityFeePerGas`,
},
);
});
it('should error when gasPrice is not a string', function () {
const txParams = {
gasPrice: 1,
to: BURN_ADDRESS,
};
assert.throws(
() => {
txUtils.validateTxParams(txParams);
},
{
message:
'Invalid transaction params: gasPrice is not a string. got: (1)',
},
);
});
it('should error when specifying maxFeePerGas', function () {
const txParams = {
gasPrice: '0x1',
maxFeePerGas: '0x1',
to: BURN_ADDRESS,
};
assert.throws(
() => {
txUtils.validateTxParams(txParams);
},
{
message:
'Invalid transaction params: specified gasPrice but also included maxFeePerGas, these cannot be mixed',
},
);
});
it('should error when specifying maxPriorityFeePerGas', function () {
const txParams = {
gasPrice: '0x1',
maxPriorityFeePerGas: '0x1',
to: BURN_ADDRESS,
};
assert.throws(
() => {
txUtils.validateTxParams(txParams);
},
{
message:
'Invalid transaction params: specified gasPrice but also included maxPriorityFeePerGas, these cannot be mixed',
},
);
});
it('should validate if gasPrice is set with no type or EIP-1559 gas fields', function () {
const txParams = {
gasPrice: '0x1',
to: BURN_ADDRESS,
};
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
});
it('should validate if gasPrice is set with a type of "0x0"', function () {
const txParams = {
gasPrice: '0x1',
type: TRANSACTION_ENVELOPE_TYPES.LEGACY,
to: BURN_ADDRESS,
};
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
});
});
describe('when validating maxFeePerGas', function () {
it('should error when specifying incorrect type', function () {
const txParams = {
maxFeePerGas: '0x1',
type: TRANSACTION_ENVELOPE_TYPES.LEGACY,
to: BURN_ADDRESS,
};
assert.throws(
() => {
txUtils.validateTxParams(txParams);
},
{
message:
'Invalid transaction envelope type: specified type "0x0" but including maxFeePerGas and maxPriorityFeePerGas requires type: "0x2"',
},
);
});
it('should error when maxFeePerGas is not a string', function () {
const txParams = {
maxFeePerGas: 1,
to: BURN_ADDRESS,
};
assert.throws(
() => {
txUtils.validateTxParams(txParams);
},
{
message:
'Invalid transaction params: maxFeePerGas is not a string. got: (1)',
},
);
});
it('should error when specifying gasPrice', function () {
const txParams = {
gasPrice: '0x1',
maxFeePerGas: '0x1',
to: BURN_ADDRESS,
};
assert.throws(
() => {
txUtils.validateTxParams(txParams);
},
{
message:
'Invalid transaction params: specified gasPrice but also included maxFeePerGas, these cannot be mixed',
},
);
});
it('should validate if maxFeePerGas is set with no type or gasPrice field', function () {
const txParams = {
maxFeePerGas: '0x1',
to: BURN_ADDRESS,
};
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
});
it('should validate if maxFeePerGas is set with a type of "0x2"', function () {
const txParams = {
maxFeePerGas: '0x1',
type: TRANSACTION_ENVELOPE_TYPES.FEE_MARKET,
to: BURN_ADDRESS,
};
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
});
});
describe('when validating maxPriorityFeePerGas', function () {
it('should error when specifying incorrect type', function () {
const txParams = {
maxPriorityFeePerGas: '0x1',
type: TRANSACTION_ENVELOPE_TYPES.LEGACY,
to: BURN_ADDRESS,
};
assert.throws(
() => {
txUtils.validateTxParams(txParams);
},
{
message:
'Invalid transaction envelope type: specified type "0x0" but including maxFeePerGas and maxPriorityFeePerGas requires type: "0x2"',
},
);
});
it('should error when maxFeePerGas is not a string', function () {
const txParams = {
maxPriorityFeePerGas: 1,
to: BURN_ADDRESS,
};
assert.throws(
() => {
txUtils.validateTxParams(txParams);
},
{
message:
'Invalid transaction params: maxPriorityFeePerGas is not a string. got: (1)',
},
);
});
it('should error when specifying gasPrice', function () {
const txParams = {
gasPrice: '0x1',
maxPriorityFeePerGas: '0x1',
to: BURN_ADDRESS,
};
assert.throws(
() => {
txUtils.validateTxParams(txParams);
},
{
message:
'Invalid transaction params: specified gasPrice but also included maxPriorityFeePerGas, these cannot be mixed',
},
);
});
it('should validate if maxPriorityFeePerGas is set with no type or gasPrice field', function () {
const txParams = {
maxPriorityFeePerGas: '0x1',
to: BURN_ADDRESS,
};
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
});
it('should validate if maxPriorityFeePerGas is set with a type of "0x2"', function () {
const txParams = {
maxPriorityFeePerGas: '0x1',
type: TRANSACTION_ENVELOPE_TYPES.FEE_MARKET,
to: BURN_ADDRESS,
};
assert.doesNotThrow(() => txUtils.validateTxParams(txParams));
});
});
});
describe('#normalizeTxParams', function () {
@ -58,6 +293,10 @@ describe('txUtils', function () {
to: null,
data: '68656c6c6f20776f726c64',
random: 'hello world',
gasPrice: '1',
maxFeePerGas: '1',
maxPriorityFeePerGas: '1',
type: '1',
};
let normalizedTxParams = txUtils.normalizeTxParams(txParams);
@ -89,6 +328,28 @@ describe('txUtils', function () {
'0x',
'to should be hex-prefixed',
);
assert.equal(
normalizedTxParams.gasPrice,
'0x1',
'gasPrice should be hex-prefixed',
);
assert.equal(
normalizedTxParams.maxFeePerGas,
'0x1',
'maxFeePerGas should be hex-prefixed',
);
assert.equal(
normalizedTxParams.maxPriorityFeePerGas,
'0x1',
'maxPriorityFeePerGas should be hex-prefixed',
);
assert.equal(
normalizedTxParams.type,
'0x1',
'type should be hex-prefixed',
);
});
});

@ -62,8 +62,11 @@ export default class TxGasUtil {
// `eth_estimateGas` can fail if the user has insufficient balance for the
// value being sent, or for the gas cost. We don't want to check their
// balance here, we just want the gas estimate. The gas price is removed
// to skip those balance checks. We check balance elsewhere.
// to skip those balance checks. We check balance elsewhere. We also delete
// maxFeePerGas and maxPriorityFeePerGas to support EIP-1559 txs.
delete txParams.gasPrice;
delete txParams.maxFeePerGas;
delete txParams.maxPriorityFeePerGas;
// estimate tx gas requirements
return await this.query.estimateGas(txParams);

@ -1,5 +1,6 @@
import { strict as assert } from 'assert';
import Transaction from 'ethereumjs-tx';
import { TransactionFactory } from '@ethereumjs/tx';
import Common from '@ethereumjs/common';
import { hexToBn, bnToHex } from '../../lib/util';
import TxUtils from './tx-gas-utils';
@ -31,8 +32,14 @@ describe('txUtils', function () {
nonce: '0x3',
chainId: 42,
};
const ethTx = new Transaction(txParams);
assert.equal(ethTx.getChainId(), 42, 'chainId is set from tx params');
const ethTx = TransactionFactory.fromTxData(txParams, {
common: new Common({ chain: 'kovan' }),
});
assert.equal(
ethTx.common.chainIdBN().toNumber(),
42,
'chainId is set from tx params',
);
});
});

@ -72,12 +72,45 @@ export default class TransactionStateManager extends EventEmitter {
* overwriting default keys of the TransactionMeta
* @returns {TransactionMeta} the default txMeta object
*/
generateTxMeta(opts) {
generateTxMeta(opts = {}) {
const netId = this.getNetwork();
const chainId = this.getCurrentChainId();
if (netId === 'loading') {
throw new Error('MetaMask is having trouble connecting to the network');
}
let dappSuggestedGasFees = null;
// If we are dealing with a transaction suggested by a dapp and not
// an internally created metamask transaction, we need to keep record of
// the originally submitted gasParams.
if (
opts.txParams &&
typeof opts.origin === 'string' &&
opts.origin !== 'metamask'
) {
if (typeof opts.txParams.gasPrice !== 'undefined') {
dappSuggestedGasFees = {
gasPrice: opts.txParams.gasPrice,
};
} else if (
typeof opts.txParams.maxFeePerGas !== 'undefined' ||
typeof opts.txParams.maxPriorityFeePerGas !== 'undefined'
) {
dappSuggestedGasFees = {
maxPriorityFeePerGas: opts.txParams.maxPriorityFeePerGas,
maxFeePerGas: opts.txParams.maxFeePerGas,
};
}
if (typeof opts.txParams.gas !== 'undefined') {
dappSuggestedGasFees = {
...dappSuggestedGasFees,
gas: opts.txParams.gas,
};
}
}
return {
id: createId(),
time: new Date().getTime(),
@ -85,6 +118,7 @@ export default class TransactionStateManager extends EventEmitter {
metamaskNetworkId: netId,
chainId,
loadingDefaults: true,
dappSuggestedGasFees,
...opts,
};
}

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

Loading…
Cancel
Save