1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-10-22 11:22:43 +02:00

Merge remote-tracking branch 'origin/develop' into master-sync

This commit is contained in:
Thomas Huang 2022-02-15 18:26:43 -08:00
commit 8fecb28844
408 changed files with 35827 additions and 9341 deletions

View File

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

View File

@ -171,7 +171,7 @@ module.exports = {
'app/scripts/migrations/*.test.js',
'app/scripts/platforms/*.test.js',
'app/scripts/controllers/network/**/*.test.js',
'app/scripts/controllers/permissions/*.test.js',
'app/scripts/controllers/permissions/**/*.test.js',
],
extends: ['@metamask/eslint-config-mocha'],
rules: {
@ -198,7 +198,7 @@ module.exports = {
'app/scripts/migrations/*.test.js',
'app/scripts/platforms/*.test.js',
'app/scripts/controllers/network/**/*.test.js',
'app/scripts/controllers/permissions/*.test.js',
'app/scripts/controllers/permissions/**/*.test.js',
],
extends: ['@metamask/eslint-config-jest'],
rules: {

6
.gitattributes vendored
View File

@ -10,3 +10,9 @@ yarn.lock linguist-generated=false
test/e2e/send-eth-with-private-key-test/ethereumjs-tx.js linguist-vendored linguist-generated -diff
test/e2e/send-eth-with-private-key-test/web3js.js linguist-vendored linguist-generated -diff
# Collapse changes to translation files by default in diffs as it is very common
# to remove keys in PRs. Of course this means that PRs that solely update
# translations will be a little harder to review but those do not get submitted
# as often as other PRs.
app/_locales/** linguist-generated

View File

@ -1,37 +0,0 @@
---
name: Bug Report
about: Using MetaMask, but it's not working as you expect?
---
<!--
BEFORE SUBMITTING:
1) Please search to make sure this issue has not been opened already
2) If this is an implementation question or trouble with your personal project, please post on StackExchange. This will get your question answered more quickly and make it easier for other devs to find the answer in the future.
-->
**Describe the bug**
A clear and concise description of what the bug is.
**Steps to reproduce (REQUIRED)**
Steps to reproduce the behavior, libraries used with version number, and/or any setup information to easily reproduce:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Browser details (please complete the following information):**
- OS: [e.g. OS X, Windows]
- Hardware Wallet: [e.g. Trezor Firmware version 1.8.3, Ledger Nano S Firmware version 1.6.0]
- Browser: [e.g. Chrome Version 79.0.3945.79 (Official Build) (64-bit), Firefox Browser 71.0 (64-bit)]
- MetaMask Version: [e.g. 5.0.2 - find it in Settings > About]
**Additional context (Error Messages, etc.)**
Add any other context about the problem here.

97
.github/ISSUE_TEMPLATE/bug-report.yml vendored Normal file
View File

@ -0,0 +1,97 @@
name: Bug Report
description: Using MetaMask, but it's not working as you expect?
title: "[Bug]: "
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
## **Before Submitting:**
* Please search to make sure this issue has not been opened already.
* If this is a question about how to integrate MetaMask with your project, please ask in our [Community forum](https://community.metamask.io/c/developer-questions/) instead. This will get your question answered more quickly and make it easier for other devs to find the answer in the future.
- type: textarea
id: what-happened
attributes:
label: Describe the bug
description: What happened? What did you expect to happen? Please include screenshots if applicable!
placeholder: Tell us what you see!
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
description: List all steps needed to reproduce the problem
value: |
1.
validations:
required: true
- type: textarea
id: error
attributes:
label: Error messages or log output
description: Please copy and paste any relevant error messages or log output. This will be automatically formatted, so there is no need for backticks.
render: shell
- type: input
id: version
attributes:
label: Version
description: What version of MetaMask are you running? You can find the version in "Settings" > "About"
validations:
required: true
- type: dropdown
id: build
attributes:
label: Build type
description: Are you using a testing or development build of MetaMask? If so, please select the type of build you are using.
options:
- Beta
- Flask
- Other (please specify exactly where you obtained this build in "Additional Context" section)
- type: dropdown
id: browsers
attributes:
label: Browser
description: Which browsers have you seen the problem on?
multiple: true
options:
- Chrome
- Firefox
- Microsoft Edge
- Brave
- Other (please elaborate in the "Additional Context" section)
validations:
required: true
- type: dropdown
id: os
attributes:
label: Operating system
description: Which operating systems have you seen the problem on?
multiple: true
options:
- Windows
- MacOS
- Linux
- Other (please elaborate in the "Additional Context" section)
validations:
required: true
- type: dropdown
id: hardware-wallet
attributes:
label: Hardware wallet
description: Are you using any of these hardware wallets? Please include the firmware version in the "Additional context" section below for any that you select here.
multiple: true
options:
- Ledger
- Trezor
- Keystone
- GridPlus Lattice1
- Other (please elaborate in the "Additional Context" section)
- type: textarea
id: additional
attributes:
label: Additional context
description: Add any other context about the problem here, e.g. related issues, additional error messages or logs, or any potentially relevant details about the environment or situation the bug occurred in.

View File

@ -25,7 +25,10 @@ jobs:
with:
upload_translations: true
download_translations: true
github_user_name: metamaskbot
github_user_email: metamaskbot@users.noreply.github.com
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_ACTOR: metamaskbot
GITHUB_TOKEN: ${{ secrets.METAMASKBOT_CROWDIN_TOKEN }}
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}

View File

@ -3,6 +3,5 @@ PASSWORD=METAMASK PASSWORD
INFURA_PROJECT_ID=00000000000
SEGMENT_WRITE_KEY=
ONBOARDING_V2=
EIP_1559_V2=
SWAPS_USE_DEV_APIS=
COLLECTIBLES_V1=

View File

@ -6,7 +6,7 @@ module.exports = {
'./app/scripts/migrations/*.test.js',
'./app/scripts/platforms/*.test.js',
'./app/scripts/controllers/network/**/*.test.js',
'./app/scripts/controllers/permissions/*.test.js',
'./app/scripts/controllers/permissions/**/*.test.js',
],
recursive: true,
require: ['test/env.js', 'test/setup.js'],

View File

@ -102,6 +102,85 @@ const state = {
swapsFeatureIsLive: false,
swapsQuoteRefreshTime: 60000,
},
"snapStates": {},
"snaps": {
"local:http://localhost:8080/": {
"enabled": true,
"id": "local:http://localhost:8080/",
"initialPermissions": {
"snap_confirm": {}
},
"manifest": {
"description": "An example MetaMask Snap.",
"initialPermissions": {
"snap_confirm": {}
},
"manifestVersion": "0.1",
"proposedName": "MetaMask Example Snap",
"repository": {
"type": "git",
"url": "https://github.com/MetaMask/snaps-skunkworks.git"
},
"source": {
"location": {
"npm": {
"filePath": "dist/bundle.js",
"iconPath": "images/icon.svg",
"packageName": "@metamask/example-snap",
"registry": "https://registry.npmjs.org/"
}
},
"shasum": "3lEt0yUu080DwV78neROaAAIQWXukSkMnP4OBhOhBnE="
},
"version": "0.6.0"
},
"permissionName": "wallet_snap_local:http://localhost:8080/",
"sourceCode": "(...)",
"status": "stopped",
"svgIcon": "<svg>...</svg>",
"version": "0.6.0"
},
"Filecoin Snap": {
"enabled": true,
"id": "npm:http://localhost:8080/",
"initialPermissions": {
"snap_confirm": {},
"eth_accounts": {},
"snap_manageState": {},
},
"manifest": {
"description": "This swap provides developers everywhere access to an entirely new data storage paradigm, even letting your programs store data autonomously. Learn more.",
"initialPermissions": {
"snap_confirm": {},
"eth_accounts": {},
"snap_manageState": {},
},
"manifestVersion": "0.1",
"proposedName": "Filecoin Snap",
"repository": {
"type": "git",
"url": "https://github.com/MetaMask/snaps-skunkworks.git"
},
"source": {
"location": {
"npm": {
"filePath": "dist/bundle.js",
"iconPath": "images/icon.svg",
"packageName": "@metamask/example-snap",
"registry": "https://registry.npmjs.org/"
}
},
"shasum": "3lEt0yUu080DwV78neROaAAIQWXukSkMnP4OBhOhBnE="
},
"version": "0.6.0"
},
"permissionName": "wallet_snap_npm:http://localhost:8080/",
"sourceCode": "(...)",
"status": "stopped",
"svgIcon": "<svg>...</svg>",
"version": "0.6.0"
},
},
accountArray: [
{
name: 'This is a Really Long Account Name',
@ -907,7 +986,7 @@ const state = {
'0xaD6D458402F60fD3Bd25163575031ACDce07538D': './sai.svg',
},
hiddenTokens: [],
suggestedAssets: {},
suggestedAssets: [],
useNonceField: false,
usePhishDetect: true,
lostIdentities: {},
@ -1030,6 +1109,17 @@ const state = {
},
},
},
"local:http://localhost:8080/": {
permissions: {
'snap_confirm': {
invoker: "local:http://localhost:8080/",
parentCapability: 'snap_confirm',
id: 'a7342F4b-beae-4525-a36c-c0635fd03359',
date: 1620710693178,
caveats: []
},
},
},
},
permissionActivityLog: [
{
@ -1172,20 +1262,6 @@ const state = {
},
},
},
subjectMetadata: {
'https://metamask.github.io': {
name: 'E2E Test Dapp',
origin: 'https://metamask.github.io',
iconUrl: 'https://metamask.github.io/test-dapp/metamask-fox.svg',
subjectType: 'website',
},
'https://app.uniswap.org': {
name: 'Uniswap',
origin: 'https://app.uniswap.org',
iconUrl: './UNI.png',
subjectType: 'website',
},
},
threeBoxSyncingAllowed: false,
showRestorePrompt: true,
threeBoxLastUpdated: 0,
@ -1212,6 +1288,31 @@ const state = {
ensResolutionsByAddress: {},
pendingApprovals: {},
pendingApprovalCount: 0,
subjectMetadata: {
"http://localhost:8080": {
extensionId: null,
iconUrl: null,
name: "Hello, Snaps!",
origin: "http://localhost:8080",
subjectType: "website"
},
"https://metamask.github.io": {
extensionId: null,
iconUrl: null,
name: "Snaps Iframe Execution Environment",
origin: "https://metamask.github.io",
subjectType: "website"
},
"local:http://localhost:8080/": {
extensionId: null,
iconUrl: null,
name: "MetaMask Example Snap",
origin: "local:http://localhost:8080/",
subjectType: "snap",
svgIcon: "<svg>...</svg>",
version: "0.6.0"
}
}
},
appState: {
shouldClose: false,

View File

@ -429,7 +429,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [#11093](https://github.com/MetaMask/metamask-extension/pull/11093): Update all uses of "Seed Phrase" to "Secret Recovery Phrase"
### Fixed
- [#11025](https://github.com/MetaMask/metamask-extension/pull/11025): Fixed redirection to the build quotes page from the swaps page when failure has occured
- [#11025](https://github.com/MetaMask/metamask-extension/pull/11025): Fixed redirection to the build quotes page from the swaps page when failure has occurred
- [#11015](https://github.com/MetaMask/metamask-extension/pull/11015): Prevent an undefined gas price from breaking the transaction list
- [#11013](https://github.com/MetaMask/metamask-extension/pull/11013): Prevent signature request component from canceling hardware wallet signing
- [#10982](https://github.com/MetaMask/metamask-extension/pull/10982): Re-validating chain id when rpc url changes [custom network form]
@ -483,7 +483,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [9.5.1]
### Fixed
- Fixed icon on approval screen ([#11048](https://github.com/MetaMask/metamask-extension/pull/11048))
- Fixed broken app state for some users with Chinese, Portugese or Spanish browser language settings. ([#11036](https://github.com/MetaMask/metamask-extension/pull/11036))
- Fixed broken app state for some users with Chinese, Portuguese or Spanish browser language settings. ([#11036](https://github.com/MetaMask/metamask-extension/pull/11036))
## [9.5.0] - 2021-04-28
### Added
@ -572,7 +572,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Update Japanese translations. ([#10265](https://github.com/MetaMask/metamask-extension/pull/10265))
- Update Chinese(Simplified) translations. ([#9388](https://github.com/MetaMask/metamask-extension/pull/9388))
- Update Vietnamese translations. ([#10270](https://github.com/MetaMask/metamask-extension/pull/10270))
- Update Spanish and Spanish(Latin American and Carribean) translations. ([#10258](https://github.com/MetaMask/metamask-extension/pull/10258))
- Update Spanish and Spanish(Latin American and Caribbean) translations. ([#10258](https://github.com/MetaMask/metamask-extension/pull/10258))
- Update Russian translations. ([#10268](https://github.com/MetaMask/metamask-extension/pull/10268))
- Update Tagalog localized messages. ([#10269](https://github.com/MetaMask/metamask-extension/pull/10269))
- Fix 'imported' translation use case for Dutch. ([#10448](https://github.com/MetaMask/metamask-extension/pull/10448))

View File

@ -1,4 +1,4 @@
Copyright ConsenSys Software Inc. 2020. All rights reserved.
Copyright ConsenSys Software Inc. 2022. All rights reserved.
You acknowledge and agree that ConsenSys Software Inc. (“ConsenSys”) (or ConsenSyss licensors) own all legal right, title and interest in and to the work, software, application, source code, documentation and any other documents in this repository (collectively, the “Program”), including any intellectual property rights which subsist in the Program (whether those rights happen to be registered or not, and wherever in the world those rights may exist), whether in source code or any other form.

View File

@ -2,9 +2,6 @@
"about": {
"message": "ስለ"
},
"aboutSettingsDescription": {
"message": "ስሪት፣ የድጋፍ መስጫ ማዕከልና የግንኙነት መረጃ "
},
"acceleratingATransaction": {
"message": "* ከፍተኛ የነዳጅ ዋጋን በመጠቀም ግብይትን ማፋጠን በአውታረ መረቡ በፍጥነት እንዲከወን የማድረግ ዕድልን ይጨምራል፤ ነገር ግን ሁልጊዜም የተረጋገጠ አይደለም።"
},
@ -56,9 +53,6 @@
"advancedOptions": {
"message": "የላቁ አማራጮች"
},
"advancedSettingsDescription": {
"message": "አዘጋጅ ባህርያትን መድረስ፣ የስቴት መዛግብትን ማውረድ፣ መለያን ዳግም መሙላት፣ testnets እና ብጁ RPC አዋቅር።"
},
"amount": {
"message": "ሰርዝ "
},
@ -283,18 +277,9 @@
"deleteNetworkDescription": {
"message": "ይህን አውታረ መረብ ለመሰረዝ እንደሚፈልጉ እርግጠኛ ነዎት?"
},
"depositEther": {
"message": "Ether አስቀምጥ"
},
"details": {
"message": "ዝርዝሮች"
},
"directDepositEther": {
"message": "Ether በቀጥታ ያስቀምጡ"
},
"directDepositEtherExplainer": {
"message": "ቀደም ሲል የተወሰነ Ether ካለዎት፣ በአዲሱ ቋትዎ Ether ለማግኘት ፈጣኑ መንገድ ቀጥተኛ ተቀማጭ ነው።"
},
"done": {
"message": "ተጠናቅቋል"
},
@ -420,9 +405,6 @@
"general": {
"message": "አጠቃላይ"
},
"generalSettingsDescription": {
"message": "የገንዘብ ልወጣ፣ ተቀዳሚ የገንዘብ ዓይነት፣ ቋንቋ፣ blockies identicon"
},
"getEther": {
"message": "Ether ያግኙ"
},
@ -581,9 +563,6 @@
"myAccounts": {
"message": "የእኔ መለያዎች"
},
"needEtherInWallet": {
"message": "MetaMask በመጠቀም ያልተማከሉ መተግበሪያዎች ጋር ግንኙነት ለማድረግ፣ በቋትዎ ውስጥ Ether ያስፈልግዎታል።"
},
"needImportFile": {
"message": "የሚያስመጡትን ፋይል መምረጥ አለብዎት።",
"description": "User is important an account and needs to add a file to continue"
@ -594,9 +573,6 @@
"networkName": {
"message": "የአውታረ መረብ ስም"
},
"networkSettingsDescription": {
"message": "ብጁ የ RPC አውታረ መረቦችን አክልና አርትዕ"
},
"networks": {
"message": "አውታረ መረቦች"
},
@ -831,9 +807,6 @@
"securityAndPrivacy": {
"message": "ደህንነት እና ግላዊነት"
},
"securitySettingsDescription": {
"message": "የግላዊነት ቅንብሮች እና የቋት ዘር ሐረግ"
},
"seedPhrasePlaceholder": {
"message": "እያንዳንዱን ቃል በነጠላ ክፍት ቦታ ይለያዩ"
},
@ -867,9 +840,6 @@
"sendTokens": {
"message": "ተለዋጭ ስሞችን ላክ"
},
"separateEachWord": {
"message": "እያንዳንዱን ቃል በነጠላ ክፍት ቦታ ይለያዩ"
},
"settings": {
"message": "ቅንብሮች"
},

View File

@ -1,13 +1,24 @@
{
"QRHardwareSignRequestCancel": {
"message": "رفض"
},
"QRHardwareWalletImporterTitle": {
"message": "مسح كود الاستجابة السريعة QR"
},
"about": {
"message": "حول"
},
"aboutSettingsDescription": {
"message": "نسخة الإصدار ومركز الدعم ومعلومات الاتصال."
},
"acceleratingATransaction": {
"message": "* تسريع المعاملات باستخدام سعر عملة جاس أعلى يزيد من فرص معالجتها بواسطة الشبكة بشكلٍ أسرع، لكن ذلك غير مضمون دائماً."
},
"acceptTermsOfUse": {
"message": "لقد قرأت دولار واحد وأوافق عليه",
"description": "$1 is the `terms` message"
},
"accessAndSpendNotice": {
"message": "$1 يمكن الوصول إلى هذا المبلغ الأقصى وإنفاقه حتى",
"description": "$1 is the url of the site requesting ability to spend"
},
"accessingYourCamera": {
"message": "جاري استخدام كاميرتك..."
},
@ -56,9 +67,6 @@
"advancedOptions": {
"message": "خيارات متقدمة"
},
"advancedSettingsDescription": {
"message": "يتاح لك استخدام ميزات تطوير البرامج وتنزيل سجلات الحالة وإعادة تعيين الحساب وإعداد شبكات الاختبارات وتخصيص استدعاء الإجراء عن بعد (RPC)."
},
"amount": {
"message": "المبلغ"
},
@ -256,6 +264,9 @@
"currentLanguage": {
"message": "اللغة الحالية"
},
"custom": {
"message": "إعدادات متقدمة"
},
"customGas": {
"message": "تخصيص الغاز"
},
@ -283,18 +294,9 @@
"deleteNetworkDescription": {
"message": "هل أنت متأكد أنك تريد حذف هذه الشبكة؟"
},
"depositEther": {
"message": "إيداع عملة إيثير"
},
"details": {
"message": "التفاصيل"
},
"directDepositEther": {
"message": "إيداع مباشرة لعملة الأثير"
},
"directDepositEtherExplainer": {
"message": "إذا كان لديك بالفعل بعض الأثير، فإن أسرع طريقة للحصول على الأثير في محفظتك الجديدة عن طريق الإيداع المباشر."
},
"done": {
"message": "تم"
},
@ -416,9 +418,6 @@
"general": {
"message": "عام"
},
"generalSettingsDescription": {
"message": "تحويل العملات، العملة الأساسية، اللغة ، تكتلات blockies identicon"
},
"getEther": {
"message": "احصل على إيثر"
},
@ -526,6 +525,9 @@
"learnMore": {
"message": "اكتشف المزيد"
},
"learnMoreUpperCase": {
"message": "اكتشف المزيد"
},
"ledgerAccountRestriction": {
"message": "أنت بحاجة إلى استخدام حسابك الأخير قبل أن تتمكن من إضافة حساب جديد."
},
@ -577,9 +579,6 @@
"myAccounts": {
"message": "حساباتي"
},
"needEtherInWallet": {
"message": "للتفاعل مع التطبيقات اللامركزية باستخدام MetaMask، ستحتاج إلى الإيثير في محفظتك."
},
"needImportFile": {
"message": "يلزم تحديد ملف للاستيراد.",
"description": "User is important an account and needs to add a file to continue"
@ -590,9 +589,6 @@
"networkName": {
"message": "اسم الشبكة"
},
"networkSettingsDescription": {
"message": "إضافة وتعديل شبكات RPC المخصصة"
},
"networks": {
"message": "الشبكات"
},
@ -827,9 +823,6 @@
"securityAndPrivacy": {
"message": "الأمن والخصوصية"
},
"securitySettingsDescription": {
"message": "إعدادات الخصوصية وعبارة أمان المحفظة"
},
"seedPhrasePlaceholder": {
"message": "يرجى فصل كل كلمة بمسافة واحدة"
},
@ -863,9 +856,6 @@
"sendTokens": {
"message": "إرسال عملات رمزية"
},
"separateEachWord": {
"message": "افصل كل كلمة بمسافة واحدة"
},
"settings": {
"message": "الإعدادات"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Отхвърляне"
},
"QRHardwareWalletImporterTitle": {
"message": "Сканиране на QR код"
},
"about": {
"message": "Информация"
},
"aboutSettingsDescription": {
"message": "Версия, център за поддръжка и информация за контакт"
},
"acceleratingATransaction": {
"message": "* Ускоряването на транзакция чрез използване на по-висока цена на газа увеличава шансовете й да се обработва по-бързо от мрежата, но това не винаги е гарантирано."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Разширени опции"
},
"advancedSettingsDescription": {
"message": "Достъп до функции за разработчици, изтегляйте дневници, нулиране на акаунта, тестови мрежи за настройка и персонализиран RPC"
},
"amount": {
"message": "Сума"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Настоящ език"
},
"custom": {
"message": "Разширени"
},
"customGas": {
"message": "Персонализирайте газ"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Наистина ли искате да изтриете тази мрежа?"
},
"depositEther": {
"message": "Депозирайте етер"
},
"details": {
"message": "Подробности"
},
"directDepositEther": {
"message": "Директно депозиране на етер"
},
"directDepositEtherExplainer": {
"message": "Ако вече имате някакъв етер, най-бързият начин да получите етер в новия си портфейл е чрез директен депозит."
},
"done": {
"message": "Готово"
},
@ -416,9 +410,6 @@
"general": {
"message": "Общ"
},
"generalSettingsDescription": {
"message": "Конвертиране на валута, първична валута, език, блокчейн идентичност"
},
"getEther": {
"message": "Вземете етер"
},
@ -526,6 +517,9 @@
"learnMore": {
"message": "Научете повече"
},
"learnMoreUpperCase": {
"message": "Научете повече"
},
"ledgerAccountRestriction": {
"message": "Трябва да използвате последния си акаунт, преди да можете да добавите нов."
},
@ -580,9 +574,6 @@
"myAccounts": {
"message": "Моите акаунти"
},
"needEtherInWallet": {
"message": "За да взаимодействате с децентрализираните приложения, използвайки MetaMask, ще ви е необходим етер в портфейла ви."
},
"needImportFile": {
"message": "Трябва да изберете файл за импортиране.",
"description": "User is important an account and needs to add a file to continue"
@ -593,9 +584,6 @@
"networkName": {
"message": "Име на мрежата"
},
"networkSettingsDescription": {
"message": "Добавете и редактирайте персонализирани RPC мрежи"
},
"networks": {
"message": "Mрежи"
},
@ -830,9 +818,6 @@
"securityAndPrivacy": {
"message": "Сигурност и поверителност"
},
"securitySettingsDescription": {
"message": "Настройки за поверителност и фраза зародиш за портфейла"
},
"seedPhrasePlaceholder": {
"message": "Отделете всяка дума с един интервал"
},
@ -866,9 +851,6 @@
"sendTokens": {
"message": "Изпращане на жетони"
},
"separateEachWord": {
"message": "Отделете всяка дума с интервал"
},
"settings": {
"message": "Настройки"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "প্রত্যাখ্যান"
},
"QRHardwareWalletImporterTitle": {
"message": "QR কোড স্ক্যান করুন"
},
"about": {
"message": "সম্পর্কে"
},
"aboutSettingsDescription": {
"message": "সংস্করণ, সহায়তা কেন্দ্র, এবং যোগাযোগের তথ্য।"
},
"acceleratingATransaction": {
"message": "* একটি উচ্চতর গ্যাসের মূল্য ব্যবহার করে একটি লেনদেনের গতি বৃদ্ধি নেটওয়ার্কের দ্বারা সেটির প্রক্রিয়াকরণ দ্রুততর হওয়ার সম্ভাবনা বৃদ্ধি করে, কিন্তু সবসময় সেটির নিশ্চয়তা দেওয়া যায় না।"
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "উন্নত বিকল্পসমূহ"
},
"advancedSettingsDescription": {
"message": "ডেভেলপারের বৈশিষ্ট্যগুলি অ্যাক্সেস করুন, স্টেট লগগুলি ডাউনলোড করুন, অ্যাকাউন্ট রিসেট করুন, টেস্টনেটস এবং কাস্টম RPC সেটআপ করুন।"
},
"amount": {
"message": "পরিমান"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "বর্তমান ভাষা"
},
"custom": {
"message": "উন্নত"
},
"customGas": {
"message": "গ্যাস কাস্টোমাইজ করুন"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "আপনি কি এই নেটওয়ার্কটি মোছার বিষয়ে নিশ্চিত?"
},
"depositEther": {
"message": "ইথার জমা করুন"
},
"details": {
"message": "বিশদ বিবরণ"
},
"directDepositEther": {
"message": "সরাসরি ইথার জমা করুন"
},
"directDepositEtherExplainer": {
"message": "আপনার ইতিমধ্যে কিছু ইথার থেকে থাকলে আপনার নতুন ওয়ালেটে ইথার পাওয়ার দ্রুততম উপায় হল সরাসরি জমা করা।"
},
"done": {
"message": "সম্পন্ন "
},
@ -420,9 +414,6 @@
"general": {
"message": "সাধারণ"
},
"generalSettingsDescription": {
"message": "মুদ্রা বিনিময়, প্রাথমিক মুদ্রা, ভাষা, ব্লকিস আইডেন্টিকন"
},
"getEther": {
"message": "ইথার পান"
},
@ -530,6 +521,9 @@
"learnMore": {
"message": "আরও জানুন"
},
"learnMoreUpperCase": {
"message": "আরও জানুন"
},
"ledgerAccountRestriction": {
"message": "একটি নতুন অ্যা কাউন্ট যোগ করার আগে আপনাকে আপনার শেষ অ্যাকাউন্ট ব্যবহার করে ফেলতে হবে।"
},
@ -584,9 +578,6 @@
"myAccounts": {
"message": "আমার অ্যাকাউন্টগুলি"
},
"needEtherInWallet": {
"message": "MetaMask ব্যবহার করে ছড়িয়ে ছিটিয়ে থাকা অ্যাপ্লিকেশনগুলির সাথে যোগাযোগ করতে, আপনার ওয়ালেটে ইথার লাগবে।"
},
"needImportFile": {
"message": "আমদানি করার জন্য আপনাকে অবশ্যই একটি ফাইল নির্বাচন করতে হবে।",
"description": "User is important an account and needs to add a file to continue"
@ -597,9 +588,6 @@
"networkName": {
"message": "নেটওয়ার্কের নাম"
},
"networkSettingsDescription": {
"message": "কাস্টম RPC নেটওয়ার্কগুলি যোগ ও সম্পাদনা করুন"
},
"networks": {
"message": "নেটওয়ার্কসমূহ"
},
@ -834,9 +822,6 @@
"securityAndPrivacy": {
"message": "নিরাপত্তা এবং গোপনীয়তা"
},
"securitySettingsDescription": {
"message": "গোপনীয়তা সেটিংস এবং ওয়ালেট সীড ফ্রেজ"
},
"seedPhrasePlaceholder": {
"message": "প্রতিটি শব্দকে একটি স্পেস দিয়ে আলাদা করুন"
},
@ -870,9 +855,6 @@
"sendTokens": {
"message": "টোকেনগুলি পাঠান"
},
"separateEachWord": {
"message": "প্রতিটি শব্দকে একটি স্পেস দিয়ে আলাদা করুন"
},
"settings": {
"message": "সেটিংস"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Rebutja"
},
"QRHardwareWalletImporterTitle": {
"message": "Escanejar Codi QR"
},
"about": {
"message": "Informació"
},
"aboutSettingsDescription": {
"message": "Versió, centre de suport, i informació de contacte"
},
"acceleratingATransaction": {
"message": "* Accelerar una transacció utilitzant un preu de gas més alt augmenta les possibilitats de ser processat més ràpidament per la xarxa, però no sempre es pot garantir."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Opcions Avançades"
},
"advancedSettingsDescription": {
"message": "Accedeix a característiques de desenvolupador, descarrega Registres d'Estat, Reinicia el Compte, instal·la testnets i personalitza RPC"
},
"amount": {
"message": "Quantitat"
},
@ -253,6 +253,9 @@
"currentLanguage": {
"message": "Llengua Actual"
},
"custom": {
"message": "Configuració avançada"
},
"customGas": {
"message": "Customitza el gas"
},
@ -280,18 +283,9 @@
"deleteNetworkDescription": {
"message": "Estàs segur que vols eliminar aquesta xarxa?"
},
"depositEther": {
"message": "Diposita Ether"
},
"details": {
"message": "Detalls"
},
"directDepositEther": {
"message": "Diposita Ether directament"
},
"directDepositEtherExplainer": {
"message": "Si ja tens una mica d'Ether, la manera més ràpida de posar Ether al teu nou moneder és per dipòsit directe."
},
"done": {
"message": "Fet"
},
@ -410,9 +404,6 @@
"gasUsed": {
"message": "Gas utilitzat"
},
"generalSettingsDescription": {
"message": "Conversió de divises, divisa principal, idioma, icones d'identificació única"
},
"getEther": {
"message": "Aconsegueix Ether"
},
@ -517,6 +508,9 @@
"learnMore": {
"message": "Saber més"
},
"learnMoreUpperCase": {
"message": "Saber més"
},
"ledgerAccountRestriction": {
"message": "Has de fer servir el teu últim compte abans de poder afegir-ne un altre."
},
@ -568,9 +562,6 @@
"myAccounts": {
"message": "Els meus Comptes"
},
"needEtherInWallet": {
"message": "Per a interactuar amb aplicacions descentralitzades fent servir MetaMask, necessitaràs Ether al teu moneder."
},
"needImportFile": {
"message": "Has de seleccionar un arxiu per a importar.",
"description": "User is important an account and needs to add a file to continue"
@ -581,9 +572,6 @@
"networkName": {
"message": "Nom de la xarxa"
},
"networkSettingsDescription": {
"message": "Afegeix i edita xarxes RPC a mida"
},
"networks": {
"message": "Xarxes"
},
@ -812,9 +800,6 @@
"securityAndPrivacy": {
"message": "Seguretat i privacitat"
},
"securitySettingsDescription": {
"message": "Configuració de privacitat i frase de recuperació del moneder"
},
"seedPhrasePlaceholder": {
"message": "Separa cada paraula amb un únic espai"
},
@ -848,9 +833,6 @@
"sendTokens": {
"message": "Enviar Fitxes"
},
"separateEachWord": {
"message": "Separa cada paraula amb un sol espai"
},
"settings": {
"message": "Configuració"
},

View File

@ -1,4 +1,7 @@
{
"QRHardwareSignRequestCancel": {
"message": "Odmítnout"
},
"account": {
"message": "Účet"
},
@ -105,18 +108,9 @@
"decimalsMustZerotoTen": {
"message": "Desetinných míst musí být od 0 do 36."
},
"depositEther": {
"message": "Vložit Ether"
},
"details": {
"message": "Podrobnosti"
},
"directDepositEther": {
"message": "Vložit Ether přímo"
},
"directDepositEtherExplainer": {
"message": "Pokud už vlastníte nějaký Ether, nejrychleji ho dostanete do peněženky přímým vkladem."
},
"done": {
"message": "Hotovo"
},
@ -213,6 +207,9 @@
"learnMore": {
"message": "Zjistěte více."
},
"learnMoreUpperCase": {
"message": "Zjistěte více."
},
"likeToImportTokens": {
"message": "Chcete přidat tyto tokeny?"
},
@ -240,9 +237,6 @@
"myAccounts": {
"message": "Moje účty"
},
"needEtherInWallet": {
"message": "Potřebujete Ether v peněžence, abyste mohli pomocí MetaMasku interagovat s decentralizovanými aplikacemi."
},
"needImportFile": {
"message": "Musíte zvolit soubor k importu.",
"description": "User is important an account and needs to add a file to continue"

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Afvis"
},
"QRHardwareWalletImporterTitle": {
"message": "Scan QR-kode"
},
"about": {
"message": "Om"
},
"aboutSettingsDescription": {
"message": "Version, supportcenter og kontaktinformation"
},
"acceleratingATransaction": {
"message": "* At gøre din transaktion hurtigere ved at bruge en højere Gas-priser, øger dennes chancer for at blive behandlet af netværket hurtigere, men det er ikke altid garanteret."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Avancerede Valgmuligheder"
},
"advancedSettingsDescription": {
"message": "Få adgang til udviklerfunktioner, hent tilstandslogs, nulstil konto, opsæt testnetværk og brugerdefineret RPC"
},
"amount": {
"message": "Beløb"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Nuværende sprog"
},
"custom": {
"message": "Avanceret"
},
"customGas": {
"message": "Tilpas brændstof"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Er du sikker på, at du vil slette dette netværk?"
},
"depositEther": {
"message": "Indbetal Ether"
},
"details": {
"message": "Detaljer"
},
"directDepositEther": {
"message": "Indskyd Ether direkte"
},
"directDepositEtherExplainer": {
"message": "Hvis du allerede har Ether, er den hurtigste måde at få Ether i din nye tegnebog ved direkte indbetaling."
},
"done": {
"message": "Færdig"
},
@ -416,9 +410,6 @@
"general": {
"message": "Generelt"
},
"generalSettingsDescription": {
"message": "Valutakonvertering, primær valuta, sprog, blockies-identicon"
},
"getEther": {
"message": "Hent Ether"
},
@ -523,6 +514,9 @@
"learnMore": {
"message": "Lær mere"
},
"learnMoreUpperCase": {
"message": "Lær mere"
},
"ledgerAccountRestriction": {
"message": "Du skal benytte din tidligere konto, før du kan tilføje en ny."
},
@ -568,9 +562,6 @@
"myAccounts": {
"message": "Mine Konti"
},
"needEtherInWallet": {
"message": "Du skal have Ether i din tegnebog for at interagere med decentraliserede applikationer, der bruger MetaMask."
},
"needImportFile": {
"message": "Du skal vælge en fil, der skal importeres.",
"description": "User is important an account and needs to add a file to continue"
@ -581,9 +572,6 @@
"networkName": {
"message": "Netværksnavn"
},
"networkSettingsDescription": {
"message": "Tilføj og redigér brugerdefinerede RPC-netværk"
},
"networks": {
"message": "Netværk"
},
@ -815,9 +803,6 @@
"securityAndPrivacy": {
"message": "Sikkerhed & Privatliv"
},
"securitySettingsDescription": {
"message": "Indstillinger for beskyttelse af personlige oplysninger og backupsætning til tegnebog"
},
"seedPhrasePlaceholder": {
"message": "Adskil hvert ord med et enkelt mellemrum"
},
@ -848,9 +833,6 @@
"sendTokens": {
"message": "Send tokens"
},
"separateEachWord": {
"message": "Separer hvert ord med et enkelt mellemrum"
},
"settings": {
"message": "Indstillinger "
},

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -47,9 +47,6 @@
"about": {
"message": "About"
},
"aboutSettingsDescription": {
"message": "Version, support center, and contact info"
},
"acceleratingATransaction": {
"message": "* Accelerating a transaction by using a higher gas price increases its chances of getting processed by the network faster, but it is not always guaranteed."
},
@ -140,9 +137,6 @@
"addMemo": {
"message": "Add memo"
},
"addNFT": {
"message": "Add NFT"
},
"addNetwork": {
"message": "Add Network"
},
@ -188,9 +182,6 @@
"advancedPriorityFeeToolTip": {
"message": "Priority fee (aka “miner tip”) goes directly to miners and incentivizes them to prioritize your transaction."
},
"advancedSettingsDescription": {
"message": "Access developer features, download State Logs, Reset Account, setup test networks and custom RPC"
},
"affirmAgree": {
"message": "I Agree"
},
@ -215,9 +206,6 @@
"alerts": {
"message": "Alerts"
},
"alertsSettingsDescription": {
"message": "Enable or disable each alert"
},
"allowExternalExtensionTo": {
"message": "Allow this external extension to:"
},
@ -260,6 +248,9 @@
"approve": {
"message": "Approve spend limit"
},
"approveAndInstall": {
"message": "Approve & Install"
},
"approveButtonText": {
"message": "Approve"
},
@ -273,6 +264,12 @@
"approvedAmountWithColon": {
"message": "Approved amount:"
},
"areYouDeveloper": {
"message": "Are you a developer?"
},
"areYouSure": {
"message": "Are you sure?"
},
"asset": {
"message": "Asset"
},
@ -392,11 +389,13 @@
"buy": {
"message": "Buy"
},
"buyWithTransak": {
"message": "Buy ETH with Transak"
"buyCryptoWithTransak": {
"message": "Buy $1 with Transak",
"description": "$1 represents the cypto symbol to be purchased"
},
"buyWithTransakDescription": {
"message": "Transak supports debit card and bank transfers (depending on location) in 59+ countries. ETH deposits into your MetaMask account."
"buyCryptoWithTransakDescription": {
"message": "Transak supports debit card and bank transfers (depending on location) in 59+ countries. $1 deposits into your MetaMask account.",
"description": "$1 represents the cypto symbol to be purchased"
},
"buyWithWyre": {
"message": "Buy ETH with Wyre"
@ -445,6 +444,10 @@
"chainIdExistsErrorMsg": {
"message": "This Chain ID is currently used by the $1 network."
},
"chainListReturnedDifferentTickerSymbol": {
"message": "The network with chain ID $1 may use a different currency symbol ($2) than the one you have entered. Please verify before continuing.",
"description": "$1 is the chain id currently entered in the network form and $2 is the return value of nativeCurrency.symbol from chainlist.network"
},
"chromeRequiredForHardwareWallets": {
"message": "You need to use MetaMask on Google Chrome in order to connect to your Hardware Wallet."
},
@ -458,6 +461,10 @@
"close": {
"message": "Close"
},
"collectibleAddressError": {
"message": "This token is an NFT. Add on the $1",
"description": "$1 is a clickable link with text defined by the 'importNFTPage' key"
},
"confirm": {
"message": "Confirm"
},
@ -541,6 +548,10 @@
"message": "$1 is not connected to any sites.",
"description": "$1 is the account name"
},
"connectedSnapSites": {
"message": "$1 snap is connected to these sites. They have access to the permissions listed above.",
"description": "$1 represents the name of the snap"
},
"connecting": {
"message": "Connecting..."
},
@ -568,9 +579,6 @@
"contacts": {
"message": "Contacts"
},
"contactsSettingsDescription": {
"message": "Add, edit, remove, and manage your contacts"
},
"continue": {
"message": "Continue"
},
@ -595,6 +603,9 @@
"contractInteraction": {
"message": "Contract Interaction"
},
"convertTokenToNFTDescription": {
"message": "We've detected that this asset is an NFT. Metamask now has full native support for NFTs. Would you like to remove it from your token list and add it as an NFT?"
},
"copiedExclamation": {
"message": "Copied!"
},
@ -652,6 +663,15 @@
"currentlyUnavailable": {
"message": "Unavailable on this network"
},
"curveHighGasEstimate": {
"message": "Aggressive gas estimate graph"
},
"curveLowGasEstimate": {
"message": "Low gas estimate graph"
},
"curveMediumGasEstimate": {
"message": "Market gas estimate graph"
},
"custom": {
"message": "Advanced"
},
@ -659,7 +679,7 @@
"message": "Customize Gas"
},
"customGasSettingToolTipMessage": {
"message": "Use $1 to customise the gas price. This can be confusing if you arent familiar. Interact at your own risk.",
"message": "Use $1 to customize the gas price. This can be confusing if you arent familiar. Interact at your own risk.",
"description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight"
},
"customGasSubTitle": {
@ -732,8 +752,9 @@
"deleteNetworkDescription": {
"message": "Are you sure you want to delete this network?"
},
"depositEther": {
"message": "Deposit Ether"
"depositCrypto": {
"message": "Deposit $1",
"description": "$1 represents the cypto symbol to be purchased"
},
"description": {
"message": "Description"
@ -741,11 +762,11 @@
"details": {
"message": "Details"
},
"directDepositEther": {
"message": "Directly Deposit Ether"
"directDepositCrypto": {
"message": "Directly Deposit $1"
},
"directDepositEtherExplainer": {
"message": "If you already have some Ether, the quickest way to get Ether in your new wallet by direct deposit."
"directDepositCryptoExplainer": {
"message": "If you already have some $1, the quickest way to get $1 in your new wallet by direct deposit."
},
"disabledGasOptionToolTipMessage": {
"message": "“$1” is disabled because it does not meet the minimum of a 10% increase from the original gas fee.",
@ -933,6 +954,22 @@
"enableAutoDetect": {
"message": " Enable Autodetect"
},
"enableEIP1559V2": {
"message": "Enable Enhanced Gas Fee UI"
},
"enableEIP1559V2AlertMessage": {
"message": "We've updated how gas fee estimation and customization works."
},
"enableEIP1559V2ButtonText": {
"message": "Turn on Enhanced Gas Fee UI in Settings"
},
"enableEIP1559V2Description": {
"message": "We've updated how gas estimation and customization works. Turn on if you'd like to use the new gas experience. $1",
"description": "$1 here is Learn More link"
},
"enableEIP1559V2Header": {
"message": "New gas experience"
},
"enableFromSettings": {
"message": " Enable it from Settings."
},
@ -985,7 +1022,7 @@
"message": "Learn more."
},
"endpointReturnedDifferentChainId": {
"message": "The endpoint returned a different chain ID: $1",
"message": "The RPC URL you have entered returned a different chain ID ($1). Please update the Chain ID to match the RPC URL of the network you are trying to add.",
"description": "$1 is the return value of eth_chainId from an RPC endpoint"
},
"ensIllegalCharacter": {
@ -1053,10 +1090,6 @@
"ethGasPriceFetchWarning": {
"message": "Backup gas price is provided as the main gas estimation service is unavailable right now."
},
"eth_accounts": {
"message": "See address, account balance, activity and initiate transactions",
"description": "The description for the `eth_accounts` permission"
},
"ethereumPublicAddress": {
"message": "Ethereum Public Address"
},
@ -1069,15 +1102,15 @@
"etherscanViewOn": {
"message": "View on Etherscan"
},
"expandExperience": {
"message": "Expand your web3 experience"
},
"expandView": {
"message": "Expand view"
},
"experimental": {
"message": "Experimental"
},
"experimentalSettingsDescription": {
"message": "Token detection & more"
},
"exportPrivateKey": {
"message": "Export Private Key"
},
@ -1094,6 +1127,9 @@
"failedToFetchChainId": {
"message": "Could not fetch chain ID. Is your RPC URL correct?"
},
"failedToFetchTickerSymbolData": {
"message": "Ticker symbol verification data is currently unavailable, make sure that the symbol you have entered is correct. It will impact the conversion rates that you see for this network"
},
"failureMessage": {
"message": "Something went wrong, and we were unable to complete the action"
},
@ -1190,6 +1226,9 @@
"gasLimitInfoTooltipContent": {
"message": "Gas limit is the maximum amount of units of gas you are willing to spend."
},
"gasLimitRecommended": {
"message": "Recommended gas limit is $1. If the gas limit is less than that, it may fail."
},
"gasLimitTooLow": {
"message": "Gas limit must be at least 21000"
},
@ -1267,9 +1306,6 @@
"general": {
"message": "General"
},
"generalSettingsDescription": {
"message": "Currency conversion, primary currency, language, blockies identicon"
},
"getEther": {
"message": "Get Ether"
},
@ -1337,11 +1373,8 @@
"high": {
"message": "Aggressive"
},
"highGasSettingToolTipDialog": {
"message": "High probability, even in volatile markets"
},
"highGasSettingToolTipMessage": {
"message": "Use $1 to cover surges in network traffic due to things like popular NFT drops.",
"message": "High probability, even in volatile markets. Use $1 to cover surges in network traffic due to things like popular NFT drops.",
"description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight"
},
"highLowercase": {
@ -1350,9 +1383,6 @@
"history": {
"message": "History"
},
"id": {
"message": "ID"
},
"import": {
"message": "Import",
"description": "Button to import an account from a selected file"
@ -1386,6 +1416,18 @@
"importMyWallet": {
"message": "Import My Wallet"
},
"importNFT": {
"message": "Import NFT"
},
"importNFTAddressToolTip": {
"message": "On OpenSea, for example, on the NFT's page under Details, there is a blue hyperlinked value labeled 'Contract Address'. If you click on this, it will take you to the contract's address on Etherscan; at the top-left of that page, there should be an icon labeled 'Contract', and to the right, a long string of letters and numbers. This is the address of the contract that created your NFT. Click on the 'copy' icon to the right of the address, and you'll have it on your clipboard."
},
"importNFTPage": {
"message": "Import NFT page"
},
"importNFTTokenIdToolTip": {
"message": "A collectible's ID is a unique identifier since no two NFTs are alike. Again, on OpenSea this number is under 'Details'. Make a note of it, or copy it onto your clipboard."
},
"importNFTs": {
"message": "Import NFTs"
},
@ -1439,6 +1481,9 @@
"invalidAddressRecipientNotEthNetwork": {
"message": "Not ETH network, set to lowercase"
},
"invalidAssetType": {
"message": "This asset is an NFT and needs to be re-added on the Import NFTs page found under the NFTs tab"
},
"invalidBlockExplorerURL": {
"message": "Invalid Block Explorer URL"
},
@ -1503,7 +1548,7 @@
"message": "Known contract address."
},
"knownTokenWarning": {
"message": "This action will edit tokens that are already listed in your wallet, which can be used to phish you. Only approve if you are certain that you mean to change what these tokens represent."
"message": "This action will edit tokens that are already listed in your wallet, which can be used to phish you. Only approve if you are certain that you mean to change what these tokens represent. Learn more about $1"
},
"kovan": {
"message": "Kovan Test Network"
@ -1596,6 +1641,9 @@
"loading": {
"message": "Loading..."
},
"loadingNFTs": {
"message": "Loading NFTs..."
},
"loadingTokens": {
"message": "Loading Tokens..."
},
@ -1612,14 +1660,14 @@
"message": "Low"
},
"lowGasSettingToolTipMessage": {
"message": "Use $1 to wait for a cheaper price. Time estimates are much less accurate as prices are somewhat unpredicible.",
"message": "Use $1 to wait for a cheaper price. Time estimates are much less accurate as prices are somewhat unpredictable.",
"description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight"
},
"lowLowercase": {
"message": "low"
},
"lowPriorityMessage": {
"message": "Future transactions will queue after this one. This price was last seen was some time ago."
"message": "Future transactions will queue after this one."
},
"mainnet": {
"message": "Ethereum Mainnet"
@ -1634,6 +1682,12 @@
"message": "Make sure no one is watching your screen",
"description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase"
},
"malformedData": {
"message": "Malformed data"
},
"manageSnaps": {
"message": "Manage your installed Snaps"
},
"max": {
"message": "Max"
},
@ -1755,8 +1809,9 @@
"name": {
"message": "Name"
},
"needEtherInWallet": {
"message": "To interact with decentralized applications using MetaMask, youll need Ether in your wallet."
"needCryptoInWallet": {
"message": "To interact with decentralized applications using MetaMask, youll need $1 in your wallet.",
"description": "$1 represents the cypto symbol to be purchased"
},
"needHelp": {
"message": "Need help? Contact $1",
@ -1808,9 +1863,6 @@
"networkSettingsChainIdDescription": {
"message": "The chain ID is used for signing transactions. It must match the chain ID returned by the network. You can enter a decimal or '0x'-prefixed hexadecimal number, but we will display the number in decimal."
},
"networkSettingsDescription": {
"message": "Add and edit custom RPC networks"
},
"networkStatus": {
"message": "Network status"
},
@ -1891,7 +1943,7 @@
"description": "The next nonce according to MetaMask's internal logic"
},
"nftTokenIdPlaceholder": {
"message": "Enter the collectible ID"
"message": "Enter the Token ID"
},
"nfts": {
"message": "NFTs"
@ -1917,6 +1969,9 @@
"noNFTs": {
"message": "No NFTs yet"
},
"noSnaps": {
"message": "No Snaps installed"
},
"noThanks": {
"message": "No Thanks"
},
@ -2118,6 +2173,9 @@
"message": "Open MetaMask in full screen to connect your ledger via WebHID.",
"description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid."
},
"openSourceCode": {
"message": "Check the source code"
},
"optional": {
"message": "Optional"
},
@ -2155,7 +2213,7 @@
"message": "Passwords Don't Match"
},
"pastePrivateKey": {
"message": "Paste your private key string here:",
"message": "Enter your private key string here:",
"description": "For importing an account from a private key"
},
"pending": {
@ -2174,6 +2232,37 @@
"permissionRequest": {
"message": "Permission request"
},
"permissionRequestCapitalized": {
"message": "Permission Request"
},
"permission_accessNetwork": {
"message": "Access the Internet.",
"description": "The description of the `endowment:network-access` permission."
},
"permission_accessSnap": {
"message": "Connect to the $1 Snap.",
"description": "The description for the `wallet_snap_*` permission. $1 is the name of the Snap."
},
"permission_customConfirmation": {
"message": "Display a confirmation in MetaMask.",
"description": "The description for the `snap_confirm` permission"
},
"permission_ethereumAccounts": {
"message": "See address, account balance, activity and suggest transactions to approve",
"description": "The description for the `eth_accounts` permission"
},
"permission_manageBip44Keys": {
"message": "Control your \"$1\" accounts and assets.",
"description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'."
},
"permission_manageState": {
"message": "Store and manage its data on your device.",
"description": "The description for the `snap_manageState` permission"
},
"permission_unknown": {
"message": "Unknown permission: $1",
"description": "$1 is the name of a requested permission that is not recognized."
},
"permissions": {
"message": "Permissions"
},
@ -2309,6 +2398,12 @@
"removeNFT": {
"message": "Remove NFT"
},
"removeSnap": {
"message": "Remove Snap"
},
"removeSnapDescription": {
"message": "This action will delete the snap, its data and revoke your given permissions."
},
"replace": {
"message": "replace"
},
@ -2412,9 +2507,6 @@
"securityAndPrivacy": {
"message": "Security & Privacy"
},
"securitySettingsDescription": {
"message": "Privacy settings and wallet Secret Recovery Phrase"
},
"seedPhraseConfirm": {
"message": "Confirm Secret Recovery Phrase"
},
@ -2467,7 +2559,7 @@
"message": "Separate each word with a single space"
},
"seedPhrasePlaceholderPaste": {
"message": "Paste Secret Recovery Phrase from clipboard"
"message": "Enter your Secret Recovery Phrase"
},
"seedPhraseReq": {
"message": "Secret Recovery Phrases contain 12, 15, 18, 21, or 24 words"
@ -2534,9 +2626,6 @@
"message": "Sending $1",
"description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)"
},
"separateEachWord": {
"message": "Separate each word with a single space"
},
"setAdvancedPrivacySettings": {
"message": "Set advanced privacy settings"
},
@ -2630,6 +2719,39 @@
"slow": {
"message": "Slow"
},
"snapAccess": {
"message": "$1 snap has access to:",
"description": "$1 represents the name of the snap"
},
"snapError": {
"message": "Snap Error: '$1'. Error Code: '$2'",
"description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code."
},
"snapInstall": {
"message": "Install Snap"
},
"snapInstallWarningCheck": {
"message": "To confirm you understand, check all."
},
"snapInstallWarningKeyAccess": {
"message": "You are granting key access to the snap \"$1\". This is irrevocable and grants \"$1\" control of your accounts and assets. Make sure you trust \"$1\" before proceeding.",
"description": "The parameter is the name of the snap"
},
"snapRequestsPermission": {
"message": "This snap is requesting the following permissions:"
},
"snaps": {
"message": "Snaps"
},
"snapsSettingsDescription": {
"message": "Manage your Snaps"
},
"snapsStatus": {
"message": "Snap status is dependent on activity."
},
"snapsToggle": {
"message": "A snap will only run if it is enabled"
},
"somethingWentWrong": {
"message": "Oops! Something went wrong."
},
@ -2691,6 +2813,9 @@
"stateLogsDescription": {
"message": "State logs contain your public account addresses and sent transactions."
},
"status": {
"message": "Status"
},
"statusConnected": {
"message": "Connected"
},
@ -3455,9 +3580,6 @@
"walletCreationSuccessTitle": {
"message": "Wallet creation successful"
},
"walletSeedRestore": {
"message": "Wallet Secret Recovery Phrase"
},
"web3ShimUsageNotification": {
"message": "We noticed that the current website tried to use the removed window.web3 API. If the site appears to be broken, please click $1 for more information.",
"description": "$1 is a clickable link."
@ -3508,6 +3630,9 @@
"message": "$1 of $2 pending",
"description": "$1 and $2 are intended to be two numbers, where $2 is a total number of pending confirmations, and $1 is a count towards that total"
},
"yes": {
"message": "Yes"
},
"yesLetsTry": {
"message": "Yes, let's try"
},

View File

@ -2,9 +2,6 @@
"about": {
"message": "Acerca de"
},
"aboutSettingsDescription": {
"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."
},
@ -97,9 +94,6 @@
"advancedOptions": {
"message": "Opciones avanzadas"
},
"advancedSettingsDescription": {
"message": "Acceder a recursos para desarrolladores, descargar registros de estado, restablecer cuenta, configurar redes de prueba y RPC personalizada"
},
"affirmAgree": {
"message": "Acepto"
},
@ -124,9 +118,6 @@
"alerts": {
"message": "Alertas"
},
"alertsSettingsDescription": {
"message": "Habilitar o deshabilitar cada alerta"
},
"allowExternalExtensionTo": {
"message": "Permitir que esta extensión externa haga lo siguiente:"
},
@ -260,9 +251,6 @@
"buyWithWyreDescription": {
"message": "Wyre le permite usar una tarjeta de débito para depositar ETH directamente en su cuenta de MetaMask."
},
"bytes": {
"message": "Bytes"
},
"canToggleInSettings": {
"message": "Puede volver a activar esta notificación desde Configuración -> Alertas."
},
@ -400,9 +388,6 @@
"contacts": {
"message": "Contactos"
},
"contactsSettingsDescription": {
"message": "Agregar, editar, quitar y administrar sus contactos"
},
"continue": {
"message": "Continuar"
},
@ -519,18 +504,9 @@
"deleteNetworkDescription": {
"message": "¿Está seguro de que quiere eliminar esta red?"
},
"depositEther": {
"message": "Depositar ether"
},
"details": {
"message": "Detalles"
},
"directDepositEther": {
"message": "Depositar ether directamente"
},
"directDepositEtherExplainer": {
"message": "Si ya tiene algunos ethers, la forma más rápida de tenerlos en la cartera nueva es mediante depósito directo."
},
"disconnect": {
"message": "Desconectar"
},
@ -689,16 +665,9 @@
"ethGasPriceFetchWarning": {
"message": "Se muestra el precio del gas de respaldo, ya que el servicio para calcular el precio del gas principal no se encuentra disponible en este momento."
},
"eth_accounts": {
"message": "Ver las direcciones de las cuentas permitidas (requerido)",
"description": "The description for the `eth_accounts` permission"
},
"ethereumPublicAddress": {
"message": "Dirección pública de Ethereum"
},
"etherscan": {
"message": "Etherscan"
},
"etherscanView": {
"message": "Ver cuenta en Etherscan"
},
@ -802,12 +771,6 @@
"message": "Política de privacidad aquí",
"description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation"
},
"general": {
"message": "General"
},
"generalSettingsDescription": {
"message": "Conversión de moneda, moneda principal, idioma, Blockies Identicon"
},
"getEther": {
"message": "Obtener ether"
},
@ -824,16 +787,9 @@
"happyToSeeYou": {
"message": "Nos alegra verlo."
},
"hardware": {
"message": "Hardware"
},
"hardwareWalletConnected": {
"message": "Cartera de hardware conectada"
},
"hardwareWalletLegacyDescription": {
"message": "(legacy)",
"description": "Text representing the MEW path"
},
"hardwareWalletSupportLinkConversion": {
"message": "Haga clic aquí"
},
@ -1116,9 +1072,6 @@
"name": {
"message": "Nombre"
},
"needEtherInWallet": {
"message": "Para interactuar con aplicaciones descentralizadas mediante MetaMask, necesitará ethers en su cartera."
},
"needHelp": {
"message": "¿Necesita ayuda? Comuníquese con $1",
"description": "$1 represents `needHelpLinkText`, the text which goes in the help link"
@ -1139,24 +1092,15 @@
"networkName": {
"message": "Nombre de la red"
},
"networkNameBSC": {
"message": "BSC"
},
"networkNameDefinition": {
"message": "El nombre asociado a esta red."
},
"networkNameEthereum": {
"message": "Ethereum"
},
"networkNameTestnet": {
"message": "Red de prueba"
},
"networkSettingsChainIdDescription": {
"message": "El id. de la cadena se usa para firmar transacciones. Debe coincidir con el id. de la cadena que devuelve la red. Puede escribir un número decimal o un número hexadecimal con el prefijo “0x”, pero el número se mostrará en decimal."
},
"networkSettingsDescription": {
"message": "Agregar y editar redes RPC personalizadas"
},
"networkURL": {
"message": "Dirección URL de la red"
},
@ -1228,9 +1172,6 @@
"noWebcamFoundTitle": {
"message": "No se encontró cámara web"
},
"nonce": {
"message": "Nonce"
},
"nonceField": {
"message": "Personalizar nonce de transacción"
},
@ -1351,6 +1292,10 @@
"pending": {
"message": "Pendiente"
},
"permission_ethereumAccounts": {
"message": "Ver las direcciones de las cuentas permitidas (requerido)",
"description": "The description for the `eth_accounts` permission"
},
"permissions": {
"message": "Permisos"
},
@ -1552,9 +1497,6 @@
"securityAndPrivacy": {
"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."
},
@ -1643,9 +1585,6 @@
"sendTokens": {
"message": "Enviar tokens"
},
"separateEachWord": {
"message": "Separar cada palabra con un solo espacio"
},
"settings": {
"message": "Configuración"
},
@ -2128,9 +2067,6 @@
"message": "Para: $1",
"description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress"
},
"token": {
"message": "Token"
},
"tokenAlreadyAdded": {
"message": "Ya se agregó el token."
},
@ -2146,9 +2082,6 @@
"tooltipApproveButton": {
"message": "Comprendo"
},
"total": {
"message": "Total"
},
"transaction": {
"message": "transacción"
},
@ -2300,9 +2233,6 @@
"walletConnectionGuide": {
"message": "nuestra guía de conexión de la cartera de hardware"
},
"walletSeedRestore": {
"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.",
"description": "$1 is a clickable link."

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Lükka tagasi"
},
"QRHardwareWalletImporterTitle": {
"message": "Skannige QR-koos"
},
"about": {
"message": "Teave"
},
"aboutSettingsDescription": {
"message": "Versioon, tugikeskus ja kontaktteave"
},
"acceleratingATransaction": {
"message": "* Tehingu kiirendamine kõrgemate gaasihindadega suurendab võimalust kiiremaks võrgus töötlemiseks, kuid see ei ole alati tagatud."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Täpsemad suvandid"
},
"advancedSettingsDescription": {
"message": "Juurdepääs arendaja funktsioonidele, olekulogide allalaadimine, konto lähtestamine, testvõrkude ja kohandatud RPC-de seadistamine"
},
"amount": {
"message": "Summa"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Praegune keel"
},
"custom": {
"message": "Täpsemad"
},
"customGas": {
"message": "Gaasi kohandamine"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Olete kindel, et soovite selle võrgu kustutada?"
},
"depositEther": {
"message": "Eetri sissemakse"
},
"details": {
"message": "Üksikasjad"
},
"directDepositEther": {
"message": "Eetri otsene sissemakse"
},
"directDepositEtherExplainer": {
"message": "Kui teil on juba veidi eetrit, on kiirem viis eetri rahakotti saamiseks otsene sissemakse."
},
"done": {
"message": "Valmis"
},
@ -416,9 +410,6 @@
"general": {
"message": "Üldine teave"
},
"generalSettingsDescription": {
"message": "Valuutavahetus, põhivaluuta, keel, plokkidest identicon"
},
"getEther": {
"message": "Hankige eetrit"
},
@ -526,6 +517,9 @@
"learnMore": {
"message": "Lisateave"
},
"learnMoreUpperCase": {
"message": "Lisateave"
},
"ledgerAccountRestriction": {
"message": "Enne uue konto loomist peate kasutama eelmist kontot."
},
@ -574,9 +568,6 @@
"myAccounts": {
"message": "Minu kontod"
},
"needEtherInWallet": {
"message": "Selleks, et suhelda MetaMaski abil detsentraliseeritud rakendustega, peab teil rahakotis eetrit olema."
},
"needImportFile": {
"message": "Peate importimiseks faili valima.",
"description": "User is important an account and needs to add a file to continue"
@ -587,9 +578,6 @@
"networkName": {
"message": "Võrgu nimi"
},
"networkSettingsDescription": {
"message": "Kohandatud RPC-võrkude lisamine ja muutmine"
},
"networks": {
"message": "Võrgud"
},
@ -824,9 +812,6 @@
"securityAndPrivacy": {
"message": "Turvalisus ja privaatsus"
},
"securitySettingsDescription": {
"message": "Privaatsusseaded ja rahakoti seemnefraas"
},
"seedPhrasePlaceholder": {
"message": "Eraldage iga sõna ühe tühikuga"
},
@ -860,9 +845,6 @@
"sendTokens": {
"message": "Saada lube"
},
"separateEachWord": {
"message": "Eraldage iga sõna ühe tühikuga"
},
"settings": {
"message": "Seaded"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "عدم پذیرش"
},
"QRHardwareWalletImporterTitle": {
"message": "سکن کود QR"
},
"about": {
"message": "درباره"
},
"aboutSettingsDescription": {
"message": "نسخه، مرکز پشتیبانی و معلومات تماس."
},
"acceleratingATransaction": {
"message": "* تسریع یک معامله با استفاده از قیمت بالاتر گاز، فرصت تسریع پروسس آنرا توسط شبکه افزایش میدهد اما همیشه این تضمین نمیشود."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "گزینه های پیشرفته"
},
"advancedSettingsDescription": {
"message": "مشخصات توسعه دهنده دسترسی، دفترچه ثبت وضعیت دانلود، دوباره سازی حساب، شبکه های آزمایشی تنظیمات و RPC معمول."
},
"amount": {
"message": "مبلغ"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "زبان فعلی"
},
"custom": {
"message": "پیشرفته"
},
"customGas": {
"message": "گاز دلخواه"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "آیا مطمئن هستید که این شبکه حذف شود؟"
},
"depositEther": {
"message": "پرداخت ایتر"
},
"details": {
"message": "جزئیات"
},
"directDepositEther": {
"message": "پرداخت مستقیم ایتر"
},
"directDepositEtherExplainer": {
"message": "در صورتیکه شما کدام ایتر داشته باشید، سریعترین روش برای گرفتن ایتر در کیف جدید تان توسط پرداخت مستقیم."
},
"done": {
"message": "تمام"
},
@ -420,9 +414,6 @@
"general": {
"message": "عمومی"
},
"generalSettingsDescription": {
"message": "تبادل واحد پول، واحد پول اصلی، زبان، شناسا های بلوکی"
},
"getEther": {
"message": "اتر را بگیرید"
},
@ -530,6 +521,9 @@
"learnMore": {
"message": "بیشتر بدانید"
},
"learnMoreUpperCase": {
"message": "بیشتر بدانید"
},
"ledgerAccountRestriction": {
"message": "لازم است تا حساب قبلی تان را قبل از اینکه جدید اضافه کنید، مورد استفاده قرار دهید."
},
@ -584,9 +578,6 @@
"myAccounts": {
"message": "حساب های من"
},
"needEtherInWallet": {
"message": "برای تعامل با اپلیکیشن های غیر متمرکز شده با استفاده از MetaMask، شما نیاز به ایتر در کیف تان خواهید داشت."
},
"needImportFile": {
"message": "شما باید یک فایل برای وارد کردن را انتخاب کنید.",
"description": "User is important an account and needs to add a file to continue"
@ -597,9 +588,6 @@
"networkName": {
"message": "نام شبکه"
},
"networkSettingsDescription": {
"message": "اضافه سازی و ویرایش شبکه های دلخواه PRC"
},
"networks": {
"message": "شبکه ها"
},
@ -834,9 +822,6 @@
"securityAndPrivacy": {
"message": "امنیت و حریم خصوصی"
},
"securitySettingsDescription": {
"message": "تنظیمات حریم خصوصی و عبارت بازیاب کیف"
},
"seedPhrasePlaceholder": {
"message": "هر کلمه را با یک فاصله واحد جدا سازید"
},
@ -870,9 +855,6 @@
"sendTokens": {
"message": "رمزیاب ها را ارسال کنید"
},
"separateEachWord": {
"message": "هر کلمه را با یک فاصله واحد جدا سازید"
},
"settings": {
"message": "تنظیمات"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Hylkää"
},
"QRHardwareWalletImporterTitle": {
"message": "Lue QR-koodi"
},
"about": {
"message": "Tietoja asetuksista"
},
"aboutSettingsDescription": {
"message": "Versio, tukikeskus ja yhteystiedot"
},
"acceleratingATransaction": {
"message": "* Tapahtuman nopeuttaminen käyttämällä korkeampaa gas-hintaa parantaa mahdollisuutta, että verkko käsittelee sen nopeammin, mutta tämä ei ole aina taattua."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Tarkemmat vaihtoehdot"
},
"advancedSettingsDescription": {
"message": "Käytä kehittäjän ominaisuuksia, lataa tilalokeja, palauta tilit, asenna testiverkostoja ja muokattavia RPC:itä"
},
"amount": {
"message": "Summa"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Nykyinen kieli"
},
"custom": {
"message": "Lisäasetukset"
},
"customGas": {
"message": "Mukauta bensa"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Haluatko varmasti poistaa tämän verkon?"
},
"depositEther": {
"message": "Talleta Etheriä"
},
"details": {
"message": "Tiedot"
},
"directDepositEther": {
"message": "Talleta etheriä suoraan"
},
"directDepositEtherExplainer": {
"message": "Jos sinulla on jo etheriä, nopein tapa hankkia etheriä uuteen lompakkoosi on suoratalletus."
},
"done": {
"message": "Valmis"
},
@ -420,9 +414,6 @@
"general": {
"message": "Yleistä"
},
"generalSettingsDescription": {
"message": "Valuuttamuunnin, päävaluutta, kieli, blockies identicon"
},
"getEther": {
"message": "Hanki Etheriä"
},
@ -530,6 +521,9 @@
"learnMore": {
"message": "Lisätietoa"
},
"learnMoreUpperCase": {
"message": "Lisätietoa"
},
"ledgerAccountRestriction": {
"message": "Sinun tarvitsee käyttää edellistä tiliäsi ennen kuin voit lisätä uuden."
},
@ -584,9 +578,6 @@
"myAccounts": {
"message": "Omat tilit"
},
"needEtherInWallet": {
"message": "Ollaksesi vuorovaikutuksessa hajautettujen sovellusten kanssa sinulla on oltava lompakossasi Ether."
},
"needImportFile": {
"message": "Sinun tarvitsee valita tuotava tiedosto.",
"description": "User is important an account and needs to add a file to continue"
@ -597,9 +588,6 @@
"networkName": {
"message": "Verkon nimi"
},
"networkSettingsDescription": {
"message": "Lisää ja muokkaa omia RPC-verkostojasi"
},
"networks": {
"message": "Verkot"
},
@ -831,9 +819,6 @@
"securityAndPrivacy": {
"message": "Turva & yksityisyys"
},
"securitySettingsDescription": {
"message": "Yksityisyysasetukset ja kukkaron salausteksti"
},
"seedPhrasePlaceholder": {
"message": "Erota kukin sana yhdellä välilyönnillä"
},
@ -867,9 +852,6 @@
"sendTokens": {
"message": "Lähetä tietueita"
},
"separateEachWord": {
"message": "Erottele sanat toisistaan yhdellä välilyönnillä"
},
"settings": {
"message": "Asetukset"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Tanggihan"
},
"QRHardwareWalletImporterTitle": {
"message": "I-scan ang QR Code"
},
"about": {
"message": "Tungkol sa"
},
"aboutSettingsDescription": {
"message": "Bersyon, support center, at impormasyon sa pakikipag-ugnayan"
},
"acceleratingATransaction": {
"message": "* Ang pagpapabilis sa isang transaksyon sa pamamagitan ng paggamit ng mas mataas na presyo ng gas ay makakadagdag sa tsansa nitong maproseso ng network nang mas mabilis, pero hindi ito palaging garantisado."
},
@ -50,9 +53,6 @@
"advancedOptions": {
"message": "Mga Advanced na Opsyon"
},
"advancedSettingsDescription": {
"message": "I-access ang mga feature para sa mga developer, mag-download ng mga State Log, I-reset ang Account, mag-set up ng mga testnet at custom RPC"
},
"amount": {
"message": "Halaga"
},
@ -262,18 +262,9 @@
"deleteNetworkDescription": {
"message": "Sigurado ka bang gusto mong i-delete ang network na ito?"
},
"depositEther": {
"message": "Magdeposito ng Ether"
},
"details": {
"message": "Mga Detalye"
},
"directDepositEther": {
"message": "Direktang Magdeposito ng Ether"
},
"directDepositEtherExplainer": {
"message": "Kung mayroon ka nang Ether, ang pinakamabilis na paraan para magkaroon ng Ether sa iyong bagong wallet ay sa pamamagitan ng direkang deposito."
},
"done": {
"message": "Tapos na"
},
@ -392,9 +383,6 @@
"general": {
"message": "Pangkalahatan"
},
"generalSettingsDescription": {
"message": "Pagpapapalit ng currency, pangunahing currency, wika, blockies identicon"
},
"getEther": {
"message": "Kumuha ng Ether"
},
@ -483,6 +471,9 @@
"learnMore": {
"message": "Matuto pa"
},
"learnMoreUpperCase": {
"message": "Matuto pa"
},
"ledgerAccountRestriction": {
"message": "Kailangan mong gamitin ang iyong dating account bago ka makapagdagdag ng bago."
},
@ -525,9 +516,6 @@
"myAccounts": {
"message": "Mga Account Ko"
},
"needEtherInWallet": {
"message": "Para gumamit ng mga decentralized na application gamit ang MetaMask, mangangailangan ka ng Ether sa iyong wallet."
},
"needImportFile": {
"message": "Dapat kang pumili ng file na ii-import.",
"description": "User is important an account and needs to add a file to continue"
@ -538,9 +526,6 @@
"networkName": {
"message": "Pangalan ng Network"
},
"networkSettingsDescription": {
"message": "Magdagdag at mag-edit ng mga custom na RPC network"
},
"networks": {
"message": "Mga Network"
},
@ -755,9 +740,6 @@
"securityAndPrivacy": {
"message": "Seguridad at Privacy"
},
"securitySettingsDescription": {
"message": "Mga setting ng privacy at seed phrase ng wallet"
},
"seedPhrasePlaceholder": {
"message": "Paghiwa-hiwalayin ang bawat salita gamit ang isang space"
},
@ -791,9 +773,6 @@
"sendTokens": {
"message": "Magpadala ng Mga Token"
},
"separateEachWord": {
"message": "Paghiwa-hiwalayin ang bawat salita gamit ang isang space"
},
"settings": {
"message": "Mga Setting"
},

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,7 @@
{
"QRHardwareSignRequestCancel": {
"message": "નકારો"
},
"about": {
"message": "વિશે"
},
@ -44,6 +47,9 @@
"create": {
"message": "બનાવો"
},
"custom": {
"message": "વિગતવાર"
},
"delete": {
"message": "કાઢી નાખો"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "דחה"
},
"QRHardwareWalletImporterTitle": {
"message": "סריקת קוד QR"
},
"about": {
"message": "מידע כללי"
},
"aboutSettingsDescription": {
"message": "גרסה, מרכז תמיכה ופרטי יצירת קשר."
},
"acceleratingATransaction": {
"message": "* האצת עסקה על ידי שימוש במחיר דלק גבוה יותר מגדילה את סיכוייה לעבור עיבוד מהיר יותר ע\"י הרשת, אך זה לא תמיד מובטח."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "אפשרויות מתקדמות"
},
"advancedSettingsDescription": {
"message": "קבלת גישה לפיצ'רים למפתחים, הורדת יומני מצב, איפוס חשבון, הגדרת testnets ו-RPC מותאם אישית."
},
"amount": {
"message": "כמות"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "שפה נוכחית"
},
"custom": {
"message": "מתקדם"
},
"customGas": {
"message": "התאמה אישית של דלק"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "הנך בטוח/ה שברצונך למחוק רשת זו?"
},
"depositEther": {
"message": "הפקדת את'ר"
},
"details": {
"message": "פרטים"
},
"directDepositEther": {
"message": "הפקד את'ר ישירות"
},
"directDepositEtherExplainer": {
"message": "אם כבר יש ברשותך את'ר (Ether) , הדרך המהירה ביותר להכניס את'ר לארנק החדש שלך היא באמצעות הפקדה ישירה."
},
"done": {
"message": "סיום"
},
@ -420,9 +414,6 @@
"general": {
"message": "כללי"
},
"generalSettingsDescription": {
"message": "המרת מטבע, מטבע עיקרי, שפה, blockies identicon"
},
"getEther": {
"message": "השג/י את'ר"
},
@ -530,6 +521,9 @@
"learnMore": {
"message": "למדו עוד"
},
"learnMoreUpperCase": {
"message": "למדו עוד"
},
"ledgerAccountRestriction": {
"message": "עליך להשתמש בחשבון האחרון שלך לפני שתוכל/י להוסיף חשבון חדש."
},
@ -581,9 +575,6 @@
"myAccounts": {
"message": "החשבונות שלי"
},
"needEtherInWallet": {
"message": "כדי לתקשר עם אפליקציות מבוזרות באמצעות MetaMask, צריך להיות לך את'ר בארנק."
},
"needImportFile": {
"message": "יש לבחור קובץ לייצוא.",
"description": "User is important an account and needs to add a file to continue"
@ -594,9 +585,6 @@
"networkName": {
"message": "שם רשת"
},
"networkSettingsDescription": {
"message": "הוסף וערוך רשתות RPC מותאמות אישית"
},
"networks": {
"message": "רשתות"
},
@ -828,9 +816,6 @@
"securityAndPrivacy": {
"message": "אבטחה ופרטיות"
},
"securitySettingsDescription": {
"message": "הגדרות פרטיות וצירוף הגרעין של הארנק"
},
"seedPhrasePlaceholder": {
"message": "הפרד/י בין המילים ברווח אחד"
},
@ -864,9 +849,6 @@
"sendTokens": {
"message": "שלח טוקנים"
},
"separateEachWord": {
"message": "יש להפריד כל מילה עם רווח יחיד"
},
"settings": {
"message": "הגדרות"
},

File diff suppressed because it is too large Load Diff

View File

@ -84,18 +84,9 @@
"decimalsMustZerotoTen": {
"message": "दशमलव कम से कम 0 होनी चाहिए, और 36 से अधिक नहीं होनी चाहिए।"
},
"depositEther": {
"message": "जमा - Ether"
},
"details": {
"message": "संदेश विवरण"
},
"directDepositEther": {
"message": "सीधे ईथर जमा करें"
},
"directDepositEtherExplainer": {
"message": "यदि आपके पास पहले से कुछ ईथर है, तो सीधे जमा द्वारा अपने नए बटुए में ईथर प्राप्त करने का तेज़ तरीका है।"
},
"done": {
"message": "संपन्न"
},
@ -223,9 +214,6 @@
"myAccounts": {
"message": "मेरे खाते"
},
"needEtherInWallet": {
"message": "मेटामास्क का उपयोग करने वाले विकेन्द्रीकृत अनुप्रयोगों के साथ बातचीत करने के लिए, आपको अपने वॉलेट में ईथर की आवश्यकता होगी।"
},
"needImportFile": {
"message": "आयात करने के लिए आपको एक फ़ाइल का चयन करना होगा।",
"description": "User is important an account and needs to add a file to continue"

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Odbaci"
},
"QRHardwareWalletImporterTitle": {
"message": "Skeniraj kôd QR"
},
"about": {
"message": "O opcijama"
},
"aboutSettingsDescription": {
"message": "Inačica, centar za podršku i informacije za kontakt"
},
"acceleratingATransaction": {
"message": "* Ubrzavanjem se transakcije pomoću veće cijene goriva povećava šansa za bržu obradu mrežom, ali se uvijek ne jamči."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Napredne mogućnosti"
},
"advancedSettingsDescription": {
"message": "Pristup značajkama razvojnog inženjera, preuzimanje zapisnika stanja, poništavanje računa, postavljanje testnih mreža i prilagođeni RPC"
},
"amount": {
"message": "Iznos"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Trenutačni jezik"
},
"custom": {
"message": "Napredno"
},
"customGas": {
"message": "Prilagodi gorivo"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Sigurno želite izbrisati ovu mrežu?"
},
"depositEther": {
"message": "Položi Ether"
},
"details": {
"message": "Detalji"
},
"directDepositEther": {
"message": "Izravan polog Ether"
},
"directDepositEtherExplainer": {
"message": "Ako imate nešto Ethera, najbrži je način prebacivanja Ethera u vaš novi novčanik izravan polog."
},
"done": {
"message": "Gotovo"
},
@ -416,9 +410,6 @@
"general": {
"message": "Opće"
},
"generalSettingsDescription": {
"message": "Konverzija valuta, glavna valuta, jezik, blockies identicon"
},
"getEther": {
"message": "Dohvati Ether"
},
@ -526,6 +517,9 @@
"learnMore": {
"message": "Saznajte više"
},
"learnMoreUpperCase": {
"message": "Saznajte više"
},
"ledgerAccountRestriction": {
"message": "Treba se koristiti zadnjim računom kako biste dodali novi račun."
},
@ -577,9 +571,6 @@
"myAccounts": {
"message": "Moji računi"
},
"needEtherInWallet": {
"message": "Trebate Ether u svojem novčaniku kako biste ostvarili interakciju s decentraliziranim aplikacijama uporabom usluge MetaMask. "
},
"needImportFile": {
"message": "Morate odabrati datoteku za uvoz.",
"description": "User is important an account and needs to add a file to continue"
@ -590,9 +581,6 @@
"networkName": {
"message": "Naziv mreže"
},
"networkSettingsDescription": {
"message": "Dodaj i uredi prilagođene mreže RPC"
},
"networks": {
"message": "Mreže"
},
@ -827,9 +815,6 @@
"securityAndPrivacy": {
"message": "Sigurnost i privatnost"
},
"securitySettingsDescription": {
"message": "Postavke privatnosti i početna rečenica novčanika"
},
"seedPhrasePlaceholder": {
"message": "Odvojite pojedinačne riječi jednim razmakom"
},
@ -863,9 +848,6 @@
"sendTokens": {
"message": "Pošalji tokene"
},
"separateEachWord": {
"message": "Odvojite pojedinačne riječi jednim razmakom"
},
"settings": {
"message": "Postavke"
},

View File

@ -1,4 +1,10 @@
{
"QRHardwareSignRequestCancel": {
"message": "Rejte"
},
"QRHardwareWalletImporterTitle": {
"message": "Enspeksyon QR Kòd"
},
"accessingYourCamera": {
"message": "Aksè a Kamera"
},
@ -153,18 +159,9 @@
"decimalsMustZerotoTen": {
"message": "Desimal yo dwe omwen 0, epi pa dwe plis pase 36."
},
"depositEther": {
"message": "Depo Ether"
},
"details": {
"message": "Detay yo"
},
"directDepositEther": {
"message": "Dirèkteman Depo Ether"
},
"directDepositEtherExplainer": {
"message": "Si ou deja gen kèk Ether, fason ki pi rapid yo ka resevwa Ether nan nouvo Wallet ou pa depo dirèk."
},
"done": {
"message": "Fini"
},
@ -307,6 +304,9 @@
"learnMore": {
"message": "Aprann plis"
},
"learnMoreUpperCase": {
"message": "Aprann plis"
},
"ledgerAccountRestriction": {
"message": "Ou bezwen sèvi ak dènye kont ou anvan ou ka ajoute yon nouvo."
},
@ -346,9 +346,6 @@
"myAccounts": {
"message": "Kont mwen"
},
"needEtherInWallet": {
"message": "Pou kominike avèk aplikasyon desantralize ou dwe itilize MetaMask, ou pral bezwen Ether nan Wallet ou."
},
"needImportFile": {
"message": "Ou dwe chwazi yon dosye pou enpòte.",
"description": "User is important an account and needs to add a file to continue"
@ -548,9 +545,6 @@
"sendTokens": {
"message": "Voye Tokens"
},
"separateEachWord": {
"message": "Separe chak mo ak yon sèl espas"
},
"settings": {
"message": "Paramèt"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Elutasítás"
},
"QRHardwareWalletImporterTitle": {
"message": "QR-kód beolvasása"
},
"about": {
"message": "Névjegy"
},
"aboutSettingsDescription": {
"message": "Verzió, ügyfélszolgálat és elérhetőségek"
},
"acceleratingATransaction": {
"message": "* Ha szeretné felgyorsítani a tranzakciót azzal, hogy magasabb gázárat használ, az növeli a gyorsabb feldolgozás esélyét, de ez nem mindig garantált."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Haladó beállítások"
},
"advancedSettingsDescription": {
"message": "Hozzáférés fejlesztői funkciókhoz, állapotnaplók letöltése, fiók újraállítása, testnetek és egyéni RPC-k beállítása"
},
"amount": {
"message": "Összeg"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Aktuális nyelv"
},
"custom": {
"message": "Speciális"
},
"customGas": {
"message": "Gáz testreszabása"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Biztosan törli ezt a hálózatot?"
},
"depositEther": {
"message": "Ether befizetése"
},
"details": {
"message": "Részletek"
},
"directDepositEther": {
"message": "Fizess be ethert közvetlenül"
},
"directDepositEtherExplainer": {
"message": "Amennyiben már rendelkezik némi Ether-rel, a közvetlen letéttel gyorsan elhelyezheti azt új pénztárcájában."
},
"done": {
"message": "Kész"
},
@ -416,9 +410,6 @@
"general": {
"message": "Általános"
},
"generalSettingsDescription": {
"message": "Pénznem átváltása, elsődleges pénznem, nyelv, blockies identikonok"
},
"getEther": {
"message": "Ether beszerzése"
},
@ -526,6 +517,9 @@
"learnMore": {
"message": "Tudjon meg többet"
},
"learnMoreUpperCase": {
"message": "Tudjon meg többet"
},
"ledgerAccountRestriction": {
"message": "Használnia kell a korábbi fiókját, mielőtt újat adhat hozzá. "
},
@ -577,9 +571,6 @@
"myAccounts": {
"message": "Fiókjaim"
},
"needEtherInWallet": {
"message": "Ha a MetaMaskon keresztül szeretne interakcióba lépni decentralizált alkalmazással, ahhoz a tárcájában Ethernek kell lennie."
},
"needImportFile": {
"message": "Ki kell választania az importálni kívánt fájlt.",
"description": "User is important an account and needs to add a file to continue"
@ -590,9 +581,6 @@
"networkName": {
"message": "Hálózat neve"
},
"networkSettingsDescription": {
"message": "Egyedi RPC-hálózatok hozzáadása és szerkesztése"
},
"networks": {
"message": "Hálózatok"
},
@ -827,9 +815,6 @@
"securityAndPrivacy": {
"message": "Biztonság és adatvédelem"
},
"securitySettingsDescription": {
"message": "Biztonsági beállítások és pénztárca kulcsszólánca"
},
"seedPhrasePlaceholder": {
"message": "A szavakat egy-egy szóközzel válassza el"
},
@ -863,9 +848,6 @@
"sendTokens": {
"message": "Token küldése"
},
"separateEachWord": {
"message": "Minden egyes szavat szóközzel válasszon el"
},
"settings": {
"message": "Beállítások"
},

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Annulla"
},
"QRHardwareWalletImporterTitle": {
"message": "Scansiona Codice QR"
},
"about": {
"message": "Informazioni"
},
"aboutSettingsDescription": {
"message": "Versione, centro di supporto e contatti"
},
"acceleratingATransaction": {
"message": "* Accelerare una transazione usando un prezzo del gas maggiore aumenta la probabilità che la rete la elabori più velocemente, ma non è garantito."
},
@ -19,9 +22,6 @@
"accessingYourCamera": {
"message": "Accesso alla fotocamera..."
},
"account": {
"message": "Account"
},
"accountDetails": {
"message": "Dettagli Account"
},
@ -70,9 +70,6 @@
"advancedOptions": {
"message": "Opzioni Avanzate"
},
"advancedSettingsDescription": {
"message": "Accedi alle funzionalità sviluppatore, download dei log di Stato, Reset Account, imposta reti di test e RPC personalizzata"
},
"affirmAgree": {
"message": "Acconsento"
},
@ -97,9 +94,6 @@
"alerts": {
"message": "Avvisi"
},
"alertsSettingsDescription": {
"message": "Attiva o disattiva ogni avviso"
},
"allowExternalExtensionTo": {
"message": "Permetti a questa estensione di:"
},
@ -145,9 +139,6 @@
"approved": {
"message": "Approvato"
},
"asset": {
"message": "Asset"
},
"assets": {
"message": "Patrimonio"
},
@ -221,9 +212,6 @@
"buyWithWyreDescription": {
"message": "Wyre ti consente di usare la carta di credito per depositare ETH direttamente nel tuo account MetaMask."
},
"bytes": {
"message": "Bytes"
},
"canToggleInSettings": {
"message": "Puoi riabilitare questa notifica in Impostazioni -> Avvisi."
},
@ -236,9 +224,6 @@
"cancelled": {
"message": "Annullata"
},
"chainId": {
"message": "Chain ID"
},
"chromeRequiredForHardwareWallets": {
"message": "Devi usare MetaMask con Google Chrome per connettere il tuo Portafoglio Hardware"
},
@ -346,9 +331,6 @@
"contacts": {
"message": "Contatti"
},
"contactsSettingsDescription": {
"message": "Aggiungi, modifica, rimuovi e gestisci i tuoi contatti"
},
"continue": {
"message": "Continua"
},
@ -400,6 +382,9 @@
"currentLanguage": {
"message": "Lingua Corrente"
},
"custom": {
"message": "Avanzate"
},
"customGas": {
"message": "Personalizza Gas"
},
@ -453,18 +438,9 @@
"deleteNetworkDescription": {
"message": "Sei sicuro di voler eliminare questa rete?"
},
"depositEther": {
"message": "Deposita Ether"
},
"details": {
"message": "Dettagli"
},
"directDepositEther": {
"message": "Deposita Direttamente Ether"
},
"directDepositEtherExplainer": {
"message": "Se possiedi già degli Ether, questa è la via più veloce per aggiungere Ether al tuo portafoglio con un deposito diretto."
},
"disconnect": {
"message": "Disconnetti"
},
@ -586,23 +562,12 @@
"message": "MetaMask ha riscontrato un errore",
"description": "Title of generic error page"
},
"errorStack": {
"message": "Stack:",
"description": "Title for error stack, which is displayed for debugging purposes"
},
"estimatedProcessingTimes": {
"message": "Tempi di Elaborazione Stimati"
},
"eth_accounts": {
"message": "Accesso agli indirizzi dei tuoi account autorizzati (richiesto)",
"description": "The description for the `eth_accounts` permission"
},
"ethereumPublicAddress": {
"message": "Indirizzo pubblico Ethereum "
},
"etherscan": {
"message": "Etherscan"
},
"etherscanView": {
"message": "Vedi account su Etherscan"
},
@ -700,9 +665,6 @@
"general": {
"message": "Generale"
},
"generalSettingsDescription": {
"message": "Conversione moneta, moneta primaria, lingua, icone blockie"
},
"getEther": {
"message": "Ottieni Ether"
},
@ -858,6 +820,9 @@
"learnMore": {
"message": "Scopri di più"
},
"learnMoreUpperCase": {
"message": "Scopri di più"
},
"ledgerAccountRestriction": {
"message": "E' necessario utilizzare l'ultimo account prima di poterne aggiungere uno nuovo."
},
@ -879,9 +844,6 @@
"loadingTokens": {
"message": "Caricamento Tokens..."
},
"localhost": {
"message": "Localhost 8545"
},
"lock": {
"message": "Disconnetti"
},
@ -958,9 +920,6 @@
"myAccounts": {
"message": "Miei Account"
},
"needEtherInWallet": {
"message": "Per interagire con applicazioni decentralizzate con MetaMask, devi possedere Ether nel tuo portafoglio."
},
"needImportFile": {
"message": "Devi selezionare un file da importare.",
"description": "User is important an account and needs to add a file to continue"
@ -974,9 +933,6 @@
"networkSettingsChainIdDescription": {
"message": "Il chain ID è usato per firmare le transazioni. Deve essere uguale al chain ID restituito dalla rete. Puoi inserire un numero intero o un numero esadecimale con prefisso '0x', ma mostreremo sempre un numero intero."
},
"networkSettingsDescription": {
"message": "Aggiungi e modifica reti RPC personalizzate"
},
"networks": {
"message": "Reti"
},
@ -989,10 +945,6 @@
"newAccountDetectedDialogMessage": {
"message": "Rilevato un nuovo indirizzo! Clicca qui per aggiungerlo alla tua rubrica."
},
"newAccountNumberName": {
"message": "Account $1",
"description": "Default name of next account to be created on create account screen"
},
"newContact": {
"message": "Nuovo contatto"
},
@ -1060,18 +1012,9 @@
"ofTextNofM": {
"message": "di"
},
"off": {
"message": "Off"
},
"offlineForMaintenance": {
"message": "Offline per manutenzione"
},
"ok": {
"message": "Ok"
},
"on": {
"message": "On"
},
"onboardingReturnNotice": {
"message": "\"$1\" chiuderà questa tab e ritornerà a $2",
"description": "Return the user to the site that initiated onboarding"
@ -1094,9 +1037,6 @@
"participateInMetaMetricsDescription": {
"message": "Participa in MetaMetrics per aiutarci a rendere MetaMask migliore"
},
"password": {
"message": "Password"
},
"passwordNotLongEnough": {
"message": "Password non abbastanza lunga"
},
@ -1110,6 +1050,10 @@
"pending": {
"message": "in corso"
},
"permission_ethereumAccounts": {
"message": "Accesso agli indirizzi dei tuoi account autorizzati (richiesto)",
"description": "The description for the `eth_accounts` permission"
},
"permissions": {
"message": "Permessi"
},
@ -1218,9 +1162,6 @@
"message": "È stato trovato un backup dei tuoi dati da $1. Vuoi ripristinare le preferenze del portafoglio?",
"description": "$1 is the date at which the data was backed up"
},
"retryTransaction": {
"message": "Retry Transaction"
},
"reusedTokenNameWarning": {
"message": "Un token usa un simbolo già usato da un altro token, ciò può confondere o ingannare."
},
@ -1281,9 +1222,6 @@
"securityAndPrivacy": {
"message": "Sicurezza & Privacy"
},
"securitySettingsDescription": {
"message": "Impostazioni sulla Privacy e sulla frase seed del portafoglio"
},
"seedPhrasePlaceholder": {
"message": "Separa ogni parola con un singolo spazio"
},
@ -1333,9 +1271,6 @@
"sendTokens": {
"message": "Invia Tokens"
},
"separateEachWord": {
"message": "Separa ogni parola con un solo spazio"
},
"settings": {
"message": "Impostazioni"
},
@ -1384,9 +1319,6 @@
"signatureRequest": {
"message": "Firma Richiesta"
},
"signatureRequest1": {
"message": "Message"
},
"signed": {
"message": "Firmata"
},
@ -1647,9 +1579,6 @@
"message": "$1 $2 disponibili allo scambio",
"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% Slippage"
},
"swapsAdvancedOptions": {
"message": "Impostazioni Avanzate"
},
@ -1730,9 +1659,6 @@
"message": "A: $1",
"description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress"
},
"token": {
"message": "Token"
},
"tokenAlreadyAdded": {
"message": "Il token è già stato aggiunto."
},

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "ತಿರಸ್ಕರಿಸಿ"
},
"QRHardwareWalletImporterTitle": {
"message": "QR ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ"
},
"about": {
"message": "ಕುರಿತು"
},
"aboutSettingsDescription": {
"message": "ಆವೃತ್ತಿ, ಬೆಂಬಲ ಕೇಂದ್ರ ಮತ್ತು ಸಂಪರ್ಕ ಮಾಹಿತಿ"
},
"acceleratingATransaction": {
"message": "* ಹೆಚ್ಚಿನ ಗ್ಯಾಸ್ ಬೆಲೆಯನ್ನು ಬಳಸಿಕೊಂಡು ವಹಿವಾಟನ್ನು ವೇಗಗೊಳಿಸುವುದರಿಂದ ನೆಟ್‌ವರ್ಕ್ ವೇಗವಾಗಿ ಪ್ರಕ್ರಿಯೆಗೊಳ್ಳುವ ಸಾಧ್ಯತೆಗಳನ್ನು ಅದು ಹೆಚ್ಚಿಸುತ್ತದೆ, ಆದರೆ ಇದು ಯಾವಾಗಲೂ ಖಚಿತವಾಗಿರುವುದಿಲ್ಲ."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "ಸುಧಾರಿತ ಆಯ್ಕೆಗಳು"
},
"advancedSettingsDescription": {
"message": "ಡೆವಲಪರ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಪ್ರವೇಶಿಸಿ, ರಾಜ್ಯದ ಲಾಗ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ, ಖಾತೆಯನ್ನು ಮರುಹೊಂದಿಸಿ, ಟೆಸ್ಟ್‌ನೆಟ್ಸ್‌ ಹೊಂದಿಸಿ ಮತ್ತು ಕಸ್ಟಮ್ RPC"
},
"amount": {
"message": "ಮೊತ್ತ"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "ಪ್ರಸ್ತುತ ಭಾಷೆ"
},
"custom": {
"message": "ಸುಧಾರಿತ"
},
"customGas": {
"message": "ಗ್ಯಾಸ್ ಕಸ್ಟಮೈಸ್ ಮಾಡಿ"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "ನೀವು ಈ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಖಚಿತವಾಗಿ ಅಳಿಸಲು ಬಯಸುತ್ತೀರಾ?"
},
"depositEther": {
"message": "ಎಥರ್ ಠೇವಣಿ ಮಾಡಿ"
},
"details": {
"message": "ವಿವರಗಳು"
},
"directDepositEther": {
"message": "ಎಥರ್ ನೇರವಾಗಿ ಠೇವಣಿ ಮಾಡಿ"
},
"directDepositEtherExplainer": {
"message": "ನೀವು ಈಗಾಗಲೇ ಕೆಲವು ಎಥರ್ ಹೊಂದಿದ್ದರೆ, ನೇರ ಠೇವಣಿ ಮೂಲಕ ನಿಮ್ಮ ಹೊಸ ವ್ಯಾಲೆಟ್‌ನಲ್ಲಿ ಎಥರ್ ಅನ್ನು ಪಡೆಯುವ ತ್ವರಿತ ಮಾರ್ಗ."
},
"done": {
"message": "ಮುಗಿದಿದೆ"
},
@ -420,9 +414,6 @@
"general": {
"message": "ಸಾಮಾನ್ಯ"
},
"generalSettingsDescription": {
"message": "ಕರೆನ್ಸಿ ಪರಿವರ್ತನೆ, ಪ್ರಾಥಮಿಕ ಕರೆನ್ಸಿ, ಭಾಷೆ, ನಿರ್ಬಂಧಗಳ ಗುರುತಿಸುವಿಕೆ"
},
"getEther": {
"message": "ಎಥರ್ ಪಡೆಯಿರಿ"
},
@ -530,6 +521,9 @@
"learnMore": {
"message": "ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"
},
"learnMoreUpperCase": {
"message": "ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"
},
"ledgerAccountRestriction": {
"message": "ನೀವು ಹೊಸದನ್ನು ಸೇರಿಸುವುದರ ಮೊದಲು ನಿಮ್ಮ ಹಿಂದಿನ ಖಾತೆಯನ್ನು ನೀವು ಬಳಸಬೇಕು."
},
@ -584,9 +578,6 @@
"myAccounts": {
"message": "ನನ್ನ ಖಾತೆಗಳು"
},
"needEtherInWallet": {
"message": "MetaMask ಬಳಸಿಕೊಂಡು ವಿಕೇಂದ್ರೀಕೃತ ಖಾತೆಗಳೊಂದಿಗೆ ಸಂವಹನ ನಡೆಸಲು, ನಿಮ್ಮ ವ್ಯಾಲೆಟ್‌ನಲ್ಲಿ ನಿಮಗೆ ಎಥರ್ ಅಗತ್ಯವಿದೆ."
},
"needImportFile": {
"message": "ಆಮದು ಮಾಡಲು ನೀವು ಫೈಲ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಬೇಕು.",
"description": "User is important an account and needs to add a file to continue"
@ -597,9 +588,6 @@
"networkName": {
"message": "ನೆಟ್‌ವರ್ಕ್ ಹೆಸರು"
},
"networkSettingsDescription": {
"message": "ಕಸ್ಟಮ್ RPC ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಸೇರಿಸಿ ಮತ್ತು ಸಂಪಾದಿಸಿ"
},
"networks": {
"message": "ನೆಟ್‌ವರ್ಕ್‌ಗಳು"
},
@ -834,9 +822,6 @@
"securityAndPrivacy": {
"message": "ಭದ್ರತೆ ಮತ್ತು ಗೌಪ್ಯತೆ"
},
"securitySettingsDescription": {
"message": "ಗೌಪ್ಯತೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ವ್ಯಾಲೆಟ್ ಸೀಡ್ ಫ್ರೇಸ್"
},
"seedPhrasePlaceholder": {
"message": "ಒಂದು ಸ್ಪೇಸ್ ಮೂಲಕ ಪ್ರತಿ ಪದವನ್ನು ಬೇರ್ಪಡಿಸಿ"
},
@ -870,9 +855,6 @@
"sendTokens": {
"message": "ಟೋಕನ್‌ಗಳನ್ನು ಕಳುಹಿಸಿ"
},
"separateEachWord": {
"message": "ಒಂದು ಸ್ಪೇಸ್ ಮೂಲಕ ಪ್ರತಿ ಪದವನ್ನು ಬೇರ್ಪಡಿಸಿ"
},
"settings": {
"message": "ಸೆಟ್ಟಿಂಗ್‌ಗಳು"
},

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Atmesti"
},
"QRHardwareWalletImporterTitle": {
"message": "Nuskaityti QR kodą"
},
"about": {
"message": "Apie"
},
"aboutSettingsDescription": {
"message": "Versija, palaikymo centras ir kontaktinė informacija"
},
"acceleratingATransaction": {
"message": "Operacijos paspartinimas naudojantis didesne dujų kaina padidina galimybes, kad ji bus greičiau apdorota tinkle, tačiau tai ne visada garantuojama. "
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Išplėstinės parinktys"
},
"advancedSettingsDescription": {
"message": "Prieigos kūrėjo funkcijos, būsenos žurnalų atsiuntimas, paskyros atstatymas, „testnet“ nustatymas ir pritaikytas RPC"
},
"amount": {
"message": "Suma"
},
@ -67,7 +67,7 @@
"description": "The description of the application"
},
"appName": {
"message": "MetaMask",
"message": "MetaMask",
"description": "The name of the application"
},
"appNameBeta": {
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Dabartinė kalba"
},
"custom": {
"message": "Išplėstiniai"
},
"customGas": {
"message": "Pritaikyti dujas"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Ar tikrai norite panaikinti šį tinklą?"
},
"depositEther": {
"message": "Įnešti eterių"
},
"details": {
"message": "Išsami informacija"
},
"directDepositEther": {
"message": "Tiesiogiai įnešti eteriai"
},
"directDepositEtherExplainer": {
"message": "Jeigu jau turite šiek tiek eterių, sparčiausias būdas gauti eterių į naują piniginę yra tiesioginis įnašas."
},
"done": {
"message": "Atlikta"
},
@ -420,9 +414,6 @@
"general": {
"message": "Bendra"
},
"generalSettingsDescription": {
"message": "Valiutos keitimas, pagrindinė valiuta, kalba, „blockies identicon“"
},
"getEther": {
"message": "Gauti eterių"
},
@ -530,6 +521,9 @@
"learnMore": {
"message": "Sužinokite daugiau"
},
"learnMoreUpperCase": {
"message": "Sužinokite daugiau"
},
"ledgerAccountRestriction": {
"message": "Prieš įtraukdami naują, turite pasinaudoti paskutine paskyra."
},
@ -584,9 +578,6 @@
"myAccounts": {
"message": "Mano paskyros"
},
"needEtherInWallet": {
"message": "Norėdami dirbti su decentralizuotomis programomis „MetaMask“, savo piniginėje turite turėti eterių."
},
"needImportFile": {
"message": "Turite pasirinkti failą, kurį pageidaujate importuoti.",
"description": "User is important an account and needs to add a file to continue"
@ -597,9 +588,6 @@
"networkName": {
"message": "Tinklo pavadinimas"
},
"networkSettingsDescription": {
"message": "Įtraukti ir redaguoti tinkintus RPC tinklus"
},
"networks": {
"message": "Tinklai"
},
@ -834,9 +822,6 @@
"securityAndPrivacy": {
"message": "Sauga ir privatumas"
},
"securitySettingsDescription": {
"message": "Privatumo nuostatos ir slaptažodinės atkūrimo frazė"
},
"seedPhrasePlaceholder": {
"message": "Kiekvieną žodį atskirkite viengubu tarpu"
},
@ -870,9 +855,6 @@
"sendTokens": {
"message": "Siųsti žetonus"
},
"separateEachWord": {
"message": "Kiekvieną žodį atskirkite viengubu tarpu"
},
"settings": {
"message": "Nustatymai"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Noraidīt"
},
"QRHardwareWalletImporterTitle": {
"message": "Ieskenēt QR kodu"
},
"about": {
"message": "Par"
},
"aboutSettingsDescription": {
"message": "Versija, atbalsta centrs un kontaktinformācija"
},
"acceleratingATransaction": {
"message": "* Darījuma paātrināšana, izmantojot augstāku Gas cenu, palielina iespēju, ka tīkls to apstrādās ātrāk, taču tas nav garantēts."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Papildu opcijas"
},
"advancedSettingsDescription": {
"message": "Piekļūstiet izstrādātāju funkcijām, lejupielādējiet stāvokļu žurnālus, atiestatiet kontu, iestatiet testa tīklus un pielāgotos RPC izsaukumus"
},
"amount": {
"message": "Apjoms"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Pašreizējā valodā"
},
"custom": {
"message": "Papildu"
},
"customGas": {
"message": "Pielāgot Gas"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Vai tiešām vēlaties dzēst šo tīklu?"
},
"depositEther": {
"message": "Noguldīt Ether"
},
"details": {
"message": "Informācija"
},
"directDepositEther": {
"message": "Tiešā Ether iemaksa"
},
"directDepositEtherExplainer": {
"message": "Ja jums jau ir Ether, tad visātrāk Ether savā makā varat saņemt ar tiešo iemaksu."
},
"done": {
"message": "Pabeigts"
},
@ -416,9 +410,6 @@
"general": {
"message": "Vispārīgi"
},
"generalSettingsDescription": {
"message": "Valūtas konvertēšana, galvenā valūta, valoda, bloku identifikators"
},
"getEther": {
"message": "Saņemt Ether"
},
@ -526,6 +517,9 @@
"learnMore": {
"message": "Uzzināt vairāk"
},
"learnMoreUpperCase": {
"message": "Uzzināt vairāk"
},
"ledgerAccountRestriction": {
"message": "Jums jāizmanto pēdējais konts pirms varat pievienot jaunu."
},
@ -580,9 +574,6 @@
"myAccounts": {
"message": "Mani konti"
},
"needEtherInWallet": {
"message": "Lai izmantotu decentralizētas lietotnes ar MetaMask, jūsu makā jābūt Ether."
},
"needImportFile": {
"message": "Jums jāatlasa fails, ko importēt",
"description": "User is important an account and needs to add a file to continue"
@ -593,9 +584,6 @@
"networkName": {
"message": "Tīkla nosaukums"
},
"networkSettingsDescription": {
"message": "Pievienot un rediģēt pielāgotos RPC tīklus"
},
"networks": {
"message": "Tīkli"
},
@ -830,9 +818,6 @@
"securityAndPrivacy": {
"message": "Drošība un konfidencialitāte"
},
"securitySettingsDescription": {
"message": "Konfidencialitātes iestatījumi un maka atkopšanas frāze"
},
"seedPhrasePlaceholder": {
"message": "Atdaliet katru vārdu ar vienu atstarpi"
},
@ -866,9 +851,6 @@
"sendTokens": {
"message": "Nosūtīt marķierus"
},
"separateEachWord": {
"message": "Atdaliet katru vārdu ar vienu atstarpi"
},
"settings": {
"message": "Iestatījumi"
},

View File

@ -1,4 +1,7 @@
{
"QRHardwareSignRequestCancel": {
"message": "നിരസിക്കുക"
},
"about": {
"message": "വിവരം"
},
@ -44,6 +47,9 @@
"create": {
"message": "സൃഷ്‌ടിക്കുക"
},
"custom": {
"message": "നൂതനം"
},
"delete": {
"message": "ഇല്ലാതാക്കുക"
},

View File

@ -1,4 +1,7 @@
{
"QRHardwareSignRequestCancel": {
"message": "नाकारा"
},
"about": {
"message": "बद्दल"
},
@ -44,6 +47,9 @@
"create": {
"message": "तयार करा"
},
"custom": {
"message": "प्रगत"
},
"delete": {
"message": "हटवा"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Tolak"
},
"QRHardwareWalletImporterTitle": {
"message": "Imbas Kod QR"
},
"about": {
"message": "Mengenai"
},
"aboutSettingsDescription": {
"message": "Versi, pusat sokongan, dan maklumat perhubungan"
},
"acceleratingATransaction": {
"message": "* Mempercepatkan transaksi menggunakan harga gas lebih tinggi akan meningkatkan peluang diproses oleh rangkaian lebih cepat, tetapi ini pun tidak sentiasa dijamin."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Pilihan Lanjutan"
},
"advancedSettingsDescription": {
"message": "Akses ciri-ciri pembangun, muat turun Log Keadaan, Set Semula Akaun, sediakan jaringan ujian dan RPC tersuai"
},
"amount": {
"message": "Jumlah"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Bahasa Semasa"
},
"custom": {
"message": "Lanjutan"
},
"customGas": {
"message": "Suaikan Gas"
},
@ -286,12 +289,6 @@
"details": {
"message": "Butiran"
},
"directDepositEther": {
"message": "Deposit Ether Secara Terus"
},
"directDepositEtherExplainer": {
"message": "Jika anda sudah mempunyai Ether, cara paling cepat untuk mendapatkan Ether di dompet baru anda ialah dengan deposit langsung."
},
"done": {
"message": "Selesai"
},
@ -410,9 +407,6 @@
"general": {
"message": "Am"
},
"generalSettingsDescription": {
"message": "Penukaran mata wang, mata wang utama, bahasa, blockies identicon"
},
"getEther": {
"message": "Dapatkan Ether"
},
@ -516,6 +510,9 @@
"learnMore": {
"message": "Maklumat lanjut"
},
"learnMoreUpperCase": {
"message": "Maklumat lanjut"
},
"ledgerAccountRestriction": {
"message": "Anda perlu menggunakan akaun terakhir anda sebelum anda boleh menambah yang baru."
},
@ -564,9 +561,6 @@
"myAccounts": {
"message": "Akaun Saya"
},
"needEtherInWallet": {
"message": "Untuk berinteraksi dengan aplikasi ternyahpusat menggunakan MetaMask, anda memerlukan Ether di dalam dompet anda."
},
"needImportFile": {
"message": "Anda mesti pilih fail untuk diimport.",
"description": "User is important an account and needs to add a file to continue"
@ -577,9 +571,6 @@
"networkName": {
"message": "Nama Rangkaian"
},
"networkSettingsDescription": {
"message": "Tambah dan sunting rangkaian RPC tersuai"
},
"networks": {
"message": "Rangkaian"
},
@ -811,9 +802,6 @@
"securityAndPrivacy": {
"message": "Keselamatan & Privasi"
},
"securitySettingsDescription": {
"message": "Tetapan privasi dan ungkapan benih dompet"
},
"seedPhrasePlaceholder": {
"message": "Pisahkan setiap perkataan dengan satu ruang"
},
@ -847,9 +835,6 @@
"sendTokens": {
"message": "Hantar Token"
},
"separateEachWord": {
"message": "Pisahkan setiap perkataan dengan ruang tunggal"
},
"settings": {
"message": "Tetapan"
},

View File

@ -1,4 +1,7 @@
{
"QRHardwareSignRequestCancel": {
"message": "Afwijzen"
},
"accountDetails": {
"message": "Accountgegevens"
},
@ -81,15 +84,6 @@
"decimalsMustZerotoTen": {
"message": "Decimalen moeten minimaal 0 en niet meer dan 36 zijn."
},
"depositEther": {
"message": "Stort Ether"
},
"directDepositEther": {
"message": "Directe Ether storten"
},
"directDepositEtherExplainer": {
"message": "Als je al wat Ether hebt, de snelste manier om Ether in je nieuwe portemonnee te krijgen door een directe storting."
},
"done": {
"message": "Gedaan"
},
@ -214,9 +208,6 @@
"myAccounts": {
"message": "Mijn accounts"
},
"needEtherInWallet": {
"message": "Om te communiceren met gedecentraliseerde applicaties met MetaMask, heb je Ether nodig in je portemonnee."
},
"needImportFile": {
"message": "U moet een bestand selecteren om te importeren.",
"description": "User is important an account and needs to add a file to continue"

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Avslå"
},
"QRHardwareWalletImporterTitle": {
"message": "Skann QR-kode"
},
"about": {
"message": "Info"
},
"aboutSettingsDescription": {
"message": "Versjon, brukerstøtte og kontaktinformasjon"
},
"acceleratingATransaction": {
"message": "* Akselerering av en transaksjon ved å bruke en høyere datakraftspris øker sjansene for å bli behandlet av nettverket raskere, men det er ikke alltid garantert."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Avanserte valg"
},
"advancedSettingsDescription": {
"message": "Få tilgang til utviklerfunksjoner, last ned tilstandslogger, tilbakestill konto, installer testnett og tilpasset RPC"
},
"amount": {
"message": "Sum"
},
@ -253,6 +253,9 @@
"currentLanguage": {
"message": "Nåværende språk "
},
"custom": {
"message": "Avansert"
},
"customGas": {
"message": "Tilpass Gass"
},
@ -280,18 +283,9 @@
"deleteNetworkDescription": {
"message": "Er du sikker på at du vil slette dette nettverket?"
},
"depositEther": {
"message": "Sett inn Ether "
},
"details": {
"message": "Detaljer"
},
"directDepositEther": {
"message": "Sett Ether direkte inn"
},
"directDepositEtherExplainer": {
"message": "Hvis du allerede har noe Ether, er den raskeste måten å få Ether i den nye lommeboken din på ved hjelp av direkte innskudd."
},
"done": {
"message": "Ferdig"
},
@ -413,9 +407,6 @@
"general": {
"message": "Generell"
},
"generalSettingsDescription": {
"message": "Valutakonvertering, primærvaluta, språk, identifikasjonsblokkering"
},
"getEther": {
"message": "Skaff Ether "
},
@ -517,6 +508,9 @@
"learnMore": {
"message": "Lær mer"
},
"learnMoreUpperCase": {
"message": "Lær mer"
},
"ledgerAccountRestriction": {
"message": "Du må bruke den siste kontoen din før du kan legge til en ny."
},
@ -571,9 +565,6 @@
"myAccounts": {
"message": "Mine kontoer "
},
"needEtherInWallet": {
"message": "Du må ha Ether i lommeboken din for å samhandle med desentraliserte applikasjoner gjennom MateMask."
},
"needImportFile": {
"message": "Du må velge en fil å importere.",
"description": "User is important an account and needs to add a file to continue"
@ -584,9 +575,6 @@
"networkName": {
"message": "Nettverksnavn "
},
"networkSettingsDescription": {
"message": "Legg til og rediger tilpassede RPC-nettverk"
},
"networks": {
"message": "Nettverk"
},
@ -818,9 +806,6 @@
"securityAndPrivacy": {
"message": "Sikkerhet og personvern"
},
"securitySettingsDescription": {
"message": "Personverninnstillinger og lommebokens mnemoniske gjenopprettingsfrase"
},
"seedPhrasePlaceholder": {
"message": "Skill hvert ord med ett enkelt mellomrom"
},
@ -851,9 +836,6 @@
"sendTokens": {
"message": "Send tokener"
},
"separateEachWord": {
"message": "Del hvert ord med et enkelt mellomrom "
},
"settings": {
"message": "Innstillinger"
},

View File

@ -2,9 +2,6 @@
"about": {
"message": "Tungkol Dito"
},
"aboutSettingsDescription": {
"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 maiproseso ng network, pero hindi ito palaging ginagarantiya."
},
@ -97,9 +94,6 @@
"advancedOptions": {
"message": "Mga Advanced na Opsyon"
},
"advancedSettingsDescription": {
"message": "I-access ang mga pang-developer na feature, i-download ang Mga Log ng Status, I-reset ang Account, i-set up ang mga testnet at custom na RPC"
},
"affirmAgree": {
"message": "Sang-ayon ako"
},
@ -124,9 +118,6 @@
"alerts": {
"message": "Mga Alerto"
},
"alertsSettingsDescription": {
"message": "I-enable o i-disable ang bawat alerto"
},
"allowExternalExtensionTo": {
"message": "Payagan ang external extension na ito na:"
},
@ -400,9 +391,6 @@
"contacts": {
"message": "Mga Contact"
},
"contactsSettingsDescription": {
"message": "Magdagdag, mag-edit, mag-alis, at mamahala ng iyong mga contact"
},
"continue": {
"message": "Magpatuloy"
},
@ -519,18 +507,9 @@
"deleteNetworkDescription": {
"message": "Sigurado ka bang gusto mong i-delete ang network na ito?"
},
"depositEther": {
"message": "Mag-deposit ng Ether"
},
"details": {
"message": "Mga Detalye"
},
"directDepositEther": {
"message": "Direktang Mag-deposit ng Ether"
},
"directDepositEtherExplainer": {
"message": "Kung mayroon ka nang ilang Ether, ang pinakamabilis na paraan para makakuha ng Ether sa bago mong wallet ay sa pamamagitan ng direktang pag-deposit."
},
"disconnect": {
"message": "Idiskonekta"
},
@ -689,10 +668,6 @@
"ethGasPriceFetchWarning": {
"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)",
"description": "The description for the `eth_accounts` permission"
},
"ethereumPublicAddress": {
"message": "Pampublikong Address ng Ethereum"
},
@ -805,9 +780,6 @@
"general": {
"message": "Pangkalahatan"
},
"generalSettingsDescription": {
"message": "Conversion ng currency, pangunahing currency, wika, blockies identicon"
},
"getEther": {
"message": "Kunin ang Ether"
},
@ -1116,9 +1088,6 @@
"name": {
"message": "Pangalan"
},
"needEtherInWallet": {
"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",
"description": "$1 represents `needHelpLinkText`, the text which goes in the help link"
@ -1154,9 +1123,6 @@
"networkSettingsChainIdDescription": {
"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"
},
"networkURL": {
"message": "URL ng Network"
},
@ -1351,6 +1317,10 @@
"pending": {
"message": "Nakabinbin"
},
"permission_ethereumAccounts": {
"message": "Tingnan ang mga address ng iyong mga pinapayagang account (kinakailangan)",
"description": "The description for the `eth_accounts` permission"
},
"permissions": {
"message": "Mga Pahintulot"
},
@ -1552,9 +1522,6 @@
"securityAndPrivacy": {
"message": "Seguridad at Privacy"
},
"securitySettingsDescription": {
"message": "Mga setting ng privacy at Secret Recovery Phrase ng wallet"
},
"seedPhraseIntroSidebarBulletFour": {
"message": "Isulat ito at itabi sa maraming tagong lugar."
},
@ -1643,9 +1610,6 @@
"sendTokens": {
"message": "Magpadala ng Mga Token"
},
"separateEachWord": {
"message": "Paghiwa-hiwalayin ang bawat salita gamit ang isang space"
},
"settings": {
"message": "Mga Setting"
},
@ -2300,9 +2264,6 @@
"walletConnectionGuide": {
"message": "ang aming gabay sa pagkonekta ng hardware wallet"
},
"walletSeedRestore": {
"message": "Recovery Phrase ng Wallet Secret"
},
"web3ShimUsageNotification": {
"message": "Napansin naming sinubukang gamitin ng kasalukuyang website ang tinanggal na window.web3 API. Kung mukhang sira ang site, paki-click ang $1 para sa higit pang impormasyon.",
"description": "$1 is a clickable link."

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Odrzuć"
},
"QRHardwareWalletImporterTitle": {
"message": "Skanuj kod QR"
},
"about": {
"message": "Informacje"
},
"aboutSettingsDescription": {
"message": "Wersja, centrum wsparcia i dane kontaktowe"
},
"acceleratingATransaction": {
"message": "* Przyspieszenie transakcji poprzez zastosowanie wyższej ceny gazu zwiększa szanse na jej szybsze przetworzenie przez sieć, jednak skuteczność tej operacji nie jest gwarantowana."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Opcje zaawansowane"
},
"advancedSettingsDescription": {
"message": "Dostęp do funkcji programisty, pobieranie dzienników stanu, resetowanie konta, konfigurowanie sieci testowych i niestandardowe RPC"
},
"amount": {
"message": "Ilość"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Obecny język"
},
"custom": {
"message": "Zaawansowane"
},
"customGas": {
"message": "Ustaw gaz"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Czy na pewno chcesz usunąć tę sieć?"
},
"depositEther": {
"message": "Zdeponuj Eter"
},
"details": {
"message": "Szczegóły"
},
"directDepositEther": {
"message": "Zdeponuj Eter bezpośrednio"
},
"directDepositEtherExplainer": {
"message": "Jeśli już masz Eter, najszybciej umieścisz go w swoim nowym portfelu przy pomocy bezpośredniego depozytu."
},
"done": {
"message": "Gotowe"
},
@ -420,9 +414,6 @@
"general": {
"message": "Ogólne"
},
"generalSettingsDescription": {
"message": "Przeliczanie walut, waluta podstawowa, język, ikona (identicon) Blockies"
},
"getEther": {
"message": "Zdobądź Eter"
},
@ -530,6 +521,9 @@
"learnMore": {
"message": "Dowiedz się więcej"
},
"learnMoreUpperCase": {
"message": "Dowiedz się więcej"
},
"ledgerAccountRestriction": {
"message": "Musisz użyć swojego poprzedniego konta zanim dodasz kolejne."
},
@ -581,9 +575,6 @@
"myAccounts": {
"message": "Moje konta"
},
"needEtherInWallet": {
"message": "Żeby skorzystać ze zdecentraliowanych aplikacji (dApps) przy pomocy MetaMask, potrzebujesz Eteru w swoim portfelu."
},
"needImportFile": {
"message": "Musisz wybrać plik do zaimportowania.",
"description": "User is important an account and needs to add a file to continue"
@ -594,9 +585,6 @@
"networkName": {
"message": "Nazwa sieci"
},
"networkSettingsDescription": {
"message": "Dodawaj i edytuj niestandardowe sieci RPC"
},
"networks": {
"message": "Sieci"
},
@ -828,9 +816,6 @@
"securityAndPrivacy": {
"message": "Bezpieczeństwo i prywatność"
},
"securitySettingsDescription": {
"message": "Ustawienia prywatności i fraza seed portfela"
},
"seedPhrasePlaceholder": {
"message": "Oddziel słowa pojedynczą spacją"
},
@ -864,9 +849,6 @@
"sendTokens": {
"message": "Wyślij tokeny"
},
"separateEachWord": {
"message": "Oddziel słowa pojedynczą spacją"
},
"settings": {
"message": "Ustawienia"
},

View File

@ -84,18 +84,9 @@
"decimalsMustZerotoTen": {
"message": "Decimais devem ser no mínimo 0 e não passar de 36."
},
"depositEther": {
"message": "Depositar Ether"
},
"details": {
"message": "Detalhes"
},
"directDepositEther": {
"message": "Depositar Diretamente Ether"
},
"directDepositEtherExplainer": {
"message": "Se já tem Ether, a forma mais rápida de ficar com Ether na sua carteira é através de depósito direto."
},
"done": {
"message": "Finalizado"
},
@ -220,9 +211,6 @@
"myAccounts": {
"message": "As minhas contas"
},
"needEtherInWallet": {
"message": "Para interagir com applicações descentralizadas usando MetaMask tem de ter Ether na sua carteira."
},
"needImportFile": {
"message": "Deve selecionar um ficheiro para importar.",
"description": "User is important an account and needs to add a file to continue"

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Respingeți"
},
"QRHardwareWalletImporterTitle": {
"message": "Scanați codul QR"
},
"about": {
"message": "Despre"
},
"aboutSettingsDescription": {
"message": "Versiune, centru de asistență și date de contact"
},
"acceleratingATransaction": {
"message": "* Accelerarea unei tranzacții folosind un preț în gas mai mare îi crește șansele de a fi procesată mai rapid de rețea, însă acest lucru nu este garantat întotdeauna."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Opțiuni avansate"
},
"advancedSettingsDescription": {
"message": "Accesați funcții pentru dezvoltatori, descărcați Jurnale de stare, resetați contul, configurați rețele de test și RPC personalizat"
},
"amount": {
"message": "Sumă"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Limba actuală"
},
"custom": {
"message": "Avansate"
},
"customGas": {
"message": "Particularizați Gas"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Sigur vreți să ștergeți această rețea?"
},
"depositEther": {
"message": "Depuneți Ether"
},
"details": {
"message": "Detalii"
},
"directDepositEther": {
"message": "Depuneți direct Ether"
},
"directDepositEtherExplainer": {
"message": "Dacă deja aveți Ether, cel mai rapid mod de a avea Ether în portofelul nou prin depunere directă."
},
"done": {
"message": "Efectuat"
},
@ -413,9 +407,6 @@
"gasUsed": {
"message": "Suma gaz folosită"
},
"generalSettingsDescription": {
"message": "Schimb valutar, moneda principală, limba, blockies identicon"
},
"getEther": {
"message": "Obțineți Ether"
},
@ -520,6 +511,9 @@
"learnMore": {
"message": "Aflați mai multe"
},
"learnMoreUpperCase": {
"message": "Aflați mai multe"
},
"ledgerAccountRestriction": {
"message": "Trebuie să folosiți ultimul cont înainte să adăugați altul."
},
@ -571,9 +565,6 @@
"myAccounts": {
"message": "Conturile mele"
},
"needEtherInWallet": {
"message": "Pentru a interacționa cu aplicațiile descentralizate prin intermediul MetaMask, trebuie să aveți Ether în portofel."
},
"needImportFile": {
"message": "Trebuie să selectați un fișier pentru importare.",
"description": "User is important an account and needs to add a file to continue"
@ -584,9 +575,6 @@
"networkName": {
"message": "Numele rețelei"
},
"networkSettingsDescription": {
"message": "Adăugați și editați rețelele RPC particularizate"
},
"networks": {
"message": "Rețele"
},
@ -821,9 +809,6 @@
"securityAndPrivacy": {
"message": "Securitate și confidențialitate"
},
"securitySettingsDescription": {
"message": "Setările de confidențialitate și fraza seed a portofelului"
},
"seedPhrasePlaceholder": {
"message": "Despărțiți fiecare cuvânt cu un spațiu"
},
@ -857,9 +842,6 @@
"sendTokens": {
"message": "Trimiteți indicative"
},
"separateEachWord": {
"message": "Despărțiți fiecare cuvânt cu un spațiu"
},
"settings": {
"message": "Setări"
},

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Odmítnout"
},
"QRHardwareWalletImporterTitle": {
"message": "Skenovať QR kód"
},
"about": {
"message": "Informácie"
},
"aboutSettingsDescription": {
"message": "Verzia, centrum podpory a kontaktné informácie"
},
"acceleratingATransaction": {
"message": "*Urýchlenie transakcie pomocou vyššej ceny za GAS zvyšuje šance na rýchlejšie spracovanie v sieti, nie je to však vždy zaručené."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Rozšírené nastavenia"
},
"advancedSettingsDescription": {
"message": "Získajte prístup k vývojárskym funkciám, sťahujte si Stavové denníky, resetujte účet, nastavujte testovacie siete a vlastné RPC"
},
"amount": {
"message": "Částka"
},
@ -250,6 +250,9 @@
"currentLanguage": {
"message": "Aktuálny jazyk"
},
"custom": {
"message": "Rozšírené"
},
"customGas": {
"message": "Nastavit palivo"
},
@ -277,18 +280,9 @@
"deleteNetworkDescription": {
"message": "Naozaj chcete túto sieť odstrániť?"
},
"depositEther": {
"message": "Vložit Ether"
},
"details": {
"message": "Podrobnosti"
},
"directDepositEther": {
"message": "Vložit Ether přímo"
},
"directDepositEtherExplainer": {
"message": "Pokud už vlastníte nějaký Ether, nejrychleji ho dostanete do peněženky přímým vkladem."
},
"done": {
"message": "Hotovo"
},
@ -414,9 +408,6 @@
"general": {
"message": "Všeobecne"
},
"generalSettingsDescription": {
"message": "Prevod mien, primárna mena, jazyk, identifikácia blokov"
},
"getEther": {
"message": "Získejte Ether"
},
@ -514,6 +505,9 @@
"learnMore": {
"message": "Zjistěte více."
},
"learnMoreUpperCase": {
"message": "Zjistěte více."
},
"ledgerAccountRestriction": {
"message": "Skôr ako budete môcť pridať nový účet, musíte použiť svoj posledný účet."
},
@ -556,9 +550,6 @@
"myAccounts": {
"message": "Moje účty"
},
"needEtherInWallet": {
"message": "Potřebujete Ether v peněžence, abyste mohli pomocí MetaMasku interagovat s decentralizovanými aplikacemi."
},
"needImportFile": {
"message": "Musíte zvolit soubor k importu.",
"description": "User is important an account and needs to add a file to continue"
@ -569,9 +560,6 @@
"networkName": {
"message": "Názov siete"
},
"networkSettingsDescription": {
"message": "Pridať a upraviť vlastné siete RPC"
},
"networks": {
"message": "Sítě"
},
@ -797,9 +785,6 @@
"securityAndPrivacy": {
"message": "Bezpečnosť a súkromie"
},
"securitySettingsDescription": {
"message": "Nastavenia súkromia a seed fráza peňaženky"
},
"seedPhrasePlaceholder": {
"message": "Každé slovo oddeľte jednou medzerou"
},
@ -833,9 +818,6 @@
"sendTokens": {
"message": "Odeslat tokeny"
},
"separateEachWord": {
"message": "Každé slovo oddeľte jednou medzerou"
},
"settings": {
"message": "Nastavení"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Zavrni"
},
"QRHardwareWalletImporterTitle": {
"message": "Skeniraj QR kodo"
},
"about": {
"message": "O možnostih"
},
"aboutSettingsDescription": {
"message": "Različica, center za podporo in podatki za stik"
},
"acceleratingATransaction": {
"message": "* Pospešitev transakcije z višjo gas ceno poveča njene možnosti za hitrejšo obdelavo v omrežju, vendar ni vedno zagotovljena."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Napredne možnosti"
},
"advancedSettingsDescription": {
"message": "Dostopite do funkcij razvijalca, prenesite dnevnike držav, ponastavite račun, nastavite testne mreže in RPC po meri"
},
"amount": {
"message": "Znesek"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Trenutni jezik"
},
"custom": {
"message": "Napredno"
},
"customGas": {
"message": "Prilagodi gas"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Ali ste prepričani, da želite izbrisati to omrežje?"
},
"depositEther": {
"message": "Vplačilo ethra"
},
"details": {
"message": "Podrobnosti"
},
"directDepositEther": {
"message": "Neposredno vplačilo ehera"
},
"directDepositEtherExplainer": {
"message": "Če že imate Ether, ga lahko najhitreje dobite v MetaMask z neposrednim vplačilom."
},
"done": {
"message": "Končano"
},
@ -417,9 +411,6 @@
"general": {
"message": "Splošno"
},
"generalSettingsDescription": {
"message": "Pretvorba valut, primarna valuta, jezik, identifikacija Blockies"
},
"getEther": {
"message": "Pridobi Ether"
},
@ -524,6 +515,9 @@
"learnMore": {
"message": "Preberite več"
},
"learnMoreUpperCase": {
"message": "Preberite več"
},
"ledgerAccountRestriction": {
"message": "Za dodajanje novega računa morate uporabiti zadnji račun."
},
@ -572,9 +566,6 @@
"myAccounts": {
"message": "Moji računi"
},
"needEtherInWallet": {
"message": "Za interakcijo z decentraliziranimi aplikacijami boste v svoji denarnici potrebovali Eter."
},
"needImportFile": {
"message": "Za uvoz morate izbrati datoteko.",
"description": "User is important an account and needs to add a file to continue"
@ -585,9 +576,6 @@
"networkName": {
"message": "Ime omrežja"
},
"networkSettingsDescription": {
"message": "Dodajte in uredite omrežja RPC po meri"
},
"networks": {
"message": "Omrežja"
},
@ -822,9 +810,6 @@
"securityAndPrivacy": {
"message": "Varnost in zasebnost"
},
"securitySettingsDescription": {
"message": "Nastavitve zasebnosti in geslo za denarnico seed phrase "
},
"seedPhrasePlaceholder": {
"message": "Vsako besedo ločite z enim presledkom"
},
@ -858,9 +843,6 @@
"sendTokens": {
"message": "Pošlji žetone"
},
"separateEachWord": {
"message": "Vsako besedo ločite z enim presledkom"
},
"settings": {
"message": "Nastavitve"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Одбиј"
},
"QRHardwareWalletImporterTitle": {
"message": "Skenirajte QR kod"
},
"about": {
"message": "Основни подаци"
},
"aboutSettingsDescription": {
"message": "Verzija, centar za podršku i podaci za kontakt"
},
"acceleratingATransaction": {
"message": "* Time što se ubrzava transakcija koristeći veću gas cenu, povećavaju se šanse da se procesuira brže od strane mreže, ali to nije uvek zagarantovano."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Dodatne opcije"
},
"advancedSettingsDescription": {
"message": "Pristupite funkcijama za programere, preuzmite državne evidencije, resetujte nalog, postavite testne mreže i prilagođeni RPC"
},
"amount": {
"message": "Iznos"
},
@ -253,6 +253,9 @@
"currentLanguage": {
"message": "Trenutni jezik"
},
"custom": {
"message": "Напредне опције"
},
"customGas": {
"message": "Prilagodi gas"
},
@ -280,18 +283,9 @@
"deleteNetworkDescription": {
"message": "Da li ste sigurni da želite da izbrišete ovu mrežu?"
},
"depositEther": {
"message": "Dajte depozit Ether-u"
},
"details": {
"message": "Детаљи"
},
"directDepositEther": {
"message": "Direktno deponujte Ether"
},
"directDepositEtherExplainer": {
"message": "Ako već imate neki Ether, najbrži način da preuzmete Ether u svoj novi novčanik jeste direktnim deponovanjem."
},
"done": {
"message": "Gotovo"
},
@ -417,9 +411,6 @@
"general": {
"message": "Opšte"
},
"generalSettingsDescription": {
"message": "Konverzija valuta, primarna valuta, jezik, blockies identicon"
},
"getEther": {
"message": "Nabavite Ether"
},
@ -527,6 +518,9 @@
"learnMore": {
"message": "Nauči više"
},
"learnMoreUpperCase": {
"message": "Nauči više"
},
"ledgerAccountRestriction": {
"message": "Treba da koristite svoj poslednji nalog pre nego što budete mogli da dodate novi."
},
@ -575,9 +569,6 @@
"myAccounts": {
"message": "Moji nalozi"
},
"needEtherInWallet": {
"message": "Da biste stupili u interakciju sa decentralizovanim aplikacijama koristeći MetaMask, biće vam potreban Ether u vašem novčaniku."
},
"needImportFile": {
"message": "Morate izabrati fajl koji ćete uvesti.",
"description": "User is important an account and needs to add a file to continue"
@ -588,9 +579,6 @@
"networkName": {
"message": "Ime mreže"
},
"networkSettingsDescription": {
"message": "Dodajte i uredite prilagođene RPC mreže"
},
"networks": {
"message": "Mreže"
},
@ -825,9 +813,6 @@
"securityAndPrivacy": {
"message": "Bezbednost i privatnost"
},
"securitySettingsDescription": {
"message": "Podešavanja privatnosti i novčanik fraze početnih vrednosti"
},
"seedPhrasePlaceholder": {
"message": "Odvojite svaku reč jednim razmakom"
},
@ -861,9 +846,6 @@
"sendTokens": {
"message": "Pošalji tokene"
},
"separateEachWord": {
"message": "Razdvojite svaku reč jednim mestom razmaka"
},
"settings": {
"message": "Podešavanja"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Avvisa"
},
"QRHardwareWalletImporterTitle": {
"message": "Skanna QR-koden"
},
"about": {
"message": "Om"
},
"aboutSettingsDescription": {
"message": "Version, supportcenter och kontaktinformation"
},
"acceleratingATransaction": {
"message": "* Att snabba upp en överföring genom att använda ett högre gaspris ökar chanserna för att överföringen ska hanteras snabbare av nätverket, men det är inte en garanti."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Avancerade alternativ"
},
"advancedSettingsDescription": {
"message": "Åtkomst till verktyg för utvecklare, ladda ner loggar, återställ konto, upprätta testnätverk och skräddarsy RPC"
},
"amount": {
"message": "Belopp"
},
@ -250,6 +250,9 @@
"currentLanguage": {
"message": "Aktuellt språk"
},
"custom": {
"message": "Avancerat"
},
"customGas": {
"message": "Anpassa gas"
},
@ -277,18 +280,9 @@
"deleteNetworkDescription": {
"message": "Är du säker på att du vill ta bort detta nätverk?"
},
"depositEther": {
"message": "Sätt in Ether"
},
"details": {
"message": "Info"
},
"directDepositEther": {
"message": "Sätt in Ether direkt"
},
"directDepositEtherExplainer": {
"message": "Om du redan har Ether är det snabbaste sättet att få Ether i din nya plånbok att göra en direktinsättning."
},
"done": {
"message": "Klart"
},
@ -410,9 +404,6 @@
"general": {
"message": "Allmänt"
},
"generalSettingsDescription": {
"message": "Valutaomvandling, primär valuta, språk"
},
"getEther": {
"message": "Skaffa Ether"
},
@ -520,6 +511,9 @@
"learnMore": {
"message": "Läs mer"
},
"learnMoreUpperCase": {
"message": "Läs mer"
},
"ledgerAccountRestriction": {
"message": "Du måste använda ditt senaste konto innan du kan lägga till ett nytt."
},
@ -568,9 +562,6 @@
"myAccounts": {
"message": "Mina konton"
},
"needEtherInWallet": {
"message": "För att interagera med decentraliserade applikationer med MetaMask behöver du Ether i din plånbok."
},
"needImportFile": {
"message": "Du måste välja en fil att importera.",
"description": "User is important an account and needs to add a file to continue"
@ -581,9 +572,6 @@
"networkName": {
"message": "Nätverksnamn"
},
"networkSettingsDescription": {
"message": "Lägg till och redigera RPC-nätverk"
},
"networks": {
"message": "Nätverk"
},
@ -818,9 +806,6 @@
"securityAndPrivacy": {
"message": "Säkerhet och integritet"
},
"securitySettingsDescription": {
"message": "Sekretessinställningar och plånbokens seedfras"
},
"seedPhrasePlaceholder": {
"message": "Separera varje ord med ett enda mellanslag."
},
@ -854,9 +839,6 @@
"sendTokens": {
"message": "Skicka tokens"
},
"separateEachWord": {
"message": "Lägg in ett mellanslag mellan varje ord"
},
"settings": {
"message": "Inställningar"
},

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Kataa"
},
"QRHardwareWalletImporterTitle": {
"message": "Kagua Msimbo wa QR"
},
"about": {
"message": "Kuhusu"
},
"aboutSettingsDescription": {
"message": "Toleo, kituo cha msaada, na taarifa za mawasiliano"
},
"acceleratingATransaction": {
"message": "*Kuwezesha muamala kwa kutumia bei ya juu ya gesi huongeza uwezekano wake wa kushughulikiwa na mtandao haraka, lakini hauhakikishiwi siku zote."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Machaguo ya Juu"
},
"advancedSettingsDescription": {
"message": "Vipengele vya idhini ya msanidi, Kumbukumbu za Hali ya kupakua, Kufuta Akaunti, mitando ya majaribio ya kuweka mipangilio na RPC maalumu"
},
"amount": {
"message": "Kiasi"
},
@ -250,6 +250,9 @@
"currentLanguage": {
"message": "Lugha ya Sasa"
},
"custom": {
"message": "Mipangilio ya kina"
},
"customGas": {
"message": "Weka Mipangilio ya Gesi Upendavyo"
},
@ -277,18 +280,9 @@
"deleteNetworkDescription": {
"message": "Una uhakika unataka kufuta mtandao huu?"
},
"depositEther": {
"message": "Weka Ether"
},
"details": {
"message": "Maelezo"
},
"directDepositEther": {
"message": "Weka Ether Moja kwa Moja"
},
"directDepositEtherExplainer": {
"message": "Ikiwa tayari una sarafu kadhaa za Ether, njia rahisi ya kupata Ether kwenye waleti yako mpya kupitia kuweka moja kwa moja."
},
"done": {
"message": "Imekamilika"
},
@ -410,9 +404,6 @@
"general": {
"message": "Jumla"
},
"generalSettingsDescription": {
"message": "Ubadilishaji wa fedha, sarafu ya msingi, lugha, blockies identicon"
},
"getEther": {
"message": "Pata Ether"
},
@ -517,6 +508,9 @@
"learnMore": {
"message": "Jifunze zaidi"
},
"learnMoreUpperCase": {
"message": "Jifunze zaidi"
},
"ledgerAccountRestriction": {
"message": "Unapaswa kutumia akaunti yako ya mwisho kabla hujaongeza mpya."
},
@ -562,9 +556,6 @@
"myAccounts": {
"message": "Akaunti zangu"
},
"needEtherInWallet": {
"message": "Ili kuingiliana na programu zilizosambazwa kwa kutumia MetaMask, utahitaji kuwa na Ether kwenye waleti yako."
},
"needImportFile": {
"message": "Unapaswa kuchagua faili la kuhamisha.",
"description": "User is important an account and needs to add a file to continue"
@ -575,9 +566,6 @@
"networkName": {
"message": "Jina la mtandao"
},
"networkSettingsDescription": {
"message": "Ongeza na hariri mitandao maalumu ya RPC"
},
"networks": {
"message": "Mitandao"
},
@ -812,9 +800,6 @@
"securityAndPrivacy": {
"message": "Ulinzi na Faragha"
},
"securitySettingsDescription": {
"message": "Mipangilio ya Faragha na kirai kianzio cha waleti"
},
"seedPhrasePlaceholder": {
"message": "Tenganisha kila neno kwa nafasi moja"
},
@ -848,9 +833,6 @@
"sendTokens": {
"message": "Tuma Vianzio"
},
"separateEachWord": {
"message": "Tenganisha kila neno kwa nafasi moja"
},
"settings": {
"message": "Mipangilio"
},

View File

@ -1,4 +1,7 @@
{
"QRHardwareSignRequestCancel": {
"message": "நிராகரி"
},
"about": {
"message": "அறிமுகம்"
},
@ -108,6 +111,9 @@
"createAccount": {
"message": "உங்கள் கணக்கை துவங்குங்கள்"
},
"custom": {
"message": "மேம்பட்டவை"
},
"customGas": {
"message": "எரிவாயுவைத் தனிப்பயனாக்குங்கள்"
},
@ -123,18 +129,9 @@
"delete": {
"message": "நீக்கு"
},
"depositEther": {
"message": "வைப்புத்தொகை எதிர் "
},
"details": {
"message": "விவரங்கள்"
},
"directDepositEther": {
"message": "நேரடியாக வைப்புத்தொகை"
},
"directDepositEtherExplainer": {
"message": "நீங்கள் ஏற்கனவே ஏதெர் இருந்தால், நேரடி வைப்பு மூலம் உங்கள் புதிய பணப்பையில் ஈத்தர் பெற விரைவான வழி."
},
"done": {
"message": "முடிந்தது"
},
@ -250,6 +247,9 @@
"learnMore": {
"message": "மேலும் அறிக"
},
"learnMoreUpperCase": {
"message": "மேலும் அறிக"
},
"likeToImportTokens": {
"message": "இந்த டோக்கன்களைச் சேர்க்க விரும்புகிறீர்களா?"
},
@ -286,9 +286,6 @@
"myAccounts": {
"message": "எனது கணக்குகள்"
},
"needEtherInWallet": {
"message": "மேடமஸ்க் ஐ பயன்படுத்தி பரவலாக்கப்பட்ட பயன்பாடுகளுடன் தொடர்பு கொள்ள, உங்கள் பணப்பரிமாற்றத்தில் ஈதர் தேவை."
},
"needImportFile": {
"message": "இறக்குமதி செய்ய ஒரு கோப்பை நீங்கள் தேர்ந்தெடுக்க வேண்டும்.",
"description": "User is important an account and needs to add a file to continue"

View File

@ -1,4 +1,7 @@
{
"QRHardwareSignRequestCancel": {
"message": "తిరస్కరించు"
},
"about": {
"message": "గురించి"
},
@ -44,6 +47,9 @@
"create": {
"message": "సృష్టించు"
},
"custom": {
"message": "ఆధునిక"
},
"delete": {
"message": "తొలగించు"
},

View File

@ -1,4 +1,7 @@
{
"QRHardwareSignRequestCancel": {
"message": "ปฏิเสธ"
},
"about": {
"message": "เกี่ยวกับ"
},
@ -129,18 +132,9 @@
"deleteNetwork": {
"message": "ลบเครือข่าย?"
},
"depositEther": {
"message": "การฝากอีเธอร์"
},
"details": {
"message": "รายละเอียด"
},
"directDepositEther": {
"message": "ฝากอีเธอร์โดยตรง"
},
"directDepositEtherExplainer": {
"message": "ถ้าคุณมีอีเธอร์อยู่แล้ววิธีการที่เร็วที่สุดในการเอาเงินเข้ากระเป๋าใหม่ก็คือการโอนตรงๆ"
},
"done": {
"message": "เสร็จสิ้น"
},
@ -268,6 +262,9 @@
"learnMore": {
"message": "เรียนรู้เพิ่มเติม"
},
"learnMoreUpperCase": {
"message": "เรียนรู้เพิ่มเติม"
},
"likeToImportTokens": {
"message": "คุณต้องการเพิ่มโทเค็นเหล่านี้หรือไม่?"
},
@ -295,9 +292,6 @@
"myAccounts": {
"message": "บัญชีของฉัน"
},
"needEtherInWallet": {
"message": "คุณจะต้องมีอีเธอร์ในกระเป๋าเงินของคุณในการใช้งานกับแอพพลิเคชันแบบกระจายด้วย MetaMask"
},
"needImportFile": {
"message": "คุณต้องเลือกไฟล์ที่จะนำเข้า",
"description": "User is important an account and needs to add a file to continue"
@ -305,9 +299,6 @@
"negativeETH": {
"message": "ไม่สามารถส่งอีเธอร์เป็นจำนวนติดลบได้"
},
"networkSettingsDescription": {
"message": "เพิ่มและแก้ไขเครือข่าย RPC แบบกำหนดเอง"
},
"networks": {
"message": "เครือข่าย"
},

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,13 @@
{
"QRHardwareSignRequestCancel": {
"message": "Відхилити"
},
"QRHardwareWalletImporterTitle": {
"message": "Сканувати QR-код"
},
"about": {
"message": "Про Google Chrome"
},
"aboutSettingsDescription": {
"message": "Версія, центр підтримки та контактна інформація"
},
"acceleratingATransaction": {
"message": "* Прискорення транзакції за допомогою вищих цін на газ підвищує її шанси бути обробленою мережею швидше, але це не завжди гарантовано."
},
@ -56,9 +59,6 @@
"advancedOptions": {
"message": "Додаткові параметри"
},
"advancedSettingsDescription": {
"message": "Отримайте доступ до функцій розробника, завантажте Логи станів, перезапустіть обліковий запис, налаштуйте тестові сітки та персоніфіковані RPC"
},
"amount": {
"message": "Кількість"
},
@ -256,6 +256,9 @@
"currentLanguage": {
"message": "Поточна мова"
},
"custom": {
"message": "Розширені"
},
"customGas": {
"message": "Налаштувати пальне"
},
@ -283,18 +286,9 @@
"deleteNetworkDescription": {
"message": "Ви впевнені, що хочете видалити цю мережу?"
},
"depositEther": {
"message": "Депонувати Ether"
},
"details": {
"message": "Деталі"
},
"directDepositEther": {
"message": "Внести безпосередньо Ефір"
},
"directDepositEtherExplainer": {
"message": "Якщо ви вже маєте ефір, пряме переведення найшвидший спосіб передати ефір у свій гаманець."
},
"done": {
"message": "Готово"
},
@ -420,9 +414,6 @@
"general": {
"message": "Загальні"
},
"generalSettingsDescription": {
"message": "Конверсія валют, первісна валюта, мова, ідентикон блокіз"
},
"getEther": {
"message": "Отримати Ефір"
},
@ -530,6 +521,9 @@
"learnMore": {
"message": "Дізнатись більше"
},
"learnMoreUpperCase": {
"message": "Дізнатись більше"
},
"ledgerAccountRestriction": {
"message": "Потрібно скористатися своїм останнім обліковим записом, перш ніж додавати новий."
},
@ -584,9 +578,6 @@
"myAccounts": {
"message": "Мої облікові записи"
},
"needEtherInWallet": {
"message": "Щоб взаємодіяти з децентралізованими застосунками використовуючи MetaMask, вам буде потрібен Ether у вашому гаманці."
},
"needImportFile": {
"message": "Потрібно вибрати файл для імпорту.",
"description": "User is important an account and needs to add a file to continue"
@ -597,9 +588,6 @@
"networkName": {
"message": "Ім’я мережі"
},
"networkSettingsDescription": {
"message": "Додавайте та редагуйте мережі RPC, що можна налаштовувати"
},
"networks": {
"message": "Мережі"
},
@ -834,9 +822,6 @@
"securityAndPrivacy": {
"message": "Безпека й конфіденційність"
},
"securitySettingsDescription": {
"message": "Налаштування приватності та початкова фраза гаманця"
},
"seedPhrasePlaceholder": {
"message": "Відділіть кожне слово одним пробілом"
},
@ -870,9 +855,6 @@
"sendTokens": {
"message": "Надіслати токени"
},
"separateEachWord": {
"message": "Відділіть кожне слово одним пробілом"
},
"settings": {
"message": "Налаштування"
},

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,9 +2,6 @@
"about": {
"message": "關於"
},
"aboutSettingsDescription": {
"message": "版本,支援中心,以及聯絡資訊。"
},
"acceleratingATransaction": {
"message": "* 提高交易費 Gas 價格將可加速處理時間,但不保證會有顯著效果"
},
@ -59,9 +56,6 @@
"advancedOptions": {
"message": "進階選項"
},
"advancedSettingsDescription": {
"message": "存取開發者功能,下載狀態日誌,重設帳號,設定測試網及自訂 PRC。"
},
"amount": {
"message": "數量"
},
@ -292,18 +286,9 @@
"deleteNetworkDescription": {
"message": "你確定要刪除網路嗎?"
},
"depositEther": {
"message": "存入以太幣"
},
"details": {
"message": "詳情"
},
"directDepositEther": {
"message": "直接存入以太幣"
},
"directDepositEtherExplainer": {
"message": "如果您已經擁有以太幣,直接存入功能是讓新錢包最快取得以太幣的方式。"
},
"done": {
"message": "完成"
},
@ -429,9 +414,6 @@
"general": {
"message": "一般"
},
"generalSettingsDescription": {
"message": "貨幣轉換,主要貨幣,語言,區塊鏈哈希頭像"
},
"getEther": {
"message": "取得以太幣"
},
@ -590,9 +572,6 @@
"myAccounts": {
"message": "我的帳戶"
},
"needEtherInWallet": {
"message": "要使用 MetaMask 存取去中心化應用服務時,您的錢包中需要有以太幣。"
},
"needImportFile": {
"message": "您必須選擇一個檔案來匯入",
"description": "User is important an account and needs to add a file to continue"
@ -603,9 +582,6 @@
"networkName": {
"message": "網路名稱"
},
"networkSettingsDescription": {
"message": "新增並編輯自訂 RPC 網路"
},
"networks": {
"message": "網路"
},
@ -828,9 +804,6 @@
"securityAndPrivacy": {
"message": "安全&隱私"
},
"securitySettingsDescription": {
"message": "隱私設定及錢包助記詞"
},
"seedPhrasePlaceholder": {
"message": "單詞之間請用空白分隔"
},
@ -861,9 +834,6 @@
"sendTokens": {
"message": "發送代幣"
},
"separateEachWord": {
"message": "單詞之間請以空白間隔"
},
"settings": {
"message": "設定"
},

View File

@ -0,0 +1,4 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.28348 10.8571V12H0.140625V10.8571H3.28348ZM6.42634 9.71429C6.5811 9.71429 6.71503 9.77083 6.82813 9.88393C6.94122 9.99702 6.99777 10.131 6.99777 10.2857V12.5714C6.99777 12.7262 6.94122 12.8601 6.82813 12.9732C6.71503 13.0863 6.5811 13.1429 6.42634 13.1429H4.14062C3.98586 13.1429 3.85193 13.0863 3.73884 12.9732C3.62574 12.8601 3.5692 12.7262 3.5692 12.5714V10.2857C3.5692 10.131 3.62574 9.99702 3.73884 9.88393C3.85193 9.77083 3.98586 9.71429 4.14062 9.71429H6.42634ZM7.85491 6.28571V7.42857H0.140625V6.28571H7.85491ZM2.14062 1.71428V2.85714H0.140625V1.71428H2.14062ZM13.8549 10.8571V12H7.28348V10.8571H13.8549ZM5.28348 0.571428C5.43824 0.571428 5.57217 0.627976 5.68527 0.741071C5.79836 0.854166 5.85491 0.988095 5.85491 1.14286V3.42857C5.85491 3.58333 5.79836 3.71726 5.68527 3.83036C5.57217 3.94345 5.43824 4 5.28348 4H2.99777C2.84301 4 2.70908 3.94345 2.59598 3.83036C2.48289 3.71726 2.42634 3.58333 2.42634 3.42857V1.14286C2.42634 0.988095 2.48289 0.854166 2.59598 0.741071C2.70908 0.627976 2.84301 0.571428 2.99777 0.571428H5.28348ZM10.9978 5.14286C11.1525 5.14286 11.2865 5.1994 11.3996 5.3125C11.5126 5.42559 11.5692 5.55952 11.5692 5.71429V8C11.5692 8.15476 11.5126 8.28869 11.3996 8.40179C11.2865 8.51488 11.1525 8.57143 10.9978 8.57143H8.71205C8.55729 8.57143 8.42336 8.51488 8.31027 8.40179C8.19717 8.28869 8.14062 8.15476 8.14062 8V5.71429C8.14062 5.55952 8.19717 5.42559 8.31027 5.3125C8.42336 5.1994 8.55729 5.14286 8.71205 5.14286H10.9978ZM13.8549 6.28571V7.42857H11.8549V6.28571H13.8549ZM13.8549 1.71428V2.85714H6.14063V1.71428H13.8549Z" fill="#24292E"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,4 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 15.5714C8.09524 15.5714 8.14286 15.5238 8.14286 15.4286C8.14286 15.3333 8.09524 15.2857 8 15.2857C7.64881 15.2857 7.34524 15.1577 7.08929 14.9018C6.83929 14.6518 6.71429 14.3512 6.71429 14C6.71429 13.9048 6.66667 13.8571 6.57143 13.8571C6.47619 13.8571 6.42857 13.9048 6.42857 14C6.42857 14.4345 6.58036 14.8036 6.88393 15.1071C7.19345 15.4167 7.56548 15.5714 8 15.5714ZM15.4286 12.8571C15.4286 13.1667 15.3155 13.4345 15.0893 13.6607C14.8631 13.8869 14.5952 14 14.2857 14H10.2857C10.2857 14.631 10.0625 15.1696 9.61607 15.6161C9.16964 16.0625 8.63095 16.2857 8 16.2857C7.36905 16.2857 6.83036 16.0625 6.38393 15.6161C5.9375 15.1696 5.71429 14.631 5.71429 14H1.71429C1.40476 14 1.1369 13.8869 0.910714 13.6607C0.684524 13.4345 0.571429 13.1667 0.571429 12.8571C0.869048 12.6071 1.13988 12.3452 1.38393 12.0714C1.62798 11.7976 1.88095 11.4435 2.14286 11.0089C2.40476 10.5685 2.625 10.0952 2.80357 9.58929C2.9881 9.08333 3.1369 8.47024 3.25 7.75C3.36905 7.02976 3.42857 6.25595 3.42857 5.42857C3.42857 4.52381 3.77679 3.68452 4.47321 2.91071C5.16964 2.13095 6.08333 1.65774 7.21429 1.49107C7.16667 1.37798 7.14286 1.2619 7.14286 1.14286C7.14286 0.904762 7.22619 0.702381 7.39286 0.535714C7.55952 0.369047 7.76191 0.285713 8 0.285713C8.2381 0.285713 8.44048 0.369047 8.60714 0.535714C8.77381 0.702381 8.85714 0.904762 8.85714 1.14286C8.85714 1.2619 8.83333 1.37798 8.78572 1.49107C9.91667 1.65774 10.8304 2.13095 11.5268 2.91071C12.2232 3.68452 12.5714 4.52381 12.5714 5.42857C12.5714 6.25595 12.628 7.02976 12.7411 7.75C12.8601 8.47024 13.0089 9.08333 13.1875 9.58929C13.372 10.0952 13.5952 10.5685 13.8571 11.0089C14.119 11.4435 14.372 11.7976 14.6161 12.0714C14.8601 12.3452 15.131 12.6071 15.4286 12.8571Z" fill="#24292E"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,4 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.2935 11.3393C11.2935 11 11.2757 10.6815 11.24 10.3839C11.2102 10.0863 11.1477 9.78869 11.0525 9.49107C10.9632 9.1875 10.8471 8.93155 10.7042 8.72321C10.5614 8.50893 10.3709 8.33631 10.1328 8.20536C9.89472 8.06845 9.62388 8 9.32031 8C9.2846 8.02381 9.18341 8.08631 9.01674 8.1875C8.85603 8.28274 8.73103 8.35417 8.64174 8.40179C8.55246 8.4494 8.43043 8.50893 8.27567 8.58036C8.12686 8.65179 7.98103 8.70238 7.83817 8.73214C7.70127 8.7619 7.56436 8.77679 7.42746 8.77679C7.29055 8.77679 7.15067 8.7619 7.00781 8.73214C6.87091 8.70238 6.72507 8.65179 6.57031 8.58036C6.4215 8.50893 6.30246 8.4494 6.21317 8.40179C6.12388 8.35417 5.99591 8.28274 5.82924 8.1875C5.66853 8.08631 5.57031 8.02381 5.5346 8C5.23103 8 4.96019 8.06845 4.7221 8.20536C4.484 8.33631 4.29353 8.50893 4.15067 8.72321C4.00781 8.93155 3.88876 9.1875 3.79353 9.49107C3.70424 9.78869 3.64174 10.0863 3.60603 10.3839C3.57626 10.6815 3.56138 11 3.56138 11.3393C3.56138 11.7738 3.68638 12.1369 3.93638 12.4286C4.18638 12.7143 4.49293 12.8571 4.85603 12.8571H9.99888C10.362 12.8571 10.6685 12.7143 10.9185 12.4286C11.1685 12.1369 11.2935 11.7738 11.2935 11.3393ZM9.74888 6.03571C9.74888 5.39286 9.51972 4.84524 9.06138 4.39286C8.609 3.94048 8.06436 3.71428 7.42746 3.71428C6.79055 3.71428 6.24293 3.94048 5.7846 4.39286C5.33222 4.84524 5.10603 5.39286 5.10603 6.03571C5.10603 6.67262 5.33222 7.21726 5.7846 7.66964C6.24293 8.12202 6.79055 8.34821 7.42746 8.34821C8.06436 8.34821 8.609 8.12202 9.06138 7.66964C9.51972 7.21726 9.74888 6.67262 9.74888 6.03571ZM15.4275 10.8571V12.5714C15.4275 12.6548 15.4007 12.7232 15.3471 12.7768C15.2935 12.8304 15.2251 12.8571 15.1417 12.8571H14.2846V14.8571C14.2846 15.25 14.1447 15.5863 13.865 15.8661C13.5852 16.1458 13.2489 16.2857 12.856 16.2857H1.99888C1.60603 16.2857 1.26972 16.1458 0.989955 15.8661C0.710193 15.5863 0.570312 15.25 0.570312 14.8571V1.71428C0.570312 1.32143 0.710193 0.985118 0.989955 0.705357C1.26972 0.425594 1.60603 0.285713 1.99888 0.285713H12.856C13.2489 0.285713 13.5852 0.425594 13.865 0.705357C14.1447 0.985118 14.2846 1.32143 14.2846 1.71428V3.71428H15.1417C15.2251 3.71428 15.2935 3.74107 15.3471 3.79464C15.4007 3.84821 15.4275 3.91667 15.4275 4V5.71428C15.4275 5.79762 15.4007 5.86607 15.3471 5.91964C15.2935 5.97321 15.2251 6 15.1417 6H14.2846V7.14286H15.1417C15.2251 7.14286 15.2935 7.16964 15.3471 7.22321C15.4007 7.27679 15.4275 7.34524 15.4275 7.42857V9.14286C15.4275 9.22619 15.4007 9.29464 15.3471 9.34821C15.2935 9.40179 15.2251 9.42857 15.1417 9.42857H14.2846V10.5714H15.1417C15.2251 10.5714 15.2935 10.5982 15.3471 10.6518C15.4007 10.7054 15.4275 10.7738 15.4275 10.8571Z" fill="#24292E"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -1 +1 @@
<svg width="136" height="31" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M91.201 8.705h1.03l2.39 5.65 2.4-5.65h1.01l-3.02 7.1h-.78l-3.03-7.1Zm9.327 7.2a2.73 2.73 0 0 1-1.06-.2 2.431 2.431 0 0 1-1.35-1.37 2.91 2.91 0 0 1-.18-1.03c0-.367.063-.707.19-1.02.126-.32.303-.597.53-.83.233-.234.51-.417.83-.55.32-.134.67-.2 1.05-.2.326 0 .633.056.92.17.286.106.536.27.75.49.22.213.393.476.52.79.126.306.19.66.19 1.06v.13c0 .033-.004.076-.01.13h-4.1c.006.233.053.45.14.65.093.2.213.373.36.52.153.146.333.263.54.35.213.08.443.12.69.12.386 0 .703-.077.95-.23a1.82 1.82 0 0 0 .61-.64l.68.47a2.48 2.48 0 0 1-.91.87c-.374.213-.82.32-1.34.32Zm1.51-3.13a1.601 1.601 0 0 0-.19-.55c-.087-.16-.2-.297-.34-.41a1.431 1.431 0 0 0-.46-.26 1.645 1.645 0 0 0-.54-.09 1.73 1.73 0 0 0-1.04.35 1.5 1.5 0 0 0-.38.41c-.107.16-.18.343-.22.55h3.17Zm2.1-1.97h.86v.97c.047-.16.12-.304.22-.43a1.556 1.556 0 0 1 .74-.52c.147-.047.294-.07.44-.07.134 0 .264.013.39.04v.89a.78.78 0 0 0-.23-.06 1.342 1.342 0 0 0-.24-.02c-.16 0-.32.036-.48.11-.153.066-.293.17-.42.31-.12.14-.22.32-.3.54-.08.213-.12.466-.12.76v2.48h-.86v-5Zm4.032 7.09 1.09-2.35-2.19-4.74h.95l1.72 3.8 1.71-3.8h.96l-3.28 7.09h-.96Zm7.287-2.09v-7.5h.86v3.27c.173-.3.4-.52.68-.66s.583-.21.91-.21c.28 0 .536.046.77.14.233.093.43.23.59.41.166.173.296.386.39.64.093.246.14.523.14.83v3.08h-.85v-2.95c0-.42-.11-.75-.33-.99-.214-.247-.497-.37-.85-.37-.2 0-.39.04-.57.12-.174.08-.327.2-.46.36-.127.153-.23.343-.31.57-.074.226-.11.486-.11.78v2.48h-.86Zm6.328-6.34a.599.599 0 0 1-.62-.61c0-.167.06-.31.18-.43s.267-.18.44-.18a.602.602 0 0 1 .6.61c0 .173-.056.32-.17.44a.581.581 0 0 1-.43.17Zm-.44 1.34h.86v5h-.86v-5Zm4.671 4.19c.246 0 .473-.044.68-.13.213-.087.393-.207.54-.36.146-.16.26-.347.34-.56.086-.214.13-.447.13-.7 0-.247-.044-.477-.13-.69a1.588 1.588 0 0 0-.34-.56 1.542 1.542 0 0 0-.54-.36 1.637 1.637 0 0 0-.68-.14c-.254 0-.484.046-.69.14a1.548 1.548 0 0 0-.53.36c-.147.153-.264.34-.35.56-.08.213-.12.443-.12.69 0 .253.04.486.12.7.086.213.203.4.35.56.146.153.323.273.53.36.206.086.436.13.69.13Zm-.05 3c-.54 0-1.014-.1-1.42-.3-.407-.2-.717-.44-.93-.72l.6-.6c.2.253.443.456.73.61.293.153.633.23 1.02.23.213 0 .42-.034.62-.1.2-.067.376-.174.53-.32.16-.14.286-.32.38-.54.093-.214.14-.47.14-.77v-.57a2.032 2.032 0 0 1-.72.63c-.307.166-.647.25-1.02.25-.347 0-.67-.064-.97-.19-.3-.134-.56-.314-.78-.54a2.623 2.623 0 0 1-.52-.81 2.8 2.8 0 0 1-.18-1.01c0-.354.06-.684.18-.99.126-.314.3-.584.52-.81.22-.234.48-.414.78-.54.3-.134.623-.2.97-.2.373 0 .713.083 1.02.25.306.16.546.366.72.62v-.77h.86v4.71c0 .42-.067.783-.2 1.09-.127.313-.304.57-.53.77-.227.206-.494.36-.8.46-.307.106-.64.16-1 .16Zm4.149-2.19v-7.5h.86v3.27c.173-.3.4-.52.68-.66s.583-.21.91-.21c.28 0 .537.046.77.14.233.093.43.23.59.41.167.173.297.386.39.64.093.246.14.523.14.83v3.08h-.85v-2.95c0-.42-.11-.75-.33-.99-.213-.247-.497-.37-.85-.37-.2 0-.39.04-.57.12-.173.08-.327.2-.46.36-.127.153-.23.343-.31.57-.073.226-.11.486-.11.78v2.48h-.86Z" fill="#F66A0A"/><path opacity=".3" d="M19.506 22.805c-10.763 7.42-19.416 8-19.416 8h110.25s-8.653-.58-19.417-8c-10.763-7.42-23.363-22-35.708-22-12.345 0-24.945 14.58-35.709 22Z" fill="#037DD6"/><mask id="a" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="111" height="31"><path d="M19.506 22.672c-10.763 7.42-19.416 8-19.416 8h110.25s-8.653-.58-19.417-8c-10.763-7.42-23.363-22-35.708-22-12.345 0-24.945 14.58-35.709 22Z" fill="#EAF6FF"/></mask><g mask="url(#a)"><path fill="#F66A0A" stroke="#fff" stroke-width="2" d="M91.986-5.143h20.706v39.25H91.986z"/></g></svg>
<svg width="162" height="32" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path fill="#fff" d="M.813.082h161v31h-161z"/><path d="M117.469 8.638h1.03l2.39 5.65 2.4-5.65h1.01l-3.02 7.1h-.78l-3.03-7.1ZM126.795 15.838c-.386 0-.74-.067-1.06-.2a2.436 2.436 0 0 1-1.35-1.37 2.91 2.91 0 0 1-.18-1.03c0-.367.064-.707.19-1.02.127-.32.304-.597.53-.83.234-.233.51-.417.83-.55.32-.133.67-.2 1.05-.2.327 0 .634.057.92.17.287.107.537.27.75.49.22.213.394.477.52.79.127.307.19.66.19 1.06v.13c0 .033-.003.077-.01.13h-4.1c.007.233.054.45.14.65.094.2.214.373.36.52.154.147.334.263.54.35.214.08.444.12.69.12.387 0 .704-.077.95-.23.254-.16.457-.373.61-.64l.68.47c-.226.367-.53.657-.91.87-.373.213-.82.32-1.34.32Zm1.51-3.13a1.56 1.56 0 0 0-.19-.55c-.086-.16-.2-.297-.34-.41a1.408 1.408 0 0 0-.46-.26 1.636 1.636 0 0 0-.54-.09 1.732 1.732 0 0 0-1.04.35 1.512 1.512 0 0 0-.38.41c-.106.16-.18.343-.22.55h3.17ZM130.406 10.738h.86v.97c.046-.16.12-.303.22-.43s.213-.233.34-.32a1.59 1.59 0 0 1 .4-.2c.146-.047.293-.07.44-.07.133 0 .263.013.39.04v.89a.782.782 0 0 0-.23-.06 1.348 1.348 0 0 0-.24-.02c-.16 0-.32.037-.48.11-.154.067-.294.17-.42.31-.12.14-.22.32-.3.54-.08.213-.12.467-.12.76v2.48h-.86v-5ZM134.438 17.828l1.09-2.35-2.19-4.74h.95l1.72 3.8 1.71-3.8h.96l-3.28 7.09h-.96ZM141.724 15.738v-7.5h.86v3.27c.173-.3.4-.52.68-.66s.583-.21.91-.21c.28 0 .537.047.77.14.233.093.43.23.59.41.167.173.297.387.39.64.093.247.14.523.14.83v3.08h-.85v-2.95c0-.42-.11-.75-.33-.99-.213-.247-.497-.37-.85-.37-.2 0-.39.04-.57.12-.173.08-.327.2-.46.36-.127.153-.23.343-.31.57-.073.227-.11.487-.11.78v2.48h-.86ZM148.053 9.398a.599.599 0 0 1-.62-.61c0-.167.06-.31.18-.43s.266-.18.44-.18c.173 0 .316.06.43.18.113.12.17.263.17.43 0 .173-.057.32-.17.44a.584.584 0 0 1-.43.17Zm-.44 1.34h.86v5h-.86v-5ZM152.283 14.928c.247 0 .473-.043.68-.13.213-.087.393-.207.54-.36a1.7 1.7 0 0 0 .34-.56c.087-.213.13-.447.13-.7a1.81 1.81 0 0 0-.13-.69 1.573 1.573 0 0 0-.34-.56 1.54 1.54 0 0 0-.54-.36 1.632 1.632 0 0 0-.68-.14c-.253 0-.483.047-.69.14a1.554 1.554 0 0 0-.53.36 1.7 1.7 0 0 0-.35.56c-.08.213-.12.443-.12.69 0 .253.04.487.12.7.087.213.203.4.35.56.147.153.323.273.53.36.207.087.437.13.69.13Zm-.05 3c-.54 0-1.013-.1-1.42-.3-.407-.2-.717-.44-.93-.72l.6-.6c.2.253.443.457.73.61.293.153.633.23 1.02.23.213 0 .42-.033.62-.1s.377-.173.53-.32c.16-.14.287-.32.38-.54.093-.213.14-.47.14-.77v-.57a2.015 2.015 0 0 1-.72.63c-.307.167-.647.25-1.02.25-.347 0-.67-.063-.97-.19-.3-.133-.56-.313-.78-.54a2.643 2.643 0 0 1-.52-.81 2.8 2.8 0 0 1-.18-1.01c0-.353.06-.683.18-.99.127-.313.3-.583.52-.81.22-.233.48-.413.78-.54.3-.133.623-.2.97-.2.373 0 .713.083 1.02.25.307.16.547.367.72.62v-.77h.86v4.71c0 .42-.067.783-.2 1.09-.127.313-.303.57-.53.77a2.17 2.17 0 0 1-.8.46c-.307.107-.64.16-1 .16ZM156.382 15.738v-7.5h.86v3.27c.174-.3.4-.52.68-.66s.584-.21.91-.21c.28 0 .537.047.77.14.234.093.43.23.59.41.167.173.297.387.39.64.094.247.14.523.14.83v3.08h-.85v-2.95c0-.42-.11-.75-.33-.99-.213-.247-.496-.37-.85-.37-.2 0-.39.04-.57.12-.173.08-.326.2-.46.36-.126.153-.23.343-.31.57-.073.227-.11.487-.11.78v2.48h-.86Z" fill="#F66A0A"/><path opacity=".3" d="M45.774 22.738c-10.764 7.42-19.417 8-19.417 8h110.251s-8.653-.58-19.417-8c-10.764-7.42-23.364-22-35.709-22-12.344 0-24.944 14.58-35.708 22Z" fill="#037DD6"/><mask id="b" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="26" y="0" width="111" height="31"><path d="M45.774 22.605c-10.764 7.42-19.417 8-19.417 8h110.251s-8.653-.58-19.417-8c-10.764-7.42-23.364-22-35.709-22-12.344 0-24.944 14.58-35.708 22Z" fill="#EAF6FF"/></mask><g mask="url(#b)"><path fill="#F66A0A" stroke="#fff" stroke-width="2" d="M118.254-5.209h20.706v39.25h-20.706z"/></g></g><defs><clipPath id="a"><path fill="#fff" transform="translate(.813 .082)" d="M0 0h161v31H0z"/></clipPath></defs></svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -1 +1 @@
<svg width="125" height="31" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M14.233 8.738h.93v6.22h3.43v.88h-4.36v-7.1Zm7.412 7.2c-.38 0-.73-.067-1.05-.2a2.679 2.679 0 0 1-.83-.56 2.569 2.569 0 0 1-.55-.82c-.126-.32-.19-.66-.19-1.02s.064-.697.19-1.01a2.54 2.54 0 0 1 .55-.83c.234-.233.51-.417.83-.55.32-.14.67-.21 1.05-.21.374 0 .72.07 1.04.21.32.133.597.317.83.55.234.233.414.51.54.83.134.313.2.65.2 1.01s-.066.7-.2 1.02a2.44 2.44 0 0 1-.54.82 2.68 2.68 0 0 1-.83.56c-.32.133-.666.2-1.04.2Zm0-.8c.26 0 .497-.047.71-.14.214-.093.394-.22.54-.38.154-.167.27-.357.35-.57.087-.22.13-.457.13-.71 0-.247-.043-.48-.13-.7-.08-.22-.196-.41-.35-.57a1.52 1.52 0 0 0-.54-.39 1.754 1.754 0 0 0-.71-.14c-.26 0-.496.047-.71.14a1.619 1.619 0 0 0-.55.39c-.153.16-.273.35-.36.57-.08.22-.12.453-.12.7 0 .253.04.49.12.71.087.213.207.403.36.57.154.16.337.287.55.38.214.093.45.14.71.14Zm6.825-2.89-1.23 3.59h-.76l-1.7-5h.9l1.21 3.65 1.25-3.65h.66l1.25 3.65 1.21-3.65h.91l-1.7 5h-.76l-1.24-3.59Z" fill="#F66A0A"/><path opacity=".3" d="M33.96 22.838c-10.764 7.42-19.417 8-19.417 8h110.25s-8.653-.58-19.416-8c-10.764-7.42-23.364-22-35.709-22-12.345 0-24.945 14.58-35.709 22Z" fill="#037DD6"/><mask id="a" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="14" y="0" width="111" height="31"><path d="M33.96 22.705c-10.764 7.42-19.417 8-19.417 8h110.25s-8.653-.58-19.416-8c-10.764-7.42-23.364-22-35.709-22-12.345 0-24.945 14.58-35.709 22Z" fill="#EAF6FF"/></mask><g mask="url(#a)"><path fill="#F66A0A" stroke="#fff" stroke-width="2" d="M12.793 16.838h20.706v17.303H12.793z"/></g></svg>
<svg width="162" height="32" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path fill="#fff" d="M.813.082h161v31h-161z"/><path d="M26.047 8.638h.93v6.22h3.43v.88h-4.36v-7.1ZM33.46 15.838c-.38 0-.73-.067-1.05-.2a2.573 2.573 0 0 1-1.38-1.38c-.127-.32-.19-.66-.19-1.02s.063-.697.19-1.01c.133-.32.316-.597.55-.83.233-.233.51-.417.83-.55.32-.14.67-.21 1.05-.21.373 0 .72.07 1.04.21.32.133.596.317.83.55.233.233.413.51.54.83.133.313.2.65.2 1.01s-.068.7-.2 1.02a2.438 2.438 0 0 1-.54.82c-.234.233-.51.42-.83.56-.32.133-.667.2-1.04.2Zm0-.8c.26 0 .496-.047.71-.14.212-.093.392-.22.54-.38.152-.167.27-.357.35-.57.086-.22.13-.457.13-.71 0-.247-.044-.48-.13-.7-.08-.22-.198-.41-.35-.57a1.518 1.518 0 0 0-.54-.39 1.752 1.752 0 0 0-.71-.14c-.26 0-.498.047-.71.14a1.62 1.62 0 0 0-.55.39 1.73 1.73 0 0 0-.36.57c-.08.22-.12.453-.12.7 0 .253.04.49.12.71.086.213.206.403.36.57.152.16.336.287.55.38.212.093.45.14.71.14ZM40.284 12.148l-1.23 3.59h-.76l-1.7-5h.9l1.21 3.65 1.25-3.65h.66l1.25 3.65 1.21-3.65h.91l-1.7 5h-.76l-1.24-3.59Z" fill="#F66A0A"/><path opacity=".3" d="M45.774 22.738c-10.764 7.42-19.417 8-19.417 8h110.251s-8.653-.58-19.417-8c-10.764-7.42-23.364-22-35.709-22-12.344 0-24.944 14.58-35.708 22Z" fill="#037DD6"/><mask id="b" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="26" y="0" width="111" height="31"><path d="M45.774 22.605c-10.764 7.42-19.417 8-19.417 8h110.251s-8.653-.58-19.417-8c-10.764-7.42-23.364-22-35.709-22-12.344 0-24.944 14.58-35.708 22Z" fill="#EAF6FF"/></mask><g mask="url(#b)"><path fill="#F66A0A" stroke="#fff" stroke-width="2" d="M24.607 16.738h20.706v17.303H24.607z"/></g></g><defs><clipPath id="a"><path fill="#fff" transform="translate(.813 .082)" d="M0 0h161v31H0z"/></clipPath></defs></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1 +1 @@
<svg width="111" height="49" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m38 4.334 2.63 3.54 2.65-3.54h.84v7.1h-.92v-5.52l-2.56 3.44-2.56-3.44v5.52h-.93v-7.1H38Zm9.99 7.2a2.73 2.73 0 0 1-1.06-.2 2.431 2.431 0 0 1-1.35-1.37 2.91 2.91 0 0 1-.18-1.03c0-.367.063-.707.19-1.02.126-.32.303-.597.53-.83.233-.234.51-.417.83-.55.32-.134.67-.2 1.05-.2.326 0 .633.056.92.17.286.106.536.27.75.49.22.213.393.476.52.79.126.306.19.66.19 1.06v.13c0 .033-.004.076-.01.13h-4.1c.006.233.053.45.14.65.093.2.213.373.36.52.153.146.333.263.54.35.213.08.443.12.69.12.386 0 .703-.077.95-.23.253-.16.456-.374.61-.64l.68.47c-.227.366-.53.656-.91.87-.374.213-.82.32-1.34.32Zm1.51-3.13a1.579 1.579 0 0 0-.19-.55c-.087-.16-.2-.297-.34-.41a1.419 1.419 0 0 0-.46-.26 1.639 1.639 0 0 0-.54-.09 1.729 1.729 0 0 0-1.04.35 1.5 1.5 0 0 0-.38.41c-.107.16-.18.343-.22.55h3.17Zm4.16 3.13c-.353 0-.68-.067-.98-.2a2.57 2.57 0 0 1-.77-.56 2.73 2.73 0 0 1-.52-.83 2.8 2.8 0 0 1-.18-1.01c0-.36.06-.697.18-1.01.127-.314.3-.587.52-.82a2.359 2.359 0 0 1 1.75-.77c.38 0 .727.086 1.04.26.314.166.554.37.72.61v-3.27h.86v7.5h-.86v-.77a2.08 2.08 0 0 1-.72.62 2.18 2.18 0 0 1-1.04.25Zm.13-.79a1.607 1.607 0 0 0 1.22-.52c.154-.167.27-.36.35-.58.087-.22.13-.457.13-.71 0-.254-.043-.49-.13-.71-.08-.22-.196-.41-.35-.57a1.544 1.544 0 0 0-.53-.39 1.658 1.658 0 0 0-.69-.14c-.253 0-.486.046-.7.14a1.648 1.648 0 0 0-.54.39 1.82 1.82 0 0 0-.35.57c-.08.22-.12.456-.12.71 0 .253.04.49.12.71.087.22.204.413.35.58.154.16.334.286.54.38.214.093.447.14.7.14Zm4.55-5.65a.599.599 0 0 1-.62-.61c0-.167.06-.31.18-.43s.266-.18.44-.18c.172 0 .316.06.43.18.112.12.17.263.17.43 0 .173-.058.32-.17.44a.583.583 0 0 1-.43.17Zm-.44 1.34h.86v5h-.86v-5Zm4.26 5.1c-.274 0-.524-.047-.75-.14-.227-.1-.42-.237-.58-.41a1.917 1.917 0 0 1-.38-.63 2.617 2.617 0 0 1-.13-.85v-3.07h.86v2.94c0 .42.1.753.3 1 .206.246.483.37.83.37.193 0 .373-.04.54-.12.173-.087.32-.207.44-.36.126-.16.226-.354.3-.58.073-.227.11-.484.11-.77v-2.48h.86v5h-.86v-.77a1.654 1.654 0 0 1-.66.66c-.267.14-.56.21-.88.21Zm10.46-3.04c0-.407-.083-.737-.25-.99-.166-.254-.413-.38-.74-.38-.4 0-.726.156-.98.47-.246.313-.376.74-.39 1.28v2.56h-.86v-2.94c0-.407-.083-.737-.25-.99-.16-.254-.403-.38-.73-.38-.406 0-.74.163-1 .49-.253.326-.38.773-.38 1.34v2.48h-.86v-5h.86v.77a1.63 1.63 0 0 1 .61-.63c.26-.16.56-.24.9-.24.374 0 .69.096.95.29.267.186.464.446.59.78.134-.327.344-.587.63-.78.294-.194.63-.29 1.01-.29.274 0 .517.05.73.15.22.093.404.23.55.41.154.173.27.386.35.64.08.246.12.523.12.83v3.07h-.86v-2.94Z" fill="#037DD6"/><path opacity=".3" d="M19.506 40.566c-10.763 7.42-19.416 8-19.416 8h110.25s-8.653-.58-19.417-8c-10.763-7.42-23.363-22-35.708-22-12.345 0-24.945 14.58-35.709 22Z" fill="#037DD6"/><mask id="a" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="18" width="111" height="31"><path d="M19.506 40.434c-10.763 7.42-19.416 8-19.416 8h110.25s-8.653-.58-19.417-8c-10.763-7.42-23.363-22-35.708-22-12.345 0-24.945 14.58-35.709 22Z" fill="#EAF6FF"/></mask><g mask="url(#a)"><path fill="#037DD6" stroke="#fff" stroke-width="2" d="M36.047 12.619H73.39v39.25H36.047z"/></g></svg>
<svg width="162" height="47" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#fff" d="M.813.082h161v46h-161z"/><path d="m64.268 1.505 2.63 3.54 2.65-3.54h.84v7.1h-.92v-5.52l-2.56 3.44-2.56-3.44v5.52h-.93v-7.1h.85ZM74.257 8.705a2.73 2.73 0 0 1-1.06-.2 2.432 2.432 0 0 1-1.35-1.37 2.91 2.91 0 0 1-.18-1.03c0-.367.064-.707.19-1.02.127-.32.304-.596.53-.83.234-.233.51-.417.83-.55.32-.133.67-.2 1.05-.2.327 0 .634.057.92.17.287.107.537.27.75.49.22.213.394.477.52.79.127.307.19.66.19 1.06v.13c0 .034-.003.077-.01.13h-4.1c.007.233.054.45.14.65.094.2.214.373.36.52.154.147.334.263.54.35.214.08.444.12.69.12.387 0 .704-.077.95-.23.254-.16.457-.373.61-.64l.68.47c-.226.367-.53.657-.91.87-.373.213-.82.32-1.34.32Zm1.51-3.13a1.58 1.58 0 0 0-.19-.55c-.086-.16-.2-.296-.34-.41a1.42 1.42 0 0 0-.46-.26 1.639 1.639 0 0 0-.54-.09 1.728 1.728 0 0 0-1.04.35 1.498 1.498 0 0 0-.38.41 1.49 1.49 0 0 0-.22.55h3.17ZM79.928 8.705c-.353 0-.68-.066-.98-.2a2.57 2.57 0 0 1-.77-.56 2.732 2.732 0 0 1-.52-.83 2.8 2.8 0 0 1-.18-1.01c0-.36.06-.697.18-1.01.127-.313.3-.587.52-.82a2.36 2.36 0 0 1 1.75-.77c.38 0 .727.087 1.04.26.313.167.553.37.72.61v-3.27h.86v7.5h-.86v-.77c-.167.24-.407.447-.72.62a2.18 2.18 0 0 1-1.04.25Zm.13-.79a1.606 1.606 0 0 0 1.22-.52c.153-.167.27-.36.35-.58.087-.22.13-.457.13-.71 0-.253-.043-.49-.13-.71-.08-.22-.197-.41-.35-.57a1.542 1.542 0 0 0-.53-.39 1.657 1.657 0 0 0-.69-.14c-.253 0-.487.047-.7.14a1.65 1.65 0 0 0-.54.39c-.147.16-.263.35-.35.57-.08.22-.12.457-.12.71 0 .253.04.49.12.71.087.22.203.413.35.58.153.16.333.287.54.38.213.093.447.14.7.14ZM84.607 2.265a.599.599 0 0 1-.62-.61c0-.167.06-.31.18-.43s.266-.18.44-.18c.173 0 .317.06.43.18.113.12.17.263.17.43 0 .173-.057.32-.17.44a.583.583 0 0 1-.43.17Zm-.44 1.34h.86v5h-.86v-5ZM88.427 8.705c-.273 0-.523-.046-.75-.14-.227-.1-.42-.236-.58-.41a1.916 1.916 0 0 1-.38-.63 2.614 2.614 0 0 1-.13-.85v-3.07h.86v2.94c0 .42.1.753.3 1 .207.247.483.37.83.37.193 0 .373-.04.54-.12.173-.087.32-.207.44-.36.127-.16.227-.353.3-.58.073-.227.11-.483.11-.77v-2.48h.86v5h-.86v-.77a1.654 1.654 0 0 1-.66.66c-.267.14-.56.21-.88.21ZM98.888 5.665c0-.407-.083-.737-.25-.99-.166-.253-.413-.38-.74-.38-.4 0-.727.157-.98.47-.247.314-.377.74-.39 1.28v2.56h-.86v-2.94c0-.407-.083-.737-.25-.99-.16-.253-.403-.38-.73-.38-.407 0-.74.163-1 .49-.253.327-.38.774-.38 1.34v2.48h-.86v-5h.86v.77a1.63 1.63 0 0 1 .61-.63c.26-.16.56-.24.9-.24.374 0 .69.097.95.29.267.187.463.447.59.78.133-.327.343-.587.63-.78.293-.193.63-.29 1.01-.29.273 0 .517.05.73.15.22.094.404.23.55.41.153.173.27.387.35.64.08.247.12.524.12.83v3.07h-.86v-2.94Z" fill="#037DD6"/><path opacity=".3" d="M45.774 37.738c-10.764 7.42-19.417 8-19.417 8h110.251s-8.653-.58-19.417-8c-10.764-7.42-23.364-22-35.709-22-12.344 0-24.944 14.58-35.708 22Z" fill="#037DD6"/><mask id="a" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="26" y="15" width="111" height="31"><path d="M45.774 37.605c-10.764 7.42-19.417 8-19.417 8h110.251s-8.653-.58-19.417-8c-10.764-7.42-23.364-22-35.709-22-12.344 0-24.944 14.58-35.708 22Z" fill="#EAF6FF"/></mask><g mask="url(#a)"><path fill="#037DD6" stroke="#fff" stroke-width="2" d="M62.313 9.791h37.343v39.25H62.313z"/></g></svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,5 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14.2042 13.2143C14.5376 13.744 14.6001 14.1964 14.3917 14.5714C14.1894 14.9524 13.7727 15.1429 13.1417 15.1429H2.85603C2.22507 15.1429 1.80543 14.9524 1.5971 14.5714C1.39472 14.1964 1.46019 13.744 1.79353 13.2143L6.2846 6.13393V2.57143H5.71317C5.55841 2.57143 5.42448 2.51488 5.31138 2.40178C5.19829 2.28869 5.14174 2.15476 5.14174 2C5.14174 1.84524 5.19829 1.71131 5.31138 1.59821C5.42448 1.48512 5.55841 1.42857 5.71317 1.42857H10.2846C10.4394 1.42857 10.5733 1.48512 10.6864 1.59821C10.7995 1.71131 10.856 1.84524 10.856 2C10.856 2.15476 10.7995 2.28869 10.6864 2.40178C10.5733 2.51488 10.4394 2.57143 10.2846 2.57143H9.71317V6.13393L14.2042 13.2143ZM7.24888 6.74107L4.82031 10.5714H11.1775L8.74888 6.74107L8.57031 6.46429V6.13393V2.57143H7.42746V6.13393V6.46429L7.24888 6.74107Z" fill="#24292E"/>
</svg>

After

Width:  |  Height:  |  Size: 916 B

View File

@ -0,0 +1,4 @@
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.61384 8.90179C9.06027 8.45536 9.28348 7.91667 9.28348 7.28571C9.28348 6.65476 9.06027 6.11607 8.61384 5.66964C8.16741 5.22321 7.62872 5 6.99777 5C6.36682 5 5.82813 5.22321 5.3817 5.66964C4.93527 6.11607 4.71205 6.65476 4.71205 7.28571C4.71205 7.91667 4.93527 8.45536 5.3817 8.90179C5.82813 9.34821 6.36682 9.57143 6.99777 9.57143C7.62872 9.57143 8.16741 9.34821 8.61384 8.90179ZM13.8549 6.3125V8.29464C13.8549 8.36607 13.8311 8.43452 13.7835 8.5C13.7359 8.56548 13.6763 8.60417 13.6049 8.61607L11.9531 8.86607C11.84 9.1875 11.724 9.45833 11.6049 9.67857C11.8132 9.97619 12.1317 10.3869 12.5603 10.9107C12.6198 10.9821 12.6496 11.0565 12.6496 11.1339C12.6496 11.2113 12.6228 11.2798 12.5692 11.3393C12.4085 11.5595 12.1138 11.881 11.6853 12.3036C11.2567 12.7262 10.9769 12.9375 10.846 12.9375C10.7746 12.9375 10.6972 12.9107 10.6138 12.8571L9.3817 11.8929C9.11979 12.0298 8.84896 12.1429 8.5692 12.2321C8.47396 13.0417 8.38765 13.5952 8.31027 13.8929C8.2686 14.0595 8.16146 14.1429 7.98884 14.1429H6.0067C5.92336 14.1429 5.84896 14.1161 5.78348 14.0625C5.72396 14.0149 5.69122 13.9524 5.68527 13.875L5.43527 12.2321C5.1436 12.1369 4.87574 12.0268 4.6317 11.9018L3.37277 12.8571C3.31324 12.9107 3.23884 12.9375 3.14955 12.9375C3.06622 12.9375 2.99182 12.9048 2.92634 12.8393C2.17634 12.1607 1.68527 11.6607 1.45312 11.3393C1.41146 11.2798 1.39062 11.2113 1.39062 11.1339C1.39062 11.0625 1.41443 10.994 1.46205 10.9286C1.55134 10.8036 1.70313 10.6071 1.91741 10.3393C2.1317 10.0655 2.29241 9.85417 2.39955 9.70536C2.23884 9.40774 2.11682 9.11309 2.03348 8.82143L0.399554 8.58036C0.322173 8.56845 0.259673 8.53274 0.212054 8.47321C0.164435 8.40774 0.140625 8.33631 0.140625 8.25893V6.27679C0.140625 6.20536 0.164435 6.1369 0.212054 6.07143C0.259673 6.00595 0.31622 5.96726 0.381696 5.95536L2.04241 5.70536C2.12574 5.43155 2.24182 5.15774 2.39062 4.88393C2.15253 4.54464 1.83408 4.13393 1.43527 3.65178C1.37574 3.58036 1.34598 3.50893 1.34598 3.4375C1.34598 3.37798 1.37277 3.30952 1.42634 3.23214C1.5811 3.01786 1.87277 2.6994 2.30134 2.27678C2.73586 1.84821 3.0186 1.63393 3.14955 1.63393C3.22693 1.63393 3.30432 1.66369 3.3817 1.72321L4.61384 2.67857C4.87574 2.54167 5.14658 2.42857 5.42634 2.33928C5.52158 1.52976 5.60789 0.97619 5.68527 0.678571C5.72693 0.511904 5.83408 0.428571 6.0067 0.428571H7.98884C8.07217 0.428571 8.1436 0.455357 8.20312 0.508928C8.2686 0.556547 8.30432 0.619047 8.31027 0.696428L8.56027 2.33928C8.85194 2.43452 9.11979 2.54464 9.36384 2.66964L10.6317 1.71428C10.6853 1.66071 10.7567 1.63393 10.846 1.63393C10.9234 1.63393 10.9978 1.66369 11.0692 1.72321C11.8371 2.43155 12.3281 2.9375 12.5424 3.24107C12.5841 3.28869 12.6049 3.35417 12.6049 3.4375C12.6049 3.50893 12.5811 3.57738 12.5335 3.64286C12.4442 3.76786 12.2924 3.96726 12.0781 4.24107C11.8638 4.50893 11.7031 4.71726 11.596 4.86607C11.7507 5.16369 11.8728 5.45536 11.9621 5.74107L13.596 5.99107C13.6734 6.00298 13.7359 6.04167 13.7835 6.10714C13.8311 6.16667 13.8549 6.23512 13.8549 6.3125Z" fill="#24292E"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

4
app/images/info-icon.svg Normal file
View File

@ -0,0 +1,4 @@
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.28348 11.5714V10.1429C9.28348 10.0595 9.2567 9.99107 9.20312 9.9375C9.14955 9.88393 9.0811 9.85714 8.99777 9.85714H8.14062V5.28571C8.14062 5.20238 8.11384 5.13393 8.06027 5.08036C8.0067 5.02679 7.93824 5 7.85491 5H4.99777C4.91443 5 4.84598 5.02679 4.79241 5.08036C4.73884 5.13393 4.71205 5.20238 4.71205 5.28571V6.71429C4.71205 6.79762 4.73884 6.86607 4.79241 6.91964C4.84598 6.97321 4.91443 7 4.99777 7H5.85491V9.85714H4.99777C4.91443 9.85714 4.84598 9.88393 4.79241 9.9375C4.73884 9.99107 4.71205 10.0595 4.71205 10.1429V11.5714C4.71205 11.6548 4.73884 11.7232 4.79241 11.7768C4.84598 11.8304 4.91443 11.8571 4.99777 11.8571H8.99777C9.0811 11.8571 9.14955 11.8304 9.20312 11.7768C9.2567 11.7232 9.28348 11.6548 9.28348 11.5714ZM8.14062 3.57143V2.14286C8.14062 2.05952 8.11384 1.99107 8.06027 1.9375C8.0067 1.88393 7.93824 1.85714 7.85491 1.85714H6.14063C6.05729 1.85714 5.98884 1.88393 5.93527 1.9375C5.8817 1.99107 5.85491 2.05952 5.85491 2.14286V3.57143C5.85491 3.65476 5.8817 3.72321 5.93527 3.77678C5.98884 3.83036 6.05729 3.85714 6.14063 3.85714H7.85491C7.93824 3.85714 8.0067 3.83036 8.06027 3.77678C8.11384 3.72321 8.14062 3.65476 8.14062 3.57143ZM12.9353 3.84821C13.5484 4.89583 13.8549 6.04167 13.8549 7.28571C13.8549 8.52976 13.5484 9.67857 12.9353 10.7321C12.3222 11.7798 11.4888 12.6101 10.4353 13.2232C9.38765 13.8363 8.24182 14.1429 6.99777 14.1429C5.75372 14.1429 4.60491 13.8363 3.55134 13.2232C2.50372 12.6101 1.67336 11.7798 1.06027 10.7321C0.447173 9.67857 0.140625 8.52976 0.140625 7.28571C0.140625 6.04167 0.447173 4.89583 1.06027 3.84821C1.67336 2.79464 2.50372 1.96131 3.55134 1.34821C4.60491 0.735119 5.75372 0.428571 6.99777 0.428571C8.24182 0.428571 9.38765 0.735119 10.4353 1.34821C11.4888 1.96131 12.3222 2.79464 12.9353 3.84821Z" fill="#24292E"/>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,4 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15.6696 4.33036C15.8899 4.55655 16 4.82738 16 5.14286C16 5.45238 15.8899 5.72024 15.6696 5.94643L12.0893 9.51786L13.4286 10.8571L12 12.2857C11.0298 13.256 9.86905 13.8125 8.51786 13.9554C7.17262 14.0923 5.94941 13.7917 4.84821 13.0536L1.61607 16.2857H0V14.6696L3.23214 11.4375C2.49405 10.3363 2.19345 9.1131 2.33036 7.76786C2.47321 6.41667 3.02976 5.25595 4 4.28571L5.42857 2.85714L6.76786 4.19643L10.3393 0.616071C10.5655 0.395832 10.8363 0.285713 11.1518 0.285713C11.4673 0.285713 11.7351 0.395832 11.9554 0.616071C12.1756 0.836309 12.2857 1.10714 12.2857 1.42857C12.2857 1.74405 12.1756 2.0119 11.9554 2.23214L8.38393 5.8125L10.4732 7.90179L14.0536 4.33036C14.2798 4.11012 14.5506 4 14.8661 4C15.1815 4 15.4494 4.11012 15.6696 4.33036Z" fill="#24292E"/>
</svg>

After

Width:  |  Height:  |  Size: 871 B

View File

@ -0,0 +1,4 @@
<svg width="12" height="15" viewBox="0 0 12 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.43108 7.28571H8.57394V5.35714C8.57394 4.64732 8.32282 4.04129 7.82059 3.53906C7.31836 3.03683 6.71233 2.78571 6.00251 2.78571C5.29269 2.78571 4.68666 3.03683 4.18443 3.53906C3.6822 4.04129 3.43108 4.64732 3.43108 5.35714V7.28571ZM11.7882 8.25V14.0357C11.7882 14.3036 11.6945 14.5312 11.507 14.7188C11.3195 14.9062 11.0918 15 10.8239 15H1.18108C0.913225 15 0.685547 14.9062 0.498047 14.7188C0.310547 14.5312 0.216797 14.3036 0.216797 14.0357V8.25C0.216797 7.98214 0.310547 7.75446 0.498047 7.56696C0.685547 7.37946 0.913225 7.28571 1.18108 7.28571H1.50251V5.35714C1.50251 4.125 1.94448 3.06696 2.8284 2.18304C3.71233 1.29911 4.77037 0.857142 6.00251 0.857142C7.23465 0.857142 8.29269 1.29911 9.17662 2.18304C10.0605 3.06696 10.5025 4.125 10.5025 5.35714V7.28571H10.8239C11.0918 7.28571 11.3195 7.37946 11.507 7.56696C11.6945 7.75446 11.7882 7.98214 11.7882 8.25Z" fill="#24292E"/>
</svg>

After

Width:  |  Height:  |  Size: 996 B

View File

@ -0,0 +1,116 @@
WEBVTT
1
00:00:00.780 --> 00:00:04.580
MetaMask ist eine neue Möglichkeit, sich mit
Webseiten und Anwendungen zu verbinden.
2
00:00:04.580 --> 00:00:08.860
Auf traditionellen Webseiten ist eine
zentrale Datenbank für die Steuerung und
3
00:00:08.860 --> 00:00:10.179
Wiederherstellung der Konten zuständig.
4
00:00:10.179 --> 00:00:15.050
Bei MetaMask gehört all diese Macht dem
Besitzer eines „Hauptschlüssels“.
5
00:00:15.050 --> 00:00:18.460
Wer den Schlüssel besitzt, kontrolliert
das Wallet und damit die Konten.
6
00:00:18.460 --> 00:00:21.110
Der geheime Satz zur Wiederherstellung
Deines Wallets ist der „Hauptschlüssel“.
7
00:00:21.110 --> 00:00:26.070
Es ist eine Reihe von 12 Wörtern, welche generiert werden,
wenn MetaMask zum ersten Mal eingerichtet wird, diese erlauben dir
8
00:00:26.070 --> 00:00:30.120
Deinen „Hauptschlüssel“ zu Deinem Wallet wieder herzustellen,
solltest Du jemals den Zugriff darauf verlieren.
9
00:00:30.120 --> 00:00:33.451
Es ist wichtig, dass Du Dein Wallet sicherst,
indem Du Deinen geheimen
10
00:00:33.451 --> 00:00:37.510
Wiederherstellungssatz sicher
und geheim verwahrst.
11
00:00:37.510 --> 00:00:41.429
Wenn jemand Zugriff darauf erhält, hat er
den „Hauptschlüssel“ für Dein Wallet und kann
12
00:00:41.429 --> 00:00:45.190
frei auf Deine Konten zugreifen und alle Gelder stehlen.
13
00:00:45.190 --> 00:00:50.109
Um Dein MetaMask-Wallet zu sichern, musst Du Deinen
geheimen Wiederherstellungssatz sicher speichern.
14
00:00:50.109 --> 00:00:54.930
Du kannst ihn aufschreiben, irgendwo verstecken,
in ein Schließfach legen
15
00:00:54.930 --> 00:00:57.729
oder in einen sicheren Passwort-Manager speichern.
16
00:00:57.729 --> 00:01:01.050
Einige Benutzer gravieren ihren
Satz sogar auf eine Metallplatte.
17
00:01:01.050 --> 00:01:04.440
Niemand, nicht einmal das Team von MetaMask,
kann Dir dabei helfen
18
00:01:04.440 --> 00:01:07.820
Dein Wallet wiederherzustellen, wenn Du Deinen
geheimen Wiederherstellungssatz verlierst.
19
00:01:07.820 --> 00:01:12.072
Wenn Du Deinen geheimen Wiederherstellungssatz noch nicht
aufgeschrieben und an einem sicheren Ort aufbewahrt hast,
20
00:01:12.072 --> 00:01:15.492
mach es jetzt. Wir warten solange.
21
00:01:15.500 --> 00:01:20.780
Und denk daran, teilen Deinen geheimen Wiederherstellungssatz
niemals: nicht einmal mit uns.
22
00:01:20.780 --> 00:01:24.910
Wenn dich jemals jemand danach fragt,
versucht er dich zu betrügen.
23
00:01:24.910 --> 00:01:26.250
Das ist alles!
24
00:01:26.250 --> 00:01:31.020
Jetzt weist Du, was ein geheimer Wiederherstellungssatz ist
und wie Du dafür sorgst, das Dein Wallete sicher bleibt.

View File

@ -1,7 +1,7 @@
<!doctype html>
<html lang="en">
<head>
<title>Ethereum Phishing Detection - MetaMask</title>
<title>MetaMask Phishing Detection</title>
<script src="./globalthis.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>
@ -37,7 +37,7 @@
<img src="./images/info-logo.png" alt="">
<h1>
<i class="fa fa-exclamation-circle" aria-hidden="true"></i>
Ethereum Phishing Detection
MetaMask Phishing Detection
</h1>
</div>
<div class="content__body">

View File

@ -414,7 +414,10 @@ function setupController(initState, initLangCode) {
// communication with page or other extension
function connectExternal(remotePort) {
const portStream = new PortStream(remotePort);
controller.setupUntrustedCommunication(portStream, remotePort.sender);
controller.setupUntrustedCommunication({
connectionStream: portStream,
sender: remotePort.sender,
});
}
//

View File

@ -31,10 +31,12 @@ export default class AppStateController extends EventEmitter {
recoveryPhraseReminderHasBeenShown: false,
recoveryPhraseReminderLastShown: new Date().getTime(),
collectiblesDetectionNoticeDismissed: false,
enableEIP1559V2NoticeDismissed: false,
showTestnetMessageInDropdown: true,
trezorModel: null,
...initState,
qrHardware: {},
collectiblesDropdownState: {},
});
this.timer = null;
@ -270,4 +272,26 @@ export default class AppStateController extends EventEmitter {
collectiblesDetectionNoticeDismissed,
});
}
/**
* A setter for the `enableEIP1559V2NoticeDismissed` property
*
* @param enableEIP1559V2NoticeDismissed
*/
setEnableEIP1559V2NoticeDismissed(enableEIP1559V2NoticeDismissed) {
this.store.updateState({
enableEIP1559V2NoticeDismissed,
});
}
/**
* A setter for the `collectiblesDropdownState` property
*
* @param collectiblesDropdownState
*/
updateCollectibleDropDownState(collectiblesDropdownState) {
this.store.updateState({
collectiblesDropdownState,
});
}
}

View File

@ -1,15 +1,17 @@
import { merge, omit } from 'lodash';
import { merge, omit, omitBy } from 'lodash';
import { ObservableStore } from '@metamask/obs-store';
import { bufferToHex, keccak } from 'ethereumjs-util';
import { generateUUID } from 'pubnub';
import { ENVIRONMENT_TYPE_BACKGROUND } from '../../../shared/constants/app';
import {
METAMETRICS_ANONYMOUS_ID,
METAMETRICS_BACKGROUND_PAGE_OBJECT,
} from '../../../shared/constants/metametrics';
import { SECOND } from '../../../shared/constants/time';
const defaultCaptureException = (err) => {
// throw error on clean stack so its captured by platform integrations (eg sentry)
// but does not interupt the call stack
// but does not interrupt the call stack
setTimeout(() => {
throw err;
});
@ -27,15 +29,18 @@ const exceptionsToFilter = {
* @typedef {import('../../../shared/constants/metametrics').SegmentInterface} SegmentInterface
* @typedef {import('../../../shared/constants/metametrics').MetaMetricsPagePayload} MetaMetricsPagePayload
* @typedef {import('../../../shared/constants/metametrics').MetaMetricsPageOptions} MetaMetricsPageOptions
* @typedef {import('../../../shared/constants/metametrics').MetaMetricsEventFragment} MetaMetricsEventFragment
*/
/**
* @typedef {Object} MetaMetricsControllerState
* @property {?string} metaMetricsId - The user's metaMetricsId that will be
* @property {string} [metaMetricsId] - The user's metaMetricsId that will be
* attached to all non-anonymized event payloads
* @property {?boolean} participateInMetaMetrics - The user's preference for
* @property {boolean} [participateInMetaMetrics] - The user's preference for
* participating in the MetaMetrics analytics program. This setting controls
* whether or not events are tracked
* @property {{[string]: MetaMetricsEventFragment}} [fragments] - Object keyed
* by UUID with stored fragments as values.
*/
export default class MetaMetricsController {
@ -81,10 +86,15 @@ export default class MetaMetricsController {
this.version =
environment === 'production' ? version : `${version}-${environment}`;
const abandonedFragments = omitBy(initState?.fragments, 'persist');
this.store = new ObservableStore({
participateInMetaMetrics: null,
metaMetricsId: null,
...initState,
fragments: {
...initState?.fragments,
},
});
preferencesStore.subscribe(({ currentLocale }) => {
@ -96,6 +106,32 @@ export default class MetaMetricsController {
this.network = getNetworkIdentifier();
});
this.segment = segment;
// Track abandoned fragments that weren't properly cleaned up.
// Abandoned fragments are those that were stored in persistent memory
// and are available at controller instance creation, but do not have the
// 'persist' flag set. This means anytime the extension is unlocked, any
// fragments that are not marked as persistent will be purged and the
// failure event will be emitted.
Object.values(abandonedFragments).forEach((fragment) => {
this.finalizeEventFragment(fragment.id, { abandoned: true });
});
// Close out event fragments that were created but not progressed. An
// interval is used to routinely check if a fragment has not been updated
// within the fragment's timeout window. When creating a new event fragment
// a timeout can be specified that will cause an abandoned event to be
// tracked if the event isn't progressed within that amount of time.
setInterval(() => {
Object.values(this.store.getState().fragments).forEach((fragment) => {
if (
fragment.timeout &&
Date.now() - fragment.lastUpdated / 1000 > fragment.timeout
) {
this.finalizeEventFragment(fragment.id, { abandoned: true });
}
});
}, SECOND * 30);
}
generateMetaMetricsId() {
@ -109,6 +145,141 @@ export default class MetaMetricsController {
);
}
/**
* Create an event fragment in state and returns the event fragment object.
*
* @param {MetaMetricsEventFragment} options - Fragment settings and properties
* to initiate the fragment with.
* @returns {MetaMetricsEventFragment}
*/
createEventFragment(options) {
if (!options.successEvent || !options.category) {
throw new Error(
`Must specify success event and category. Success event was: ${
options.event
}. Category was: ${options.category}. Payload keys were: ${Object.keys(
options,
)}. ${
typeof options.properties === 'object'
? `Payload property keys were: ${Object.keys(options.properties)}`
: ''
}`,
);
}
const { fragments } = this.store.getState();
const id = options.uniqueIdentifier ?? generateUUID();
const fragment = {
id,
...options,
lastUpdated: Date.now(),
};
this.store.updateState({
fragments: {
...fragments,
[id]: fragment,
},
});
if (options.initialEvent) {
this.trackEvent({
event: fragment.initialEvent,
category: fragment.category,
properties: fragment.properties,
sensitiveProperties: fragment.sensitiveProperties,
page: fragment.page,
referrer: fragment.referrer,
revenue: fragment.revenue,
value: fragment.value,
currency: fragment.currency,
environmentType: fragment.environmentType,
});
}
return fragment;
}
/**
* Returns the fragment stored in memory with provided id or undefined if it
* does not exist.
*
* @param {string} id - id of fragment to retrieve
* @returns {[MetaMetricsEventFragment]}
*/
getEventFragmentById(id) {
const { fragments } = this.store.getState();
const fragment = fragments[id];
return fragment;
}
/**
* Updates an event fragment in state
*
* @param {string} id - The fragment id to update
* @param {MetaMetricsEventFragment} payload - Fragment settings and
* properties to initiate the fragment with.
*/
updateEventFragment(id, payload) {
const { fragments } = this.store.getState();
const fragment = fragments[id];
if (!fragment) {
throw new Error(`Event fragment with id ${id} does not exist.`);
}
this.store.updateState({
fragments: {
...fragments,
[id]: merge(fragments[id], {
...payload,
lastUpdated: Date.now(),
}),
},
});
}
/**
* Finalizes a fragment, tracking either a success event or failure Event
* and then removes the fragment from state.
*
* @param {string} id - UUID of the event fragment to be closed
* @param {object} options
* @param {boolean} [options.abandoned] - if true track the failure
* event instead of the success event
* @param {MetaMetricsContext.page} [options.page] - page the final event
* occurred on. This will override whatever is set on the fragment
* @param {MetaMetricsContext.referrer} [options.referrer] - Dapp that
* originated the fragment. This is for fallback only, the fragment referrer
* property will take precedence.
*/
finalizeEventFragment(id, { abandoned = false, page, referrer } = {}) {
const fragment = this.store.getState().fragments[id];
if (!fragment) {
throw new Error(`Funnel with id ${id} does not exist.`);
}
const eventName = abandoned ? fragment.failureEvent : fragment.successEvent;
this.trackEvent({
event: eventName,
category: fragment.category,
properties: fragment.properties,
sensitiveProperties: fragment.sensitiveProperties,
page: page ?? fragment.page,
referrer: fragment.referrer ?? referrer,
revenue: fragment.revenue,
value: fragment.value,
currency: fragment.currency,
environmentType: fragment.environmentType,
});
const { fragments } = this.store.getState();
delete fragments[id];
this.store.updateState({ fragments });
}
/**
* Setter for the `participateInMetaMetrics` property
*

View File

@ -81,6 +81,28 @@ function getMockPreferencesStore({ currentLocale = LOCALE } = {}) {
};
}
const SAMPLE_PERSISTED_EVENT = {
id: 'testid',
persist: true,
category: 'Unit Test',
successEvent: 'sample persisted event success',
failureEvent: 'sample persisted event failure',
properties: {
test: true,
},
};
const SAMPLE_NON_PERSISTED_EVENT = {
id: 'testid2',
persist: false,
category: 'Unit Test',
successEvent: 'sample non-persisted event success',
failureEvent: 'sample non-persisted event failure',
properties: {
test: true,
},
};
function getMetaMetricsController({
participateInMetaMetrics = true,
metaMetricsId = TEST_META_METRICS_ID,
@ -105,12 +127,29 @@ function getMetaMetricsController({
initState: {
participateInMetaMetrics,
metaMetricsId,
fragments: {
testid: SAMPLE_PERSISTED_EVENT,
testid2: SAMPLE_NON_PERSISTED_EVENT,
},
},
});
}
describe('MetaMetricsController', function () {
describe('constructor', function () {
it('should properly initialize', function () {
const mock = sinon.mock(segment);
mock
.expects('track')
.once()
.withArgs({
event: 'sample non-persisted event failure',
userId: TEST_META_METRICS_ID,
context: DEFAULT_TEST_CONTEXT,
properties: {
...DEFAULT_EVENT_PROPERTIES,
test: true,
},
});
const metaMetricsController = getMetaMetricsController();
assert.strictEqual(metaMetricsController.version, VERSION);
assert.strictEqual(metaMetricsController.network, NETWORK);
@ -127,6 +166,10 @@ describe('MetaMetricsController', function () {
metaMetricsController.locale,
LOCALE.replace('_', '-'),
);
assert.deepStrictEqual(metaMetricsController.state.fragments, {
testid: SAMPLE_PERSISTED_EVENT,
});
mock.verify();
});
it('should update when network changes', function () {

View File

@ -0,0 +1,34 @@
import {
restrictedMethodPermissionBuilders,
selectHooks,
} from '@metamask/rpc-methods';
import { endowmentPermissionBuilders } from '@metamask/snap-controllers';
/**
* @returns {Record<string, Record<string, unknown>>} All endowment permission
* specifications.
*/
export const buildSnapEndowmentSpecifications = () =>
Object.values(endowmentPermissionBuilders).reduce(
(allSpecifications, { targetKey, specificationBuilder }) => {
allSpecifications[targetKey] = specificationBuilder();
return allSpecifications;
},
{},
);
/**
* @param {Record<string, Function>} hooks - The hooks for the Snap
* restricted method implementations.
*/
export function buildSnapRestrictedMethodSpecifications(hooks) {
return Object.values(restrictedMethodPermissionBuilders).reduce(
(specifications, { targetKey, specificationBuilder, methodHooks }) => {
specifications[targetKey] = specificationBuilder({
methodHooks: selectHooks(hooks, methodHooks),
});
return specifications;
},
{},
);
}

View File

@ -0,0 +1,46 @@
import {
EndowmentPermissions,
RestrictedMethods,
} from '../../../../../shared/constants/permissions';
import {
buildSnapEndowmentSpecifications,
buildSnapRestrictedMethodSpecifications,
} from './snap-permissions';
describe('buildSnapRestrictedMethodSpecifications', () => {
it('creates valid permission specification objects', () => {
const hooks = {
addSnap: () => undefined,
clearSnapState: () => undefined,
getMnemonic: () => undefined,
getSnap: () => undefined,
getSnapRpcHandler: () => undefined,
getSnapState: () => undefined,
showConfirmation: () => undefined,
updateSnapState: () => undefined,
};
const specifications = buildSnapRestrictedMethodSpecifications(hooks);
const allRestrictedMethods = Object.keys(RestrictedMethods);
Object.keys(specifications).forEach((permissionKey) =>
expect(allRestrictedMethods).toContain(permissionKey),
);
Object.values(specifications).forEach((specification) => {
expect(specification).toMatchObject({
targetKey: expect.stringMatching(/^(snap_|wallet_)/u),
methodImplementation: expect.any(Function),
allowedCaveats: null,
});
});
});
});
describe('buildSnapEndowmentSpecifications', () => {
it('creates valid permission specification objects', () => {
expect(
Object.keys(buildSnapEndowmentSpecifications()).sort(),
).toStrictEqual(Object.keys(EndowmentPermissions).sort());
});
});

View File

@ -4,3 +4,6 @@ export * from './enums';
export * from './permission-log';
export * from './specifications';
export * from './selectors';
///: BEGIN:ONLY_INCLUDE_IN(flask)
export * from './flask/snap-permissions';
///: END:ONLY_INCLUDE_IN

View File

@ -1,4 +1,7 @@
import { constructPermission } from '@metamask/snap-controllers';
import {
constructPermission,
PermissionType,
} from '@metamask/snap-controllers';
import {
CaveatTypes,
RestrictedMethods,
@ -90,6 +93,7 @@ export const getPermissionSpecifications = ({
}) => {
return {
[PermissionKeys.eth_accounts]: {
permissionType: PermissionType.RestrictedMethod,
targetKey: PermissionKeys.eth_accounts,
allowedCaveats: [CaveatTypes.restrictReturnedAccounts],

View File

@ -134,28 +134,21 @@ export default class PreferencesController {
/**
* Setter for the `useCollectibleDetection` property
*
* @param {boolean} val - Whether or not the user prefers to autodetect collectibles.
* @param {boolean} useCollectibleDetection - Whether or not the user prefers to autodetect collectibles.
*/
setUseCollectibleDetection(val) {
const { openSeaEnabled } = this.store.getState();
if (val && !openSeaEnabled) {
throw new Error(
'useCollectibleDetection cannot be enabled if openSeaEnabled is false',
);
}
this.store.updateState({ useCollectibleDetection: val });
setUseCollectibleDetection(useCollectibleDetection) {
this.store.updateState({ useCollectibleDetection });
}
/**
* Setter for the `openSeaEnabled` property
*
* @param {boolean} val - Whether or not the user prefers to use the OpenSea API for collectibles data.
* @param {boolean} openSeaEnabled - Whether or not the user prefers to use the OpenSea API for collectibles data.
*/
setOpenSeaEnabled(val) {
this.store.updateState({ openSeaEnabled: val });
if (!val) {
this.store.updateState({ useCollectibleDetection: false });
}
setOpenSeaEnabled(openSeaEnabled) {
this.store.updateState({
openSeaEnabled,
});
}
/**
@ -167,6 +160,15 @@ export default class PreferencesController {
this.store.updateState({ advancedGasFee: val });
}
/**
* Setter for the `eip1559V2Enabled` property
*
* @param {object} val - holds the eip1559V2Enabled that the user set as experimental settings.
*/
setEIP1559V2Enabled(val) {
this.store.updateState({ eip1559V2Enabled: val });
}
/**
* Add new methodData to state, to avoid requesting this information again through Infura
*

View File

@ -25,6 +25,7 @@ import {
TRANSACTION_STATUSES,
TRANSACTION_TYPES,
TRANSACTION_ENVELOPE_TYPES,
TRANSACTION_EVENTS,
} from '../../../../shared/constants/transaction';
import { TRANSACTION_ENVELOPE_TYPE_NAMES } from '../../../../ui/helpers/constants/transactions';
import { METAMASK_CONTROLLER_EVENTS } from '../../metamask-controller';
@ -54,13 +55,15 @@ const hstInterface = new ethers.utils.Interface(abi);
const MAX_MEMSTORE_TX_LIST_SIZE = 100; // Number of transactions (by unique nonces) to keep in memory
export const TRANSACTION_EVENTS = {
ADDED: 'Transaction Added',
APPROVED: 'Transaction Approved',
FINALIZED: 'Transaction Finalized',
REJECTED: 'Transaction Rejected',
SUBMITTED: 'Transaction Submitted',
};
const SWAP_TRANSACTION_TYPES = [
TRANSACTION_TYPES.SWAP,
TRANSACTION_TYPES.SWAP_APPROVAL,
];
/**
* @typedef {import('../../../../shared/constants/transaction').TransactionMeta} TransactionMeta
* @typedef {import('../../../../shared/constants/transaction').TransactionMetaMetricsEventString} TransactionMetaMetricsEventString
*/
/**
* @typedef {Object} CustomGasSettings
@ -118,6 +121,10 @@ export default class TransactionController extends EventEmitter {
this._trackMetaMetricsEvent = opts.trackMetaMetricsEvent;
this._getParticipateInMetrics = opts.getParticipateInMetrics;
this._getEIP1559GasFeeEstimates = opts.getEIP1559GasFeeEstimates;
this.createEventFragment = opts.createEventFragment;
this.updateEventFragment = opts.updateEventFragment;
this.finalizeEventFragment = opts.finalizeEventFragment;
this.getEventFragmentById = opts.getEventFragmentById;
this.memStore = new ObservableStore({});
this.query = new EthQuery(this.provider);
@ -335,9 +342,19 @@ export default class TransactionController extends EventEmitter {
*
* @param txParams
* @param origin
* @param transactionType
* @returns {txMeta}
*/
async addUnapprovedTransaction(txParams, origin) {
async addUnapprovedTransaction(txParams, origin, transactionType) {
if (
transactionType !== undefined &&
!SWAP_TRANSACTION_TYPES.includes(transactionType)
) {
throw new Error(
`TransactionController - invalid transactionType value: ${transactionType}`,
);
}
// validate
const normalizedTxParams = txUtils.normalizeTxParams(txParams);
const eip1559Compatibility = await this.getEIP1559Compatibility();
@ -379,7 +396,7 @@ export default class TransactionController extends EventEmitter {
const { type, getCodeResponse } = await this._determineTransactionType(
txParams,
);
txMeta.type = type;
txMeta.type = transactionType || type;
// ensure value
txMeta.txParams.value = txMeta.txParams.value
@ -432,7 +449,6 @@ export default class TransactionController extends EventEmitter {
gasLimit: defaultGasLimit,
simulationFails,
} = await this._getDefaultGasLimit(txMeta, getCodeResponse);
const advancedGasFeeDefaultValues = this.getAdvancedGasFee();
// eslint-disable-next-line no-param-reassign
txMeta = this.txStateManager.getTransaction(txMeta.id);
@ -441,7 +457,13 @@ export default class TransactionController extends EventEmitter {
}
if (eip1559Compatibility) {
if (process.env.EIP_1559_V2 && Boolean(advancedGasFeeDefaultValues)) {
const { eip1559V2Enabled } = this.preferencesStore.getState();
const advancedGasFeeDefaultValues = this.getAdvancedGasFee();
if (
eip1559V2Enabled &&
Boolean(advancedGasFeeDefaultValues) &&
!SWAP_TRANSACTION_TYPES.includes(txMeta.type)
) {
txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE;
txMeta.txParams.maxFeePerGas = decGWEIToHexWEI(
advancedGasFeeDefaultValues.maxBaseFee,
@ -458,7 +480,7 @@ export default class TransactionController extends EventEmitter {
// then we set maxFeePerGas and maxPriorityFeePerGas to the suggested gasPrice.
txMeta.txParams.maxFeePerGas = txMeta.txParams.gasPrice;
txMeta.txParams.maxPriorityFeePerGas = txMeta.txParams.gasPrice;
if (process.env.EIP_1559_V2) {
if (eip1559V2Enabled && txMeta.origin !== 'metamask') {
txMeta.userFeeLevel = PRIORITY_LEVELS.DAPP_SUGGESTED;
} else {
txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE;
@ -472,7 +494,7 @@ export default class TransactionController extends EventEmitter {
txMeta.origin === 'metamask'
) {
txMeta.userFeeLevel = GAS_RECOMMENDATIONS.MEDIUM;
} else if (process.env.EIP_1559_V2) {
} else if (eip1559V2Enabled) {
txMeta.userFeeLevel = PRIORITY_LEVELS.DAPP_SUGGESTED;
} else {
txMeta.userFeeLevel = CUSTOM_GAS_ESTIMATE;
@ -538,7 +560,15 @@ export default class TransactionController extends EventEmitter {
if (defaultGasLimit && !txMeta.txParams.gas) {
txMeta.txParams.gas = defaultGasLimit;
txMeta.originalGasEstimate = defaultGasLimit;
}
txMeta.defaultGasEstimates = {
estimateType: txMeta.userFeeLevel,
gas: txMeta.txParams.gas,
gasPrice: txMeta.txParams.gasPrice,
maxFeePerGas: txMeta.txParams.maxFeePerGas,
maxPriorityFeePerGas: txMeta.txParams.maxPriorityFeePerGas,
};
return txMeta;
}
@ -661,9 +691,8 @@ export default class TransactionController extends EventEmitter {
* 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 {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
@ -1119,6 +1148,28 @@ export default class TransactionController extends EventEmitter {
this.txStateManager.updateTransaction(txMeta, 'transactions#setTxHash');
}
/**
* Convenience method for the UI to easily create event fragments when the
* fragment does not exist in state.
*
* @param {number} transactionId - The transaction id to create the event
* fragment for
* @param {valueOf<TRANSACTION_EVENTS>} event - event type to create
*/
async createTransactionEventFragment(transactionId, event) {
const txMeta = this.txStateManager.getTransaction(transactionId);
const {
properties,
sensitiveProperties,
} = await this._buildEventFragmentProperties(txMeta);
this._createTransactionEventFragment(
txMeta,
event,
properties,
sensitiveProperties,
);
}
//
// PRIVATE METHODS
//
@ -1449,20 +1500,7 @@ export default class TransactionController extends EventEmitter {
}
}
/**
* Extracts relevant properties from a transaction meta
* object and uses them to create and send metrics for various transaction
* events.
*
* @param {Object} txMeta - the txMeta object
* @param {string} event - the name of the transaction event
* @param {Object} extraParams - optional props and values to include in sensitiveProperties
*/
_trackTransactionMetricsEvent(txMeta, event, extraParams = {}) {
if (!txMeta) {
return;
}
async _buildEventFragmentProperties(txMeta, extraParams) {
const {
type,
time,
@ -1477,6 +1515,7 @@ export default class TransactionController extends EventEmitter {
estimateSuggested,
estimateUsed,
},
defaultGasEstimates,
metamaskNetworkId: network,
} = txMeta;
const source = referrer === 'metamask' ? 'user' : 'dapp';
@ -1490,6 +1529,43 @@ export default class TransactionController extends EventEmitter {
gasParams.gas_price = gasPrice;
}
if (defaultGasEstimates) {
const { estimateType } = defaultGasEstimates;
if (estimateType) {
gasParams.default_estimate = estimateType;
let defaultMaxFeePerGas = txMeta.defaultGasEstimates.maxFeePerGas;
let defaultMaxPriorityFeePerGas =
txMeta.defaultGasEstimates.maxPriorityFeePerGas;
if (
[
GAS_RECOMMENDATIONS.LOW,
GAS_RECOMMENDATIONS.MEDIUM,
GAS_RECOMMENDATIONS.MEDIUM.HIGH,
].includes(estimateType)
) {
const { gasFeeEstimates } = await this._getEIP1559GasFeeEstimates();
if (gasFeeEstimates?.[estimateType]?.suggestedMaxFeePerGas) {
defaultMaxFeePerGas =
gasFeeEstimates[estimateType]?.suggestedMaxFeePerGas;
gasParams.default_max_fee_per_gas = defaultMaxFeePerGas;
}
if (gasFeeEstimates?.[estimateType]?.suggestedMaxPriorityFeePerGas) {
defaultMaxPriorityFeePerGas =
gasFeeEstimates[estimateType]?.suggestedMaxPriorityFeePerGas;
gasParams.default_max_priority_fee_per_gas = defaultMaxPriorityFeePerGas;
}
}
}
if (txMeta.defaultGasEstimates.gas) {
gasParams.default_gas = txMeta.defaultGasEstimates.gas;
}
if (txMeta.defaultGasEstimates.gasPrice) {
gasParams.default_gas_price = txMeta.defaultGasEstimates.gasPrice;
}
}
if (estimateSuggested) {
gasParams.estimate_suggested = estimateSuggested;
}
@ -1500,27 +1576,211 @@ export default class TransactionController extends EventEmitter {
const gasParamsInGwei = this._getGasValuesInGWEI(gasParams);
this._trackMetaMetricsEvent({
let eip1559Version = '0';
if (txMeta.txParams.maxFeePerGas) {
const { eip1559V2Enabled } = this.preferencesStore.getState();
eip1559Version = eip1559V2Enabled ? '2' : '1';
}
const properties = {
chain_id: chainId,
referrer,
source,
network,
type,
eip_1559_version: eip1559Version,
gas_edit_type: 'none',
gas_edit_attempted: 'none',
};
const sensitiveProperties = {
status,
transaction_envelope_type: isEIP1559Transaction(txMeta)
? TRANSACTION_ENVELOPE_TYPE_NAMES.FEE_MARKET
: TRANSACTION_ENVELOPE_TYPE_NAMES.LEGACY,
first_seen: time,
gas_limit: gasLimit,
...gasParamsInGwei,
...extraParams,
};
return { properties, sensitiveProperties };
}
/**
* Helper method that checks for the presence of an existing fragment by id
* appropriate for the type of event that triggered fragment creation. If the
* appropriate fragment exists, then nothing is done. If it does not exist a
* new event fragment is created with the appropriate payload.
*
* @param {TransactionMeta} txMeta - Transaction meta object
* @param {TransactionMetaMetricsEventString} event - The event type that
* triggered fragment creation
* @param {Object} properties - properties to include in the fragment
* @param {Object} [sensitiveProperties] - sensitive properties to include in
* the fragment
*/
_createTransactionEventFragment(
txMeta,
event,
properties,
sensitiveProperties,
) {
const isSubmitted = [
TRANSACTION_EVENTS.FINALIZED,
TRANSACTION_EVENTS.SUBMITTED,
].includes(event);
const uniqueIdentifier = `transaction-${
isSubmitted ? 'submitted' : 'added'
}-${txMeta.id}`;
const fragment = this.getEventFragmentById(uniqueIdentifier);
if (typeof fragment !== 'undefined') {
return;
}
switch (event) {
// When a transaction is added to the controller, we know that the user
// will be presented with a confirmation screen. The user will then
// either confirm or reject that transaction. Each has an associated
// event we want to track. While we don't necessarily need an event
// fragment to model this, having one allows us to record additional
// properties onto the event from the UI. For example, when the user
// edits the transactions gas params we can record that property and
// then get analytics on the number of transactions in which gas edits
// occur.
case TRANSACTION_EVENTS.ADDED:
this.createEventFragment({
category: 'Transactions',
initialEvent: TRANSACTION_EVENTS.ADDED,
successEvent: TRANSACTION_EVENTS.APPROVED,
failureEvent: TRANSACTION_EVENTS.REJECTED,
properties,
sensitiveProperties,
persist: true,
uniqueIdentifier,
});
break;
// If for some reason an approval or rejection occurs without the added
// fragment existing in memory, we create the added fragment but without
// the initialEvent firing. This is to prevent possible duplication of
// events. A good example why this might occur is if the user had
// unapproved transactions in memory when updating to the version that
// includes this change. A migration would have also helped here but this
// implementation hardens against other possible bugs where a fragment
// does not exist.
case TRANSACTION_EVENTS.APPROVED:
case TRANSACTION_EVENTS.REJECTED:
this.createEventFragment({
category: 'Transactions',
successEvent: TRANSACTION_EVENTS.APPROVED,
failureEvent: TRANSACTION_EVENTS.REJECTED,
properties,
sensitiveProperties,
persist: true,
uniqueIdentifier,
});
break;
// When a transaction is submitted it will always result in updating
// to a finalized state (dropped, failed, confirmed) -- eventually.
// However having a fragment started at this stage allows augmenting
// analytics data with user interactions such as speeding up and
// canceling the transactions. From this controllers perspective a new
// transaction with a new id is generated for speed up and cancel
// transactions, but from the UI we could augment the previous ID with
// supplemental data to show user intent. Such as when they open the
// cancel UI but don't submit. We can record that this happened and add
// properties to the transaction event.
case TRANSACTION_EVENTS.SUBMITTED:
this.createEventFragment({
category: 'Transactions',
initialEvent: TRANSACTION_EVENTS.SUBMITTED,
successEvent: TRANSACTION_EVENTS.FINALIZED,
properties,
sensitiveProperties,
persist: true,
uniqueIdentifier,
});
break;
// If for some reason a transaction is finalized without the submitted
// fragment existing in memory, we create the submitted fragment but
// without the initialEvent firing. This is to prevent possible
// duplication of events. A good example why this might occur is if th
// user had pending transactions in memory when updating to the version
// that includes this change. A migration would have also helped here but
// this implementation hardens against other possible bugs where a
// fragment does not exist.
case TRANSACTION_EVENTS.FINALIZED:
this.createEventFragment({
category: 'Transactions',
successEvent: TRANSACTION_EVENTS.FINALIZED,
properties,
sensitiveProperties,
persist: true,
uniqueIdentifier,
});
break;
default:
break;
}
}
/**
* Extracts relevant properties from a transaction meta
* object and uses them to create and send metrics for various transaction
* events.
*
* @param {Object} txMeta - the txMeta object
* @param {TransactionMetaMetricsEventString} event - the name of the transaction event
* @param {Object} extraParams - optional props and values to include in sensitiveProperties
*/
async _trackTransactionMetricsEvent(txMeta, event, extraParams = {}) {
if (!txMeta) {
return;
}
const {
properties,
sensitiveProperties,
} = await this._buildEventFragmentProperties(txMeta, extraParams);
// Create event fragments for event types that spawn fragments, and ensure
// existence of fragments for event types that act upon them.
this._createTransactionEventFragment(
txMeta,
event,
category: 'Transactions',
properties: {
chain_id: chainId,
referrer,
source,
network,
type,
},
sensitiveProperties: {
status,
transaction_envelope_type: isEIP1559Transaction(txMeta)
? TRANSACTION_ENVELOPE_TYPE_NAMES.FEE_MARKET
: TRANSACTION_ENVELOPE_TYPE_NAMES.LEGACY,
first_seen: time,
gas_limit: gasLimit,
...gasParamsInGwei,
...extraParams,
},
});
properties,
sensitiveProperties,
);
let id;
switch (event) {
// If the user approves a transaction, finalize the transaction added
// event fragment.
case TRANSACTION_EVENTS.APPROVED:
id = `transaction-added-${txMeta.id}`;
this.updateEventFragment(id, { properties, sensitiveProperties });
this.finalizeEventFragment(id);
break;
// If the user rejects a transaction, finalize the transaction added
// event fragment. with the abandoned flag set.
case TRANSACTION_EVENTS.REJECTED:
id = `transaction-added-${txMeta.id}`;
this.updateEventFragment(id, { properties, sensitiveProperties });
this.finalizeEventFragment(id, {
abandoned: true,
});
break;
// When a transaction is finalized, also finalize the transaction
// submitted event fragment.
case TRANSACTION_EVENTS.FINALIZED:
id = `transaction-submitted-${txMeta.id}`;
this.updateEventFragment(id, { properties, sensitiveProperties });
this.finalizeEventFragment(`transaction-submitted-${txMeta.id}`);
break;
default:
break;
}
}
_getTransactionCompletionTime(submittedTime) {

View File

@ -9,10 +9,12 @@ import {
createTestProviderTools,
getTestAccounts,
} from '../../../../test/stub/provider';
import mockEstimates from '../../../../test/data/mock-estimates.json';
import {
TRANSACTION_STATUSES,
TRANSACTION_TYPES,
TRANSACTION_ENVELOPE_TYPES,
TRANSACTION_EVENTS,
} from '../../../../shared/constants/transaction';
import { SECOND } from '../../../../shared/constants/time';
@ -22,7 +24,7 @@ import {
} from '../../../../shared/constants/gas';
import { TRANSACTION_ENVELOPE_TYPE_NAMES } from '../../../../ui/helpers/constants/transactions';
import { METAMASK_CONTROLLER_EVENTS } from '../../metamask-controller';
import TransactionController, { TRANSACTION_EVENTS } from '.';
import TransactionController from '.';
const noop = () => true;
const currentNetworkId = '42';
@ -35,17 +37,21 @@ const VALID_ADDRESS = '0x0000000000000000000000000000000000000000';
const VALID_ADDRESS_TWO = '0x0000000000000000000000000000000000000001';
describe('Transaction Controller', function () {
let txController, provider, providerResultStub, fromAccount;
let txController, provider, providerResultStub, fromAccount, fragmentExists;
beforeEach(function () {
fragmentExists = false;
providerResultStub = {
// 1 gwei
eth_gasPrice: '0x0de0b6b3a7640000',
// by default, all accounts are external accounts (not contracts)
eth_getCode: '0x',
};
provider = createTestProviderTools({ scaffold: providerResultStub })
.provider;
provider = createTestProviderTools({
scaffold: providerResultStub,
networkId: currentNetworkId,
chainId: currentNetworkId,
}).provider;
fromAccount = getTestAccounts()[0];
const blockTrackerStub = new EventEmitter();
@ -70,6 +76,11 @@ describe('Transaction Controller', function () {
getCurrentChainId: () => currentChainId,
getParticipateInMetrics: () => false,
trackMetaMetricsEvent: () => undefined,
createEventFragment: () => undefined,
updateEventFragment: () => undefined,
finalizeEventFragment: () => undefined,
getEventFragmentById: () =>
fragmentExists === false ? undefined : { id: 0 },
getEIP1559GasFeeEstimates: () => undefined,
});
txController.nonceTracker.getNonceLock = () =>
@ -1536,19 +1547,357 @@ describe('Transaction Controller', function () {
describe('#_trackTransactionMetricsEvent', function () {
let trackMetaMetricsEventSpy;
let createEventFragmentSpy;
let finalizeEventFragmentSpy;
beforeEach(function () {
trackMetaMetricsEventSpy = sinon.spy(
txController,
'_trackMetaMetricsEvent',
);
createEventFragmentSpy = sinon.spy(txController, 'createEventFragment');
finalizeEventFragmentSpy = sinon.spy(
txController,
'finalizeEventFragment',
);
sinon
.stub(txController, '_getEIP1559GasFeeEstimates')
.resolves(mockEstimates['fee-market']);
});
afterEach(function () {
trackMetaMetricsEventSpy.restore();
createEventFragmentSpy.restore();
finalizeEventFragmentSpy.restore();
});
it('should call _trackMetaMetricsEvent with the correct payload (user source)', function () {
describe('On transaction created by the user', function () {
let txMeta;
before(function () {
txMeta = {
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
txParams: {
from: fromAccount.address,
to: '0x1678a085c290ebd122dc42cba69373b5953b831d',
gasPrice: '0x77359400',
gas: '0x7b0d',
nonce: '0x4b',
},
type: TRANSACTION_TYPES.SIMPLE_SEND,
origin: 'metamask',
chainId: currentChainId,
time: 1624408066355,
metamaskNetworkId: currentNetworkId,
defaultGasEstimates: {
gas: '0x7b0d',
gasPrice: '0x77359400',
},
};
});
it('should create an event fragment when transaction added', async function () {
const expectedPayload = {
initialEvent: 'Transaction Added',
successEvent: 'Transaction Approved',
failureEvent: 'Transaction Rejected',
uniqueIdentifier: 'transaction-added-1',
category: 'Transactions',
persist: true,
properties: {
chain_id: '0x2a',
eip_1559_version: '0',
gas_edit_attempted: 'none',
gas_edit_type: 'none',
network: '42',
referrer: 'metamask',
source: 'user',
type: TRANSACTION_TYPES.SIMPLE_SEND,
},
sensitiveProperties: {
default_gas: '0.000031501',
default_gas_price: '2',
gas_price: '2',
gas_limit: '0x7b0d',
first_seen: 1624408066355,
transaction_envelope_type: TRANSACTION_ENVELOPE_TYPE_NAMES.LEGACY,
status: 'unapproved',
},
};
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.ADDED,
);
assert.equal(createEventFragmentSpy.callCount, 1);
assert.equal(finalizeEventFragmentSpy.callCount, 0);
assert.deepEqual(
createEventFragmentSpy.getCall(0).args[0],
expectedPayload,
);
});
it('Should finalize the transaction added fragment as abandoned if user rejects transaction', async function () {
fragmentExists = true;
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.REJECTED,
);
assert.equal(createEventFragmentSpy.callCount, 0);
assert.equal(finalizeEventFragmentSpy.callCount, 1);
assert.deepEqual(
finalizeEventFragmentSpy.getCall(0).args[0],
'transaction-added-1',
);
assert.deepEqual(finalizeEventFragmentSpy.getCall(0).args[1], {
abandoned: true,
});
});
it('Should finalize the transaction added fragment if user approves transaction', async function () {
fragmentExists = true;
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.APPROVED,
);
assert.equal(createEventFragmentSpy.callCount, 0);
assert.equal(finalizeEventFragmentSpy.callCount, 1);
assert.deepEqual(
finalizeEventFragmentSpy.getCall(0).args[0],
'transaction-added-1',
);
assert.deepEqual(
finalizeEventFragmentSpy.getCall(0).args[1],
undefined,
);
});
it('should create an event fragment when transaction is submitted', async function () {
const expectedPayload = {
initialEvent: 'Transaction Submitted',
successEvent: 'Transaction Finalized',
uniqueIdentifier: 'transaction-submitted-1',
category: 'Transactions',
persist: true,
properties: {
chain_id: '0x2a',
eip_1559_version: '0',
gas_edit_attempted: 'none',
gas_edit_type: 'none',
network: '42',
referrer: 'metamask',
source: 'user',
type: TRANSACTION_TYPES.SIMPLE_SEND,
},
sensitiveProperties: {
default_gas: '0.000031501',
default_gas_price: '2',
gas_price: '2',
gas_limit: '0x7b0d',
first_seen: 1624408066355,
transaction_envelope_type: TRANSACTION_ENVELOPE_TYPE_NAMES.LEGACY,
status: 'unapproved',
},
};
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.SUBMITTED,
);
assert.equal(createEventFragmentSpy.callCount, 1);
assert.equal(finalizeEventFragmentSpy.callCount, 0);
assert.deepEqual(
createEventFragmentSpy.getCall(0).args[0],
expectedPayload,
);
});
it('Should finalize the transaction submitted fragment when transaction finalizes', async function () {
fragmentExists = true;
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.FINALIZED,
);
assert.equal(createEventFragmentSpy.callCount, 0);
assert.equal(finalizeEventFragmentSpy.callCount, 1);
assert.deepEqual(
finalizeEventFragmentSpy.getCall(0).args[0],
'transaction-submitted-1',
);
assert.deepEqual(
finalizeEventFragmentSpy.getCall(0).args[1],
undefined,
);
});
});
describe('On transaction suggested by dapp', function () {
let txMeta;
before(function () {
txMeta = {
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
txParams: {
from: fromAccount.address,
to: '0x1678a085c290ebd122dc42cba69373b5953b831d',
gasPrice: '0x77359400',
gas: '0x7b0d',
nonce: '0x4b',
},
type: TRANSACTION_TYPES.SIMPLE_SEND,
origin: 'other',
chainId: currentChainId,
time: 1624408066355,
metamaskNetworkId: currentNetworkId,
defaultGasEstimates: {
gas: '0x7b0d',
gasPrice: '0x77359400',
},
};
});
it('should create an event fragment when transaction added', async function () {
const expectedPayload = {
initialEvent: 'Transaction Added',
successEvent: 'Transaction Approved',
failureEvent: 'Transaction Rejected',
uniqueIdentifier: 'transaction-added-1',
category: 'Transactions',
persist: true,
properties: {
chain_id: '0x2a',
eip_1559_version: '0',
gas_edit_attempted: 'none',
gas_edit_type: 'none',
network: '42',
referrer: 'other',
source: 'dapp',
type: TRANSACTION_TYPES.SIMPLE_SEND,
},
sensitiveProperties: {
default_gas: '0.000031501',
default_gas_price: '2',
gas_price: '2',
gas_limit: '0x7b0d',
first_seen: 1624408066355,
transaction_envelope_type: TRANSACTION_ENVELOPE_TYPE_NAMES.LEGACY,
status: 'unapproved',
},
};
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.ADDED,
);
assert.equal(createEventFragmentSpy.callCount, 1);
assert.equal(finalizeEventFragmentSpy.callCount, 0);
assert.deepEqual(
createEventFragmentSpy.getCall(0).args[0],
expectedPayload,
);
});
it('Should finalize the transaction added fragment as abandoned if user rejects transaction', async function () {
fragmentExists = true;
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.REJECTED,
);
assert.equal(createEventFragmentSpy.callCount, 0);
assert.equal(finalizeEventFragmentSpy.callCount, 1);
assert.deepEqual(
finalizeEventFragmentSpy.getCall(0).args[0],
'transaction-added-1',
);
assert.deepEqual(finalizeEventFragmentSpy.getCall(0).args[1], {
abandoned: true,
});
});
it('Should finalize the transaction added fragment if user approves transaction', async function () {
fragmentExists = true;
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.APPROVED,
);
assert.equal(createEventFragmentSpy.callCount, 0);
assert.equal(finalizeEventFragmentSpy.callCount, 1);
assert.deepEqual(
finalizeEventFragmentSpy.getCall(0).args[0],
'transaction-added-1',
);
assert.deepEqual(
finalizeEventFragmentSpy.getCall(0).args[1],
undefined,
);
});
it('should create an event fragment when transaction is submitted', async function () {
const expectedPayload = {
initialEvent: 'Transaction Submitted',
successEvent: 'Transaction Finalized',
uniqueIdentifier: 'transaction-submitted-1',
category: 'Transactions',
persist: true,
properties: {
chain_id: '0x2a',
eip_1559_version: '0',
gas_edit_attempted: 'none',
gas_edit_type: 'none',
network: '42',
referrer: 'other',
source: 'dapp',
type: TRANSACTION_TYPES.SIMPLE_SEND,
},
sensitiveProperties: {
default_gas: '0.000031501',
default_gas_price: '2',
gas_price: '2',
gas_limit: '0x7b0d',
first_seen: 1624408066355,
transaction_envelope_type: TRANSACTION_ENVELOPE_TYPE_NAMES.LEGACY,
status: 'unapproved',
},
};
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.SUBMITTED,
);
assert.equal(createEventFragmentSpy.callCount, 1);
assert.equal(finalizeEventFragmentSpy.callCount, 0);
assert.deepEqual(
createEventFragmentSpy.getCall(0).args[0],
expectedPayload,
);
});
it('Should finalize the transaction submitted fragment when transaction finalizes', async function () {
fragmentExists = true;
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.FINALIZED,
);
assert.equal(createEventFragmentSpy.callCount, 0);
assert.equal(finalizeEventFragmentSpy.callCount, 1);
assert.deepEqual(
finalizeEventFragmentSpy.getCall(0).args[0],
'transaction-submitted-1',
);
assert.deepEqual(
finalizeEventFragmentSpy.getCall(0).args[1],
undefined,
);
});
});
it('should create missing fragments when events happen out of order or are missing', async function () {
const txMeta = {
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
@ -1560,19 +1909,26 @@ describe('Transaction Controller', function () {
nonce: '0x4b',
},
type: TRANSACTION_TYPES.SIMPLE_SEND,
origin: 'metamask',
origin: 'other',
chainId: currentChainId,
time: 1624408066355,
metamaskNetworkId: currentNetworkId,
};
const expectedPayload = {
event: 'Transaction Added',
successEvent: 'Transaction Approved',
failureEvent: 'Transaction Rejected',
uniqueIdentifier: 'transaction-added-1',
category: 'Transactions',
persist: true,
properties: {
chain_id: '0x2a',
eip_1559_version: '0',
gas_edit_attempted: 'none',
gas_edit_type: 'none',
network: '42',
referrer: 'metamask',
source: 'user',
referrer: 'other',
source: 'dapp',
type: TRANSACTION_TYPES.SIMPLE_SEND,
},
sensitiveProperties: {
@ -1583,19 +1939,24 @@ describe('Transaction Controller', function () {
status: 'unapproved',
},
};
txController._trackTransactionMetricsEvent(
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.ADDED,
TRANSACTION_EVENTS.APPROVED,
);
assert.equal(trackMetaMetricsEventSpy.callCount, 1);
assert.equal(createEventFragmentSpy.callCount, 1);
assert.deepEqual(
trackMetaMetricsEventSpy.getCall(0).args[0],
createEventFragmentSpy.getCall(0).args[0],
expectedPayload,
);
assert.equal(finalizeEventFragmentSpy.callCount, 1);
assert.deepEqual(
finalizeEventFragmentSpy.getCall(0).args[0],
'transaction-added-1',
);
assert.deepEqual(finalizeEventFragmentSpy.getCall(0).args[1], undefined);
});
it('should call _trackMetaMetricsEvent with the correct payload (dapp source)', function () {
it('should call _trackMetaMetricsEvent with the correct payload (extra params)', async function () {
const txMeta = {
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
@ -1613,54 +1974,11 @@ describe('Transaction Controller', function () {
metamaskNetworkId: currentNetworkId,
};
const expectedPayload = {
event: 'Transaction Added',
category: 'Transactions',
properties: {
chain_id: '0x2a',
network: '42',
referrer: 'other',
source: 'dapp',
type: TRANSACTION_TYPES.SIMPLE_SEND,
},
sensitiveProperties: {
gas_price: '2',
gas_limit: '0x7b0d',
first_seen: 1624408066355,
transaction_envelope_type: TRANSACTION_ENVELOPE_TYPE_NAMES.LEGACY,
status: 'unapproved',
},
};
txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.ADDED,
);
assert.equal(trackMetaMetricsEventSpy.callCount, 1);
assert.deepEqual(
trackMetaMetricsEventSpy.getCall(0).args[0],
expectedPayload,
);
});
it('should call _trackMetaMetricsEvent with the correct payload (extra params)', function () {
const txMeta = {
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
txParams: {
from: fromAccount.address,
to: '0x1678a085c290ebd122dc42cba69373b5953b831d',
gasPrice: '0x77359400',
gas: '0x7b0d',
nonce: '0x4b',
},
type: TRANSACTION_TYPES.SIMPLE_SEND,
origin: 'other',
chainId: currentChainId,
time: 1624408066355,
metamaskNetworkId: currentNetworkId,
};
const expectedPayload = {
event: 'Transaction Added',
initialEvent: 'Transaction Added',
successEvent: 'Transaction Approved',
failureEvent: 'Transaction Rejected',
uniqueIdentifier: 'transaction-added-1',
persist: true,
category: 'Transactions',
properties: {
network: '42',
@ -1668,6 +1986,9 @@ describe('Transaction Controller', function () {
source: 'dapp',
type: TRANSACTION_TYPES.SIMPLE_SEND,
chain_id: '0x2a',
eip_1559_version: '0',
gas_edit_attempted: 'none',
gas_edit_type: 'none',
},
sensitiveProperties: {
baz: 3.0,
@ -1680,7 +2001,7 @@ describe('Transaction Controller', function () {
},
};
txController._trackTransactionMetricsEvent(
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.ADDED,
{
@ -1688,14 +2009,15 @@ describe('Transaction Controller', function () {
foo: 'bar',
},
);
assert.equal(trackMetaMetricsEventSpy.callCount, 1);
assert.equal(createEventFragmentSpy.callCount, 1);
assert.equal(finalizeEventFragmentSpy.callCount, 0);
assert.deepEqual(
trackMetaMetricsEventSpy.getCall(0).args[0],
createEventFragmentSpy.getCall(0).args[0],
expectedPayload,
);
});
it('should call _trackMetaMetricsEvent with the correct payload (EIP-1559)', function () {
it('should call _trackMetaMetricsEvent with the correct payload (EIP-1559)', async function () {
const txMeta = {
id: 1,
status: TRANSACTION_STATUSES.UNAPPROVED,
@ -1714,12 +2036,24 @@ describe('Transaction Controller', function () {
chainId: currentChainId,
time: 1624408066355,
metamaskNetworkId: currentNetworkId,
defaultGasEstimates: {
estimateType: 'medium',
maxFeePerGas: '0x77359400',
maxPriorityFeePerGas: '0x77359400',
},
};
const expectedPayload = {
event: 'Transaction Added',
initialEvent: 'Transaction Added',
successEvent: 'Transaction Approved',
failureEvent: 'Transaction Rejected',
uniqueIdentifier: 'transaction-added-1',
persist: true,
category: 'Transactions',
properties: {
chain_id: '0x2a',
eip_1559_version: '1',
gas_edit_attempted: 'none',
gas_edit_type: 'none',
network: '42',
referrer: 'other',
source: 'dapp',
@ -1736,10 +2070,13 @@ describe('Transaction Controller', function () {
status: 'unapproved',
estimate_suggested: GAS_RECOMMENDATIONS.MEDIUM,
estimate_used: GAS_RECOMMENDATIONS.HIGH,
default_estimate: 'medium',
default_max_fee_per_gas: '70',
default_max_priority_fee_per_gas: '7',
},
};
txController._trackTransactionMetricsEvent(
await txController._trackTransactionMetricsEvent(
txMeta,
TRANSACTION_EVENTS.ADDED,
{
@ -1747,9 +2084,10 @@ describe('Transaction Controller', function () {
foo: 'bar',
},
);
assert.equal(trackMetaMetricsEventSpy.callCount, 1);
assert.equal(createEventFragmentSpy.callCount, 1);
assert.equal(finalizeEventFragmentSpy.callCount, 0);
assert.deepEqual(
trackMetaMetricsEventSpy.getCall(0).args[0],
createEventFragmentSpy.getCall(0).args[0],
expectedPayload,
);
});

View File

@ -117,6 +117,8 @@ export default class TransactionStateManager extends EventEmitter {
time: new Date().getTime(),
status: TRANSACTION_STATUSES.UNAPPROVED,
metamaskNetworkId: netId,
originalGasEstimate: opts.txParams?.gas,
userEditedGasLimit: false,
chainId,
loadingDefaults: true,
dappSuggestedGasFees,

View File

@ -1,75 +0,0 @@
import nock from 'nock';
import {
KOVAN_CHAIN_ID,
MAINNET_CHAIN_ID,
RINKEBY_CHAIN_ID,
ROPSTEN_CHAIN_ID,
} from '../../../shared/constants/network';
import { TRANSAK_API_KEY } from '../constants/on-ramp';
import { SWAPS_API_V2_BASE_URL } from '../../../shared/constants/swaps';
import getBuyEthUrl from './buy-eth-url';
const WYRE_ACCOUNT_ID = 'AC-7AG3W4XH4N2';
const ETH_ADDRESS = '0x0dcd5d886577d5581b0c524242ef2ee70be3e7bc';
const MAINNET = {
chainId: MAINNET_CHAIN_ID,
amount: 5,
address: ETH_ADDRESS,
};
const ROPSTEN = {
chainId: ROPSTEN_CHAIN_ID,
};
const RINKEBY = {
chainId: RINKEBY_CHAIN_ID,
};
const KOVAN = {
chainId: KOVAN_CHAIN_ID,
};
describe('buy-eth-url', () => {
it('returns Wyre url with an ETH address for Ethereum mainnet', async () => {
nock(SWAPS_API_V2_BASE_URL)
.get(
`/networks/1/fiatOnRampUrl?serviceName=wyre&destinationAddress=${ETH_ADDRESS}`,
)
.reply(200, {
url: `https://pay.sendwyre.com/purchase?accountId=${WYRE_ACCOUNT_ID}&utm_campaign=${WYRE_ACCOUNT_ID}&destCurrency=ETH&utm_medium=widget&paymentMethod=debit-card&reservation=MLZVUF8FMXZUMARJC23B&dest=ethereum%3A${ETH_ADDRESS}&utm_source=checkout`,
});
const wyreUrl = await getBuyEthUrl(MAINNET);
expect(wyreUrl).toStrictEqual(
`https://pay.sendwyre.com/purchase?accountId=${WYRE_ACCOUNT_ID}&utm_campaign=${WYRE_ACCOUNT_ID}&destCurrency=ETH&utm_medium=widget&paymentMethod=debit-card&reservation=MLZVUF8FMXZUMARJC23B&dest=ethereum%3A${ETH_ADDRESS}&utm_source=checkout`,
);
nock.cleanAll();
});
it('returns a fallback Wyre url if /orders/reserve API call fails', async () => {
const wyreUrl = await getBuyEthUrl(MAINNET);
expect(wyreUrl).toStrictEqual(
`https://pay.sendwyre.com/purchase?dest=ethereum:${ETH_ADDRESS}&destCurrency=ETH&accountId=${WYRE_ACCOUNT_ID}&paymentMethod=debit-card`,
);
});
it('returns Transak url with an ETH address for Ethereum mainnet', async () => {
const transakUrl = await getBuyEthUrl({ ...MAINNET, service: 'transak' });
expect(transakUrl).toStrictEqual(
`https://global.transak.com/?apiKey=${TRANSAK_API_KEY}&hostURL=https%3A%2F%2Fmetamask.io&defaultCryptoCurrency=ETH&walletAddress=${ETH_ADDRESS}`,
);
});
it('returns metamask ropsten faucet for network 3', async () => {
const ropstenUrl = await getBuyEthUrl(ROPSTEN);
expect(ropstenUrl).toStrictEqual('https://faucet.metamask.io/');
});
it('returns rinkeby dapp for network 4', async () => {
const rinkebyUrl = await getBuyEthUrl(RINKEBY);
expect(rinkebyUrl).toStrictEqual('https://www.rinkeby.io/');
});
it('returns kovan github test faucet for network 42', async () => {
const kovanUrl = await getBuyEthUrl(KOVAN);
expect(kovanUrl).toStrictEqual('https://github.com/kovan-testnet/faucet');
});
});

View File

@ -8,6 +8,7 @@ import {
RINKEBY_CHAIN_ID,
ROPSTEN_CHAIN_ID,
MAINNET_NETWORK_ID,
BUYABLE_CHAINS_MAP,
} from '../../../shared/constants/network';
import { SECOND } from '../../../shared/constants/time';
import getFetchWithTimeout from '../../../shared/modules/fetch-with-timeout';
@ -47,16 +48,22 @@ const createWyrePurchaseUrl = async (address) => {
* Create a Transak Checkout URL.
* API docs here: https://www.notion.so/Query-Parameters-9ec523df3b874ec58cef4fa3a906f238
*
* @param {string} address - Ethereum destination address
* @param {string} walletAddress - Ethereum destination address
* @param {string} chainId - Current chain ID
* @returns String
*/
const createTransakUrl = (address) => {
const createTransakUrl = (walletAddress, chainId) => {
const { transakCurrencies, network } = BUYABLE_CHAINS_MAP[chainId];
const queryParams = new URLSearchParams({
apiKey: TRANSAK_API_KEY,
hostURL: 'https://metamask.io',
defaultCryptoCurrency: 'ETH',
walletAddress: address,
cryptoCurrencyList: transakCurrencies.join(','),
defaultCryptoCurrency: transakCurrencies[0],
networks: network,
walletAddress,
});
return `https://global.transak.com/?${queryParams}`;
};
@ -70,7 +77,7 @@ const createTransakUrl = (address) => {
* @returns {string|undefined} The url at which the user can access ETH, while in the given chain. If the passed
* chainId does not match any of the specified cases, or if no chainId is given, returns undefined.
*/
export default async function getBuyEthUrl({ chainId, address, service }) {
export default async function getBuyUrl({ chainId, address, service }) {
// default service by network if not specified
if (!service) {
// eslint-disable-next-line no-param-reassign
@ -81,7 +88,7 @@ export default async function getBuyEthUrl({ chainId, address, service }) {
case 'wyre':
return await createWyrePurchaseUrl(address);
case 'transak':
return createTransakUrl(address);
return createTransakUrl(address, chainId);
case 'metamask-faucet':
return 'https://faucet.metamask.io/';
case 'rinkeby-faucet':

View File

@ -0,0 +1,117 @@
import nock from 'nock';
import {
KOVAN_CHAIN_ID,
MAINNET_CHAIN_ID,
RINKEBY_CHAIN_ID,
ROPSTEN_CHAIN_ID,
BSC_CHAIN_ID,
POLYGON_CHAIN_ID,
ETH_SYMBOL,
BUYABLE_CHAINS_MAP,
} from '../../../shared/constants/network';
import { TRANSAK_API_KEY } from '../constants/on-ramp';
import { SWAPS_API_V2_BASE_URL } from '../../../shared/constants/swaps';
import getBuyUrl from './buy-url';
const WYRE_ACCOUNT_ID = 'AC-7AG3W4XH4N2';
const ETH_ADDRESS = '0x0dcd5d886577d5581b0c524242ef2ee70be3e7bc';
const MAINNET = {
chainId: MAINNET_CHAIN_ID,
amount: 5,
address: ETH_ADDRESS,
};
const ROPSTEN = {
chainId: ROPSTEN_CHAIN_ID,
};
const RINKEBY = {
chainId: RINKEBY_CHAIN_ID,
};
const KOVAN = {
chainId: KOVAN_CHAIN_ID,
};
const BSC = {
chainId: BSC_CHAIN_ID,
amount: 5,
address: ETH_ADDRESS,
};
const POLYGON = {
chainId: POLYGON_CHAIN_ID,
amount: 5,
address: ETH_ADDRESS,
};
describe('buy-url', () => {
it('returns Wyre url with an ETH address for Ethereum mainnet', async () => {
nock(SWAPS_API_V2_BASE_URL)
.get(
`/networks/1/fiatOnRampUrl?serviceName=wyre&destinationAddress=${ETH_ADDRESS}`,
)
.reply(200, {
url: `https://pay.sendwyre.com/purchase?accountId=${WYRE_ACCOUNT_ID}&utm_campaign=${WYRE_ACCOUNT_ID}&destCurrency=${ETH_SYMBOL}&utm_medium=widget&paymentMethod=debit-card&reservation=MLZVUF8FMXZUMARJC23B&dest=ethereum%3A${ETH_ADDRESS}&utm_source=checkout`,
});
const wyreUrl = await getBuyUrl(MAINNET);
expect(wyreUrl).toStrictEqual(
`https://pay.sendwyre.com/purchase?accountId=${WYRE_ACCOUNT_ID}&utm_campaign=${WYRE_ACCOUNT_ID}&destCurrency=${ETH_SYMBOL}&utm_medium=widget&paymentMethod=debit-card&reservation=MLZVUF8FMXZUMARJC23B&dest=ethereum%3A${ETH_ADDRESS}&utm_source=checkout`,
);
nock.cleanAll();
});
it('returns a fallback Wyre url if /orders/reserve API call fails', async () => {
const wyreUrl = await getBuyUrl(MAINNET);
expect(wyreUrl).toStrictEqual(
`https://pay.sendwyre.com/purchase?dest=ethereum:${ETH_ADDRESS}&destCurrency=${ETH_SYMBOL}&accountId=${WYRE_ACCOUNT_ID}&paymentMethod=debit-card`,
);
});
it('returns Transak url with an ETH address for Ethereum mainnet', async () => {
const transakUrl = await getBuyUrl({ ...MAINNET, service: 'transak' });
const buyableChain = BUYABLE_CHAINS_MAP[MAINNET.chainId];
const buyableCurrencies = encodeURIComponent(
buyableChain.transakCurrencies.join(','),
);
expect(transakUrl).toStrictEqual(
`https://global.transak.com/?apiKey=${TRANSAK_API_KEY}&hostURL=https%3A%2F%2Fmetamask.io&cryptoCurrencyList=${buyableCurrencies}&defaultCryptoCurrency=${buyableChain.transakCurrencies[0]}&networks=${buyableChain.network}&walletAddress=${ETH_ADDRESS}`,
);
});
it('returns Transak url with an BNB address for Binance Smart Chain', async () => {
const transakUrl = await getBuyUrl({ ...BSC, service: 'transak' });
const buyableChain = BUYABLE_CHAINS_MAP[BSC.chainId];
const buyableCurrencies = encodeURIComponent(
buyableChain.transakCurrencies.join(','),
);
expect(transakUrl).toStrictEqual(
`https://global.transak.com/?apiKey=${TRANSAK_API_KEY}&hostURL=https%3A%2F%2Fmetamask.io&cryptoCurrencyList=${buyableCurrencies}&defaultCryptoCurrency=${buyableChain.transakCurrencies[0]}&networks=${buyableChain.network}&walletAddress=${ETH_ADDRESS}`,
);
});
it('returns Transak url with an MATIC address for Polygon', async () => {
const transakUrl = await getBuyUrl({ ...POLYGON, service: 'transak' });
const buyableChain = BUYABLE_CHAINS_MAP[POLYGON.chainId];
const buyableCurrencies = encodeURIComponent(
buyableChain.transakCurrencies.join(','),
);
expect(transakUrl).toStrictEqual(
`https://global.transak.com/?apiKey=${TRANSAK_API_KEY}&hostURL=https%3A%2F%2Fmetamask.io&cryptoCurrencyList=${buyableCurrencies}&defaultCryptoCurrency=${buyableChain.transakCurrencies[0]}&networks=${buyableChain.network}&walletAddress=${ETH_ADDRESS}`,
);
});
it('returns metamask ropsten faucet for network 3', async () => {
const ropstenUrl = await getBuyUrl(ROPSTEN);
expect(ropstenUrl).toStrictEqual('https://faucet.metamask.io/');
});
it('returns rinkeby dapp for network 4', async () => {
const rinkebyUrl = await getBuyUrl(RINKEBY);
expect(rinkebyUrl).toStrictEqual('https://www.rinkeby.io/');
});
it('returns kovan github test faucet for network 42', async () => {
const kovanUrl = await getBuyUrl(KOVAN);
expect(kovanUrl).toStrictEqual('https://github.com/kovan-testnet/faucet');
});
});

View File

@ -1,3 +1,6 @@
///: BEGIN:ONLY_INCLUDE_IN(flask)
import { handlers as permittedSnapMethods } from '@metamask/rpc-methods/dist/permitted';
///: END:ONLY_INCLUDE_IN
import { flatten } from 'lodash';
import { permissionRpcMethods } from '@metamask/snap-controllers';
import { selectHooks } from '@metamask/rpc-methods';
@ -30,7 +33,7 @@ const expectedHookNames = Array.from(
* controllers.
* @returns {(req: Object, res: Object, next: Function, end: Function) => void}
*/
export default function createMethodMiddleware(hooks) {
export function createMethodMiddleware(hooks) {
// Fail immediately if we forgot to provide any expected hooks.
const missingHookNames = expectedHookNames.filter(
(hookName) => !Object.hasOwnProperty.call(hooks, hookName),
@ -60,6 +63,7 @@ export default function createMethodMiddleware(hooks) {
selectHooks(hooks, hookNames),
);
} catch (error) {
console.error(error);
return end(error);
}
}
@ -67,3 +71,40 @@ export default function createMethodMiddleware(hooks) {
return next();
};
}
///: BEGIN:ONLY_INCLUDE_IN(flask)
const snapHandlerMap = permittedSnapMethods.reduce((map, handler) => {
for (const methodName of handler.methodNames) {
map.set(methodName, handler);
}
return map;
}, new Map());
export function createSnapMethodMiddleware(isSnap, hooks) {
return async function methodMiddleware(req, res, next, end) {
const handler = snapHandlerMap.get(req.method);
if (handler) {
if (/^snap_/iu.test(req.method) && !isSnap) {
return end(ethErrors.rpc.methodNotFound());
}
const { implementation, hookNames } = handler;
try {
// Implementations may or may not be async, so we must await them.
return await implementation(
req,
res,
next,
end,
selectHooks(hooks, hookNames),
);
} catch (error) {
console.error(error);
return end(error);
}
}
return next();
};
}
///: END:ONLY_INCLUDE_IN

View File

@ -1 +1 @@
export { default } from './createMethodMiddleware';
export * from './createMethodMiddleware';

View File

@ -38,7 +38,13 @@ import {
import {
PermissionController,
SubjectMetadataController,
///: BEGIN:ONLY_INCLUDE_IN(flask)
SnapController,
///: END:ONLY_INCLUDE_IN
} from '@metamask/snap-controllers';
///: BEGIN:ONLY_INCLUDE_IN(flask)
import { IframeExecutionService } from '@metamask/iframe-execution-environment-service';
///: END:ONLY_INCLUDE_IN
import {
TRANSACTION_STATUSES,
@ -57,11 +63,17 @@ import {
import {
CaveatTypes,
RestrictedMethods,
///: BEGIN:ONLY_INCLUDE_IN(flask)
EndowmentPermissions,
///: END:ONLY_INCLUDE_IN
} from '../../shared/constants/permissions';
import { UI_NOTIFICATIONS } from '../../shared/notifications';
import { toChecksumHexAddress } from '../../shared/modules/hexstring-utils';
import { MILLISECOND } from '../../shared/constants/time';
import {
///: BEGIN:ONLY_INCLUDE_IN(flask)
MESSAGE_TYPE,
///: END:ONLY_INCLUDE_IN
POLLING_TOKEN_ENVIRONMENT_TYPES,
SUBJECT_TYPES,
} from '../../shared/constants/app';
@ -73,7 +85,12 @@ import { isEqualCaseInsensitive } from '../../ui/helpers/utils/util';
import ComposableObservableStore from './lib/ComposableObservableStore';
import AccountTracker from './lib/account-tracker';
import createLoggerMiddleware from './lib/createLoggerMiddleware';
import createMethodMiddleware from './lib/rpc-method-middleware';
import {
createMethodMiddleware,
///: BEGIN:ONLY_INCLUDE_IN(flask)
createSnapMethodMiddleware,
///: END:ONLY_INCLUDE_IN
} from './lib/rpc-method-middleware';
import createOriginMiddleware from './lib/createOriginMiddleware';
import createTabIdMiddleware from './lib/createTabIdMiddleware';
import createOnboardingMiddleware from './lib/createOnboardingMiddleware';
@ -107,9 +124,13 @@ import {
getPermissionBackgroundApiMethods,
getPermissionSpecifications,
getPermittedAccountsByOrigin,
PermissionLogController,
NOTIFICATION_NAMES,
PermissionLogController,
unrestrictedMethods,
///: BEGIN:ONLY_INCLUDE_IN(flask)
buildSnapEndowmentSpecifications,
buildSnapRestrictedMethodSpecifications,
///: END:ONLY_INCLUDE_IN
} from './controllers/permissions';
export const METAMASK_CONTROLLER_EVENTS = {
@ -220,22 +241,22 @@ export default class MetamaskController extends EventEmitter {
onNetworkStateChange: this.networkController.store.subscribe.bind(
this.networkController.store,
),
getAssetName: this.assetsContractController.getAssetName.bind(
getERC721AssetName: this.assetsContractController.getERC721AssetName.bind(
this.assetsContractController,
),
getAssetSymbol: this.assetsContractController.getAssetSymbol.bind(
getERC721AssetSymbol: this.assetsContractController.getERC721AssetSymbol.bind(
this.assetsContractController,
),
getCollectibleTokenURI: this.assetsContractController.getCollectibleTokenURI.bind(
getERC721TokenURI: this.assetsContractController.getERC721TokenURI.bind(
this.assetsContractController,
),
getOwnerOf: this.assetsContractController.getOwnerOf.bind(
getERC721OwnerOf: this.assetsContractController.getERC721OwnerOf.bind(
this.assetsContractController,
),
balanceOfERC1155Collectible: this.assetsContractController.balanceOfERC1155Collectible.bind(
getERC1155BalanceOf: this.assetsContractController.getERC1155BalanceOf.bind(
this.assetsContractController,
),
uriERC1155Collectible: this.assetsContractController.uriERC1155Collectible.bind(
getERC1155TokenURI: this.assetsContractController.getERC1155TokenURI.bind(
this.assetsContractController,
),
},
@ -243,6 +264,8 @@ export default class MetamaskController extends EventEmitter {
initState.CollectiblesController,
);
this.collectiblesController.setApiKey(process.env.OPENSEA_KEY);
process.env.COLLECTIBLES_V1 &&
(this.collectibleDetectionController = new CollectibleDetectionController(
{
@ -498,36 +521,41 @@ export default class MetamaskController extends EventEmitter {
}),
state: initState.PermissionController,
caveatSpecifications: getCaveatSpecifications({ getIdentities }),
permissionSpecifications: getPermissionSpecifications({
getIdentities,
getAllAccounts: this.keyringController.getAccounts.bind(
this.keyringController,
),
captureKeyringTypesWithMissingIdentities: (
identities = {},
accounts = [],
) => {
const accountsMissingIdentities = accounts.filter(
(address) => !identities[address],
);
const keyringTypesWithMissingIdentities = accountsMissingIdentities.map(
(address) =>
this.keyringController.getKeyringForAccount(address)?.type,
);
permissionSpecifications: {
...getPermissionSpecifications({
getIdentities,
getAllAccounts: this.keyringController.getAccounts.bind(
this.keyringController,
),
captureKeyringTypesWithMissingIdentities: (
identities = {},
accounts = [],
) => {
const accountsMissingIdentities = accounts.filter(
(address) => !identities[address],
);
const keyringTypesWithMissingIdentities = accountsMissingIdentities.map(
(address) =>
this.keyringController.getKeyringForAccount(address)?.type,
);
const identitiesCount = Object.keys(identities || {}).length;
const identitiesCount = Object.keys(identities || {}).length;
const accountTrackerCount = Object.keys(
this.accountTracker.store.getState().accounts || {},
).length;
const accountTrackerCount = Object.keys(
this.accountTracker.store.getState().accounts || {},
).length;
captureException(
new Error(
`Attempt to get permission specifications failed because their were ${accounts.length} accounts, but ${identitiesCount} identities, and the ${keyringTypesWithMissingIdentities} keyrings included accounts with missing identities. Meanwhile, there are ${accountTrackerCount} accounts in the account tracker.`,
),
);
},
}),
captureException(
new Error(
`Attempt to get permission specifications failed because their were ${accounts.length} accounts, but ${identitiesCount} identities, and the ${keyringTypesWithMissingIdentities} keyrings included accounts with missing identities. Meanwhile, there are ${accountTrackerCount} accounts in the account tracker.`,
),
);
},
}),
///: BEGIN:ONLY_INCLUDE_IN(flask)
...this.getSnapPermissionSpecifications(),
///: END:ONLY_INCLUDE_IN
},
unrestrictedMethods,
});
@ -545,6 +573,53 @@ export default class MetamaskController extends EventEmitter {
subjectCacheLimit: 100,
});
///: BEGIN:ONLY_INCLUDE_IN(flask)
this.workerController = new IframeExecutionService({
onError: this.onExecutionEnvironmentError.bind(this),
iframeUrl: new URL(
'https://metamask.github.io/iframe-execution-environment/0.3.1',
),
messenger: this.controllerMessenger.getRestricted({
name: 'ExecutionService',
}),
setupSnapProvider: this.setupSnapProvider.bind(this),
});
const snapControllerMessenger = this.controllerMessenger.getRestricted({
name: 'SnapController',
allowedEvents: [
'ExecutionService:unhandledError',
'ExecutionService:unresponsive',
],
allowedActions: [
`${this.permissionController.name}:getEndowments`,
`${this.permissionController.name}:getPermissions`,
`${this.permissionController.name}:hasPermission`,
`${this.permissionController.name}:requestPermissions`,
`${this.permissionController.name}:revokeAllPermissions`,
],
});
this.snapController = new SnapController({
endowmentPermissionNames: Object.values(EndowmentPermissions),
terminateAllSnaps: this.workerController.terminateAllSnaps.bind(
this.workerController,
),
terminateSnap: this.workerController.terminateSnap.bind(
this.workerController,
),
executeSnap: this.workerController.executeSnap.bind(
this.workerController,
),
getRpcMessageHandler: this.workerController.getRpcMessageHandler.bind(
this.workerController,
),
closeAllConnections: this.removeAllConnections.bind(this),
state: initState.SnapController,
messenger: snapControllerMessenger,
});
///: END:ONLY_INCLUDE_IN
this.detectTokensController = new DetectTokensController({
preferences: this.preferencesController,
tokensController: this.tokensController,
@ -601,6 +676,18 @@ export default class MetamaskController extends EventEmitter {
),
provider: this.provider,
blockTracker: this.blockTracker,
createEventFragment: this.metaMetricsController.createEventFragment.bind(
this.metaMetricsController,
),
updateEventFragment: this.metaMetricsController.updateEventFragment.bind(
this.metaMetricsController,
),
finalizeEventFragment: this.metaMetricsController.finalizeEventFragment.bind(
this.metaMetricsController,
),
getEventFragmentById: this.metaMetricsController.getEventFragmentById.bind(
this.metaMetricsController,
),
trackMetaMetricsEvent: this.metaMetricsController.trackEvent.bind(
this.metaMetricsController,
),
@ -660,8 +747,7 @@ export default class MetamaskController extends EventEmitter {
this.collectiblesController.checkAndUpdateSingleCollectibleOwnershipStatus(
knownCollectible,
false,
// TODO add this when checkAndUpdateSingleCollectibleOwnershipStatus is updated
// { userAddress, chainId },
{ userAddress, chainId },
);
}
}
@ -786,6 +872,9 @@ export default class MetamaskController extends EventEmitter {
TokenListController: this.tokenListController,
TokensController: this.tokensController,
CollectiblesController: this.collectiblesController,
///: BEGIN:ONLY_INCLUDE_IN(flask)
SnapController: this.snapController,
///: END:ONLY_INCLUDE_IN
});
this.memStore = new ComposableObservableStore({
@ -822,6 +911,9 @@ export default class MetamaskController extends EventEmitter {
TokenListController: this.tokenListController,
TokensController: this.tokensController,
CollectiblesController: this.collectiblesController,
///: BEGIN:ONLY_INCLUDE_IN(flask)
SnapController: this.snapController,
///: END:ONLY_INCLUDE_IN
},
controllerMessenger: this.controllerMessenger,
});
@ -853,6 +945,58 @@ export default class MetamaskController extends EventEmitter {
this.publicConfigStore = this.createPublicConfigStore();
}
///: BEGIN:ONLY_INCLUDE_IN(flask)
/**
* Constructor helper for getting Snap permission specifications.
*/
getSnapPermissionSpecifications() {
return {
...buildSnapEndowmentSpecifications(),
...buildSnapRestrictedMethodSpecifications({
addSnap: this.controllerMessenger.call.bind(
this.controllerMessenger,
'SnapController:add',
),
clearSnapState: (fromSubject) =>
this.controllerMessenger(
'SnapController:updateSnap',
fromSubject,
{},
),
getMnemonic: this.getPrimaryKeyringMnemonic.bind(this),
getSnap: this.controllerMessenger.call.bind(
this.controllerMessenger,
'SnapController:get',
),
getSnapRpcHandler: this.controllerMessenger.call.bind(
this.controllerMessenger,
'SnapController:getRpcMessageHandler',
),
getSnapState: async (...args) => {
// TODO:flask Just return the action result directly in the next
// @metamask/snap-controllers update.
return (
(await this.controllerMessenger.call(
'SnapController:getSnapState',
...args,
)) ?? null
);
},
showConfirmation: (origin, confirmationData) =>
this.approvalController.addAndShowApprovalRequest({
origin,
type: MESSAGE_TYPE.SNAP_CONFIRM,
requestData: confirmationData,
}),
updateSnapState: this.controllerMessenger.call.bind(
this.controllerMessenger,
'SnapController:updateSnapState',
),
}),
};
}
///: END:ONLY_INCLUDE_IN
/**
* Sets up BaseController V2 event subscriptions. Currently, this includes
* the subscriptions necessary to notify permission subjects of account
@ -916,6 +1060,39 @@ export default class MetamaskController extends EventEmitter {
},
getPermittedAccountsByOrigin,
);
///: BEGIN:ONLY_INCLUDE_IN(flask)
// Record Snap metadata whenever a Snap is added to state.
this.controllerMessenger.subscribe(
`${this.snapController.name}:snapAdded`,
(snapId, snap, svgIcon = null) => {
const {
manifest: { proposedName },
version,
} = snap;
this.subjectMetadataController.addSubjectMetadata({
subjectType: SUBJECT_TYPES.SNAP,
name: proposedName,
origin: snapId,
version,
svgIcon,
});
},
);
this.controllerMessenger.subscribe(
`${this.snapController.name}:snapInstalled`,
(snapId) => {
this.metaMetricsController.trackEvent({
event: 'Snap Installed',
category: 'Snaps',
properties: {
snap_id: snapId,
},
});
},
);
///: END:ONLY_INCLUDE_IN
}
/**
@ -1064,6 +1241,7 @@ export default class MetamaskController extends EventEmitter {
appStateController,
collectiblesController,
collectibleDetectionController,
assetsContractController,
currencyRateController,
detectTokensController,
ensController,
@ -1212,6 +1390,14 @@ export default class MetamaskController extends EventEmitter {
setAdvancedGasFee: preferencesController.setAdvancedGasFee.bind(
preferencesController,
),
setEIP1559V2Enabled: preferencesController.setEIP1559V2Enabled.bind(
preferencesController,
),
// AssetsContractController
getTokenStandardAndDetails: assetsContractController.getTokenStandardAndDetails.bind(
assetsContractController,
),
// CollectiblesController
addCollectible: collectiblesController.addCollectible.bind(
@ -1270,6 +1456,12 @@ export default class MetamaskController extends EventEmitter {
setCollectiblesDetectionNoticeDismissed: appStateController.setCollectiblesDetectionNoticeDismissed.bind(
appStateController,
),
setEnableEIP1559V2NoticeDismissed: appStateController.setEnableEIP1559V2NoticeDismissed.bind(
appStateController,
),
updateCollectibleDropDownState: appStateController.updateCollectibleDropDownState.bind(
appStateController,
),
// EnsController
tryReverseResolveAddress: ensController.reverseResolveAddress.bind(
ensController,
@ -1294,6 +1486,10 @@ export default class MetamaskController extends EventEmitter {
addUnapprovedTransaction: txController.addUnapprovedTransaction.bind(
txController,
),
createTransactionEventFragment: txController.createTransactionEventFragment.bind(
txController,
),
getTransactions: txController.getTransactions.bind(txController),
// messageManager
signMessage: this.signMessage.bind(this),
@ -1368,6 +1564,16 @@ export default class MetamaskController extends EventEmitter {
),
...getPermissionBackgroundApiMethods(permissionController),
///: BEGIN:ONLY_INCLUDE_IN(flask)
// snaps
removeSnapError: this.snapController.removeSnapError.bind(
this.snapController,
),
disableSnap: this.snapController.disableSnap.bind(this.snapController),
enableSnap: this.snapController.enableSnap.bind(this.snapController),
removeSnap: this.removeSnap.bind(this),
///: END:ONLY_INCLUDE_IN
// swaps
fetchAndSetQuotes: swapsController.fetchAndSetQuotes.bind(
swapsController,
@ -1426,6 +1632,15 @@ export default class MetamaskController extends EventEmitter {
trackMetaMetricsPage: metaMetricsController.trackPage.bind(
metaMetricsController,
),
createEventFragment: metaMetricsController.createEventFragment.bind(
metaMetricsController,
),
updateEventFragment: metaMetricsController.updateEventFragment.bind(
metaMetricsController,
),
finalizeEventFragment: metaMetricsController.finalizeEventFragment.bind(
metaMetricsController,
),
// approval controller
resolvePendingApproval: approvalController.accept.bind(
@ -1785,6 +2000,17 @@ export default class MetamaskController extends EventEmitter {
this.preferencesController.setSelectedAddress(address);
}
/**
* Gets the mnemonic of the user's primary keyring.
*/
getPrimaryKeyringMnemonic() {
const keyring = this.keyringController.getKeyringsByType('HD Key Tree')[0];
if (!keyring.mnemonic) {
throw new Error('Primary keyring mnemonic unavailable.');
}
return keyring.mnemonic;
}
//
// Hardware
//
@ -2160,6 +2386,32 @@ export default class MetamaskController extends EventEmitter {
return await promise;
}
///: BEGIN:ONLY_INCLUDE_IN(flask)
/**
* Gets an "app key" corresponding to an Ethereum address. An app key is more
* or less an addrdess hashed together with some string, in this case a
* subject identifier / origin.
*
* @todo Figure out a way to derive app keys that doesn't depend on the user's
* Ethereum addresses.
* @param {string} subject - The identifier of the subject whose app key to
* retrieve.
* @param {string} [requestedAccount] - The account whose app key to retrieve.
* The first account in the keyring will be used by default.
*/
async getAppKeyForSubject(subject, requestedAccount) {
let account;
if (requestedAccount) {
account = requestedAccount;
} else {
account = (await this.keyringController.getAccounts())[0];
}
return this.keyringController.exportAppKeyForAddress(account, subject);
}
///: END:ONLY_INCLUDE_IN
/**
* Signifies user intent to complete an eth_sign method.
*
@ -2630,32 +2882,59 @@ export default class MetamaskController extends EventEmitter {
* @property {string} - The URL of the page or frame hosting the script that sent the message.
*/
/**
* A Snap sender object.
*
* @typedef {Object} SnapSender
* @property {string} snapId - The ID of the snap.
*/
/**
* Used to create a multiplexed stream for connecting to an untrusted context
* like a Dapp or other extension.
*
* @param {*} connectionStream - The Duplex stream to connect to.
* @param {MessageSender} sender - The sender of the messages on this stream
* @param options - Options bag.
* @param {ReadableStream} options.connectionStream - The Duplex stream to connect to.
* @param {MessageSender | SnapSender} options.sender - The sender of the messages on this stream.
* @param {string} [options.subjectType] - The type of the sender, i.e. subject.
*/
setupUntrustedCommunication(connectionStream, sender) {
setupUntrustedCommunication({ connectionStream, sender, subjectType }) {
const { usePhishDetect } = this.preferencesController.store.getState();
const { hostname } = new URL(sender.url);
// Check if new connection is blocked if phishing detection is on
if (usePhishDetect && this.phishingController.test(hostname)) {
log.debug('MetaMask - sending phishing warning for', hostname);
this.sendPhishingWarning(connectionStream, hostname);
return;
let _subjectType;
if (subjectType) {
_subjectType = subjectType;
} else if (sender.id && sender.id !== this.extension.runtime.id) {
_subjectType = SUBJECT_TYPES.EXTENSION;
} else {
_subjectType = SUBJECT_TYPES.WEBSITE;
}
if (sender.url) {
const { hostname } = new URL(sender.url);
// Check if new connection is blocked if phishing detection is on
if (usePhishDetect && this.phishingController.test(hostname)) {
log.debug('MetaMask - sending phishing warning for', hostname);
this.sendPhishingWarning(connectionStream, hostname);
return;
}
}
// setup multiplexing
const mux = setupMultiplex(connectionStream);
// messages between inpage and background
this.setupProviderConnection(mux.createStream('metamask-provider'), sender);
this.setupProviderConnection(
mux.createStream('metamask-provider'),
sender,
_subjectType,
);
// TODO:LegacyProvider: Delete
// legacy streams
this.setupPublicConfig(mux.createStream('publicConfig'));
if (sender.url) {
// legacy streams
this.setupPublicConfig(mux.createStream('publicConfig'));
}
}
/**
@ -2672,7 +2951,11 @@ export default class MetamaskController extends EventEmitter {
const mux = setupMultiplex(connectionStream);
// connect features
this.setupControllerConnection(mux.createStream('controller'));
this.setupProviderConnection(mux.createStream('provider'), sender, true);
this.setupProviderConnection(
mux.createStream('provider'),
sender,
SUBJECT_TYPES.INTERNAL,
);
}
/**
@ -2730,18 +3013,26 @@ export default class MetamaskController extends EventEmitter {
* A method for serving our ethereum provider over a given stream.
*
* @param {*} outStream - The stream to provide over.
* @param {MessageSender} sender - The sender of the messages on this stream
* @param {boolean} isInternal - True if this is a connection with an internal process
* @param {MessageSender | SnapSender} sender - The sender of the messages on this stream
* @param {string} subjectType - The type of the sender, i.e. subject.
*/
setupProviderConnection(outStream, sender, isInternal) {
const origin = isInternal ? 'metamask' : new URL(sender.url).origin;
let subjectType = isInternal
? SUBJECT_TYPES.INTERNAL
: SUBJECT_TYPES.WEBSITE;
setupProviderConnection(outStream, sender, subjectType) {
let origin;
if (subjectType === SUBJECT_TYPES.INTERNAL) {
origin = 'metamask';
}
///: BEGIN:ONLY_INCLUDE_IN(flask)
else if (subjectType === SUBJECT_TYPES.SNAP) {
origin = sender.snapId;
}
///: END:ONLY_INCLUDE_IN
else {
origin = new URL(sender.url).origin;
}
if (sender.id !== this.extension.runtime.id) {
subjectType = SUBJECT_TYPES.EXTENSION;
this.subjectMetadataController.addSubjectMetadata(origin, {
if (sender.id && sender.id !== this.extension.runtime.id) {
this.subjectMetadataController.addSubjectMetadata({
origin,
extensionId: sender.id,
subjectType: SUBJECT_TYPES.EXTENSION,
});
@ -2754,9 +3045,9 @@ export default class MetamaskController extends EventEmitter {
const engine = this.setupProviderEngine({
origin,
location: sender.url,
tabId,
sender,
subjectType,
tabId,
});
// setup connection
@ -2778,19 +3069,46 @@ export default class MetamaskController extends EventEmitter {
});
}
///: BEGIN:ONLY_INCLUDE_IN(flask)
/**
* For snaps running in workers.
*
* @param snapId
* @param error
*/
onExecutionEnvironmentError(snapId, error) {
this.snapController.stopPlugin(snapId);
this.snapController.addSnapError(error);
}
/**
* For snaps running in workers.
*
* @param snapId
* @param connectionStream
*/
setupSnapProvider(snapId, connectionStream) {
this.setupUntrustedCommunication({
connectionStream,
sender: { snapId },
subjectType: SUBJECT_TYPES.SNAP,
});
}
///: END:ONLY_INCLUDE_IN
/**
* A method for creating a provider that is safely restricted for the requesting subject.
*
* @param {Object} options - Provider engine options
* @param {string} options.origin - The origin of the sender
* @param {string} options.location - The full URL of the sender
* @param {MessageSender | SnapSender} options.sender - The sender object.
* @param {string} options.subjectType - The type of the sender subject.
* @param {tabId} [options.tabId] - The tab ID of the sender - if the sender is within a tab
*/
setupProviderEngine({ origin, location, subjectType, tabId }) {
setupProviderEngine({ origin, subjectType, sender, tabId }) {
// setup json rpc engine stack
const engine = new JsonRpcEngine();
const { provider, blockTracker } = this;
const { blockTracker, provider } = this;
// create filter polyfill middleware
const filterMiddleware = createFilterMiddleware({ provider, blockTracker });
@ -2806,19 +3124,27 @@ export default class MetamaskController extends EventEmitter {
// append origin to each request
engine.push(createOriginMiddleware({ origin }));
// append tabId to each request if it exists
if (tabId) {
engine.push(createTabIdMiddleware({ tabId }));
}
// logging
engine.push(createLoggerMiddleware({ origin }));
engine.push(
createOnboardingMiddleware({
location,
registerOnboarding: this.onboardingController.registerOnboarding,
}),
);
engine.push(this.permissionLogController.createMiddleware());
// onboarding
if (subjectType === SUBJECT_TYPES.WEBSITE) {
engine.push(
createOnboardingMiddleware({
location: sender.url,
registerOnboarding: this.onboardingController.registerOnboarding,
}),
);
}
// Unrestricted/permissionless RPC method implementations
engine.push(
createMethodMiddleware({
origin,
@ -2906,6 +3232,34 @@ export default class MetamaskController extends EventEmitter {
),
}),
);
///: BEGIN:ONLY_INCLUDE_IN(flask)
engine.push(
createSnapMethodMiddleware(subjectType === SUBJECT_TYPES.SNAP, {
getAppKey: this.getAppKeyForSubject.bind(this, origin),
getSnaps: this.snapController.getPermittedSnaps.bind(
this.snapController,
origin,
),
requestPermissions: async (requestedPermissions) => {
const [
approvedPermissions,
] = await this.permissionController.requestPermissions(
{ origin },
requestedPermissions,
);
return Object.values(approvedPermissions);
},
getAccounts: this.getPermittedAccounts.bind(this, origin),
installSnaps: this.snapController.installSnaps.bind(
this.snapController,
origin,
),
}),
);
///: END:ONLY_INCLUDE_IN
// filter and subscription polyfills
engine.push(filterMiddleware);
engine.push(subscriptionManager.middleware);
@ -2917,6 +3271,7 @@ export default class MetamaskController extends EventEmitter {
}),
);
}
// forward to metamask primary provider
engine.push(providerAsMiddleware(provider));
return engine;
@ -2991,6 +3346,24 @@ export default class MetamaskController extends EventEmitter {
}
}
/**
* Closes all connections for the given origin, and removes the references
* to them.
* Ignores unknown origins.
*
* @param {string} origin - The origin string.
*/
removeAllConnections(origin) {
const connections = this.connections[origin];
if (!connections) {
return;
}
Object.keys(connections).forEach((id) => {
this.removeConnection(origin, id);
});
}
/**
* Causes the RPC engines associated with the connections to the given origin
* to emit a notification event with the given payload.
@ -3444,4 +3817,23 @@ export default class MetamaskController extends EventEmitter {
}
return this.keyringController.setLocked();
}
///: BEGIN:ONLY_INCLUDE_IN(flask)
// SNAPS
/**
* Removes the specified snap, and all of its associated permissions.
* If we didn't revoke the permission to access the snap from all subjects,
* they could just reinstall without any confirmation.
*
* TODO: This should be implemented in `SnapController.removeSnap` via a controller action.
*
* @param {{ id: string, permissionName: string }} snap - The wrapper object of the snap to remove.
*/
removeSnap(snap) {
this.snapController.removeSnap(snap.id);
this.permissionController.revokePermissionForAllSubjects(
snap.permissionName,
);
}
///: END:ONLY_INCLUDE_IN
}

View File

@ -995,10 +995,10 @@ describe('MetaMaskController', function () {
cb();
});
metamaskController.setupUntrustedCommunication(
streamTest,
phishingMessageSender,
);
metamaskController.setupUntrustedCommunication({
connectionStream: streamTest,
sender: phishingMessageSender,
});
await promise;
streamTest.end();
});
@ -1016,7 +1016,10 @@ describe('MetaMaskController', function () {
cb();
});
metamaskController.setupUntrustedCommunication(streamTest, messageSender);
metamaskController.setupUntrustedCommunication({
connectionStream: streamTest,
sender: messageSender,
});
const message = {
id: 1999133338649204,
@ -1055,7 +1058,10 @@ describe('MetaMaskController', function () {
cb();
});
metamaskController.setupUntrustedCommunication(streamTest, messageSender);
metamaskController.setupUntrustedCommunication({
connectionStream: streamTest,
sender: messageSender,
});
const message = {
id: 1999133338649204,

View File

@ -34,7 +34,6 @@ const metamaskrc = require('rc')('metamask', {
INFURA_PROD_PROJECT_ID: process.env.INFURA_PROD_PROJECT_ID,
ONBOARDING_V2: process.env.ONBOARDING_V2,
COLLECTIBLES_V1: process.env.COLLECTIBLES_V1,
EIP_1559_V2: process.env.EIP_1559_V2,
SEGMENT_HOST: process.env.SEGMENT_HOST,
SEGMENT_WRITE_KEY: process.env.SEGMENT_WRITE_KEY,
SEGMENT_BETA_WRITE_KEY: process.env.SEGMENT_BETA_WRITE_KEY,
@ -797,7 +796,6 @@ function getEnvironmentVariables({ buildType, devMode, testing }) {
SWAPS_USE_DEV_APIS: process.env.SWAPS_USE_DEV_APIS === '1',
ONBOARDING_V2: metamaskrc.ONBOARDING_V2 === '1',
COLLECTIBLES_V1: metamaskrc.COLLECTIBLES_V1 === '1',
EIP_1559_V2: metamaskrc.EIP_1559_V2 === '1',
};
}

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