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

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

This commit is contained in:
ryanml 2021-08-26 09:44:23 -07:00
commit 06f1f09e2f
115 changed files with 1666 additions and 825 deletions

View File

@ -304,7 +304,7 @@ jobs:
steps: steps:
- run: - run:
name: Validate changelog name: Validate changelog
command: yarn auto-changelog validate command: yarn lint:changelog
- when: - when:
condition: condition:
matches: matches:
@ -313,7 +313,7 @@ jobs:
steps: steps:
- run: - run:
name: Validate release candidate changelog name: Validate release candidate changelog
command: yarn auto-changelog validate --rc command: yarn lint:changelog:rc
test-deps-audit: test-deps-audit:

View File

@ -22,6 +22,6 @@ jobs:
url-to-cladocument: 'https://metamask.io/cla.html' url-to-cladocument: 'https://metamask.io/cla.html'
# This branch can't have protections, commits are made directly to the specified branch. # This branch can't have protections, commits are made directly to the specified branch.
branch: 'cla-signatures' branch: 'cla-signatures'
allowlist: 'dependabot[bot],metamaskbot,muji' allowlist: 'dependabot[bot],metamaskbot'
allow-organization-members: true allow-organization-members: true
blockchain-storage-flag: false blockchain-storage-flag: false

View File

@ -0,0 +1,65 @@
export const suggestedTokens = {
"0x6b175474e89094c44da98b954eedeac495271d0f": {
"address": "0x6b175474e89094c44da98b954eedeac495271d0f",
"symbol": "META",
"decimals": 18,
"image": "metamark.svg",
"unlisted": false
},
"0xB8c77482e45F1F44dE1745F52C74426C631bDD52": {
"address": "0xB8c77482e45F1F44dE1745F52C74426C631bDD52",
"symbol": "0X",
"decimals": 18,
"image": "0x.svg",
"unlisted": false
},
"0x1f9840a85d5af5bf1d1762f925bdaddc4201f984": {
"address": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
"symbol": "AST",
"decimals": 18,
"image": "ast.png",
"unlisted": false
},
"0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2": {
"address": "0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2",
"symbol": "BAT",
"decimals": 18,
"image": "BAT_icon.svg",
"unlisted": false
},
"0xe83cccfabd4ed148903bf36d4283ee7c8b3494d1": {
"address": "0xe83cccfabd4ed148903bf36d4283ee7c8b3494d1",
"symbol": "CVL",
"decimals": 18,
"image": "CVL_token.svg",
"unlisted": false
},
"0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e": {
"address": "0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e",
"symbol": "GLA",
"decimals": 18,
"image": "gladius.svg",
"unlisted": false
},
"0x467Bccd9d29f223BcE8043b84E8C8B282827790F": {
"address": "0x467Bccd9d29f223BcE8043b84E8C8B282827790F",
"symbol": "GNO",
"decimals": 18,
"image": "gnosis.svg",
"unlisted": false
},
"0xff20817765cb7f73d4bde2e66e067e58d11095c2": {
"address": "0xff20817765cb7f73d4bde2e66e067e58d11095c2",
"symbol": "OMG",
"decimals": 18,
"image": "omg.jpg",
"unlisted": false
},
"0x8e870d67f660d95d5be530380d0ec0bd388289e1": {
"address": "0x8e870d67f660d95d5be530380d0ec0bd388289e1",
"symbol": "WED",
"decimals": 18,
"image": "wed.png",
"unlisted": false
},
}

View File

@ -0,0 +1,56 @@
export const tokens = {
"0x33f90dee07c6e8b9682dd20f73e6c358b2ed0f03": {
"address": "0x33f90dee07c6e8b9682dd20f73e6c358b2ed0f03",
"symbol": "TRDT",
"decimals": 18,
"unlisted": false
},
"0x39013f961c378f02c2b82a6e1d31e9812786fd9d": {
"address": "0x39013f961c378f02c2b82a6e1d31e9812786fd9d",
"symbol": "SMS",
"decimals": 18,
"unlisted": false
},
"0x78b7fada55a64dd895d8c8c35779dd8b67fa8a05": {
"address": "0x78b7fada55a64dd895d8c8c35779dd8b67fa8a05",
"symbol": "ATL",
"decimals": 18,
"unlisted": false
},
"0xfd8971d5e8e1740ce2d0a84095fca4de729d0c16": {
"address": "0xfd8971d5e8e1740ce2d0a84095fca4de729d0c16",
"symbol": "ZLA",
"decimals": 18,
"unlisted": false
},
"0xe83cccfabd4ed148903bf36d4283ee7c8b3494d1": {
"address": "0xe83cccfabd4ed148903bf36d4283ee7c8b3494d1",
"symbol": "BTT",
"decimals": 18,
"unlisted": false
},
"0x7a07e1a0c2514d51132183ecfea2a880ec3b7648": {
"address": "0x7a07e1a0c2514d51132183ecfea2a880ec3b7648",
"symbol": "IXE",
"decimals": 18,
"unlisted": false
},
"0x467Bccd9d29f223BcE8043b84E8C8B282827790F": {
"address": "0x467Bccd9d29f223BcE8043b84E8C8B282827790F",
"symbol": "TEL",
"decimals": 18,
"unlisted": false
},
"0xff20817765cb7f73d4bde2e66e067e58d11095c2": {
"address": "0xff20817765cb7f73d4bde2e66e067e58d11095c2",
"symbol": "AMP",
"decimals": 18,
"unlisted": false
},
"0x15bda08c3afbf5955d6e9b235fd55a1fd0dbc829": {
"address": "0x15bda08c3afbf5955d6e9b235fd55a1fd0dbc829",
"symbol": "APC",
"decimals": 18,
"unlisted": false
},
}

View File

