1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

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

This commit is contained in:
ryanml 2021-05-27 13:37:54 -07:00
commit 9075ea1cdf
1311 changed files with 6743 additions and 3845 deletions

View File

@ -52,6 +52,9 @@ workflows:
- test-lint-lockfile:
requires:
- prep-deps
- test-lint-changelog:
requires:
- prep-deps
- test-e2e-chrome:
requires:
- prep-build-test
@ -83,6 +86,7 @@ workflows:
- test-lint
- test-lint-shellcheck
- test-lint-lockfile
- test-lint-changelog
- test-unit
- test-unit-global
- validate-source-maps
@ -282,6 +286,33 @@ jobs:
name: lockfile-lint
command: yarn lint:lockfile
test-lint-changelog:
executor: node-browsers
steps:
- checkout
- attach_workspace:
at: .
- when:
condition:
not:
matches:
pattern: /^Version-v(\d+)[.](\d+)[.](\d+)$/
value: << pipeline.git.branch >>
steps:
- run:
name: Validate changelog
command: yarn auto-changelog validate
- when:
condition:
matches:
pattern: /^Version-v(\d+)[.](\d+)[.](\d+)$/
value: << pipeline.git.branch >>
steps:
- run:
name: Validate release candidate changelog
command: yarn auto-changelog validate --rc
test-deps:
executor: node-browsers
steps:
@ -474,7 +505,7 @@ jobs:
at: .
- run:
name: sentry sourcemaps upload
command: yarn sentry:publish
command: SENTRY_ORG=metamask SENTRY_PROJECT=metamask yarn sentry:publish
- run:
name: Create GitHub release
command: |
@ -485,7 +516,7 @@ jobs:
steps:
- add_ssh_keys:
fingerprints:
- "5e:a3:2d:35:b6:25:b5:87:b1:41:11:0d:77:50:96:73"
- "3d:49:29:f4:b2:e8:ea:af:d1:32:eb:2a:fc:15:85:d8"
- checkout
- attach_workspace:
at: .

View File

@ -19,9 +19,7 @@ fi
printf '%s\n' 'Updating the manifest version if needed'
version="${CIRCLE_BRANCH/Version-v/}"
updated_manifest="$(jq ".version = \"$version\"" app/manifest/_base.json)"
printf '%s\n' "$updated_manifest" > app/manifest/_base.json
yarn prettier --write app/manifest/_base.json
yarn version --no-git-tag-version --new-version "${version}"
if [[ -z $(git status --porcelain) ]]
then

View File

@ -16,9 +16,19 @@ then
exit 1
fi
if [[ -z "${GITHUB_TOKEN:-}" ]]
then
printf '%s\n' 'GITHUB_TOKEN environment variable must be set'
exit 1
elif [[ -z "${GITHUB_TOKEN_USER:-}" ]]
then
printf '%s\n' 'GITHUB_TOKEN_USER environment variable must be set'
exit 1
fi
printf '%s\n' 'Commit the manifest version and changelog if the manifest has changed'
if git diff --quiet app/manifest/_base.json;
if git diff --quiet package.json;
then
printf '%s\n' 'No manifest changes to commit'
exit 0
@ -28,7 +38,7 @@ git \
-c user.name='MetaMask Bot' \
-c user.email='metamaskbot@users.noreply.github.com' \
commit --message "${CIRCLE_BRANCH/-/ }" \
CHANGELOG.md app/manifest/_base.json
CHANGELOG.md package.json
repo_slug="$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME"
git push "https://$GITHUB_TOKEN_USER:$GITHUB_TOKEN@github.com/$repo_slug" "$CIRCLE_BRANCH"

View File

