mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-22 17:33:23 +01:00
Merge remote-tracking branch 'origin/develop' into master-sync
This commit is contained in:
commit
bc042f96fe
1
.browserslistrc
Normal file
1
.browserslistrc
Normal file
@ -0,0 +1 @@
|
||||
chrome >= 66, firefox >= 68
|
@ -14,6 +14,9 @@ executors:
|
||||
docker:
|
||||
- image: koalaman/shellcheck-alpine@sha256:dfaf08fab58c158549d3be64fb101c626abc5f16f341b569092577ae207db199
|
||||
|
||||
orbs:
|
||||
gh: circleci/github-cli@2.0
|
||||
|
||||
workflows:
|
||||
test_and_release:
|
||||
jobs:
|
||||
@ -59,12 +62,9 @@ workflows:
|
||||
- prep-build-test-flask:
|
||||
requires:
|
||||
- prep-deps
|
||||
- test-storybook:
|
||||
requires:
|
||||
- prep-deps
|
||||
- prep-build-storybook:
|
||||
requires:
|
||||
- test-storybook
|
||||
- prep-deps
|
||||
- prep-build-ts-migration-dashboard:
|
||||
requires:
|
||||
- prep-deps
|
||||
@ -209,6 +209,27 @@ jobs:
|
||||
- checkout
|
||||
- restore_cache:
|
||||
key: dependency-cache-v1-{{ checksum "yarn.lock" }}
|
||||
- gh/install
|
||||
- run:
|
||||
name: Set IS_DRAFT environment variable
|
||||
command: |
|
||||
PR_NUMBER="${CIRCLE_PULL_REQUEST##*/}"
|
||||
if [ -n "$PR_NUMBER" ]
|
||||
then
|
||||
echo "IS_DRAFT=$(gh pr view --json isDraft --jq '.isDraft' "$PR_NUMBER")" >> "$BASH_ENV"
|
||||
source "$BASH_ENV"
|
||||
else
|
||||
echo "Not a PR; skipping"
|
||||
fi
|
||||
- run:
|
||||
name: Setup registry config for using package previews on draft PRs
|
||||
command: |
|
||||
if [[ $IS_DRAFT == 'true' ]]
|
||||
then
|
||||
printf '%s\n\n%s' '@metamask:registry=https://npm.pkg.github.com' "//npm.pkg.github.com/:_authToken=${GITHUB_PACKAGE_READ_TOKEN}" > .npmrc
|
||||
else
|
||||
echo "Not draft; skipping GitHub registry setup"
|
||||
fi
|
||||
- run:
|
||||
name: Install deps
|
||||
command: |
|
||||
@ -448,16 +469,6 @@ jobs:
|
||||
paths:
|
||||
- development/ts-migration-dashboard/build
|
||||
|
||||
test-storybook:
|
||||
executor: node-browsers
|
||||
steps:
|
||||
- checkout
|
||||
- attach_workspace:
|
||||
at: .
|
||||
- run:
|
||||
name: Test Storybook
|
||||
command: yarn storybook:test
|
||||
|
||||
test-yarn-dedupe:
|
||||
executor: node-browsers
|
||||
steps:
|
||||
@ -595,7 +606,7 @@ jobs:
|
||||
command: |
|
||||
if .circleci/scripts/test-run-e2e.sh
|
||||
then
|
||||
yarn test:e2e:chrome --retries 2 || echo "Temporarily suppressing MV3 e2e test failures"
|
||||
yarn test:e2e:chrome --retries 2 --mv3 || echo "Temporarily suppressing MV3 e2e test failures"
|
||||
fi
|
||||
no_output_timeout: 20m
|
||||
- store_artifacts:
|
||||
@ -832,7 +843,7 @@ jobs:
|
||||
- run:
|
||||
name: Set branch parent commit env var
|
||||
command: |
|
||||
echo "export PARENT_COMMIT=$(git rev-parse "$(git rev-list --topo-order --reverse HEAD ^origin/develop | head -1)"^)" >> $BASH_ENV
|
||||
echo "export PARENT_COMMIT=$(git merge-base origin/HEAD HEAD)" >> $BASH_ENV
|
||||
source $BASH_ENV
|
||||
- run:
|
||||
name: build:announce
|
||||
|
@ -4,6 +4,7 @@ ignores:
|
||||
# webapp deps
|
||||
#
|
||||
|
||||
- '@lavamoat/snow'
|
||||
- '@babel/runtime'
|
||||
- '@fortawesome/fontawesome-free'
|
||||
- 'punycode'
|
||||
@ -39,6 +40,8 @@ ignores:
|
||||
- '@storybook/core'
|
||||
- '@storybook/addon-essentials'
|
||||
- '@storybook/addon-a11y'
|
||||
- '@storybook/builder-webpack5'
|
||||
- '@storybook/manager-webpack5'
|
||||
- 'storybook-dark-mode'
|
||||
- 'style-loader'
|
||||
- 'css-loader'
|
||||
|
25
.github/CODEOWNERS
vendored
25
.github/CODEOWNERS
vendored
@ -1,7 +1,30 @@
|
||||
# Lines starting with '#' are comments.
|
||||
# Each line is a file pattern followed by one or more owners.
|
||||
# Owners bear a responsibility to the organization and the users of this
|
||||
# application. Repository administrators have the ability to merge pull
|
||||
# requests that have not yet received the requisite reviews as outlined
|
||||
# in this file. Do not force merge any PR without confidence that it
|
||||
# follows all policies or without full understanding of the impact of
|
||||
# those changes on build, release and publishing outcomes.
|
||||
|
||||
* @MetaMask/extension-devs
|
||||
.circleci/ @MetaMask/extension-devs @kumavis
|
||||
development/ @MetaMask/extension-devs @kumavis
|
||||
lavamoat/ @MetaMask/supply-chain
|
||||
|
||||
# The .circleci/ folder instructs Circle CI on the process by which it
|
||||
# should test, build and publish releases of our application. Due to the
|
||||
# impact that changes to the files contained within this folder may have
|
||||
# on our releases, only those with the knowledge and responsibility to
|
||||
# publish libraries under the MetaMask name may approve those changes.
|
||||
# Note to reviewers: We employ the use of CircleCI "Orbs", which are
|
||||
# remotely hosted sections of CircleCI configuration and scripts, to
|
||||
# empower our CI steps. ANY addition of orbs to our CircleCI config
|
||||
# should be brought to the attention of engineering leadership for
|
||||
# discussion
|
||||
.circleci/ @MetaMask/library-admins @kumavis
|
||||
# The CODEOWNERS file constitutes an agreement amongst organization
|
||||
# admins and maintainers to restrict approval capabilities to a subset
|
||||
# of contributors. Modifications to this file result in a modification of
|
||||
# that agreement and can only be approved by those with the knowledge
|
||||
# and responsibility to publish libraries under the MetaMask name.
|
||||
.github/CODEOWNERS @MetaMask/library-admins @kumavis
|
||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -55,4 +55,8 @@ notes.txt
|
||||
tsout/
|
||||
|
||||
# Test results
|
||||
test-results/
|
||||
test-results/
|
||||
|
||||
# This file is used to authenticate with the GitHub Package registry, to
|
||||
# enable the use of @metamask preview builds.
|
||||
.npmrc
|
||||
|
@ -9,6 +9,7 @@ PUBNUB_PUB_KEY=
|
||||
PUBNUB_SUB_KEY=
|
||||
TOKEN_ALLOWANCE_IMPROVEMENTS=
|
||||
PORTFOLIO_URL=
|
||||
TRANSACTION_SECURITY_PROVIDER=
|
||||
|
||||
; Set this to '1' to enable support for Sign-In with Ethereum [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361)
|
||||
SIWE_V1=
|
||||
|
@ -1454,7 +1454,7 @@ export const MOCK_TRANSACTION_BY_TYPE = {
|
||||
dappSuggestedGasFees: null,
|
||||
sendFlowHistory: [
|
||||
{
|
||||
entry: 'sendFlow - user set asset type to COLLECTIBLE',
|
||||
entry: 'sendFlow - user set asset type to NFT',
|
||||
timestamp: 1653457317999,
|
||||
},
|
||||
{
|
||||
@ -1504,7 +1504,7 @@ export const MOCK_TRANSACTION_BY_TYPE = {
|
||||
dappSuggestedGasFees: null,
|
||||
sendFlowHistory: [
|
||||
{
|
||||
entry: 'sendFlow - user set asset type to COLLECTIBLE',
|
||||
entry: 'sendFlow - user set asset type to NFT',
|
||||
timestamp: 1653457317999,
|
||||
},
|
||||
{
|
||||
|
@ -1,10 +1,14 @@
|
||||
const path = require('path');
|
||||
|
||||
const { ProvidePlugin } = require('webpack');
|
||||
const CopyWebpackPlugin = require('copy-webpack-plugin');
|
||||
|
||||
const { generateIconNames } = require('../development/generate-icon-names');
|
||||
|
||||
module.exports = {
|
||||
core: {
|
||||
builder: 'webpack5',
|
||||
},
|
||||
stories: [
|
||||
'../ui/**/*.stories.js',
|
||||
'../ui/**/*.stories.mdx',
|
||||
@ -37,10 +41,22 @@ module.exports = {
|
||||
config.resolve.alias['webextension-polyfill'] = require.resolve(
|
||||
'./__mocks__/webextension-polyfill.js',
|
||||
);
|
||||
config.resolve.fallback = {
|
||||
child_process: false,
|
||||
constants: false,
|
||||
crypto: false,
|
||||
fs: false,
|
||||
http: false,
|
||||
https: false,
|
||||
os: false,
|
||||
path: false,
|
||||
stream: require.resolve('stream-browserify'),
|
||||
_stream_transform: false,
|
||||
};
|
||||
config.module.strictExportPresence = true;
|
||||
config.module.rules.push({
|
||||
test: /\.scss$/,
|
||||
loaders: [
|
||||
use: [
|
||||
'style-loader',
|
||||
{
|
||||
loader: 'css-loader',
|
||||
@ -76,6 +92,11 @@ module.exports = {
|
||||
],
|
||||
}),
|
||||
);
|
||||
config.plugins.push(
|
||||
new ProvidePlugin({
|
||||
Buffer: ['buffer', 'Buffer'],
|
||||
}),
|
||||
)
|
||||
return config;
|
||||
},
|
||||
};
|
||||
|
@ -1,4 +1,6 @@
|
||||
import { draftTransactionInitialState } from '../ui/ducks/send';
|
||||
import { KEYRING_TYPES } from '../shared/constants/keyrings';
|
||||
|
||||
const state = {
|
||||
invalidCustomNetwork: {
|
||||
state: 'CLOSED',
|
||||
@ -29,7 +31,7 @@ const state = {
|
||||
{
|
||||
blockExplorerUrl: 'https://goerli.etherscan.io',
|
||||
chainId: '0x5',
|
||||
iconColor: 'var(--goerli)',
|
||||
iconColor: 'var(--color-network-goerli-default)',
|
||||
isATestNetwork: true,
|
||||
labelKey: 'goerli',
|
||||
providerType: 'goerli',
|
||||
@ -40,7 +42,7 @@ const state = {
|
||||
{
|
||||
blockExplorerUrl: 'https://sepolia.etherscan.io',
|
||||
chainId: '0xaa36a7',
|
||||
iconColor: 'var(--sepolia)',
|
||||
iconColor: 'var(--color-network-sepolia-default)',
|
||||
isATestNetwork: true,
|
||||
labelKey: 'sepolia',
|
||||
providerType: 'sepolia',
|
||||
@ -51,7 +53,7 @@ const state = {
|
||||
{
|
||||
blockExplorerUrl: '',
|
||||
chainId: '0x539',
|
||||
iconColor: 'var(--localhost)',
|
||||
iconColor: 'var(--color-network-localhost-default)',
|
||||
isATestNetwork: true,
|
||||
label: 'Localhost 8545',
|
||||
providerType: 'rpc',
|
||||
@ -61,7 +63,7 @@ const state = {
|
||||
{
|
||||
blockExplorerUrl: 'https://bscscan.com',
|
||||
chainId: '0x38',
|
||||
iconColor: 'var(--localhost)',
|
||||
iconColor: 'var(--color-network-localhost-default)',
|
||||
isATestNetwork: false,
|
||||
label: 'Binance Smart Chain',
|
||||
providerType: 'rpc',
|
||||
@ -71,7 +73,7 @@ const state = {
|
||||
{
|
||||
blockExplorerUrl: 'https://cchain.explorer.avax.network/',
|
||||
chainId: '0xa86a',
|
||||
iconColor: 'var(--localhost)',
|
||||
iconColor: 'var(--color-network-localhost-default)',
|
||||
isATestNetwork: false,
|
||||
label: 'Avalanche',
|
||||
providerType: 'rpc',
|
||||
@ -81,7 +83,7 @@ const state = {
|
||||
{
|
||||
blockExplorerUrl: 'https://polygonscan.com',
|
||||
chainId: '0x89',
|
||||
iconColor: 'var(--localhost)',
|
||||
iconColor: 'var(--color-network-localhost-default)',
|
||||
isATestNetwork: false,
|
||||
label: 'Polygon',
|
||||
providerType: 'rpc',
|
||||
@ -142,7 +144,7 @@ const state = {
|
||||
iconUrl:
|
||||
'https://assets.coingecko.com/coins/images/12256/thumb/falconswap.png?1598534184',
|
||||
aggregators: ['CoinGecko', '1inch', 'Lifi'],
|
||||
occurrences:3,
|
||||
occurrences: 3,
|
||||
unlisted: false,
|
||||
},
|
||||
'0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f': {
|
||||
@ -381,8 +383,7 @@ const state = {
|
||||
from: '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4',
|
||||
to: '0xaD6D458402F60fD3Bd25163575031ACDce07538D',
|
||||
value: '0x0',
|
||||
data:
|
||||
'0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000',
|
||||
data: '0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000',
|
||||
gas: '0xcb28',
|
||||
gasPrice: '0x77359400',
|
||||
},
|
||||
@ -401,8 +402,7 @@ const state = {
|
||||
from: '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4',
|
||||
to: '0xaD6D458402F60fD3Bd25163575031ACDce07538D',
|
||||
value: '0x0',
|
||||
data:
|
||||
'0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000',
|
||||
data: '0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000',
|
||||
gas: '0xcb28',
|
||||
gasPrice: '0x77359400',
|
||||
},
|
||||
@ -517,8 +517,8 @@ const state = {
|
||||
maxModeOn: false,
|
||||
editingTransactionId: null,
|
||||
toNickname: 'Account 2',
|
||||
ensResolution: null,
|
||||
ensResolutionError: '',
|
||||
domainResolution: null,
|
||||
domainResolutionError: '',
|
||||
token: {
|
||||
address: '0xaD6D458402F60fD3Bd25163575031ACDce07538D',
|
||||
symbol: 'DAI',
|
||||
@ -582,8 +582,7 @@ const state = {
|
||||
chainId: '0x38',
|
||||
dappSuggestedGasFees: null,
|
||||
firstRetryBlockNumber: '0x9c2686',
|
||||
hash:
|
||||
'0xf45e7a751adfc0fbadccc972816baf33eb34543e52ace51f0f8d0d7f357afdc6',
|
||||
hash: '0xf45e7a751adfc0fbadccc972816baf33eb34543e52ace51f0f8d0d7f357afdc6',
|
||||
history: [
|
||||
{
|
||||
chainId: '0x38',
|
||||
@ -595,8 +594,7 @@ const state = {
|
||||
status: 'unapproved',
|
||||
time: 1629582710520,
|
||||
txParams: {
|
||||
data:
|
||||
'0xa9059cbb0000000000000000000000004ef2d5a1d056e7c9e8bcdbf2bd9ac0df749a1c2900000000000000000000000000000000000000000000000029a2241af62c0000',
|
||||
data: '0xa9059cbb0000000000000000000000004ef2d5a1d056e7c9e8bcdbf2bd9ac0df749a1c2900000000000000000000000000000000000000000000000029a2241af62c0000',
|
||||
from: '0x17f62b1b2407c41c43e14da0699d6b4b0a521548',
|
||||
gas: '0x2eb27',
|
||||
gasPrice: '0x12a05f200',
|
||||
@ -780,8 +778,7 @@ const state = {
|
||||
blockHash:
|
||||
'0x30bf5dfa12e460a5d121267c00ba3047a14ba286e0c4fe75fa979010f527cba0',
|
||||
blockNumber: '9c2688',
|
||||
data:
|
||||
'0x00000000000000000000000000000000000000000000000028426c213d688000',
|
||||
data: '0x00000000000000000000000000000000000000000000000028426c213d688000',
|
||||
logIndex: '245',
|
||||
removed: false,
|
||||
topics: [
|
||||
@ -798,8 +795,7 @@ const state = {
|
||||
blockHash:
|
||||
'0x30bf5dfa12e460a5d121267c00ba3047a14ba286e0c4fe75fa979010f527cba0',
|
||||
blockNumber: '9c2688',
|
||||
data:
|
||||
'0x000000000000000000000000000000000000000000000000006a94d74f430000',
|
||||
data: '0x000000000000000000000000000000000000000000000000006a94d74f430000',
|
||||
logIndex: '246',
|
||||
removed: false,
|
||||
topics: [
|
||||
@ -816,8 +812,7 @@ const state = {
|
||||
blockHash:
|
||||
'0x30bf5dfa12e460a5d121267c00ba3047a14ba286e0c4fe75fa979010f527cba0',
|
||||
blockNumber: '9c2688',
|
||||
data:
|
||||
'0x000000000000000000000000000000000000000000000000001ff973cafa8000',
|
||||
data: '0x000000000000000000000000000000000000000000000000001ff973cafa8000',
|
||||
logIndex: '247',
|
||||
removed: false,
|
||||
topics: [
|
||||
@ -941,8 +936,7 @@ const state = {
|
||||
submittedTime: 1629582711337,
|
||||
time: 1629582710520,
|
||||
txParams: {
|
||||
data:
|
||||
'0xa9059cbb0000000000000000000000004ef2d5a1d056e7c9e8bcdbf2bd9ac0df749a1c2900000000000000000000000000000000000000000000000029a2241af62c0000',
|
||||
data: '0xa9059cbb0000000000000000000000004ef2d5a1d056e7c9e8bcdbf2bd9ac0df749a1c2900000000000000000000000000000000000000000000000029a2241af62c0000',
|
||||
from: '0x17f62b1b2407c41c43e14da0699d6b4b0a521548',
|
||||
gas: '0x2eb27',
|
||||
gasPrice: '0x12a05f200',
|
||||
@ -980,8 +974,7 @@ const state = {
|
||||
red: null,
|
||||
words: [10233480, null],
|
||||
},
|
||||
data:
|
||||
'0x00000000000000000000000000000000000000000000000028426c213d688000',
|
||||
data: '0x00000000000000000000000000000000000000000000000028426c213d688000',
|
||||
logIndex: {
|
||||
length: 1,
|
||||
negative: 0,
|
||||
@ -1013,8 +1006,7 @@ const state = {
|
||||
red: null,
|
||||
words: [10233480, null],
|
||||
},
|
||||
data:
|
||||
'0x000000000000000000000000000000000000000000000000006a94d74f430000',
|
||||
data: '0x000000000000000000000000000000000000000000000000006a94d74f430000',
|
||||
logIndex: {
|
||||
length: 1,
|
||||
negative: 0,
|
||||
@ -1046,8 +1038,7 @@ const state = {
|
||||
red: null,
|
||||
words: [10233480, null],
|
||||
},
|
||||
data:
|
||||
'0x000000000000000000000000000000000000000000000000001ff973cafa8000',
|
||||
data: '0x000000000000000000000000000000000000000000000000001ff973cafa8000',
|
||||
logIndex: {
|
||||
length: 1,
|
||||
negative: 0,
|
||||
@ -1125,14 +1116,14 @@ const state = {
|
||||
unapprovedTypedMessages: {},
|
||||
unapprovedTypedMessagesCount: 0,
|
||||
keyringTypes: [
|
||||
'Simple Key Pair',
|
||||
'HD Key Tree',
|
||||
'Trezor Hardware',
|
||||
'Ledger Hardware',
|
||||
KEYRING_TYPES.IMPORTED,
|
||||
KEYRING_TYPES.HD_KEY_TREE,
|
||||
KEYRING_TYPES.TREZOR,
|
||||
KEYRING_TYPES.LEDGER,
|
||||
],
|
||||
keyrings: [
|
||||
{
|
||||
type: 'HD Key Tree',
|
||||
type: KEYRING_TYPES.HD_KEY_TREE,
|
||||
accounts: [
|
||||
'0x64a845a5b02460acf8a3d84503b0d68d028b4bb4',
|
||||
'0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e',
|
||||
@ -1224,8 +1215,7 @@ const state = {
|
||||
to: '0x045c619e4d29bba3b92769508831b681b83d6a96',
|
||||
value: '0xbca9bce4d98ca3',
|
||||
},
|
||||
hash:
|
||||
'0x2de9256a7c604586f7ecfd87ae9509851e217f588f9f85feed793c54ed2ce0aa',
|
||||
hash: '0x2de9256a7c604586f7ecfd87ae9509851e217f588f9f85feed793c54ed2ce0aa',
|
||||
transactionCategory: 'incoming',
|
||||
},
|
||||
'0x320a1fd769373578f78570e5d8f56e89bc7bce9657bb5f4c12d8fe790d471bfd': {
|
||||
@ -1242,8 +1232,7 @@ const state = {
|
||||
to: '0x045c619e4d29bba3b92769508831b681b83d6a96',
|
||||
value: '0xcdb08ab4254000',
|
||||
},
|
||||
hash:
|
||||
'0x320a1fd769373578f78570e5d8f56e89bc7bce9657bb5f4c12d8fe790d471bfd',
|
||||
hash: '0x320a1fd769373578f78570e5d8f56e89bc7bce9657bb5f4c12d8fe790d471bfd',
|
||||
transactionCategory: 'incoming',
|
||||
},
|
||||
'0x8add6c1ea089a8de9b15fa2056b1875360f17916755c88ace9e5092b7a4b1239': {
|
||||
@ -1260,8 +1249,7 @@ const state = {
|
||||
to: '0x045c619e4d29bba3b92769508831b681b83d6a96',
|
||||
value: '0xe6ed27d6668000',
|
||||
},
|
||||
hash:
|
||||
'0x8add6c1ea089a8de9b15fa2056b1875360f17916755c88ace9e5092b7a4b1239',
|
||||
hash: '0x8add6c1ea089a8de9b15fa2056b1875360f17916755c88ace9e5092b7a4b1239',
|
||||
transactionCategory: 'incoming',
|
||||
},
|
||||
'0x50be62ab1cabd03ff104c602c11fdef7a50f3d73c55006d5583ba97950ab1144': {
|
||||
@ -1278,8 +1266,7 @@ const state = {
|
||||
to: '0x045c619e4d29bba3b92769508831b681b83d6a96',
|
||||
value: '0x63eb89da4ed00000',
|
||||
},
|
||||
hash:
|
||||
'0x50be62ab1cabd03ff104c602c11fdef7a50f3d73c55006d5583ba97950ab1144',
|
||||
hash: '0x50be62ab1cabd03ff104c602c11fdef7a50f3d73c55006d5583ba97950ab1144',
|
||||
transactionCategory: 'incoming',
|
||||
},
|
||||
},
|
||||
@ -1512,8 +1499,7 @@ const state = {
|
||||
from: '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4',
|
||||
to: '0xaD6D458402F60fD3Bd25163575031ACDce07538D',
|
||||
value: '0x0',
|
||||
data:
|
||||
'0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170',
|
||||
data: '0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170',
|
||||
gas: '0xea60',
|
||||
gasPrice: '0x4a817c800',
|
||||
},
|
||||
@ -1532,8 +1518,7 @@ const state = {
|
||||
from: '0x983211ce699ea5ab57cc528086154b6db1ad8e55',
|
||||
to: '0xaD6D458402F60fD3Bd25163575031ACDce07538D',
|
||||
value: '0x0',
|
||||
data:
|
||||
'0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170',
|
||||
data: '0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170',
|
||||
gas: '0xea60',
|
||||
gasPrice: '0x4a817c800',
|
||||
},
|
||||
|
3
app/_locales/am/messages.json
generated
3
app/_locales/am/messages.json
generated
@ -810,9 +810,6 @@
|
||||
"sign": {
|
||||
"message": "ፈርም"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "ይህን መልዕክት መፈረም አደገኛ ውጤቶች \nሊኖሩት ይችላሉ። በሙሉ መለያዎ ሙሉ በሙሉ ከሚያምኗቸው\nድረ ገጾች የሚመጡ መልዕክቶችን ብቻ ይፈርሙ።\nይህ አደገኛ ዘዴ ከወደፊት ስሪት ይወገዳል።"
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "የፊርማ ጥያቄ"
|
||||
},
|
||||
|
3
app/_locales/ar/messages.json
generated
3
app/_locales/ar/messages.json
generated
@ -826,9 +826,6 @@
|
||||
"sign": {
|
||||
"message": "توقيع"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "توقيع هذه الرسالة يمكن أن يكون له\nآثار جانبية خطيرة. قم فقط بتوقيع الرسائل من\nالمواقع التي تثق بها تماماً في التعامل مع حسابك بالكامل.\n ستتم إزالة هذه الطريقة الخطيرة في إصدار مستقبلي."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "طلب التوقيع"
|
||||
},
|
||||
|
3
app/_locales/bg/messages.json
generated
3
app/_locales/bg/messages.json
generated
@ -821,9 +821,6 @@
|
||||
"sign": {
|
||||
"message": "Подпис"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Подписването на това съобщение може да има\nопасни странични ефекти. Подписвайте само съобщения от\nсайтове, на които имате пълно доверие с целия си акаунт.\nТози опасен метод ще бъде премахнат в бъдеща версия."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Заявка за подпис"
|
||||
},
|
||||
|
3
app/_locales/bn/messages.json
generated
3
app/_locales/bn/messages.json
generated
@ -825,9 +825,6 @@
|
||||
"sign": {
|
||||
"message": "স্বাক্ষর করুন"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "এই বার্তাটিতে সাইন আইন করার \nবিপজ্জনক পার্শ্ব প্রতিক্রিয়া থাকতে পারে। আপনি সম্পূর্ণ বিশ্বাস করেন শুধুমাত্র সেই \nসাইটের থেকে আসা বার্তাগুলিতেই আপনার সামগ্রিক অ্যাকাউন্টের মাধ্যমে সাইন করুন।\n এই বিপজ্জনক পদ্ধতিটি পরবর্তী সংস্করণে অপসারণ করা হবে। "
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "স্বাক্ষরের অনুরোধ"
|
||||
},
|
||||
|
3
app/_locales/ca/messages.json
generated
3
app/_locales/ca/messages.json
generated
@ -803,9 +803,6 @@
|
||||
"sign": {
|
||||
"message": "Signar"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Signar aquest missatge pot tenir efectes secundaris perillosos. Signa només els missatges de llocs en els quals confiïs plenament amb la totalitat del teu compte. Aquest mètode perillós serà retirat en versions posteriors."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Sol·licitud de Signatura"
|
||||
},
|
||||
|
3
app/_locales/cs/messages.json
generated
3
app/_locales/cs/messages.json
generated
@ -334,9 +334,6 @@
|
||||
"sign": {
|
||||
"message": "Podepsat"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Podepsání zprávy může mít \nnebezpečný vedlejší učinek. Podepisujte zprávy pouze ze \nstránek, kterým plně důvěřujete celým svým účtem.\n Tato nebezpečná metoda bude odebrána v budoucí verzi. "
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Požadavek podpisu"
|
||||
},
|
||||
|
3
app/_locales/da/messages.json
generated
3
app/_locales/da/messages.json
generated
@ -803,9 +803,6 @@
|
||||
"sign": {
|
||||
"message": "Underskriv"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Underskrivning af denne besked kan have farlige sideeffekter. Skriv kun under på beskeder fra sider, du har fuld tillid til med hele din konto.\nDenne farlige metode bliver fjernet i en fremtidig version."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Signaturforespørgsel"
|
||||
},
|
||||
|
15
app/_locales/de/messages.json
generated
15
app/_locales/de/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "Bestätigen"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "Sie gewähren den Zugriff auf $1, auch auf solche, die Sie in Zukunft besitzen könnten. Die Gegenseite kann jederzeit NFTs aus Ihrer Brieftasche übertragen, ohne Sie zu fragen, bis Sie diese Genehmigung widerrufen. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "alle NFTs in diesem Contract"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "Seien Sie vorsichtig."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "Passwort bestätigen"
|
||||
},
|
||||
@ -1853,7 +1843,7 @@
|
||||
"message": "Richtungspfeil"
|
||||
},
|
||||
"lightTheme": {
|
||||
"message": "Leicht"
|
||||
"message": "Hell"
|
||||
},
|
||||
"likeToImportTokens": {
|
||||
"message": "Möchtest du diese Token hinzufügen?"
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "Unterschreiben"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Das Unterschreiben dieser Nachricht kann gefährliche Nebeneffekte haben. Bitte nur Nachrichten von Webseiten unterschreiben denen du deinen vollständigen Account anvertrauen würdest. Diese gefährliche Variante wird in zukünftigen Versionen entfernt werden."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Unterschriftsanfrage"
|
||||
},
|
||||
|
13
app/_locales/el/messages.json
generated
13
app/_locales/el/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "Επιβεβαίωση"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "Παραχωρείτε πρόσβαση στον $1, συμπεριλαμβανομένου οτιδήποτε ενδέχεται να αποκτήσετε στο μέλλον. Ο συμβαλλόμενος στην άλλη πλευρά μπορεί να μεταφέρει NFT από το πορτοφόλι σας ανά πάσα στιγμή χωρίς να σας ρωτήσει, μέχρι να ανακαλέσετε αυτή την έγκριση. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "όλα τα NFT αυτού του συμβαλλόμενου"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "Προχωρήστε με προσοχή."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "Επιβεβαίωση Κωδικού Πρόσβασης"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "Υπογραφή"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Η υπογραφή αυτού του μηνύματος μπορεί να έχει\nεπικίνδυνες παρενέργειες. Υπογράφετε μηνύματα μόνο από\nτοποθεσίες που εμπιστεύεστε πλήρως με ολόκληρο τον λογαριασμό σας.\n Αυτή η επικίνδυνη μέθοδος θα καταργηθεί σε μια μελλοντική έκδοση."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Αίτημα Υπογραφής"
|
||||
},
|
||||
|
164
app/_locales/en/messages.json
generated
164
app/_locales/en/messages.json
generated
@ -207,6 +207,28 @@
|
||||
"addEthereumChainConfirmationTitle": {
|
||||
"message": "Allow this site to add a network?"
|
||||
},
|
||||
"addEthereumChainWarningModalHeader": {
|
||||
"message": "Only add this RPC provider if you’re sure you can trust it. $1",
|
||||
"description": "$1 is addEthereumChainWarningModalHeaderPartTwo passed separately so that it can be bolded"
|
||||
},
|
||||
"addEthereumChainWarningModalHeaderPartTwo": {
|
||||
"message": "Malicious providers may lie about the state of the blockchain and record your network activity."
|
||||
},
|
||||
"addEthereumChainWarningModalListHeader": {
|
||||
"message": "It's important that your provider is reliable, as it has the power to:"
|
||||
},
|
||||
"addEthereumChainWarningModalListPointOne": {
|
||||
"message": "See your accounts and IP address, and associate them together"
|
||||
},
|
||||
"addEthereumChainWarningModalListPointThree": {
|
||||
"message": "Show account balances and other on-chain states"
|
||||
},
|
||||
"addEthereumChainWarningModalListPointTwo": {
|
||||
"message": "Broadcast your transactions"
|
||||
},
|
||||
"addEthereumChainWarningModalTitle": {
|
||||
"message": "You are adding a new RPC provider for Ethereum Mainnet"
|
||||
},
|
||||
"addFriendsAndAddresses": {
|
||||
"message": "Add friends and addresses you trust"
|
||||
},
|
||||
@ -343,6 +365,13 @@
|
||||
"message": "Approve $1 spend limit",
|
||||
"description": "The token symbol that is being approved"
|
||||
},
|
||||
"approveTokenDescription": {
|
||||
"message": "This allows a third party to access and transfer the following NFTs without further notice until you revoke its access."
|
||||
},
|
||||
"approveTokenTitle": {
|
||||
"message": "Allow access to and transfer of your $1?",
|
||||
"description": "$1 is the symbol of the token for which the user is granting approval"
|
||||
},
|
||||
"approved": {
|
||||
"message": "Approved"
|
||||
},
|
||||
@ -438,21 +467,31 @@
|
||||
"message": "Beta"
|
||||
},
|
||||
"betaHeaderText": {
|
||||
"message": "This is a BETA version. Please report bugs $1",
|
||||
"message": "This is a beta version. Please report bugs $1",
|
||||
"description": "$1 represents the word 'here' in a hyperlink"
|
||||
},
|
||||
"betaMetamaskDescription": {
|
||||
"message": "Trusted by millions, MetaMask is a secure wallet making the world of web3 accessible to all."
|
||||
},
|
||||
"betaMetamaskDescriptionDisclaimerHeading": {
|
||||
"message": "Beta version disclaimer"
|
||||
},
|
||||
"betaMetamaskDescriptionExplanation": {
|
||||
"message": "Use this version to test upcoming features before they’re released. Your use and feedback helps us build the best version of MetaMask possible. Your use of MetaMask Beta is subject to our standard $1 as well as our $2. As a Beta, there may be an increased risk of bugs. By proceeding, you accept and acknowledge these risks, as well as those risks found in our Terms and Beta Terms.",
|
||||
"message": "This version allows you to test upcoming features before they’re released, which helps make MetaMask even better. As with all beta versions, there may be an increased risk of bugs. MetaMask Beta is subject to our $1 as well as our $2.",
|
||||
"description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText"
|
||||
},
|
||||
"betaMetamaskDescriptionExplanation2": {
|
||||
"message": "By proceeding, you accept and acknowledge these risks, our $1, and $2.",
|
||||
"description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanation2BetaTermsLinkText"
|
||||
},
|
||||
"betaMetamaskDescriptionExplanation2BetaTermsLinkText": {
|
||||
"message": "Beta Terms"
|
||||
},
|
||||
"betaMetamaskDescriptionExplanationBetaTermsLinkText": {
|
||||
"message": "Supplemental Beta Terms"
|
||||
"message": "supplemental Beta Terms"
|
||||
},
|
||||
"betaMetamaskDescriptionExplanationTermsLinkText": {
|
||||
"message": "Terms"
|
||||
"message": "standard Terms"
|
||||
},
|
||||
"betaMetamaskVersion": {
|
||||
"message": "MetaMask Beta Version"
|
||||
@ -461,13 +500,13 @@
|
||||
"message": "beta portfolio site"
|
||||
},
|
||||
"betaTerms": {
|
||||
"message": "BETA Terms of use"
|
||||
"message": "Beta Terms of use"
|
||||
},
|
||||
"betaWalletCreationSuccessReminder1": {
|
||||
"message": "MetaMask BETA can’t recover your Secret Recovery Phrase."
|
||||
"message": "MetaMask Beta can’t recover your Secret Recovery Phrase."
|
||||
},
|
||||
"betaWalletCreationSuccessReminder2": {
|
||||
"message": "MetaMask BETA will never ask you for your Secret Recovery Phrase."
|
||||
"message": "MetaMask Beta will never ask you for your Secret Recovery Phrase."
|
||||
},
|
||||
"betaWelcome": {
|
||||
"message": "Welcome to MetaMask Beta"
|
||||
@ -626,16 +665,6 @@
|
||||
"confirm": {
|
||||
"message": "Confirm"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "You're granting access to $1, including any you might own in the future. The party on the other end can transfer NFTs from your wallet at any time without asking you until you revoke this approval. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "all the NFTs on this contract"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "Proceed with caution."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "Confirm password"
|
||||
},
|
||||
@ -741,6 +770,10 @@
|
||||
"contacts": {
|
||||
"message": "Contacts"
|
||||
},
|
||||
"contentFromSnap": {
|
||||
"message": "Content from $1",
|
||||
"description": "$1 represents the name of the snap"
|
||||
},
|
||||
"continue": {
|
||||
"message": "Continue"
|
||||
},
|
||||
@ -774,6 +807,15 @@
|
||||
"contractInteraction": {
|
||||
"message": "Contract interaction"
|
||||
},
|
||||
"contractNFT": {
|
||||
"message": "NFT contract"
|
||||
},
|
||||
"contractRequestingAccess": {
|
||||
"message": "Contract requesting access"
|
||||
},
|
||||
"contractRequestingSignature": {
|
||||
"message": "Contract requesting signature"
|
||||
},
|
||||
"contractRequestingSpendingCap": {
|
||||
"message": "Contract requesting spending cap"
|
||||
},
|
||||
@ -959,6 +1001,9 @@
|
||||
"deleteNetworkDescription": {
|
||||
"message": "Are you sure you want to delete this network?"
|
||||
},
|
||||
"deposit": {
|
||||
"message": "Deposit"
|
||||
},
|
||||
"depositCrypto": {
|
||||
"message": "Deposit $1",
|
||||
"description": "$1 represents the crypto symbol to be purchased"
|
||||
@ -1737,6 +1782,10 @@
|
||||
"message": "You do not have enough $1 in your account to pay for transaction fees on $2 network. $3 or deposit from another account.",
|
||||
"description": "$1 is the native currency of the network, $2 is the name of the current network, $3 is the key 'buy' + the ticker symbol of the native currency of the chain wrapped in a button"
|
||||
},
|
||||
"insufficientCurrencyBuyOrReceive": {
|
||||
"message": "You do not have enough $1 in your account to pay for transaction fees on $2 network. $3 or $4 from another account.",
|
||||
"description": "$1 is the native currency of the network, $2 is the name of the current network, $3 is the key 'buy' + the ticker symbol of the native currency of the chain wrapped in a button, $4 is the key 'deposit' button"
|
||||
},
|
||||
"insufficientCurrencyDeposit": {
|
||||
"message": "You do not have enough $1 in your account to pay for transaction fees on $2 network. Deposit $1 from another account.",
|
||||
"description": "$1 is the native currency of the network, $2 is the name of the current network"
|
||||
@ -2275,6 +2324,17 @@
|
||||
"nftTokenIdPlaceholder": {
|
||||
"message": "Enter the token id"
|
||||
},
|
||||
"nftWarningContent": {
|
||||
"message": "You're granting access to $1, including any you might own in the future. The party on the other end can transfer these NFTs from your wallet at any time without asking you until you revoke this approval. $2",
|
||||
"description": "$1 is nftWarningContentBold bold part, $2 is Learn more link"
|
||||
},
|
||||
"nftWarningContentBold": {
|
||||
"message": "all your $1 NFTs",
|
||||
"description": "$1 is name of the collection"
|
||||
},
|
||||
"nftWarningContentGrey": {
|
||||
"message": "Proceed with caution."
|
||||
},
|
||||
"nfts": {
|
||||
"message": "NFTs"
|
||||
},
|
||||
@ -2408,6 +2468,15 @@
|
||||
"notifications16Title": {
|
||||
"message": "Improved token allowance experience"
|
||||
},
|
||||
"notifications17ActionText": {
|
||||
"message": "Show Security & Privacy settings"
|
||||
},
|
||||
"notifications17Description": {
|
||||
"message": "This update provides more options so you can better control your own privacy. We've added more transparency about how data is collected and clearer options for sharing it. Change your preferences or delete extension usage data via Security & Privacy settings."
|
||||
},
|
||||
"notifications17Title": {
|
||||
"message": "Security & Privacy Settings"
|
||||
},
|
||||
"notifications1Description": {
|
||||
"message": "MetaMask Mobile users can now swap tokens inside their mobile wallet. Scan the QR code to get the mobile app and start swapping.",
|
||||
"description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature."
|
||||
@ -2614,6 +2683,10 @@
|
||||
"osTheme": {
|
||||
"message": "System"
|
||||
},
|
||||
"otherSnaps": {
|
||||
"message": "other snaps",
|
||||
"description": "Used in the 'permission_rpc' message."
|
||||
},
|
||||
"padlock": {
|
||||
"message": "Padlock"
|
||||
},
|
||||
@ -2693,10 +2766,22 @@
|
||||
"message": "Display a confirmation in MetaMask.",
|
||||
"description": "The description for the `snap_confirm` permission"
|
||||
},
|
||||
"permission_dialog": {
|
||||
"message": "Display dialog windows in MetaMask.",
|
||||
"description": "The description for the `snap_dialog` permission"
|
||||
},
|
||||
"permission_ethereumAccounts": {
|
||||
"message": "See address, account balance, activity and suggest transactions to approve",
|
||||
"description": "The description for the `eth_accounts` permission"
|
||||
},
|
||||
"permission_ethereumProvider": {
|
||||
"message": "Access the Ethereum provider.",
|
||||
"description": "The description for the `endowment:ethereum-provider` permission"
|
||||
},
|
||||
"permission_getEntropy": {
|
||||
"message": "Derive arbitrary keys unique to this snap.",
|
||||
"description": "The description for the `snap_getEntropy` permission"
|
||||
},
|
||||
"permission_longRunning": {
|
||||
"message": "Run indefinitely.",
|
||||
"description": "The description for the `endowment:long-running` permission"
|
||||
@ -2717,10 +2802,18 @@
|
||||
"message": "Show notifications.",
|
||||
"description": "The description for the `snap_notify` permission"
|
||||
},
|
||||
"permission_rpc": {
|
||||
"message": "Allow $1 to communicate directly with this snap.",
|
||||
"description": "The description for the `endowment:rpc` permission. $1 is 'other snaps' or 'websites'."
|
||||
},
|
||||
"permission_transactionInsight": {
|
||||
"message": "Fetch and display transaction insights.",
|
||||
"description": "The description for the `endowment:transaction-insight` permission"
|
||||
},
|
||||
"permission_transactionInsightOrigin": {
|
||||
"message": "See the origins of websites that suggest transactions",
|
||||
"description": "The description for the `transactionOrigin` caveat, to be used with the `endowment:transaction-insight` permission"
|
||||
},
|
||||
"permission_unknown": {
|
||||
"message": "Unknown permission: $1",
|
||||
"description": "$1 is the name of a requested permission that is not recognized."
|
||||
@ -2855,6 +2948,12 @@
|
||||
"rejectAll": {
|
||||
"message": "Reject all"
|
||||
},
|
||||
"rejectRequestsDescription": {
|
||||
"message": "You are about to batch reject $1 requests."
|
||||
},
|
||||
"rejectRequestsN": {
|
||||
"message": "Reject $1 requests"
|
||||
},
|
||||
"rejectTxsDescription": {
|
||||
"message": "You are about to batch reject $1 transactions."
|
||||
},
|
||||
@ -3228,15 +3327,18 @@
|
||||
"sign": {
|
||||
"message": "Sign"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Signing this message can be dangerous. This signature could potentially perform any operation on your account's behalf, including granting complete control of your account and all of its assets to the requesting site. Only sign this message if you know what you're doing or completely trust the requesting site."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Signature request"
|
||||
},
|
||||
"signatureRequest1": {
|
||||
"message": "Message"
|
||||
},
|
||||
"signatureRequestGuidance": {
|
||||
"message": "Only sign this message if you fully understand the content and trust the requesting site."
|
||||
},
|
||||
"signatureRequestWarning": {
|
||||
"message": "Signing this message could be dangerous. You may be giving total control of your account and assets to the party on the other end of this message. That means they could drain your account at any time. Proceed with caution. $1."
|
||||
},
|
||||
"signed": {
|
||||
"message": "Signed"
|
||||
},
|
||||
@ -4126,6 +4228,12 @@
|
||||
"transactionResubmitted": {
|
||||
"message": "Transaction resubmitted with estimated gas fee increased to $1 at $2"
|
||||
},
|
||||
"transactionSecurityCheck": {
|
||||
"message": "Transaction security check"
|
||||
},
|
||||
"transactionSecurityCheckDescription": {
|
||||
"message": "Turn this on to enable a third party (OpenSea) to review all your transactions and signature requests and warn you about known malicious requests."
|
||||
},
|
||||
"transactionSubmitted": {
|
||||
"message": "Transaction submitted with estimated gas fee of $1 at $2."
|
||||
},
|
||||
@ -4252,6 +4360,12 @@
|
||||
"useDefault": {
|
||||
"message": "Use default"
|
||||
},
|
||||
"useMultiAccountBalanceChecker": {
|
||||
"message": "Batch account balance requests"
|
||||
},
|
||||
"useMultiAccountBalanceCheckerDescription": {
|
||||
"message": "We batch accounts and query Infura to responsively show your balances. If you turn this off, only active accounts will be queried. Some dapps won't work unless you connect your wallet."
|
||||
},
|
||||
"usePhishingDetection": {
|
||||
"message": "Use phishing detection"
|
||||
},
|
||||
@ -4368,6 +4482,10 @@
|
||||
"message": "WebHID",
|
||||
"description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API"
|
||||
},
|
||||
"websites": {
|
||||
"message": "websites",
|
||||
"description": "Used in the 'permission_rpc' message."
|
||||
},
|
||||
"welcome": {
|
||||
"message": "Welcome to MetaMask"
|
||||
},
|
||||
@ -4426,6 +4544,12 @@
|
||||
"youSign": {
|
||||
"message": "You are signing"
|
||||
},
|
||||
"yourFundsMayBeAtRisk": {
|
||||
"message": "Your funds may be at risk"
|
||||
},
|
||||
"yourNFTmayBeAtRisk": {
|
||||
"message": "Your NFT may be at risk"
|
||||
},
|
||||
"yourPrivateSeedPhrase": {
|
||||
"message": "Your private Secret Recovery Phrase"
|
||||
},
|
||||
|
15
app/_locales/es/messages.json
generated
15
app/_locales/es/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "Confirmar"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "Está otorgando acceso a $1, incluidos los que pueda poseer en el futuro. La contraparte puede transferir los NFT de su billetera en cualquier momento sin preguntarle hasta que revoque esta aprobación. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "todos los NFT en este contrato"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "Proceda con precaución."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "Confirmar contraseña"
|
||||
},
|
||||
@ -2616,7 +2606,7 @@
|
||||
"description": "The description for the `snap_confirm` permission"
|
||||
},
|
||||
"permission_ethereumAccounts": {
|
||||
"message": "Ver las direcciones de las cuentas permitidas (requerido)",
|
||||
"message": "Ver las direcciones, saldos, actividad de las cuentas permitidas y sugerir transacciones para aprobar (requerido)",
|
||||
"description": "The description for the `eth_accounts` permission"
|
||||
},
|
||||
"permission_longRunning": {
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "Firmar"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Firmar este mensaje puede tener \nefectos secundarios peligrosos. Firme solo los mensajes de \nsitios en los que confía totalmente con toda su cuenta.\n Este método peligroso se quitará en una versión futura. "
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Solicitud de firma"
|
||||
},
|
||||
|
3
app/_locales/es_419/messages.json
generated
3
app/_locales/es_419/messages.json
generated
@ -2418,9 +2418,6 @@
|
||||
"sign": {
|
||||
"message": "Firmar"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Firmar este mensaje puede ser peligroso. Esta firma podría realizar potencialmente cualquier operación en nombre de su cuenta, incluida la concesión del control total de tu cuenta y de todos sus activos al sitio solicitante. Solo firme este mensaje si sabe lo que está haciendo o confía plenamente en el sitio solicitante."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Solicitud de firma"
|
||||
},
|
||||
|
3
app/_locales/et/messages.json
generated
3
app/_locales/et/messages.json
generated
@ -815,9 +815,6 @@
|
||||
"sign": {
|
||||
"message": "Allkirjasta"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Selle sõnumi allkirjastamisel \nvõib olla ohtlikke kõrvaltoimeid. Allkirjastage sõnumeid vaid \nsaitidelt, mida te kogu kontoga usaldate.\n See ohtlik meetod eemaldatakse uues versioonis."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Allkirja taotlus"
|
||||
},
|
||||
|
3
app/_locales/fa/messages.json
generated
3
app/_locales/fa/messages.json
generated
@ -825,9 +825,6 @@
|
||||
"sign": {
|
||||
"message": "علامت"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "علامت کردن این پیام میتواند\nعوارض جانبی داشته باشد. تنها پیام های را که\nاز سایت های که کاملًا اعتماد داشته باشید با حساب خود علامت بزنید.\nاین روش خطرناک در نسخه آینده از بین برده خواهد شد."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "درخواست امضاء"
|
||||
},
|
||||
|
3
app/_locales/fi/messages.json
generated
3
app/_locales/fi/messages.json
generated
@ -822,9 +822,6 @@
|
||||
"sign": {
|
||||
"message": "Allekirjoita"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Tämän viestin allekirjoittamisella voi olla\nvaarallisia sivuvaikutuksia. Allekirjoita viestejä ainoastaan\nsivustoilta, joihin luotat täysin koko tililläsi.\n Tällainen vaarallinen menetelmä poistetaan tulevista versioista."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Allekirjoitus pyydetään"
|
||||
},
|
||||
|
3
app/_locales/fil/messages.json
generated
3
app/_locales/fil/messages.json
generated
@ -749,9 +749,6 @@
|
||||
"sign": {
|
||||
"message": "I-sign"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Kapag na-sign ang mensaheng ito, maaaring magkaroon \nng mapapanganib na side effect. Mag-sign lang ng mga mensaheng mula \nsa mga site na ganap mong pinagkakatiwalaang gumamit sa iyong account.\n Isa itong mapanganib na method na aalisin sa isang bersyon sa hinaharap. "
|
||||
},
|
||||
"signed": {
|
||||
"message": "Na-sign"
|
||||
},
|
||||
|
13
app/_locales/fr/messages.json
generated
13
app/_locales/fr/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "Confirmer"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "Vous accordez l’accès à $1, y compris à ceux que vous pourriez posséder dans le futur. L’autre partie pourra transférer des NFT de votre portefeuille à tout moment sans demander votre consentement jusqu’à ce que vous révoquiez cette approbation. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "tous les NFT inclus dans ce contrat"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "Soyez prudent."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "Confirmer le mot de passe"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "Signer"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "La signature de ce message peut avoir des effets secondaires dangereux, interférant en votre nom via le contrôle de votre compte et de ses actifs par le site demandeur. Signez uniquement les messages de sites auxquels vous faites entièrement confiance."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Demande de Signature"
|
||||
},
|
||||
|
3
app/_locales/he/messages.json
generated
3
app/_locales/he/messages.json
generated
@ -822,9 +822,6 @@
|
||||
"sign": {
|
||||
"message": "חתימה"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "לחתימה על הודעה זו יכולות להיות תוצאות לוואי מסוכנות. מומלץ לחתום רק הודעות מאתרים שיש לך אמון מלא בהם והפקדת את כל החשבון שלך בידיהם. השיטה המסוכנת תוסר בגרסה עתידית."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "בקשת חתימה"
|
||||
},
|
||||
|
13
app/_locales/hi/messages.json
generated
13
app/_locales/hi/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "पुष्टि करें"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "आप $1 तक ऐक्सेस प्रदान कर रहे हैं, इसमें वह भी शामिल है जिसे आप भविष्य में प्राप्त कर सकते हैं। दूसरी ओर की पार्टी आपसे पूछे बिना किसी भी समय आपके वॉलेट से NFTs ट्रान्स्फर कर सकती है, जब तक आप इस स्वीकृति को रद्द नहीं करते। $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "इस अनुबंध में सभी NFTs"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "सावधानी के साथ आगे बढ़ें।"
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "पासवर्ड की पुष्टि करें"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "हस्ताक्षर करें"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "इस संदेश पर हस्ताक्षर करना खतरनाक हो सकता है। यह हस्ताक्षर संभावित रूप से आपके खाते की ओर से कोई भी संचालन कर सकता है, जिसमें अनुरोध करने वाली साइट को आपके खाते और उसकी सभी संपत्तियों पर पूर्ण नियंत्रण प्रदान करना शामिल है। इस संदेश पर केवल तभी हस्ताक्षर करें जब आप जानते हों कि आप क्या कर रहे हैं या अनुरोध करने वाली साइट पर पूरा भरोसा है"
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "हस्ताक्षर का अनुरोध"
|
||||
},
|
||||
|
3
app/_locales/hn/messages.json
generated
3
app/_locales/hn/messages.json
generated
@ -308,9 +308,6 @@
|
||||
"sign": {
|
||||
"message": "हस्ताक्षर"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "इस संदेश पर हस्ताक्षर करने से \n साइड इफेक्ट हो सकते हैं। \n केवल अपने पूरे खाते के साथ पूरी तरह से भरोसेमंद \n साइटों से संदेश पर हस्ताक्षर करें। \n यह खतरनाक विधि भविष्य के संस्करण में निकाल दी जाएगी।"
|
||||
},
|
||||
"stateLogs": {
|
||||
"message": "स्थिति संदेश"
|
||||
},
|
||||
|
3
app/_locales/hr/messages.json
generated
3
app/_locales/hr/messages.json
generated
@ -818,9 +818,6 @@
|
||||
"sign": {
|
||||
"message": "Potpis"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Potpisivanje ove poruke može\nimati opasne neželjene učinke. Samo potpisujte poruke\ns mrežnih mjesta u koja imate potpuno povjerenje kada je riječ o vašem cijelom računu.\nOvaj se opasni način uklanja u sljedećoj inačici."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Zahtjev za potpisom"
|
||||
},
|
||||
|
3
app/_locales/ht/messages.json
generated
3
app/_locales/ht/messages.json
generated
@ -536,9 +536,6 @@
|
||||
"sign": {
|
||||
"message": "Siyen"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Lè w siyen mesaj sa a ka gen efè segondè ki \ndanjere. Sèlman \nsit mesaj ki soti nan sit ou konplètman fè konfyans ak tout kont ou. \n Metòd danjere sa yo pral retire nan yon vèsyon fiti. "
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Siyati Mande"
|
||||
},
|
||||
|
3
app/_locales/hu/messages.json
generated
3
app/_locales/hu/messages.json
generated
@ -818,9 +818,6 @@
|
||||
"sign": {
|
||||
"message": "Aláír"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Az üzenet aláírása veszélyes következményekkel járhat. Csak olyan webhely üzenetét írja alá, amelyben teljes mértékben és a teljes fiókjával megbízik. Ezt a veszélyes módszert egy későbbi verzióból eltávolítjuk."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Aláírási kérelem"
|
||||
},
|
||||
|
13
app/_locales/id/messages.json
generated
13
app/_locales/id/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "Konfirmasikan"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "Anda memberikan akses ke $1, termasuk setiap akses yang Anda miliki di masa mendatang. Pihak lain dapat mentransfer NFT dari dompet Anda kapan saja tanpa meminta izin Anda sampai Anda membatalkan persetujuan ini. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "semua NFT dalam kontrak ini"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "Lanjutkan dengan hati-hati."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "Konfirmasikan kata sandi"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "Tanda tangan"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Menandatangani pesan ini bisa berakibat fatal. Tanda tangan ini berpotensi melakukan operasi atas nama akun Anda, termasuk memberikan kendali penuh atas akun Anda dan semua asetnya ke situs yang meminta tindakan ini. Hanya tanda tangani pesan ini jika Anda tahu apa yang Anda lakukan atau sepenuhnya memercayai situs yang meminta."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Permintaan tanda tangan"
|
||||
},
|
||||
|
559
app/_locales/it/messages.json
generated
559
app/_locales/it/messages.json
generated
@ -1,10 +1,90 @@
|
||||
{
|
||||
"QRHardwareInvalidTransactionTitle": {
|
||||
"message": "Errore"
|
||||
},
|
||||
"QRHardwareMismatchedSignId": {
|
||||
"message": "Dati incongruenti. Controlla i dati della transazione."
|
||||
},
|
||||
"QRHardwarePubkeyAccountOutOfRange": {
|
||||
"message": "Non ci sono altri account. Se desideri accedere a un altro account non elencato di seguito, ricollega il tuo portafoglio hardware e selezionalo."
|
||||
},
|
||||
"QRHardwareScanInstructions": {
|
||||
"message": "Posiziona il codice QR davanti alla tua fotocamera. Se lo schermo è sfocato non preoccuparti, non influirà sulla lettura."
|
||||
},
|
||||
"QRHardwareSignRequestCancel": {
|
||||
"message": "Annulla"
|
||||
},
|
||||
"QRHardwareSignRequestDescription": {
|
||||
"message": "Dopo aver firmato con il tuo portafoglio, fai click su 'Ottieni firma' per ricevere la firma"
|
||||
},
|
||||
"QRHardwareSignRequestGetSignature": {
|
||||
"message": "Ottieni firma"
|
||||
},
|
||||
"QRHardwareSignRequestSubtitle": {
|
||||
"message": "Scansiona il QR code con il tuo portafoglio"
|
||||
},
|
||||
"QRHardwareSignRequestTitle": {
|
||||
"message": "Richiedi firma"
|
||||
},
|
||||
"QRHardwareUnknownQRCodeTitle": {
|
||||
"message": "Errore"
|
||||
},
|
||||
"QRHardwareUnknownWalletQRCode": {
|
||||
"message": "Codice QR non valido. Scansiona il codice QR di sincronizzazione del portafoglio hardware."
|
||||
},
|
||||
"QRHardwareWalletImporterTitle": {
|
||||
"message": "Scansiona Codice QR"
|
||||
},
|
||||
"QRHardwareWalletSteps1Description": {
|
||||
"message": "Collega un portafoglio hardware air-gapped che comunica tramite codici QR. I portafogli hardware air-gapped supportati ufficialmente includono:"
|
||||
},
|
||||
"QRHardwareWalletSteps1Title": {
|
||||
"message": "Portafoglio HW basato su QR"
|
||||
},
|
||||
"QRHardwareWalletSteps2Description": {
|
||||
"message": "Ngrave (in arrivo)"
|
||||
},
|
||||
"SIWEAddressInvalid": {
|
||||
"message": "L'indirizzo nella richiesta di accesso non corrisponde all'indirizzo dell'account che stai utilizzando per accedere."
|
||||
},
|
||||
"SIWEDomainWarningBody": {
|
||||
"message": "Il sito Web ($1) ti chiede di accedere al dominio sbagliato. Potrebbe trattarsi di un attacco di phishing.",
|
||||
"description": "$1 represents the website domain"
|
||||
},
|
||||
"SIWELabelExpirationTime": {
|
||||
"message": "Scade il:"
|
||||
},
|
||||
"SIWELabelIssuedAt": {
|
||||
"message": "Rilasciato a:"
|
||||
},
|
||||
"SIWELabelMessage": {
|
||||
"message": "Messaggio:"
|
||||
},
|
||||
"SIWELabelNonce": {
|
||||
"message": "Nonce:"
|
||||
},
|
||||
"SIWELabelNotBefore": {
|
||||
"message": "Non prima:"
|
||||
},
|
||||
"SIWELabelResources": {
|
||||
"message": "Risorse: $1",
|
||||
"description": "$1 represents the number of resources"
|
||||
},
|
||||
"SIWELabelVersion": {
|
||||
"message": "Versione:"
|
||||
},
|
||||
"SIWESiteRequestSubtitle": {
|
||||
"message": "Questo sito richiede l'accesso con"
|
||||
},
|
||||
"SIWESiteRequestTitle": {
|
||||
"message": "Richiesta di accesso"
|
||||
},
|
||||
"SIWEWarningSubtitle": {
|
||||
"message": "Per confermare di aver compreso, controlla:"
|
||||
},
|
||||
"SIWEWarningTitle": {
|
||||
"message": "Sei sicuro?"
|
||||
},
|
||||
"about": {
|
||||
"message": "Informazioni"
|
||||
},
|
||||
@ -16,6 +96,17 @@
|
||||
"message": "$1 può avere accesso e spendere al massimo",
|
||||
"description": "$1 is the url of the site requesting ability to spend"
|
||||
},
|
||||
"accessAndSpendNoticeNFT": {
|
||||
"message": "$1 può accedere e spendere questa risorsa",
|
||||
"description": "$1 is the url of the site requesting ability to spend"
|
||||
},
|
||||
"accessYourWalletWithSRP": {
|
||||
"message": "Accedi al tuo portafoglio con la tua frase di recupero segreta"
|
||||
},
|
||||
"accessYourWalletWithSRPDescription": {
|
||||
"message": "MetaMask non può recuperare la tua password. Useremo la tua frase di recupero segreta per assicurarci tu sia il proprietario, ripristinare il tuo portafoglio e impostare una nuova password. Innanzitutto, inserisci la frase di recupero segreta che ti è stata data in fase di creazione del tuo portafoglio. $1",
|
||||
"description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link"
|
||||
},
|
||||
"accessingYourCamera": {
|
||||
"message": "Accesso alla fotocamera..."
|
||||
},
|
||||
@ -25,6 +116,10 @@
|
||||
"accountName": {
|
||||
"message": "Nome Account"
|
||||
},
|
||||
"accountNameDuplicate": {
|
||||
"message": "Questo nome è già in uso",
|
||||
"description": "This is an error message shown when the user enters a new account name that matches an existing account name"
|
||||
},
|
||||
"accountOptions": {
|
||||
"message": "Opzioni Account"
|
||||
},
|
||||
@ -40,27 +135,109 @@
|
||||
"activityLog": {
|
||||
"message": "log attività"
|
||||
},
|
||||
"add": {
|
||||
"message": "Aggiungi"
|
||||
},
|
||||
"addANetwork": {
|
||||
"message": "Aggiungi una rete"
|
||||
},
|
||||
"addANetworkManually": {
|
||||
"message": "Aggungi manualmente una rete"
|
||||
},
|
||||
"addANickname": {
|
||||
"message": "Aggiungo un nickname"
|
||||
},
|
||||
"addAcquiredTokens": {
|
||||
"message": "Aggiungi i token che hai acquistato usando MetaMask"
|
||||
},
|
||||
"addAlias": {
|
||||
"message": "Aggiungi alias"
|
||||
},
|
||||
"addBlockExplorer": {
|
||||
"message": "Aggiungi un block explorer"
|
||||
},
|
||||
"addContact": {
|
||||
"message": "Aggiungi contatto"
|
||||
},
|
||||
"addCustomToken": {
|
||||
"message": "Aggiungi token personalizzato"
|
||||
},
|
||||
"addCustomTokenByContractAddress": {
|
||||
"message": "Non trovi un token? Puoi aggiungere qualsiasi token incollando il suo indirizzo. L'indirizzo del contratto del Token può essere trovato su $1.",
|
||||
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
|
||||
},
|
||||
"addEthereumChainConfirmationDescription": {
|
||||
"message": "Ciò consentirà a questa rete di essere utilizzata all'interno di MetaMask."
|
||||
},
|
||||
"addEthereumChainConfirmationRisks": {
|
||||
"message": "MetaMask non verifica le reti personalizzate."
|
||||
},
|
||||
"addEthereumChainConfirmationRisksLearnMore": {
|
||||
"message": "Maggiori informazioni su $1.",
|
||||
"description": "$1 is a link with text that is provided by the 'addEthereumChainConfirmationRisksLearnMoreLink' key"
|
||||
},
|
||||
"addEthereumChainConfirmationRisksLearnMoreLink": {
|
||||
"message": "truffe e rischi per la sicurezza della rete",
|
||||
"description": "Link text for the 'addEthereumChainConfirmationRisksLearnMore' translation key"
|
||||
},
|
||||
"addEthereumChainConfirmationTitle": {
|
||||
"message": "Consenti a questo sito di aggiungere una rete?"
|
||||
},
|
||||
"addFriendsAndAddresses": {
|
||||
"message": "Aggiungi amici e indirizzi di cui ti fidi"
|
||||
},
|
||||
"addFromAListOfPopularNetworks": {
|
||||
"message": "Aggiungi da un elenco di reti popolari o aggiungi una rete manualmente. Interagisci solo con le entità di cui ti fidi."
|
||||
},
|
||||
"addMemo": {
|
||||
"message": "Aggiungi memo"
|
||||
},
|
||||
"addMoreNetworks": {
|
||||
"message": "aggiungi più reti manualmente"
|
||||
},
|
||||
"addNetwork": {
|
||||
"message": "Aggiungi Rete"
|
||||
},
|
||||
"addNetworkTooltipWarning": {
|
||||
"message": "Questarete si basa su terze parti. La connessione potrebbe essere meno affidabile o consentire a terzi di tracciare le tue attività. $1",
|
||||
"description": "$1 is Learn more link"
|
||||
},
|
||||
"addSuggestedTokens": {
|
||||
"message": "Aggiungi Token Suggeriti"
|
||||
},
|
||||
"addToken": {
|
||||
"message": "Aggiungi Token"
|
||||
},
|
||||
"address": {
|
||||
"message": "Indirizzo"
|
||||
},
|
||||
"addressBookIcon": {
|
||||
"message": "Icona rubrica indirizzo"
|
||||
},
|
||||
"advanced": {
|
||||
"message": "Avanzate"
|
||||
},
|
||||
"advancedBaseGasFeeToolTip": {
|
||||
"message": "Quando la tua transazione viene inclusa nel blocco, ogni differenza tra la tua offerta massima di gas e il gas effettivamente utilizzato viene restituita a te. Il totale viene calcolato come offerta massima di gas (in GEWI) * limite di gas."
|
||||
},
|
||||
"advancedGasFeeDefaultOptIn": {
|
||||
"message": "Salva queste $1 come mie preferite per \"Avanzate\""
|
||||
},
|
||||
"advancedGasFeeDefaultOptOut": {
|
||||
"message": "Utilizzare sempre questi valori e l'impostazione avanzata come predefiniti."
|
||||
},
|
||||
"advancedGasFeeModalTitle": {
|
||||
"message": "Tariffa gas avanzata"
|
||||
},
|
||||
"advancedGasPriceTitle": {
|
||||
"message": "Prezzo gas"
|
||||
},
|
||||
"advancedOptions": {
|
||||
"message": "Opzioni Avanzate"
|
||||
},
|
||||
"advancedPriorityFeeToolTip": {
|
||||
"message": "La commissione di priorità avanzata (nota anche come \"suggerimento del minatore\") va direttamente ai minatori e li incentiva a dare la priorità alla tua commissione di transazione."
|
||||
},
|
||||
"affirmAgree": {
|
||||
"message": "Acconsento"
|
||||
},
|
||||
@ -82,9 +259,17 @@
|
||||
"alerts": {
|
||||
"message": "Avvisi"
|
||||
},
|
||||
"allOfYour": {
|
||||
"message": "Tutti i tuoi $1",
|
||||
"description": "$1 is the symbol or name of the token that the user is approving spending"
|
||||
},
|
||||
"allowExternalExtensionTo": {
|
||||
"message": "Permetti a questa estensione di:"
|
||||
},
|
||||
"allowSpendToken": {
|
||||
"message": "Dai il permesso di spendere tuoi $1?",
|
||||
"description": "$1 is the symbol of the token that are requesting to spend"
|
||||
},
|
||||
"allowThisSiteTo": {
|
||||
"message": "Permetti a questo sito di:"
|
||||
},
|
||||
@ -96,7 +281,7 @@
|
||||
"message": "Importo"
|
||||
},
|
||||
"appDescription": {
|
||||
"message": "Ethereum Browser Extension",
|
||||
"message": "Estensione Browser Ethereum",
|
||||
"description": "The description of the application"
|
||||
},
|
||||
"appName": {
|
||||
@ -114,6 +299,19 @@
|
||||
"approve": {
|
||||
"message": "Approva"
|
||||
},
|
||||
"approveAllTokensTitle": {
|
||||
"message": "Consenti l'accesso e il trasferimento di tutti i tuoi $1?",
|
||||
"description": "$1 is the symbol of the token for which the user is granting approval"
|
||||
},
|
||||
"approveAndInstall": {
|
||||
"message": "Approva & installa"
|
||||
},
|
||||
"approveAndUpdate": {
|
||||
"message": "Approva & aggiorna"
|
||||
},
|
||||
"approveButtonText": {
|
||||
"message": "Approva"
|
||||
},
|
||||
"approveSpendLimit": {
|
||||
"message": "Approva limite di spesa per $1",
|
||||
"description": "The token symbol that is being approved"
|
||||
@ -121,9 +319,28 @@
|
||||
"approved": {
|
||||
"message": "Approvato"
|
||||
},
|
||||
"approvedAmountWithColon": {
|
||||
"message": "Importo approvato:"
|
||||
},
|
||||
"approvedAsset": {
|
||||
"message": "Asset approvato"
|
||||
},
|
||||
"approvedOn": {
|
||||
"message": "Approvato il $1",
|
||||
"description": "$1 is the approval date for a permission"
|
||||
},
|
||||
"areYouSure": {
|
||||
"message": "Sei sicuro?"
|
||||
},
|
||||
"assetOptions": {
|
||||
"message": "Opzioni asset"
|
||||
},
|
||||
"assets": {
|
||||
"message": "Patrimonio"
|
||||
},
|
||||
"attemptSendingAssets": {
|
||||
"message": "Se si tenta di inviare risorse direttamente da una rete all'altra, ciò potrebbe comportare una perdita permanente della risorca coinvolta. Assicurati di usare un bridge."
|
||||
},
|
||||
"attemptToCancel": {
|
||||
"message": "Tentativo di Annullamento?"
|
||||
},
|
||||
@ -164,27 +381,98 @@
|
||||
"message": "Esegui il backup ora"
|
||||
},
|
||||
"balance": {
|
||||
"message": "Bilancio:"
|
||||
"message": "Bilancio"
|
||||
},
|
||||
"balanceOutdated": {
|
||||
"message": "Il bilancio può essere non aggiornato"
|
||||
},
|
||||
"baseFee": {
|
||||
"message": "Commissioni di base"
|
||||
},
|
||||
"basic": {
|
||||
"message": "Base"
|
||||
},
|
||||
"beCareful": {
|
||||
"message": "Presta attenzione"
|
||||
},
|
||||
"betaMetamaskDescription": {
|
||||
"message": "Scelto da milioni di persone, MetaMask è un portafoglio sicuro che rende il mondo del web3 accessibile a tutti."
|
||||
},
|
||||
"betaMetamaskDescriptionExplanation": {
|
||||
"message": "Usa questa versione per testare le funzionalità imminenti prima che vengano rilasciate. Il tuo utilizzo e il tuo feedback ci aiutano a creare la migliore versione possibile di MetaMask. L'utilizzo di MetaMask Beta è soggetto al nostro standard $1 e al nostro $2. Come versione beta, potrebbe esserci un aumento del rischio di bug. Procedendo, accetti e riconosci questi rischi, così come i rischi che si trovano nei nostri Termini e Termini beta.",
|
||||
"description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText"
|
||||
},
|
||||
"betaMetamaskDescriptionExplanationBetaTermsLinkText": {
|
||||
"message": "Termini beta supplementari"
|
||||
},
|
||||
"betaMetamaskDescriptionExplanationTermsLinkText": {
|
||||
"message": "Termini"
|
||||
},
|
||||
"betaMetamaskVersion": {
|
||||
"message": "MetaMask Versione Beta"
|
||||
},
|
||||
"betaWelcome": {
|
||||
"message": "Benvenuto in MetaMask Beta"
|
||||
},
|
||||
"blockExplorerAccountAction": {
|
||||
"message": "Profilo",
|
||||
"description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer"
|
||||
},
|
||||
"blockExplorerUrl": {
|
||||
"message": "Block Explorer"
|
||||
"message": "URL Block Explorer"
|
||||
},
|
||||
"blockExplorerUrlDefinition": {
|
||||
"message": "L'URL usato come Block Explorer per questa rete."
|
||||
},
|
||||
"blockExplorerView": {
|
||||
"message": "Visualizza account su $1",
|
||||
"description": "$1 replaced by URL for custom block explorer"
|
||||
},
|
||||
"blockies": {
|
||||
"message": "Blocchi"
|
||||
},
|
||||
"browserNotSupported": {
|
||||
"message": "Il tuo Browser non è supportato..."
|
||||
},
|
||||
"buildContactList": {
|
||||
"message": "Costruisci la tua lista contatti"
|
||||
},
|
||||
"builtAroundTheWorld": {
|
||||
"message": "MetaMask è progettato e costruito in tutto il mondo."
|
||||
},
|
||||
"busy": {
|
||||
"message": "Occupato"
|
||||
},
|
||||
"buy": {
|
||||
"message": "Compra"
|
||||
},
|
||||
"buyAsset": {
|
||||
"message": "Compra $1",
|
||||
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
|
||||
},
|
||||
"buyCryptoWithCoinbasePay": {
|
||||
"message": "Compra $1 con Coinbase Pay",
|
||||
"description": "$1 represents the crypto symbol to be purchased"
|
||||
},
|
||||
"buyCryptoWithCoinbasePayDescription": {
|
||||
"message": "Puoi facilmente acquistare o trasferire criptovalute con il tuo account Coinbase.",
|
||||
"description": "$1 represents the crypto symbol to be purchased"
|
||||
},
|
||||
"buyCryptoWithMoonPay": {
|
||||
"message": "Compra $1 con MoonPay",
|
||||
"description": "$1 represents the cypto symbol to be purchased"
|
||||
},
|
||||
"buyCryptoWithMoonPayDescription": {
|
||||
"message": "MoonPay supporta metodi di pagamento popolari, incluso Visa, Mastercard, Apple / Google / Samsung Pay e bonifici bancari in 145+ paesi. I Token vengono depositati nel tuo account MetaMask."
|
||||
},
|
||||
"buyCryptoWithTransak": {
|
||||
"message": "Compra $1 con Transak",
|
||||
"description": "$1 represents the cypto symbol to be purchased"
|
||||
},
|
||||
"buyCryptoWithTransakDescription": {
|
||||
"message": "Transak supporta carte di credito e debito, Apple Pay, MobiKwik e bonifici bancari (in base alla località) in 100+ paesi. Deposita $1 direttamente nel tuo account MetaMask.",
|
||||
"description": "$1 represents the crypto symbol to be purchased"
|
||||
},
|
||||
"buyWithWyre": {
|
||||
"message": "Compra $1 con Wyre"
|
||||
},
|
||||
@ -197,21 +485,69 @@
|
||||
"cancel": {
|
||||
"message": "Annulla"
|
||||
},
|
||||
"cancelEdit": {
|
||||
"message": "Annulla modifica"
|
||||
},
|
||||
"cancelPopoverTitle": {
|
||||
"message": "Annulla transazione"
|
||||
},
|
||||
"cancelSpeedUp": {
|
||||
"message": "annulla o velocizza una transazione."
|
||||
},
|
||||
"cancelSpeedUpLabel": {
|
||||
"message": "Questa commissione di gas $1 l'originale.",
|
||||
"description": "$1 is text 'replace' in bold"
|
||||
},
|
||||
"cancelSpeedUpTransactionTooltip": {
|
||||
"message": "Per $1 una transazione la commissione di gas deve crescere almeno del 10% per essere riconosciuto dalla rete.",
|
||||
"description": "$1 is string 'cancel' or 'speed up'"
|
||||
},
|
||||
"cancelSwapForFee": {
|
||||
"message": "Annulla scambio per ~$1",
|
||||
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
|
||||
},
|
||||
"cancelSwapForFree": {
|
||||
"message": "Annulla scambio gratuitamente"
|
||||
},
|
||||
"cancellationGasFee": {
|
||||
"message": "Costo di Annullamento in Gas"
|
||||
},
|
||||
"cancelled": {
|
||||
"message": "Annullata"
|
||||
},
|
||||
"chainIdDefinition": {
|
||||
"message": "Il Chain ID utilizzato per firmare le transazioni per questa rete."
|
||||
},
|
||||
"chainIdExistsErrorMsg": {
|
||||
"message": "Questo Chain ID al momento è usato dalla rete $1."
|
||||
},
|
||||
"chainListReturnedDifferentTickerSymbol": {
|
||||
"message": "La rete con chain ID $1 può utilizzare un simbolo diverso ($2) da quello che hai inserito. Si prega di verificare prima di continuare.",
|
||||
"description": "$1 is the chain id currently entered in the network form and $2 is the return value of nativeCurrency.symbol from chainlist.network"
|
||||
},
|
||||
"chromeRequiredForHardwareWallets": {
|
||||
"message": "Devi usare MetaMask con Google Chrome per connettere il tuo Portafoglio Hardware"
|
||||
},
|
||||
"clickToConnectLedgerViaWebHID": {
|
||||
"message": "Clicca qui per connettere il tuo Ledger tramite WebHID",
|
||||
"description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid"
|
||||
},
|
||||
"clickToManuallyAdd": {
|
||||
"message": "Clicca qui per aggiungere manualmente i token."
|
||||
},
|
||||
"clickToRevealSeed": {
|
||||
"message": "Clicca qui per rivelare la tua frase segreta"
|
||||
},
|
||||
"close": {
|
||||
"message": "Chiudi"
|
||||
},
|
||||
"collectibleAddFailedMessage": {
|
||||
"message": "Non è possibile aggiungere questo NFT poiché i dettagli della proprietà non corrispondono. Assicurati di aver inserito le informazioni corrette."
|
||||
},
|
||||
"collectibleAddressError": {
|
||||
"message": "Questo token è un NFT. Aggiungilo su $1",
|
||||
"description": "$1 is a clickable link with text defined by the 'importNFTPage' key"
|
||||
},
|
||||
"confirm": {
|
||||
"message": "Conferma"
|
||||
},
|
||||
@ -224,6 +560,15 @@
|
||||
"confirmed": {
|
||||
"message": "Confermata"
|
||||
},
|
||||
"confusableUnicode": {
|
||||
"message": "'$1' è simile a '$2'."
|
||||
},
|
||||
"confusableZeroWidthUnicode": {
|
||||
"message": "Trovato carattere a larghezza zero."
|
||||
},
|
||||
"confusingEnsDomain": {
|
||||
"message": "Abbiamo rilevato un carattere confondibile nel nome ENS. Controlla il nome ENS per evitare una potenziale truffa."
|
||||
},
|
||||
"congratulations": {
|
||||
"message": "Congratulazioni"
|
||||
},
|
||||
@ -283,6 +628,10 @@
|
||||
"message": "$1 non è connesso ad alcun sito.",
|
||||
"description": "$1 is the account name"
|
||||
},
|
||||
"connectedSnapSites": {
|
||||
"message": "$1 snap è collegato a questi siti. Hanno accesso alle autorizzazioni sopra elencate.",
|
||||
"description": "$1 represents the name of the snap"
|
||||
},
|
||||
"connecting": {
|
||||
"message": "Connessione..."
|
||||
},
|
||||
@ -295,6 +644,9 @@
|
||||
"connectingToMainnet": {
|
||||
"message": "Connessione alla Rete Ethereum Principale"
|
||||
},
|
||||
"connectingToSepolia": {
|
||||
"message": "Connessione alla Rete di test Sepolia"
|
||||
},
|
||||
"contactUs": {
|
||||
"message": "Contattaci!"
|
||||
},
|
||||
@ -304,15 +656,51 @@
|
||||
"continue": {
|
||||
"message": "Continua"
|
||||
},
|
||||
"continueToCoinbasePay": {
|
||||
"message": "Continua su Coinbase Pay"
|
||||
},
|
||||
"continueToMoonPay": {
|
||||
"message": "Continua su MoonPay"
|
||||
},
|
||||
"continueToTransak": {
|
||||
"message": "Continua su Transak"
|
||||
},
|
||||
"continueToWyre": {
|
||||
"message": "Continua su Wyre"
|
||||
},
|
||||
"contract": {
|
||||
"message": "Contratto"
|
||||
},
|
||||
"contractAddress": {
|
||||
"message": "Indirizzo contratto"
|
||||
},
|
||||
"contractAddressError": {
|
||||
"message": "Stai inviando i token all'indirizzo del contratto del token. Ciò potrebbe comportare la perdita di questi token."
|
||||
},
|
||||
"contractDeployment": {
|
||||
"message": "Distribuzione Contratto"
|
||||
},
|
||||
"contractDescription": {
|
||||
"message": "Per proteggerti dai truffatori, prenditi un momento per verificare i dettagli del contratto."
|
||||
},
|
||||
"contractInteraction": {
|
||||
"message": "Interazione Contratto"
|
||||
},
|
||||
"contractRequestingSpendingCap": {
|
||||
"message": "Il contratto richiede un limite di spesa"
|
||||
},
|
||||
"contractTitle": {
|
||||
"message": "Dettagli contratto"
|
||||
},
|
||||
"contractToken": {
|
||||
"message": "Token contratto"
|
||||
},
|
||||
"convertTokenToNFTDescription": {
|
||||
"message": "Abbiamo rilevato che questa risorsa è un NFT. MetaMask ora ha il supporto nativo completo per NFT. Vuoi rimuoverlo dal tuo elenco di token e aggiungerlo come NFT?"
|
||||
},
|
||||
"convertTokenToNFTExistDescription": {
|
||||
"message": "Abbiamo rilevato che questa risorsa è stata aggiunta come NFT. Vuoi rimuoverlo dal tuo elenco di token?"
|
||||
},
|
||||
"copiedExclamation": {
|
||||
"message": "Copiato!"
|
||||
},
|
||||
@ -322,6 +710,9 @@
|
||||
"copyPrivateKey": {
|
||||
"message": "Questa è la tua chiave privata (clicca per copiare)"
|
||||
},
|
||||
"copyRawTransactionData": {
|
||||
"message": "Copia i dati grezzi della transazione"
|
||||
},
|
||||
"copyToClipboard": {
|
||||
"message": "Copia negli appunti"
|
||||
},
|
||||
@ -337,12 +728,21 @@
|
||||
"createAccount": {
|
||||
"message": "Crea Account"
|
||||
},
|
||||
"createNewWallet": {
|
||||
"message": "Crea un nuovo portafoglio"
|
||||
},
|
||||
"createPassword": {
|
||||
"message": "Crea Password"
|
||||
},
|
||||
"currencyConversion": {
|
||||
"message": "Conversione Moneta"
|
||||
},
|
||||
"currencySymbol": {
|
||||
"message": "Simbolo moneta"
|
||||
},
|
||||
"currencySymbolDefinition": {
|
||||
"message": "Il simbolo del ticker visualizzato per la valuta di questa rete."
|
||||
},
|
||||
"currentAccountNotConnected": {
|
||||
"message": "Il tuo account corrente non è connesso"
|
||||
},
|
||||
@ -352,15 +752,72 @@
|
||||
"currentLanguage": {
|
||||
"message": "Lingua Corrente"
|
||||
},
|
||||
"currentTitle": {
|
||||
"message": "Corrente:"
|
||||
},
|
||||
"currentlyUnavailable": {
|
||||
"message": "Non disponibile su questa Rete"
|
||||
},
|
||||
"curveHighGasEstimate": {
|
||||
"message": "Grafico di stima del gas aggressivo"
|
||||
},
|
||||
"curveLowGasEstimate": {
|
||||
"message": "Grafico della stima del gas basso"
|
||||
},
|
||||
"curveMediumGasEstimate": {
|
||||
"message": "Grafico della stima del gas di mercato"
|
||||
},
|
||||
"custom": {
|
||||
"message": "Avanzate"
|
||||
},
|
||||
"customContentSearch": {
|
||||
"message": "Cerca una rete aggiunta in precedenza"
|
||||
},
|
||||
"customGasSettingToolTipMessage": {
|
||||
"message": "Usa $1 per personalizzare il prezzo del gas. Questo può creare confusione se non hai familiarità. Interagisci a tuo rischio.",
|
||||
"description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight"
|
||||
},
|
||||
"customSpendLimit": {
|
||||
"message": "Limite Spesa Personalizzato"
|
||||
},
|
||||
"customSpendingCap": {
|
||||
"message": "Custom spending cap"
|
||||
},
|
||||
"customToken": {
|
||||
"message": "Token Personalizzato"
|
||||
},
|
||||
"customTokenWarningInNonTokenDetectionNetwork": {
|
||||
"message": "Il rilevamento dei token non è ancora disponibile su questa rete. Importa il token manualmente e assicurati che sia corretto. Ulteriori informazioni su $1"
|
||||
},
|
||||
"customTokenWarningInTokenDetectionNetwork": {
|
||||
"message": "Prima di importare manualmente un token, assicurati sia attendibile. Ulteriori informazioni su $ 1"
|
||||
},
|
||||
"customTokenWarningInTokenDetectionNetworkWithTDOFF": {
|
||||
"message": "Assicurati di fidarti di un token prima di importarlo. Scopri come evitare $1. Puoi anche abilitare il rilevamento dei token $2."
|
||||
},
|
||||
"customerSupport": {
|
||||
"message": "servizio clienti"
|
||||
},
|
||||
"dappSuggested": {
|
||||
"message": "Sito suggerito"
|
||||
},
|
||||
"dappSuggestedGasSettingToolTipMessage": {
|
||||
"message": "$1 ha suggerito questo prezzo.",
|
||||
"description": "$1 is url for the dapp that has suggested gas settings"
|
||||
},
|
||||
"dappSuggestedShortLabel": {
|
||||
"message": "Sito"
|
||||
},
|
||||
"dappSuggestedTooltip": {
|
||||
"message": "$1 ha consigliato questo prezzo.",
|
||||
"description": "$1 represents the Dapp's origin"
|
||||
},
|
||||
"darkTheme": {
|
||||
"message": "Scuro"
|
||||
},
|
||||
"dataBackupSeemsCorrupt": {
|
||||
"message": "Impossibile ripristinare i tuoi dati. Il file sembra essere corrotto."
|
||||
},
|
||||
"decimal": {
|
||||
"message": "Precisione Decimali"
|
||||
},
|
||||
@ -399,9 +856,32 @@
|
||||
"deleteNetworkDescription": {
|
||||
"message": "Sei sicuro di voler eliminare questa rete?"
|
||||
},
|
||||
"depositCrypto": {
|
||||
"message": "Deposita $1",
|
||||
"description": "$1 represents the crypto symbol to be purchased"
|
||||
},
|
||||
"deprecatedTestNetworksLink": {
|
||||
"message": "Scopri di più"
|
||||
},
|
||||
"deprecatedTestNetworksMsg": {
|
||||
"message": "A causa delle modifiche al protocollo di Ethereum: le reti di test Rinkeby, Ropsten e Kovan potrebbero non funzionare in modo affidabile e saranno presto rimosse."
|
||||
},
|
||||
"description": {
|
||||
"message": "Descrizione"
|
||||
},
|
||||
"details": {
|
||||
"message": "Dettagli"
|
||||
},
|
||||
"directDepositCrypto": {
|
||||
"message": "Deposito diretto $1"
|
||||
},
|
||||
"directDepositCryptoExplainer": {
|
||||
"message": "Se hai già $1, il modo più rapido per ottenere $1 nel tuo nuovo portafoglio tramite deposito diretto."
|
||||
},
|
||||
"disabledGasOptionToolTipMessage": {
|
||||
"message": "“$1” è disabilitato perché non soddisfa la maggiorazione minima del 10% rispetto al canone gas originario.",
|
||||
"description": "$1 is gas estimate type which can be market or aggressive"
|
||||
},
|
||||
"disconnect": {
|
||||
"message": "Disconnetti"
|
||||
},
|
||||
@ -420,15 +900,30 @@
|
||||
"dismiss": {
|
||||
"message": "Ignora"
|
||||
},
|
||||
"dismissReminderDescriptionField": {
|
||||
"message": "Attiva questa opzione per ignorare il messaggio di promemoria del backup della frase di ripristino segreta. Ti consigliamo vivamente di eseguire il backup della tua frase di recupero segreta per evitare la perdita di fondi"
|
||||
},
|
||||
"dismissReminderField": {
|
||||
"message": "Ignora il promemoria di backup della frase di ripristino segreta"
|
||||
},
|
||||
"domain": {
|
||||
"message": "Dominio"
|
||||
},
|
||||
"done": {
|
||||
"message": "Finito"
|
||||
},
|
||||
"dontShowThisAgain": {
|
||||
"message": "Non mostrare di nuovo"
|
||||
},
|
||||
"downArrow": {
|
||||
"message": "Freccia in giù"
|
||||
},
|
||||
"downloadGoogleChrome": {
|
||||
"message": "Scarica Google Chrome"
|
||||
},
|
||||
"downloadNow": {
|
||||
"message": "Scarica ora"
|
||||
},
|
||||
"downloadSecretBackup": {
|
||||
"message": "Scarica questa Frase di Backup Segreta e tienila al sicuro in un hard disk o supporto di memorizzazione esterno criptato."
|
||||
},
|
||||
@ -441,9 +936,64 @@
|
||||
"edit": {
|
||||
"message": "Modifica"
|
||||
},
|
||||
"editANickname": {
|
||||
"message": "Modifica nickname"
|
||||
},
|
||||
"editAddressNickname": {
|
||||
"message": "Modifica indirizzo nickname"
|
||||
},
|
||||
"editCancellationGasFeeModalTitle": {
|
||||
"message": "Modifica la tassa di cancellazione del gas"
|
||||
},
|
||||
"editContact": {
|
||||
"message": "Modifica contatto"
|
||||
},
|
||||
"editGasEducationButtonText": {
|
||||
"message": "Come devo scegliere?"
|
||||
},
|
||||
"editGasEducationHighExplanation": {
|
||||
"message": "Questo è il migliore per le transazioni sensibili al tempo (come gli swap) in quanto aumenta la probabilità di una transazione riuscita. Se uno Swap impiega troppo tempo per l'elaborazione, potrebbe non riuscire e comportare la perdita di parte della tariffa del gas."
|
||||
},
|
||||
"editGasEducationLowExplanation": {
|
||||
"message": "Una tariffa gas inferiore dovrebbe essere utilizzata solo quando il tempo di elaborazione è meno importante. Commissioni più basse rendono difficile prevedere quando (o se) la tua transazione avrà esito positivo."
|
||||
},
|
||||
"editGasEducationMediumExplanation": {
|
||||
"message": "Una commissione gas media va bene per l'invio, il prelievo o altre transazioni non sensibili al fattore tempo. Molto spesso questa impostazione risulterà in una transazione riuscita."
|
||||
},
|
||||
"editGasEducationModalIntro": {
|
||||
"message": "La scelta della giusta commissione per il gas dipende dal tipo di transazione e da quanto è importante per te."
|
||||
},
|
||||
"editGasEducationModalTitle": {
|
||||
"message": "Come scegliere?"
|
||||
},
|
||||
"editGasFeeModalTitle": {
|
||||
"message": "Modificare la tariffa del gas"
|
||||
},
|
||||
"editGasHigh": {
|
||||
"message": "Alta"
|
||||
},
|
||||
"editGasLimitOutOfBounds": {
|
||||
"message": "Il limite di gas deve essere almeno $1"
|
||||
},
|
||||
"editGasLimitOutOfBoundsV2": {
|
||||
"message": "Il limite del gas deve essere maggiore di $1 e minore di $2",
|
||||
"description": "$1 is the minimum limit for gas and $2 is the maximum limit"
|
||||
},
|
||||
"editGasLimitTooltip": {
|
||||
"message": "Il limite del gas è l'unità massima di gas che sei disposto a utilizzare. Le unità di gas sono un moltiplicatore per “Commissione massima priorità“ e “Commissione massima“."
|
||||
},
|
||||
"editGasLow": {
|
||||
"message": "Bassa"
|
||||
},
|
||||
"editGasMaxBaseFeeGWEIImbalance": {
|
||||
"message": "La tariffa base massima non può essere inferiore alla tariffa prioritaria"
|
||||
},
|
||||
"editGasMaxBaseFeeHigh": {
|
||||
"message": "La tariffa base massima è superiore al necessario"
|
||||
},
|
||||
"editGasMaxBaseFeeLow": {
|
||||
"message": "La tariffa base massima è bassa per le condizioni di rete attuali"
|
||||
},
|
||||
"editPermission": {
|
||||
"message": "Modifica Permessi"
|
||||
},
|
||||
@ -1227,9 +1777,6 @@
|
||||
"sign": {
|
||||
"message": "Firma"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Firmare questo messaggio può avere effetti collaterali pericolosi. \nFirma messaggi da siti di cui ti fidi totalmente. \nQuesto metodo pericoloso sarà rimosso in versioni future."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Firma Richiesta"
|
||||
},
|
||||
|
13
app/_locales/ja/messages.json
generated
13
app/_locales/ja/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "確認"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "今後取得する可能性のあるものも含め、$1 へのアクセスを許可しようとしています。相手はお客様がこの承認を取り消すまで、お客様のウォレットからいつでもお客様の許可なしに NFT を送ることができます。$2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "このコントラクトのすべての NFT"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "慎重に進めてください。"
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "パスワードの確認"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "署名"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "このメッセージに署名すると、危険な可能性があります。この署名により、要求しているサイトへのアカウントやアカウントのアセットの完全な管理権の付与を含め、アカウントに代わり操作が行われる可能性があります。完全に状況を把握している場合、または要求しているサイトを完全に信頼している場合を除き、このメッセージには署名しないでください。"
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "署名の要求"
|
||||
},
|
||||
|
3
app/_locales/kn/messages.json
generated
3
app/_locales/kn/messages.json
generated
@ -825,9 +825,6 @@
|
||||
"sign": {
|
||||
"message": "ಸಹಿ"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "ಈ ಸಂದೇಶಕ್ಕೆ ಸಹಿ ಮಾಡುವಿಕೆಯು \nಅಪಾಯಕಾರಿ ಅಡ್ಡಪರಿಣಾಮಗಳನ್ನು ಹೊಂದಿರಬಹುದು. ನಿಮ್ಮ ಸಂಪೂರ್ಣ ಖಾತೆಯೊಂದಿಗೆ ನೀವು ಸಂಪೂರ್ಣವಾಗಿ ನಂಬುವ ಸೈಟ್ಗಳಿಂದ\nಮಾತ್ರ ಸಂದೇಶಗಳಿಗೆ ಸಹಿ ಮಾಡಿ.\nಭವಿಷ್ಯದ ಆವೃತ್ತಿಯಲ್ಲಿ ಈ ಅಪಾಯಕಾರಿ ವಿಧಾನವನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "ಸಹಿಯ ವಿನಂತಿ"
|
||||
},
|
||||
|
13
app/_locales/ko/messages.json
generated
13
app/_locales/ko/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "확인"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "향후 소유할 수 있는 모든 $1에 대한 액세스를 허용하는 것입니다. 이 허용을 취소하지 않는 한, 상대방이 언제든지 허락 없이 지갑에서 NFT를 전송할 수 있습니다. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "이 계약의 모든 NFT"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "주의하여 진행하세요."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "비밀번호 확인"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "서명"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "본 메시지에 서명하는 행위는 위험의 가능성을 내포하고 있습니다. 본 서명을 이용하여 사이트에 요청하면 귀하의 계정 및 모든 자산에 대해 완전한 권한을 부여함은 물론 귀하의 계정과 관련된 실질적 모든 작업을 수행할 가능성이 있기 때문입니다. 완전히 신뢰할 수 있는 사이트에서 확실한 작업을 수행할 경우에만 본 메시지에 서명하십시오."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "서명 요청"
|
||||
},
|
||||
|
3
app/_locales/lt/messages.json
generated
3
app/_locales/lt/messages.json
generated
@ -825,9 +825,6 @@
|
||||
"sign": {
|
||||
"message": "Prisijunkite"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Pasirašant šį pranešimą gali būti \npavojingų šalutinių efektų. Pasirašykite tik pranešimus iš vietų,\nkuriomis visiškai pasitikite su visomis savo paskyromis.\nŠis pavojingas būdas bus pašalintas ateities versijoje. "
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Parašo užklausa"
|
||||
},
|
||||
|
3
app/_locales/lv/messages.json
generated
3
app/_locales/lv/messages.json
generated
@ -821,9 +821,6 @@
|
||||
"sign": {
|
||||
"message": "Parakstīt"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Šī ziņojuma parakstīšana var radīt \nbīstamas blaknes. Parakstiet tikai tādus ziņojumus,\nkuriem pilnībā uzticaties ar savu konta informāciju.\n Turpmākajās versijās šī bīstamā metode tiks noņemta. "
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Paraksta pieprasījums"
|
||||
},
|
||||
|
3
app/_locales/ms/messages.json
generated
3
app/_locales/ms/messages.json
generated
@ -805,9 +805,6 @@
|
||||
"sign": {
|
||||
"message": "Tandatangan"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Menandatangani mesej ini boleh menyebabkan kesan sampingan yang berbahaya. Hanya tandatangan mesej daripada tapak yang anda percayai sepenuhnya dengan seluruh akaun anda. Kaedah berbahaya ini akan dibuang dalam versi akan datang."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Permintaan Tandatangan"
|
||||
},
|
||||
|
3
app/_locales/nl/messages.json
generated
3
app/_locales/nl/messages.json
generated
@ -298,9 +298,6 @@
|
||||
"sign": {
|
||||
"message": "Teken"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Het ondertekenen van dit bericht kan hebben \ngevaarlijke bijwerkingen. Meld alleen berichten van \nsites die u volledig vertrouwt met uw volledige account.\n Deze gevaarlijke methode wordt in een toekomstige versie verwijderd."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Ondertekeningsverzoek"
|
||||
},
|
||||
|
3
app/_locales/no/messages.json
generated
3
app/_locales/no/messages.json
generated
@ -809,9 +809,6 @@
|
||||
"sign": {
|
||||
"message": "Undertegn"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Signering av denne meldingen kan ha\nfarlige konsekvenser. Signér kun meldinger fra\nnettsteder du stoler fullt og helt på med hele kontoen din. Denne farlige metoden vil bli fjernet i en fremtidig versjon."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Signaturforespørsel"
|
||||
},
|
||||
|
3
app/_locales/ph/messages.json
generated
3
app/_locales/ph/messages.json
generated
@ -1552,9 +1552,6 @@
|
||||
"sign": {
|
||||
"message": "Lumagda"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Puwedeng may mga \nmapanganib na side effect ang paglagda sa mensaheng ito. Lagdaan lang ang mga mensahe mula sa \nmga site na pinagkakatiwalaan mo para sa buong account mo.\n Aalisin ang mapanganib na paraang ito sa bersyon sa hinaharap. "
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Request ng Signature"
|
||||
},
|
||||
|
3
app/_locales/pl/messages.json
generated
3
app/_locales/pl/messages.json
generated
@ -819,9 +819,6 @@
|
||||
"sign": {
|
||||
"message": "Podpisz"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Podpisanie tej wiadomości może mieć \nniebezpieczne skutki uboczne. Podpisuj wiadomości \ntylko ze stron, którym chcesz udostępnić swoje konto.\nTa niebezpieczna metoda będzie usunięta w przyszłych wersjach. "
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Prośba o podpis"
|
||||
},
|
||||
|
13
app/_locales/pt/messages.json
generated
13
app/_locales/pt/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "Confirmar"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "Você está concedendo acesso a $1, incluindo todos os que vier a adquirir. A parte na outra ponta pode transferir NFTs de sua carteira a qualquer momento, sem consultá-lo, até que você revogue essa aprovação. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "todos os NFTs neste contrato"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "Prossiga com cautela."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "Confirmar Palavra-passe"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "Assinar"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Assinar esta mensagem pode ter \nefeitos laterais perigosos. Apenas assine mensagens de sites que \ntotalmente confia com a sua conta total.\n Este método perigoso será removido numa versão posterior."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Pedido de assinatura"
|
||||
},
|
||||
|
3
app/_locales/pt_BR/messages.json
generated
3
app/_locales/pt_BR/messages.json
generated
@ -2402,9 +2402,6 @@
|
||||
"sign": {
|
||||
"message": "Assinar"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Assinar essa mensagem pode ser perigoso. Essa assinatura pode potencialmente realizar qualquer operação em seu nome, incluindo a concessão do controle total da sua conta e de todos os seus ativos ao site solicitante. Apenas assine essa mensagem se você sabe o que está fazendo ou se confia plenamente no site solicitante."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Solicitação de assinatura"
|
||||
},
|
||||
|
3
app/_locales/ro/messages.json
generated
3
app/_locales/ro/messages.json
generated
@ -812,9 +812,6 @@
|
||||
"sign": {
|
||||
"message": "Semnați"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Semnarea acestui mesaj poate avea efecte secundare periculoase. Semnați mesajele numai de pe site-urile în care aveți încredere deplină să vă acceseze întregul cont. Această metodă periculoasă va fi eliminată într-o versiune viitoare."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Cerere semnătură"
|
||||
},
|
||||
|
13
app/_locales/ru/messages.json
generated
13
app/_locales/ru/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "Подтвердить"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "Вы предоставляете доступ к $1, включая все, что может принадлежать вам в будущем. Сторона на другом конце может перевести NFT с вашего кошелька в любое время, не спрашивая вас, пока вы не отзовете это одобрение. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "все NFT по этому контракту"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "Действуйте с осторожностью."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "Подтвердить пароль"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "Подписать"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Подписание этого сообщения может быть опасным. Эта подпись потенциально позволяет выполнить любую операцию от имени вашего счета, включая предоставление полного контроля над вашим счетом и всеми его активами запрашивающему сайту. Подписывайте это сообщение, только если вы знаете, что делаете, или полностью доверяете запрашивающему сайту."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Запрос подписи"
|
||||
},
|
||||
|
3
app/_locales/sk/messages.json
generated
3
app/_locales/sk/messages.json
generated
@ -797,9 +797,6 @@
|
||||
"sign": {
|
||||
"message": "Podepsat"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Podepsání zprávy může mít \nnebezpečný vedlejší učinek. Podepisujte zprávy pouze ze \nstránek, kterým plně důvěřujete celým svým účtem.\n Tato nebezpečná metoda bude odebrána v budoucí verzi. "
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Požadavek podpisu"
|
||||
},
|
||||
|
3
app/_locales/sl/messages.json
generated
3
app/_locales/sl/messages.json
generated
@ -813,9 +813,6 @@
|
||||
"sign": {
|
||||
"message": "Podpiši"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "To podpisovanje lahko povzroči \nnevarne stranske učinke. Podpisujte samo sporočila \nstrani, ki jim zaupate s svojim celotnim računom.\n Ta nevarna funkcija bo odstranjena v prihodnji različici. "
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Zahteva za podpis"
|
||||
},
|
||||
|
3
app/_locales/sr/messages.json
generated
3
app/_locales/sr/messages.json
generated
@ -816,9 +816,6 @@
|
||||
"sign": {
|
||||
"message": "Potpišite"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Potpisivanje ove poruke može imati \nopasne neželjene efekte. Potpisujte samo poruke sa \nsajtova u koje imate potpuno poverenje u pogledu svog naloga.\n Ovaj opasan metod će biti uklonjen u budućoj verziji."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Zahtev za potpis"
|
||||
},
|
||||
|
3
app/_locales/sv/messages.json
generated
3
app/_locales/sv/messages.json
generated
@ -809,9 +809,6 @@
|
||||
"sign": {
|
||||
"message": "Signera"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Att signera det här meddelandet kan få farliga följder. Signera endast meddelanden från sidor du vågar anförtro hela ditt konto åt. Den här farliga metoden kommer att avlägsnas i kommande versioner."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Signaturbegäran"
|
||||
},
|
||||
|
3
app/_locales/sw/messages.json
generated
3
app/_locales/sw/messages.json
generated
@ -803,9 +803,6 @@
|
||||
"sign": {
|
||||
"message": "Ingia kwenye akaunti"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Kusaini ujumbe huu kunaweza kuwa \nmadhara hatari. Saini ujumbe kutoka kwenye\ntovuti unazoziamini kabisa na akaunti yako yote tu.\nNjia hii ya hatari itaondolewa kwenye toleo la baadaye."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Ombi la Saini"
|
||||
},
|
||||
|
3
app/_locales/ta/messages.json
generated
3
app/_locales/ta/messages.json
generated
@ -410,9 +410,6 @@
|
||||
"sign": {
|
||||
"message": "உள்நுழை"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "இந்த செய்தியில் கையொப்பமிடலாம் \nஆபத்தான பக்க விளைவுகள் இருக்கலாம். \n உங்கள் மொத்த கணக்கில் முழுமையாக நம்பக்கூடிய தளங்களில் செய்திகளை மட்டுமே கையொப்பமிடுங்கள். \n இந்த ஆபத்தான முறை எதிர்கால பதிப்பில் அகற்றப்படும்."
|
||||
},
|
||||
"signed": {
|
||||
"message": "கையொப்பமிடப்பட்ட"
|
||||
},
|
||||
|
3
app/_locales/th/messages.json
generated
3
app/_locales/th/messages.json
generated
@ -404,9 +404,6 @@
|
||||
"sign": {
|
||||
"message": "เซ็นชื่อ"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "การเซ็นชื่อในข้อความนี้อาจจะเป็นอันตรายได้ \nเซ็นชื่อเฉพาะข้อความจากแหล่งที่คุณไว้วางใจได้จริง ๆ เท่านั้น \nวิธีที่อันตรายนี้จะถูกลบออกในอนาคต"
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "ขอลายเซ็น"
|
||||
},
|
||||
|
13
app/_locales/tl/messages.json
generated
13
app/_locales/tl/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "Kumpirmahin"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "Nagbibigay ka ng access sa $1, kabilang ang anumang maaaring maging pag-aari mo sa hinaharap. Ang partido sa kabilang panig ay maaaring maglipat ng mga NFT mula sa iyong wallet sa anumang oras nang hindi ka tinatanong hanggang sa bawiin mo ang pag-aprubang ito. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "lahat na NFT sa kontratang ito"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "Magpatuloy nang may pag-iingat."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "Kumpirmahin ang password"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "Lumagda"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Maaaring may mga \nmapanganib na side effect ang paglagda sa mensaheng ito. Lagdaan lang ang mga mensahe mula sa \nmga site na pinagkakatiwalaan mo para sa buong account mo.\n Tatanggalin ang mapanganib na paraang ito sa bersyon sa hinaharap."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Request na Paglagda"
|
||||
},
|
||||
|
13
app/_locales/tr/messages.json
generated
13
app/_locales/tr/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "Onayla"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "Gelecekte sahip olabileceğiniz her şey dahil olmak üzere şuna erişim izni veriyorsunuz: $1. Diğer uçtaki taraf siz bu onayı geri çekene kadar dilediği zaman size sormadan cüzdanınızdan NFT transfer edebilir. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "bu sözleşmedeki tüm NFT'ler"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "Dikkatli bir şekilde devam edin."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "Şifreyi onayla"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "İmza"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Bu mesajı imzalamak tehlikeli olabilir. Bu imza, hesabınızın tüm kontrolünü ve tüm varlıklarını talepte bulunan siteye vermek de dahil olmak üzere hesabınızın adına potansiyel olarak herhangi bir işlem gerçekleştirebilir. Sadece ne yaptığınızı biliyorsanız veya talepte bulunan siteye tamamen güveniyorsanız bu mesajı imzalayın."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "İmza Talebi"
|
||||
},
|
||||
|
3
app/_locales/uk/messages.json
generated
3
app/_locales/uk/messages.json
generated
@ -825,9 +825,6 @@
|
||||
"sign": {
|
||||
"message": "Підписати"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Підписування цього повідомлення може мати небезпечний побічний ефект. Підписуйте тільки повідомлення від сайтів, яким ви повністю довіряєте весь ваш обліковий запис. Цей небезпечний метод буде усунуто у майбутній версії."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Запит підпису"
|
||||
},
|
||||
|
13
app/_locales/vi/messages.json
generated
13
app/_locales/vi/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "Xác nhận"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "Bạn đang cấp quyền truy cập vào $1, bao gồm bất cứ tài sản nào mà bạn có thể sở hữu trong tương lai. Bên được cấp quyền có thể chuyển NFT khỏi ví của bạn bất cứ lúc nào mà không cần hỏi bạn cho đến khi bạn thu hồi sự chấp thuận này. $2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "tất cả NFT trên hợp đồng này"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "Hãy tiến hành thận trọng."
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "Xác nhận mật khẩu"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "Ký"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "Việc ký vào thông báo này có thể gây nguy hiểm. Chữ ký này có thể được dùng để thực hiện bất kỳ hành động nào thay mặt cho tài khoản của bạn, bao gồm cả cấp toàn quyền kiểm soát tài khoản và tất cả tài sản bên trong cho trang web yêu cầu. Chỉ ký vào thông báo này nếu bạn biết mình đang làm gì hoặc hoàn toàn tin tưởng trang web yêu cầu."
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "Yêu cầu chữ ký"
|
||||
},
|
||||
|
13
app/_locales/zh_CN/messages.json
generated
13
app/_locales/zh_CN/messages.json
generated
@ -598,16 +598,6 @@
|
||||
"confirm": {
|
||||
"message": "确认"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAll": {
|
||||
"message": "您正在向$1授予访问权限,包括对您将来可能拥有的任何资产的访问权限。另一端的一方可以随时从您的钱包中转移NFT,无需询问您,直到您撤销此项批准。$2",
|
||||
"description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder1": {
|
||||
"message": "此合约中的所有NFT"
|
||||
},
|
||||
"confirmPageDialogSetApprovalForAllPlaceholder2": {
|
||||
"message": "请谨慎行事。"
|
||||
},
|
||||
"confirmPassword": {
|
||||
"message": "确认密码"
|
||||
},
|
||||
@ -3139,9 +3129,6 @@
|
||||
"sign": {
|
||||
"message": "签名"
|
||||
},
|
||||
"signNotice": {
|
||||
"message": "谨慎行事。此操作有可能用来从您的账户提取资产。确保您信任此站点。"
|
||||
},
|
||||
"signatureRequest": {
|
||||
"message": "签名请求"
|
||||
},
|
||||
|
995
app/_locales/zh_TW/messages.json
generated
995
app/_locales/zh_TW/messages.json
generated
File diff suppressed because it is too large
Load Diff
@ -4,6 +4,8 @@
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
<script src="./snow.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./use-snow.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./globalthis.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./sentry-install.js" type="text/javascript" charset="utf-8"></script>
|
||||
{{@if(it.applyLavaMoat)}}
|
||||
|
@ -1,4 +1,4 @@
|
||||
{
|
||||
"description": "THIS IS THE METAMASK EXTENSION BETA, INTENDED FOR BETA TESTING",
|
||||
"name": "MetaMask BETA"
|
||||
"name": "MetaMask Beta"
|
||||
}
|
||||
|
@ -13,6 +13,8 @@
|
||||
<img class="loading-spinner" src="./images/spinner.gif" alt="" />
|
||||
</div>
|
||||
<div id="popover-content"></div>
|
||||
<script src="./snow.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./use-snow.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./globalthis.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./sentry-install.js" type="text/javascript" charset="utf-8"></script>
|
||||
{{@if(it.applyLavaMoat)}}
|
||||
|
Before Width: | Height: | Size: 196 B After Width: | Height: | Size: 196 B |
@ -1,3 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" id="icon-user-cirlce-add-filled" viewBox="0 0 512 512">
|
||||
<path d="m448 70c-14-17-36-27-60-27-23 0-43 9-58 24-9 9-15 20-19 31-3 8-4 17-4 26 0 15 4 30 12 42 4 7 9 13 15 18 14 13 33 21 54 21 9 0 18-1 25-4 19-6 35-19 45-35 4-7 7-15 9-23 2-6 2-13 2-19 0-21-8-40-21-54z m-30 69l-15 0 0 16c0 8-7 15-15 15-8 0-15-7-15-15l0-16-15 0c-9 0-15-7-15-15 0-9 6-16 15-16l15 0 0-14c0-8 7-15 15-15 8 0 15 7 15 15l0 14 15 0c9 0 16 7 16 16 0 8-7 15-16 15z m31 127c0-26-5-52-15-75-6 4-13 8-21 10-2 1-4 1-6 2 7 19 12 41 12 63 0 47-20 90-50 121-6-7-14-14-23-20-55-37-145-37-201 0-8 6-16 13-22 20-31-31-50-74-50-121 0-95 78-173 173-173 22 0 43 5 63 12 0-2 1-4 2-7 2-7 6-14 10-20-23-10-49-15-75-15-112 0-203 91-203 203 0 59 25 112 65 149 0 0 0 0 0 1 2 2 5 3 7 5 1 1 2 2 3 3 4 3 8 6 12 9 1 1 2 2 4 3 4 2 8 5 12 7 1 1 3 2 4 3 4 2 9 4 13 6 2 0 3 1 5 2 4 2 9 3 13 5 2 0 4 1 5 1 5 2 10 3 15 4 1 1 3 1 4 1 6 1 12 2 18 3 0 0 1 0 2 0 7 1 14 1 21 1 7 0 14 0 20-1 1 0 2 0 3 0 6-1 11-2 17-3 1 0 3-1 5-1 4-1 9-2 14-4 2 0 3-1 5-1 5-2 9-3 13-5 2-1 4-2 5-2 5-2 9-4 13-6 2-1 3-2 5-3 4-3 8-5 12-7 1-1 2-2 4-3 4-3 8-6 11-9 2-1 3-2 4-3 2-2 4-3 6-5 0-1 0-1 0-1 41-37 66-90 66-149z m-203-103c-42 0-76 34-76 76 0 42 32 75 75 76 0 0 1 0 2 0 0 0 1 0 1 0 0 0 0 0 0 0 42-1 74-34 74-76 0-42-34-76-76-76z"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.3 KiB |
@ -33,6 +33,8 @@
|
||||
<img id="loading__spinner" src="./images/spinner.gif" alt="" />
|
||||
</div>
|
||||
<div id="popover-content"></div>
|
||||
<script src="./snow.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./use-snow.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./globalthis.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./sentry-install.js" type="text/javascript" charset="utf-8"></script>
|
||||
{{@if(it.applyLavaMoat)}}
|
||||
|
@ -13,6 +13,8 @@
|
||||
<img class="loading-spinner" src="./images/spinner.gif" alt="" />
|
||||
</div>
|
||||
<div id="popover-content"></div>
|
||||
<script src="./snow.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./use-snow.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./globalthis.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script src="./sentry-install.js" type="text/javascript" charset="utf-8"></script>
|
||||
{{@if(it.applyLavaMoat)}}
|
||||
|
@ -127,6 +127,10 @@ chrome.runtime.onMessage.addListener(() => {
|
||||
return false;
|
||||
});
|
||||
|
||||
chrome.runtime.onStartup.addListener(() => {
|
||||
globalThis.isFirstTimeProfileLoaded = true;
|
||||
});
|
||||
|
||||
/*
|
||||
* This content script is injected programmatically because
|
||||
* MAIN world injection does not work properly via manifest
|
||||
|
@ -15,6 +15,7 @@ import {
|
||||
ENVIRONMENT_TYPE_POPUP,
|
||||
ENVIRONMENT_TYPE_NOTIFICATION,
|
||||
ENVIRONMENT_TYPE_FULLSCREEN,
|
||||
EXTENSION_MESSAGES,
|
||||
PLATFORM_FIREFOX,
|
||||
} from '../../shared/constants/app';
|
||||
import { SECOND } from '../../shared/constants/time';
|
||||
@ -25,6 +26,7 @@ import {
|
||||
EVENT_NAMES,
|
||||
TRAITS,
|
||||
} from '../../shared/constants/metametrics';
|
||||
import { checkForLastErrorAndLog } from '../../shared/modules/browser-runtime.utils';
|
||||
import { isManifestV3 } from '../../shared/modules/mv3.utils';
|
||||
import { maskObject } from '../../shared/modules/object.utils';
|
||||
import migrations from './migrations';
|
||||
@ -45,7 +47,7 @@ import rawFirstTimeState from './first-time-state';
|
||||
import getFirstPreferredLangCode from './lib/get-first-preferred-lang-code';
|
||||
import getObjStructure from './lib/getObjStructure';
|
||||
import setupEnsIpfsResolver from './lib/ens-ipfs/setup';
|
||||
import { getPlatform } from './lib/util';
|
||||
import { deferredPromise, getPlatform } from './lib/util';
|
||||
/* eslint-enable import/first */
|
||||
|
||||
const { sentry } = global;
|
||||
@ -92,22 +94,87 @@ const ACK_KEEP_ALIVE_MESSAGE = 'ACK_KEEP_ALIVE_MESSAGE';
|
||||
const WORKER_KEEP_ALIVE_MESSAGE = 'WORKER_KEEP_ALIVE_MESSAGE';
|
||||
|
||||
/**
|
||||
* In case of MV3 we attach a "onConnect" event listener as soon as the application is initialised.
|
||||
* Reason is that in case of MV3 a delay in doing this was resulting in missing first connect event after service worker is re-activated.
|
||||
* This deferred Promise is used to track whether initialization has finished.
|
||||
*
|
||||
* It is very important to ensure that `resolveInitialization` is *always*
|
||||
* called once initialization has completed, and that `rejectInitialization` is
|
||||
* called if initialization fails in an unrecoverable way.
|
||||
*/
|
||||
const {
|
||||
promise: isInitialized,
|
||||
resolve: resolveInitialization,
|
||||
reject: rejectInitialization,
|
||||
} = deferredPromise();
|
||||
|
||||
const initApp = async (remotePort) => {
|
||||
browser.runtime.onConnect.removeListener(initApp);
|
||||
await initialize(remotePort);
|
||||
log.info('MetaMask initialization complete.');
|
||||
/**
|
||||
* Sends a message to the dapp(s) content script to signal it can connect to MetaMask background as
|
||||
* the backend is not active. It is required to re-connect dapps after service worker re-activates.
|
||||
* For non-dapp pages, the message will be sent and ignored.
|
||||
*/
|
||||
const sendReadyMessageToTabs = async () => {
|
||||
const tabs = await browser.tabs
|
||||
.query({
|
||||
/**
|
||||
* Only query tabs that our extension can run in. To do this, we query for all URLs that our
|
||||
* extension can inject scripts in, which is by using the "<all_urls>" value and __without__
|
||||
* the "tabs" manifest permission. If we included the "tabs" permission, this would also fetch
|
||||
* URLs that we'd not be able to inject in, e.g. chrome://pages, chrome://extension, which
|
||||
* is not what we'd want.
|
||||
*
|
||||
* You might be wondering, how does the "url" param work without the "tabs" permission?
|
||||
*
|
||||
* @see {@link https://bugs.chromium.org/p/chromium/issues/detail?id=661311#c1}
|
||||
* "If the extension has access to inject scripts into Tab, then we can return the url
|
||||
* of Tab (because the extension could just inject a script to message the location.href)."
|
||||
*/
|
||||
url: '<all_urls>',
|
||||
windowType: 'normal',
|
||||
})
|
||||
.then((result) => {
|
||||
checkForLastErrorAndLog();
|
||||
return result;
|
||||
})
|
||||
.catch(() => {
|
||||
checkForLastErrorAndLog();
|
||||
});
|
||||
|
||||
/** @todo we should only sendMessage to dapp tabs, not all tabs. */
|
||||
for (const tab of tabs) {
|
||||
browser.tabs
|
||||
.sendMessage(tab.id, {
|
||||
name: EXTENSION_MESSAGES.READY,
|
||||
})
|
||||
.then(() => {
|
||||
checkForLastErrorAndLog();
|
||||
})
|
||||
.catch(() => {
|
||||
// An error may happen if the contentscript is blocked from loading,
|
||||
// and thus there is no runtime.onMessage handler to listen to the message.
|
||||
checkForLastErrorAndLog();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
if (isManifestV3) {
|
||||
browser.runtime.onConnect.addListener(initApp);
|
||||
} else {
|
||||
// initialization flow
|
||||
initialize().catch(log.error);
|
||||
}
|
||||
// These are set after initialization
|
||||
let connectRemote;
|
||||
let connectExternal;
|
||||
|
||||
browser.runtime.onConnect.addListener(async (...args) => {
|
||||
// Queue up connection attempts here, waiting until after initialization
|
||||
await isInitialized;
|
||||
|
||||
// This is set in `setupController`, which is called as part of initialization
|
||||
connectRemote(...args);
|
||||
});
|
||||
browser.runtime.onConnectExternal.addListener(async (...args) => {
|
||||
// Queue up connection attempts here, waiting until after initialization
|
||||
await isInitialized;
|
||||
|
||||
// This is set in `setupController`, which is called as part of initialization
|
||||
connectExternal(...args);
|
||||
});
|
||||
|
||||
initialize().catch(log.error);
|
||||
|
||||
/**
|
||||
* @typedef {import('../../shared/constants/transaction').TransactionMeta} TransactionMeta
|
||||
@ -167,17 +234,22 @@ if (isManifestV3) {
|
||||
/**
|
||||
* Initializes the MetaMask controller, and sets up all platform configuration.
|
||||
*
|
||||
* @param {string} remotePort - remote application port connecting to extension.
|
||||
* @returns {Promise} Setup complete.
|
||||
*/
|
||||
async function initialize(remotePort) {
|
||||
const initState = await loadStateFromPersistence();
|
||||
const initLangCode = await getFirstPreferredLangCode();
|
||||
setupController(initState, initLangCode, remotePort);
|
||||
if (!isManifestV3) {
|
||||
await loadPhishingWarningPage();
|
||||
async function initialize() {
|
||||
try {
|
||||
const initState = await loadStateFromPersistence();
|
||||
const initLangCode = await getFirstPreferredLangCode();
|
||||
setupController(initState, initLangCode);
|
||||
if (!isManifestV3) {
|
||||
await loadPhishingWarningPage();
|
||||
}
|
||||
await sendReadyMessageToTabs();
|
||||
log.info('MetaMask initialization complete.');
|
||||
resolveInitialization();
|
||||
} catch (error) {
|
||||
rejectInitialization(error);
|
||||
}
|
||||
log.info('MetaMask initialization complete.');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -309,9 +381,8 @@ async function loadStateFromPersistence() {
|
||||
*
|
||||
* @param {object} initState - The initial state to start the controller with, matches the state that is emitted from the controller.
|
||||
* @param {string} initLangCode - The region code for the language preferred by the current user.
|
||||
* @param {string} remoteSourcePort - remote application port connecting to extension.
|
||||
*/
|
||||
function setupController(initState, initLangCode, remoteSourcePort) {
|
||||
function setupController(initState, initLangCode) {
|
||||
//
|
||||
// MetaMask Controller
|
||||
//
|
||||
@ -360,16 +431,6 @@ function setupController(initState, initLangCode, remoteSourcePort) {
|
||||
|
||||
setupSentryGetStateGlobal(controller);
|
||||
|
||||
//
|
||||
// connect to other contexts
|
||||
//
|
||||
if (isManifestV3 && remoteSourcePort) {
|
||||
connectRemote(remoteSourcePort);
|
||||
}
|
||||
|
||||
browser.runtime.onConnect.addListener(connectRemote);
|
||||
browser.runtime.onConnectExternal.addListener(connectExternal);
|
||||
|
||||
const isClientOpenStatus = () => {
|
||||
return (
|
||||
popupIsOpen ||
|
||||
@ -410,7 +471,7 @@ function setupController(initState, initLangCode, remoteSourcePort) {
|
||||
*
|
||||
* @param {Port} remotePort - The port provided by a new context.
|
||||
*/
|
||||
function connectRemote(remotePort) {
|
||||
connectRemote = async (remotePort) => {
|
||||
const processName = remotePort.name;
|
||||
|
||||
if (metamaskBlockedPorts.includes(remotePort.name)) {
|
||||
@ -438,11 +499,6 @@ function setupController(initState, initLangCode, remoteSourcePort) {
|
||||
controller.setupTrustedCommunication(portStream, remotePort.sender);
|
||||
|
||||
if (isManifestV3) {
|
||||
// Message below if captured by UI code in app/scripts/ui.js which will trigger UI initialisation
|
||||
// This ensures that UI is initialised only after background is ready
|
||||
// It fixes the issue of blank screen coming when extension is loaded, the issue is very frequent in MV3
|
||||
remotePort.postMessage({ name: 'CONNECTION_READY' });
|
||||
|
||||
// If we get a WORKER_KEEP_ALIVE message, we respond with an ACK
|
||||
remotePort.onMessage.addListener((message) => {
|
||||
if (message.name === WORKER_KEEP_ALIVE_MESSAGE) {
|
||||
@ -513,16 +569,16 @@ function setupController(initState, initLangCode, remoteSourcePort) {
|
||||
}
|
||||
connectExternal(remotePort);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// communication with page or other extension
|
||||
function connectExternal(remotePort) {
|
||||
connectExternal = (remotePort) => {
|
||||
const portStream = new PortStream(remotePort);
|
||||
controller.setupUntrustedCommunication({
|
||||
connectionStream: portStream,
|
||||
sender: remotePort.sender,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
// User Interface setup
|
||||
|
@ -5,6 +5,8 @@ import browser from 'webextension-polyfill';
|
||||
import PortStream from 'extension-port-stream';
|
||||
import { obj as createThoughStream } from 'through2';
|
||||
|
||||
import { EXTENSION_MESSAGES, MESSAGE_TYPE } from '../../shared/constants/app';
|
||||
import { checkForLastError } from '../../shared/modules/browser-runtime.utils';
|
||||
import { isManifestV3 } from '../../shared/modules/mv3.utils';
|
||||
import shouldInjectProvider from '../../shared/modules/provider-injection';
|
||||
|
||||
@ -44,9 +46,6 @@ let legacyExtMux,
|
||||
legacyPagePublicConfigChannel,
|
||||
notificationTransformStream;
|
||||
|
||||
const WORKER_KEEP_ALIVE_INTERVAL = 1000;
|
||||
const WORKER_KEEP_ALIVE_MESSAGE = 'WORKER_KEEP_ALIVE_MESSAGE';
|
||||
|
||||
const phishingPageUrl = new URL(process.env.PHISHING_WARNING_PAGE_URL);
|
||||
|
||||
let phishingExtChannel,
|
||||
@ -82,6 +81,51 @@ function injectScript(content) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* SERVICE WORKER LOGIC
|
||||
*/
|
||||
|
||||
const WORKER_KEEP_ALIVE_INTERVAL = 1000;
|
||||
const WORKER_KEEP_ALIVE_MESSAGE = 'WORKER_KEEP_ALIVE_MESSAGE';
|
||||
const TIME_45_MIN_IN_MS = 45 * 60 * 1000;
|
||||
|
||||
/**
|
||||
* Don't run the keep-worker-alive logic for JSON-RPC methods called on initial load.
|
||||
* This is to prevent the service worker from being kept alive when accounts are not
|
||||
* connected to the dapp or when the user is not interacting with the extension.
|
||||
* The keep-alive logic should not work for non-dapp pages.
|
||||
*/
|
||||
const IGNORE_INIT_METHODS_FOR_KEEP_ALIVE = [
|
||||
MESSAGE_TYPE.GET_PROVIDER_STATE,
|
||||
MESSAGE_TYPE.SEND_METADATA,
|
||||
];
|
||||
|
||||
let keepAliveInterval;
|
||||
let keepAliveTimer;
|
||||
|
||||
/**
|
||||
* Running this method will ensure the service worker is kept alive for 45 minutes.
|
||||
* The first message is sent immediately and subsequent messages are sent at an
|
||||
* interval of WORKER_KEEP_ALIVE_INTERVAL.
|
||||
*/
|
||||
const runWorkerKeepAliveInterval = () => {
|
||||
clearTimeout(keepAliveTimer);
|
||||
|
||||
keepAliveTimer = setTimeout(() => {
|
||||
clearInterval(keepAliveInterval);
|
||||
}, TIME_45_MIN_IN_MS);
|
||||
|
||||
clearInterval(keepAliveInterval);
|
||||
|
||||
browser.runtime.sendMessage({ name: WORKER_KEEP_ALIVE_MESSAGE });
|
||||
|
||||
keepAliveInterval = setInterval(() => {
|
||||
if (browser.runtime.id) {
|
||||
browser.runtime.sendMessage({ name: WORKER_KEEP_ALIVE_MESSAGE });
|
||||
}
|
||||
}, WORKER_KEEP_ALIVE_INTERVAL);
|
||||
};
|
||||
|
||||
/**
|
||||
* PHISHING STREAM LOGIC
|
||||
*/
|
||||
@ -93,6 +137,10 @@ function setupPhishingPageStreams() {
|
||||
target: PHISHING_WARNING_PAGE,
|
||||
});
|
||||
|
||||
if (isManifestV3) {
|
||||
runWorkerKeepAliveInterval();
|
||||
}
|
||||
|
||||
// create and connect channel muxers
|
||||
// so we can handle the channels individually
|
||||
phishingPageMux = new ObjectMultiplex();
|
||||
@ -142,6 +190,9 @@ const setupPhishingExtStreams = () => {
|
||||
error,
|
||||
),
|
||||
);
|
||||
|
||||
// eslint-disable-next-line no-use-before-define
|
||||
phishingExtPort.onDisconnect.addListener(onDisconnectDestroyPhishingStreams);
|
||||
};
|
||||
|
||||
/** Destroys all of the phishing extension streams */
|
||||
@ -153,19 +204,54 @@ const destroyPhishingExtStreams = () => {
|
||||
|
||||
phishingExtChannel.removeAllListeners();
|
||||
phishingExtChannel.destroy();
|
||||
|
||||
phishingExtStream = null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Resets the extension stream with new streams to channel with the phishing page streams,
|
||||
* and creates a new event listener to the reestablished extension port.
|
||||
* This listener destroys the phishing extension streams when the extension port is disconnected,
|
||||
* so that streams may be re-established later the phishing extension port is reconnected.
|
||||
*/
|
||||
const resetPhishingStreamAndListeners = () => {
|
||||
phishingExtPort.onDisconnect.removeListener(resetPhishingStreamAndListeners);
|
||||
const onDisconnectDestroyPhishingStreams = () => {
|
||||
const err = checkForLastError();
|
||||
|
||||
phishingExtPort.onDisconnect.removeListener(
|
||||
onDisconnectDestroyPhishingStreams,
|
||||
);
|
||||
|
||||
destroyPhishingExtStreams();
|
||||
setupPhishingExtStreams();
|
||||
|
||||
phishingExtPort.onDisconnect.addListener(resetPhishingStreamAndListeners);
|
||||
/**
|
||||
* If an error is found, reset the streams. When running two or more dapps, resetting the service
|
||||
* worker may cause the error, "Error: Could not establish connection. Receiving end does not
|
||||
* exist.", due to a race-condition. The disconnect event may be called by runtime.connect which
|
||||
* may cause issues. We suspect that this is a chromium bug as this event should only be called
|
||||
* once the port and connections are ready. Delay time is arbitrary.
|
||||
*/
|
||||
if (err) {
|
||||
console.warn(`${err} Resetting the phishing streams.`);
|
||||
setTimeout(setupPhishingExtStreams, 1000);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* When the extension background is loaded it sends the EXTENSION_MESSAGES.READY message to the browser tabs.
|
||||
* This listener/callback receives the message to set up the streams after service worker in-activity.
|
||||
*
|
||||
* @param {object} msg
|
||||
* @param {string} msg.name - custom property and name to identify the message received
|
||||
* @returns {Promise|undefined}
|
||||
*/
|
||||
const onMessageSetUpPhishingStreams = (msg) => {
|
||||
if (msg.name === EXTENSION_MESSAGES.READY) {
|
||||
if (!phishingExtStream) {
|
||||
setupPhishingExtStreams();
|
||||
}
|
||||
return Promise.resolve(
|
||||
`MetaMask: handled "${EXTENSION_MESSAGES.READY}" for phishing streams`,
|
||||
);
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -177,7 +263,7 @@ const initPhishingStreams = () => {
|
||||
setupPhishingPageStreams();
|
||||
setupPhishingExtStreams();
|
||||
|
||||
phishingExtPort.onDisconnect.addListener(resetPhishingStreamAndListeners);
|
||||
browser.runtime.onMessage.addListener(onMessageSetUpPhishingStreams);
|
||||
};
|
||||
|
||||
/**
|
||||
@ -191,6 +277,14 @@ const setupPageStreams = () => {
|
||||
target: INPAGE,
|
||||
});
|
||||
|
||||
if (isManifestV3) {
|
||||
pageStream.on('data', ({ data: { method } }) => {
|
||||
if (!IGNORE_INIT_METHODS_FOR_KEEP_ALIVE.includes(method)) {
|
||||
runWorkerKeepAliveInterval();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// create and connect channel muxers
|
||||
// so we can handle the channels individually
|
||||
pageMux = new ObjectMultiplex();
|
||||
@ -203,9 +297,14 @@ const setupPageStreams = () => {
|
||||
pageChannel = pageMux.createStream(PROVIDER);
|
||||
};
|
||||
|
||||
// The field below is used to ensure that replay is done only once for each restart.
|
||||
let METAMASK_EXTENSION_CONNECT_SENT = false;
|
||||
|
||||
const setupExtensionStreams = () => {
|
||||
METAMASK_EXTENSION_CONNECT_SENT = true;
|
||||
extensionPort = browser.runtime.connect({ name: CONTENT_SCRIPT });
|
||||
extensionStream = new PortStream(extensionPort);
|
||||
extensionStream.on('data', extensionStreamMessageListener);
|
||||
|
||||
// create and connect channel muxers
|
||||
// so we can handle the channels individually
|
||||
@ -231,7 +330,8 @@ const setupExtensionStreams = () => {
|
||||
extensionPhishingStream = extensionMux.createStream('phishing');
|
||||
extensionPhishingStream.once('data', redirectToPhishingWarning);
|
||||
|
||||
notifyInpageOfExtensionStreamConnect();
|
||||
// eslint-disable-next-line no-use-before-define
|
||||
extensionPort.onDisconnect.addListener(onDisconnectDestroyStreams);
|
||||
};
|
||||
|
||||
/** Destroys all of the extension streams */
|
||||
@ -243,10 +343,13 @@ const destroyExtensionStreams = () => {
|
||||
|
||||
extensionChannel.removeAllListeners();
|
||||
extensionChannel.destroy();
|
||||
|
||||
extensionStream = null;
|
||||
};
|
||||
|
||||
/**
|
||||
* LEGACY STREAM LOGIC
|
||||
* TODO:LegacyProvider: Delete
|
||||
*/
|
||||
|
||||
// TODO:LegacyProvider: Delete
|
||||
@ -256,6 +359,14 @@ const setupLegacyPageStreams = () => {
|
||||
target: LEGACY_INPAGE,
|
||||
});
|
||||
|
||||
if (isManifestV3) {
|
||||
legacyPageStream.on('data', ({ data: { method } }) => {
|
||||
if (!IGNORE_INIT_METHODS_FOR_KEEP_ALIVE.includes(method)) {
|
||||
runWorkerKeepAliveInterval();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
legacyPageMux = new ObjectMultiplex();
|
||||
legacyPageMux.setMaxListeners(25);
|
||||
|
||||
@ -331,19 +442,47 @@ const destroyLegacyExtensionStreams = () => {
|
||||
};
|
||||
|
||||
/**
|
||||
* Resets the extension stream with new streams to channel with the in page streams,
|
||||
* and creates a new event listener to the reestablished extension port.
|
||||
* When the extension background is loaded it sends the EXTENSION_MESSAGES.READY message to the browser tabs.
|
||||
* This listener/callback receives the message to set up the streams after service worker in-activity.
|
||||
*
|
||||
* @param {object} msg
|
||||
* @param {string} msg.name - custom property and name to identify the message received
|
||||
* @returns {Promise|undefined}
|
||||
*/
|
||||
const resetStreamAndListeners = () => {
|
||||
extensionPort.onDisconnect.removeListener(resetStreamAndListeners);
|
||||
const onMessageSetUpExtensionStreams = (msg) => {
|
||||
if (msg.name === EXTENSION_MESSAGES.READY) {
|
||||
if (!extensionStream) {
|
||||
setupExtensionStreams();
|
||||
setupLegacyExtensionStreams();
|
||||
}
|
||||
return Promise.resolve(`MetaMask: handled ${EXTENSION_MESSAGES.READY}`);
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
/**
|
||||
* This listener destroys the extension streams when the extension port is disconnected,
|
||||
* so that streams may be re-established later when the extension port is reconnected.
|
||||
*/
|
||||
const onDisconnectDestroyStreams = () => {
|
||||
const err = checkForLastError();
|
||||
|
||||
extensionPort.onDisconnect.removeListener(onDisconnectDestroyStreams);
|
||||
|
||||
destroyExtensionStreams();
|
||||
setupExtensionStreams();
|
||||
|
||||
destroyLegacyExtensionStreams();
|
||||
setupLegacyExtensionStreams();
|
||||
|
||||
extensionPort.onDisconnect.addListener(resetStreamAndListeners);
|
||||
/**
|
||||
* If an error is found, reset the streams. When running two or more dapps, resetting the service
|
||||
* worker may cause the error, "Error: Could not establish connection. Receiving end does not
|
||||
* exist.", due to a race-condition. The disconnect event may be called by runtime.connect which
|
||||
* may cause issues. We suspect that this is a chromium bug as this event should only be called
|
||||
* once the port and connections are ready. Delay time is arbitrary.
|
||||
*/
|
||||
if (err) {
|
||||
console.warn(`${err} Resetting the streams.`);
|
||||
setTimeout(setupExtensionStreams, 1000);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@ -353,13 +492,12 @@ const resetStreamAndListeners = () => {
|
||||
*/
|
||||
const initStreams = () => {
|
||||
setupPageStreams();
|
||||
setupExtensionStreams();
|
||||
|
||||
// TODO:LegacyProvider: Delete
|
||||
setupLegacyPageStreams();
|
||||
|
||||
setupExtensionStreams();
|
||||
setupLegacyExtensionStreams();
|
||||
|
||||
extensionPort.onDisconnect.addListener(resetStreamAndListeners);
|
||||
browser.runtime.onMessage.addListener(onMessageSetUpExtensionStreams);
|
||||
};
|
||||
|
||||
// TODO:LegacyProvider: Delete
|
||||
@ -390,23 +528,35 @@ function logStreamDisconnectWarning(remoteLabel, error) {
|
||||
}
|
||||
|
||||
/**
|
||||
* The function send message to inpage to notify it of extension stream connection
|
||||
* The function notifies inpage when the extension stream connection is ready. When the
|
||||
* 'metamask_chainChanged' method is received from the extension, it implies that the
|
||||
* background state is completely initialized and it is ready to process method calls.
|
||||
* This is used as a notification to replay any pending messages in MV3.
|
||||
*
|
||||
* @param {object} msg - instance of message received
|
||||
*/
|
||||
function notifyInpageOfExtensionStreamConnect() {
|
||||
window.postMessage(
|
||||
{
|
||||
target: INPAGE, // the post-message-stream "target"
|
||||
data: {
|
||||
// this object gets passed to obj-multiplex
|
||||
name: PROVIDER, // the obj-multiplex channel name
|
||||
function extensionStreamMessageListener(msg) {
|
||||
if (
|
||||
METAMASK_EXTENSION_CONNECT_SENT &&
|
||||
isManifestV3 &&
|
||||
msg.data.method === 'metamask_chainChanged'
|
||||
) {
|
||||
METAMASK_EXTENSION_CONNECT_SENT = false;
|
||||
window.postMessage(
|
||||
{
|
||||
target: INPAGE, // the post-message-stream "target"
|
||||
data: {
|
||||
jsonrpc: '2.0',
|
||||
method: 'METAMASK_EXTENSION_STREAM_CONNECT',
|
||||
// this object gets passed to obj-multiplex
|
||||
name: PROVIDER, // the obj-multiplex channel name
|
||||
data: {
|
||||
jsonrpc: '2.0',
|
||||
method: 'METAMASK_EXTENSION_CONNECT_CAN_RETRY',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
window.location.origin,
|
||||
);
|
||||
window.location.origin,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -446,12 +596,6 @@ function redirectToPhishingWarning(data = {}) {
|
||||
window.location.href = `${baseUrl}#${querystring}`;
|
||||
}
|
||||
|
||||
const initKeepWorkerAlive = () => {
|
||||
setInterval(() => {
|
||||
browser.runtime.sendMessage({ name: WORKER_KEEP_ALIVE_MESSAGE });
|
||||
}, WORKER_KEEP_ALIVE_INTERVAL);
|
||||
};
|
||||
|
||||
const start = () => {
|
||||
const isDetectedPhishingSite =
|
||||
window.location.origin === phishingPageUrl.origin &&
|
||||
@ -463,9 +607,7 @@ const start = () => {
|
||||
}
|
||||
|
||||
if (shouldInjectProvider()) {
|
||||
if (isManifestV3) {
|
||||
initKeepWorkerAlive();
|
||||
} else {
|
||||
if (!isManifestV3) {
|
||||
injectScript(inpageBundle);
|
||||
}
|
||||
initStreams();
|
||||
|
@ -3,12 +3,12 @@ import sinon from 'sinon';
|
||||
import nock from 'nock';
|
||||
import { ObservableStore } from '@metamask/obs-store';
|
||||
import BigNumber from 'bignumber.js';
|
||||
import { ControllerMessenger } from '@metamask/base-controller';
|
||||
import {
|
||||
ControllerMessenger,
|
||||
TokenListController,
|
||||
TokensController,
|
||||
AssetsContractController,
|
||||
} from '@metamask/controllers';
|
||||
} from '@metamask/assets-controllers';
|
||||
import { NETWORK_TYPES } from '../../../shared/constants/network';
|
||||
import { toChecksumHexAddress } from '../../../shared/modules/hexstring-utils';
|
||||
import DetectTokensController from './detect-tokens';
|
||||
|
@ -27,6 +27,11 @@ export default class EnsController {
|
||||
}
|
||||
|
||||
this.store = new ObservableStore(initState);
|
||||
|
||||
this.resetState = () => {
|
||||
this.store.updateState(initState);
|
||||
};
|
||||
|
||||
onNetworkDidChange(() => {
|
||||
this.store.putState(initState);
|
||||
const chainId = getCurrentChainId();
|
||||
|
@ -2,7 +2,7 @@ import { ObservableStore } from '@metamask/obs-store';
|
||||
import log from 'loglevel';
|
||||
import BN from 'bn.js';
|
||||
import createId from '../../../shared/modules/random-id';
|
||||
import { bnToHex } from '../lib/util';
|
||||
import { bnToHex, previousValueComparator } from '../lib/util';
|
||||
import getFetchWithTimeout from '../../../shared/modules/fetch-with-timeout';
|
||||
|
||||
import {
|
||||
@ -61,10 +61,12 @@ export default class IncomingTransactionsController {
|
||||
onNetworkDidChange,
|
||||
getCurrentChainId,
|
||||
preferencesController,
|
||||
onboardingController,
|
||||
} = opts;
|
||||
this.blockTracker = blockTracker;
|
||||
this.getCurrentChainId = getCurrentChainId;
|
||||
this.preferencesController = preferencesController;
|
||||
this.onboardingController = onboardingController;
|
||||
|
||||
this._onLatestBlock = async (newBlockNumberHex) => {
|
||||
const selectedAddress = this.preferencesController.getSelectedAddress();
|
||||
@ -121,6 +123,17 @@ export default class IncomingTransactionsController {
|
||||
}, this.preferencesController.store.getState()),
|
||||
);
|
||||
|
||||
this.onboardingController.store.subscribe(
|
||||
previousValueComparator(async (prevState, currState) => {
|
||||
const { completedOnboarding: prevCompletedOnboarding } = prevState;
|
||||
const { completedOnboarding: currCompletedOnboarding } = currState;
|
||||
if (!prevCompletedOnboarding && currCompletedOnboarding) {
|
||||
const address = this.preferencesController.getSelectedAddress();
|
||||
await this._update(address);
|
||||
}
|
||||
}, this.onboardingController.store.getState()),
|
||||
);
|
||||
|
||||
onNetworkDidChange(async () => {
|
||||
const address = this.preferencesController.getSelectedAddress();
|
||||
await this._update(address);
|
||||
@ -154,8 +167,13 @@ export default class IncomingTransactionsController {
|
||||
* @param {number} [newBlockNumberDec] - block number to begin fetching from
|
||||
*/
|
||||
async _update(address, newBlockNumberDec) {
|
||||
const { completedOnboarding } = this.onboardingController.store.getState();
|
||||
const chainId = this.getCurrentChainId();
|
||||
if (!etherscanSupportedNetworks.includes(chainId) || !address) {
|
||||
if (
|
||||
!etherscanSupportedNetworks.includes(chainId) ||
|
||||
!address ||
|
||||
!completedOnboarding
|
||||
) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
@ -293,31 +311,3 @@ export default class IncomingTransactionsController {
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a function with arity 1 that caches the argument that the function
|
||||
* is called with and invokes the comparator with both the cached, previous,
|
||||
* value and the current value. If specified, the initialValue will be passed
|
||||
* in as the previous value on the first invocation of the returned method.
|
||||
*
|
||||
* @template A - The type of the compared value.
|
||||
* @param {(prevValue: A, nextValue: A) => void} comparator - A method to compare
|
||||
* the previous and next values.
|
||||
* @param {A} [initialValue] - The initial value to supply to prevValue
|
||||
* on first call of the method.
|
||||
*/
|
||||
function previousValueComparator(comparator, initialValue) {
|
||||
let first = true;
|
||||
let cache;
|
||||
return (value) => {
|
||||
try {
|
||||
if (first) {
|
||||
first = false;
|
||||
return comparator(initialValue ?? value, value);
|
||||
}
|
||||
return comparator(cache, value);
|
||||
} finally {
|
||||
cache = value;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -77,6 +77,17 @@ function getMockPreferencesController({
|
||||
};
|
||||
}
|
||||
|
||||
function getMockOnboardingController() {
|
||||
return {
|
||||
store: {
|
||||
getState: sinon.stub().returns({
|
||||
completedOnboarding: true,
|
||||
}),
|
||||
subscribe: sinon.spy(),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function getMockBlockTracker() {
|
||||
return {
|
||||
addListener: sinon.stub().callsArgWithAsync(1, '0xa'),
|
||||
@ -169,6 +180,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...mockedNetworkMethods,
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: {},
|
||||
},
|
||||
);
|
||||
@ -199,6 +211,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -217,6 +230,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: {},
|
||||
},
|
||||
);
|
||||
@ -239,6 +253,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -344,6 +359,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -394,6 +410,7 @@ describe('IncomingTransactionsController', function () {
|
||||
preferencesController: getMockPreferencesController({
|
||||
showIncomingTransactions: false,
|
||||
}),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -441,6 +458,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -486,6 +504,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -533,6 +552,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -624,6 +644,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: { ...getMockBlockTracker() },
|
||||
...getMockNetworkControllerMethods(),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -685,6 +706,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...mockedNetworkMethods,
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -768,6 +790,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...mockedNetworkMethods,
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -822,6 +845,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getEmptyInitState(),
|
||||
getCurrentChainId: () => CHAIN_IDS.GOERLI,
|
||||
});
|
||||
@ -858,6 +882,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getEmptyInitState(),
|
||||
getCurrentChainId: () => CHAIN_IDS.GOERLI,
|
||||
});
|
||||
@ -911,6 +936,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
getCurrentChainId: () => CHAIN_IDS.GOERLI,
|
||||
});
|
||||
@ -951,6 +977,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
getCurrentChainId: () => CHAIN_IDS.GOERLI,
|
||||
},
|
||||
@ -1026,6 +1053,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -1049,6 +1077,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.MAINNET),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -1072,6 +1101,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -1095,6 +1125,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -1128,6 +1159,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -1156,6 +1188,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -1179,6 +1212,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -1225,6 +1259,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
@ -1271,6 +1306,7 @@ describe('IncomingTransactionsController', function () {
|
||||
blockTracker: getMockBlockTracker(),
|
||||
...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI),
|
||||
preferencesController: getMockPreferencesController(),
|
||||
onboardingController: getMockOnboardingController(),
|
||||
initState: getNonEmptyInitState(),
|
||||
},
|
||||
);
|
||||
|
@ -91,8 +91,6 @@ export default class MetaMetricsController {
|
||||
* networkDidChange event emitted by the networkController
|
||||
* @param {Function} options.getCurrentChainId - Gets the current chain id from the
|
||||
* network controller
|
||||
* @param {Function} options.getNetworkIdentifier - Gets the current network
|
||||
* identifier from the network controller
|
||||
* @param {string} options.version - The version of the extension
|
||||
* @param {string} options.environment - The environment the extension is running in
|
||||
* @param {string} options.extension - webextension-polyfill
|
||||
@ -104,7 +102,6 @@ export default class MetaMetricsController {
|
||||
preferencesStore,
|
||||
onNetworkDidChange,
|
||||
getCurrentChainId,
|
||||
getNetworkIdentifier,
|
||||
version,
|
||||
environment,
|
||||
initState,
|
||||
@ -120,7 +117,6 @@ export default class MetaMetricsController {
|
||||
};
|
||||
const prefState = preferencesStore.getState();
|
||||
this.chainId = getCurrentChainId();
|
||||
this.network = getNetworkIdentifier();
|
||||
this.locale = prefState.currentLocale.replace('_', '-');
|
||||
this.version =
|
||||
environment === 'production' ? version : `${version}-${environment}`;
|
||||
@ -150,7 +146,6 @@ export default class MetaMetricsController {
|
||||
|
||||
onNetworkDidChange(() => {
|
||||
this.chainId = getCurrentChainId();
|
||||
this.network = getNetworkIdentifier();
|
||||
});
|
||||
this.segment = segment;
|
||||
|
||||
@ -470,7 +465,6 @@ export default class MetaMetricsController {
|
||||
properties: {
|
||||
params,
|
||||
locale: this.locale,
|
||||
network: this.network,
|
||||
chain_id: this.chainId,
|
||||
environment_type: environmentType,
|
||||
},
|
||||
@ -668,7 +662,6 @@ export default class MetaMetricsController {
|
||||
value,
|
||||
currency,
|
||||
category,
|
||||
network: properties?.network ?? this.network,
|
||||
locale: this.locale,
|
||||
chain_id: properties?.chain_id ?? this.chainId,
|
||||
environment_type: environmentType,
|
||||
@ -706,15 +699,14 @@ export default class MetaMetricsController {
|
||||
},
|
||||
[],
|
||||
),
|
||||
[TRAITS.NFT_AUTODETECTION_ENABLED]: metamaskState.useCollectibleDetection,
|
||||
[TRAITS.NFT_AUTODETECTION_ENABLED]: metamaskState.useNftDetection,
|
||||
[TRAITS.NUMBER_OF_ACCOUNTS]: Object.values(metamaskState.identities)
|
||||
.length,
|
||||
[TRAITS.NUMBER_OF_NFT_COLLECTIONS]: this._getAllUniqueNFTAddressesLength(
|
||||
metamaskState.allCollectibles,
|
||||
metamaskState.allNfts,
|
||||
),
|
||||
[TRAITS.NUMBER_OF_NFTS]: this._getAllNFTsFlattened(
|
||||
metamaskState.allCollectibles,
|
||||
).length,
|
||||
[TRAITS.NUMBER_OF_NFTS]: this._getAllNFTsFlattened(metamaskState.allNfts)
|
||||
.length,
|
||||
[TRAITS.NUMBER_OF_TOKENS]: this._getNumberOfTokens(metamaskState),
|
||||
[TRAITS.OPENSEA_API_ENABLED]: metamaskState.openSeaEnabled,
|
||||
[TRAITS.THREE_BOX_ENABLED]: false, // deprecated, hard-coded as false
|
||||
@ -765,11 +757,11 @@ export default class MetaMetricsController {
|
||||
* Returns an array of all of the collectibles/NFTs the user
|
||||
* possesses across all networks and accounts.
|
||||
*
|
||||
* @param {object} allCollectibles
|
||||
* @param {object} allNfts
|
||||
* @returns {[]}
|
||||
*/
|
||||
_getAllNFTsFlattened = memoize((allCollectibles = {}) => {
|
||||
return Object.values(allCollectibles).reduce((result, chainNFTs) => {
|
||||
_getAllNFTsFlattened = memoize((allNfts = {}) => {
|
||||
return Object.values(allNfts).reduce((result, chainNFTs) => {
|
||||
return result.concat(...Object.values(chainNFTs));
|
||||
}, []);
|
||||
});
|
||||
@ -778,11 +770,11 @@ export default class MetaMetricsController {
|
||||
* Returns the number of unique collectible/NFT addresses the user
|
||||
* possesses across all networks and accounts.
|
||||
*
|
||||
* @param {object} allCollectibles
|
||||
* @param {object} allNfts
|
||||
* @returns {number}
|
||||
*/
|
||||
_getAllUniqueNFTAddressesLength(allCollectibles = {}) {
|
||||
const allNFTAddresses = this._getAllNFTsFlattened(allCollectibles).map(
|
||||
_getAllUniqueNFTAddressesLength(allNfts = {}) {
|
||||
const allNFTAddresses = this._getAllNFTsFlattened(allNfts).map(
|
||||
(nft) => nft.address,
|
||||
);
|
||||
const uniqueAddresses = new Set(allNFTAddresses);
|
||||
|
@ -8,7 +8,11 @@ import {
|
||||
TRAITS,
|
||||
} from '../../../shared/constants/metametrics';
|
||||
import waitUntilCalled from '../../../test/lib/wait-until-called';
|
||||
import { CHAIN_IDS, CURRENCY_SYMBOLS } from '../../../shared/constants/network';
|
||||
import {
|
||||
CHAIN_IDS,
|
||||
CURRENCY_SYMBOLS,
|
||||
NETWORK_TYPES,
|
||||
} from '../../../shared/constants/network';
|
||||
import * as Utils from '../lib/util';
|
||||
import MetaMetricsController from './metametrics';
|
||||
import { NETWORK_EVENTS } from './network';
|
||||
@ -16,7 +20,6 @@ import { NETWORK_EVENTS } from './network';
|
||||
const segment = createSegmentMock(2, 10000);
|
||||
|
||||
const VERSION = '0.0.1-test';
|
||||
const NETWORK = 'Mainnet';
|
||||
const FAKE_CHAIN_ID = '0x1338';
|
||||
const LOCALE = 'en_US';
|
||||
const TEST_META_METRICS_ID = '0xabc';
|
||||
@ -46,7 +49,6 @@ const DEFAULT_TEST_CONTEXT = {
|
||||
const DEFAULT_SHARED_PROPERTIES = {
|
||||
chain_id: FAKE_CHAIN_ID,
|
||||
locale: LOCALE.replace('_', '-'),
|
||||
network: NETWORK,
|
||||
environment_type: 'background',
|
||||
};
|
||||
|
||||
@ -64,7 +66,7 @@ const DEFAULT_PAGE_PROPERTIES = {
|
||||
|
||||
function getMockNetworkController(
|
||||
chainId = FAKE_CHAIN_ID,
|
||||
provider = { type: NETWORK },
|
||||
provider = { type: NETWORK_TYPES.MAINNET },
|
||||
) {
|
||||
let networkStore = { chainId, provider };
|
||||
const on = sinon.stub().withArgs(NETWORK_EVENTS.NETWORK_DID_CHANGE);
|
||||
@ -130,8 +132,6 @@ function getMetaMetricsController({
|
||||
} = {}) {
|
||||
return new MetaMetricsController({
|
||||
segment: segmentInstance || segment,
|
||||
getNetworkIdentifier:
|
||||
networkController.getNetworkIdentifier.bind(networkController),
|
||||
getCurrentChainId:
|
||||
networkController.getCurrentChainId.bind(networkController),
|
||||
onNetworkDidChange: networkController.on.bind(
|
||||
@ -178,7 +178,6 @@ describe('MetaMetricsController', function () {
|
||||
});
|
||||
const metaMetricsController = getMetaMetricsController();
|
||||
assert.strictEqual(metaMetricsController.version, VERSION);
|
||||
assert.strictEqual(metaMetricsController.network, NETWORK);
|
||||
assert.strictEqual(metaMetricsController.chainId, FAKE_CHAIN_ID);
|
||||
assert.strictEqual(
|
||||
metaMetricsController.state.participateInMetaMetrics,
|
||||
@ -203,14 +202,12 @@ describe('MetaMetricsController', function () {
|
||||
const metaMetricsController = getMetaMetricsController({
|
||||
networkController,
|
||||
});
|
||||
assert.strictEqual(metaMetricsController.network, NETWORK);
|
||||
networkController.store.updateState({
|
||||
provider: {
|
||||
type: 'NEW_NETWORK',
|
||||
},
|
||||
chainId: '0xaab',
|
||||
});
|
||||
assert.strictEqual(metaMetricsController.network, 'NEW_NETWORK');
|
||||
assert.strictEqual(metaMetricsController.chainId, '0xaab');
|
||||
});
|
||||
|
||||
@ -219,7 +216,6 @@ describe('MetaMetricsController', function () {
|
||||
const metaMetricsController = getMetaMetricsController({
|
||||
preferencesStore,
|
||||
});
|
||||
assert.strictEqual(metaMetricsController.network, NETWORK);
|
||||
preferencesStore.updateState({
|
||||
currentLocale: 'en_UK',
|
||||
});
|
||||
@ -717,7 +713,7 @@ describe('MetaMetricsController', function () {
|
||||
[CHAIN_IDS.MAINNET]: [{ address: '0x' }],
|
||||
[CHAIN_IDS.GOERLI]: [{ address: '0x' }, { address: '0x0' }],
|
||||
},
|
||||
allCollectibles: {
|
||||
allNfts: {
|
||||
'0xac706cE8A9BF27Afecf080fB298d0ee13cfb978A': {
|
||||
56: [
|
||||
{
|
||||
@ -752,7 +748,7 @@ describe('MetaMetricsController', function () {
|
||||
identities: [{}, {}],
|
||||
ledgerTransportType: 'web-hid',
|
||||
openSeaEnabled: true,
|
||||
useCollectibleDetection: false,
|
||||
useNftDetection: false,
|
||||
theme: 'default',
|
||||
useTokenDetection: true,
|
||||
});
|
||||
@ -790,7 +786,7 @@ describe('MetaMetricsController', function () {
|
||||
ledgerTransportType: 'web-hid',
|
||||
openSeaEnabled: true,
|
||||
identities: [{}, {}],
|
||||
useCollectibleDetection: false,
|
||||
useNftDetection: false,
|
||||
theme: 'default',
|
||||
useTokenDetection: true,
|
||||
});
|
||||
@ -810,7 +806,7 @@ describe('MetaMetricsController', function () {
|
||||
ledgerTransportType: 'web-hid',
|
||||
openSeaEnabled: false,
|
||||
identities: [{}, {}, {}],
|
||||
useCollectibleDetection: false,
|
||||
useNftDetection: false,
|
||||
theme: 'default',
|
||||
useTokenDetection: true,
|
||||
});
|
||||
@ -838,7 +834,7 @@ describe('MetaMetricsController', function () {
|
||||
ledgerTransportType: 'web-hid',
|
||||
openSeaEnabled: true,
|
||||
identities: [{}, {}],
|
||||
useCollectibleDetection: true,
|
||||
useNftDetection: true,
|
||||
theme: 'default',
|
||||
useTokenDetection: true,
|
||||
});
|
||||
@ -856,7 +852,7 @@ describe('MetaMetricsController', function () {
|
||||
ledgerTransportType: 'web-hid',
|
||||
openSeaEnabled: true,
|
||||
identities: [{}, {}],
|
||||
useCollectibleDetection: true,
|
||||
useNftDetection: true,
|
||||
theme: 'default',
|
||||
useTokenDetection: true,
|
||||
});
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { CaveatMutatorOperation } from '@metamask/controllers';
|
||||
import { CaveatMutatorOperation } from '@metamask/permission-controller';
|
||||
import { CaveatTypes } from '../../../../shared/constants/permissions';
|
||||
|
||||
/**
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { CaveatMutatorOperation } from '@metamask/controllers';
|
||||
import { CaveatMutatorOperation } from '@metamask/permission-controller';
|
||||
import { CaveatTypes } from '../../../../shared/constants/permissions';
|
||||
import { CaveatMutatorFactories } from './caveat-mutators';
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { endowmentPermissionBuilders } from '@metamask/snap-controllers';
|
||||
import { endowmentPermissionBuilders } from '@metamask/snaps-controllers';
|
||||
import {
|
||||
restrictedMethodPermissionBuilders,
|
||||
selectHooks,
|
||||
|
@ -1,6 +1,9 @@
|
||||
import { constructPermission, PermissionType } from '@metamask/controllers';
|
||||
import {
|
||||
constructPermission,
|
||||
PermissionType,
|
||||
} from '@metamask/permission-controller';
|
||||
///: BEGIN:ONLY_INCLUDE_IN(flask)
|
||||
import { endowmentCaveatSpecifications as snapsEndowmentCaveatSpecifications } from '@metamask/snap-controllers';
|
||||
import { endowmentCaveatSpecifications as snapsEndowmentCaveatSpecifications } from '@metamask/snaps-controllers';
|
||||
import { caveatSpecifications as snapsCaveatsSpecifications } from '@metamask/rpc-methods';
|
||||
///: END:ONLY_INCLUDE_IN
|
||||
import {
|
||||
@ -11,7 +14,7 @@ import {
|
||||
/**
|
||||
* This file contains the specifications of the permissions and caveats
|
||||
* that are recognized by our permission system. See the PermissionController
|
||||
* README in @metamask/snap-controllers for details.
|
||||
* README in @metamask/controllers for details.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -16,7 +16,7 @@ describe('PermissionController specifications', () => {
|
||||
describe('caveat specifications', () => {
|
||||
it('getCaveatSpecifications returns the expected specifications object', () => {
|
||||
const caveatSpecifications = getCaveatSpecifications({});
|
||||
expect(Object.keys(caveatSpecifications)).toHaveLength(5);
|
||||
expect(Object.keys(caveatSpecifications)).toHaveLength(7);
|
||||
expect(
|
||||
caveatSpecifications[CaveatTypes.restrictReturnedAccounts].type,
|
||||
).toStrictEqual(CaveatTypes.restrictReturnedAccounts);
|
||||
@ -33,6 +33,12 @@ describe('PermissionController specifications', () => {
|
||||
expect(caveatSpecifications.snapCronjob.type).toStrictEqual(
|
||||
SnapCaveatType.SnapCronjob,
|
||||
);
|
||||
expect(caveatSpecifications.transactionOrigin.type).toStrictEqual(
|
||||
SnapCaveatType.TransactionOrigin,
|
||||
);
|
||||
expect(caveatSpecifications.rpcOrigin.type).toStrictEqual(
|
||||
SnapCaveatType.RpcOrigin,
|
||||
);
|
||||
});
|
||||
|
||||
describe('restrictReturnedAccounts', () => {
|
||||
|
@ -35,11 +35,12 @@ export default class PreferencesController {
|
||||
useNonceField: false,
|
||||
usePhishDetect: true,
|
||||
dismissSeedBackUpReminder: false,
|
||||
useMultiAccountBalanceChecker: true,
|
||||
|
||||
// set to true means the dynamic list from the API is being used
|
||||
// set to false will be using the static list from contract-metadata
|
||||
useTokenDetection: false,
|
||||
useCollectibleDetection: false,
|
||||
useNftDetection: false,
|
||||
openSeaEnabled: false,
|
||||
advancedGasFee: null,
|
||||
|
||||
@ -70,6 +71,7 @@ export default class PreferencesController {
|
||||
: LEDGER_TRANSPORT_TYPES.U2F,
|
||||
theme: 'light',
|
||||
improvedTokenAllowanceEnabled: false,
|
||||
transactionSecurityCheckEnabled: false,
|
||||
...opts.initState,
|
||||
};
|
||||
|
||||
@ -125,6 +127,16 @@ export default class PreferencesController {
|
||||
this.store.updateState({ usePhishDetect: val });
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for the `useMultiAccountBalanceChecker` property
|
||||
*
|
||||
* @param {boolean} val - Whether or not the user wants to fetch balances for
|
||||
* all accounts that he has added to the MetaMask wallet state.
|
||||
*/
|
||||
setUseMultiAccountBalanceChecker(val) {
|
||||
this.store.updateState({ useMultiAccountBalanceChecker: val });
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for the `useTokenDetection` property
|
||||
*
|
||||
@ -142,12 +154,12 @@ export default class PreferencesController {
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for the `useCollectibleDetection` property
|
||||
* Setter for the `useNftDetection` property
|
||||
*
|
||||
* @param {boolean} useCollectibleDetection - Whether or not the user prefers to autodetect collectibles.
|
||||
* @param {boolean} useNftDetection - Whether or not the user prefers to autodetect collectibles.
|
||||
*/
|
||||
setUseCollectibleDetection(useCollectibleDetection) {
|
||||
this.store.updateState({ useCollectibleDetection });
|
||||
setUseNftDetection(useNftDetection) {
|
||||
this.store.updateState({ useNftDetection });
|
||||
}
|
||||
|
||||
/**
|
||||
@ -199,6 +211,17 @@ export default class PreferencesController {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for the `transactionSecurityCheckEnabled` property
|
||||
*
|
||||
* @param transactionSecurityCheckEnabled
|
||||
*/
|
||||
setTransactionSecurityCheckEnabled(transactionSecurityCheckEnabled) {
|
||||
this.store.updateState({
|
||||
transactionSecurityCheckEnabled,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new methodData to state, to avoid requesting this information again through Infura
|
||||
*
|
||||
|
@ -1,9 +1,7 @@
|
||||
import { strict as assert } from 'assert';
|
||||
import sinon from 'sinon';
|
||||
import {
|
||||
ControllerMessenger,
|
||||
TokenListController,
|
||||
} from '@metamask/controllers';
|
||||
import { ControllerMessenger } from '@metamask/base-controller';
|
||||
import { TokenListController } from '@metamask/assets-controllers';
|
||||
import { CHAIN_IDS } from '../../../shared/constants/network';
|
||||
import PreferencesController from './preferences';
|
||||
import NetworkController from './network';
|
||||
@ -289,6 +287,28 @@ describe('preferences controller', function () {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('setUseMultiAccountBalanceChecker', function () {
|
||||
it('should default to true', function () {
|
||||
const state = preferencesController.store.getState();
|
||||
assert.equal(state.useMultiAccountBalanceChecker, true);
|
||||
});
|
||||
|
||||
it('should set the setUseMultiAccountBalanceChecker property in state', function () {
|
||||
assert.equal(
|
||||
preferencesController.store.getState().useMultiAccountBalanceChecker,
|
||||
true,
|
||||
);
|
||||
|
||||
preferencesController.setUseMultiAccountBalanceChecker(false);
|
||||
|
||||
assert.equal(
|
||||
preferencesController.store.getState().useMultiAccountBalanceChecker,
|
||||
false,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('setUseTokenDetection', function () {
|
||||
it('should default to false', function () {
|
||||
const state = preferencesController.store.getState();
|
||||
@ -308,21 +328,21 @@ describe('preferences controller', function () {
|
||||
});
|
||||
});
|
||||
|
||||
describe('setUseCollectibleDetection', function () {
|
||||
describe('setUseNftDetection', function () {
|
||||
it('should default to false', function () {
|
||||
const state = preferencesController.store.getState();
|
||||
assert.equal(state.useCollectibleDetection, false);
|
||||
assert.equal(state.useNftDetection, false);
|
||||
});
|
||||
|
||||
it('should set the useCollectibleDetection property in state', function () {
|
||||
it('should set the useNftDetection property in state', function () {
|
||||
assert.equal(
|
||||
preferencesController.store.getState().useCollectibleDetection,
|
||||
preferencesController.store.getState().useNftDetection,
|
||||
false,
|
||||
);
|
||||
preferencesController.setOpenSeaEnabled(true);
|
||||
preferencesController.setUseCollectibleDetection(true);
|
||||
preferencesController.setUseNftDetection(true);
|
||||
assert.equal(
|
||||
preferencesController.store.getState().useCollectibleDetection,
|
||||
preferencesController.store.getState().useNftDetection,
|
||||
true,
|
||||
);
|
||||
});
|
||||
|
@ -115,6 +115,10 @@ export default class SwapsController {
|
||||
swapsState: { ...initialState.swapsState },
|
||||
});
|
||||
|
||||
this.resetState = () => {
|
||||
this.store.updateState({ swapsState: { ...initialState.swapsState } });
|
||||
};
|
||||
|
||||
this._fetchTradesInfo = fetchTradesInfo;
|
||||
this._getCurrentChainId = getCurrentChainId;
|
||||
this._getEIP1559GasFeeEstimates = getEIP1559GasFeeEstimates;
|
||||
|
@ -151,6 +151,11 @@ export default class TransactionController extends EventEmitter {
|
||||
this.getTokenStandardAndDetails = opts.getTokenStandardAndDetails;
|
||||
|
||||
this.memStore = new ObservableStore({});
|
||||
|
||||
this.resetState = () => {
|
||||
this._updateMemstore();
|
||||
};
|
||||
|
||||
this.query = new EthQuery(this.provider);
|
||||
|
||||
this.txGasUtil = new TxGasUtil(this.provider);
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { ObservableStore } from '@metamask/obs-store';
|
||||
import { getPersistentState } from '@metamask/controllers';
|
||||
import { getPersistentState } from '@metamask/base-controller';
|
||||
|
||||
/**
|
||||
* @typedef {import('@metamask/controllers').ControllerMessenger} ControllerMessenger
|
||||
* @typedef {import('@metamask/base-controller').ControllerMessenger} ControllerMessenger
|
||||
*/
|
||||
|
||||
/**
|
||||
@ -13,7 +13,7 @@ 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`
|
||||
* extends one of the two base controllers in the `@metamask/base-controller`
|
||||
* package.
|
||||
*
|
||||
* @type {Record<string, object>}
|
||||
@ -46,7 +46,7 @@ export default class ComposableObservableStore extends ObservableStore {
|
||||
* @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.
|
||||
* controllers in the `@metamask/base-controller` package.
|
||||
*/
|
||||
updateStructure(config) {
|
||||
this.config = config;
|
||||
|
@ -3,7 +3,7 @@ import {
|
||||
BaseController,
|
||||
BaseControllerV2,
|
||||
ControllerMessenger,
|
||||
} from '@metamask/controllers';
|
||||
} from '@metamask/base-controller';
|
||||
import ComposableObservableStore from './ComposableObservableStore';
|
||||
|
||||
class OldExampleController extends BaseController {
|
||||
|
@ -30,6 +30,7 @@ import {
|
||||
SINGLE_CALL_BALANCES_ADDRESS_FANTOM,
|
||||
SINGLE_CALL_BALANCES_ADDRESS_ARBITRUM,
|
||||
} from '../constants/contracts';
|
||||
import { previousValueComparator } from './util';
|
||||
|
||||
/**
|
||||
* This module is responsible for tracking any number of accounts and caching their current balances & transaction
|
||||
@ -62,6 +63,10 @@ export default class AccountTracker {
|
||||
};
|
||||
this.store = new ObservableStore(initState);
|
||||
|
||||
this.resetState = () => {
|
||||
this.store.updateState(initState);
|
||||
};
|
||||
|
||||
this._provider = opts.provider;
|
||||
this._query = pify(new EthQuery(this._provider));
|
||||
this._blockTracker = opts.blockTracker;
|
||||
@ -74,8 +79,20 @@ export default class AccountTracker {
|
||||
this._updateForBlock = this._updateForBlock.bind(this);
|
||||
this.getCurrentChainId = opts.getCurrentChainId;
|
||||
this.getNetworkIdentifier = opts.getNetworkIdentifier;
|
||||
this.preferencesController = opts.preferencesController;
|
||||
this.onboardingController = opts.onboardingController;
|
||||
|
||||
this.ethersProvider = new ethers.providers.Web3Provider(this._provider);
|
||||
|
||||
this.onboardingController.store.subscribe(
|
||||
previousValueComparator(async (prevState, currState) => {
|
||||
const { completedOnboarding: prevCompletedOnboarding } = prevState;
|
||||
const { completedOnboarding: currCompletedOnboarding } = currState;
|
||||
if (!prevCompletedOnboarding && currCompletedOnboarding) {
|
||||
this._updateAccounts();
|
||||
}
|
||||
}, this.onboardingController.store.getState()),
|
||||
);
|
||||
}
|
||||
|
||||
start() {
|
||||
@ -201,8 +218,24 @@ export default class AccountTracker {
|
||||
* @returns {Promise} after all account balances updated
|
||||
*/
|
||||
async _updateAccounts() {
|
||||
const { accounts } = this.store.getState();
|
||||
const addresses = Object.keys(accounts);
|
||||
const { completedOnboarding } = this.onboardingController.store.getState();
|
||||
if (!completedOnboarding) {
|
||||
return;
|
||||
}
|
||||
const { useMultiAccountBalanceChecker } =
|
||||
this.preferencesController.store.getState();
|
||||
|
||||
let addresses = [];
|
||||
if (useMultiAccountBalanceChecker) {
|
||||
const { accounts } = this.store.getState();
|
||||
|
||||
addresses = Object.keys(accounts);
|
||||
} else {
|
||||
const selectedAddress = this.preferencesController.getSelectedAddress();
|
||||
|
||||
addresses = [selectedAddress];
|
||||
}
|
||||
|
||||
const chainId = this.getCurrentChainId();
|
||||
const networkId = this.getNetworkIdentifier();
|
||||
const rpcUrl = 'http://127.0.0.1:8545';
|
||||
|
23
app/scripts/lib/createDupeReqFilterMiddleware.js
Normal file
23
app/scripts/lib/createDupeReqFilterMiddleware.js
Normal file
@ -0,0 +1,23 @@
|
||||
import log from 'loglevel';
|
||||
|
||||
/**
|
||||
* Returns a middleware that filters out requests already seen
|
||||
*
|
||||
* @returns {Function}
|
||||
*/
|
||||
export default function createDupeReqFilterMiddleware() {
|
||||
const processedRequestId = [];
|
||||
return function filterDuplicateRequestMiddleware(
|
||||
/** @type {any} */ req,
|
||||
/** @type {any} */ _res,
|
||||
/** @type {Function} */ next,
|
||||
/** @type {Function} */ end,
|
||||
) {
|
||||
if (processedRequestId.indexOf(req.id) >= 0) {
|
||||
log.info(`RPC request with id ${req.id} already seen.`);
|
||||
return end();
|
||||
}
|
||||
processedRequestId.push(req.id);
|
||||
return next();
|
||||
};
|
||||
}
|
30
app/scripts/lib/createDupeReqFilterMiddleware.test.js
Normal file
30
app/scripts/lib/createDupeReqFilterMiddleware.test.js
Normal file
@ -0,0 +1,30 @@
|
||||
import createDupeReqFilterMiddleware from './createDupeReqFilterMiddleware';
|
||||
|
||||
describe('createDupeReqFilterMiddleware', () => {
|
||||
it('call function next if request is seen first time', () => {
|
||||
const filterFn = createDupeReqFilterMiddleware();
|
||||
const request = { id: 1 };
|
||||
const nextMock = jest.fn();
|
||||
const endMock = jest.fn();
|
||||
|
||||
filterFn(request, undefined, nextMock, endMock);
|
||||
|
||||
expect(nextMock).toBeCalledTimes(1);
|
||||
expect(endMock).not.toBeCalled();
|
||||
});
|
||||
|
||||
it('call function end if request is seen second time', () => {
|
||||
const filterFn = createDupeReqFilterMiddleware();
|
||||
const request = { id: 1 };
|
||||
const nextMock = jest.fn();
|
||||
const endMock = jest.fn();
|
||||
|
||||
filterFn(request, undefined, nextMock, endMock);
|
||||
expect(nextMock).toBeCalledTimes(1);
|
||||
expect(endMock).not.toBeCalled();
|
||||
|
||||
filterFn(request, undefined, nextMock, endMock);
|
||||
expect(nextMock).toBeCalledTimes(1);
|
||||
expect(endMock).toBeCalledTimes(1);
|
||||
});
|
||||
});
|
@ -41,6 +41,14 @@ export default class DecryptMessageManager extends EventEmitter {
|
||||
unapprovedDecryptMsgs: {},
|
||||
unapprovedDecryptMsgCount: 0,
|
||||
});
|
||||
|
||||
this.resetState = () => {
|
||||
this.memStore.updateState({
|
||||
unapprovedDecryptMsgs: {},
|
||||
unapprovedDecryptMsgCount: 0,
|
||||
});
|
||||
};
|
||||
|
||||
this.messages = [];
|
||||
this.metricsEvent = opts.metricsEvent;
|
||||
}
|
||||
|
@ -36,6 +36,14 @@ export default class EncryptionPublicKeyManager extends EventEmitter {
|
||||
unapprovedEncryptionPublicKeyMsgs: {},
|
||||
unapprovedEncryptionPublicKeyMsgCount: 0,
|
||||
});
|
||||
|
||||
this.resetState = () => {
|
||||
this.memStore.updateState({
|
||||
unapprovedEncryptionPublicKeyMsgs: {},
|
||||
unapprovedEncryptionPublicKeyMsgCount: 0,
|
||||
});
|
||||
};
|
||||
|
||||
this.messages = [];
|
||||
this.metricsEvent = opts.metricsEvent;
|
||||
}
|
||||
|
@ -36,6 +36,14 @@ export default class MessageManager extends EventEmitter {
|
||||
unapprovedMsgs: {},
|
||||
unapprovedMsgCount: 0,
|
||||
});
|
||||
|
||||
this.resetState = () => {
|
||||
this.memStore.updateState({
|
||||
unapprovedMsgs: {},
|
||||
unapprovedMsgCount: 0,
|
||||
});
|
||||
};
|
||||
|
||||
this.messages = [];
|
||||
this.metricsEvent = metricsEvent;
|
||||
}
|
||||
|
@ -43,6 +43,14 @@ export default class PersonalMessageManager extends EventEmitter {
|
||||
unapprovedPersonalMsgs: {},
|
||||
unapprovedPersonalMsgCount: 0,
|
||||
});
|
||||
|
||||
this.resetState = () => {
|
||||
this.memStore.updateState({
|
||||
unapprovedPersonalMsgs: {},
|
||||
unapprovedPersonalMsgCount: 0,
|
||||
});
|
||||
};
|
||||
|
||||
this.messages = [];
|
||||
this.metricsEvent = metricsEvent;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
///: BEGIN:ONLY_INCLUDE_IN(flask)
|
||||
import { handlers as permittedSnapMethods } from '@metamask/rpc-methods/dist/permitted';
|
||||
///: END:ONLY_INCLUDE_IN
|
||||
import { permissionRpcMethods } from '@metamask/controllers';
|
||||
import { permissionRpcMethods } from '@metamask/permission-controller';
|
||||
import { selectHooks } from '@metamask/rpc-methods/dist/utils';
|
||||
import { ethErrors } from 'eth-rpc-errors';
|
||||
import { flatten } from 'lodash';
|
||||
|
@ -11,7 +11,6 @@ import {
|
||||
isSafeChainId,
|
||||
} from '../../../../../shared/modules/network.utils';
|
||||
import { jsonRpcRequest } from '../../../../../shared/modules/rpc.utils';
|
||||
import { CHAIN_ID_TO_NETWORK_ID_MAP } from '../../../../../shared/constants/network';
|
||||
|
||||
const addEthereumChain = {
|
||||
methodNames: [MESSAGE_TYPE.ADD_ETHEREUM_CHAIN],
|
||||
@ -140,14 +139,6 @@ async function addEthereumChainHandler(
|
||||
);
|
||||
}
|
||||
|
||||
if (CHAIN_ID_TO_NETWORK_ID_MAP[_chainId]) {
|
||||
return end(
|
||||
ethErrors.rpc.invalidParams({
|
||||
message: `May not specify default MetaMask chain.`,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
const existingNetwork = findCustomRpcBy({ chainId: _chainId });
|
||||
|
||||
// if the request is to add a network that is already added and configured
|
||||
@ -289,13 +280,6 @@ async function addEthereumChainHandler(
|
||||
}),
|
||||
);
|
||||
|
||||
let rpcUrlOrigin;
|
||||
try {
|
||||
rpcUrlOrigin = new URL(firstValidRPCUrl).origin;
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
|
||||
sendMetrics({
|
||||
event: 'Custom Network Added',
|
||||
category: EVENT.CATEGORIES.NETWORK,
|
||||
@ -304,19 +288,9 @@ async function addEthereumChainHandler(
|
||||
},
|
||||
properties: {
|
||||
chain_id: _chainId,
|
||||
network_name: _chainName,
|
||||
// Including network to override the default network
|
||||
// property included in all events. For RPC type networks
|
||||
// the MetaMetrics controller uses the rpcUrl for the network
|
||||
// property.
|
||||
network: rpcUrlOrigin,
|
||||
symbol: ticker,
|
||||
block_explorer_url: firstValidBlockExplorerUrl,
|
||||
source: EVENT.SOURCE.TRANSACTION.DAPP,
|
||||
},
|
||||
sensitiveProperties: {
|
||||
rpc_url: rpcUrlOrigin,
|
||||
},
|
||||
});
|
||||
|
||||
// Once the network has been added, the requested is considered successful
|
||||
|
@ -6,6 +6,7 @@ import {
|
||||
NETWORK_TO_NAME_MAP,
|
||||
CHAIN_ID_TO_RPC_URL_MAP,
|
||||
CURRENCY_SYMBOLS,
|
||||
NETWORK_TYPES,
|
||||
} from '../../../../../shared/constants/network';
|
||||
import {
|
||||
isPrefixedFormattedHexString,
|
||||
@ -107,7 +108,10 @@ async function switchEthereumChainHandler(
|
||||
type: MESSAGE_TYPE.SWITCH_ETHEREUM_CHAIN,
|
||||
requestData,
|
||||
});
|
||||
if (chainId in CHAIN_ID_TO_TYPE_MAP) {
|
||||
if (
|
||||
chainId in CHAIN_ID_TO_TYPE_MAP &&
|
||||
approvedRequestData.type !== NETWORK_TYPES.LOCALHOST
|
||||
) {
|
||||
setProviderType(approvedRequestData.type);
|
||||
} else {
|
||||
await updateRpcTarget(approvedRequestData);
|
||||
|
@ -1,6 +1,8 @@
|
||||
import KeyringController from 'eth-keyring-controller';
|
||||
import log from 'loglevel';
|
||||
|
||||
import { KEYRING_TYPES } from '../../../shared/constants/keyrings';
|
||||
|
||||
const seedPhraseVerifier = {
|
||||
/**
|
||||
* Verifies if the seed words can restore the accounts.
|
||||
@ -20,7 +22,9 @@ const seedPhraseVerifier = {
|
||||
}
|
||||
|
||||
const keyringController = new KeyringController({});
|
||||
const Keyring = keyringController.getKeyringClassForType('HD Key Tree');
|
||||
const Keyring = keyringController.getKeyringClassForType(
|
||||
KEYRING_TYPES.HD_KEY_TREE,
|
||||
);
|
||||
const opts = {
|
||||
mnemonic: seedPhrase,
|
||||
numberOfAccounts: createdAccounts.length,
|
||||
|
@ -6,12 +6,13 @@ import { cloneDeep } from 'lodash';
|
||||
import KeyringController from 'eth-keyring-controller';
|
||||
import firstTimeState from '../first-time-state';
|
||||
import mockEncryptor from '../../../test/lib/mock-encryptor';
|
||||
import { KEYRING_TYPES } from '../../../shared/constants/keyrings';
|
||||
import seedPhraseVerifier from './seed-phrase-verifier';
|
||||
|
||||
describe('SeedPhraseVerifier', () => {
|
||||
describe('verifyAccounts', () => {
|
||||
const password = 'passw0rd1';
|
||||
const hdKeyTree = 'HD Key Tree';
|
||||
const hdKeyTree = KEYRING_TYPES.HD_KEY_TREE;
|
||||
|
||||
let keyringController;
|
||||
let primaryKeyring;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user