@ -34,8 +34,8 @@ const state = {
} }
}, },
"unapprovedTxs": { "unapprovedTxs": {
"7786962153682822": { "3111025347726181": {
"id": 7786962153682822, "id": 3111025347726181,
"time": 1620710815484, "time": 1620710815484,
"status": "unapproved", "status": "unapproved",
"metamaskNetworkId": "3", "metamaskNetworkId": "3",
@ -43,7 +43,7 @@ const state = {
"loadingDefaults": false, "loadingDefaults": false,
"txParams": { "txParams": {
"from": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4", "from": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"to": "0xad6d458402f60fd3bd25163575031acdce07538d", "to": "0xaD6D458402F60fD3Bd25163575031ACDce07538D",
"value": "0x0", "value": "0x0",
"data": "0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000", "data": "0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000",
"gas": "0xcb28", "gas": "0xcb28",
@ -62,7 +62,7 @@ const state = {
"loadingDefaults": true, "loadingDefaults": true,
"txParams": { "txParams": {
"from": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4", "from": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"to": "0xad6d458402f60fd3bd25163575031acdce07538d", "to": "0xaD6D458402F60fD3Bd25163575031ACDce07538D",
"value": "0x0", "value": "0x0",
"data": "0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000", "data": "0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000",
"gas": "0xcb28", "gas": "0xcb28",
@ -95,11 +95,11 @@ const state = {
} }
}, },
"contractExchangeRates": { "contractExchangeRates": {
"0xad6d458402f60fd3bd25163575031acdce07538d": 0 "0xaD6D458402F60fD3Bd25163575031ACDce07538D": 0
}, },
"tokens": [ "tokens": [
{ {
"address": "0xad6d458402f60fd3bd25163575031acdce07538d", "address": "0xaD6D458402F60fD3Bd25163575031ACDce07538D",
"symbol": "DAI", "symbol": "DAI",
"decimals": 18 "decimals": 18
} }
@ -122,7 +122,7 @@ const state = {
"ensResolution": null, "ensResolution": null,
"ensResolutionError": "", "ensResolutionError": "",
"token": { "token": {
"address": "0xad6d458402f60fd3bd25163575031acdce07538d", "address": "0xaD6D458402F60fD3Bd25163575031ACDce07538D",
"symbol": "DAI", "symbol": "DAI",
"decimals": 18 "decimals": 18
} }
@ -259,7 +259,7 @@ const state = {
], ],
"0x3": [ "0x3": [
{ {
"address": "0xad6d458402f60fd3bd25163575031acdce07538d", "address": "0xaD6D458402F60fD3Bd25163575031ACDce07538D",
"symbol": "DAI", "symbol": "DAI",
"decimals": 18 "decimals": 18
} }
@ -274,7 +274,7 @@ const state = {
} }
}, },
"assetImages": { "assetImages": {
"0xad6d458402f60fd3bd25163575031acdce07538d": "./images/logo.png" "0xaD6D458402F60fD3Bd25163575031ACDce07538D": "./sai.svg"
}, },
"hiddenTokens": [], "hiddenTokens": [],
"suggestedTokens": {}, "suggestedTokens": {},
@ -652,14 +652,14 @@ const state = {
"chainId": "0x3", "chainId": "0x3",
"loadingDefaults": false, "loadingDefaults": false,
"txParams": { "txParams": {
"from": "0x983211ce699ea5ab57cc528086154b6db1ad8e55", "from": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"to": "0xad6d458402f60fd3bd25163575031acdce07538d", "to": "0xaD6D458402F60fD3Bd25163575031ACDce07538D",
"value": "0x0", "value": "0x0",
"data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170", "data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170",
"gas": "0xea60", "gas": "0xea60",
"gasPrice": "0x4a817c800" "gasPrice": "0x4a817c800"
}, },
"type": "standard", "type": "transfer",
"origin": "https://metamask.github.io", "origin": "https://metamask.github.io",
"transactionCategory": "approve", "transactionCategory": "approve",
"history": [ "history": [
@ -672,7 +672,7 @@ const state = {
"loadingDefaults": true, "loadingDefaults": true,
"txParams": { "txParams": {
"from": "0x983211ce699ea5ab57cc528086154b6db1ad8e55", "from": "0x983211ce699ea5ab57cc528086154b6db1ad8e55",
"to": "0xad6d458402f60fd3bd25163575031acdce07538d", "to": "0xaD6D458402F60fD3Bd25163575031ACDce07538D",
"value": "0x0", "value": "0x0",
"data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170", "data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170",
"gas": "0xea60", "gas": "0xea60",

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "አውታረ መረብ አክል" "message": "አውታረ መረብ አክል"
}, },
"addRecipient": {
"message": "ተቀባይ አክል"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "የተጠቆሙ ተለዋጭ ስሞችን አክል" "message": "የተጠቆሙ ተለዋጭ ስሞችን አክል"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "أضف شبكة" "message": "أضف شبكة"
}, },
"addRecipient": {
"message": "إضافة مستلم"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "أضف العملات الرمزية المقترحة" "message": "أضف العملات الرمزية المقترحة"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Добавяне на мрежа" "message": "Добавяне на мрежа"
}, },
"addRecipient": {
"message": "Добавете получател"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Добавете препоръчани жетони" "message": "Добавете препоръчани жетони"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "নেটওয়ার্ক যোগ করুন" "message": "নেটওয়ার্ক যোগ করুন"
}, },
"addRecipient": {
"message": "প্রাপক যোগ করুন"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "প্রস্তাবিত টোকেনগুলি যোগ করুন" "message": "প্রস্তাবিত টোকেনগুলি যোগ করুন"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Afegir Xarxa" "message": "Afegir Xarxa"
}, },
"addRecipient": {
"message": "Afegeix un recipient"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Afegir Fitxes Suggerides" "message": "Afegir Fitxes Suggerides"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Tilføj netværk" "message": "Tilføj netværk"
}, },
"addRecipient": {
"message": "Tilføj modtager"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Tilføj foreslåede tokens" "message": "Tilføj foreslåede tokens"
}, },

View File

@ -35,9 +35,6 @@
"addNetwork": { "addNetwork": {
"message": "Netzwerk hinzufügen" "message": "Netzwerk hinzufügen"
}, },
"addRecipient": {
"message": "Empfänger hinzufügen"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Vorgeschlagene Token hinzufügen" "message": "Vorgeschlagene Token hinzufügen"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Προσθήκη Δικτύου" "message": "Προσθήκη Δικτύου"
}, },
"addRecipient": {
"message": "Προσθήκη Παραλήπτη"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Προσθέστε τα Προτεινόμενα Tokens" "message": "Προσθέστε τα Προτεινόμενα Tokens"
}, },

View File

@ -79,9 +79,6 @@
"addNetwork": { "addNetwork": {
"message": "Add Network" "message": "Add Network"
}, },
"addRecipient": {
"message": "Add Recipient"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Add Suggested Tokens" "message": "Add Suggested Tokens"
}, },
@ -323,10 +320,10 @@
"message": "Confirm password" "message": "Confirm password"
}, },
"confirmSecretBackupPhrase": { "confirmSecretBackupPhrase": {
"message": "Confirm your Secret Backup Phrase" "message": "Confirm your Secret Recovery Phrase"
}, },
"confirmSeedPhrase": { "confirmSeedPhrase": {
"message": "Confirm Seed Phrase" "message": "Confirm Secret Recovery Phrase"
}, },
"confirmed": { "confirmed": {
"message": "Confirmed" "message": "Confirmed"
@ -594,10 +591,10 @@
"message": "Dismiss" "message": "Dismiss"
}, },
"dismissReminderDescriptionField": { "dismissReminderDescriptionField": {
"message": "Turn this on to dismiss the recovery phrase backup reminder message. We highly recommend that you back up your Secret Recovery Phrase to avoid loss of funds" "message": "Turn this on to dismiss the Secret Recovery Phrase backup reminder message. We highly recommend that you back up your Secret Recovery Phrase to avoid loss of funds"
}, },
"dismissReminderField": { "dismissReminderField": {
"message": "Dismiss recovery phrase backup reminder" "message": "Dismiss Secret Recovery Phrase backup reminder"
}, },
"domain": { "domain": {
"message": "Domain" "message": "Domain"
@ -612,7 +609,7 @@
"message": "Download Google Chrome" "message": "Download Google Chrome"
}, },
"downloadSecretBackup": { "downloadSecretBackup": {
"message": "Download this Secret Backup Phrase and keep it stored safely on an external encrypted hard drive or storage medium." "message": "Download this Secret Recovery Phrase and keep it stored safely on an external encrypted hard drive or storage medium."
}, },
"downloadStateLogs": { "downloadStateLogs": {
"message": "Download State Logs" "message": "Download State Logs"
@ -630,16 +627,16 @@
"message": "How should I choose?" "message": "How should I choose?"
}, },
"editGasEducationHighExplanation": { "editGasEducationHighExplanation": {
"message": "This is best for swaps or other time sensitive transactions. If a swap takes too long to process it will often fail and you may lose funds." "message": "This is best for time sensitive transactions (like Swaps) as it increases the likelihood of a successful transaction. If a Swap takes too long to process it may fail and result in losing some of your gas fee."
}, },
"editGasEducationLowExplanation": { "editGasEducationLowExplanation": {
"message": "A lower gas fee should only be selected for transactions where processing time is less important. With a lower fee, it can be hard to predict when (or if) your transaction will be successful." "message": "A lower gas fee should only be used when processing time is less important. Lower fees make it hard predict when (or if) your transaction will be successful."
}, },
"editGasEducationMediumExplanation": { "editGasEducationMediumExplanation": {
"message": "A medium gas fee is good for sending, withdrawing or other non-time sensitive but important transactions." "message": "A medium gas fee is good for sending, withdrawing or other non-time sensitive transactions. This setting will most often result in a successful transaction."
}, },
"editGasEducationModalIntro": { "editGasEducationModalIntro": {
"message": "The right gas amount to select depends on the type of transaction and how important it is." "message": "Selecting the right gas fee depends on the type of transaction and how important it is to you."
}, },
"editGasEducationModalTitle": { "editGasEducationModalTitle": {
"message": "How to choose?" "message": "How to choose?"
@ -675,7 +672,7 @@
"message": "Max priority fee is higher than necessary. You may pay more than needed." "message": "Max priority fee is higher than necessary. You may pay more than needed."
}, },
"editGasMaxPriorityFeeLow": { "editGasMaxPriorityFeeLow": {
"message": "Max priority fee extremely low for network conditions" "message": "Max priority fee is low for current network conditions"
}, },
"editGasMaxPriorityFeeTooltip": { "editGasMaxPriorityFeeTooltip": {
"message": "Max priority fee (aka “miner tip”) goes directly to miners and incentivizes them to prioritize your transaction. Youll most often pay your max setting" "message": "Max priority fee (aka “miner tip”) goes directly to miners and incentivizes them to prioritize your transaction. Youll most often pay your max setting"
@ -714,9 +711,8 @@
"editGasTooLowTooltip": { "editGasTooLowTooltip": {
"message": "Your max fee or max priority fee may be low for current market conditions. We don't know when (or if) your transaction will be processed. " "message": "Your max fee or max priority fee may be low for current market conditions. We don't know when (or if) your transaction will be processed. "
}, },
"editGasTotalBannerSubtitle": { "editGasTooLowWarningTooltip": {
"message": "Up to $1 ($2)", "message": "This lowers your maximum fee but if network traffic increases your transaction may be delayed or fail."
"display": "$1 represents a fiat value"
}, },
"editNonceField": { "editNonceField": {
"message": "Edit Nonce" "message": "Edit Nonce"
@ -1048,6 +1044,9 @@
"importAccount": { "importAccount": {
"message": "Import Account" "message": "Import Account"
}, },
"importAccountError": {
"message": "Error importing account."
},
"importAccountLinkText": { "importAccountLinkText": {
"message": "import using Secret Recovery Phrase" "message": "import using Secret Recovery Phrase"
}, },
@ -1221,7 +1220,7 @@
}, },
"makeSureNoOneWatching": { "makeSureNoOneWatching": {
"message": "Make sure no one is watching your screen", "message": "Make sure no one is watching your screen",
"description": "Warning to users to be care while creating and saving their new seed phrase" "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase"
}, },
"max": { "max": {
"message": "Max" "message": "Max"
@ -1774,13 +1773,13 @@
"message": "Search Tokens" "message": "Search Tokens"
}, },
"secretBackupPhrase": { "secretBackupPhrase": {
"message": "Secret Backup Phrase" "message": "Secret Recovery Phrase"
}, },
"secretBackupPhraseDescription": { "secretBackupPhraseDescription": {
"message": "Your secret backup phrase makes it easy to back up and restore your account." "message": "Your Secret Recovery Phrase makes it easy to back up and restore your account."
}, },
"secretBackupPhraseWarning": { "secretBackupPhraseWarning": {
"message": "WARNING: Never disclose your backup phrase. Anyone with this phrase can take your Ether forever." "message": "WARNING: Never disclose your Secret Recovery Phrase. Anyone with this phrase can take your Ether forever."
}, },
"secretPhrase": { "secretPhrase": {
"message": "Enter your secret phrase here to restore your vault." "message": "Enter your secret phrase here to restore your vault."
@ -1813,28 +1812,28 @@
"message": "Store in a bank vault." "message": "Store in a bank vault."
}, },
"seedPhraseIntroSidebarCopyOne": { "seedPhraseIntroSidebarCopyOne": {
"message": "Your recovery phrase is the “master key” to your wallet and funds." "message": "Your Secret Recovery Phrase is the “master key” to your wallet and funds."
}, },
"seedPhraseIntroSidebarCopyThree": { "seedPhraseIntroSidebarCopyThree": {
"message": "If someone asks for your recovery phrase, they are most likely trying to scam you." "message": "If someone asks for your Secret Recovery Phrase, they are most likely trying to scam you."
}, },
"seedPhraseIntroSidebarCopyTwo": { "seedPhraseIntroSidebarCopyTwo": {
"message": "Never, ever share your recovery phrase, even with MetaMask!" "message": "Never, ever share your Secret Recovery Phrase, even with MetaMask!"
}, },
"seedPhraseIntroSidebarTitleOne": { "seedPhraseIntroSidebarTitleOne": {
"message": "What is a recovery phrase?" "message": "What is a Secret Recovery Phrase?"
}, },
"seedPhraseIntroSidebarTitleThree": { "seedPhraseIntroSidebarTitleThree": {
"message": "Should I share my recovery phrase?" "message": "Should I share my Secret Recovery Phrase?"
}, },
"seedPhraseIntroSidebarTitleTwo": { "seedPhraseIntroSidebarTitleTwo": {
"message": "How do I save my recovery phrase?" "message": "How do I save my Secret Recovery Phrase?"
}, },
"seedPhraseIntroTitle": { "seedPhraseIntroTitle": {
"message": "Secure your wallet" "message": "Secure your wallet"
}, },
"seedPhraseIntroTitleCopy": { "seedPhraseIntroTitleCopy": {
"message": "Before getting started, watch this short video to learn about your recovery phrase and how to keep your wallet safe." "message": "Before getting started, watch this short video to learn about your Secret Recovery Phrase and how to keep your wallet safe."
}, },
"seedPhrasePlaceholder": { "seedPhrasePlaceholder": {
"message": "Separate each word with a single space" "message": "Separate each word with a single space"
@ -1898,6 +1897,9 @@
"message": "Send $1", "message": "Send $1",
"description": "Symbol of the specified token" "description": "Symbol of the specified token"
}, },
"sendTo": {
"message": "Send to"
},
"sendTokens": { "sendTokens": {
"message": "Send Tokens" "message": "Send Tokens"
}, },
@ -2416,6 +2418,9 @@
"symbolBetweenZeroTwelve": { "symbolBetweenZeroTwelve": {
"message": "Symbol must be 11 characters or fewer." "message": "Symbol must be 11 characters or fewer."
}, },
"syncFailed": {
"message": "Sync failed"
},
"syncInProgress": { "syncInProgress": {
"message": "Sync in progress" "message": "Sync in progress"
}, },
@ -2527,7 +2532,7 @@
"message": "Gas fees are set by the network and fluctuate based on network traffic and transaction complexity." "message": "Gas fees are set by the network and fluctuate based on network traffic and transaction complexity."
}, },
"transactionDetailGasTooltipIntro": { "transactionDetailGasTooltipIntro": {
"message": "Gas fees are paid to crypto miners who process transactions on the Ethereum network. MetaMask does not profit from gas fees." "message": "Gas fees are paid to crypto miners who process transactions on the $1 network. MetaMask does not profit from gas fees."
}, },
"transactionDetailGasTotalSubtitle": { "transactionDetailGasTotalSubtitle": {
"message": "Amount + gas fee" "message": "Amount + gas fee"

View File

@ -79,9 +79,6 @@
"addNetwork": { "addNetwork": {
"message": "Agregar red" "message": "Agregar red"
}, },
"addRecipient": {
"message": "Agregar destinatario"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Agregar tokens sugeridos" "message": "Agregar tokens sugeridos"
}, },

View File

@ -79,9 +79,6 @@
"addNetwork": { "addNetwork": {
"message": "Agregar red" "message": "Agregar red"
}, },
"addRecipient": {
"message": "Agregar destinatario"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Agregar tokens sugeridos" "message": "Agregar tokens sugeridos"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Lisage võrk" "message": "Lisage võrk"
}, },
"addRecipient": {
"message": "Lisa saaja"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Lisa soovitatud lube" "message": "Lisa soovitatud lube"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "اضافه شبکه" "message": "اضافه شبکه"
}, },
"addRecipient": {
"message": "اضافه کردن دریافت کننده"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "اضافه رمزیاب های پیشنهاد شده" "message": "اضافه رمزیاب های پیشنهاد شده"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Lisää verkko" "message": "Lisää verkko"
}, },
"addRecipient": {
"message": "Lisää vastaanottaja"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Lisää ehdotetut käyttötunnukset" "message": "Lisää ehdotetut käyttötunnukset"
}, },

View File

@ -35,9 +35,6 @@
"addNetwork": { "addNetwork": {
"message": "Magdagdag ng Network" "message": "Magdagdag ng Network"
}, },
"addRecipient": {
"message": "Magdagdag ng Recipient"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Magdagdag ng Mga Iminungkahing Token" "message": "Magdagdag ng Mga Iminungkahing Token"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Ajouter un réseau" "message": "Ajouter un réseau"
}, },
"addRecipient": {
"message": "Ajouter destinataire"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Ajouter les jetons suggérés" "message": "Ajouter les jetons suggérés"
}, },
@ -657,7 +654,7 @@
"message": "de" "message": "de"
}, },
"off": { "off": {
"message": "Déconnecté" "message": "Désactivé"
}, },
"on": { "on": {
"message": "Activé" "message": "Activé"

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "הוסף/י רשת" "message": "הוסף/י רשת"
}, },
"addRecipient": {
"message": "הוסף נמען"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "הוסף/י אסימונים מוצעים" "message": "הוסף/י אסימונים מוצעים"
}, },

View File

@ -79,9 +79,6 @@
"addNetwork": { "addNetwork": {
"message": "नेटवर्क जोड़ें" "message": "नेटवर्क जोड़ें"
}, },
"addRecipient": {
"message": "प्राप्तकर्ता को जोड़ें"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "सुझाए गए टोकन जोड़ें" "message": "सुझाए गए टोकन जोड़ें"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Dodaj mrežu" "message": "Dodaj mrežu"
}, },
"addRecipient": {
"message": "Dodaj primatelja"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Dodaj predložene tokene" "message": "Dodaj predložene tokene"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Hálózat hozzáadása" "message": "Hálózat hozzáadása"
}, },
"addRecipient": {
"message": "Címzett hozzáadása"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Javasolt tokenek hozzáadása" "message": "Javasolt tokenek hozzáadása"
}, },

View File

@ -79,9 +79,6 @@
"addNetwork": { "addNetwork": {
"message": "Tambahkan Jaringan" "message": "Tambahkan Jaringan"
}, },
"addRecipient": {
"message": "Tambahkan Penerima"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Tambahkan Token yang Disarankan" "message": "Tambahkan Token yang Disarankan"
}, },

View File

@ -52,9 +52,6 @@
"addNetwork": { "addNetwork": {
"message": "Aggiungi Rete" "message": "Aggiungi Rete"
}, },
"addRecipient": {
"message": "Aggiungi destinatario"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Aggiungi Token Suggeriti" "message": "Aggiungi Token Suggeriti"
}, },

View File

@ -79,9 +79,6 @@
"addNetwork": { "addNetwork": {
"message": "ネットワークの追加" "message": "ネットワークの追加"
}, },
"addRecipient": {
"message": "受信者の追加"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "推奨されたトークンの追加" "message": "推奨されたトークンの追加"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "ನೆಟ್‌ವರ್ಕ್ ಸೇರಿಸಿ" "message": "ನೆಟ್‌ವರ್ಕ್ ಸೇರಿಸಿ"
}, },
"addRecipient": {
"message": "ಸ್ವೀಕೃತಿದಾರರನ್ನು ಸೇರಿಸಿ"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "ಸೂಚಿಸಲಾದ ಟೋಕನ್‌ಗಳನ್ನು ಸೇರಿಸಿ" "message": "ಸೂಚಿಸಲಾದ ಟೋಕನ್‌ಗಳನ್ನು ಸೇರಿಸಿ"
}, },

View File