@ -16,12 +16,6 @@ then
exit 1
fi
if [[ -z "${GITHUB_TOKEN:-}" ]]
then
printf '%s\n' 'GITHUB_TOKEN environment variable must be set'
exit 1
fi
function install_github_cli ()
{
printf '%s\n' 'Installing hub CLI'

View File

@ -108,7 +108,7 @@ module.exports = {
},
{
files: ['**/*.test.js'],
excludedFiles: ['ui/**/*.test.js', 'ui/app/__mocks__/*.js'],
excludedFiles: ['ui/**/*.test.js', 'ui/__mocks__/*.js'],
extends: ['@metamask/eslint-config-mocha'],
rules: {
'mocha/no-setup-in-describe': 'off',
@ -125,7 +125,7 @@ module.exports = {
},
},
{
files: ['ui/**/*.test.js', 'ui/app/__mocks__/*.js'],
files: ['ui/**/*.test.js', 'ui/__mocks__/*.js'],
extends: ['@metamask/eslint-config-jest'],
rules: {
'jest/no-restricted-matchers': 'off',

2
.gitignore vendored
View File

@ -39,7 +39,7 @@ test-builds
build-artifacts
#ignore css output and sourcemaps
ui/app/css/output/
ui/css/output/
notes.txt

View File

@ -1,12 +1,12 @@
import React, { Component, createContext, useMemo } from 'react';
import PropTypes from 'prop-types';
import { getMessage } from '../ui/app/helpers/utils/i18n-helper';
import { I18nContext } from '../ui/app/contexts/i18n';
import { getMessage } from '../ui/helpers/utils/i18n-helper';
import { I18nContext } from '../ui/contexts/i18n';
export { I18nContext }
export { I18nContext };
export const I18nProvider = (props) => {
const { currentLocale, current, en } = props
const { currentLocale, current, en } = props;
const t = useMemo(() => {
return (key, ...args) =>

View File

@ -0,0 +1,56 @@
export const currentNetworkTxListSample = {
"id": 7900715443136469,
"time": 1621395091737,
"status": "unapproved",
"metamaskNetworkId": "1337",
"chainId": "0x539",
"loadingDefaults": false,
"txParams": {
"from": "0x90f79bf6eb2c4f870365e785982e1f101e93b906",
"to": "0x057ef64e23666f000b34ae31332854acbd1c8544",
"value": "0x0",
"data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170",
"gas": "0xea60",
"gasPrice": "0x4a817c800"
},
"origin": "https://metamask.github.io",
"type": "approve",
"history": [
{
"id": 7900715443136469,
"time": 1621395091737,
"status": "unapproved",
"metamaskNetworkId": "1337",
"chainId": "0x539",
"loadingDefaults": true,
"txParams": {
"from": "0x90f79bf6eb2c4f870365e785982e1f101e93b906",
"to": "0x057ef64e23666f000b34ae31332854acbd1c8544",
"value": "0x0",
"data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170",
"gas": "0xea60",
"gasPrice": "0x4a817c800"
},
"origin": "https://metamask.github.io",
"type": "approve"
},
[
{
"op": "replace",
"path": "/loadingDefaults",
"value": false,
"note": "Added new unapproved transaction.",
"timestamp": 1621395091742
}
]
]
}
export const domainMetadata = {
"https://metamask.github.io": {
"name": "E2E Test Dapp",
"icon": "https://metamask.github.io/test-dapp/metamask-fox.svg",
"lastUpdated": 1620723443380,
"host": "metamask.github.io"
}
}

View File

@ -1,9 +1,9 @@
const path = require('path')
const path = require('path');
const CopyWebpackPlugin = require('copy-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin');
module.exports = {
stories: ['../ui/app/**/*.stories.js'],
stories: ['../ui/**/*.stories.js'],
addons: [
'@storybook/addon-knobs',
'@storybook/addon-actions',
@ -12,7 +12,7 @@ module.exports = {
'./i18n-party-addon/register.js',
],
webpackFinal: async (config) => {
config.module.strictExportPresence = true
config.module.strictExportPresence = true;
config.module.rules.push({
test: /\.scss$/,
loaders: [
@ -31,12 +31,12 @@ module.exports = {
sourceMap: true,
implementation: require('sass'),
sassOptions: {
includePaths: ['ui/app/css/'],
includePaths: ['ui/css/'],
},
},
},
],
})
});
config.plugins.push(
new CopyWebpackPlugin({
patterns: [
@ -51,7 +51,7 @@ module.exports = {
},
],
}),
)
return config
);
return config;
},
}
};

24
.storybook/metametrics.js Normal file
View File

@ -0,0 +1,24 @@
import React from 'react';
import {
MetaMetricsProvider,
LegacyMetaMetricsProvider,
} from '../ui/contexts/metametrics';
import {
MetaMetricsProvider as NewMetaMetricsProvider,
LegacyMetaMetricsProvider as NewLegacyMetaMetricsProvider,
} from '../ui/contexts/metametrics.new';
const MetaMetricsProviderStorybook = (props) =>
(
<MetaMetricsProvider>
<LegacyMetaMetricsProvider>
<NewMetaMetricsProvider>
<NewLegacyMetaMetricsProvider>
{props.children}
</NewLegacyMetaMetricsProvider>
</NewMetaMetricsProvider>
</LegacyMetaMetricsProvider>
</MetaMetricsProvider>
);
export default MetaMetricsProviderStorybook

View File

@ -1,14 +1,18 @@
import React, { useEffect } from 'react';
import { addDecorator, addParameters } from '@storybook/react';
import { useGlobals } from '@storybook/api';
import { action } from '@storybook/addon-actions';
import { withKnobs } from '@storybook/addon-knobs';
import { Provider } from 'react-redux';
import configureStore from '../ui/app/store/store';
import '../ui/app/css/index.scss';
import configureStore from '../ui/store/store';
import '../ui/css/index.scss';
import localeList from '../app/_locales/index.json';
import * as allLocales from './locales';
import { I18nProvider, LegacyI18nProvider } from './i18n';
import testData from './test-data.js'
import MetaMetricsProviderStorybook from './metametrics'
import testData from './test-data.js';
import { Router } from "react-router-dom";
import { createBrowserHistory } from "history";
import { _setBackgroundConnection } from '../ui/store/actions'
addParameters({
backgrounds: {
@ -41,13 +45,25 @@ const styles = {
alignItems: 'center',
};
const store = configureStore(testData)
export const store = configureStore(testData);
const history = createBrowserHistory();
const proxiedBackground = new Proxy({}, {
get(_, method) {
return function() {
action(`Background call: ${method}`)()
return new Promise(() => {})
}
}
})
_setBackgroundConnection(proxiedBackground)
const metamaskDecorator = (story, context) => {
const currentLocale = context.globals.locale;
const current = allLocales[currentLocale];
return (
<Provider store={store}>
<Router history={history}>
<MetaMetricsProviderStorybook>
<I18nProvider
currentLocale={currentLocale}
current={current}
@ -57,6 +73,8 @@ const metamaskDecorator = (story, context) => {
<div style={styles}>{story()}</div>
</LegacyI18nProvider>
</I18nProvider>
</MetaMetricsProviderStorybook>
</Router>
</Provider>
);
};

View File

@ -1,217 +1,782 @@
import { TRANSACTION_STATUSES } from '../shared/constants/transaction';
const state = {
metamask: {
isInitialized: true,
isUnlocked: true,
featureFlags: { sendHexData: true },
identities: {
'0xfdea65c8e26263f6d9a1b5de9555d2931a33b825': {
address: '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825',
name: 'Send Account 1',
"invalidCustomNetwork": {
"state": "CLOSED",
"networkName": ""
},
'0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb': {
address: '0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb',
name: 'Send Account 2',
"unconnectedAccount": {
"state": "CLOSED"
},
'0x2f8d4a878cfa04a6e60d46362f5644deab66572d': {
address: '0x2f8d4a878cfa04a6e60d46362f5644deab66572d',
name: 'Send Account 3',
"activeTab": {},
"metamask": {
"isInitialized": true,
"isUnlocked": true,
"isAccountMenuOpen": false,
"rpcUrl": "https://rawtestrpc.metamask.io/",
"identities": {
"0x983211ce699ea5ab57cc528086154b6db1ad8e55": {
"name": "Account 1",
"address": "0x983211ce699ea5ab57cc528086154b6db1ad8e55"
},
'0xd85a4b6a394794842887b8284293d69163007bbb': {
address: '0xd85a4b6a394794842887b8284293d69163007bbb',
name: 'Send Account 4',
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": {
"name": "Account 2",
"address": "0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e"
},
"0x9d0ba4ddac06032527b140912ec808ab9451b788": {
"name": "Account 3",
"address": "0x9d0ba4ddac06032527b140912ec808ab9451b788"
}
},
cachedBalances: {},
currentBlockGasLimit: '0x4c1878',
currentCurrency: 'USD',
conversionRate: 1200.88200327,
conversionDate: 1489013762,
nativeCurrency: 'ETH',
frequentRpcList: [],
network: '3',
provider: {
type: 'ropsten',
chainId: '0x3',
"unapprovedTxs": {
"7786962153682822": {
"id": 7786962153682822,
"time": 1620710815484,
"status": "unapproved",
"metamaskNetworkId": "3",
"chainId": "0x3",
"loadingDefaults": false,
"txParams": {
"from": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"to": "0xad6d458402f60fd3bd25163575031acdce07538d",
"value": "0x0",
"data": "0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000",
"gas": "0xcb28",
"gasPrice": "0x77359400"
},
accounts: {
'0xfdea65c8e26263f6d9a1b5de9555d2931a33b825': {
code: '0x',
balance: '0x47c9d71831c76efe',
nonce: '0x1b',
address: '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825',
},
'0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb': {
code: '0x',
balance: '0x37452b1315889f80',
nonce: '0xa',
address: '0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb',
},
'0x2f8d4a878cfa04a6e60d46362f5644deab66572d': {
code: '0x',
balance: '0x30c9d71831c76efe',
nonce: '0x1c',
address: '0x2f8d4a878cfa04a6e60d46362f5644deab66572d',
},
'0xd85a4b6a394794842887b8284293d69163007bbb': {
code: '0x',
balance: '0x0',
nonce: '0x0',
address: '0xd85a4b6a394794842887b8284293d69163007bbb',
},
},
addressBook: {
'0x3': {
'0x06195827297c7a80a443b6894d3bdb8824b43896': {
address: '0x06195827297c7a80a443b6894d3bdb8824b43896',
name: 'Address Book Account 1',
chainId: '0x3',
},
},
},
tokens: [
"type": "standard",
"origin": "metamask",
"transactionCategory": "transfer",
"history": [
{
address: '0x1a195821297c7a80a433b6894d3bdb8824b43896',
decimals: 18,
symbol: 'ABC',
"id": 7786962153682822,
"time": 1620710815484,
"status": "unapproved",
"metamaskNetworkId": "3",
"chainId": "0x3",
"loadingDefaults": true,
"txParams": {
"from": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"to": "0xad6d458402f60fd3bd25163575031acdce07538d",
"value": "0x0",
"data": "0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000",
"gas": "0xcb28",
"gasPrice": "0x77359400"
},
"type": "standard",
"origin": "metamask",
"transactionCategory": "transfer"
},
[
{
address: '0x8d6b81208414189a58339873ab429b6c47ab92d3',
decimals: 4,
symbol: 'DEF',
"op": "replace",
"path": "/loadingDefaults",
"value": false,
"note": "Added new unapproved transaction.",
"timestamp": 1620710815497
}
]
]
}
},
"frequentRpcList": [],
"addressBook": {
"undefined": {
"0": {
"address": "0x39a4e4Af7cCB654dB9500F258c64781c8FbD39F0",
"name": "",
"isEns": false
}
}
},
"contractExchangeRates": {
"0xad6d458402f60fd3bd25163575031acdce07538d": 0
},
"tokens": [
{
address: '0xa42084c8d1d9a2198631988579bb36b48433a72b',
decimals: 18,
symbol: 'GHI',
},
"address": "0xad6d458402f60fd3bd25163575031acdce07538d",
"symbol": "DAI",
"decimals": 18
}
],
transactions: {},
currentNetworkTxList: [
{
id: 'mockTokenTx1',
txParams: {
to: '0x8d6b81208414189a58339873ab429b6c47ab92d3',
from: '0xd85a4b6a394794842887b8284293d69163007bbb',
"pendingTokens": {},
"customNonceValue": "",
"send": {
"gasLimit": "0xcb28",
"gasPrice": null,
"gasTotal": null,
"tokenBalance": "8.7a73149c048545a3fe58",
"from": "",
"to": "0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e",
"amount": "3782dace9d900000",
"memo": "",
"errors": {},
"maxModeOn": false,
"editingTransactionId": null,
"toNickname": "Account 2",
"ensResolution": null,
"ensResolutionError": "",
"token": {
"address": "0xad6d458402f60fd3bd25163575031acdce07538d",
"symbol": "DAI",
"decimals": 18
}
},
time: 1700000000000,
"useBlockie": false,
"featureFlags": {},
"welcomeScreenSeen": false,
"currentLocale": "en",
"preferences": {
"useNativeCurrencyAsPrimaryCurrency": true
},
{
id: 'mockTokenTx2',
txParams: {
to: '0xafaketokenaddress',
from: '0xd85a4b6a394794842887b8284293d69163007bbb',
"firstTimeFlowType": "create",
"completedOnboarding": true,
"knownMethodData": {
"0x60806040": {
"name": "Approve Tokens"
},
time: 1600000000000,
"0x095ea7b3": {
"name": "Approve Tokens"
}
},
{
id: 'mockTokenTx3',
txParams: {
to: '0x8d6b81208414189a58339873ab429b6c47ab92d3',
from: '0xd85a4b6a394794842887b8284293d69163007bbb',
"participateInMetaMetrics": true,
"metaMetricsSendCount": 2,
"nextNonce": 71,
"connectedStatusPopoverHasBeenShown": true,
"swapsWelcomeMessageHasBeenShown": true,
"defaultHomeActiveTabName": "Assets",
"provider": {
"type": "ropsten",
"ticker": "ETH",
"nickname": "",
"rpcUrl": "",
"chainId": "0x3"
},
time: 1500000000000,
"previousProviderStore": {
"type": "ropsten",
"ticker": "ETH",
"nickname": "",
"rpcUrl": "",
"chainId": "0x3"
},
{
id: 'mockEthTx1',
txParams: {
to: '0xd85a4b6a394794842887b8284293d69163007bbb',
from: '0xd85a4b6a394794842887b8284293d69163007bbb',
"network": "3",
"accounts": {
"0x983211ce699ea5ab57cc528086154b6db1ad8e55": {
"address": "0x983211ce699ea5ab57cc528086154b6db1ad8e55",
"balance": "0x176e5b6f173ebe66"
},
time: 1400000000000,
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": {
"address": "0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e",
"balance": "0x2d3142f5000"
},
"0x9d0ba4ddac06032527b140912ec808ab9451b788": {
"address": "0x9d0ba4ddac06032527b140912ec808ab9451b788",
"balance": "0x15f6f0b9d4f8d000"
}
},
"currentBlockGasLimit": "0x793af4",
"currentNetworkTxList": [
],
unapprovedMsgs: {
'0xabc': { id: 'unapprovedMessage1', time: 1650000000000 },
'0xdef': { id: 'unapprovedMessage2', time: 1550000000000 },
'0xghi': { id: 'unapprovedMessage3', time: 1450000000000 },
"cachedBalances": {
"1": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": "0x0",
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": "0xcaf5317161f400",
"0x9d0ba4ddac06032527b140912ec808ab9451b788": "0x0"
},
unapprovedMsgCount: 0,
unapprovedPersonalMsgs: {},
unapprovedPersonalMsgCount: 0,
unapprovedDecryptMsgs: {},
unapprovedDecryptMsgCount: 0,
unapprovedEncryptionPublicKeyMsgs: {},
unapprovedEncryptionPublicKeyMsgCount: 0,
keyringTypes: ['Simple Key Pair', 'HD Key Tree'],
keyrings: [
{
type: 'HD Key Tree',
accounts: [
'fdea65c8e26263f6d9a1b5de9555d2931a33b825',
'c5b8dbac4c1d3f152cdeb400e2313f309c410acb',
'2f8d4a878cfa04a6e60d46362f5644deab66572d',
"3": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": "0x18d289d450bace66",
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": "0x2d3142f5000",
"0x9d0ba4ddac06032527b140912ec808ab9451b788": "0x15f6f0b9d4f8d000"
},
"0x3": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": "0x176e5b6f173ebe66",
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": "0x2d3142f5000",
"0x9d0ba4ddac06032527b140912ec808ab9451b788": "0x15f6f0b9d4f8d000"
}
},
"unapprovedMsgs": {},
"unapprovedMsgCount": 0,
"unapprovedPersonalMsgs": {},
"unapprovedPersonalMsgCount": 0,
"unapprovedDecryptMsgs": {},
"unapprovedDecryptMsgCount": 0,
"unapprovedEncryptionPublicKeyMsgs": {},
"unapprovedEncryptionPublicKeyMsgCount": 0,
"unapprovedTypedMessages": {},
"unapprovedTypedMessagesCount": 0,
"keyringTypes": [
"Simple Key Pair",
"HD Key Tree",
"Trezor Hardware",
"Ledger Hardware"
],
"keyrings": [
{
"type": "HD Key Tree",
"accounts": [
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e",
"0x9d0ba4ddac06032527b140912ec808ab9451b788"
]
}
],
"frequentRpcListDetail": [
{
"rpcUrl": "http://localhost:8545",
"chainId": "0x539",
"ticker": "ETH",
"nickname": "Localhost 8545",
"rpcPrefs": {}
}
],
"accountTokens": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": {
"0x1": [
{
"address": "0x6b175474e89094c44da98b954eedeac495271d0f",
"symbol": "DAI",
"decimals": 18
},
{
type: 'Simple Key Pair',
accounts: ['0xd85a4b6a394794842887b8284293d69163007bbb'],
},
"address": "0x0d8775f648430679a709e98d2b0cb6250d2887ef",
"symbol": "BAT",
"decimals": 18
}
],
selectedAddress: '0xd85a4b6a394794842887b8284293d69163007bbb',
send: {
gasLimit: '0xFFFF',
gasPrice: '0xaa',
gasTotal: '0xb451dc41b578',
tokenBalance: 3434,
from: '0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb',
to: '0x987fedabc',
amount: '0x080',
memo: '',
errors: {
someError: null,
"0x3": [
{
"address": "0xad6d458402f60fd3bd25163575031acdce07538d",
"symbol": "DAI",
"decimals": 18
}
]
},
maxModeOn: false,
editingTransactionId: 97531,
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": {},
"0x9d0ba4ddac06032527b140912ec808ab9451b788": {}
},
unapprovedTxs: {
4768706228115573: {
id: 4768706228115573,
time: 1487363153561,
status: TRANSACTION_STATUSES.UNAPPROVED,
gasMultiplier: 1,
metamaskNetworkId: '3',
txParams: {
from: '0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb',
to: '0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761',
value: '0xde0b6b3a7640000',
metamaskId: 4768706228115573,
metamaskNetworkId: '3',
gas: '0x5209',
"accountHiddenTokens": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": {
"0x3": []
}
},
txFee: '17e0186e60800',
txValue: 'de0b6b3a7640000',
maxCost: 'de234b52e4a0800',
gasPrice: '4a817c800',
"assetImages": {
"0xad6d458402f60fd3bd25163575031acdce07538d": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xaD6D458402F60fD3Bd25163575031ACDce07538D/logo.png"
},
"hiddenTokens": [],
"suggestedTokens": {},
"useNonceField": false,
"usePhishDetect": true,
"lostIdentities": {},
"forgottenPassword": false,
"ipfsGateway": "dweb.link",
"infuraBlocked": false,
"migratedPrivacyMode": false,
"selectedAddress": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"metaMetricsId": "0xc2377d11fec1c3b7dd88c4854240ee5e3ed0d9f63b00456d98d80320337b827f",
"conversionDate": 1620710825.03,
"conversionRate": 3910.28,
"currentCurrency": "usd",
"nativeCurrency": "ETH",
"usdConversionRate": 3910.28,
"ticker": "ETH",
"alertEnabledness": {
"unconnectedAccount": true,
"web3ShimUsage": true
},
currentLocale: 'en',
"unconnectedAccountAlertShownOrigins": {},
"web3ShimUsageOrigins": {},
"seedPhraseBackedUp": null,
"onboardingTabs": {},
"incomingTransactions": {
"0x2de9256a7c604586f7ecfd87ae9509851e217f588f9f85feed793c54ed2ce0aa": {
"blockNumber": "8888976",
"id": 4678200543090532,
"metamaskNetworkId": "1",
"status": "confirmed",
"time": 1573114896000,
"txParams": {
"from": "0x3f1b52850109023775d238c7ed5d5e7161041fd1",
"gas": "0x5208",
"gasPrice": "0x124101100",
"nonce": "0x35",
"to": "0x045c619e4d29bba3b92769508831b681b83d6a96",
"value": "0xbca9bce4d98ca3"
},
appState: {
menuOpen: false,
currentView: {
name: 'accountDetail',
detailView: null,
context: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc',
"hash": "0x2de9256a7c604586f7ecfd87ae9509851e217f588f9f85feed793c54ed2ce0aa",
"transactionCategory": "incoming"
},
accountDetail: {
subview: 'transactions',
"0x320a1fd769373578f78570e5d8f56e89bc7bce9657bb5f4c12d8fe790d471bfd": {
"blockNumber": "9453174",
"id": 4678200543090535,
"metamaskNetworkId": "1",
"status": "confirmed",
"time": 1581312411000,
"txParams": {
"from": "0xa17bd07d6d38cb9e37b29f7659a4b1047701e969",
"gas": "0xc350",
"gasPrice": "0x1a13b8600",
"nonce": "0x0",
"to": "0x045c619e4d29bba3b92769508831b681b83d6a96",
"value": "0xcdb08ab4254000"
},
modal: {
modalState: {},
previousModalState: {},
"hash": "0x320a1fd769373578f78570e5d8f56e89bc7bce9657bb5f4c12d8fe790d471bfd",
"transactionCategory": "incoming"
},
isLoading: false,
warning: null,
scrollToBottom: false,
forgottenPassword: null,
"0x8add6c1ea089a8de9b15fa2056b1875360f17916755c88ace9e5092b7a4b1239": {
"blockNumber": "10892417",
"id": 4678200543090542,
"metamaskNetworkId": "1",
"status": "confirmed",
"time": 1600515224000,
"txParams": {
"from": "0x0681d8db095565fe8a346fa0277bffde9c0edbbf",
"gas": "0x5208",
"gasPrice": "0x1d1a94a200",
"nonce": "0x2bb8a5",
"to": "0x045c619e4d29bba3b92769508831b681b83d6a96",
"value": "0xe6ed27d6668000"
},
send: {
fromDropdownOpen: false,
toDropdownOpen: false,
errors: { someError: null },
"hash": "0x8add6c1ea089a8de9b15fa2056b1875360f17916755c88ace9e5092b7a4b1239",
"transactionCategory": "incoming"
},
};
"0x50be62ab1cabd03ff104c602c11fdef7a50f3d73c55006d5583ba97950ab1144": {
"blockNumber": "10902987",
"id": 4678200543090545,
"metamaskNetworkId": "1",
"status": "confirmed",
"time": 1600654021000,
"txParams": {
"from": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"gas": "0x5208",
"gasPrice": "0x147d357000",
"nonce": "0xf",
"to": "0x045c619e4d29bba3b92769508831b681b83d6a96",
"value": "0x63eb89da4ed00000"
},
"hash": "0x50be62ab1cabd03ff104c602c11fdef7a50f3d73c55006d5583ba97950ab1144",
"transactionCategory": "incoming"
}
},
"incomingTxLastFetchedBlocksByNetwork": {
"ropsten": 8872820,
"rinkeby": null,
"kovan": null,
"goerli": null,
"mainnet": 10902989
},
"permissionsRequests": [],
"permissionsDescriptions": {},
"domains": {
"https://app.uniswap.org": {
"permissions": [
{
"@context": [
"https://github.com/MetaMask/rpc-cap"
],
"invoker": "https://app.uniswap.org",
"parentCapability": "eth_accounts",
"id": "a7342e4b-beae-4525-a36c-c0635fd03359",
"date": 1620710693178,
"caveats": [
{
"type": "limitResponseLength",
"value": 1,
"name": "primaryAccountOnly"
},
{
"type": "filterResponse",
"value": [
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4"
],
"name": "exposedAccounts"
}
]
}
]
}
},
"permissionsLog": [
{
"id": 522690215,
"method": "eth_accounts",
"methodType": "restricted",
"origin": "https://metamask.io",
"request": {
"method": "eth_accounts",
"params": [],
"jsonrpc": "2.0",
"id": 522690215,
"origin": "https://metamask.io",
"tabId": 5
},
"requestTime": 1602643170686,
"response": {
"id": 522690215,
"jsonrpc": "2.0",
"result": []
},
"responseTime": 1602643170688,
"success": true
},
{
"id": 1620464600,
"method": "eth_accounts",
"methodType": "restricted",
"origin": "https://widget.getacute.io",
"request": {
"method": "eth_accounts",
"params": [],
"jsonrpc": "2.0",
"id": 1620464600,
"origin": "https://widget.getacute.io",
"tabId": 5
},
"requestTime": 1602643172935,
"response": {
"id": 1620464600,
"jsonrpc": "2.0",
"result": []
},
"responseTime": 1602643172935,
"success": true
},
{
"id": 4279100021,
"method": "eth_accounts",
"methodType": "restricted",
"origin": "https://app.uniswap.org",
"request": {
"method": "eth_accounts",
"jsonrpc": "2.0",
"id": 4279100021,
"origin": "https://app.uniswap.org",
"tabId": 5
},
"requestTime": 1620710669962,
"response": {
"id": 4279100021,
"jsonrpc": "2.0",
"result": []
},
"responseTime": 1620710669963,
"success": true
},
{
"id": 4279100022,
"method": "eth_requestAccounts",
"methodType": "restricted",
"origin": "https://app.uniswap.org",
"request": {
"method": "eth_requestAccounts",
"jsonrpc": "2.0",
"id": 4279100022,
"origin": "https://app.uniswap.org",
"tabId": 5
},
"requestTime": 1620710686872,
"response": {
"id": 4279100022,
"jsonrpc": "2.0",
"result": [
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4"
]
},
"responseTime": 1620710693187,
"success": true
},
{
"id": 4279100023,
"method": "eth_requestAccounts",
"methodType": "restricted",
"origin": "https://app.uniswap.org",
"request": {
"method": "eth_requestAccounts",
"jsonrpc": "2.0",
"id": 4279100023,
"origin": "https://app.uniswap.org",
"tabId": 5
},
"requestTime": 1620710693204,
"response": {
"id": 4279100023,
"jsonrpc": "2.0",
"result": [
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4"
]
},
"responseTime": 1620710693213,
"success": true
},
{
"id": 4279100034,
"method": "eth_accounts",
"methodType": "restricted",
"origin": "https://app.uniswap.org",
"request": {
"method": "eth_accounts",
"params": [],
"jsonrpc": "2.0",
"id": 4279100034,
"origin": "https://app.uniswap.org",
"tabId": 5
},
"requestTime": 1620710712072,
"response": {
"id": 4279100034,
"jsonrpc": "2.0",
"result": [
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4"
]
},
"responseTime": 1620710712075,
"success": true
}
],
"permissionsHistory": {
"https://app.uniswap.org": {
"eth_accounts": {
"lastApproved": 1620710693213,
"accounts": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": 1620710693213
}
}
}
},
"domainMetadata": {
"https://metamask.github.io": {
"name": "E2E Test Dapp",
"icon": "https://metamask.github.io/test-dapp/metamask-fox.svg",
"lastUpdated": 1620723443380,
"host": "metamask.github.io"
}
},
"threeBoxSyncingAllowed": false,
"showRestorePrompt": true,
"threeBoxLastUpdated": 0,
"threeBoxAddress": null,
"threeBoxSynced": false,
"threeBoxDisabled": false,
"swapsState": {
"quotes": {},
"fetchParams": null,
"tokens": null,
"tradeTxId": null,
"approveTxId": null,
"quotesLastFetched": null,
"customMaxGas": "",
"customGasPrice": null,
"selectedAggId": null,
"customApproveTxData": "",
"errorKey": "",
"topAggId": null,
"routeState": "",
"swapsFeatureIsLive": false,
"swapsQuoteRefreshTime": 60000
},
"ensResolutionsByAddress": {},
"pendingApprovals": {},
"pendingApprovalCount": 0
},
"appState": {
"shouldClose": false,
"menuOpen": false,
"modal": {
"open": false,
"modalState": {
"name": null,
"props": {}
},
"previousModalState": {
"name": null
}
},
"sidebar": {
"isOpen": false,
"transitionName": "",
"type": "",
"props": {}
},
"alertOpen": false,
"alertMessage": null,
"qrCodeData": null,
"networkDropdownOpen": false,
"accountDetail": {
"subview": "transactions"
},
"isLoading": false,
"warning": null,
"buyView": {},
"isMouseUser": true,
"gasIsLoading": false,
"defaultHdPaths": {
"trezor": "m/44'/60'/0'/0",
"ledger": "m/44'/60'/0'/0/0"
},
"networksTabSelectedRpcUrl": "",
"networksTabIsInAddMode": false,
"loadingMethodData": false,
"show3BoxModalAfterImport": false,
"threeBoxLastUpdated": null,
"requestAccountTabs": {},
"openMetaMaskTabs": {},
"currentWindowTab": {}
},
"history": {
"mostRecentOverviewPage": "/"
},
"send": {
"toDropdownOpen": false,
"gasButtonGroupShown": true,
"errors": {}
},
"confirmTransaction": {
"txData": {
"id": 3111025347726181,
"time": 1620723786838,
"status": "unapproved",
"metamaskNetworkId": "3",
"chainId": "0x3",
"loadingDefaults": false,
"txParams": {
"from": "0x983211ce699ea5ab57cc528086154b6db1ad8e55",
"to": "0xad6d458402f60fd3bd25163575031acdce07538d",
"value": "0x0",
"data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170",
"gas": "0xea60",
"gasPrice": "0x4a817c800"
},
"type": "standard",
"origin": "https://metamask.github.io",
"transactionCategory": "approve",
"history": [
{
"id": 3111025347726181,
"time": 1620723786838,
"status": "unapproved",
"metamaskNetworkId": "3",
"chainId": "0x3",
"loadingDefaults": true,
"txParams": {
"from": "0x983211ce699ea5ab57cc528086154b6db1ad8e55",
"to": "0xad6d458402f60fd3bd25163575031acdce07538d",
"value": "0x0",
"data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170",
"gas": "0xea60",
"gasPrice": "0x4a817c800"
},
"type": "standard",
"origin": "https://metamask.github.io",
"transactionCategory": "approve"
},
[
{
"op": "replace",
"path": "/loadingDefaults",
"value": false,
"note": "Added new unapproved transaction.",
"timestamp": 1620723786844
}
]
]
},
"tokenData": {
"args": [
"0x9bc5baF874d2DA8D216aE9f137804184EE5AfEF4",
{
"type": "BigNumber",
"hex": "0x011170"
}
],
"functionFragment": {
"type": "function",
"name": "approve",
"constant": false,
"inputs": [
{
"name": "_spender",
"type": "address",
"indexed": null,
"components": null,
"arrayLength": null,
"arrayChildren": null,
"baseType": "address",
"_isParamType": true
},
{
"name": "_value",
"type": "uint256",
"indexed": null,
"components": null,
"arrayLength": null,
"arrayChildren": null,
"baseType": "uint256",
"_isParamType": true
}
],
"outputs": [
{
"name": "success",
"type": "bool",
"indexed": null,
"components": null,
"arrayLength": null,
"arrayChildren": null,
"baseType": "bool",
"_isParamType": true
}
],
"payable": false,
"stateMutability": "nonpayable",
"gas": null,
"_isFragment": true
},
"name": "approve",
"signature": "approve(address,uint256)",
"sighash": "0x095ea7b3",
"value": {
"type": "BigNumber",
"hex": "0x00"
}
},
"fiatTransactionAmount": "0",
"fiatTransactionFee": "4.72",
"fiatTransactionTotal": "4.72",
"ethTransactionAmount": "0",
"ethTransactionFee": "0.0012",
"ethTransactionTotal": "0.0012",
"hexTransactionAmount": "0x0",
"hexTransactionFee": "0x44364c5bb0000",
"hexTransactionTotal": "0x44364c5bb0000",
"nonce": ""
},
"swaps": {
"aggregatorMetadata": null,
"approveTxId": null,
"balanceError": false,
"fetchingQuotes": false,
"fromToken": null,
"quotesFetchStartTime": null,
"topAssets": {},
"toToken": null,
"customGas": {
"price": null,
"limit": null,
"loading": "INITIAL",
"priceEstimates": {},
"fallBackPrice": null
}
},
"gas": {
"customData": {
"price": null,
"limit": "0xcb28"
},
"basicEstimates": {
"average": 2
},
"basicEstimateIsLoading": false
}
}
export default state;

File diff suppressed because it is too large Load Diff

View File

@ -486,7 +486,7 @@
"message": "Some of your account data was backed up during a previous installation of MetaMask. This could include your settings, contacts, and tokens. Would you like to restore this data now?"
},
"decimal": {
"message": "Decimals of Precision"
"message": "Token Decimal"
},
"decimalsMustZerotoTen": {
"message": "Decimals must be at least 0, and not over 36."
@ -556,6 +556,15 @@
"dismiss": {
"message": "Dismiss"
},
"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"
},
"dismissReminderField": {
"message": "Dismiss recovery phrase backup reminder"
},
"domain": {
"message": "Domain"
},
"done": {
"message": "Done"
},
@ -597,7 +606,7 @@
"message": "Request encryption public key"
},
"endOfFlowMessage1": {
"message": "You passed the test - keep your seedphrase safe, it's your responsibility!"
"message": "You passed the test - keep your Secret Recovery Phrase safe, it's your responsibility!"
},
"endOfFlowMessage10": {
"message": "All Done"
@ -612,17 +621,17 @@
"message": "Never share the phrase with anyone."
},
"endOfFlowMessage5": {
"message": "Be careful of phishing! MetaMask will never spontaneously ask for your seed phrase."
"message": "Be careful of phishing! MetaMask will never spontaneously ask for your Secret Recovery Phrase."
},
"endOfFlowMessage6": {
"message": "If you need to back up your seed phrase again, you can find it in Settings -> Security."
"message": "If you need to back up your Secret Recovery Phrase again, you can find it in Settings -> Security."
},
"endOfFlowMessage7": {
"message": "If you ever have questions or see something fishy, contact our support $1.",
"description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets."
},
"endOfFlowMessage8": {
"message": "MetaMask cannot recover your seedphrase."
"message": "MetaMask cannot recover your Secret Recovery Phrase."
},
"endOfFlowMessage9": {
"message": "Learn more."
@ -684,6 +693,9 @@
"estimatedProcessingTimes": {
"message": "Estimated Processing Times"
},
"ethGasPriceFetchWarning": {
"message": "Backup gas price is provided as the main gas estimation service is unavailable right now."
},
"eth_accounts": {
"message": "View the addresses of your permitted accounts (required)",
"description": "The description for the `eth_accounts` permission"
@ -780,6 +792,9 @@
"gasPriceExtremelyLow": {
"message": "Gas Price Extremely Low"
},
"gasPriceFetchFailed": {
"message": "Gas price estimation failed due to network error."
},
"gasPriceInfoTooltipContent": {
"message": "Gas price specifies the amount of Ether you are willing to pay for each unit of gas."
},
@ -866,13 +881,13 @@
"message": "Import Account"
},
"importAccountLinkText": {
"message": "import using seed phrase"
"message": "import using Secret Recovery Phrase"
},
"importAccountMsg": {
"message": " Imported accounts will not be associated with your originally created MetaMask account seedphrase. Learn more about imported accounts "
"message": " Imported accounts will not be associated with your originally created MetaMask account Secret Recovery Phrase. Learn more about imported accounts "
},
"importAccountSeedPhrase": {
"message": "Import an account with seed phrase"
"message": "Import an account with Secret Recovery Phrase"
},
"importAccountText": {
"message": "or $1",
@ -882,7 +897,7 @@
"message": "Import wallet"
},
"importYourExisting": {
"message": "Import your existing wallet using a seed phrase"
"message": "Import your existing wallet using a Secret Recovery Phrase"
},
"imported": {
"message": "Imported",
@ -952,7 +967,7 @@
"message": "Invalid RPC URL"
},
"invalidSeedPhrase": {
"message": "Invalid seed phrase"
"message": "Invalid Secret Recovery Phrase"
},
"ipfsGateway": {
"message": "IPFS Gateway"
@ -1027,6 +1042,9 @@
"mainnet": {
"message": "Ethereum Mainnet"
},
"makeAnotherSwap": {
"message": "Create a new swap"
},
"max": {
"message": "Max"
},
@ -1105,6 +1123,9 @@
"myAccounts": {
"message": "My Accounts"
},
"name": {
"message": "Name"
},
"needEtherInWallet": {
"message": "To interact with decentralized applications using MetaMask, youll need Ether in your wallet."
},
@ -1203,7 +1224,7 @@
"message": "No address has been set for this name."
},
"noAlreadyHaveSeed": {
"message": "No, I already have a seed phrase"
"message": "No, I already have a Secret Recovery Phrase"
},
"noConversionRateAvailable": {
"message": "No Conversion Rate Available"
@ -1246,18 +1267,6 @@
"message": "Swapping on mobile is here!",
"description": "Title for a notification in the 'See What's New' popup. Tells users that they can now use MetaMask Swaps on Mobile."
},
"notifications2ActionText": {
"message": "Start survey",
"description": "The 'call to action' label on the button, or link, of the 'Help improve MetaMask' 'See What's New' notification. Upon clicking, users will be taken to an external page where they can complete a survey."
},
"notifications2Description": {
"message": "Please share your experience in this 5 minute survey.",
"description": "Description of a notification in the 'See What's New' popup. Further clarifies how the users can help: by completing a 5 minute survey about MetaMask."
},
"notifications2Title": {
"message": "Help improve MetaMask",
"description": "Title for a notification in the 'See What's New' popup. Asks users to take action to make MetaMask better."
},
"notifications3ActionText": {
"message": "Read more",
"description": "The 'call to action' on the button, or link, of the 'Stay secure' notification. Upon clicking, users will be taken to a page about security on the metamask support website."
@ -1270,6 +1279,22 @@
"message": "Stay secure",
"description": "Title for a notification in the 'See What's New' popup. Encourages users to consider security."
},
"notifications4ActionText": {
"message": "Start swapping",
"description": "The 'call to action' on the button, or link, of the 'Swap on Binance Smart Chain!' notification. Upon clicking, users will be taken to a page where then can swap tokens on Binance Smart Chain."
},
"notifications4Description": {
"message": "Get the best prices on token swaps right inside your wallet. MetaMask now connects you to multiple decentralized exchange aggregators and professional market makers on Binance Smart Chain.",
"description": "Description of a notification in the 'See What's New' popup."
},
"notifications4Title": {
"message": "Swap on Binance Smart Chain",
"description": "Title for a notification in the 'See What's New' popup. Encourages users to do swaps on Binance Smart Chain."
},
"notifications5Description": {
"message": "Your \"Seed Phrase\" is now called your \"Secret Recovery Phrase.\"",
"description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update."
},
"notifications6DescriptionOne": {
"message": "As of Chrome version 91, the API that enabled our Ledger support (U2F) no longer supports hardware wallets. MetaMask has implemented a new Ledger Live support that allows you to continue to connect to your Ledger device via the Ledger Live desktop app.",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
@ -1392,6 +1417,9 @@
"provide": {
"message": "Provide"
},
"publicAddress": {
"message": "Public Address"
},
"queue": {
"message": "Queue"
},
@ -1438,7 +1466,7 @@
"message": "Remove account"
},
"removeAccountDescription": {
"message": "This account will be removed from your wallet. Please make sure you have the original seed phrase or private key for this imported account before continuing. You can import or create accounts again from the account drop-down. "
"message": "This account will be removed from your wallet. Please make sure you have the original Secret Recovery Phrase or private key for this imported account before continuing. You can import or create accounts again from the account drop-down. "
},
"requestsAwaitingAcknowledgement": {
"message": "requests waiting to be acknowledged"
@ -1453,13 +1481,13 @@
"message": "Reset Account"
},
"resetAccountDescription": {
"message": "Resetting your account will clear your transaction history. This will not change the balances in your accounts or require you to re-enter your seed phrase."
"message": "Resetting your account will clear your transaction history. This will not change the balances in your accounts or require you to re-enter your Secret Recovery Phrase."
},
"restore": {
"message": "Restore"
},
"restoreAccountWithSeed": {
"message": "Restore your Account with Seed Phrase"
"message": "Restore your Account with Secret Recovery Phrase"
},
"restoreWalletPreferences": {
"message": "A backup of your data from $1 has been found. Would you like to restore your wallet preferences?",
@ -1472,13 +1500,13 @@
"message": "A token here reuses a symbol from another token you watch, this can be confusing or deceptive."
},
"revealSeedWords": {
"message": "Reveal Seed Phrase"
"message": "Reveal Secret Recovery Phrase"
},
"revealSeedWordsDescription": {
"message": "If you ever change browsers or move computers, you will need this seed phrase to access your accounts. Save them somewhere safe and secret."
"message": "If you ever change browsers or move computers, you will need this Secret Recovery Phrase to access your accounts. Save them somewhere safe and secret."
},
"revealSeedWordsTitle": {
"message": "Seed Phrase"
"message": "Secret Recovery Phrase"
},
"revealSeedWordsWarning": {
"message": "These words can be used to steal all your accounts."
@ -1538,16 +1566,52 @@
"message": "Security & Privacy"
},
"securitySettingsDescription": {
"message": "Privacy settings and wallet seed phrase"
"message": "Privacy settings and wallet Secret Recovery Phrase"
},
"seedPhraseIntroSidebarBulletFour": {
"message": "Write down and store in multiple secret places."
},
"seedPhraseIntroSidebarBulletOne": {
"message": "Save in a password manager"
},
"seedPhraseIntroSidebarBulletThree": {
"message": "Store in a safe-deposit box."
},
"seedPhraseIntroSidebarBulletTwo": {
"message": "Store in a bank vault."
},
"seedPhraseIntroSidebarCopyOne": {
"message": "Your recovery phrase is the “master key” to your wallet and funds."
},
"seedPhraseIntroSidebarCopyThree": {
"message": "If someone asks for your recovery phrase, they are most likely trying to scam you."
},
"seedPhraseIntroSidebarCopyTwo": {
"message": "Never, ever share your recovery phrase, even with MetaMask!"
},
"seedPhraseIntroSidebarTitleOne": {
"message": "What is a recovery phrase?"
},
"seedPhraseIntroSidebarTitleThree": {
"message": "Should I share my recovery phrase?"
},
"seedPhraseIntroSidebarTitleTwo": {
"message": "How do I save my recovery phrase?"
},
"seedPhraseIntroTitle": {
"message": "Secure your wallet"
},
"seedPhraseIntroTitleCopy": {
"message": "Before getting started, watch this short video to learn about your recovery phrase and how to keep your wallet safe."
},
"seedPhrasePlaceholder": {
"message": "Separate each word with a single space"
},
"seedPhrasePlaceholderPaste": {
"message": "Paste seed phrase from clipboard"
"message": "Paste Secret Recovery Phrase from clipboard"
},
"seedPhraseReq": {
"message": "Seed phrases contain 12, 15, 18, 21, or 24 words"
"message": "Secret Recovery Phrases contain 12, 15, 18, 21, or 24 words"
},
"selectAHigherGasFee": {
"message": "Select a higher gas fee to accelerate the processing of your transaction.*"
@ -1639,7 +1703,7 @@
"message": "Show Private Keys"
},
"showSeedPhrase": {
"message": "Show seed phrase"
"message": "Show Secret Recovery Phrase"
},
"sigRequest": {
"message": "Signature Request"
@ -1756,6 +1820,10 @@
"swapAggregator": {
"message": "Aggregator"
},
"swapAllowSwappingOf": {
"message": "Allow swapping of $1",
"description": "Shows a user that they need to allow a token for swapping on their hardware wallet"
},
"swapAmountReceived": {
"message": "Guaranteed amount"
},
@ -1781,6 +1849,15 @@
"message": "Checking $1",
"description": "Shown to the user during quote loading. $1 is the name of an aggregator. The message indicates that metamask is currently checking if that aggregator has a trade/quote for their requested swap."
},
"swapConfirmWithHwWallet": {
"message": "Confirm with your hardware wallet"
},
"swapContractDataDisabledErrorDescription": {
"message": "In the Ethereum app on your Ledger, go to \"Settings\" and allow contract data. Then, try your swap again."
},
"swapContractDataDisabledErrorTitle": {
"message": "Contract data is not enabled on your Ledger"
},
"swapCustom": {
"message": "custom"
},
@ -1826,8 +1903,15 @@
"swapFinalizing": {
"message": "Finalizing..."
},
"swapFromTo": {
"message": "The swap of $1 to $2",
"description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token"
},
"swapGasFeesSplit": {
"message": "Gas fees on the previous screen are split between these two transactions."
},
"swapHighSlippageWarning": {
"message": "Slippage amount is very high. Make sure you know what you are doing!"
"message": "Slippage amount is very high."
},
"swapLowSlippageError": {
"message": "Transaction may fail, max slippage too low."
@ -1868,18 +1952,18 @@
"message": "You are about to swap $1 $2 (~$3) for $4 $5 (~$6).",
"description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts."
},
"swapPriceDifferenceAcknowledgement": {
"message": "I'm aware"
},
"swapPriceDifferenceTitle": {
"message": "Price difference of ~$1%",
"description": "$1 is a number (ex: 1.23) that represents the price difference."
},
"swapPriceDifferenceTooltip": {
"message": "The difference in market prices can be affected by fees taken by intermediaries, size of market, size of trade, or market inefficiencies."
"swapPriceImpactTooltip": {
"message": "Price impact is the difference between the current market price and the amount received during transaction execution. Price impact is a function of the size of your trade relative to the size of the liquidity pool."
},
"swapPriceDifferenceUnavailable": {
"message": "Market price is unavailable. Make sure you feel comfortable with the returned amount before proceeding."
"swapPriceUnavailableDescription": {
"message": "Price impact could not be determined due to lack of market price data. Please confirm that you are comfortable with the amount of tokens you are about to receive before swapping."
},
"swapPriceUnavailableTitle": {
"message": "Check your rate before proceeding"
},
"swapProcessing": {
"message": "Processing"
@ -1946,8 +2030,8 @@
"swapSelectQuotePopoverDescription": {
"message": "Below are all the quotes gathered from multiple liquidity sources."
},
"swapSlippageTooLow": {
"message": "Slippage must be greater than zero"
"swapSlippageNegative": {
"message": "Slippage must be greater or equal to zero"
},
"swapSource": {
"message": "Liquidity source"
@ -1967,6 +2051,9 @@
"swapThisWillAllowApprove": {
"message": "This will allow $1 to be swapped."
},
"swapToConfirmWithHwWallet": {
"message": "to confirm with your hardware wallet"
},
"swapTokenAvailable": {
"message": "Your $1 has been added to your account.",
"description": "This message is shown after a swap is successful and communicates the exact amount of tokens the user has received for a swap. The $1 is a decimal number of tokens followed by the token symbol."
@ -1996,6 +2083,9 @@
"swapTransactionComplete": {
"message": "Transaction complete"
},
"swapTwoTransactions": {
"message": "2 transactions"
},
"swapUnknown": {
"message": "Unknown"
},
@ -2006,9 +2096,6 @@
"message": "Multiple tokens can use the same name and symbol. Check $1 to verify this is the token you're looking for.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "View $1"
},
"swapYourTokenBalance": {
"message": "$1 $2 available to swap",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
@ -2102,7 +2189,7 @@
"message": "Test Faucet"
},
"thisWillCreate": {
"message": "This will create a new wallet and seed phrase"
"message": "This will create a new wallet and Secret Recovery Phrase"
},
"tips": {
"message": "Tips"
@ -2126,9 +2213,15 @@
"tokenContractAddress": {
"message": "Token Contract Address"
},
"tokenDecimalFetchFailed": {
"message": "Token decimal required."
},
"tokenSymbol": {
"message": "Token Symbol"
},
"tooltipApproveButton": {
"message": "I understand"
},
"total": {
"message": "Total"
},
@ -2257,6 +2350,10 @@
"userName": {
"message": "Username"
},
"verifyThisTokenDecimalOn": {
"message": "Token decimal can be found on $1",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"verifyThisTokenOn": {
"message": "Verify this token on $1",
"description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
@ -2270,6 +2367,9 @@
"viewContact": {
"message": "View Contact"
},
"viewMore": {
"message": "View More"
},
"viewOnCustomBlockExplorer": {
"message": "View at $1"
},
@ -2286,10 +2386,10 @@
"message": "our hardware wallet connection guide"
},
"walletSeed": {
"message": "Seed phrase"
"message": "Secret Recovery Phrase"
},
"walletSeedRestore": {
"message": "Wallet Seed"
"message": "Wallet Secret Recovery Phrase"
},
"web3ShimUsageNotification": {
"message": "We noticed that the current website tried to use the removed window.web3 API. If the site appears to be broken, please click $1 for more information.",
@ -2329,7 +2429,7 @@
"message": "You are signing"
},
"yourPrivateSeedPhrase": {
"message": "Your private seed phrase"
"message": "Your private Secret Recovery Phrase"
},
"zeroGasPriceOnSpeedUpError": {
"message": "Zero gas price on speed up"

View File

@ -497,6 +497,9 @@
"dismiss": {
"message": "Descartar"
},
"dismissReminderDescriptionField": {
"message": "Active esta opción para ignorar el recordatorio de respaldo de la frase de recuperación. Le recomendamos que respalde la frase secreta de recuperación para evitar la pérdida de fondos."
},
"done": {
"message": "Completo"
},
@ -532,7 +535,7 @@
"message": "Solicitar clave pública de cifrado"
},
"endOfFlowMessage1": {
"message": "Pasó la prueba - mantenga su frase semilla segura, ¡es su responsabilidad!"
"message": "Pasó la prueba. Es importante que guarde la frase secreta de recuperación en un lugar seguro."
},
"endOfFlowMessage10": {
"message": "Todo Listo"
@ -547,13 +550,13 @@
"message": "Nunca comparta la frase con nadie."
},
"endOfFlowMessage5": {
"message": "¡Cuidado con el phishing! MetaMask nunca le pedirá espontáneamente su frase semilla."
"message": "Tenga cuidado con el phishing. MetaMask nunca le pedirá la frase secreta de recuperación sin anticipárselo."
},
"endOfFlowMessage6": {
"message": "Si necesita hacer una copia de seguridad de su frase semilla nuevamente, puede encontrarla en Configuración -> Seguridad."
"message": "Si necesita volver a crear una copia de seguridad de la frase secreta de recuperación, puede encontrarla en Configuración -> Seguridad."
},
"endOfFlowMessage8": {
"message": "MetaMask no puede recuperar tu frase semilla. Saber más."
"message": "MetaMask no puede recuperar la frase secreta de recuperación."
},
"endOfFlowMessage9": {
"message": "Saber más."
@ -772,15 +775,21 @@
"importAccount": {
"message": "Importar cuenta"
},
"importAccountLinkText": {
"message": "importar con la frase secreta de recuperación"
},
"importAccountMsg": {
"message": "Las cuentas importadas no serán asociadas con tu cuenta original creada con tu MetaMask. Aprende más acerca de importar cuentas "
"message": " Las cuentas importadas no se asociarán con la frase secreta de recuperación de la cuenta original de MetaMask. Más información sobre las cuentas importadas "
},
"importAccountSeedPhrase": {
"message": "Importar una cuenta con la frase semilla"
"message": "Importar una cuenta con la frase secreta de recuperación"
},
"importWallet": {
"message": "Importar Monedero"
},
"importYourExisting": {
"message": "Importar la cartera existente con una frase secreta de recuperación"
},
"imported": {
"message": "Importado",
"description": "status showing that an account has been fully loaded into the keyring"
@ -842,7 +851,7 @@
"message": "URL del RPC inválida "
},
"invalidSeedPhrase": {
"message": "Frase semilla inválida."
"message": "Frase secreta de recuperación no válida"
},
"ipfsGateway": {
"message": "Puerta de enlace IPFS"
@ -1042,7 +1051,7 @@
"message": "No se ha establecido ninguna dirección para este nombre."
},
"noAlreadyHaveSeed": {
"message": "No, ya tengo una frase semilla"
"message": "No, ya tengo una frase secreta de recuperación"
},
"noConversionRateAvailable": {
"message": "No hay ninguna Tasa de Conversión Disponible"
@ -1226,7 +1235,7 @@
"message": "Borrar cuenta"
},
"removeAccountDescription": {
"message": "Se borrará esta cuenta de tu monedero. Por favor, asegúrate de tener la frase semilla o clave personal original para esta cuenta importada antes de seguir adelante. Podrás importar o crear cuentas de nuevo del menu desplegable de cuentas."
"message": "Esta cuenta se quitará de la cartera. Antes de continuar, asegúrese de tener la frase secreta de recuperación original o la clave privada de esta cuenta importada. Puede importar o crear cuentas nuevamente desde el menú desplegable de la cuenta."
},
"requestsAwaitingAcknowledgement": {
"message": "peticiones pendientes de reconocimiento"
@ -1241,13 +1250,13 @@
"message": "Reiniciar cuenta"
},
"resetAccountDescription": {
"message": "Reiniciar tu cuenta borrará tu historial de transacciones."
"message": "Restablecer la cuenta borrará el historial de transacciones. Esto no cambiará los saldos de las cuentas ni se le pedirá que vuelva a escribir la frase secreta de recuperación."
},
"restore": {
"message": "Restaurar"
},
"restoreAccountWithSeed": {
"message": "Restaurar tu Cuenta con la Frase Semilla"
"message": "Restaurar la cuenta con la frase secreta de recuperación"
},
"restoreWalletPreferences": {
"message": "Se ha encontrado una copia de seguridad de sus datos de $1. ¿Le gustaría restaurar sus preferencias de monedero?",
@ -1260,13 +1269,13 @@
"message": "Un token aquí reutiliza un símbolo de otro token que está observando, esto puede ser confuso o engañoso."
},
"revealSeedWords": {
"message": "Revelar Frase Semilla"
"message": "Revelar frase secreta de recuperación"
},
"revealSeedWordsDescription": {
"message": "Si en algún momento cambias de navegador o de ordenador, necesitarás esta frase semilla para acceder a tus cuentas. Guárdatela en un lugar seguro y secreto."
"message": "Si alguna vez cambia de explorador o de equipo, necesitará esta frase secreta de recuperación para acceder a sus cuentas. Guárdela en un lugar seguro y secreto."
},
"revealSeedWordsTitle": {
"message": "Frase Semilla"
"message": "Frase secreta de recuperación"
},
"revealSeedWordsWarning": {
"message": "¡No recuperes tu semilla en un lugar público! Esas palabras pueden ser usadas para robarte todas tus cuentas"
@ -1323,16 +1332,16 @@
"message": "Seguridad y Privacidad"
},
"securitySettingsDescription": {
"message": "Configuración de privacidad y frase semilla de monedero"
"message": "Configuración de privacidad y frase secreta de recuperación de la cartera"
},
"seedPhrasePlaceholder": {
"message": "Separar a cada palabra con un sólo espacio"
},
"seedPhrasePlaceholderPaste": {
"message": "Pegar la frase semilla del portapapeles"
"message": "Pegar la frase secreta de recuperación desde el Portapapeles"
},
"seedPhraseReq": {
"message": "Las frases semilla contienen 12, 15, 18, 21 oo 24 palabras"
"message": "Las frases secretas de recuperación contienen 12, 15, 18, 21 o 24 palabras"
},
"selectAHigherGasFee": {
"message": "Seleccione una comisión de gas más elevada para agilizar el procesamiento de tu transacción.*"
@ -1417,7 +1426,7 @@
"message": "Mostrar claves privadas"
},
"showSeedPhrase": {
"message": "Mostrar frase semilla"
"message": "Mostrar frase secreta de recuperación"
},
"sigRequest": {
"message": "Solicitud de firma"
@ -1576,9 +1585,6 @@
"swapFinalizing": {
"message": "Finalizando..."
},
"swapHighSlippageWarning": {
"message": "La cantidad de deslizamiento es muy alta. ¡Asegúrate de saber lo que estás haciendo!"
},
"swapLowSlippageError": {
"message": "La transacción puede fallar, el deslizamiento máximo es demasiado bajo."
},
@ -1622,12 +1628,6 @@
"message": "Diferencia de precio de ~$1%",
"description": "$1 is a number (ex: 1.23) that represents the price difference."
},
"swapPriceDifferenceTooltip": {
"message": "La diferencia en los precios de mercado puede verse afectada por las tarifas cobradas por los intermediarios, el tamaño del mercado, el tamaño del comercio o las ineficiencias del mercado."
},
"swapPriceDifferenceUnavailable": {
"message": "El precio de mercado no está disponible. Asegúrese de sentirse cómodo con el monto devuelto antes de continuar."
},
"swapProcessing": {
"message": "Procesando"
},
@ -1690,9 +1690,6 @@
"swapSelectQuotePopoverDescription": {
"message": "A continuación se muestran todas las cotizaciones recopiladas de múltiples fuentes de liquidez."
},
"swapSlippageTooLow": {
"message": "El deslizamiento debe ser mayor que cero"
},
"swapSource": {
"message": "Fuente de liquidez"
},
@ -1732,9 +1729,6 @@
"message": "Varios tokens pueden usar el mismo nombre y símbolo. Verifique $1 para verificar que este es el token que está buscando.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "Ver $1"
},
"swapYourTokenBalance": {
"message": "$1 $2 están disponibles para intercambiar",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
@ -1810,7 +1804,7 @@
"message": "Grifo de prueba"
},
"thisWillCreate": {
"message": "Esto creará un nuevo monedero y frase semilla"
"message": "Esto creará una cartera y una frase secreta de recuperación nuevas"
},
"tips": {
"message": "Consejos"
@ -1983,7 +1977,10 @@
"message": "nuestra guía de monedero físico"
},
"walletSeed": {
"message": "Semilla del monedero"
"message": "Frase secreta de recuperación"
},
"walletSeedRestore": {
"message": "Frase secreta de recuperación de la cartera"
},
"web3ShimUsageNotification": {
"message": "Notamos que el sitio web actual intentó utilizar la API window.web3 eliminada. Si el sitio parece estar roto, haga clic en $1 para obtener más información.",
@ -2015,7 +2012,7 @@
"message": "Usted está firmando"
},
"yourPrivateSeedPhrase": {
"message": "Tu frase semilla privada"
"message": "Su frase secreta de recuperación privada"
},
"zeroGasPriceOnSpeedUpError": {
"message": "No hubo precio de gas al agilizar"

View File

@ -1576,9 +1576,6 @@
"swapFinalizing": {
"message": "Finalizando..."
},
"swapHighSlippageWarning": {
"message": "La cantidad de deslizamiento es muy alta. ¡Asegúrate de saber lo que estás haciendo!"
},
"swapLowSlippageError": {
"message": "La transacción puede fallar, el deslizamiento máximo es demasiado bajo."
},
@ -1622,12 +1619,6 @@
"message": "Diferencia de precio de ~$1%",
"description": "$1 is a number (ex: 1.23) that represents the price difference."
},
"swapPriceDifferenceTooltip": {
"message": "La diferencia en los precios de mercado puede verse afectada por las tarifas cobradas por los intermediarios, el tamaño del mercado, el tamaño del comercio o las ineficiencias del mercado."
},
"swapPriceDifferenceUnavailable": {
"message": "El precio de mercado no está disponible. Asegúrese de sentirse cómodo con el monto devuelto antes de continuar."
},
"swapProcessing": {
"message": "Procesando"
},
@ -1690,9 +1681,6 @@
"swapSelectQuotePopoverDescription": {
"message": "A continuación se muestran todas las cotizaciones recopiladas de múltiples fuentes de liquidez."
},
"swapSlippageTooLow": {
"message": "El deslizamiento debe ser mayor que cero"
},
"swapSource": {
"message": "Fuente de liquidez"
},
@ -1732,9 +1720,6 @@
"message": "Varios tokens pueden usar el mismo nombre y símbolo. Verifique $1 para verificar que este es el token que está buscando.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "Ver $1"
},
"swapYourTokenBalance": {
"message": "$1 $2 están disponibles para intercambiar",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"

View File

@ -488,6 +488,9 @@
"dismiss": {
"message": "खारिज करें"
},
"dismissReminderDescriptionField": {
"message": "रिकवरी फ्रेज़ बैकअप अनुस्मारक संदेश को खारिज करने के लिए इसे चालू करें। हम ज़ोर देकर अनुशंसा करते हैं कि आप धन के नुकसान से बचने के लिए अपने गुप्त रिकवरी फ्रेज़ का बैकअप लें"
},
"done": {
"message": "संपन्न"
},
@ -523,7 +526,7 @@
"message": "एन्क्रिप्शन सार्वजनिक कुंजी का अनुरोध करें"
},
"endOfFlowMessage1": {
"message": "आप टेस्ट में उत्तीर्ण हो गए हैं - अपने सीडफ्रेज़ को सुरक्षित रखें, यह आपकी ज़िम्मेदारी है!"
"message": "आप टेस्ट में उत्तीर्ण हो गए हैं - अपने गुप्त रिकवरी फ्रेज़ को सुरक्षित रखें, यह आपकी ज़िम्मेदारी है!"
},
"endOfFlowMessage10": {
"message": "सब कुछ हो गया"
@ -538,13 +541,13 @@
"message": "वाक्यांश को कभी भी किसी के साथ साझा न करें।"
},
"endOfFlowMessage5": {
"message": "फ़िशिंग से सावधान रहें! MetaMask कभी भी अनायास ही आपके सीड फ्रेज़ के बारे में नहीं पूछेगा।"
"message": "फ़िशिंग से सावधान रहें! MetaMask कभी भी अनायास ही आपके गुप्त रिकवरी फ्रेज़ के बारे में नहीं पूछेगा।"
},
"endOfFlowMessage6": {
"message": "यदि आपको अपने सीड फ्रेज़ को फिर से बैकअप लेने की आवश्यकता है, तो आप इसे सेटिंग्स -> सुरक्षा में पा सकते हैं।"
"message": "यदि आपको अपने गुप्त रिकवरी फ्रेज़ को फिर से बैकअप लेने की आवश्यकता है, तो आप इसे सेटिंग्स -> सुरक्षा में पा सकते हैं।"
},
"endOfFlowMessage8": {
"message": "MetaMask आपके सीडफ्रेज़ को पुनर्प्राप्त नहीं कर सकता है।"
"message": "MetaMask आपके गुप्त रिकवरी फ्रेज़ को पुनर्प्राप्त नहीं कर सकता है।"
},
"endOfFlowMessage9": {
"message": "अधिक जानें।"
@ -763,15 +766,21 @@
"importAccount": {
"message": "खाता आयात करें"
},
"importAccountLinkText": {
"message": "गुप्त रिकवरी फ्रेज़ का उपयोग करके आयात करें"
},
"importAccountMsg": {
"message": " आयातित खाते आपके मूल रूप से बनाए गए MetaMask खाते सीडफ्रेज़ से संबद्ध नहीं होंगे। आयातित खातों के बारे में अधिक जानें "
"message": " आयातित खाते आपके मूल रूप से बनाए गए MetaMask खाते के गुप्त रिकवरी फ्रेज़ से संबद्ध नहीं होंगे। आयातित खातों के बारे में अधिक जानें "
},
"importAccountSeedPhrase": {
"message": "सीडफ्रेज़ के साथ कोई खाता आयात करें"
"message": "गुप्त रिकवरी फ्रेज़ के साथ एक खाता आयात करें"
},
"importWallet": {
"message": "वॉलेट आयात करें"
},
"importYourExisting": {
"message": "गुप्त रिकवरी फ्रेज़ का उपयोग करके अपने मौजूदा वॉलेट को आयात करें"
},
"imported": {
"message": "आयातित",
"description": "status showing that an account has been fully loaded into the keyring"
@ -833,7 +842,7 @@
"message": "अमान्य RPC URL"
},
"invalidSeedPhrase": {
"message": "अमान्य सीड फ्रेज़"
"message": "अमान्य गुप्त रिकवरी फ्रेज़"
},
"ipfsGateway": {
"message": "IPFS गेटवे"
@ -1033,7 +1042,7 @@
"message": "इस नाम के लिए कोई पता नहीं सेट किया गया है।"
},
"noAlreadyHaveSeed": {
"message": "नहीं, मेरे पास पहले से ही एक सीड फ्रेज़ है"
"message": "नहीं, मेरे पास पहले से ही एक गुप्त रिकवरी फ्रेज़ है"
},
"noConversionRateAvailable": {
"message": "कोई भी रूपांतरण दर उपलब्ध नहीं है"
@ -1217,7 +1226,7 @@
"message": "खाता निकालें"
},
"removeAccountDescription": {
"message": "यह खाता आपके वॉलेट से निकाल दिया जाएगा। कृपया सुनिश्चित करें कि जारी रखने से पहले आपके पास इस आयातित खाते के लिए मूल सीड फ्रेज़ या निजी कुंजी है। आप खाता ड्रॉप-डाउन से फिर से खाते आयात कर सकते हैं या बना सकते हैं। "
"message": "यह खाता आपके वॉलेट से निकाल दिया जाएगा। कृपया सुनिश्चित करें कि जारी रखने से पहले आपके पास इस आयातित खाते के लिए मूल गुप्त रिकवरी फ्रेज़ या निजी कुंजी है। आप खाता ड्रॉप-डाउन से फिर से खाते आयात कर सकते हैं या बना सकते हैं। "
},
"requestsAwaitingAcknowledgement": {
"message": "अनुरोधों के स्वीकार किए जाने की प्रतीक्षा की जा रही है"
@ -1232,13 +1241,13 @@
"message": "खाता रीसेट करें"
},
"resetAccountDescription": {
"message": "आपके खाते को रीसेट करने से आपका लेनदेन इतिहास साफ़ हो जाएगा। इससे आपके खातों में शेषराशि नहीं बदलेगी या आपको अपने सीड फ्रेज़ को फिर से दर्ज करने की आवश्यकता नहीं होगी।"
"message": "आपके खाते को रीसेट करने से आपका लेनदेन इतिहास साफ़ हो जाएगा। इससे आपके खातों में शेषराशि नहीं बदलेगी या आपको अपने गुप्त रिकवरी फ्रेज़ को फिर से दर्ज करने की आवश्यकता नहीं होगी।"
},
"restore": {
"message": "पुनर्स्थापित करें"
},
"restoreAccountWithSeed": {
"message": "सीड फ्रेज़ के साथ अपने खाते को पुनर्स्थापित करें"
"message": "गुप्त रिकवरी फ्रेज़ के साथ अपने खाते को पुनर्स्थापित करें"
},
"restoreWalletPreferences": {
"message": "$1 से आपके डेटा का बैकअप मिला है। क्या आप अपनी वॉलेट वरीयताओं को पुनर्स्थापित करना चाहते हैं?",
@ -1251,13 +1260,13 @@
"message": "यहाँ पर एक टोकन आपके द्वारा देखे जाने वाले दूसरे टोकन से प्रतीक का पुनः उपयोग करता है, यह भ्रामक या धोखाधड़ी वाला हो सकता है।"
},
"revealSeedWords": {
"message": "सीड फ्रेज़ प्रकट करें"
"message": "गुप्त रिकवरी फ्रेज़ प्रकट करें"
},
"revealSeedWordsDescription": {
"message": "यदि आप कभी ब्राउज़र बदलते हैं या कंप्यूटर को स्थानांतरित करते हैं, तो आपको अपने खातों तक पहुँचने के लिए इस सीड फ्रेज़ की आवश्यकता होगी। उन्हें कहीं सुरक्षित और गोपनीय तरीके से सहेजें।"
"message": "यदि आप कभी ब्राउज़र बदलते हैं या कंप्यूटर को स्थानांतरित करते हैं, तो आपको अपने खातों तक पहुँचने के लिए इस गुप्त रिकवरी फ्रेज़ की आवश्यकता होगी। उन्हें कहीं सुरक्षित और गोपनीय तरीके से सहेजें।"
},
"revealSeedWordsTitle": {
"message": "सीड फ्रेज़"
"message": "गुप्त रिकवरी फ्रेज़"
},
"revealSeedWordsWarning": {
"message": "इन शब्दों का उपयोग आपके सभी खातों को चुराने के लिए किया जा सकता है।"
@ -1314,16 +1323,16 @@
"message": "सुरक्षा और गोपनीयता"
},
"securitySettingsDescription": {
"message": "गोपनीयता सेटिंग और वॉलेट सीड फ्रेज़"
"message": "गोपनीयता सेटिंग्स और वॉलेट का गुप्त रिकवरी फ्रेज़"
},
"seedPhrasePlaceholder": {
"message": "प्रत्येक शब्द को एक रिक्ति से अलग करें"
},
"seedPhrasePlaceholderPaste": {
"message": "क्लिपबोर्ड से सीड फ्रेज़ को चिपकाएँ"
"message": "क्लिपबोर्ड से गुप्त रिकवरी फ्रेज़ को चिपकाएँ"
},
"seedPhraseReq": {
"message": "सीड फ्रेज़ में 12, 15, 18, 21 या 24 शब्द हैं"
"message": "गुप्त रिकवरी फ्रेज़ में 12, 15, 18, 21 या 24 शब्द होते हैं"
},
"selectAHigherGasFee": {
"message": "अपने लेनदेन की प्रक्रिया में तेज़ी लाने के लिए उच्च गैस शुल्क का चयन करें। *"
@ -1408,7 +1417,7 @@
"message": "निजी कुंजियाँ दिखाएँ"
},
"showSeedPhrase": {
"message": "सीड फ्रेज़ दिखाएँ"
"message": "गुप्त रिकवरी फ्रेज़ दिखाएँ"
},
"sigRequest": {
"message": "हस्ताक्षर का अनुरोध"
@ -1564,9 +1573,6 @@
"swapFinalizing": {
"message": "अंतिम रूप दिया जा रहा है..."
},
"swapHighSlippageWarning": {
"message": "स्लिपेज राशि बहुत अधिक है। सुनिश्चित करें कि आप जानते हैं कि आप क्या कर रहे हैं!"
},
"swapLowSlippageError": {
"message": "लेनदेन विफल हो सकता है, अधिकतम स्लिपेज बहुत कम हो सकता है।"
},
@ -1660,9 +1666,6 @@
"swapSelectQuotePopoverDescription": {
"message": "नीचे दिए गए सभी उद्धरण कई चलनिधि स्रोतों से एकत्र किए गए हैं।"
},
"swapSlippageTooLow": {
"message": "स्लिपेज शून्य से अधिक होना चाहिए"
},
"swapSource": {
"message": "चलनिधि का स्रोत"
},
@ -1699,9 +1702,6 @@
"message": "एकाधिक टोकन एक ही नाम और प्रतीक का उपयोग कर सकते हैं। यह सत्यापित करने के लिए $1 की जाँच करें कि यह वही टोकन है, जिसकी आप तलाश कर रहे हैं।",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "$1 देखें"
},
"swapYourTokenBalance": {
"message": "$1 $2 स्वैप के लिए उपलब्ध है",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
@ -1774,7 +1774,7 @@
"message": "फ़ॉसेट का परीक्षण करें"
},
"thisWillCreate": {
"message": "यह एक नया वॉलेट और सीड फ्रेज़ बनाएगा"
"message": "यह एक नया वॉलेट और गुप्त रिकवरी फ्रेज़ बनाएगा"
},
"tips": {
"message": "युक्तियाँ"
@ -1947,7 +1947,10 @@
"message": "हमारी हार्डवेयर वॉलेट कनेक्शन गाइड"
},
"walletSeed": {
"message": "सीड फ्रेज़"
"message": "गुप्त रिकवरी फ्रेज़"
},
"walletSeedRestore": {
"message": "वॉलेट का गुप्त रिकवरी फ्रेज़"
},
"welcome": {
"message": "MetaMask में आपका स्वागत है"
@ -1975,7 +1978,7 @@
"message": "आप हस्ताक्षर कर रहे हैं"
},
"yourPrivateSeedPhrase": {
"message": "आपका निजी सीड फ्रेज़"
"message": "आपका निजी गुप्त रिकवरी फ्रेज़"
},
"zeroGasPriceOnSpeedUpError": {
"message": "ज़ीरो गैस मूल्य में तेज़ी"

View File

@ -488,6 +488,9 @@
"dismiss": {
"message": "Lewatkan"
},
"dismissReminderDescriptionField": {
"message": "Aktifkan ini untuk melewatkan pesan pengingat pencadangan frasa pemulihan. Kami sangat merekomendasikan agar Anda mencadangkan Frasa Pemulihan Rahasia Anda untuk menghindari hilangnya dana"
},
"done": {
"message": "Selesai"
},
@ -523,7 +526,7 @@
"message": "Minta kunci publik enkripsi"
},
"endOfFlowMessage1": {
"message": "Anda lulus ujian - jaga frasa pemulihan Anda tetap aman, ini tanggung jawab Anda!"
"message": "Anda lulus ujian - jaga Frasa Pemulihan Rahasia Anda tetap aman, ini tanggung jawab Anda!"
},
"endOfFlowMessage10": {
"message": "Semua Selesai"
@ -538,13 +541,13 @@
"message": "Jangan bagikan frasa kepada siapa pun."
},
"endOfFlowMessage5": {
"message": "Berhati-hatilah dengan phishing! MetaMask tidak pernah secara spontan meminta frasa pemulihan Anda."
"message": "Berhati-hatilah dengan phishing! MetaMask tidak pernah secara spontan meminta Frasa Pemulihan Rahasia Anda."
},
"endOfFlowMessage6": {
"message": "Jika Anda perlu mencadangkan frasa pemulihan lagi, Anda dapat menemukannya di Pengaturan -> Keamanan."
"message": "Jika Anda perlu mencadangkan Frasa Pemulihan Rahasia lagi, Anda dapat menemukannya di Pengaturan -> Keamanan."
},
"endOfFlowMessage8": {
"message": "MetaMask tidak dapat memulihkan frasa pemulihan Anda."
"message": "MetaMask tidak dapat memulihkan Frasa Pemulihan Rahasia Anda."
},
"endOfFlowMessage9": {
"message": "Pelajari selengkapnya."
@ -763,15 +766,21 @@
"importAccount": {
"message": "Impor Akun"
},
"importAccountLinkText": {
"message": "impor menggunakan Frasa Pemulihan Rahasia"
},
"importAccountMsg": {
"message": " Akun yang diimpor tidak akan dikaitkan dengan frasa pemulihan akun MetaMask yang asli dibuat. Pelajari selengkapnya tentang akun yang diimpor "
"message": " Akun yang diimpor tidak akan dikaitkan dengan Frasa Pemulihan Rahasia akun MetaMask yang asli dibuat. Pelajari selengkapnya tentang akun yang diimpor "
},
"importAccountSeedPhrase": {
"message": "Impor akun dengan frasa pemulihan"
"message": "Impor akun dengan Frasa Pemulihan Rahasia"
},
"importWallet": {
"message": "Impor dompet"
},
"importYourExisting": {
"message": "Impor dompet Anda yang ada menggunakan Frasa Pemulihan Rahasia"
},
"imported": {
"message": "Diimpor",
"description": "status showing that an account has been fully loaded into the keyring"
@ -833,7 +842,7 @@
"message": "URL RPC Tidak Valid"
},
"invalidSeedPhrase": {
"message": "Frasa pemulihan tidak valid"
"message": "Frasa Pemulihan Rahasia Tidak Valid"
},
"ipfsGateway": {
"message": "Gateway IPFS"
@ -1033,7 +1042,7 @@
"message": "Tidak ada alamat yang ditetapkan untuk nama ini."
},
"noAlreadyHaveSeed": {
"message": "Tidak, saya sudah memiliki frasa pemulihan"
"message": "Tidak, saya sudah memiliki Frasa Pemulihan Rahasia"
},
"noConversionRateAvailable": {
"message": "Tidak Ada Nilai Konversi yang Tersedia"
@ -1217,7 +1226,7 @@
"message": "Hapus akun"
},
"removeAccountDescription": {
"message": "Akun ini akan dihapus dari dompet Anda. Pastikan Anda memiliki frasa pemulihan asli atau kunci privat untuk akun impor ini sebelum melanjutkan. Anda dapat mengimpor atau membuat akun lagi dari akun drop down. "
"message": "Akun ini akan dihapus dari dompet Anda. Pastikan Anda memiliki Frasa Pemulihan Rahasia asli atau kunci privat untuk akun impor ini sebelum melanjutkan. Anda dapat mengimpor atau membuat akun lagi dari drop down akun. "
},
"requestsAwaitingAcknowledgement": {
"message": "permintaan menunggu untuk diakui"
@ -1232,13 +1241,13 @@
"message": "Atur Ulang Akun"
},
"resetAccountDescription": {
"message": "Mengatur ulang akun akan mengosongkan riwayat transaksi Anda. Ini tidak akan mengubah saldo di akun atau mengharuskan Anda untuk memasukkan kembali frasa pemulihan Anda."
"message": "Mengatur ulang akun akan mengosongkan riwayat transaksi Anda. Ini tidak akan mengubah saldo di akun atau mengharuskan Anda untuk memasukkan kembali Frasa Pemulihan Rahasia Anda."
},
"restore": {
"message": "Pulihkan"
},
"restoreAccountWithSeed": {
"message": "Memulihkan Akun dengan Frasa Pemulihan"
"message": "Memulihkan Akun dengan Frasa Pemulihan Rahasia"
},
"restoreWalletPreferences": {
"message": "Cadangan data Anda dari $1 telah ditemukan. Apakah Anda ingin memulihkan preferensi dompet Anda?",
@ -1251,13 +1260,13 @@
"message": "Token di sini menggunakan kembali simbol dari token lain yang Anda lihat, ini bisa jadi membingungkan atau menipu."
},
"revealSeedWords": {
"message": "Mengungkapkan Frasa Pemulihan"
"message": "Mengungkapkan Frasa Pemulihan Rahasia"
},
"revealSeedWordsDescription": {
"message": "Jika Anda pernah mengubah browser atau mengganti komputer, Anda akan memerlukan frasa pemulihan ini untuk mengakses akun Anda. Simpan di tempat yang aman dan rahasia."
"message": "Jika Anda pernah mengubah browser atau mengganti komputer, Anda akan memerlukan Frasa Pemulihan Rahasia ini untuk mengakses akun Anda. Simpan di tempat yang aman dan rahasia."
},
"revealSeedWordsTitle": {
"message": "Frasa Pemulihan"
"message": "Frasa Pemulihan Rahasia"
},
"revealSeedWordsWarning": {
"message": "Kata-kata ini dapat digunakan untuk mencuri semua akun Anda."
@ -1314,16 +1323,16 @@
"message": "Keamanan & Privasi"
},
"securitySettingsDescription": {
"message": "Pengaturan privasi dan frasa pemulihan dompet"
"message": "Pengaturan privasi dan Frasa Pemulihan Rahasia dompet"
},
"seedPhrasePlaceholder": {
"message": "Pisahkan setiap kata dengan satu spasi"
},
"seedPhrasePlaceholderPaste": {
"message": "Tempel frasa pemulihan dari clipboard"
"message": "Tempel Frasa Pemulihan Rahasia dari clipboard"
},
"seedPhraseReq": {
"message": "Frasa pemulihan berisi 12, 15, 18, 21, atau 24 kata"
"message": "Frasa Pemulihan Rahasia berisi 12, 15, 18, 21, atau 24 kata"
},
"selectAHigherGasFee": {
"message": "Pilih biaya jaringan yang lebih tinggi untuk mempercepat pemrosesan transaksi Anda.*"
@ -1408,7 +1417,7 @@
"message": "Tampilkan Kunci Privat"
},
"showSeedPhrase": {
"message": "Tampilkan frasa pemulihan"
"message": "Menampilkan Frasa Pemulihan Rahasia"
},
"sigRequest": {
"message": "Permintaan Tanda Tangan"
@ -1564,9 +1573,6 @@
"swapFinalizing": {
"message": "Menyelesaikan..."
},
"swapHighSlippageWarning": {
"message": "Jumlah slippage sangat tinggi. Pastikan Anda mengetahui yang Anda kerjakan!"
},
"swapLowSlippageError": {
"message": "Transaksi bisa gagal, slippage maks. terlalu rendah."
},
@ -1660,9 +1666,6 @@
"swapSelectQuotePopoverDescription": {
"message": "Di bawah ini adalah semua kuota yang dikumpulkan dari beberapa sumber likuiditas."
},
"swapSlippageTooLow": {
"message": "Slippage harus lebih besar dari nol"
},
"swapSource": {
"message": "Sumber likuiditas"
},
@ -1699,9 +1702,6 @@
"message": "Beberapa token dapat menggunakan simbol dan nama yang sama. Periksa $1 untuk memverifikasi inilah token yang Anda cari.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "Lihat $1"
},
"swapYourTokenBalance": {
"message": "$1 $2 tersedia untuk ditukar",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
@ -1774,7 +1774,7 @@
"message": "Uji Fungsi"
},
"thisWillCreate": {
"message": "Ini akan membuat frasa pemulihan dan dompet baru"
"message": "Ini akan membuat Frasa Pemulihan Rahasia dan dompet baru"
},
"tips": {
"message": "Kiat"
@ -1947,7 +1947,10 @@
"message": "panduan koneksi dompet perangkat keras kami"
},
"walletSeed": {
"message": "Frasa pemulihan"
"message": "Frasa Pemulihan Rahasia"
},
"walletSeedRestore": {
"message": "Frasa Pemulihan Rahasia Dompet"
},
"welcome": {
"message": "Selamat datang di MetaMask"
@ -1975,7 +1978,7 @@
"message": "Anda sudah masuk"
},
"yourPrivateSeedPhrase": {
"message": "Frasa pemulihan privat Anda"
"message": "Frasa Pemulihan Rahasia pribadi Anda"
},
"zeroGasPriceOnSpeedUpError": {
"message": "Biaya jaringan nol dipercepat"

View File

@ -1582,9 +1582,6 @@
"swapFinalizing": {
"message": "Finalizzando..."
},
"swapHighSlippageWarning": {
"message": "L'importo di slippage è molto alto. Assicurati di sapere cosa stai facendo!"
},
"swapLowSlippageError": {
"message": "La transazione può fallire, il massimo slippage è troppo basso."
},
@ -1624,19 +1621,10 @@
"message": "Stai per scambiare $1 $2 (~$3) per $4 $5 (~$6).",
"description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts."
},
"swapPriceDifferenceAcknowledgement": {
"message": "Sono consapevole"
},
"swapPriceDifferenceTitle": {
"message": "Differenza di prezzo di circa ~$1%",
"description": "$1 is a number (ex: 1.23) that represents the price difference."
},
"swapPriceDifferenceTooltip": {
"message": "La differenza tra i prezzi del mercato può essere influenzata da commissioni prelevate da intermediari, dimensione del mercato, dimensione dello scambio, o inefficienze del mercato."
},
"swapPriceDifferenceUnavailable": {
"message": "Il prezzo di mercato non è disponibile. Assicurati di sentirti a tuo agio con l'importo restituito prima di procedere."
},
"swapProcessing": {
"message": "In elaborazione"
},
@ -1702,9 +1690,6 @@
"swapSelectQuotePopoverDescription": {
"message": "Sotto trovi tutte le quotazioni raccolte da multiple sorgenti di liquidità."
},
"swapSlippageTooLow": {
"message": "Lo slippage deve essere maggiore di zero"
},
"swapSource": {
"message": "Sorgente di liquidità"
},
@ -1755,9 +1740,6 @@
"message": "Più token possono usare lo stesso nome e simbolo. Verifica su $1 che questo sia il token che stai cercando.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "Vedi $1"
},
"swapYourTokenBalance": {
"message": "$1 $2 disponibili allo scambio",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"

View File

@ -497,6 +497,9 @@
"dismiss": {
"message": "却下"
},
"dismissReminderDescriptionField": {
"message": "これをオンにすると、リカバリー フレーズ バックアップのリマインダーメッセージが解除されます。資金の損失を防ぐために、シークレット リカバリー フレーズのバックアップを取ることを強くお勧めします。"
},
"done": {
"message": "完了"
},
@ -532,7 +535,7 @@
"message": "公開暗号鍵の要求"
},
"endOfFlowMessage1": {
"message": "テストに合格しました。シードフレーズを安全に保管してください。これは利用者の責務です。"
"message": "テストに合格しました。シークレット リカバリー フレーズを安全に保管してください。保管はお客様の責任となります。"
},
"endOfFlowMessage10": {
"message": "全て完了"
@ -547,13 +550,13 @@
"message": "シードフレーズは絶対に誰にも教えないでください。"
},
"endOfFlowMessage5": {
"message": "フィッシング詐欺に注意してください!MetaMaskは自発的にシードフレーズを絶対に要求しません。"
"message": "フィッシングにご注意ください!MetaMask の動作として、シークレット リカバリー フレーズを要求することは絶対にありません。"
},
"endOfFlowMessage6": {
"message": "シーフレーズを再度バックアップする場合は、[設定] -> [セキュリティとプライバシー] で見つけることができます。"
"message": "シークレット リカバリー フレーズを再度バックアップする場合は、[設定] -> [セキュリティとプライバシー] にアクセスしてください。"
},
"endOfFlowMessage8": {
"message": "MetaMaskはシードフレーズを復元できません。"
"message": "MetaMask はシークレット リカバリー フレーズを復元できません。"
},
"endOfFlowMessage9": {
"message": "詳細を表示。"
@ -772,15 +775,21 @@
"importAccount": {
"message": "アカウントのインポート"
},
"importAccountLinkText": {
"message": "シークレット リカバリー フレーズを使用してインポートする"
},
"importAccountMsg": {
"message": "追加したアカウントはMetaMaskのアカウントパスフレーズとは関連付けられません。インポートしたアカウントについての詳細は"
"message": " インポートされたアカウントは、最初に作成した MetaMask アカウントのシークレット リカバリー フレーズと関連付けられません。インポートされたアカウントの詳細を表示"
},
"importAccountSeedPhrase": {
"message": "シーフレーズを使用してアカウントをインポート"
"message": "シークレット リカバリー フレーズを使用してアカウントをインポートする:"
},
"importWallet": {
"message": "ウォレットのインポート"
},
"importYourExisting": {
"message": "シークレット リカバリー フレーズを使用して既存のウォレットをインポートする"
},
"imported": {
"message": "インポート済",
"description": "status showing that an account has been fully loaded into the keyring"
@ -845,7 +854,7 @@
"message": "無効な RPC URL"
},
"invalidSeedPhrase": {
"message": "無効なシーフレーズ"
"message": "無効なシークレット リカバリー フレーズ"
},
"ipfsGateway": {
"message": "IPFSゲートウェイ"
@ -1045,7 +1054,7 @@
"message": "この名前にはアドレスが設定されていません。"
},
"noAlreadyHaveSeed": {
"message": "いいえ、既にシードフレーズがあります"
"message": "いいえ、既にシークレット リカバリー フレーズを持っています"
},
"noConversionRateAvailable": {
"message": "どの換算レートも利用できません"
@ -1226,7 +1235,7 @@
"message": "アカウントの削除"
},
"removeAccountDescription": {
"message": "このアカウントはウォレットから削除されます。続行する前に、ウォレットにインポートしたアカウントのシードフレーズか秘密鍵を保管してください。アカウントは、アカウントのドロップダウンから再度インポート、または作成できます。"
"message": "このアカウントはウォレットから削除されます。続行する前に、インポートしたアカウントの元のシークレット リカバリー フレーズまたは秘密鍵を持っていることを確認してください。アカウントはアカウント ドロップダウンから再度インポートまたは作成できます。"
},
"requestsAwaitingAcknowledgement": {
"message": "承認されるまで待機する"
@ -1241,13 +1250,13 @@
"message": "アカウントをリセット"
},
"resetAccountDescription": {
"message": "アカウントをリセットするとトランザクション履歴がクリアされます。シードフレーズの再入力は不要です。これによりアカウント内の残高が変更されることはありません。"
"message": "アカウントをリセットするとトランザクション履歴がクリアされます。これによってアカウント内の残高が変更されることはありません。また、シークレット リカバリー フレーズの再入力を要求することはありません。"
},
"restore": {
"message": "復元"
},
"restoreAccountWithSeed": {
"message": "シードフレーズでアカウントを復元"
"message": "シークレット リカバリー フレーズでアカウントを復元する"
},
"restoreWalletPreferences": {
"message": "$1 のデータバックアップが見つかりました。ウォレットの基本設定を復元しますか?",
@ -1260,13 +1269,13 @@
"message": "既に登録されているトークンシンボルと同じシンボルの登録はお勧めしません。混乱や操作ミスの原因になります。"
},
"revealSeedWords": {
"message": "シードフレーズを表示"
"message": "シークレット リカバリー フレーズを公開する"
},
"revealSeedWordsDescription": {
"message": "ブラウザを変更したりコンピュータを変更した場合は、アカウントにアクセスするためにシードフレーズが必要になります。安全で秘密の場所に保管してください。"
"message": "ブラウザーを変更した場合や、コンピューターを移動した場合は、自分のアカウントにアクセスするためにこのシークレット リカバリー フレーズが必要になります。安全で秘密の場所に保管してください。"
},
"revealSeedWordsTitle": {
"message": "シーフレーズ"
"message": "シークレット リカバリー フレーズ"
},
"revealSeedWordsWarning": {
"message": "シードフレーズは全てのアカウントを盗む手段にも使えます。"
@ -1323,16 +1332,16 @@
"message": "セキュリティとプライバシー"
},
"securitySettingsDescription": {
"message": "プライバシーの設定とウォレットのシードフレーズ"
"message": "プライバシーの設定とシークレット リカバリー フレーズ"
},
"seedPhrasePlaceholder": {
"message": "シードフレーズを単語ごとに半角スペースで分割して入力して下さい"
},
"seedPhrasePlaceholderPaste": {
"message": "シードフレーズをクリップボードからペーストして下さい"
"message": "クリップボードからシークレット リカバリー フレーズを貼り付けます"
},
"seedPhraseReq": {
"message": "シードフレーズには、12,15,18,21、または24単語が含まれます"
"message": "シークレット リカバリー フレーズには、12、15、18、21、24 語が含まれます"
},
"selectAHigherGasFee": {
"message": "トランザクションの処理を早めるには、より高いガス料金を選択してください。"
@ -1417,7 +1426,7 @@
"message": "秘密鍵の表示"
},
"showSeedPhrase": {
"message": "シードフレーズの表示"
"message": "シークレット リカバリー フレーズを表示する"
},
"sigRequest": {
"message": "署名リクエスト"
@ -1576,9 +1585,6 @@
"swapFinalizing": {
"message": "終了中..."
},
"swapHighSlippageWarning": {
"message": "非常に大きいスリッページ額です。本当に実行するか確認してください。"
},
"swapLowSlippageError": {
"message": "トランザクションが失敗する可能性があります。最大スリッページが少なすぎます。"
},
@ -1622,12 +1628,6 @@
"message": "価格差は $1% です",
"description": "$1 is a number (ex: 1.23) that represents the price difference."
},
"swapPriceDifferenceTooltip": {
"message": "市場価格の違いは、仲介業者が負担する手数料、市場規模、取引量、または取引価格差の影響を受けることがあります。"
},
"swapPriceDifferenceUnavailable": {
"message": "マーケット価格は利用できません。続行する前に、返金額に問題がないことを確認してください。"
},
"swapProcessing": {
"message": "処理中"
},
@ -1690,9 +1690,6 @@
"swapSelectQuotePopoverDescription": {
"message": "以下は複数の流動性ソースから収集したすべての見積です。"
},
"swapSlippageTooLow": {
"message": "スリッページは 0 より多くする必要があります。"
},
"swapSource": {
"message": "流動性ソース"
},
@ -1732,9 +1729,6 @@
"message": "複数のトークンが同じ名前とシンボルであることがあります。$1で実際のトークンでを確認してください。",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "$1 を表示"
},
"swapYourTokenBalance": {
"message": "$1 $2 はスワップに使用できます",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
@ -1810,7 +1804,7 @@
"message": "テストFaucet"
},
"thisWillCreate": {
"message": "新しいウォレットとシードフレーズが作成されます"
"message": "これにより、新しいウォレットとシークレット リカバリー フレーズが作成されます"
},
"tips": {
"message": "ヒント"
@ -1983,7 +1977,10 @@
"message": "ハードウェアウォレット接続ガイド"
},
"walletSeed": {
"message": "シードフレーズ"
"message": "シークレット リカバリー フレーズ"
},
"walletSeedRestore": {
"message": "ウォレット シークレット リカバリー フレーズ"
},
"web3ShimUsageNotification": {
"message": "このサイトは削除されたwindow.web3 APIを使用します。サイトに問題が発生しているなら、$1 で詳細を見ることができます。",
@ -2015,7 +2012,7 @@
"message": "署名しています"
},
"yourPrivateSeedPhrase": {
"message": "秘密のシーフレーズ"
"message": "秘密のシークレット リカバリー フレーズ"
},
"zeroGasPriceOnSpeedUpError": {
"message": "追加のGas価格を0にできません"

View File

@ -488,6 +488,9 @@
"dismiss": {
"message": "해지"
},
"dismissReminderDescriptionField": {
"message": "이것을 켜서 복구 구문 백업 알림 메시지를 해지하십시오. 지갑을 복원할 수 있도록 비밀 복구 구문을 저장할 것을 강력하게 권장합니다."
},
"done": {
"message": "완료"
},
@ -523,7 +526,7 @@
"message": "암호화 공개 키 요구"
},
"endOfFlowMessage1": {
"message": "테스트를 통과하셨습니다. 시드 구문을 안전하게 보관할 책임은 귀하에게 있습니다!"
"message": "테스트를 통과하셨습니다. 비밀 복구 구문을 안전하게 보관할 책임은 귀하에게 있습니다!"
},
"endOfFlowMessage10": {
"message": "모두 완료"
@ -538,13 +541,13 @@
"message": "구문을 누구와도 공유하지 마세요."
},
"endOfFlowMessage5": {
"message": "피싱을 조심하세요! MetaMask에서는 절대로 시드 구문을 갑자기 물어보지 않습니다."
"message": "피싱을 조심하십시오! MetaMask에서는 절대로 시드 구문을 갑자기 물어보지 않습니다."
},
"endOfFlowMessage6": {
"message": "시드 구문을 다시 백업해야 한다면 설정 -> 보안에서 시드 구문을 찾을 수 있습니다."
"message": "비밀 복구 구문을 다시 백업해야 한다면 설정 -> 보안에서 시드 구문을 찾을 수 있습니다."
},
"endOfFlowMessage8": {
"message": "MetaMask에서는 시드 구문을 복구할 수 없습니다."
"message": "MetaMask에서는 계정 시드 구문을 복구할 수 없습니다."
},
"endOfFlowMessage9": {
"message": "자세한 내용을 알아보세요."
@ -763,8 +766,11 @@
"importAccount": {
"message": "계정 가져오기"
},
"importAccountLinkText": {
"message": "계정 시드 구문으로 가져오기"
},
"importAccountMsg": {
"message": " 가져온 계정은 생성한 MetaMask 계정 시드 구문 원본에 연결되지 않습니다. 가져온 계정에 대해 자세히 알아보세요. "
"message": " 가져온 계정은 생성한 MetaMask 계정 시드 구문 원본에 연결되지 않습니다. 가져온 계정에 대해 자세히 알아보십시오. "
},
"importAccountSeedPhrase": {
"message": "시드 구문으로 계정 가져오기"
@ -772,6 +778,9 @@
"importWallet": {
"message": "지갑 가져오기"
},
"importYourExisting": {
"message": "12단어 시드 구문을 사용하여 지갑 가져오기"
},
"imported": {
"message": "가져옴",
"description": "status showing that an account has been fully loaded into the keyring"
@ -833,7 +842,7 @@
"message": "잘못된 RPC URL"
},
"invalidSeedPhrase": {
"message": "잘못된 시드 구문"
"message": "잘못된 계정 시드 구문"
},
"ipfsGateway": {
"message": "IPFS 게이트웨이"
@ -1217,7 +1226,7 @@
"message": "계정 제거"
},
"removeAccountDescription": {
"message": "이 계정이 지갑에서 제거됩니다. 계속하기 전에 가져온 이 계정에 대한 원본 시드 구문이나 비공개 키가 있는지 확인하세요. 계정 드롭다운에서 계정을 가져오거나 다시 만들 수 있습니다. "
"message": "이 계정이 지갑에서 제거됩니다. 계속하기 전에 가져온 이 계정에 대한 원본 시드 구문이나 비공개 키가 있는지 확인하십시오. 계정 드롭다운에서 계정을 가져오거나 다시 만들 수 있습니다. "
},
"requestsAwaitingAcknowledgement": {
"message": "확인 대기 중인 요청"
@ -1232,7 +1241,7 @@
"message": "계정 재설정"
},
"resetAccountDescription": {
"message": "계정을 재설정하면 거래 내역이 지워집니다. 계정의 잔액이 변경되지 않으면 시드 구문을 다시 입력하지 않아도 됩니다."
"message": "계정을 재설정하면 거래 내역이 지워집니다. 계정의 잔액이 변경되지 않으면 시드 구문을 다시 입력하지 않아도 됩니다."
},
"restore": {
"message": "복구"
@ -1251,13 +1260,13 @@
"message": "여기에 있는 토큰은 사용자가 확인한 다른 토큰의 기호를 재사용하기 때문에 혼란스럽거나 속기 쉽습니다."
},
"revealSeedWords": {
"message": "시드 단어 공개"
"message": "계정 시드 구문 공개"
},
"revealSeedWordsDescription": {
"message": "브라우저를 변경하거나 컴퓨터를 옮긴 경우, 계정에 액세스하려면 이 시드 구문이 필요합니다. 기밀이 보장된 안전한 곳에 보관하세요."
"message": "브라우저를 변경하거나 컴퓨터를 옮긴 경우, 계정에 액세스하려면 이 시드 구문이 필요합니다. 기밀이 보장된 안전한 곳에 보관하십시오."
},
"revealSeedWordsTitle": {
"message": "시드 구문"
"message": "계정 시드 구문"
},
"revealSeedWordsWarning": {
"message": "이 구문은 계정 전체를 도용하는 데 사용될 수 있습니다."
@ -1408,7 +1417,7 @@
"message": "비공개 키 표시"
},
"showSeedPhrase": {
"message": "시드 구문 표시"
"message": "계정 시드 구문 표시"
},
"sigRequest": {
"message": "서명 요청"
@ -1564,9 +1573,6 @@
"swapFinalizing": {
"message": "마무리 중..."
},
"swapHighSlippageWarning": {
"message": "슬리패지 금액이 아주 큽니다. 현재 어떤 작업을 하고 있는지 확인하세요!"
},
"swapLowSlippageError": {
"message": "거래가 실패할 수도 있습니다. 최대 슬리패지가 너무 낮습니다."
},
@ -1660,9 +1666,6 @@
"swapSelectQuotePopoverDescription": {
"message": "다음은 여러 유동성 소스에서 수집한 전체 견적입니다."
},
"swapSlippageTooLow": {
"message": "슬리패지는 0보다 커야 합니다."
},
"swapSource": {
"message": "유동성 소스"
},
@ -1699,9 +1702,6 @@
"message": "여러 토큰이 같은 이름과 기호를 사용할 수 있습니다. $1을 확인하여 이것이 원하는 토큰인지 확인하세요.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "$1 보기"
},
"swapYourTokenBalance": {
"message": "$1 $2 스왑 가능",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
@ -1947,7 +1947,10 @@
"message": "당사의 하드웨어 지갑 연결 가이드"
},
"walletSeed": {
"message": "시드 구문"
"message": "계정 시드 구문"
},
"walletSeedRestore": {
"message": "지갑 계정 시드 구문"
},
"welcome": {
"message": "MetaMask 방문을 환영합니다"
@ -1975,7 +1978,7 @@
"message": "서명 중입니다."
},
"yourPrivateSeedPhrase": {
"message": "귀하의 비공개 시드 구문입니다."
"message": "비밀 백업 구문 확인"
},
"zeroGasPriceOnSpeedUpError": {
"message": "가속화 시 Gas 가격 0"

View File

@ -299,6 +299,9 @@
"directDepositEtherExplainer": {
"message": "Se você já tem Ether, a forma mais rápida de colocá-lo em sua nova carteira é o depósito direto."
},
"dismissReminderDescriptionField": {
"message": "Ative isso para descartar a mensagem de lembrete de backup da frase de recuperação. Recomendamos enfaticamente que você faça o backup da sua Frase de recuperação secreta para evitar perda de fundos"
},
"done": {
"message": "Concluído"
},
@ -321,7 +324,7 @@
"message": "Editar Contato"
},
"endOfFlowMessage1": {
"message": "Você passou no teste — mantenha sua frase semente segura, a responsabilidade é sua!"
"message": "Você passou no teste. Guarde sua Frase de recuperação secreta em segurança, é sua responsabilidade!"
},
"endOfFlowMessage10": {
"message": "Pronto"
@ -336,13 +339,13 @@
"message": "Nunca compartilhe a frase com ninguém."
},
"endOfFlowMessage5": {
"message": "Cuidado com o phishing! O MetaMask nunca solicitará espontaneamente sua frase semente."
"message": "Cuidado com phishing! O MetaMask jamais pedirá espontaneamente sua Frase de recuperação secreta."
},
"endOfFlowMessage6": {
"message": "Se precisar fazer backup de sua frase-semente de novo, acesse Configurações -> Segurança."
"message": "Se você precisar fazer backup da sua Frase de recuperação secreta novamente, encontre-a em Configurações -> Segurança."
},
"endOfFlowMessage8": {
"message": "O MetaMask não pode recuperar sua frase semente. Saiba mais."
"message": "O MetaMask não pode recuperar sua Frase de recuperação secreta."
},
"endOfFlowMessage9": {
"message": "Saiba mais."
@ -478,15 +481,21 @@
"importAccount": {
"message": "Importar Conta"
},
"importAccountLinkText": {
"message": "importar usando a Frase de recuperação secreta"
},
"importAccountMsg": {
"message": "As contas importadas não serão associadas à sua frase-semente da conta MetaMask criada originalmente. Saiba mais sobre contas importadas"
"message": " As contas importadas não estarão associadas à Frase de recuperação secreta da conta do MetaMask criada originalmente. Saiba mais sobre as contas importadas "
},
"importAccountSeedPhrase": {
"message": "Importar uma Conta com Frase-semente"
"message": "Importe uma conta com a Frase de recuperação secreta"
},
"importWallet": {
"message": "Importar Carteira"
},
"importYourExisting": {
"message": "Importar a carteira existente usando uma Frase de recuperação secreta"
},
"imported": {
"message": "Importado",
"description": "status showing that an account has been fully loaded into the keyring"
@ -519,7 +528,7 @@
"message": "URL de RPC inválida"
},
"invalidSeedPhrase": {
"message": "Frase semente inválida"
"message": "Frase de recuperação secreta inválida"
},
"jsonFile": {
"message": "Arquivo JSON",
@ -645,7 +654,7 @@
"message": "Nenhum endereço foi definido para este nome."
},
"noAlreadyHaveSeed": {
"message": "Não, eu já tenho uma frase semente"
"message": "Não, eu já tenho uma Frase de recuperação secreta"
},
"noConversionRateAvailable": {
"message": "Nenhuma Taxa de Conversão Disponível"
@ -773,7 +782,7 @@
"message": "Remover conta"
},
"removeAccountDescription": {
"message": "Esta conta será removida de sua carteira. Verifique se você tem a frase-semente original ou a chave particular desta conta importada antes de continuar. Você pode importar ou criar contas novamente no menu suspenso da conta."
"message": "Esta conta será removida da sua carteira. Antes de continuar, você precisa garantir que tem a Frase de recuperação secreta original ou chave privada para esta conta importada. Você pode importar ou criar contas novamente a partir do menu suspenso da conta. "
},
"requestsAwaitingAcknowledgement": {
"message": "solicitações aguardando confirmação"
@ -788,22 +797,22 @@
"message": "Redefinir Conta"
},
"resetAccountDescription": {
"message": "Restabelecer a sua conta limpará todo o seu histórico de transações."
"message": "Redefinir sua conta limpará o histórico de transações. Isso não alterará os saldos nas suas contas nem exigirá a reinserção da Frase de recuperação secreta."
},
"restore": {
"message": "Restaurar"
},
"restoreAccountWithSeed": {
"message": "Restaurar sua conta com a frase semente"
"message": "Restaure sua conta com a Frase de recuperação secreta"
},
"revealSeedWords": {
"message": "Revelar Palavras-semente"
"message": "Revelar Frase de recuperação secreta"
},
"revealSeedWordsDescription": {
"message": "Se você mudar de navegador ou computador, precisará dessa frase semente para acessar suas contas. Salve-as em algum lugar seguro e secreto."
"message": "Se você alguma vez mudou de navegador ou trocou de computador, precisará dessa Frase de recuperação secreta para acessar suas contas. Salve-as em um lugar seguro e secreto."
},
"revealSeedWordsTitle": {
"message": "Frase Semente"
"message": "Frase de recuperação secreta"
},
"revealSeedWordsWarning": {
"message": "Essas palavras podem ser usadas para roubar todas as suas contas."
@ -854,13 +863,16 @@
"message": "Segurança & Privacidade"
},
"securitySettingsDescription": {
"message": "Configurações de privacidade e frase-semente da carteira"
"message": "Configurações de privacidade e Frase de recuperação secreta"
},
"seedPhrasePlaceholder": {
"message": "Separe cada palavra com um único espaço"
},
"seedPhrasePlaceholderPaste": {
"message": "Cole a Frase de recuperação secreta da área de transferência"
},
"seedPhraseReq": {
"message": "As frases-semente têm 12 palavras"
"message": "As Frases de recuperação secreta contêm 12, 15, 18, 21 ou 24 palavras"
},
"selectAHigherGasFee": {
"message": "Selecione uma taxa de gás mais alta para acelerar o processamento de sua transação.*"
@ -922,6 +934,9 @@
"showPrivateKeys": {
"message": "Mostrar Chaves Privadas"
},
"showSeedPhrase": {
"message": "Mostrar Frase de recuperação secreta"
},
"sigRequest": {
"message": "Solicitação de Assinatura"
},
@ -1007,7 +1022,7 @@
"message": "Torneira de Testes"
},
"thisWillCreate": {
"message": "Isso criará uma nova carteira e frase-semente"
"message": "Isso criará uma nova carteira e Frase de recuperação secreta"
},
"tips": {
"message": "Doações"
@ -1140,7 +1155,10 @@
"message": "Visite nosso site"
},
"walletSeed": {
"message": "Semente da Carteira"
"message": "Frase de recuperação secreta"
},
"walletSeedRestore": {
"message": "Frase de recuperação secreta da carteira"
},
"welcome": {
"message": "Bem-vindo ao MetaMask"
@ -1161,7 +1179,7 @@
"message": "Você está assinando"
},
"yourPrivateSeedPhrase": {
"message": "Sua frase-semente particular"
"message": "Sua Frase de recuperação secreta privada"
},
"zeroGasPriceOnSpeedUpError": {
"message": "Preço de Gas zero na agilização"

View File

@ -488,6 +488,9 @@
"dismiss": {
"message": "Отклонить"
},
"dismissReminderDescriptionField": {
"message": "Включите этот параметр, чтобы отклонить сообщение с напоминанием о резервном копировании фразы восстановления. Мы настоятельно рекомендуем сделать резервную копию секретной фразы восстановления, чтобы избежать потери средств"
},
"done": {
"message": "Выполнено"
},
@ -523,7 +526,7 @@
"message": "Запросить открытый ключ шифрования."
},
"endOfFlowMessage1": {
"message": "Вы прошли тест — храните свою исходную фразу в безопасности, это ваша ответственность!"
"message": "Вы прошли тест — храните свою секретную фразу восстановления в безопасности, это ваша ответственность!"
},
"endOfFlowMessage10": {
"message": "Выполнено"
@ -538,13 +541,13 @@
"message": "Никогда не говорите никому эту фразу."
},
"endOfFlowMessage5": {
"message": "Остерегайтесь фишинга! MetaMask никогда неожиданно не запросит вашу исходную фразу."
"message": "Остерегайтесь фишинга! MetaMask никогда неожиданно не запросит вашу секретную фразу восстановления."
},
"endOfFlowMessage6": {
"message": "Если вам нужно снова создать резервную копию исходной фразы, вы можете найти ее в Настройки -> Безопасность."
"message": "Если вам нужно снова создать резервную копию секретной фразы восстановления, вы можете найти ее в Настройки -> Безопасность."
},
"endOfFlowMessage8": {
"message": "Просто помните, что MetaMask не может восстановить исходную фразу."
"message": "Просто помните, что MetaMask не может восстановить секретную фразу восстановления."
},
"endOfFlowMessage9": {
"message": "Дополнительная информация"
@ -763,15 +766,21 @@
"importAccount": {
"message": "Импортировать счет"
},
"importAccountLinkText": {
"message": "импортировать с использованием секретной фразы восстановления"
},
"importAccountMsg": {
"message": " Импортированные счета не будут связаны с исходной фразой вашей изначально созданного счета MetaMask. Узнайте больше об импортированных счетах "
"message": " Импортированные счета не будут связаны с секретной фразой восстановления вашего изначально созданного счета MetaMask. Узнайте больше об импортированных счетах "
},
"importAccountSeedPhrase": {
"message": "Импортировать счет с исходной фразой"
"message": "Импортировать счет с секретной фразой восстановления"
},
"importWallet": {
"message": "Импортировать кошелек"
},
"importYourExisting": {
"message": "Импортируйте существующий кошелек, используя начальную секретную фразу восстановления"
},
"imported": {
"message": "Импортированный",
"description": "status showing that an account has been fully loaded into the keyring"
@ -833,7 +842,7 @@
"message": "Недействительный URL-адрес RPC"
},
"invalidSeedPhrase": {
"message": "Неверная исходная фраза"
"message": "Недействительная секретная фраза восстановления"
},
"ipfsGateway": {
"message": "Шлюз IPFS"
@ -1033,7 +1042,7 @@
"message": "Для этого имени не задан адрес."
},
"noAlreadyHaveSeed": {
"message": "Нет, у меня уже есть исходная фраза"
"message": "Нет, у меня уже есть секретная фраза восстановления"
},
"noConversionRateAvailable": {
"message": "Нет доступного курса обмена"
@ -1217,7 +1226,7 @@
"message": "Удалить счет"
},
"removeAccountDescription": {
"message": "Этот счет будет удален из вашего кошелька. Перед продолжением убедитесь, что у вас есть исходная фраза или закрытый ключ для этой импортированного счета. Вы можете импортировать или снова создать счета из раскрывающегося списка. "
"message": "Этот счет будет удален из вашего кошелька. Перед продолжением убедитесь, что у вас есть секретная фраза восстановления или закрытый ключ для этой импортированного счета. Вы можете импортировать или снова создать счета из раскрывающегося списка. "
},
"requestsAwaitingAcknowledgement": {
"message": "запросы, ожидающие подтверждения"
@ -1232,13 +1241,13 @@
"message": "Сбросить счет"
},
"resetAccountDescription": {
"message": "Сброс вашего счета удалит историю транзакций. Это не изменит остатки на ваших счетах и не потребует повторного ввода исходной фразы."
"message": "Сброс вашего счета удалит историю транзакций. Это не изменит остатки на ваших счетах и не потребует повторного ввода секретной фразы восстановления."
},
"restore": {
"message": "Восстановить"
},
"restoreAccountWithSeed": {
"message": "Восстановите свой счет с помощью исходной фразы"
"message": "Восстановите свой счет с помощью секретной фразы восстановления"
},
"restoreWalletPreferences": {
"message": "Найдена резервная копия ваших данных из $1. Хотите восстановить настройки кошелька?",
@ -1251,13 +1260,13 @@
"message": "Токен здесь повторно использует символ из другого токена, который вы смотрите, это может запутать или ввести в заблуждение."
},
"revealSeedWords": {
"message": "Раскрыть исходную фразу"
"message": "Показать секретную фразу восстановления"
},
"revealSeedWordsDescription": {
"message": "Если вы меняете браузер или переходите на другой компьютер, вам понадобится эта исходная фраза для доступа к своим счетам. Сохраните ее в безопасном секретном месте."
"message": "Если вы меняете браузер или переходите на другой компьютер, вам понадобится эта секретная фраза восстановления для доступа к своим счетам. Сохраните ее в безопасном секретном месте."
},
"revealSeedWordsTitle": {
"message": "Исходная фраза"
"message": "Секретная фраза восстановления"
},
"revealSeedWordsWarning": {
"message": "Эти слова можно использовать для кражи всех ваших счетов."
@ -1314,16 +1323,16 @@
"message": "Безопасность и конфиденциальность"
},
"securitySettingsDescription": {
"message": "Настройки конфиденциальности и исходная фраза кошелька"
"message": "Настройки конфиденциальности и секретная фраза восстановления кошелька"
},
"seedPhrasePlaceholder": {
"message": "Отделяйте каждое слово одним пробелом"
},
"seedPhrasePlaceholderPaste": {
"message": "Вставить исходную фразу из буфера обмена"
"message": "Вставить секретную фразу восстановления из буфера обмена"
},
"seedPhraseReq": {
"message": "Исходные фразы содержат 12, 15, 18, 21 или 24 слова"
"message": "Секретные фразы восстановления содержат 12, 15, 18, 21 или 24 слова"
},
"selectAHigherGasFee": {
"message": "Выберите более высокую плату за топливо, чтобы ускорить обработку транзакции. *"
@ -1408,7 +1417,7 @@
"message": "Показать закрытые ключи"
},
"showSeedPhrase": {
"message": "Показать исходную фразу"
"message": "Показать секретную фразу восстановления"
},
"sigRequest": {
"message": "Запрос на подпись"
@ -1564,9 +1573,6 @@
"swapFinalizing": {
"message": "Завершение..."
},
"swapHighSlippageWarning": {
"message": "Величина проскальзывания очень велика. Убедитесь, что вы знаете, что делаете!"
},
"swapLowSlippageError": {
"message": "Транзакции могут завершиться неудачей, максимальное проскальзывание слишком мало."
},
@ -1660,9 +1666,6 @@
"swapSelectQuotePopoverDescription": {
"message": "Ниже приведены все котировки, собранные из нескольких источников ликвидности."
},
"swapSlippageTooLow": {
"message": "Проскальзывание должно быть больше нуля"
},
"swapSource": {
"message": "Источник ликвидности"
},
@ -1699,9 +1702,6 @@
"message": "Несколько токенов могут использовать одно и то же имя и символ. Проверьте $1, чтобы убедиться, что это именно тот токен, который вы ищете.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "Просмотреть $1"
},
"swapYourTokenBalance": {
"message": "$1 $2 доступны для свопа",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
@ -1774,7 +1774,7 @@
"message": "Тестовый кран"
},
"thisWillCreate": {
"message": "Это создаст новый кошелек и начальную фразу"
"message": "Это создаст новый кошелек и секретную фразу восстановления"
},
"tips": {
"message": "Советы"
@ -1947,7 +1947,10 @@
"message": "наше руководство по подключению аппаратного кошелька"
},
"walletSeed": {
"message": "Исходная фраза"
"message": "Секретная фраза восстановления"
},
"walletSeedRestore": {
"message": "Секретная фраза восстановления кошелька"
},
"welcome": {
"message": "Добро пожаловать в MetaMask"
@ -1975,7 +1978,7 @@
"message": "Вы подписываете"
},
"yourPrivateSeedPhrase": {
"message": "Ваша личная исходная фраза"
"message": "Ваша личная секретная фраза восстановления"
},
"zeroGasPriceOnSpeedUpError": {
"message": "Нулевая цена на топливо при ускорении"

View File

@ -488,6 +488,9 @@
"dismiss": {
"message": "I-dismiss"
},
"dismissReminderDescriptionField": {
"message": "I-on ito para i-dismiss ang mensahe ng paalala ng pag-back up ng recovery phrase. Lubos naming inirerekomendang i-back up mo ang iyong Secret Recovery Phrase para maiwasan ang pagkawala ng pondo"
},
"done": {
"message": "Tapos na"
},
@ -523,7 +526,7 @@
"message": "Mag-request ng pampublikong encryption key"
},
"endOfFlowMessage1": {
"message": "Naipasa mo ang pagsusulit - panatilihing ligtas ang iyong seedphrase, responsibilidad mo ito!"
"message": "Pumasa ka sa test - panatilihing ligtas ang iyong Secret Recovery Phrase, responsibilidad mo ito!"
},
"endOfFlowMessage10": {
"message": "Tapos Na Lahat"
@ -538,13 +541,13 @@
"message": "Huwag kailanmang ibahagi ang parirala sa sinuman."
},
"endOfFlowMessage5": {
"message": "Mag-ingat sa phishing! Hindi kailanman basta na lang hihingin ng MetaMask ang iyong seed phrase."
"message": "Mag-ingat sa phishing! Hindi kailanman basta na lang hihingin ng MetaMask ang iyong Secret Recovery Phrase."
},
"endOfFlowMessage6": {
"message": "Kung kailangan mong i-back up ulit ang iyong seed phrase, makikita mo ito sa Mga Setting -> Seguridad."
"message": "Kung kailangan mong i-back up ulit ang iyong Secret Recovery Phrase, makikita mo ito sa Mga Setting -> Seguridad."
},
"endOfFlowMessage8": {
"message": "Hindi mababawi ng MetaMask ang iyong seedphrase."
"message": "Hindi mababawi ng MetaMask ang iyong Secret Recovery Phrase."
},
"endOfFlowMessage9": {
"message": "Matuto pa."
@ -763,15 +766,21 @@
"importAccount": {
"message": "Mag-import ng Account"
},
"importAccountLinkText": {
"message": "i-import gamit ang Secret Recovery Phrase"
},
"importAccountMsg": {
"message": " Ang mga na-import na account ay hindi mauugnay sa orihinal mong nagawang seedphrase ng MetaMask account. Matuto pa tungkol sa mga na-import account "
"message": " Ang mga na-import na account ay hindi mauugnay sa orihinal mong nagawang Secret Recovery Phrase ng MetaMask account. Matuto pa tungkol sa mga na-import account "
},
"importAccountSeedPhrase": {
"message": "Mag-import ng account gamit ang seed phrase"
"message": "Mag-import ng account gamit ang Secret Recovery Phrase"
},
"importWallet": {
"message": "I-import ang wallet"
},
"importYourExisting": {
"message": "I-import ang iyong kasalukuyang wallet gamit ang isang Secret Recovery Phrase"
},
"imported": {
"message": "Na-import",
"description": "status showing that an account has been fully loaded into the keyring"
@ -833,7 +842,7 @@
"message": "Hindi valid ang RPC URL"
},
"invalidSeedPhrase": {
"message": "Hindi valid ang seed phrase"
"message": "Hindi valid ang Secret Recovery Phrase"
},
"ipfsGateway": {
"message": "IPFS Gateway"
@ -1033,7 +1042,7 @@
"message": "Walang naitakdang address para sa pangalang ito."
},
"noAlreadyHaveSeed": {
"message": "May seed phrase na ako"
"message": "Hindi, may Secret Recovery Phrase na ako"
},
"noConversionRateAvailable": {
"message": "Hindi Available ang Rate ng Conversion"
@ -1214,7 +1223,7 @@
"message": "Tanggalin ang account"
},
"removeAccountDescription": {
"message": "Tatanggalin ang account na ito sa iyong wallet. Tiyaking nasa iyo ang orihinal na seed phrase o pribadong key para sa na-import na account na ito bago magpatuloy. Puwede kang mag-import o gumawa ulit ng mga account mula sa drop-down ng account. "
"message": "Tatanggalin ang account na ito sa iyong wallet. Tiyaking nasa iyo ang orihinal na Secret Recovery Phrase o private key para sa na-import na account na ito bago magpatuloy. Puwede kang mag-import o gumawa ulit ng mga account mula sa drop-down ng account. "
},
"requestsAwaitingAcknowledgement": {
"message": "mga request na hinihintay na tanggapin"
@ -1229,13 +1238,13 @@
"message": "I-reset ang Account"
},
"resetAccountDescription": {
"message": "Kapag ni-reset ang iyong account, maki-clear ang history ng iyong transaksyon. Hindi nito babaguhin ang mga balanse sa iyong mga account o hindi mo kakailanganing ilagay ulit ang iyong seed phrase."
"message": "Kapag ni-reset ang iyong account, maki-clear ang history ng iyong transaksyon. Hindi nito babaguhin ang mga balanse sa iyong mga account o hindi mo kakailanganing ilagay ulit ang iyong Secret Recovery Phrase."
},
"restore": {
"message": "I-restore"
},
"restoreAccountWithSeed": {
"message": "I-restore ang iyong Account gamit ang Seed Phrase"
"message": "I-restore ang iyong Account gamit ang Secret Recovery Phrase"
},
"restoreWalletPreferences": {
"message": "Nakita ang backup ng iyong data mula sa $1. Gusto mo bang i-restore ang mga kagustuhan mo sa wallet?",
@ -1248,13 +1257,13 @@
"message": "Ang isang token dito ay muling ginagamit ang isang simbolo mula sa ibang token na tinitingnan mo, maaari itong maging nakakalito."
},
"revealSeedWords": {
"message": "Ipakita ang Seed Phrase"
"message": "Ipakita ang Secret Recovery Phrase"
},
"revealSeedWordsDescription": {
"message": "Kung papalitan mo ang iyong browser o ililipat ang mga computer, kakailanganin mo ang seed phrase na ito para ma-access ang iyong mga account. I-save ang mga iyon sa isang ligtas at sikretong lugar."
"message": "Kung magpapalit ka man ng browser o computer, kakailanganin mo ang Secret Recovery Phrase na ito para ma-access ang iyong mga account. I-save ang mga iyon sa isang ligtas at sikretong lugar."
},
"revealSeedWordsTitle": {
"message": "Seed Phrase"
"message": "Secret Recovery Phrase"
},
"revealSeedWordsWarning": {
"message": "Magagamit ang mga salitang ito para manakaw ang lahat ng iyong account."
@ -1311,16 +1320,16 @@
"message": "Seguridad at Pagkapribado"
},
"securitySettingsDescription": {
"message": "Mga setting ng pagkapribado at seed phrase ng wallet"
"message": "Mga setting ng privacy at Secret Recovery Phrase ng wallet"
},
"seedPhrasePlaceholder": {
"message": "Paghiwa-hiwalayin ang bawat salita gamit ang espasyo"
},
"seedPhrasePlaceholderPaste": {
"message": "I-paste ang seed phrase mula sa clipboard"
"message": "I-paste ang Secret Recovery Phrase mula sa clipboard"
},
"seedPhraseReq": {
"message": "Ang mga seed phrase ay naglalaman ng 12, 15, 18, 21, o 24 na salita"
"message": "Ang mga Secret Recovery Phrase ay naglalaman ng 12, 15, 18, 21, o 24 na salita"
},
"selectAHigherGasFee": {
"message": "Pumili ng mas malaking bayarin sa gas para mapabilis ang pagproseso ng iyong transaksyon.*"
@ -1405,7 +1414,7 @@
"message": "Ipakita ang Mga Pribadong Key"
},
"showSeedPhrase": {
"message": "Ipakita ang seed phrase"
"message": "Ipakita ang Secret Recovery Phrase"
},
"sigRequest": {
"message": "Request na Paglagda"
@ -1561,9 +1570,6 @@
"swapFinalizing": {
"message": "Isinasapinal..."
},
"swapHighSlippageWarning": {
"message": "Sobrang laki ng halaga ng slippage. Tiyaking alam mo ang ginagawa mo!"
},
"swapLowSlippageError": {
"message": "Maaaring hindi magtagumpay ang transaksyon, masyadong mababa ang max na slippage."
},
@ -1657,9 +1663,6 @@
"swapSelectQuotePopoverDescription": {
"message": "Makikita sa ibaba ang lahat ng quote na nakuha mula sa maraming pinagkukunan ng liquidity."
},
"swapSlippageTooLow": {
"message": "Dapat ay mas malaki sa zero ang slippage"
},
"swapSource": {
"message": "Pinagkunan ng liquidity"
},
@ -1696,9 +1699,6 @@
"message": "Maaaring gamitin ng maraming token ang iisang pangalan at simbolo. Suriin ang $1 para ma-verify na ito ang token na hinahanap mo.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "Tingnan ang $1"
},
"swapYourTokenBalance": {
"message": "Available ang $1 $2 na i-swap",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
@ -1771,7 +1771,7 @@
"message": "Test Faucet"
},
"thisWillCreate": {
"message": "Gagawa ito ng bagong wallet at seed phrase"
"message": "Gagawa ito ng bagong wallet at Secret Recovery Phrase"
},
"tips": {
"message": "Mga Tip"
@ -1944,7 +1944,10 @@
"message": "ang aming gabay sa pagkonekta ng hardware wallet"
},
"walletSeed": {
"message": "Seed phrase"
"message": "Secret Recovery Phrase"
},
"walletSeedRestore": {
"message": "Recovery Phrase ng Wallet Secret"
},
"welcome": {
"message": "Welcome sa MetaMask"

View File

@ -488,6 +488,9 @@
"dismiss": {
"message": "Đóng"
},
"dismissReminderDescriptionField": {
"message": "Bật tùy chọn này để tắt thông báo nhắc sao lưu cụm mật khẩu khôi phục. Bạn nên sao lưu Cụm mật khẩu khôi phục bí mật của mình để tránh mất tiền"
},
"done": {
"message": "Hoàn tất"
},
@ -523,7 +526,7 @@
"message": "Yêu cầu khóa mã hóa công khai"
},
"endOfFlowMessage1": {
"message": "Bạn đã vượt qua bài kiểm tra. Hãy lưu giữ cụm mật khẩu gốc của bạn an toàn, đó là trách nhiệm của bạn!"
"message": "Bạn đã vượt qua bài kiểm tra. Hãy lưu giữ Cụm mật khẩu khôi phục bí mật của bạn an toàn, đó là trách nhiệm của bạn!"
},
"endOfFlowMessage10": {
"message": "Tất cả đã hoàn tất"
@ -538,13 +541,13 @@
"message": "Tuyệt đối không chia sẻ cụm mật khẩu với bất kỳ ai."
},
"endOfFlowMessage5": {
"message": "Hãy cẩn thận với hoạt động lừa đảo! MetaMask sẽ không bao giờ tự ý hỏi cụm mật khẩu gốc của bạn."
"message": "Hãy cẩn thận với hoạt động lừa đảo! MetaMask sẽ không bao giờ tự ý hỏi Cụm mật khẩu khôi phục bí mật của bạn."
},
"endOfFlowMessage6": {
"message": "Nếu cần sao lưu lại cụm mật khẩu gốc của mình, bạn có thể tìm thấy cụm mật khẩu này trong phần Cài đặt -> Bảo mật."
"message": "Nếu bạn cần sao lưu lại Cụm mật khẩu khôi phục bí mật, bạn có thể tìm thấy chức năng này trong Cài đặt -> Bảo mật."
},
"endOfFlowMessage8": {
"message": "MetaMask không thể khôi phục cụm mật khẩu gốc của bạn."
"message": "MetaMask không thể khôi phục Cụm mật khẩu khôi phục bí mật của bạn."
},
"endOfFlowMessage9": {
"message": "Tìm hiểu thêm."
@ -763,15 +766,21 @@
"importAccount": {
"message": "Nhập tài khoản"
},
"importAccountLinkText": {
"message": "nhập bằng Cụm mật khẩu khôi phục bí mật"
},
"importAccountMsg": {
"message": " Tài khoản đã nhập sẽ không được liên kết với cụm mật khẩu gốc cho tài khoản MetaMask đã tạo ban đầu của bạn. Tìm hiểu thêm về các tài khoản đã nhập "
"message": " Tài khoản đã nhập sẽ không được liên kết với Cụm mật khẩu khôi phục bí mật cho tài khoản MetaMask đã tạo ban đầu của bạn. Tìm hiểu thêm về các tài khoản đã nhập "
},
"importAccountSeedPhrase": {
"message": "Nhập một tài khoản bằng cụm mật khẩu gốc"
"message": "Nhập một tài khoản bằng Cụm mật khẩu khôi phục bí mật"
},
"importWallet": {
"message": "Nhập ví"
},
"importYourExisting": {
"message": "Nhập ví hiện tại của bạn bằng Cụm mật khẩu khôi phục bí mật"
},
"imported": {
"message": "Đã nhập",
"description": "status showing that an account has been fully loaded into the keyring"
@ -833,7 +842,7 @@
"message": "URL RPC không hợp lệ"
},
"invalidSeedPhrase": {
"message": "Cụm mật khẩu gốc không hợp lệ"
"message": "Cụm mật khẩu khôi phục bí mật không hợp lệ"
},
"ipfsGateway": {
"message": "Cổng kết nối IPFS"
@ -1033,7 +1042,7 @@
"message": "Chưa có địa chỉ nào được đặt cho tên này."
},
"noAlreadyHaveSeed": {
"message": "Không, tôi đã có cụm mật khẩu gốc"
"message": "Không, tôi đã có Cụm mật khẩu bí mật"
},
"noConversionRateAvailable": {
"message": "Không có sẵn tỷ lệ quy đổi nào"
@ -1217,7 +1226,7 @@
"message": "Xóa tài khoản"
},
"removeAccountDescription": {
"message": "Tài khoản này sẽ được xóa khỏi ví của bạn. Xin đảm bảo rằng bạn có cụm mật khẩu gốc ban đầu hoặc khóa riêng tư cho tài khoản được nhập trước khi tiếp tục. Bạn có thể nhập hoặc tạo lại tài khoản từ trình đơn tài khoản thả xuống. "
"message": "Tài khoản này sẽ được xóa khỏi ví của bạn. Xin đảm bảo rằng bạn có Cụm mật khẩu khôi phục bí mật ban đầu hoặc khóa riêng tư cho tài khoản được nhập trước khi tiếp tục. Bạn có thể nhập hoặc tạo lại tài khoản từ trình đơn tài khoản thả xuống. "
},
"requestsAwaitingAcknowledgement": {
"message": "yêu cầu đang chờ xác nhận"
@ -1232,13 +1241,13 @@
"message": "Đặt lại tài khoản"
},
"resetAccountDescription": {
"message": "Nếu đặt lại tài khoản của bạn, toàn bộ lịch sử giao dịch sẽ bị xóa. Việc này sẽ không làm thay đổi số dư trong tài khoản của bạn hoặc yêu cầu bạn phải nhập lại cụm mật khẩu gốc."
"message": "Nếu đặt lại tài khoản của bạn, toàn bộ lịch sử giao dịch sẽ bị xóa. Việc này sẽ không làm thay đổi số dư trong tài khoản của bạn hoặc yêu cầu bạn phải nhập lại Cụm mật khẩu khôi phục bí mật."
},
"restore": {
"message": "Khôi phục"
},
"restoreAccountWithSeed": {
"message": "Khôi phục tài khoản của bạn bằng cụm mật khẩu gốc"
"message": "Khôi phục tài khoản của bạn bằng cụm mật khẩu khôi phục bí mật"
},
"restoreWalletPreferences": {
"message": "Đã tìm thấy bản sao lưu dữ liệu của bạn từ $1. Bạn có muốn khôi phục các tùy chọn ưu tiên trong ví của mình không?",
@ -1251,13 +1260,13 @@
"message": "Một token trong đây sử dụng lại ký hiệu của một token khác mà bạn thấy, điều này có thể gây nhầm lẫn hoặc mang tính lừa dối."
},
"revealSeedWords": {
"message": "Hiện cụm mật khẩu gốc"
"message": "Hiện cụm mật khẩu khôi phục bí mật"
},
"revealSeedWordsDescription": {
"message": "Nếu thay đổi trình duyệt hoặc chuyển máy tính, bạn sẽ cần cụm mật khẩu gốc này để truy cập tài khoản của mình. Hãy lưu cụm mật khẩu gốc này ở nơi an toàn và bí mật."
"message": "Nếu thay đổi trình duyệt hoặc chuyển máy tính, bạn sẽ cần Cụm mật khẩu khôi phục bí mật này để truy cập tài khoản của mình. Hãy lưu cụm mật khẩu gốc này ở nơi an toàn và bí mật."
},
"revealSeedWordsTitle": {
"message": "Cụm mật khẩu gốc"
"message": "Cụm mật khẩu khôi phục bí mật"
},
"revealSeedWordsWarning": {
"message": "Kẻ xấu có thể dùng các từ này để đánh cắp tất cả các tài khoản của bạn."
@ -1314,16 +1323,16 @@
"message": "Bảo mật và quyền riêng tư"
},
"securitySettingsDescription": {
"message": "Cụm mật khẩu gốc của ví và các tùy chọn cài đặt quyền riêng tư"
"message": "Các cài đặt quyền riêng tư và Cụm mật khẩu khôi phục bí mật của ví"
},
"seedPhrasePlaceholder": {
"message": "Phân tách mỗi từ bằng một dấu cách"
},
"seedPhrasePlaceholderPaste": {
"message": "Dán cụm mật khẩu gốc từ khay nhớ tạm"
"message": "Dán Cụm mật khẩu khôi phục bí mật từ khay nhớ tạm"
},
"seedPhraseReq": {
"message": "Cụm mật khẩu gốc gồm 12, 15, 18, 21 hoặc 24 từ"
"message": "Cụm mật khẩu khôi phục bí mật gồm 12, 15, 18, 21 hoặc 24 từ"
},
"selectAHigherGasFee": {
"message": "Chọn phí gas cao hơn để tăng tốc quá trình xử lý giao dịch của bạn.*"
@ -1408,7 +1417,7 @@
"message": "Hiện khóa riêng tư"
},
"showSeedPhrase": {
"message": "Hiển thị cụm mật khẩu gốc"
"message": "Hiển thị Cụm mật khẩu khôi phục bí mật"
},
"sigRequest": {
"message": "Yêu cầu chữ ký"
@ -1564,9 +1573,6 @@
"swapFinalizing": {
"message": "Đang hoàn tất..."
},
"swapHighSlippageWarning": {
"message": "Số tiền trượt giá rất cao. Hãy chắc chắn rằng bạn hiểu những gì mình đang làm!"
},
"swapLowSlippageError": {
"message": "Giao dịch có thể không thành công, mức trượt giá tối đa quá thấp."
},
@ -1660,9 +1666,6 @@
"swapSelectQuotePopoverDescription": {
"message": "Dưới đây là tất cả các báo giá thu thập từ nhiều nguồn thanh khoản."
},
"swapSlippageTooLow": {
"message": "Mức trượt giá phải lớn hơn 0"
},
"swapSource": {
"message": "Nguồn thanh khoản"
},
@ -1699,9 +1702,6 @@
"message": "Nhiều token có thể dùng cùng một tên và ký hiệu. Hãy kiểm tra trên $1 để xác minh xem đây có phải là token bạn đang tìm kiếm không.",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "Xem $1"
},
"swapYourTokenBalance": {
"message": "Có sẵn $1 $2 để hoán đổi",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"
@ -1774,7 +1774,7 @@
"message": "Vòi thử nghiệm"
},
"thisWillCreate": {
"message": "Thao tác này sẽ tạo một ví mới và cụm mật khẩu gốc"
"message": "Thao tác này sẽ tạo một ví mới và Cụm mật khẩu khôi phục bí mật"
},
"tips": {
"message": "Mẹo"
@ -1947,7 +1947,10 @@
"message": "hướng dẫn của chúng tôi về cách kết nối ví cứng"
},
"walletSeed": {
"message": "Cụm mật khẩu gốc"
"message": "Cụm mật khẩu khôi phục bí mật"
},
"walletSeedRestore": {
"message": "Cụm mật khẩu khôi phục bí mật của ví"
},
"welcome": {
"message": "Chào mừng bạn đến với MetaMask"
@ -1975,7 +1978,7 @@
"message": "Bạn đang ký"
},
"yourPrivateSeedPhrase": {
"message": "Cụm mật khẩu gốc riêng tư của bạn"
"message": "Cụm mật khẩu bí mật, riêng tư của bạn"
},
"zeroGasPriceOnSpeedUpError": {
"message": "Giá gas bằng 0 khi tăng tốc"

View File

@ -1576,9 +1576,6 @@
"swapFinalizing": {
"message": "确定中……"
},
"swapHighSlippageWarning": {
"message": "滑点数量非常大。确保您知道您的操作!"
},
"swapLowSlippageError": {
"message": "交易可能失败,最大滑点过低。"
},
@ -1622,12 +1619,6 @@
"message": "价格差异 ~$1%",
"description": "$1 is a number (ex: 1.23) that represents the price difference."
},
"swapPriceDifferenceTooltip": {
"message": "市场价格的差异可能受到中介机构收取的费用、市场规模、交易规模或市场效率低下的影响。"
},
"swapPriceDifferenceUnavailable": {
"message": "市场价格不可用。 请确认您对退回的数额感到满意后再继续。"
},
"swapProcessing": {
"message": "处理中"
},
@ -1690,9 +1681,6 @@
"swapSelectQuotePopoverDescription": {
"message": "以下是从多个流动资金来源收集到的所有报价。"
},
"swapSlippageTooLow": {
"message": "滑点必须大于零"
},
"swapSource": {
"message": "流动资金来源"
},
@ -1732,9 +1720,6 @@
"message": "多个代币可以使用相同的名称和符号。检查 $1以太坊浏览器以确认这是您正在寻找的代币。",
"description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network."
},
"swapViewToken": {
"message": "查看 $1"
},
"swapYourTokenBalance": {
"message": "$1 $2 可用",
"description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol"

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 99 KiB

View File

@ -0,0 +1,116 @@
WEBVTT
1
00:00:00.780 --> 00:00:04.580
MetaMask is a new way to connect
to sites and applications.
2
00:00:04.580 --> 00:00:08.860
On traditional websites, a central database
or bank is responsible for controlling and
3
00:00:08.860 --> 00:00:10.179
recovering your accounts.
4
00:00:10.179 --> 00:00:15.050
But on MetaMask, all of the power belongs
to the holder of a master key.
5
00:00:15.050 --> 00:00:18.460
Whoever holds the key, controls the accounts.
6
00:00:18.460 --> 00:00:21.110
Your secret recovery phrase
is your "master key".
7
00:00:21.110 --> 00:00:26.070
It's a series of 12 words that are generated
when you first set up MetaMask, which allow
8
00:00:26.070 --> 00:00:30.120
you to recover your wallet and funds if you
ever lose access.
9
00:00:30.120 --> 00:00:33.451
It's important that you secure
your wallet by keeping your
10
00:00:33.451 --> 00:00:37.510
secret recovery phrase
very safe, and very secret.
11
00:00:37.510 --> 00:00:41.429
If anyone gets access to it, they will have
the "master key" to your wallet and can
12
00:00:41.429 --> 00:00:45.190
freely access and take all of your funds.
13
00:00:45.190 --> 00:00:50.109
To secure your MetaMask wallet you'll want
to safely save your secret recovery phrase.
14
00:00:50.109 --> 00:00:54.930
You can write it down, hide it somewhere,
put it in a safe deposit box
15
00:00:54.930 --> 00:00:57.729
or use a secure password manager.
16
00:00:57.729 --> 00:01:01.050
Some users even engrave their
phrase onto a metal plate!
17
00:01:01.050 --> 00:01:04.440
Nobody, not even the team
at MetaMask, can help you
18
00:01:04.440 --> 00:01:07.820
recover your wallet if you lose
your secret recovery phrase.
19
00:01:07.820 --> 00:01:12.072
If you haven't written down your secret recovery
phrase and stored it somewhere safe,
20
00:01:12.072 --> 00:01:15.492
do it now. We'll wait.
21
00:01:15.500 --> 00:01:20.780
And remember, never share your secret recovery
phrase with anyone: not even us.
22
00:01:20.780 --> 00:01:24.910
If anyone ever asks you for it,
they're trying to scam you.
23
00:01:24.910 --> 00:01:26.250
That's it!
24
00:01:26.250 --> 00:01:31.020
Now you know what a secret recovery phrase
is and how to keep your wallet safe and secure.

Binary file not shown.

View File

@ -71,6 +71,5 @@
"notifications"
],
"short_name": "__MSG_appName__",
"version": "9.5.6",
"web_accessible_resources": ["inpage.js", "phishing.html"]
}

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import { stripHexPrefix } from 'ethereumjs-util';
import accountImporter from '.';

View File

@ -1,6 +1,6 @@
import querystring from 'querystring';
import pump from 'pump';
import LocalMessageDuplexStream from 'post-message-stream';
import { WindowPostMessageStream } from '@metamask/post-message-stream';
import ObjectMultiplex from 'obj-multiplex';
import extension from 'extensionizer';
import PortStream from 'extension-port-stream';
@ -57,7 +57,7 @@ function injectScript(content) {
*/
async function setupStreams() {
// the transport-specific streams for communication between inpage and background
const pageStream = new LocalMessageDuplexStream({
const pageStream = new WindowPostMessageStream({
name: CONTENT_SCRIPT,
target: INPAGE,
});
@ -89,7 +89,7 @@ async function setupStreams() {
// TODO:LegacyProvider: Delete
// handle legacy provider
const legacyPageStream = new LocalMessageDuplexStream({
const legacyPageStream = new WindowPostMessageStream({
name: LEGACY_CONTENT_SCRIPT,
target: LEGACY_INPAGE,
});

View File

@ -23,6 +23,7 @@ export default class AppStateController extends EventEmitter {
timeoutMinutes: 0,
connectedStatusPopoverHasBeenShown: true,
defaultHomeActiveTabName: null,
browserEnvironment: {},
...initState,
});
this.timer = null;
@ -158,4 +159,12 @@ export default class AppStateController extends EventEmitter {
timeoutMinutes * 60 * 1000,
);
}
/**
* Sets the current browser and OS environment
* @returns {void}
*/
setBrowserEnvironment(os, browser) {
this.store.updateState({ browserEnvironment: { os, browser } });
}
}

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import sinon from 'sinon';
import { KOVAN_CHAIN_ID } from '../../../shared/constants/network';
import CachedBalancesController from './cached-balances';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import sinon from 'sinon';
import { ObservableStore } from '@metamask/obs-store';
import contracts from '@metamask/contract-metadata';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import sinon from 'sinon';
import EnsController from '.';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import sinon from 'sinon';
import proxyquire from 'proxyquire';
import nock from 'nock';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import EventEmitter from 'events';
import { ComposedStore, ObservableStore } from '@metamask/obs-store';
import { JsonRpcEngine } from 'json-rpc-engine';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import { txMetaStub } from '../../../../test/stub/tx-meta-stub';
import {
createPendingNonceMiddleware,

View File

@ -43,6 +43,7 @@ export default class PreferencesController {
useBlockie: false,
useNonceField: false,
usePhishDetect: true,
dismissSeedBackUpReminder: false,
// WARNING: Do not use feature flags for security-sensitive things.
// Feature flag toggling is available in the global namespace
@ -669,7 +670,7 @@ export default class PreferencesController {
/**
* A setter for the `useLedgerLive` property
* @param {bool} domain - Value for ledger live support
* @param {bool} useLedgerLive - Value for ledger live support
* @returns {Promise<string>} A promise of the update to useLedgerLive
*/
async setLedgerLivePreference(useLedgerLive) {
@ -685,6 +686,17 @@ export default class PreferencesController {
return this.store.getState().useLedgerLive;
}
/**
* A setter for the user preference to dismiss the seed phrase backup reminder
* @param {bool} dismissBackupReminder- User preference for dismissing the back up reminder
* @returns {void}
*/
async setDismissSeedBackUpReminder(dismissSeedBackUpReminder) {
await this.store.updateState({
dismissSeedBackUpReminder,
});
}
//
// PRIVATE METHODS
//

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import sinon from 'sinon';
import {
MAINNET_CHAIN_ID,

View File

@ -4,9 +4,9 @@ import BigNumber from 'bignumber.js';
import { ObservableStore } from '@metamask/obs-store';
import { mapValues, cloneDeep } from 'lodash';
import abi from 'human-standard-token-abi';
import { calcTokenAmount } from '../../../ui/app/helpers/utils/token-util';
import { calcGasTotal } from '../../../ui/app/pages/send/send.utils';
import { conversionUtil } from '../../../ui/app/helpers/utils/conversion-util';
import { calcTokenAmount } from '../../../ui/helpers/utils/token-util';
import { calcGasTotal } from '../../../ui/pages/send/send.utils';
import { conversionUtil } from '../../../ui/helpers/utils/conversion-util';
import {
DEFAULT_ERC20_APPROVE_GAS,
QUOTES_EXPIRED_ERROR,
@ -20,7 +20,7 @@ import {
fetchTradesInfo as defaultFetchTradesInfo,
fetchSwapsFeatureLiveness as defaultFetchSwapsFeatureLiveness,
fetchSwapsQuoteRefreshTime as defaultFetchSwapsQuoteRefreshTime,
} from '../../../ui/app/pages/swaps/swaps.util';
} from '../../../ui/pages/swaps/swaps.util';
import { NETWORK_EVENTS } from './network';
// The MAX_GAS_LIMIT is a number that is higher than the maximum gas costs we have observed on any aggregator

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import sinon from 'sinon';
import { ethers } from 'ethers';
@ -645,7 +645,7 @@ describe('SwapsController', function () {
topAggId,
resultQuotes,
] = await swapsController._findTopQuoteAndCalculateSavings(testInput);
assert.equal(topAggId, [TEST_AGG_ID_2]);
assert.equal(topAggId, TEST_AGG_ID_2);
assert.deepStrictEqual(resultQuotes, expectedResultQuotes);
});
});

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import sinon from 'sinon';
import { ObservableStore } from '@metamask/obs-store';
import TokenRatesController from './token-rates';

View File

@ -16,8 +16,8 @@ import {
BnMultiplyByFraction,
addHexPrefix,
} from '../../lib/util';
import { TRANSACTION_NO_CONTRACT_ERROR_KEY } from '../../../../ui/app/helpers/constants/error-keys';
import { getSwapsTokensReceivedFromTxMeta } from '../../../../ui/app/pages/swaps/swaps.util';
import { TRANSACTION_NO_CONTRACT_ERROR_KEY } from '../../../../ui/helpers/constants/error-keys';
import { getSwapsTokensReceivedFromTxMeta } from '../../../../ui/pages/swaps/swaps.util';
import {
TRANSACTION_STATUSES,
TRANSACTION_TYPES,

View File

@ -32,8 +32,8 @@ cleanContextForImports();
/* eslint-disable import/first */
import log from 'loglevel';
import LocalMessageDuplexStream from 'post-message-stream';
import { initializeProvider } from '@metamask/inpage-provider';
import { WindowPostMessageStream } from '@metamask/post-message-stream';
import { initializeProvider } from '@metamask/providers/dist/initializeInpageProvider';
restoreContextAfterImports();
@ -44,7 +44,7 @@ log.setDefaultLevel(process.env.METAMASK_DEBUG ? 'debug' : 'warn');
//
// setup background connection
const metamaskStream = new LocalMessageDuplexStream({
const metamaskStream = new WindowPostMessageStream({
name: 'metamask-inpage',
target: 'metamask-contentscript',
});

View File

@ -1,34 +1,68 @@
import { ObservableStore } from '@metamask/obs-store';
/**
* @typedef {import('@metamask/controllers').ControllerMessenger} ControllerMessenger
*/
/**
* An ObservableStore that can composes a flat
* structure of child stores based on configuration
*/
export default class ComposableObservableStore extends ObservableStore {
/**
* Describes which stores are being composed. The key is the name of the
* store, and the value is either an ObserableStore, or a controller that
* extends one of the two base controllers in the `@metamask/controllers`
* package.
* @type {Record<string, Object>}
*/
config = {};
/**
* Create a new store
*
* @param {Object} [initState] - The initial store state
* @param {Object} [config] - Map of internal state keys to child stores
* @param {Object} options
* @param {Object} [options.config] - Map of internal state keys to child stores
* @param {ControllerMessenger} options.controllerMessenger - The controller
* messenger, used for subscribing to events from BaseControllerV2-based
* controllers.
* @param {Object} [options.state] - The initial store state
*/
constructor(initState, config) {
super(initState);
constructor({ config, controllerMessenger, state }) {
super(state);
this.controllerMessenger = controllerMessenger;
if (config) {
this.updateStructure(config);
}
}
/**
* Composes a new internal store subscription structure
*
* @param {Object} [config] - Map of internal state keys to child stores
* @param {Record<string, Object>} config - Describes which stores are being
* composed. The key is the name of the store, and the value is either an
* ObserableStore, or a controller that extends one of the two base
* controllers in the `@metamask/controllers` package.
*/
updateStructure(config) {
this.config = config;
this.removeAllListeners();
for (const key in config) {
if (Object.prototype.hasOwnProperty.call(config, key)) {
for (const key of Object.keys(config)) {
if (!config[key]) {
throw new Error(`Undefined '${key}'`);
}
const store = config[key];
if (store.subscribe) {
config[key].subscribe((state) => {
this.updateState({ [key]: state });
});
} else {
this.controllerMessenger.subscribe(
`${store.name}:stateChange`,
(state) => {
this.updateState({ [key]: state });
},
);
}
}
}
@ -40,16 +74,17 @@ export default class ComposableObservableStore extends ObservableStore {
* @returns {Object} Object containing merged child store state
*/
getFlatState() {
if (!this.config) {
return {};
}
let flatState = {};
for (const key in this.config) {
if (Object.prototype.hasOwnProperty.call(this.config, key)) {
for (const key of Object.keys(this.config)) {
const controller = this.config[key];
const state = controller.getState
? controller.getState()
: controller.state;
flatState = { ...flatState, ...state };
}
}
return flatState;
}
}

View File

@ -1,35 +1,194 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import { ObservableStore } from '@metamask/obs-store';
import {
BaseController,
BaseControllerV2,
ControllerMessenger,
} from '@metamask/controllers';
import ComposableObservableStore from './ComposableObservableStore';
class OldExampleController extends BaseController {
name = 'OldExampleController';
defaultState = {
baz: 'baz',
};
constructor() {
super();
this.initialize();
}
updateBaz(contents) {
this.update({ baz: contents });
}
}
class ExampleController extends BaseControllerV2 {
static defaultState = {
bar: 'bar',
};
static metadata = {
bar: { persist: true, anonymous: true },
};
constructor({ messenger }) {
super({
messenger,
name: 'ExampleController',
metadata: ExampleController.metadata,
state: ExampleController.defaultState,
});
}
updateBar(contents) {
this.update(() => {
return { bar: contents };
});
}
}
describe('ComposableObservableStore', function () {
it('should register initial state', function () {
const store = new ComposableObservableStore('state');
const controllerMessenger = new ControllerMessenger();
const store = new ComposableObservableStore({
controllerMessenger,
state: 'state',
});
assert.strictEqual(store.getState(), 'state');
});
it('should register initial structure', function () {
const controllerMessenger = new ControllerMessenger();
const testStore = new ObservableStore();
const store = new ComposableObservableStore(null, { TestStore: testStore });
const store = new ComposableObservableStore({
config: { TestStore: testStore },
controllerMessenger,
});
testStore.putState('state');
assert.deepEqual(store.getState(), { TestStore: 'state' });
});
it('should update structure', function () {
it('should update structure with observable store', function () {
const controllerMessenger = new ControllerMessenger();
const testStore = new ObservableStore();
const store = new ComposableObservableStore();
const store = new ComposableObservableStore({ controllerMessenger });
store.updateStructure({ TestStore: testStore });
testStore.putState('state');
assert.deepEqual(store.getState(), { TestStore: 'state' });
});
it('should return flattened state', function () {
const fooStore = new ObservableStore({ foo: 'foo' });
const barStore = new ObservableStore({ bar: 'bar' });
const store = new ComposableObservableStore(null, {
FooStore: fooStore,
BarStore: barStore,
it('should update structure with BaseController-based controller', function () {
const controllerMessenger = new ControllerMessenger();
const oldExampleController = new OldExampleController();
const store = new ComposableObservableStore({ controllerMessenger });
store.updateStructure({ OldExample: oldExampleController });
oldExampleController.updateBaz('state');
assert.deepEqual(store.getState(), { OldExample: { baz: 'state' } });
});
assert.deepEqual(store.getFlatState(), { foo: 'foo', bar: 'bar' });
it('should update structure with BaseControllerV2-based controller', function () {
const controllerMessenger = new ControllerMessenger();
const exampleController = new ExampleController({
messenger: controllerMessenger,
});
const store = new ComposableObservableStore({ controllerMessenger });
store.updateStructure({ Example: exampleController });
exampleController.updateBar('state');
console.log(exampleController.state);
assert.deepEqual(store.getState(), { Example: { bar: 'state' } });
});
it('should update structure with all three types of stores', function () {
const controllerMessenger = new ControllerMessenger();
const exampleStore = new ObservableStore();
const exampleController = new ExampleController({
messenger: controllerMessenger,
});
const oldExampleController = new OldExampleController();
const store = new ComposableObservableStore({ controllerMessenger });
store.updateStructure({
Example: exampleController,
OldExample: oldExampleController,
Store: exampleStore,
});
exampleStore.putState('state');
exampleController.updateBar('state');
oldExampleController.updateBaz('state');
assert.deepEqual(store.getState(), {
Example: { bar: 'state' },
OldExample: { baz: 'state' },
Store: 'state',
});
});
it('should return flattened state', function () {
const controllerMessenger = new ControllerMessenger();
const fooStore = new ObservableStore({ foo: 'foo' });
const barController = new ExampleController({
messenger: controllerMessenger,
});
const bazController = new OldExampleController();
const store = new ComposableObservableStore({
config: {
FooStore: fooStore,
BarStore: barController,
BazStore: bazController,
},
controllerMessenger,
state: {
FooStore: fooStore.getState(),
BarStore: barController.state,
BazStore: bazController.state,
},
});
assert.deepEqual(store.getFlatState(), {
foo: 'foo',
bar: 'bar',
baz: 'baz',
});
});
it('should return empty flattened state when not configured', function () {
const controllerMessenger = new ControllerMessenger();
const store = new ComposableObservableStore({ controllerMessenger });
assert.deepEqual(store.getFlatState(), {});
});
it('should throw if the controller messenger is omitted and the config includes a BaseControllerV2 controller', function () {
const controllerMessenger = new ControllerMessenger();
const exampleController = new ExampleController({
messenger: controllerMessenger,
});
assert.throws(
() =>
new ComposableObservableStore({
config: {
Example: exampleController,
},
}),
);
});
it('should throw if the controller messenger is omitted and updateStructure called with a BaseControllerV2 controller', function () {
const controllerMessenger = new ControllerMessenger();
const exampleController = new ExampleController({
messenger: controllerMessenger,
});
const store = new ComposableObservableStore({});
assert.throws(() => store.updateStructure({ Example: exampleController }));
});
it('should throw if initialized with undefined config entry', function () {
const controllerMessenger = new ControllerMessenger();
assert.throws(
() =>
new ComposableObservableStore({
config: {
Example: undefined,
},
controllerMessenger,
}),
);
});
});

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import {
KOVAN_CHAIN_ID,
MAINNET_CHAIN_ID,

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import cleanErrorStack from './cleanErrorStack';
describe('Clean Error Stack', function () {
@ -14,7 +14,7 @@ describe('Clean Error Stack', function () {
});
it('tests error with message', function () {
assert.equal(cleanErrorStack(testError), 'Error: Test Message');
assert.equal(cleanErrorStack(testError).toString(), 'Error: Test Message');
});
it('tests error with undefined name', function () {
@ -29,6 +29,6 @@ describe('Clean Error Stack', function () {
});
it('tests error with blank message', function () {
assert.equal(cleanErrorStack(blankMsgError), 'Error');
assert.equal(cleanErrorStack(blankMsgError).toString(), 'Error');
});
});

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import { obj as createThoughStream } from 'through2';
import createMetaRPCHandler from './createMetaRPCHandler';

View File

@ -40,9 +40,7 @@ export default async function getFirstPreferredLangCode() {
const firstPreferredLangCode = userPreferredLocaleCodes
.map((code) => code.toLowerCase().replace('_', '-'))
.find((code) =>
Object.prototype.hasOwnProperty.call(existingLocaleCodes, code),
);
.find((code) => existingLocaleCodes[code] !== undefined);
return existingLocaleCodes[firstPreferredLangCode] || 'en';
}

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import { TRANSACTION_STATUSES } from '../../../shared/constants/transaction';
import MessageManager from './message-manager';

View File

@ -6,6 +6,7 @@ class MetaRPCClient {
constructor(connectionStream) {
this.connectionStream = connectionStream;
this.notificationChannel = new SafeEventEmitter();
this.uncaughtErrorChannel = new SafeEventEmitter();
this.requests = new Map();
this.connectionStream.on('data', this.handleResponse.bind(this));
this.connectionStream.on('end', this.close.bind(this));
@ -17,36 +18,49 @@ class MetaRPCClient {
});
}
onUncaughtError(handler) {
this.uncaughtErrorChannel.addListener('error', (error) => {
handler(error);
});
}
close() {
this.notificationChannel.removeAllListeners();
this.uncaughtErrorChannel.removeAllListeners();
}
handleResponse(data) {
const { id, result, error, method, params } = data;
const isNotification = id === undefined && error === undefined;
const cb = this.requests.get(id);
if (method && params && id) {
if (method && params && !isNotification) {
// dont handle server-side to client-side requests
return;
}
if (method && params && !id) {
if (method && params && isNotification) {
// handle servier-side to client-side notification
this.notificationChannel.emit('notification', data);
return;
}
if (!cb) {
// not found in request list
return;
}
if (error) {
const e = new EthereumRpcError(error.code, error.message, error.data);
// preserve the stack from serializeError
e.stack = error.stack;
if (cb) {
this.requests.delete(id);
cb(e);
return;
}
this.uncaughtErrorChannel.emit('error', e);
return;
}
if (!cb) {
// not found in request list
return;
}
this.requests.delete(id);

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import { obj as createThoughStream } from 'through2';
import metaRPCClientFactory from './metaRPCClientFactory';
@ -85,4 +85,58 @@ describe('metaRPCClientFactory', function () {
});
});
});
it('should be able to handle notifications', function (done) {
const streamTest = createThoughStream();
const metaRPCClient = metaRPCClientFactory(streamTest);
metaRPCClient.onNotification((notification) => {
assert(notification.method, 'foobarbaz');
done();
});
// send a notification
streamTest.write({
jsonrpc: '2.0',
method: 'foobarbaz',
params: ['bar'],
});
});
it('should be able to handle errors with no id', function (done) {
const streamTest = createThoughStream();
const metaRPCClient = metaRPCClientFactory(streamTest);
metaRPCClient.onUncaughtError((error) => {
assert(error.code, 1);
done();
});
streamTest.write({
jsonrpc: '2.0',
error: {
code: 1,
message: 'error msg',
},
});
});
it('should be able to handle errors with null id', function (done) {
const streamTest = createThoughStream();
const metaRPCClient = metaRPCClientFactory(streamTest);
metaRPCClient.onUncaughtError((error) => {
assert(error.code, 1);
done();
});
streamTest.write({
jsonrpc: '2.0',
id: null,
error: {
code: 1,
message: 'error msg',
},
});
});
});

View File

@ -1,5 +1,5 @@
import fs from 'fs';
import assert from 'assert';
import { strict as assert } from 'assert';
import { cloneDeep } from 'lodash';
import liveMigrations from '../../migrations';
import data from '../../first-time-state';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import nodeify from './nodeify';
describe('nodeify', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import { TRANSACTION_STATUSES } from '../../../shared/constants/transaction';
import PersonalMessageManager from './personal-message-manager';

View File

@ -1,4 +1,4 @@
import { ethErrors } from 'eth-rpc-errors';
import { ethErrors, errorCodes } from 'eth-rpc-errors';
import validUrl from 'valid-url';
import { omit } from 'lodash';
import { MESSAGE_TYPE } from '../../../../../shared/constants/app';
@ -123,12 +123,16 @@ async function addEthereumChainHandler(
const existingNetwork = findCustomRpcBy({ chainId: _chainId });
if (existingNetwork !== null) {
if (existingNetwork) {
// If the network already exists, the request is considered successful
res.result = null;
const currentChainId = getCurrentChainId();
if (currentChainId === _chainId) {
res.result = null;
return end();
}
// Ask the user to switch the network
try {
await updateRpcTarget(
await requestUserApproval({
@ -144,8 +148,13 @@ async function addEthereumChainHandler(
);
res.result = null;
} catch (error) {
// For the purposes of this method, it does not matter if the user
// declines to switch the selected network. However, other errors indicate
// that something is wrong.
if (error.code !== errorCodes.provider.userRejectedRequest) {
return end(error);
}
}
return end();
}
@ -251,6 +260,14 @@ async function addEthereumChainHandler(
},
});
// Once the network has been added, the requested is considered successful
res.result = null;
} catch (error) {
return end(error);
}
// Ask the user to switch the network
try {
await updateRpcTarget(
await requestUserApproval({
origin,
@ -263,10 +280,13 @@ async function addEthereumChainHandler(
},
}),
);
res.result = null;
} catch (error) {
// For the purposes of this method, it does not matter if the user
// declines to switch the selected network. However, other errors indicate
// that something is wrong.
if (error.code !== errorCodes.provider.userRejectedRequest) {
return end(error);
}
}
return end();
}

View File

@ -1,10 +1,12 @@
import addEthereumChain from './add-ethereum-chain';
import switchEthereumChain from './switch-ethereum-chain';
import getProviderState from './get-provider-state';
import logWeb3ShimUsage from './log-web3-shim-usage';
import watchAsset from './watch-asset';
const handlers = [
addEthereumChain,
switchEthereumChain,
getProviderState,
logWeb3ShimUsage,
watchAsset,

View File

@ -0,0 +1,113 @@
import { ethErrors } from 'eth-rpc-errors';
import { omit } from 'lodash';
import { MESSAGE_TYPE } from '../../../../../shared/constants/app';
import {
ETH_SYMBOL,
CHAIN_ID_TO_TYPE_MAP,
NETWORK_TO_NAME_MAP,
} from '../../../../../shared/constants/network';
import {
isPrefixedFormattedHexString,
isSafeChainId,
} from '../../../../../shared/modules/network.utils';
const switchEthereumChain = {
methodNames: [MESSAGE_TYPE.SWITCH_ETHEREUM_CHAIN],
implementation: switchEthereumChainHandler,
};
export default switchEthereumChain;
function findExistingNetwork(chainId, findCustomRpcBy) {
if (chainId in CHAIN_ID_TO_TYPE_MAP) {
return {
chainId,
nickname: NETWORK_TO_NAME_MAP[chainId],
ticker: ETH_SYMBOL,
};
}
return findCustomRpcBy({ chainId });
}
async function switchEthereumChainHandler(
req,
res,
_next,
end,
{ getCurrentChainId, findCustomRpcBy, updateRpcTarget, requestUserApproval },
) {
if (!req.params?.[0] || typeof req.params[0] !== 'object') {
return end(
ethErrors.rpc.invalidParams({
message: `Expected single, object parameter. Received:\n${JSON.stringify(
req.params,
)}`,
}),
);
}
const { origin } = req;
const { chainId } = req.params[0];
const otherKeys = Object.keys(omit(req.params[0], ['chainId']));
if (otherKeys.length > 0) {
return end(
ethErrors.rpc.invalidParams({
message: `Received unexpected keys on object parameter. Unsupported keys:\n${otherKeys}`,
}),
);
}
const _chainId = typeof chainId === 'string' && chainId.toLowerCase();
if (!isPrefixedFormattedHexString(_chainId)) {
return end(
ethErrors.rpc.invalidParams({
message: `Expected 0x-prefixed, unpadded, non-zero hexadecimal string 'chainId'. Received:\n${chainId}`,
}),
);
}
if (!isSafeChainId(parseInt(_chainId, 16))) {
return end(
ethErrors.rpc.invalidParams({
message: `Invalid chain ID "${_chainId}": numerical value greater than max safe value. Received:\n${chainId}`,
}),
);
}
const existingNetwork = findExistingNetwork(_chainId, findCustomRpcBy);
if (existingNetwork) {
const currentChainId = getCurrentChainId();
if (currentChainId === _chainId) {
res.result = null;
return end();
}
try {
await updateRpcTarget(
await requestUserApproval({
origin,
type: MESSAGE_TYPE.SWITCH_ETHEREUM_CHAIN,
requestData: {
chainId: existingNetwork.chainId,
nickname: existingNetwork.nickname,
ticker: existingNetwork.ticker,
},
}),
);
res.result = null;
} catch (error) {
return end(error);
}
return end();
}
return end(
ethErrors.provider.custom({
code: 4902, // To-be-standardized "unrecognized chain ID" error
message: `Unrecognized chain ID "${chainId}". Try adding the chain using ${MESSAGE_TYPE.ADD_ETHEREUM_CHAIN} first.`,
}),
);
}

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import { cloneDeep } from 'lodash';
import KeyringController from 'eth-keyring-controller';
import firstTimeState from '../first-time-state';

View File

@ -7,9 +7,8 @@ import extractEthjsErrorMessage from './extractEthjsErrorMessage';
// Destructuring breaks the inlining of the environment variables
const METAMASK_DEBUG = process.env.METAMASK_DEBUG;
const METAMASK_ENVIRONMENT = process.env.METAMASK_ENVIRONMENT;
const SENTRY_DSN_DEV = process.env.SENTRY_DSN_DEV;
/* eslint-enable prefer-destructuring */
const SENTRY_DSN_DEV =
'https://f59f3dd640d2429d9d0e2445a87ea8e1@sentry.io/273496';
// This describes the subset of Redux state attached to errors sent to Sentry
// These properties have some potential to be useful for debugging, and they do

View File

@ -1,5 +1,5 @@
import EventEmitter from 'events';
import assert from 'assert';
import { strict as assert } from 'assert';
import { ObservableStore } from '@metamask/obs-store';
import { ethErrors } from 'eth-rpc-errors';
import { typedSignatureHash, TYPED_MESSAGE_SCHEMA } from 'eth-sig-util';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import sinon from 'sinon';
import { TRANSACTION_STATUSES } from '../../../shared/constants/transaction';
import TypedMessageManager from './typed-message-manager';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import extension from 'extensionizer';
import { stripHexPrefix } from 'ethereumjs-util';
import BN from 'bn.js';

View File

@ -20,6 +20,7 @@ import contractMap from '@metamask/contract-metadata';
import {
AddressBookController,
ApprovalController,
ControllerMessenger,
CurrencyRateController,
PhishingController,
NotificationController,
@ -96,8 +97,13 @@ export default class MetamaskController extends EventEmitter {
this.getRequestAccountTabIds = opts.getRequestAccountTabIds;
this.getOpenMetamaskTabsIds = opts.getOpenMetamaskTabsIds;
const controllerMessenger = new ControllerMessenger();
// observable state store
this.store = new ComposableObservableStore(initState);
this.store = new ComposableObservableStore({
state: initState,
controllerMessenger,
});
// external connections by origin
// Do not modify directly. Use the associated methods.
@ -157,10 +163,14 @@ export default class MetamaskController extends EventEmitter {
preferencesStore: this.preferencesController.store,
});
this.currencyRateController = new CurrencyRateController(
{ includeUSDRate: true },
initState.CurrencyController,
);
const currencyRateMessenger = controllerMessenger.getRestricted({
name: 'CurrencyRateController',
});
this.currencyRateController = new CurrencyRateController({
includeUSDRate: true,
messenger: currencyRateMessenger,
state: initState.CurrencyController,
});
this.phishingController = new PhishingController();
@ -222,10 +232,12 @@ export default class MetamaskController extends EventEmitter {
this.accountTracker.start();
this.incomingTransactionsController.start();
this.tokenRatesController.start();
this.currencyRateController.start();
} else {
this.accountTracker.stop();
this.incomingTransactionsController.stop();
this.tokenRatesController.stop();
this.currencyRateController.stop();
}
});
@ -364,18 +376,15 @@ export default class MetamaskController extends EventEmitter {
}
});
this.networkController.on(NETWORK_EVENTS.NETWORK_DID_CHANGE, () => {
this.setCurrentCurrency(
this.currencyRateController.state.currentCurrency,
(error) => {
if (error) {
throw error;
}
},
);
});
this.networkController.on(NETWORK_EVENTS.NETWORK_DID_CHANGE, async () => {
const { ticker } = this.networkController.getProviderConfig();
this.currencyRateController.configure({ nativeCurrency: ticker ?? 'ETH' });
try {
await this.currencyRateController.setNativeCurrency(ticker);
} catch (error) {
// TODO: Handle failure to get conversion rate more gracefully
console.error(error);
}
});
this.networkController.lookupNetwork();
this.messageManager = new MessageManager();
this.personalMessageManager = new PersonalMessageManager();
@ -439,7 +448,8 @@ export default class MetamaskController extends EventEmitter {
NotificationController: this.notificationController,
});
this.memStore = new ComposableObservableStore(null, {
this.memStore = new ComposableObservableStore({
config: {
AppStateController: this.appStateController.store,
NetworkController: this.networkController.store,
AccountTracker: this.accountTracker.store,
@ -458,7 +468,8 @@ export default class MetamaskController extends EventEmitter {
CurrencyController: this.currencyRateController,
AlertController: this.alertController.store,
OnboardingController: this.onboardingController.store,
IncomingTransactionsController: this.incomingTransactionsController.store,
IncomingTransactionsController: this.incomingTransactionsController
.store,
PermissionsController: this.permissionsController.permissions,
PermissionsMetadata: this.permissionsController.store,
ThreeBoxController: this.threeBoxController.store,
@ -466,6 +477,8 @@ export default class MetamaskController extends EventEmitter {
EnsController: this.ensController.store,
ApprovalController: this.approvalController,
NotificationController: this.notificationController,
},
controllerMessenger,
});
this.memStore.subscribe(this.sendUpdate.bind(this));
@ -478,6 +491,17 @@ export default class MetamaskController extends EventEmitter {
this.submitPassword(password);
}
// Lazily update the store with the current extension environment
this.extension.runtime.getPlatformInfo(({ os }) => {
this.appStateController.setBrowserEnvironment(
os,
// This method is presently only supported by Firefox
this.extension.runtime.getBrowserInfo === undefined
? 'chrome'
: 'firefox',
);
});
// TODO:LegacyProvider: Delete
this.publicConfigStore = this.createPublicConfigStore();
}
@ -638,7 +662,11 @@ export default class MetamaskController extends EventEmitter {
return {
// etc
getState: (cb) => cb(null, this.getState()),
setCurrentCurrency: this.setCurrentCurrency.bind(this),
setCurrentCurrency: nodeify(
this.currencyRateController.setCurrentCurrency.bind(
this.currencyRateController,
),
),
setUseBlockie: this.setUseBlockie.bind(this),
setUseNonceField: this.setUseNonceField.bind(this),
setUsePhishDetect: this.setUsePhishDetect.bind(this),
@ -724,6 +752,10 @@ export default class MetamaskController extends EventEmitter {
preferencesController.addKnownMethodData,
preferencesController,
),
setDismissSeedBackUpReminder: nodeify(
this.preferencesController.setDismissSeedBackUpReminder,
this.preferencesController,
),
// AddressController
setAddressBook: nodeify(
@ -2493,29 +2525,6 @@ export default class MetamaskController extends EventEmitter {
// Log blocks
/**
* A method for setting the user's preferred display currency.
* @param {string} currencyCode - The code of the preferred currency.
* @param {Function} cb - A callback function returning currency info.
*/
setCurrentCurrency(currencyCode, cb) {
const { ticker } = this.networkController.getProviderConfig();
try {
const currencyState = {
nativeCurrency: ticker,
currentCurrency: currencyCode,
};
this.currencyRateController.update(currencyState);
this.currencyRateController.configure(currencyState);
cb(null, this.currencyRateController.state);
return;
} catch (err) {
cb(err);
// eslint-disable-next-line no-useless-return
return;
}
}
/**
* A method for selecting a custom URL for an ethereum RPC provider and updating it
* @param {string} rpcUrl - A URL for a valid Ethereum RPC API.

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import sinon from 'sinon';
import { cloneDeep } from 'lodash';
import nock from 'nock';
@ -52,6 +52,7 @@ const ExtensionizerMock = {
onInstalled: {
addListener: () => undefined,
},
getPlatformInfo: async () => 'mac',
},
};
@ -492,8 +493,8 @@ describe('MetaMaskController', function () {
);
} catch (e) {
assert.equal(
e,
'Error: MetamaskController:getKeyringForDevice - Unknown device',
e.message,
'MetamaskController:getKeyringForDevice - Unknown device',
);
}
});
@ -534,8 +535,8 @@ describe('MetaMaskController', function () {
);
} catch (e) {
assert.equal(
e,
'Error: MetamaskController:getKeyringForDevice - Unknown device',
e.message,
'MetamaskController:getKeyringForDevice - Unknown device',
);
}
});
@ -553,8 +554,8 @@ describe('MetaMaskController', function () {
await metamaskController.forgetDevice('Some random device name');
} catch (e) {
assert.equal(
e,
'Error: MetamaskController:getKeyringForDevice - Unknown device',
e.message,
'MetamaskController:getKeyringForDevice - Unknown device',
);
}
});
@ -653,46 +654,24 @@ describe('MetaMaskController', function () {
});
describe('#setCustomRpc', function () {
let rpcUrl;
beforeEach(function () {
rpcUrl = metamaskController.setCustomRpc(
it('returns custom RPC that when called', async function () {
const rpcUrl = await metamaskController.setCustomRpc(
CUSTOM_RPC_URL,
CUSTOM_RPC_CHAIN_ID,
);
assert.equal(rpcUrl, CUSTOM_RPC_URL);
});
it('returns custom RPC that when called', async function () {
assert.equal(await rpcUrl, CUSTOM_RPC_URL);
});
it('changes the network controller rpc', function () {
it('changes the network controller rpc', async function () {
await metamaskController.setCustomRpc(
CUSTOM_RPC_URL,
CUSTOM_RPC_CHAIN_ID,
);
const networkControllerState = metamaskController.networkController.store.getState();
assert.equal(networkControllerState.provider.rpcUrl, CUSTOM_RPC_URL);
});
});
describe('#setCurrentCurrency', function () {
let defaultMetaMaskCurrency;
beforeEach(function () {
defaultMetaMaskCurrency =
metamaskController.currencyRateController.state.currentCurrency;
});
it('defaults to usd', function () {
assert.equal(defaultMetaMaskCurrency, 'usd');
});
it('sets currency to JPY', function () {
metamaskController.setCurrentCurrency('JPY', noop);
assert.equal(
metamaskController.currencyRateController.state.currentCurrency,
'JPY',
);
});
});
describe('#addNewAccount', function () {
it('errors when an primary keyring is does not exist', async function () {
const addNewAccount = metamaskController.addNewAccount();

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import wallet2 from '../../../test/lib/migrations/002.json';
import migration21 from './021';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import { TRANSACTION_STATUSES } from '../../../shared/constants/transaction';
import migration22 from './022';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import { TRANSACTION_STATUSES } from '../../../shared/constants/transaction';
import migration23 from './023';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import data from '../first-time-state';
import { TRANSACTION_STATUSES } from '../../../shared/constants/transaction';
import migration24 from './024';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import data from '../first-time-state';
import { TRANSACTION_STATUSES } from '../../../shared/constants/transaction';
import migration25 from './025';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import firstTimeState from '../first-time-state';
import migration26 from './026';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import firstTimeState from '../first-time-state';
import { TRANSACTION_STATUSES } from '../../../shared/constants/transaction';
import migration27 from './027';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import firstTimeState from '../first-time-state';
import migration28 from './028';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import { TRANSACTION_STATUSES } from '../../../shared/constants/transaction';
import migration29 from './029';

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migrationTemplate from './030';
const storage = {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration31 from './031';
describe('migration #31', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration33 from './033';
describe('Migration to delete notice controller', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration34 from './034';
describe('migration #34', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration35 from './035';
describe('migration #35', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration36 from './036';
describe('migration #36', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration37 from './037';
describe('migration #37', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration39 from './039';
describe('migration #39', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration40 from './040';
describe('migration #40', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration41 from './041';
describe('migration #41', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration42 from './042';
describe('migration #42', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration45 from './045';
describe('migration #45', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration49 from './049';
describe('migration #49', function () {

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import {
GOERLI,
GOERLI_CHAIN_ID,

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migration56 from './056';
const BAD_TOKEN_DATA = { symbol: null, decimals: null };

View File

@ -0,0 +1,35 @@
import { cloneDeep, isPlainObject } from 'lodash';
const version = 60;
const SUPPORT_NOTIFICATION_KEY = 2;
const SUPPORT_NOTIFICATION_DATE = '2020-08-31';
/**
* Removes the support survey notification
*/
export default {
version,
async migrate(originalVersionedData) {
const versionedData = cloneDeep(originalVersionedData);
versionedData.meta.version = version;
const state = versionedData.data;
const newState = transformState(state);
versionedData.data = newState;
return versionedData;
},
};
function transformState(state) {
const notifications = state?.NotificationController?.notifications;
if (isPlainObject(notifications)) {
if (
notifications[SUPPORT_NOTIFICATION_KEY]?.date ===
SUPPORT_NOTIFICATION_DATE
) {
delete state.NotificationController.notifications[
SUPPORT_NOTIFICATION_KEY
];
}
}
return state;
}

View File

@ -0,0 +1,143 @@
import { strict as assert } from 'assert';
import migration60 from './060';
describe('migration #60', function () {
it('should update the version metadata', async function () {
const oldStorage = {
meta: {
version: 59,
},
data: {},
};
const newStorage = await migration60.migrate(oldStorage);
assert.deepEqual(newStorage.meta, {
version: 60,
});
});
it('prunes the support notification', async function () {
const oldStorage = {
meta: {},
data: {
NotificationController: {
notifications: {
1: {
id: 1,
date: '2021-03-17',
image: {
src: 'images/mobile-link-qr.svg',
height: '230px',
width: '230px',
placeImageBelowDescription: true,
},
},
2: {
id: 2,
date: '2020-08-31',
},
3: {
id: 3,
date: '2021-03-08',
},
4: {
id: 4,
date: '2021-05-11',
image: {
src: 'images/source-logos-bsc.svg',
width: '100%',
},
},
},
},
},
};
const newStorage = await migration60.migrate(oldStorage);
const { notifications } = newStorage.data.NotificationController;
const notificationKeys = Object.keys(notifications);
// Assert support notification is removed
assert.equal(notificationKeys.length, 3);
notificationKeys.forEach((key) => {
assert.notEqual(notifications[key].date, '2020-08-31');
});
});
it('does not modify state when the support notification does not exist', async function () {
const oldStorage = {
meta: {},
data: {
NotificationController: {
notifications: {
1: {
id: 1,
date: '2021-03-17',
image: {
src: 'images/mobile-link-qr.svg',
height: '230px',
width: '230px',
placeImageBelowDescription: true,
},
},
3: {
id: 3,
date: '2021-03-08',
},
4: {
id: 4,
date: '2021-05-11',
image: {
src: 'images/source-logos-bsc.svg',
width: '100%',
},
},
},
},
},
};
const newStorage = await migration60.migrate(oldStorage);
assert.deepEqual(oldStorage.data, newStorage.data);
});
it('does not modify state when NotificationsController is undefined', async function () {
const oldStorage = {
meta: {},
data: {
arbitraryPropOne: 1,
arbitraryPropTwo: 2,
},
};
const newStorage = await migration60.migrate(oldStorage);
assert.deepEqual(oldStorage.data, newStorage.data);
});
it('does not modify state when notifications are undefined', async function () {
const oldStorage = {
meta: {},
data: {
NotificationController: {
arbitraryControllerProp: 'foo',
},
},
};
const newStorage = await migration60.migrate(oldStorage);
assert.deepEqual(oldStorage.data, newStorage.data);
});
it('does not modify state when notifications are not an object', async function () {
const oldStorage = {
meta: {},
data: {
NotificationController: {
notifications: [],
},
},
};
const newStorage = await migration60.migrate(oldStorage);
assert.deepEqual(oldStorage.data, newStorage.data);
});
});

View File

@ -64,6 +64,7 @@ const migrations = [
require('./057').default,
require('./058').default,
require('./059').default,
require('./060').default,
];
export default migrations;

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import wallet1 from '../../../test/lib/migrations/001.json';
import vault4 from '../../../test/lib/migrations/004.json';
import migration2 from './002';
@ -52,7 +52,7 @@ describe('wallet1 is migrated successfully', function () {
const fourthData = fourthResult.data;
assert.equal(
fourthData.config.provider.rpcTarget,
null,
undefined,
'old rpcTarget should not exist.',
);
assert.equal(
@ -65,15 +65,15 @@ describe('wallet1 is migrated successfully', function () {
})
.then((fifthResult) => {
const fifthData = fifthResult.data;
assert.equal(fifthData.vault, null, 'old vault should not exist');
assert.equal(fifthData.vault, undefined, 'old vault should not exist');
assert.equal(
fifthData.walletNicknames,
null,
undefined,
'old walletNicknames should not exist',
);
assert.equal(
fifthData.config.selectedAccount,
null,
undefined,
'old config.selectedAccount should not exist',
);
assert.equal(
@ -102,7 +102,7 @@ describe('wallet1 is migrated successfully', function () {
.then((sixthResult) => {
assert.equal(
sixthResult.data.KeyringController.selectedAccount,
null,
undefined,
'old selectedAccount should not exist',
);
assert.equal(
@ -117,12 +117,12 @@ describe('wallet1 is migrated successfully', function () {
.then((seventhResult) => {
assert.equal(
seventhResult.data.transactions,
null,
undefined,
'old transactions should not exist',
);
assert.equal(
seventhResult.data.gasMultiplier,
null,
undefined,
'old gasMultiplier should not exist',
);
assert.equal(
@ -142,7 +142,7 @@ describe('wallet1 is migrated successfully', function () {
.then((eighthResult) => {
assert.equal(
eighthResult.data.noticesList,
null,
undefined,
'old noticesList should not exist',
);
assert.equal(
@ -157,22 +157,22 @@ describe('wallet1 is migrated successfully', function () {
.then((ninthResult) => {
assert.equal(
ninthResult.data.currentFiat,
null,
undefined,
'old currentFiat should not exist',
);
assert.equal(
ninthResult.data.fiatCurrency,
null,
undefined,
'old fiatCurrency should not exist',
);
assert.equal(
ninthResult.data.conversionRate,
null,
undefined,
'old conversionRate should not exist',
);
assert.equal(
ninthResult.data.conversionDate,
null,
undefined,
'old conversionDate should not exist',
);
@ -198,7 +198,7 @@ describe('wallet1 is migrated successfully', function () {
.then((tenthResult) => {
assert.equal(
tenthResult.data.shapeShiftTxList,
null,
undefined,
'old shapeShiftTxList should not exist',
);
assert.equal(
@ -211,12 +211,12 @@ describe('wallet1 is migrated successfully', function () {
.then((eleventhResult) => {
assert.equal(
eleventhResult.data.isDisclaimerConfirmed,
null,
undefined,
'isDisclaimerConfirmed should not exist',
);
assert.equal(
eleventhResult.data.TOSHash,
null,
undefined,
'TOSHash should not exist',
);

View File

@ -1,4 +1,4 @@
import assert from 'assert';
import { strict as assert } from 'assert';
import migrationTemplate from './template';
const storage = {

View File

@ -1,8 +1,8 @@
import extension from 'extensionizer';
import { getBlockExplorerLink } from '@metamask/etherscan-link';
import { getEnvironmentType, checkForError } from '../lib/util';
import { ENVIRONMENT_TYPE_BACKGROUND } from '../../../shared/constants/app';
import { TRANSACTION_STATUSES } from '../../../shared/constants/transaction';
import { getBlockExplorerUrlForTx } from '../../../shared/modules/transaction.utils';
export default class ExtensionPlatform {
//
@ -192,7 +192,7 @@ export default class ExtensionPlatform {
_showConfirmedTransaction(txMeta, rpcPrefs) {
this._subscribeToNotificationClicked();
const url = getBlockExplorerUrlForTx(txMeta, rpcPrefs);
const url = getBlockExplorerLink(txMeta, rpcPrefs);
const nonce = parseInt(txMeta.txParams.nonce, 16);
const title = 'Confirmed transaction';

View File

@ -1,6 +1,6 @@
const fs = require('fs');
const path = require('path');
const { version } = require('../app/manifest/_base.json');
const { version } = require('../package.json');
const changelog = fs.readFileSync(
path.join(__dirname, '..', 'CHANGELOG.md'),

View File

@ -1,67 +0,0 @@
#!/usr/bin/env node
const fs = require('fs').promises;
const path = require('path');
const { version } = require('../app/manifest/_base.json');
const { updateChangelog } = require('./lib/changelog/updateChangelog');
const { unreleased } = require('./lib/changelog/constants');
const REPO_URL = 'https://github.com/MetaMask/metamask-extension';
const command = 'yarn update-changelog';
const helpText = `Usage: ${command} [--rc] [-h|--help]
Update CHANGELOG.md with any changes made since the most recent release.
Options:
--rc Add new changes to the current release header, rather than to the
'${unreleased}' section.
-h, --help Display this help and exit.
New commits will be added to the "${unreleased}" section (or to the section for the
current release if the '--rc' flag is used) in reverse chronological order. Any
commits for PRs that are represented already in the changelog will be ignored.
If the '--rc' flag is used and the section for the current release does not yet
exist, it will be created.
`;
async function main() {
const args = process.argv.slice(2);
let isReleaseCandidate = false;
for (const arg of args) {
if (arg === '--rc') {
isReleaseCandidate = true;
} else if (['--help', '-h'].includes(arg)) {
console.log(helpText);
process.exit(0);
} else {
console.error(
`Unrecognized argument: ${arg}\nTry '${command} --help' for more information.\n`,
);
process.exit(1);
}
}
const changelogFilename = path.resolve(__dirname, '..', 'CHANGELOG.md');
const changelogContent = await fs.readFile(changelogFilename, {
encoding: 'utf8',
});
const newChangelogContent = await updateChangelog({
changelogContent,
currentVersion: version,
repoUrl: REPO_URL,
isReleaseCandidate,
});
await fs.writeFile(changelogFilename, newChangelogContent);
console.log('CHANGELOG updated');
}
main().catch((error) => {
console.error(error);
process.exit(1);
});

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