@ -79,9 +79,6 @@
"addNetwork": { "addNetwork": {
"message": "네트워크 추가" "message": "네트워크 추가"
}, },
"addRecipient": {
"message": "수신인 추가"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "추천 토큰 추가" "message": "추천 토큰 추가"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Pridėti tinklą" "message": "Pridėti tinklą"
}, },
"addRecipient": {
"message": "Pridėti gavėją"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Pridėti siūlomų žetonų" "message": "Pridėti siūlomų žetonų"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Pievienot tīklu" "message": "Pievienot tīklu"
}, },
"addRecipient": {
"message": "Pievienot saņēmēju"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Pievienot ieteiktos marķierus" "message": "Pievienot ieteiktos marķierus"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Tambah Rangkaian" "message": "Tambah Rangkaian"
}, },
"addRecipient": {
"message": "Tambah Penerima"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Tambah Token yang Disyorkan" "message": "Tambah Token yang Disyorkan"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Legg til nettverk" "message": "Legg til nettverk"
}, },
"addRecipient": {
"message": "Legg til mottaker "
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Legg til foreslåtte tokener " "message": "Legg til foreslåtte tokener "
}, },

View File

@ -79,9 +79,6 @@
"addNetwork": { "addNetwork": {
"message": "Magdagdag ng Network" "message": "Magdagdag ng Network"
}, },
"addRecipient": {
"message": "Magdagdag ng Recipient"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Magdagdag ng Mga Iminumungkahing Token" "message": "Magdagdag ng Mga Iminumungkahing Token"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Dodaj sieć" "message": "Dodaj sieć"
}, },
"addRecipient": {
"message": "Dodaj odbiorcę"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Dodaj sugerowane tokeny." "message": "Dodaj sugerowane tokeny."
}, },

View File

@ -79,9 +79,6 @@
"addNetwork": { "addNetwork": {
"message": "Adicionar rede" "message": "Adicionar rede"
}, },
"addRecipient": {
"message": "Adicionar destinatário"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Adicionar tokens sugeridos" "message": "Adicionar tokens sugeridos"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Adăugați rețea" "message": "Adăugați rețea"
}, },
"addRecipient": {
"message": "Adăugați destinatarul"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Adăugați indicativele sugerate" "message": "Adăugați indicativele sugerate"
}, },

View File

@ -79,9 +79,6 @@
"addNetwork": { "addNetwork": {
"message": "Добавить сеть" "message": "Добавить сеть"
}, },
"addRecipient": {
"message": "Добавить получателя"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Добавить предложенные токены" "message": "Добавить предложенные токены"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Pridať sieť" "message": "Pridať sieť"
}, },
"addRecipient": {
"message": "Pridať príjemcu"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Pridať navrhované tokeny" "message": "Pridať navrhované tokeny"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Dodaj omrežje" "message": "Dodaj omrežje"
}, },
"addRecipient": {
"message": "Dodaj prejemnika"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Dodaj priporočene žetone" "message": "Dodaj priporočene žetone"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Dodajte mrežu" "message": "Dodajte mrežu"
}, },
"addRecipient": {
"message": "Dodaj primaoca"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Dodajte sugerisane tokene" "message": "Dodajte sugerisane tokene"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Lägg till nätverk" "message": "Lägg till nätverk"
}, },
"addRecipient": {
"message": "Lägg till mottagare"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Lägg till föreslagna tokens" "message": "Lägg till föreslagna tokens"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Ongeza Mtandao" "message": "Ongeza Mtandao"
}, },
"addRecipient": {
"message": "Ongeza Mpokeaji"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Ongeza Vianzio Vilivyopendekezwa" "message": "Ongeza Vianzio Vilivyopendekezwa"
}, },

View File

@ -52,9 +52,6 @@
"addNetwork": { "addNetwork": {
"message": "Magdagdag ng Network" "message": "Magdagdag ng Network"
}, },
"addRecipient": {
"message": "Magdagdag ng Recipient"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Magdagdag ng Mga Iminumungkahing Token" "message": "Magdagdag ng Mga Iminumungkahing Token"
}, },

View File

@ -38,9 +38,6 @@
"addNetwork": { "addNetwork": {
"message": "Додати мережу" "message": "Додати мережу"
}, },
"addRecipient": {
"message": "Додати отримувача"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Додати рекомендовані токени" "message": "Додати рекомендовані токени"
}, },

View File

@ -79,9 +79,6 @@
"addNetwork": { "addNetwork": {
"message": "Thêm mạng" "message": "Thêm mạng"
}, },
"addRecipient": {
"message": "Thêm người nhận"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "Thêm token được đề xuất" "message": "Thêm token được đề xuất"
}, },

View File

@ -52,9 +52,6 @@
"addNetwork": { "addNetwork": {
"message": "添加网络" "message": "添加网络"
}, },
"addRecipient": {
"message": "添加接收方"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "添加推荐代币" "message": "添加推荐代币"
}, },

View File

@ -41,9 +41,6 @@
"addNetwork": { "addNetwork": {
"message": "新增網路" "message": "新增網路"
}, },
"addRecipient": {
"message": "新增接收人"
},
"addSuggestedTokens": { "addSuggestedTokens": {
"message": "加入建議的代幣" "message": "加入建議的代幣"
}, },

View File

@ -0,0 +1,115 @@
WEBVTT
1
00:00:00.780 --> 00:00:04.580
MetaMask es una nueva forma de conectarse
a sitios y aplicaciones.
2
00:00:04.580 --> 00:00:08.860
En los sitios web tradicionales, una base de datos
o un banco central es responsable de controlar y
3
00:00:08.860 --> 00:00:10.179
recuperar sus cuentas.
4
00:00:10.179 --> 00:00:15.050
Pero con MetaMask, todo el control lo tiene
el titular de la clave maestra.
5
00:00:15.050 --> 00:00:18.460
La persona que tenga esta clave controlará las cuentas.
6
00:00:18.460 --> 00:00:21.110
La “clave maestra”
es su frase secreta de recuperación.
7
00:00:21.110 --> 00:00:26.070
Esta frase está compuesta por 12 palabras y se crea
la primera vez que se configura MetaMask; le permite
8
00:00:26.070 --> 00:00:30.120
recuperar su cartera y los fondos en caso de que
alguna vez pierda su clave de acceso.
9
00:00:30.120 --> 00:00:33.451
Es fundamental que proteja
su cartera
10
00:00:33.451 --> 00:00:37.510
guardando la frase secreta de recuperación
en un lugar sumamente seguro y secreto.
11
00:00:37.510 --> 00:00:41.429
Si alguna persona llegara a encontrarla, accederá
a la “clave maestra” de su cartera y podrá
12
00:00:41.429 --> 00:00:45.190
ingresar a todos sus fondos y tomarlos libremente.
13
00:00:45.190 --> 00:00:50.109
Para proteger su cartera en MetaMask,
guarde en un lugar seguro su frase secreta de recuperación.
14
00:00:50.109 --> 00:00:54.930
Puede anotarla, esconderla en algún lugar,
guardarla en una caja de seguridad
15
00:00:54.930 --> 00:00:57.729
o utilizar un administrador seguro de contraseñas.
16
00:00:57.729 --> 00:01:01.050
Inclusive, algunos usuarios graban
la frase en una placa metálica.
17
00:01:01.050 --> 00:01:04.440
Si llegara a perder su frase secreta de recuperación,
ninguna persona, ni siquiera el equipo de MetaMask, podrá ayudarlo
18
00:01:04.440 --> 00:01:07.820
a recuperar
su cartera.
19
00:01:07.820 --> 00:01:12.072
Si aún no ha anotado ni guardado en un lugar seguro su
frase secreta de recuperación,
20
00:01:12.072 --> 00:01:15.492
hágalo ahora mismo. Lo esperamos.
21
00:01:15.500 --> 00:01:20.780
Y recuerde no compartir nunca su
frase secreta de recuperación con nadie; ni siquiera con nosotros.
22
00:01:20.780 --> 00:01:24.910
Si alguien se la pide alguna vez,
será con intenciones de estafarlo.
23
00:01:24.910 --> 00:01:26.250
¡Eso es todo!
24
00:01:26.250 --> 00:01:31.020
Ahora ya sabe qué es una frase secreta de recuperación
y qué debe hacer para mantener protegida su cartera.

View File

@ -0,0 +1,115 @@
WEBVTT
1
00:00:00.780 --> 00:00:04.580
MetaMask साइटों और एप्लिकेशन से
जुड़ने का एक नया तरीका है।
2
00:00:04.580 --> 00:00:08.860
पारंपरिक वेबसाइटों पर, आपके खातों को नियंत्रित करने और
पुनर्प्राप्त करने के लिए एक केंद्रीय डेटाबेस या
3
00:00:08.860 --> 00:00:10.179
बैंक ज़िम्मेदार होता है।
4
00:00:10.179 --> 00:00:15.050
लेकिन MetaMask पर, सारी शक्ति
मास्टर कुंजी के धारक की होती है।
5
00:00:15.050 --> 00:00:18.460
जो भी कुंजी रखता है, वह खातों को नियंत्रित करता है।
6
00:00:18.460 --> 00:00:21.110
आपका गुप्त रिकवरी फ्रेज़
आपकी "मास्टर कुंजी" है।
7
00:00:21.110 --> 00:00:26.070
यह 12 शब्दों की एक सीरीज़ होती है, जो
आपके द्वारा पहली बार MetaMask सेट करने पर जेनरेट होती है, जिससे
8
00:00:26.070 --> 00:00:30.120
आप कभी भी एक्सेस खोने पर अपने वॉलेट और धन को
पुनर्प्राप्त कर सकते हैं।
9
00:00:30.120 --> 00:00:33.451
यह महत्वपूर्ण है कि आप
अपने गुप्त रिकवरी फ्रेज़ को
10
00:00:33.451 --> 00:00:37.510
बहुत सुरक्षित और बहुत गुप्त रखकर
अपने वॉलेट को सुरक्षित रखें।
11
00:00:37.510 --> 00:00:41.429
अगर किसी को भी इसकी सुविधा का एक्सेस मिल जाता है, तो
उनके पास आपके वॉलेट की "मास्टर कुंजी" होगी और
12
00:00:41.429 --> 00:00:45.190
वे आपके सारे धन को आसानी से एक्सेस कर सकते हैं।
13
00:00:45.190 --> 00:00:50.109
अपने MetaMask वॉलेट को सुरक्षित करने के लिए आप अपने
गुप्त रिकवरी फ्रेज़ को सुरक्षित रूप से सहेजना चाहेंगे।
14
00:00:50.109 --> 00:00:54.930
आप इसे लिख सकते हैं, इसे कहीं छुपा सकते हैं,
इसे सेफ़ डिपोज़िट बॉक्स में रख सकते हैं
15
00:00:54.930 --> 00:00:57.729
या सुरक्षित पासवर्ड मैनेजर का उपयोग कर सकते हैं।
16
00:00:57.729 --> 00:01:01.050
कुछ उपयोगकर्ता अपने
फ्रेज़ को धातु की प्लेट पर भी उकेर कर रखते हैं!
17
00:01:01.050 --> 00:01:04.440
यदि आप अपना गुप्त रिकवरी फ्रेज़ खो देते हैं, तो
कोई भी, यहां तक कि MetaMask की टीम भी,
18
00:01:04.440 --> 00:01:07.820
आपके वॉलेट को पुनर्प्राप्त करने में आपकी
सहायता नहीं कर सकती है।
19
00:01:07.820 --> 00:01:12.072
यदि आपने अपना गुप्त रिकवरी फ्रेज़
लिखा नहीं है और इसे कहीं सुरक्षित संग्रहीत नहीं किया है,
20
00:01:12.072 --> 00:01:15.492
तो अभी करें। हम इंतजार करेंगे।
21
00:01:15.500 --> 00:01:20.780
और याद रखें, कभी भी अपना गुप्त रिकवरी फ्रेज़
किसी के साथ साझा न करें: हमसे भी नहीं।
22
00:01:20.780 --> 00:01:24.910
यदि कोई आपसे कभी भी इसे मांगता है, तो
वे आपके साथ धोखाधड़ी करने की कोशिश कर सकते हैं।
23
00:01:24.910 --> 00:01:26.250
बस इतना ही!
24
00:01:26.250 --> 00:01:31.020
अब आपको पता चल गया है कि गुप्त रिकवरी फ्रेज़ क्या है
और अपने वॉलेट को कैसे सकुशल और सुरक्षित रखा जाए।

View File

@ -0,0 +1,115 @@
WEBVTT
1
00:00:00.780 --> 00:00:04.580
MetaMask adalah cara baru untuk terhubung
ke situs dan aplikasi.
2
00:00:04.580 --> 00:00:08.860
Di situs web tradisional, database sentral
atau bank bertanggung jawab untuk mengontrol dan
3
00:00:08.860 --> 00:00:10.179
memulihkan akun Anda.
4
00:00:10.179 --> 00:00:15.050
Tetapi di MetaMask, semua kuasa milik
pemegang kunci induk.
5
00:00:15.050 --> 00:00:18.460
Siapa pun yang memegang kunci tersebut, akan mengontrol akun.
6
00:00:18.460 --> 00:00:21.110
Frasa pemulihan rahasia
adalah "kunci induk" Anda.
7
00:00:21.110 --> 00:00:26.070
Ini adalah rangkaian 12 kata yang dibuat
saat Anda menyiapkan MetaMask pertama kali, yang memungkinkan
8
00:00:26.070 --> 00:00:30.120
Anda memulihkan dompet dan dana jika Anda
kehilangan akses.
9
00:00:30.120 --> 00:00:33.451
Penting agar Anda mengamankan
dompet Anda dengan menjaga
10
00:00:33.451 --> 00:00:37.510
frasa pemulihan rahasia
Anda dengan sangat aman dan sangat rahasia.
11
00:00:37.510 --> 00:00:41.429
Jika seseorang mendapatkan aksesnya, mereka akan memiliki
"kunci induk" ke dompet Anda dan dapat
12
00:00:41.429 --> 00:00:45.190
mengakses secara bebas dan mengambil semua dana Anda.
13
00:00:45.190 --> 00:00:50.109
Untuk mengamankan dompet MetaMask, Anda pasti ingin
menyimpan frasa pemulihan rahasia Anda secara aman.
14
00:00:50.109 --> 00:00:54.930
Anda dapat menuliskannya, menyembunyikannya di suatu tempat,
menempatkannya di kotak deposit yang aman
15
00:00:54.930 --> 00:00:57.729
atau menggunakan pengelola kata sandi yang aman.
16
00:00:57.729 --> 00:01:01.050
Beberapa pengguna bahkan mengukir frasa
mereka pada pelat logam!
17
00:01:01.050 --> 00:01:04.440
Tidak ada seorang pun, bahkan tidak juga tim
di MetaMask, dapat membantu Anda
18
00:01:04.440 --> 00:01:07.820
memulihkan dompet Anda jika Anda menghilangkan
frasa pemulihan rahasia Anda.
19
00:01:07.820 --> 00:01:12.072
Jika belum menuliskan frasa pemulihan rahasia Anda
dan menyimpannya di suatu tempat yang aman,
20
00:01:12.072 --> 00:01:15.492
lakukan sekarang. Kami akan menunggu.
21
00:01:15.500 --> 00:01:20.780
Dan ingat, jangan membagikan frasa pemulihan rahasia
Anda kepada siapa pun: bahkan tidak kepada kami.
22
00:01:20.780 --> 00:01:24.910
Jika ada yang menanyakannya,
mereka akan mencoba menipu Anda.
23
00:01:24.910 --> 00:01:26.250
Begitulah!
24
00:01:26.250 --> 00:01:31.020
Sekarang, Anda tahu apa itu frasa pemulihan rahasia
dan cara menjaga dompet Anda tetap aman.

View File

@ -0,0 +1,115 @@
WEBVTT
1
00:00:00.780 --> 00:00:04.580
MetaMask は
をサイトとアプリケーションにつなぐ新たな方法です。
2
00:00:04.580 --> 00:00:08.860
従来のウェブサイト上では、中央データベース
または銀行がアカウントの制御と
3
00:00:08.860 --> 00:00:10.179
回復の責任を負います。
4
00:00:10.179 --> 00:00:15.050
しかし、MetaMask 上では、全ての権限は
マスターキーの保持者に属します。
5
00:00:15.050 --> 00:00:18.460
当該のキーの保持者が、アカウントを制御します。
6
00:00:18.460 --> 00:00:21.110
あなたのシークレット リカバリー フレーズ
があなたの「マスターキー」です。
7
00:00:21.110 --> 00:00:26.070
これは一連の 12 の単語で
あなたが最初に MetaMask を設定した際に自動生成され、これにより
8
00:00:26.070 --> 00:00:30.120
あなたは万が一アクセス出来なくなった場合に
ウォレットと資金を復元できます。
9
00:00:30.120 --> 00:00:33.451
ウォレットの安全性を確保することは非常に重要
であり、あなたの
10
00:00:33.451 --> 00:00:37.510
シークレット リカバリー フレーズ
を非常に安全かつ秘密に保つことで実現します。
11
00:00:37.510 --> 00:00:41.429
誰かがそれにアクセスすれば、彼らは
あなたのウォレットの「マスターキー」を得て、
12
00:00:41.429 --> 00:00:45.190
あなたの資金に自由にアクセスして全てを奪えます。
13
00:00:45.190 --> 00:00:50.109
MetaMask ウォレットの安全性を確保するため
あなたは シークレット リカバリー フレーズを安全に保存したくなるでしょう。
14
00:00:50.109 --> 00:00:54.930
それを書き留めたり、どこかへ隠したり、
セーフティボックスに入れたり
15
00:00:54.930 --> 00:00:57.729
または安全確保のためのパスワードマネジャーを使用できます。
16
00:00:57.729 --> 00:01:01.050
自分たちの
フレーズをメタルプレートに彫るユーザーさえいます!
17
00:01:01.050 --> 00:01:04.440
何者も、
MetaMask のチームのメンバーですら、あなたが
18
00:01:04.440 --> 00:01:07.820
シークレット リカバリー フレーズを無くしたら
あなたのウォレットを復元する手助けはできません。
19
00:01:07.820 --> 00:01:12.072
あなたがシークレット リカバリー
フレーズを書き留め安全な場所に保管していないのならば、
20
00:01:12.072 --> 00:01:15.492
ぜひ今それを実行してください。お待ちしております。
21
00:01:15.500 --> 00:01:20.780
さらに、あなたのシークレット リカバリー
フレーズを誰とも決して共有しないことを忘れないでください。私たちでさえも。
22
00:01:20.780 --> 00:01:24.910
それを尋ねる者がいたら、
彼らはあなたを騙そうとしているのです。
23
00:01:24.910 --> 00:01:26.250
以上です!
24
00:01:26.250 --> 00:01:31.020
これでシークレット リカバリ フレーズ
が何であるか、あなたのウォレットと資金の安全を確保する方法が判りました。

View File

@ -0,0 +1,115 @@
WEBVTT
1
00:00:00.780 --> 00:00:04.580
MetaMask는 사이트와 애플리케이션에
연결할 수 있는 새로운 방법입니다.
2
00:00:04.580 --> 00:00:08.860
전통적인 웹사이트에서는 중앙 데이터베이스
또는 은행에게 계정을 제어 및
3
00:00:08.860 --> 00:00:10.179
복구할 책임이 있습니다.
4
00:00:10.179 --> 00:00:15.050
하지만 MetaMask에서는 모든 권한이
마스터 키의 소유자에게 있습니다.
5
00:00:15.050 --> 00:00:18.460
키를 보유하고 있는 사람은 계정을 제어합니다.
6
00:00:18.460 --> 00:00:21.110
계정 시드 구문은
"마스터 키"입니다.
7
00:00:21.110 --> 00:00:26.070
먼저 MetaMask를 설정하면, 일련의
12단어가 생성되어,
8
00:00:26.070 --> 00:00:30.120
접근 권한을 상실했을 때 지갑과
자금을 복구할 수 있습니다.
9
00:00:30.120 --> 00:00:33.451
계정 시드 구문을
안전하게 비밀을
10
00:00:33.451 --> 00:00:37.510
유지하여 지갑을 안전하게
지키는 것이 중요합니다.
11
00:00:37.510 --> 00:00:41.429
계정 시드 구문에 액세스하는 사람에게는
지갑에 대한 "마스터 키"가 있어 자유롭게
12
00:00:41.429 --> 00:00:45.190
액세스하여 모든 자금을 가져갈 수 있습니다.
13
00:00:45.190 --> 00:00:50.109
MetaMask 지갑을 안전하게 보호하려면, 계정 시드
구문을 저장할 수 있습니다.
14
00:00:50.109 --> 00:00:54.930
계정 시드 구문을 적어서 어딘가에 숨겨두거나
대여 금고에 두거나
15
00:00:54.930 --> 00:00:57.729
보안 암호 관리자를 사용할 수 있습니다.
16
00:00:57.729 --> 00:01:01.050
일부 사용자는 자신의 구문을
금속판에 새겨두기도 합니다!
17
00:01:01.050 --> 00:01:04.440
계정 시드 구문을 잊으면,
MetaMask의 팀이라고
18
00:01:04.440 --> 00:01:07.820
해도 지갑을
복구할 수 없습니다.
19
00:01:07.820 --> 00:01:12.072
게정 시드 구문을 적어두지
않으면, 안전한 장소에
20
00:01:12.072 --> 00:01:15.492
보관하십시오. 기다리겠습니다.
21
00:01:15.500 --> 00:01:20.780
다른 사람과 계정 시드 구문을
고유하면 안 됩니다. 당사하고도 공유하지 마십시오.
22
00:01:20.780 --> 00:01:24.910
계정 시드 구문을 요청하는 사람은
사기를 치려고 하는 것입니다.
23
00:01:24.910 --> 00:01:26.250
이제 다 됐습니다.
24
00:01:26.250 --> 00:01:31.020
이제 여러분은 계정 시드 구문이 무엇이고
지갑을 안전하게 보관하는 방법을 알고 있습니다.

View File

@ -0,0 +1,115 @@
WEBVTT
1
00:00:00.780 --> 00:00:04.580
O MetaMask é um novo jeito de se conectar
a sites e aplicativos.
2
00:00:04.580 --> 00:00:08.860
Em websites tradicionais, um banco ou base de dados central
é responsável por controlar e
3
00:00:08.860 --> 00:00:10.179
recuperar as suas contas.
4
00:00:10.179 --> 00:00:15.050
Mas, no MetaMask, todo o poder pertence
ao titular de uma chave-mestra.
5
00:00:15.050 --> 00:00:18.460
Quem quer que detenha a chave controla as contas.
6
00:00:18.460 --> 00:00:21.110
A sua frase de recuperação secreta
é a sua "chave-mestra".
7
00:00:21.110 --> 00:00:26.070
É uma série de 12 palavras que são geradas
quando você configura o MetaMask na primeira vez, o que permite que
8
00:00:26.070 --> 00:00:30.120
você recupere a sua carteira e recursos, caso você
venha a perder o acesso.
9
00:00:30.120 --> 00:00:33.451
É importante que você mantenha protegida
a sua carteira ao manter a sua
10
00:00:33.451 --> 00:00:37.510
frase de recuperação secreta
muito segura e muito secreta.
11
00:00:37.510 --> 00:00:41.429
Caso alguém obtenha acesso a ela, essa pessoa terá
a "chave-mestra" para a sua carteira e poderá
12
00:00:41.429 --> 00:00:45.190
acessá-la livremente e tome todos os seus recursos.
13
00:00:45.190 --> 00:00:50.109
A fim de proteger a sua carteira MetaMask, você desejará
manter em segurança a sua frase de recuperação secreta.
14
00:00:50.109 --> 00:00:54.930
Você pode escrevê-la, escondê-la em algum lugar,
colocá-la em um cofre
15
00:00:54.930 --> 00:00:57.729
ou usar um gerenciador de senhas seguras.
16
00:00:57.729 --> 00:01:01.050
Alguns usuários até mesmo gravam sua
frase em uma placa de metal!
17
00:01:01.050 --> 00:01:04.440
Ninguém, nem mesmo a equipe
na MetaMask, pode lhe ajudar
18
00:01:04.440 --> 00:01:07.820
a recuperar a sua carteira, caso você perca
a sua frase de recuperação secreta.
19
00:01:07.820 --> 00:01:12.072
Caso você não tenha escrito a sua frase de recuperação
secreta e a tenha armazenado em algum lugar seguro,
20
00:01:12.072 --> 00:01:15.492
faça isso agora. Iremos aguardar.
21
00:01:15.500 --> 00:01:20.780
E lembre-se de jamais compartilhar a sua frase de recuperação
secreta com ninguém: nem mesmo conosco.
22
00:01:20.780 --> 00:01:24.910
Caso alguém venha a lhe pedir a sua frase de recuperação secreta,
essa pessoa está tentando dar um golpe em você.
23
00:01:24.910 --> 00:01:26.250
É isso!
24
00:01:26.250 --> 00:01:31.020
Agora, você sabe o que é uma frase de recuperação secreta
e como manter a sua carteira protegida e segura.

View File

@ -0,0 +1,115 @@
WEBVTT
1
00:00:00.780 --> 00:00:04.580
MetaMask — это новый способ подключения
к сайтам и приложениям.
2
00:00:04.580 --> 00:00:08.860
На традиционных сайтах центральная база данных
или банк несет ответственность за контроль и
3
00:00:08.860 --> 00:00:10.179
восстановление ваших счетов.
4
00:00:10.179 --> 00:00:15.050
На MetaMask все полномочия находятся
в руках владельца мастер-ключа.
5
00:00:15.050 --> 00:00:18.460
Тот, в чьих руках находится ключ, контролирует счета.
6
00:00:18.460 --> 00:00:21.110
Ваша секретная фраза восстановления
— это ваш «мастер-ключ».
7
00:00:21.110 --> 00:00:26.070
Это набор из 12 слов, которые генерируются
при первой настройке MetaMask, он позволяет
8
00:00:26.070 --> 00:00:30.120
вам восстанавливать ваш кошелек и средства, если вы
теряете к ним доступ.
9
00:00:30.120 --> 00:00:33.451
Важно, чтобы вы обезопасили
свой кошелек, храня вашу
10
00:00:33.451 --> 00:00:37.510
секретную фразу восстановления
в очень надежном и тайном месте.
11
00:00:37.510 --> 00:00:41.429
Если кто-то получит доступ к ней, у этого человека окажется в руках
«мастер-ключ» от вашего кошелька, и он сможет
12
00:00:41.429 --> 00:00:45.190
распоряжаться им и завладеть всеми вашими средствами.
13
00:00:45.190 --> 00:00:50.109
Чтобы обезопасить ваш кошелек MetaMask,
сохраните секретную фразу восстановления в безопасном месте.
14
00:00:50.109 --> 00:00:54.930
Вы можете записать ее, спрятать ее где-то,
положить ее в банковский сейф
15
00:00:54.930 --> 00:00:57.729
или воспользоваться безопасным диспетчером паролей.
16
00:00:57.729 --> 00:01:01.050
Некоторые пользователи даже гравируют свою
фразу на металлической пластине!
17
00:01:01.050 --> 00:01:04.440
Никто, даже команда
MetaMask, не сможет помочь вам
18
00:01:04.440 --> 00:01:07.820
восстановить ваш кошелек, если вы потеряете
вашу секретную фразу восстановления.
19
00:01:07.820 --> 00:01:12.072
Если вы еще не записали секретную фразу
восстановления и не поместили ее в надежное место,
20
00:01:12.072 --> 00:01:15.492
сделайте это сейчас. Мы подождем.
21
00:01:15.500 --> 00:01:20.780
И помните, никогда не сообщайте свою секретную фразу
восстановления никому: даже нам.
22
00:01:20.780 --> 00:01:24.910
Если кто-нибудь когда-либо спросит у вас ее,
этот человек пытается вас обмануть.
23
00:01:24.910 --> 00:01:26.250
Вот и все!
24
00:01:26.250 --> 00:01:31.020
Теперь вы знаете, что такое секретная фраза восстановления
и как обезопасить ваш кошелек.

View File

@ -0,0 +1,115 @@
WEBVTT
1
00:00:00.780 --> 00:00:04.580
Ang MetaMask ay isang bagong paraan para kumonekta
sa mga site at application.
2
00:00:04.580 --> 00:00:08.860
Sa mga tradisyonal na website, ang isang central database
o bangko ang magiging responsable sa pagkontrol at
3
00:00:08.860 --> 00:00:10.179
pag-recover ng iyong mga account.
4
00:00:10.179 --> 00:00:15.050
Pero sa MetaMask, ang lahat ng kakayahan ay nasa
may hawak ng master key.
5
00:00:15.050 --> 00:00:18.460
Kung sino man ang may hawak ng key, siya ang magkokontrol sa mga account.
6
00:00:18.460 --> 00:00:21.110
Ang iyong lihim na recovery phrase
ay ang iyong "master key".
7
00:00:21.110 --> 00:00:26.070
Isa itong 12 salita na nagagawa
sa unang pagkakataong i-set up mo ang MetaMask, na magbibigay-daan sa iyo
8
00:00:26.070 --> 00:00:30.120
na maibalik ang iyong wallet at pera kung sakaling
mawalan ka ng access.
9
00:00:30.120 --> 00:00:33.451
Mahalagang i-secure
ang iyong wallet sa pamamagitan ng pagpapanatiling sobrang ligtas at walang nakakaalam ng iyong
10
00:00:33.451 --> 00:00:37.510
lihim na recovery phrase
.
11
00:00:37.510 --> 00:00:41.429
Kung may ibang taong makaka-access nito, makukuha nila
ang "master key" sa iyong wallet at
12
00:00:41.429 --> 00:00:45.190
madali nilang maa-access at makukuha ang lahat ng pera mo.
13
00:00:45.190 --> 00:00:50.109
Para ma-secure ang iyong MetaMask wallet,
ligtas na i-save ang iyong lihim na recovery phrase.
14
00:00:50.109 --> 00:00:54.930
Puwede mo itong isulat, itago,
ilagay sa isang safe deposit box
15
00:00:54.930 --> 00:00:57.729
o kaya ay gumamit ng ligtas na password manager.
16
00:00:57.729 --> 00:01:01.050
Ang ilang user nga ay inuukit pa ang kanilang
phrase sa isang metal plate!
17
00:01:01.050 --> 00:01:04.440
Walang sinuman, maging ang team
sa MetaMask, ang makakatulong sa iyong
18
00:01:04.440 --> 00:01:07.820
maibalik ang wallet mo kung maiwawala mo
iyong lihim na recovery phrase.
19
00:01:07.820 --> 00:01:12.072
Kung hindi mo pa naisusulat ang iyong lihim na recovery
phrase at hindi pa naitatago sa ligtas na lugar,
20
00:01:12.072 --> 00:01:15.492
gawin mo na ngayon. Hihintayin ka namin.
21
00:01:15.500 --> 00:01:20.780
At tandaan, huwag kailanman ipaalam sa iba ang iyong lihim na recovery
phrase: maging sa amin.
22
00:01:20.780 --> 00:01:24.910
Kung may magtatanong man sa iyo,
sinusubukan ka nilang i-scam.
23
00:01:24.910 --> 00:01:26.250
´Yun lang!
24
00:01:26.250 --> 00:01:31.020
Ngayon ay alam mo na kung ano ang lihim na recovery phrase
at kung paano mapapanatiling ligtas ang iyong wallet.

View File

@ -0,0 +1,115 @@
WEBVTT
1
00:00:00.780 --> 00:00:04.580
MetaMask là cách thức mới để kết nối
với các trang web và ứng dụng.
2
00:00:04.580 --> 00:00:08.860
Trên các trang web truyền thống, một cơ sở dữ liệu trung tâm
hay ngân hàng sẽ chịu trách nhiệm kiểm soát và
3
00:00:08.860 --> 00:00:10.179
khôi phục các tài khoản của bạn.
4
00:00:10.179 --> 00:00:15.050
Tuy nhiên, trên MetaMask, toàn bộ quyền sẽ thuộc về
người nắm giữ khóa chính.
5
00:00:15.050 --> 00:00:18.460
Người có khóa chính sẽ kiểm soát được tài khoản.
6
00:00:18.460 --> 00:00:21.110
Cụm mật khẩu khôi phục bí mật
là “khóa chính” của bạn.
7
00:00:21.110 --> 00:00:26.070
Đây là chuỗi gồm 12 từ được tạo
vào lần đầu tiên bạn thiết lập MetaMask, chuỗi này cho phép
8
00:00:26.070 --> 00:00:30.120
bạn khôi phục ví và tiền của mình nếu
bạn bị mất quyền truy cập.
9
00:00:30.120 --> 00:00:33.451
Bạn cần phải bảo vệ an toàn cho
ví của mình bằng cách lưu giữ
10
00:00:33.451 --> 00:00:37.510
cụm mật khẩu khôi phục bí mật
thật an toàn và bí mật.
11
00:00:37.510 --> 00:00:41.429
Nếu ai đó có được cụm mật khẩu khôi phục bí mật của bạn thì người đó sẽ có
“khóa chính” cho ví của bạn và có thể
12
00:00:41.429 --> 00:00:45.190
tự do truy cập và lấy toàn bộ tiền của bạn.
13
00:00:45.190 --> 00:00:50.109
Để bảo vệ an toàn cho ví MetaMask, bạn cần
lưu giữ cụm mật khẩu khôi phục bí mật một cách an toàn.
14
00:00:50.109 --> 00:00:54.930
Bạn có thể chép lại và giấu ở một nơi nào đó,
cất trong hộp ký gửi an toàn
15
00:00:54.930 --> 00:00:57.729
hoặc dùng một trình quản lý mật khẩu an toàn.
16
00:00:57.729 --> 00:01:01.050
Một số người dùng thậm chí còn khắc
cụm mật khẩu của họ lên một tấm kim loại!
17
00:01:01.050 --> 00:01:04.440
Không một ai, kể cả đội ngũ
tại MetaMask, có thể giúp bạn
18
00:01:04.440 --> 00:01:07.820
khôi phục lại ví nếu bạn đánh mất
cụm mật khẩu khôi phục bí mật của mình.
19
00:01:07.820 --> 00:01:12.072
Nếu chưa ghi lại cụm mật khẩu khôi phục bí mật
của mình và lưu giữ ở nơi an toàn,
20
00:01:12.072 --> 00:01:15.492
thì bạn hãy thực hiện ngay bây giờ. Chúng tôi sẽ chờ bạn.
21
00:01:15.500 --> 00:01:20.780
Và đừng bao giờ chia sẻ cụm mật khẩu khôi phục
bí mật với bất kỳ ai: kể cả chúng tôi.
22
00:01:20.780 --> 00:01:24.910
Nếu ai đó hỏi bạn cụm mật khẩu khôi phục bí mật,
thì họ đang cố gắng lừa đảo bạn.
23
00:01:24.910 --> 00:01:26.250
Xin hãy ghi nhớ!
24
00:01:26.250 --> 00:01:31.020
Bây giờ bạn đã biết cụm mật khẩu khôi phục bí mật
là gì và cách bảo vệ ví của bạn an toàn và bảo mật.

View File

@ -816,7 +816,6 @@ export default class PreferencesController {
return await tokenContract return await tokenContract
.supportsInterface(ERC721_INTERFACE_ID) .supportsInterface(ERC721_INTERFACE_ID)
.catch((error) => { .catch((error) => {
console.log('error', error);
log.debug(error); log.debug(error);
return false; return false;
}); });

View File

@ -1383,6 +1383,10 @@ export default class TransactionController extends EventEmitter {
* @param {Object} extraParams - optional props and values to include in sensitiveProperties * @param {Object} extraParams - optional props and values to include in sensitiveProperties
*/ */
_trackTransactionMetricsEvent(txMeta, event, extraParams = {}) { _trackTransactionMetricsEvent(txMeta, event, extraParams = {}) {
if (!txMeta) {
return;
}
const { const {
type, type,
time, time,

View File

@ -23,6 +23,7 @@ function transformState(state) {
state?.IncomingTransactionsController?.incomingTransactions; state?.IncomingTransactionsController?.incomingTransactions;
if (Array.isArray(transactions)) { if (Array.isArray(transactions)) {
transactions.forEach((transaction) => { transactions.forEach((transaction) => {
if (transaction) {
if ( if (
transaction.type !== TRANSACTION_TYPES.RETRY && transaction.type !== TRANSACTION_TYPES.RETRY &&
transaction.type !== TRANSACTION_TYPES.CANCEL transaction.type !== TRANSACTION_TYPES.CANCEL
@ -30,16 +31,19 @@ function transformState(state) {
transaction.type = transaction.transactionCategory; transaction.type = transaction.transactionCategory;
} }
delete transaction.transactionCategory; delete transaction.transactionCategory;
}
}); });
} }
if (incomingTransactions) { if (incomingTransactions) {
const incomingTransactionsEntries = Object.entries(incomingTransactions); const incomingTransactionsEntries = Object.entries(incomingTransactions);
incomingTransactionsEntries.forEach(([key, transaction]) => { incomingTransactionsEntries.forEach(([key, transaction]) => {
if (transaction) {
delete transaction.transactionCategory; delete transaction.transactionCategory;
state.IncomingTransactionsController.incomingTransactions[key] = { state.IncomingTransactionsController.incomingTransactions[key] = {
...transaction, ...transaction,
type: TRANSACTION_TYPES.INCOMING, type: TRANSACTION_TYPES.INCOMING,
}; };
}
}); });
} }
return state; return state;

View File

@ -15,14 +15,14 @@ export default {
const { PreferencesController } = versionedData.data; const { PreferencesController } = versionedData.data;
if (Array.isArray(PreferencesController.tokens)) { if (Array.isArray(PreferencesController?.tokens)) {
PreferencesController.tokens = PreferencesController.tokens.filter( PreferencesController.tokens = PreferencesController.tokens.filter(
({ address }) => address, ({ address }) => address,
); );
} }
if ( if (
PreferencesController.accountTokens && PreferencesController?.accountTokens &&
typeof PreferencesController.accountTokens === 'object' typeof PreferencesController.accountTokens === 'object'
) { ) {
Object.keys(PreferencesController.accountTokens).forEach((account) => { Object.keys(PreferencesController.accountTokens).forEach((account) => {
@ -40,7 +40,7 @@ export default {
} }
if ( if (
PreferencesController.assetImages && PreferencesController?.assetImages &&
'undefined' in PreferencesController.assetImages 'undefined' in PreferencesController.assetImages
) { ) {
delete PreferencesController.assetImages.undefined; delete PreferencesController.assetImages.undefined;

View File

@ -5,4 +5,4 @@ The extension injects the Ethereum web3 API into every website's javascript cont
MetaMask also lets the user create and manage their own identities, so when a Dapp wants to perform a transaction and write to the blockchain, the user gets a secure interface to review the transaction, before approving or rejecting it. MetaMask also lets the user create and manage their own identities, so when a Dapp wants to perform a transaction and write to the blockchain, the user gets a secure interface to review the transaction, before approving or rejecting it.
Because it adds functionality to the normal browser context, MetaMask requires the permission to read and write to any webpage. You can always "view the source" of MetaMask the way you do any extension, or view the source code on Github: Because it adds functionality to the normal browser context, MetaMask requires the permission to read and write to any webpage. You can always "view the source" of MetaMask the way you do any extension, or view the source code on Github:
https://github.com/MetaMask/metamask-plugin https://github.com/MetaMask/metamask-extension

View File

@ -48,6 +48,8 @@
"lint:fix": "prettier --write '**/*.json' && eslint . --ext js --cache --fix", "lint:fix": "prettier --write '**/*.json' && eslint . --ext js --cache --fix",
"lint:changed": "{ git ls-files --others --exclude-standard ; git diff-index --name-only --diff-filter=d HEAD ; } | grep --regexp='[.]js$' | tr '\\n' '\\0' | xargs -0 eslint", "lint:changed": "{ git ls-files --others --exclude-standard ; git diff-index --name-only --diff-filter=d HEAD ; } | grep --regexp='[.]js$' | tr '\\n' '\\0' | xargs -0 eslint",
"lint:changed:fix": "{ git ls-files --others --exclude-standard ; git diff-index --name-only --diff-filter=d HEAD ; } | grep --regexp='[.]js$' | tr '\\n' '\\0' | xargs -0 eslint --fix", "lint:changed:fix": "{ git ls-files --others --exclude-standard ; git diff-index --name-only --diff-filter=d HEAD ; } | grep --regexp='[.]js$' | tr '\\n' '\\0' | xargs -0 eslint --fix",
"lint:changelog": "auto-changelog validate",
"lint:changelog:rc": "auto-changelog validate --rc",
"lint:shellcheck": "./development/shellcheck.sh", "lint:shellcheck": "./development/shellcheck.sh",
"lint:styles": "stylelint '*/**/*.scss'", "lint:styles": "stylelint '*/**/*.scss'",
"lint:lockfile": "lockfile-lint --path yarn.lock --allowed-hosts npm yarn github.com codeload.github.com --empty-hostname false --allowed-schemes \"https:\" \"git+https:\"", "lint:lockfile": "lockfile-lint --path yarn.lock --allowed-hosts npm yarn github.com codeload.github.com --empty-hostname false --allowed-schemes \"https:\" \"git+https:\"",
@ -60,8 +62,8 @@
"devtools:redux": "remotedev --hostname=localhost --port=8000", "devtools:redux": "remotedev --hostname=localhost --port=8000",
"start:dev": "concurrently -k -n build,react,redux yarn:start yarn:devtools:react yarn:devtools:redux", "start:dev": "concurrently -k -n build,react,redux yarn:start yarn:devtools:react yarn:devtools:redux",
"announce": "node development/announcer.js", "announce": "node development/announcer.js",
"storybook": "start-storybook -p 6006 -c .storybook --static-dir ./app ./storybook/images", "storybook": "start-storybook -p 6006 -c .storybook -s ./app,./.storybook/images",
"storybook:build": "build-storybook -c .storybook -o storybook-build --static-dir ./app ./storybook/images", "storybook:build": "build-storybook -c .storybook -o storybook-build -s ./app,./.storybook/images",
"storybook:deploy": "storybook-to-ghpages --existing-output-dir storybook-build --remote storybook --branch master", "storybook:deploy": "storybook-to-ghpages --existing-output-dir storybook-build --remote storybook --branch master",
"update-changelog": "auto-changelog update", "update-changelog": "auto-changelog update",
"generate:migration": "./development/generate-migration.sh", "generate:migration": "./development/generate-migration.sh",

View File

@ -7,7 +7,7 @@ const { hideBin } = require('yargs/helpers');
const ttest = require('ttest'); const ttest = require('ttest');
const { retry } = require('../../development/lib/retry'); const { retry } = require('../../development/lib/retry');
const { exitWithError } = require('../../development/lib/exit-with-error'); const { exitWithError } = require('../../development/lib/exit-with-error');
const { withFixtures } = require('./helpers'); const { withFixtures, tinyDelayMs } = require('./helpers');
const { PAGES } = require('./webdriver/driver'); const { PAGES } = require('./webdriver/driver');
const DEFAULT_NUM_SAMPLES = 20; const DEFAULT_NUM_SAMPLES = 20;
@ -16,6 +16,7 @@ const ALL_PAGES = Object.values(PAGES);
async function measurePage(pageName) { async function measurePage(pageName) {
let metrics; let metrics;
await withFixtures({ fixtures: 'imported-account' }, async ({ driver }) => { await withFixtures({ fixtures: 'imported-account' }, async ({ driver }) => {
await driver.delay(tinyDelayMs);
await driver.navigate(); await driver.navigate();
await driver.fill('#password', 'correct horse battery staple'); await driver.fill('#password', 'correct horse battery staple');
await driver.press('#password', driver.Key.ENTER); await driver.press('#password', driver.Key.ENTER);

View File

@ -11,6 +11,8 @@ const { buildWebDriver } = require('./webdriver');
const tinyDelayMs = 200; const tinyDelayMs = 200;
const regularDelayMs = tinyDelayMs * 2; const regularDelayMs = tinyDelayMs * 2;
const largeDelayMs = regularDelayMs * 2; const largeDelayMs = regularDelayMs * 2;
const xLargeDelayMs = largeDelayMs * 2;
const xxLargeDelayMs = xLargeDelayMs * 2;
const dappPort = 8080; const dappPort = 8080;
@ -144,5 +146,7 @@ module.exports = {
tinyDelayMs, tinyDelayMs,
regularDelayMs, regularDelayMs,
largeDelayMs, largeDelayMs,
xLargeDelayMs,
xxLargeDelayMs,
withFixtures, withFixtures,
}; };

View File

@ -187,25 +187,6 @@ describe('MetaMask', function () {
}); });
}); });
describe('Show account information', function () {
it('shows the QR code for the account', async function () {
await driver.clickElement('[data-testid="account-options-menu-button"]');
await driver.clickElement(
'[data-testid="account-options-menu__account-details"]',
);
await driver.findVisibleElement('.qr-code__wrapper');
await driver.delay(regularDelayMs);
// wait for permission modal to be visible.
const permissionModal = await driver.findVisibleElement('span .modal');
await driver.clickElement('.account-modal__close');
// wait for permission modal to be removed from DOM.
await permissionModal.waitForElementState('hidden');
await driver.delay(regularDelayMs);
});
});
describe('Import Secret Recovery Phrase', function () { describe('Import Secret Recovery Phrase', function () {
it('logs out of the vault', async function () { it('logs out of the vault', async function () {
await driver.clickElement('.account-menu__icon'); await driver.clickElement('.account-menu__icon');

View File

@ -1,6 +1,6 @@
const { strict: assert } = require('assert'); const { strict: assert } = require('assert');
const waitUntilCalled = require('../lib/wait-until-called'); const waitUntilCalled = require('../lib/wait-until-called');
const { withFixtures } = require('./helpers'); const { withFixtures, tinyDelayMs } = require('./helpers');
/** /**
* WARNING: These tests must be run using a build created with `yarn build:test:metrics`, so that it has * WARNING: These tests must be run using a build created with `yarn build:test:metrics`, so that it has
@ -30,6 +30,7 @@ describe('Segment metrics', function () {
const threeSegmentEventsReceived = waitUntilCalled(segmentStub, null, { const threeSegmentEventsReceived = waitUntilCalled(segmentStub, null, {
callCount: 3, callCount: 3,
}); });
await driver.delay(tinyDelayMs);
await driver.navigate(); await driver.navigate();
await driver.fill('#password', 'correct horse battery staple'); await driver.fill('#password', 'correct horse battery staple');

View File

@ -0,0 +1,38 @@
const { strict: assert } = require('assert');
const { withFixtures } = require('../helpers');
describe('Show account details', function () {
const ganacheOptions = {
accounts: [
{
secretKey:
'0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC',
balance: 25000000000000000000,
},
],
};
it('should show the QR code for the account', async function () {
await withFixtures(
{
fixtures: 'imported-account',
ganacheOptions,
title: this.test.title,
},
async ({ driver }) => {
await driver.navigate();
await driver.fill('#password', 'correct horse battery staple');
await driver.press('#password', driver.Key.ENTER);
await driver.clickElement(
'[data-testid="account-options-menu-button"]',
);
await driver.clickElement(
'[data-testid="account-options-menu__account-details"]',
);
const qrCode = await driver.findElement('.qr-code__wrapper');
assert.equal(await qrCode.isDisplayed(), true);
},
);
});
});

View File

@ -1,5 +1,5 @@
const { strict: assert } = require('assert'); const { strict: assert } = require('assert');
const { withFixtures } = require('../helpers'); const { withFixtures, xxLargeDelayMs } = require('../helpers');
describe('Permissions', function () { describe('Permissions', function () {
it('sets permissions and connect to Dapp', async function () { it('sets permissions and connect to Dapp', async function () {
@ -34,6 +34,7 @@ describe('Permissions', function () {
await driver.waitUntilXWindowHandles(3); await driver.waitUntilXWindowHandles(3);
const windowHandles = await driver.getAllWindowHandles(); const windowHandles = await driver.getAllWindowHandles();
const extension = windowHandles[0]; const extension = windowHandles[0];
await driver.delay(xxLargeDelayMs);
await driver.switchToWindowWithTitle( await driver.switchToWindowWithTitle(
'MetaMask Notification', 'MetaMask Notification',
windowHandles, windowHandles,

View File

@ -1,5 +1,5 @@
const { strict: assert } = require('assert'); const { strict: assert } = require('assert');
const { withFixtures, regularDelayMs } = require('../helpers'); const { withFixtures, regularDelayMs, xxLargeDelayMs } = require('../helpers');
describe('MetaMask', function () { describe('MetaMask', function () {
it('provider should inform dapp when switching networks', async function () { it('provider should inform dapp when switching networks', async function () {
@ -27,7 +27,7 @@ describe('MetaMask', function () {
await driver.openNewPage('http://127.0.0.1:8080/'); await driver.openNewPage('http://127.0.0.1:8080/');
const networkDiv = await driver.findElement('#network'); const networkDiv = await driver.findElement('#network');
const chainIdDiv = await driver.findElement('#chainId'); const chainIdDiv = await driver.findElement('#chainId');
await driver.delay(regularDelayMs); await driver.delay(xxLargeDelayMs);
assert.equal(await networkDiv.getText(), '1337'); assert.equal(await networkDiv.getText(), '1337');
assert.equal(await chainIdDiv.getText(), '0x539'); assert.equal(await chainIdDiv.getText(), '0x539');

View File

@ -131,5 +131,5 @@ AdvancedGasControls.propTypes = {
maxPriorityFeeFiat: PropTypes.string, maxPriorityFeeFiat: PropTypes.string,
maxFeeFiat: PropTypes.string, maxFeeFiat: PropTypes.string,
gasErrors: PropTypes.object, gasErrors: PropTypes.object,
minimumGasLimit: PropTypes.number, minimumGasLimit: PropTypes.string,
}; };

View File

@ -15,7 +15,7 @@ import {
getSelectedAddress, getSelectedAddress,
getSelectedIdentity, getSelectedIdentity,
} from '../../../../selectors'; } from '../../../../selectors';
import { isExtensionUrl } from '../../../../helpers/utils/util'; import { isExtensionUrl, getURLHost } from '../../../../helpers/utils/util';
import Popover from '../../../ui/popover'; import Popover from '../../../ui/popover';
import Button from '../../../ui/button'; import Button from '../../../ui/button';
import Checkbox from '../../../ui/check-box'; import Checkbox from '../../../ui/check-box';
@ -88,7 +88,7 @@ const UnconnectedAccountAlert = () => {
return ( return (
<Popover <Popover
title={ title={
isExtensionUrl(origin) ? t('currentExtension') : new URL(origin).host isExtensionUrl(origin) ? t('currentExtension') : getURLHost(origin)
} }
subtitle={t('currentAccountNotConnected')} subtitle={t('currentAccountNotConnected')}
onClose={onClose} onClose={onClose}

View File

@ -161,19 +161,23 @@ export default function EditGasDisplay({
} }
detail={ detail={
networkAndAccountSupport1559 && networkAndAccountSupport1559 &&
estimatedMaximumFiat !== undefined && estimatedMaximumFiat !== undefined && (
t('editGasTotalBannerSubtitle', [ <>
<Typography <Typography
fontWeight={FONT_WEIGHT.BOLD}
tag="span" tag="span"
key="secondary" key="label"
fontWeight={FONT_WEIGHT.BOLD}
> >
{t('editGasSubTextFeeLabel')}
</Typography>
<Typography tag="span" key="secondary">
{estimatedMaximumFiat} {estimatedMaximumFiat}
</Typography>, </Typography>
<Typography tag="span" key="primary"> <Typography tag="span" key="primary">
{estimatedMaximumNative} {`(${estimatedMaximumNative})`}
</Typography>, </Typography>
]) </>
)
} }
timing={ timing={
hasGasErrors === false && ( hasGasErrors === false && (
@ -315,7 +319,7 @@ EditGasDisplay.propTypes = {
gasErrors: PropTypes.object, gasErrors: PropTypes.object,
gasWarnings: PropTypes.object, gasWarnings: PropTypes.object,
onManualChange: PropTypes.func, onManualChange: PropTypes.func,
minimumGasLimit: PropTypes.number, minimumGasLimit: PropTypes.string,
balanceError: PropTypes.bool, balanceError: PropTypes.bool,
estimatesUnavailableWarning: PropTypes.bool, estimatesUnavailableWarning: PropTypes.bool,
hasGasErrors: PropTypes.bool, hasGasErrors: PropTypes.bool,

View File

@ -126,7 +126,6 @@ export default function GasTiming({
let text = ''; let text = '';
let attitude = 'positive'; let attitude = 'positive';
let fontWeight = FONT_WEIGHT.NORMAL;
// Anything medium or faster is positive // Anything medium or faster is positive
if ( if (
@ -159,7 +158,6 @@ export default function GasTiming({
customEstimatedTime === 'unknown' || customEstimatedTime === 'unknown' ||
customEstimatedTime?.upperTimeBound === 'unknown' customEstimatedTime?.upperTimeBound === 'unknown'
) { ) {
fontWeight = FONT_WEIGHT.BOLD;
text = unknownProcessingTimeText; text = unknownProcessingTimeText;
} else { } else {
text = t('gasTimingNegative', [ text = t('gasTimingNegative', [
@ -167,16 +165,23 @@ export default function GasTiming({
]); ]);
} }
} else { } else {
text = t('gasTimingNegative', [ text = (
<>
{t('gasTimingNegative', [
toHumanReadableTime(low.maxWaitTimeEstimate, t), toHumanReadableTime(low.maxWaitTimeEstimate, t),
]); ])}
<InfoTooltip
position="top"
contentText={t('editGasTooLowWarningTooltip')}
/>
</>
);
} }
} }
return ( return (
<Typography <Typography
variant={TYPOGRAPHY.H7} variant={TYPOGRAPHY.H7}
fontWeight={fontWeight}
className={classNames('gas-timing', { className={classNames('gas-timing', {
[`gas-timing--${attitude}`]: attitude, [`gas-timing--${attitude}`]: attitude,
})} })}

View File

@ -11,6 +11,7 @@
&--negative { &--negative {
color: $error-1; color: $error-1;
font-weight: bold;
} }
.info-tooltip { .info-tooltip {

View File

@ -6,6 +6,7 @@ import { getAccountLink } from '@metamask/etherscan-link';
import { showModal } from '../../../store/actions'; import { showModal } from '../../../store/actions';
import { CONNECTED_ROUTE } from '../../../helpers/constants/routes'; import { CONNECTED_ROUTE } from '../../../helpers/constants/routes';
import { getURLHostName } from '../../../helpers/utils/util';
import { Menu, MenuItem } from '../../ui/menu'; import { Menu, MenuItem } from '../../ui/menu';
import { import {
getCurrentChainId, getCurrentChainId,
@ -33,14 +34,7 @@ export default function AccountOptionsMenu({ anchorElement, onClose }) {
const { address } = selectedIdentity; const { address } = selectedIdentity;
const addressLink = getAccountLink(address, chainId, rpcPrefs); const addressLink = getAccountLink(address, chainId, rpcPrefs);
const { blockExplorerUrl } = rpcPrefs; const { blockExplorerUrl } = rpcPrefs;
const blockExplorerUrlSubTitle = getURLHostName(blockExplorerUrl);
const getBlockExplorerUrlHost = () => {
try {
return new URL(blockExplorerUrl)?.hostname;
} catch (err) {
return '';
}
};
const openFullscreenEvent = useMetricEvent({ const openFullscreenEvent = useMetricEvent({
eventOpts: { eventOpts: {
@ -71,12 +65,11 @@ export default function AccountOptionsMenu({ anchorElement, onClose }) {
properties: { properties: {
link_type: 'Account Tracker', link_type: 'Account Tracker',
action: 'Account Options', action: 'Account Options',
block_explorer_domain: addressLink ? new URL(addressLink)?.hostname : '', block_explorer_domain: getURLHostName(addressLink),
}, },
}); });
const isRemovable = keyring.type !== 'HD Key Tree'; const isRemovable = keyring.type !== 'HD Key Tree';
const blockExplorerUrlSubTitle = getBlockExplorerUrlHost();
return ( return (
<Menu <Menu

View File

@ -6,6 +6,7 @@ import AccountModalContainer from '../account-modal-container';
import QrView from '../../../ui/qr-code'; import QrView from '../../../ui/qr-code';
import EditableLabel from '../../../ui/editable-label'; import EditableLabel from '../../../ui/editable-label';
import Button from '../../../ui/button'; import Button from '../../../ui/button';
import { getURLHostName } from '../../../../helpers/utils/util';
export default class AccountDetailsModal extends Component { export default class AccountDetailsModal extends Component {
static propTypes = { static propTypes = {
@ -70,9 +71,7 @@ export default class AccountDetailsModal extends Component {
properties: { properties: {
link_type: 'Account Tracker', link_type: 'Account Tracker',
action: 'Account Details Modal', action: 'Account Details Modal',
block_explorer_domain: accountLink block_explorer_domain: getURLHostName(accountLink),
? new URL(accountLink)?.hostname
: '',
}, },
}); });
global.platform.openTab({ global.platform.openTab({

View File

@ -2,7 +2,7 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { getAccountLink } from '@metamask/etherscan-link'; import { getAccountLink } from '@metamask/etherscan-link';
import Modal from '../../modal'; import Modal from '../../modal';
import { addressSummary } from '../../../../helpers/utils/util'; import { addressSummary, getURLHostName } from '../../../../helpers/utils/util';
import Identicon from '../../../ui/identicon'; import Identicon from '../../../ui/identicon';
export default class ConfirmRemoveAccount extends Component { export default class ConfirmRemoveAccount extends Component {
@ -66,9 +66,7 @@ export default class ConfirmRemoveAccount extends Component {
properties: { properties: {
link_type: 'Account Tracker', link_type: 'Account Tracker',
action: 'Remove Account', action: 'Remove Account',
block_explorer_domain: accountLink block_explorer_domain: getURLHostName(accountLink),
? new URL(accountLink)?.hostname
: '',
}, },
}); });
global.platform.openTab({ global.platform.openTab({

View File

@ -7,6 +7,7 @@ import { ENVIRONMENT_TYPE_FULLSCREEN } from '../../../../../shared/constants/app
import { SECOND } from '../../../../../shared/constants/time'; import { SECOND } from '../../../../../shared/constants/time';
import Spinner from '../../../ui/spinner'; import Spinner from '../../../ui/spinner';
import WebcamUtils from '../../../../helpers/utils/webcam-utils'; import WebcamUtils from '../../../../helpers/utils/webcam-utils';
import { getURL } from '../../../../helpers/utils/util';
import PageContainerFooter from '../../../ui/page-container/page-container-footer/page-container-footer.component'; import PageContainerFooter from '../../../ui/page-container/page-container-footer/page-container-footer.component';
const READY_STATE = { const READY_STATE = {
@ -68,8 +69,8 @@ export default class QrScanner extends Component {
!environmentReady && !environmentReady &&
getEnvironmentType() !== ENVIRONMENT_TYPE_FULLSCREEN getEnvironmentType() !== ENVIRONMENT_TYPE_FULLSCREEN
) { ) {
const currentUrl = new URL(window.location.href); const currentUrl = getURL(window.location.href);
const currentHash = currentUrl.hash; const currentHash = currentUrl?.hash;
const currentRoute = currentHash ? currentHash.substring(1) : null; const currentRoute = currentHash ? currentHash.substring(1) : null;
global.platform.openExtensionInBrowser(currentRoute); global.platform.openExtensionInBrowser(currentRoute);
} }

View File

@ -7,7 +7,7 @@ import {
getEthConversionFromWeiHex, getEthConversionFromWeiHex,
getValueFromWeiHex, getValueFromWeiHex,
} from '../../../helpers/utils/conversions.util'; } from '../../../helpers/utils/conversions.util';
import { formatDate } from '../../../helpers/utils/util'; import { formatDate, getURLHostName } from '../../../helpers/utils/util';
import TransactionActivityLogIcon from './transaction-activity-log-icon'; import TransactionActivityLogIcon from './transaction-activity-log-icon';
import { CONFIRMED_STATUS } from './transaction-activity-log.constants'; import { CONFIRMED_STATUS } from './transaction-activity-log.constants';
@ -41,9 +41,7 @@ export default class TransactionActivityLog extends PureComponent {
properties: { properties: {
link_type: 'Transaction Block Explorer', link_type: 'Transaction Block Explorer',
action: 'Activity Details', action: 'Activity Details',
block_explorer_domain: etherscanUrl block_explorer_domain: getURLHostName(etherscanUrl),
? new URL(etherscanUrl)?.hostname
: '',
}, },
}); });

View File

@ -12,6 +12,7 @@ import Copy from '../../ui/icon/copy-icon.component';
import Popover from '../../ui/popover'; import Popover from '../../ui/popover';
import { SECOND } from '../../../../shared/constants/time'; import { SECOND } from '../../../../shared/constants/time';
import { TRANSACTION_TYPES } from '../../../../shared/constants/transaction'; import { TRANSACTION_TYPES } from '../../../../shared/constants/transaction';
import { getURLHostName } from '../../../helpers/utils/util';
export default class TransactionListItemDetails extends PureComponent { export default class TransactionListItemDetails extends PureComponent {
static contextTypes = { static contextTypes = {
@ -65,9 +66,7 @@ export default class TransactionListItemDetails extends PureComponent {
properties: { properties: {
link_type: 'Transaction Block Explorer', link_type: 'Transaction Block Explorer',
action: 'Transaction Details', action: 'Transaction Details',
block_explorer_domain: blockExplorerLink block_explorer_domain: getURLHostName(blockExplorerLink),
? new URL(blockExplorerLink)?.hostname
: '',
}, },
}); });

View File

@ -4,4 +4,8 @@
&__detail { &__detail {
padding-bottom: 4px; padding-bottom: 4px;
} }
span {
margin-inline-start: 2px;
}
} }

View File

@ -1,8 +1,12 @@
.radio-group { .radio-group {
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: 33% 33% 33%;
grid-template-rows: 60px;
width: 100%;
&--has-recommendation {
grid-template-rows: 100px; grid-template-rows: 100px;
width: 300px; }
label { label {
cursor: pointer; cursor: pointer;

View File

@ -1,5 +1,6 @@
import React, { useContext } from 'react'; import React, { useContext } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classNames from 'classnames';
import { I18nContext } from '../../../contexts/i18n'; import { I18nContext } from '../../../contexts/i18n';
import Typography from '../typography/typography'; import Typography from '../typography/typography';
import { import {
@ -11,13 +12,22 @@ import {
export default function RadioGroup({ options, name, selectedValue, onChange }) { export default function RadioGroup({ options, name, selectedValue, onChange }) {
const t = useContext(I18nContext); const t = useContext(I18nContext);
const hasRecommendation = Boolean(
options.find((option) => option.recommended),
);
return ( return (
<div className="radio-group"> <div
className={classNames('radio-group', {
'radio-group--has-recommendation': hasRecommendation,
})}
>
{options.map((option) => { {options.map((option) => {
const checked = option.value === selectedValue; const checked = option.value === selectedValue;
return ( return (
<div className="radio-group__column" key={`${name}-${option.value}`}> <div className="radio-group__column" key={`${name}-${option.value}`}>
<label> <label>
{hasRecommendation && (
<Typography <Typography
color={COLORS.SUCCESS3} color={COLORS.SUCCESS3}
className="radio-group__column-recommended" className="radio-group__column-recommended"
@ -25,7 +35,7 @@ export default function RadioGroup({ options, name, selectedValue, onChange }) {
> >
{option.recommended ? t('recommendedGasLabel') : ''} {option.recommended ? t('recommendedGasLabel') : ''}
</Typography> </Typography>
)}
<div className="radio-group__column-radio"> <div className="radio-group__column-radio">
<input <input
type="radio" type="radio"
@ -38,7 +48,7 @@ export default function RadioGroup({ options, name, selectedValue, onChange }) {
<div className="radio-group__column-line"></div> <div className="radio-group__column-line"></div>
<div className="radio-group__column-horizontal-line"></div> <div className="radio-group__column-horizontal-line"></div>
<Typography <Typography
color={COLORS.UI4} color={checked ? COLORS.BLACK : COLORS.UI4}
fontWeight={FONT_WEIGHT.BOLD} fontWeight={FONT_WEIGHT.BOLD}
variant={TYPOGRAPHY.H7} variant={TYPOGRAPHY.H7}
className="radio-group__column-label" className="radio-group__column-label"

View File

@ -106,6 +106,7 @@ export default class UnitInput extends PureComponent {
ref={(ref) => { ref={(ref) => {
this.unitInput = ref; this.unitInput = ref;
}} }}
autoFocus
/> />
{suffix && <div className="unit-input__suffix">{suffix}</div>} {suffix && <div className="unit-input__suffix">{suffix}</div>}
</div> </div>

View File

@ -379,3 +379,19 @@ export function bnLessThanEqualTo(a, b) {
} }
return new BigNumber(a, 10).lte(b, 10); return new BigNumber(a, 10).lte(b, 10);
} }
export function getURL(url) {
try {
return new URL(url);
} catch (err) {
return '';
}
}
export function getURLHost(url) {
return getURL(url)?.host || '';
}
export function getURLHostName(url) {
return getURL(url)?.hostname || '';
}

View File

@ -1,7 +1,10 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { getTokenTrackerLink } from '@metamask/etherscan-link'; import { getTokenTrackerLink } from '@metamask/etherscan-link';
import { checkExistingAddresses } from '../../helpers/utils/util'; import {
checkExistingAddresses,
getURLHostName,
} from '../../helpers/utils/util';
import { tokenInfoGetter } from '../../helpers/utils/token-util'; import { tokenInfoGetter } from '../../helpers/utils/token-util';
import { CONFIRM_ADD_TOKEN_ROUTE } from '../../helpers/constants/routes'; import { CONFIRM_ADD_TOKEN_ROUTE } from '../../helpers/constants/routes';
import TextField from '../../components/ui/text-field'; import TextField from '../../components/ui/text-field';
@ -262,7 +265,7 @@ class AddToken extends Component {
{ blockExplorerUrl: rpcPrefs?.blockExplorerUrl ?? null }, { blockExplorerUrl: rpcPrefs?.blockExplorerUrl ?? null },
); );
const blockExplorerLabel = rpcPrefs?.blockExplorerUrl const blockExplorerLabel = rpcPrefs?.blockExplorerUrl
? new URL(blockExplorerTokenLink).hostname ? getURLHostName(blockExplorerTokenLink)
: this.context.t('etherscan'); : this.context.t('etherscan');
return ( return (

View File

@ -13,6 +13,7 @@ import {
} from '../../../selectors/selectors'; } from '../../../selectors/selectors';
import { showModal } from '../../../store/actions'; import { showModal } from '../../../store/actions';
import { DEFAULT_ROUTE } from '../../../helpers/constants/routes'; import { DEFAULT_ROUTE } from '../../../helpers/constants/routes';
import { getURLHostName } from '../../../helpers/utils/util';
import { useNewMetricEvent } from '../../../hooks/useMetricEvent'; import { useNewMetricEvent } from '../../../hooks/useMetricEvent';
import AssetNavigation from './asset-navigation'; import AssetNavigation from './asset-navigation';
import AssetOptions from './asset-options'; import AssetOptions from './asset-options';
@ -35,7 +36,7 @@ export default function NativeAsset({ nativeCurrency }) {
properties: { properties: {
link_type: 'Account Tracker', link_type: 'Account Tracker',
action: 'Asset Options', action: 'Asset Options',
block_explorer_domain: accountLink ? new URL(accountLink)?.hostname : '', block_explorer_domain: getURLHostName(accountLink),
}, },
}); });

View File

@ -11,6 +11,7 @@ import {
getRpcPrefsForCurrentProvider, getRpcPrefsForCurrentProvider,
} from '../../../selectors/selectors'; } from '../../../selectors/selectors';
import { DEFAULT_ROUTE } from '../../../helpers/constants/routes'; import { DEFAULT_ROUTE } from '../../../helpers/constants/routes';
import { getURLHostName } from '../../../helpers/utils/util';
import { showModal } from '../../../store/actions'; import { showModal } from '../../../store/actions';
import { useNewMetricEvent } from '../../../hooks/useMetricEvent'; import { useNewMetricEvent } from '../../../hooks/useMetricEvent';
@ -39,9 +40,7 @@ export default function TokenAsset({ token }) {
properties: { properties: {
link_type: 'Token Tracker', link_type: 'Token Tracker',
action: 'Token Options', action: 'Token Options',
block_explorer_domain: tokenTrackerLink block_explorer_domain: getURLHostName(tokenTrackerLink),
? new URL(tokenTrackerLink)?.hostname
: '',
}, },
}); });

View File

@ -0,0 +1,47 @@
/* eslint-disable react/prop-types */
import React, { useEffect } from 'react';
import { text } from '@storybook/addon-knobs';
import { store } from '../../../.storybook/preview';
import { suggestedTokens } from '../../../.storybook/initial-states/approval-screens/add-suggested-token';
import { updateMetamaskState } from '../../store/actions';
import ConfirmAddSuggestedToken from '.';
export default {
title: 'Confirmation Screens',
};
const PageSet = ({ children }) => {
const symbol = text('symbol', 'META');
const image = text('Icon URL', 'metamark.svg');
const state = store.getState();
const suggestedTokensState = state.metamask.suggestedTokens;
useEffect(() => {
suggestedTokensState[
'0x6b175474e89094c44da98b954eedeac495271d0f'
].symbol = symbol;
store.dispatch(
updateMetamaskState({ suggestedTokens: suggestedTokensState }),
);
}, [symbol, suggestedTokensState]);
useEffect(() => {
suggestedTokensState[
'0x6b175474e89094c44da98b954eedeac495271d0f'
].image = image;
store.dispatch(
updateMetamaskState({ suggestedTokens: suggestedTokensState }),
);
}, [image, suggestedTokensState]);
return children;
};
export const AddSuggestedToken = () => {
store.dispatch(updateMetamaskState({ suggestedTokens, pendingTokens: {} }));
return (
<PageSet>
<ConfirmAddSuggestedToken />
</PageSet>
);
};

View File

@ -0,0 +1,38 @@
/* eslint-disable react/prop-types */
import React, { useEffect } from 'react';
import { createBrowserHistory } from 'history';
import { text } from '@storybook/addon-knobs';
import { store } from '../../../.storybook/preview';
import { tokens } from '../../../.storybook/initial-states/approval-screens/add-token';
import { updateMetamaskState } from '../../store/actions';
import ConfirmAddToken from '.';
export default {
title: 'Confirmation Screens',
};
const history = createBrowserHistory();
const PageSet = ({ children }) => {
const symbol = text('symbol', 'TRDT');
const state = store.getState();
const pendingTokensState = state.metamask.pendingTokens;
// only change the first token in the list
useEffect(() => {
const pendingTokens = { ...pendingTokensState };
pendingTokens['0x33f90dee07c6e8b9682dd20f73e6c358b2ed0f03'].symbol = symbol;
store.dispatch(updateMetamaskState({ pendingTokens }));
}, [symbol, pendingTokensState]);
return children;
};
export const AddToken = () => {
store.dispatch(updateMetamaskState({ pendingTokens: tokens }));
return (
<PageSet>
<ConfirmAddToken history={history} />
</PageSet>
);
};

View File

@ -2,7 +2,7 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classnames from 'classnames'; import classnames from 'classnames';
import UrlIcon from '../../../components/ui/url-icon'; import UrlIcon from '../../../components/ui/url-icon';
import { addressSummary } from '../../../helpers/utils/util'; import { addressSummary, getURLHostName } from '../../../helpers/utils/util';
import { formatCurrency } from '../../../helpers/utils/confirm-tx.util'; import { formatCurrency } from '../../../helpers/utils/confirm-tx.util';
import { ConfirmPageContainerWarning } from '../../../components/app/confirm-page-container/confirm-page-container-content'; import { ConfirmPageContainerWarning } from '../../../components/app/confirm-page-container/confirm-page-container-content';
import Typography from '../../../components/ui/typography'; import Typography from '../../../components/ui/typography';
@ -256,7 +256,7 @@ export default class ConfirmApproveContent extends Component {
<UrlIcon <UrlIcon
className="confirm-approve-content__identicon" className="confirm-approve-content__identicon"
fallbackClassName="confirm-approve-content__identicon" fallbackClassName="confirm-approve-content__identicon"
name={origin ? new URL(origin).hostname : ''} name={getURLHostName(origin)}
url={siteImage} url={siteImage}
/> />
</div> </div>

View File

@ -0,0 +1,22 @@
import React from 'react';
import { store } from '../../../.storybook/preview';
import ConfirmTokenTransactionBase from './confirm-token-transaction-base.component';
export default {
title: 'Confirmation Screens',
};
const state = store.getState();
export const ConfirmTokenTransaction = () => {
const { metamask, confirmTransaction } = state;
const { currentCurrency } = metamask;
const { fiatTransactionTotal } = confirmTransaction;
return (
<ConfirmTokenTransactionBase
currentCurrency={currentCurrency}
fiatTransactionTotal={fiatTransactionTotal}
tokenSymbol="DAI"
/>
);
};

View File

@ -9,6 +9,7 @@ import {
hexToDecimal, hexToDecimal,
hexWEIToDecGWEI, hexWEIToDecGWEI,
} from '../../helpers/utils/conversions.util'; } from '../../helpers/utils/conversions.util';
import { getURLHostName } from '../../helpers/utils/util';
import { import {
CONFIRM_TRANSACTION_ROUTE, CONFIRM_TRANSACTION_ROUTE,
DEFAULT_ROUTE, DEFAULT_ROUTE,
@ -116,6 +117,7 @@ export default class ConfirmTransactionBase extends Component {
maxFeePerGas: PropTypes.string, maxFeePerGas: PropTypes.string,
maxPriorityFeePerGas: PropTypes.string, maxPriorityFeePerGas: PropTypes.string,
baseFeePerGas: PropTypes.string, baseFeePerGas: PropTypes.string,
isMainnet: PropTypes.bool,
gasFeeIsCustom: PropTypes.bool, gasFeeIsCustom: PropTypes.bool,
}; };
@ -295,17 +297,10 @@ export default class ConfirmTransactionBase extends Component {
primaryTotalTextOverrideMaxAmount, primaryTotalTextOverrideMaxAmount,
maxFeePerGas, maxFeePerGas,
maxPriorityFeePerGas, maxPriorityFeePerGas,
isMainnet,
} = this.props; } = this.props;
const { t } = this.context; const { t } = this.context;
const getRequestingOrigin = () => {
try {
return new URL(txData.origin)?.hostname;
} catch (err) {
return '';
}
};
const renderTotalMaxAmount = () => { const renderTotalMaxAmount = () => {
if ( if (
primaryTotalTextOverrideMaxAmount === undefined && primaryTotalTextOverrideMaxAmount === undefined &&
@ -315,6 +310,7 @@ export default class ConfirmTransactionBase extends Component {
return ( return (
<UserPreferencedCurrencyDisplay <UserPreferencedCurrencyDisplay
type={PRIMARY} type={PRIMARY}
key="total-max-amount"
value={addHexes(txData.txParams.value, hexMaximumTransactionFee)} value={addHexes(txData.txParams.value, hexMaximumTransactionFee)}
hideLabel={!useNativeCurrencyAsPrimaryCurrency} hideLabel={!useNativeCurrencyAsPrimaryCurrency}
/> />
@ -335,6 +331,7 @@ export default class ConfirmTransactionBase extends Component {
return ( return (
<UserPreferencedCurrencyDisplay <UserPreferencedCurrencyDisplay
type={PRIMARY} type={PRIMARY}
key="total-detail-value"
value={hexTransactionTotal} value={hexTransactionTotal}
hideLabel={!useNativeCurrencyAsPrimaryCurrency} hideLabel={!useNativeCurrencyAsPrimaryCurrency}
/> />
@ -353,6 +350,7 @@ export default class ConfirmTransactionBase extends Component {
return ( return (
<UserPreferencedCurrencyDisplay <UserPreferencedCurrencyDisplay
type={SECONDARY} type={SECONDARY}
key="total-detail-text"
value={hexTransactionTotal} value={hexTransactionTotal}
hideLabel={Boolean(useNativeCurrencyAsPrimaryCurrency)} hideLabel={Boolean(useNativeCurrencyAsPrimaryCurrency)}
/> />
@ -404,7 +402,7 @@ export default class ConfirmTransactionBase extends Component {
txData.dappSuggestedGasFees ? ( txData.dappSuggestedGasFees ? (
<> <>
{t('transactionDetailDappGasHeading', [ {t('transactionDetailDappGasHeading', [
getRequestingOrigin(), getURLHostName(txData?.origin),
])} ])}
<InfoTooltip <InfoTooltip
contentText={t('transactionDetailDappGasTooltip')} contentText={t('transactionDetailDappGasTooltip')}
@ -419,7 +417,11 @@ export default class ConfirmTransactionBase extends Component {
<InfoTooltip <InfoTooltip
contentText={ contentText={
<> <>
<p>{t('transactionDetailGasTooltipIntro')}</p> <p>
{t('transactionDetailGasTooltipIntro', [
isMainnet ? t('networkNameEthereum') : '',
])}
</p>
<p>{t('transactionDetailGasTooltipExplanation')}</p> <p>{t('transactionDetailGasTooltipExplanation')}</p>
<p> <p>
<a <a

View File

@ -3,6 +3,7 @@ import React, { PureComponent } from 'react';
import Popover from '../../components/ui/popover'; import Popover from '../../components/ui/popover';
import ConnectedAccountsList from '../../components/app/connected-accounts-list'; import ConnectedAccountsList from '../../components/app/connected-accounts-list';
import ConnectedAccountsPermissions from '../../components/app/connected-accounts-permissions'; import ConnectedAccountsPermissions from '../../components/app/connected-accounts-permissions';
import { getURLHost } from '../../helpers/utils/util';
export default class ConnectedAccounts extends PureComponent { export default class ConnectedAccounts extends PureComponent {
static contextTypes = { static contextTypes = {
@ -54,7 +55,7 @@ export default class ConnectedAccounts extends PureComponent {
title={ title={
isActiveTabExtension isActiveTabExtension
? t('currentExtension') ? t('currentExtension')
: new URL(activeTabOrigin).host : getURLHost(activeTabOrigin)
} }
subtitle={ subtitle={
connectedAccounts.length connectedAccounts.length

View File

@ -7,6 +7,8 @@ import Checkbox from '../../../components/ui/check-box';
import Dropdown from '../../../components/ui/dropdown'; import Dropdown from '../../../components/ui/dropdown';
import Popover from '../../../components/ui/popover'; import Popover from '../../../components/ui/popover';
import { getURLHostName } from '../../../helpers/utils/util';
class AccountList extends Component { class AccountList extends Component {
state = { state = {
showPopover: false, showPopover: false,
@ -143,9 +145,7 @@ class AccountList extends Component {
properties: { properties: {
actions: 'Hardware Connect', actions: 'Hardware Connect',
link_type: 'Account Tracker', link_type: 'Account Tracker',
block_explorer_domain: accountLink block_explorer_domain: getURLHostName(accountLink),
? new URL(accountLink)?.hostname
: '',
}, },
}); });
global.platform.openTab({ global.platform.openTab({

View File

@ -102,9 +102,10 @@ class JsonImportSubview extends Component {
setSelectedAddress, setSelectedAddress,
} = this.props; } = this.props;
const { fileContents } = this.state; const { fileContents } = this.state;
const { t } = this.context;
if (!fileContents) { if (!fileContents) {
const message = this.context.t('needImportFile'); const message = t('needImportFile');
displayWarning(message); displayWarning(message);
return; return;
} }
@ -124,7 +125,7 @@ class JsonImportSubview extends Component {
}); });
displayWarning(null); displayWarning(null);
} else { } else {
displayWarning('Error importing account.'); displayWarning(t('importAccountError'));
this.context.metricsEvent({ this.context.metricsEvent({
eventOpts: { eventOpts: {
category: 'Accounts', category: 'Accounts',

View File

@ -38,6 +38,7 @@ class PrivateKeyImportView extends Component {
setSelectedAddress, setSelectedAddress,
firstAddress, firstAddress,
} = this.props; } = this.props;
const { t } = this.context;
importNewAccount('Private Key', [privateKey]) importNewAccount('Private Key', [privateKey])
.then(({ selectedAddress }) => { .then(({ selectedAddress }) => {
@ -52,7 +53,7 @@ class PrivateKeyImportView extends Component {
history.push(mostRecentOverviewPage); history.push(mostRecentOverviewPage);
displayWarning(null); displayWarning(null);
} else { } else {
displayWarning('Error importing account.'); displayWarning(t('importAccountError'));
this.context.metricsEvent({ this.context.metricsEvent({
eventOpts: { eventOpts: {
category: 'Accounts', category: 'Accounts',

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