1
0
Fork 0

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

* origin/develop: (352 commits)
  Update PPOM Validator (#20738)
  Update Snap privacy warning content (#20741)
  Use versioned URL for `manageAccounts` test (#20739)
  fix(readme): yarn v3 no longer required (#20713)
  fix(20548): fix warning levels in migration file (#20737)
  Add missing derivation path names (#20735)
  feat(locale): New Crowdin translations by Github Action (#20563)
  Blockaid validation should be done on ethereum mainnet only (#20709)
  Reverting ppom.js file to old version (#20566)
  Added Specification for opBNB as a multilayer network (#20715)
  Use transactions array in frontend (#20523)
  Add what's new popup for snaps (#20686)
  Fix position of a warning triangle icon on Snap Install Warning (#20712)
  Reduce logging in production builds (#20694)
  Add resolution for `semver` (#20710)
  feat: Update Blockaid copies on What's new modal, Settings, and BannerAlert (#20671)
  add whatsnew popup to drop ledger support for firefox (#19498)
  AvatarIcon prod updates and some deprecated fixes (#20557)
  Fix missing property on snap export metric (#20685)
  Subscribe to event fired by KeyringController on account removal (#20478)
  ...
This commit is contained in:
Mark Stacey 2023-09-05 17:02:38 -02:30
commit 3c900794a2
1146 changed files with 67146 additions and 45566 deletions

View File

@ -3,16 +3,16 @@ version: 2.1
executors:
node-browsers:
docker:
- image: cimg/node:16.20-browsers
- image: cimg/node:18.17-browsers
node-browsers-medium-plus:
docker:
- image: cimg/node:16.20-browsers
- image: cimg/node:18.17-browsers
resource_class: medium+
environment:
NODE_OPTIONS: --max_old_space_size=2048
node-browsers-large:
docker:
- image: cimg/node:16.20-browsers
- image: cimg/node:18.17-browsers
resource_class: large
environment:
NODE_OPTIONS: --max_old_space_size=2048
@ -101,6 +101,9 @@ workflows:
build-type: [main, beta, flask, mmi, desktop]
requires:
- prep-deps
- prep-build-mmi:
requires:
- prep-deps
- prep-build:
requires:
- prep-deps
@ -144,6 +147,9 @@ workflows:
- test-e2e-firefox:
requires:
- prep-build-test
- test-e2e-chrome-rpc:
requires:
- prep-build-test
- test-e2e-chrome-snaps:
requires:
- prep-build-test
@ -192,6 +198,9 @@ workflows:
ignore: master
requires:
- prep-build-desktop
- validate-source-maps-mmi:
requires:
- prep-build-mmi
- validate-source-maps-flask:
requires:
- prep-build-flask
@ -212,6 +221,7 @@ workflows:
- prep-build-flask
- all-tests-pass:
requires:
- test-deps-depcheck
- validate-lavamoat-allow-scripts
- validate-lavamoat-policy-build
- validate-lavamoat-policy-webapp
@ -228,6 +238,7 @@ workflows:
- validate-source-maps-beta
- validate-source-maps-desktop
- validate-source-maps-flask
- validate-source-maps-mmi
- test-mozilla-lint
- test-mozilla-lint-desktop
- test-mozilla-lint-flask
@ -251,6 +262,7 @@ workflows:
- prep-build
- trigger-beta-build
- prep-build-desktop
- prep-build-mmi
- prep-build-flask
- prep-build-storybook
- prep-build-ts-migration-dashboard
@ -267,6 +279,7 @@ workflows:
- prep-deps
- prep-build
- prep-build-desktop
- prep-build-mmi
- prep-build-flask
- all-tests-pass
- job-publish-storybook:
@ -347,27 +360,9 @@ jobs:
# required and add the new dependencies, and the cache will be persisted.
- dependency-cache-v1-
- 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: Install dependencies
command: |
if [[ $IS_DRAFT == 'true' ]]
then
# Use GitHub registry on draft PRs, allowing the use of preview builds
METAMASK_NPM_REGISTRY=https://npm.pkg.github.com yarn --immutable
else
yarn --immutable
fi
command: .circleci/scripts/install-dependencies.sh
- save_cache:
key: dependency-cache-v1-{{ checksum "yarn.lock" }}
paths:
@ -478,6 +473,49 @@ jobs:
- dist-desktop
- builds-desktop
prep-build-mmi:
executor: node-browsers-medium-plus
steps:
- run: *shallow-git-clone
- attach_workspace:
at: .
- when:
condition:
not:
matches:
pattern: /^master$/
value: << pipeline.git.branch >>
steps:
- run:
name: build:dist
command: yarn build --build-type mmi dist
- when:
condition:
matches:
pattern: /^master$/
value: << pipeline.git.branch >>
steps:
- run:
name: build:prod
command: yarn build --build-type mmi prod
- run:
name: build:debug
command: find dist/ -type f -exec md5sum {} \; | sort -k 2
- run:
name: Move mmi build to 'dist-mmi' to avoid conflict with production build
command: mv ./dist ./dist-mmi
- run:
name: Move mmi zips to 'builds-mmi' to avoid conflict with production build
command: mv ./builds ./builds-mmi
- persist_to_workspace:
root: .
paths:
- dist-mmi
- builds-mmi
- store_artifacts:
path: builds-mmi
destination: builds-mmi
prep-build-flask:
executor: node-browsers-medium-plus
steps:
@ -663,6 +701,9 @@ jobs:
- run:
name: lockfile-lint
command: yarn lint:lockfile
- run:
name: check yarn resolutions
command: yarn --check-resolutions
test-lint-changelog:
executor: node-browsers
@ -698,7 +739,7 @@ jobs:
at: .
- run:
name: yarn audit
command: .circleci/scripts/yarn-audit.sh
command: yarn audit
test-deps-depcheck:
executor: node-browsers
@ -775,6 +816,43 @@ jobs:
path: test-artifacts
destination: test-artifacts
test-e2e-chrome-rpc:
executor: node-browsers
parallelism: 1
steps:
- checkout
- run:
name: Re-Install Chrome
command: ./.circleci/scripts/chrome-install.sh
- attach_workspace:
at: .
- run:
name: Move test build to dist
command: mv ./dist-test ./dist
- run:
name: Move test zips to builds
command: mv ./builds-test ./builds
- run:
name: test:e2e:chrome:rpc
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:chrome:rpc --retries 2
fi
no_output_timeout: 20m
- run:
name: Merge JUnit report
command: |
if [ "$(ls -A test/test-results/e2e)" ]; then
yarn test:e2e:report
fi
when: always
- store_artifacts:
path: test-artifacts
destination: test-artifacts
- store_test_results:
path: test/test-results/e2e.xml
test-e2e-firefox-snaps:
executor: node-browsers
parallelism: 4
@ -1268,6 +1346,22 @@ jobs:
name: Validate source maps
command: yarn validate-source-maps
validate-source-maps-mmi:
executor: node-browsers
steps:
- run: *shallow-git-clone
- attach_workspace:
at: .
- run:
name: Move mmi build to dist
command: mv ./dist-mmi ./dist
- run:
name: Move mmi zips to builds
command: mv ./builds-mmi ./builds
- run:
name: Validate source maps
command: yarn validate-source-maps
validate-source-maps-flask:
executor: node-browsers
steps:

View File

@ -0,0 +1,42 @@
#!/usr/bin/env bash
set -e
set -o pipefail
IS_NON_FORK_DRAFT='false'
if [[ -n $CIRCLE_PULL_REQUEST ]] && gh auth status
then
PR_NUMBER="${CIRCLE_PULL_REQUEST##*/}"
if [ -n "$PR_NUMBER" ]
then
IS_NON_FORK_DRAFT="$(gh pr view --json isDraft --jq '.isDraft' "$PR_NUMBER")"
fi
fi
# Build query to see whether there are any "preview-like" packages in the manifest
# A "preview-like" package is a `@metamask`-scoped package with a prerelease version that has no period.
QUERY='.dependencies + .devDependencies' # Get list of all dependencies
QUERY+=' | with_entries( select(.key | startswith("@metamask") ) )' # filter to @metamask-scoped packages
QUERY+=' | to_entries[].value' # Get version ranges
QUERY+=' | select(test("^\\d+\\.\\d+\\.\\d+-[^.]+$"))' # Get pinned versions where the prerelease part has no "."
# Use `-e` flag so that exit code indicates whether any matches were found
if jq -e "${QUERY}" < ./package.json
then
echo "Preview builds detected"
HAS_PREVIEW_BUILDS='true'
else
echo "No preview builds detected"
HAS_PREVIEW_BUILDS='false'
fi
if [[ $IS_NON_FORK_DRAFT == 'true' && $HAS_PREVIEW_BUILDS == 'true' ]]
then
# Use GitHub registry on draft PRs, allowing the use of preview builds
echo "Installing with preview builds"
METAMASK_NPM_REGISTRY=https://npm.pkg.github.com yarn --immutable
else
echo "Installing without preview builds"
yarn --immutable
fi

View File

@ -1,24 +0,0 @@
#!/usr/bin/env bash
set -e
set -u
set -x
set -o pipefail
# use `improved-yarn-audit` since that allows for exclude
# exclusions are in .iyarc now
yarn run improved-yarn-audit \
--ignore-dev-deps \
--min-severity moderate \
--fail-on-missing-exclusions
audit_status="$?"
if [[ "$audit_status" != 0 ]]
then
count="$(yarn npm audit --severity moderate --environment production --json | tail -1 | jq '.data.vulnerabilities.moderate + .data.vulnerabilities.high + .data.vulnerabilities.critical')"
printf "Audit shows %s moderate or high severity advisories _in the production dependencies_\n" "$count"
exit 1
else
printf "Audit shows _zero_ moderate or high severity advisories _in the production dependencies_\n"
fi

View File

@ -45,7 +45,6 @@ ignores:
- 'playwright'
- 'wait-on'
# development tool
- 'improved-yarn-audit'
- 'nyc'
# storybook
- '@storybook/cli'

View File

@ -72,5 +72,8 @@ module.exports = {
// upgrading eslint and dependencies. This rule should be evaluated and
// if agreeable turned on upstream in @metamask/eslint-config
'import/no-named-as-default-member': 'off',
// This is necessary to run eslint on Windows and not get a thousand CRLF errors
'prettier/prettier': ['error', { endOfLine: 'auto' }],
},
};

View File

@ -239,6 +239,7 @@ module.exports = {
'app/scripts/controllers/app-state.test.js',
'app/scripts/controllers/mmi-controller.test.js',
'app/scripts/controllers/permissions/**/*.test.js',
'app/scripts/controllers/preferences.test.js',
'app/scripts/lib/**/*.test.js',
'app/scripts/migrations/*.test.js',
'app/scripts/platforms/*.test.js',
@ -246,6 +247,7 @@ module.exports = {
'shared/**/*.test.js',
'ui/**/*.test.js',
'ui/__mocks__/*.js',
'test/e2e/helpers.test.js',
],
extends: ['@metamask/eslint-config-mocha'],
rules: {
@ -267,14 +269,17 @@ module.exports = {
'app/scripts/controllers/app-state.test.js',
'app/scripts/controllers/mmi-controller.test.js',
'app/scripts/controllers/permissions/**/*.test.js',
'app/scripts/controllers/preferences.test.js',
'app/scripts/lib/**/*.test.js',
'app/scripts/migrations/*.test.js',
'app/scripts/platforms/*.test.js',
'development/**/*.test.js',
'development/**/*.test.ts',
'shared/**/*.test.js',
'shared/**/*.test.ts',
'test/helpers/*.js',
'test/jest/*.js',
'test/e2e/helpers.test.js',
'ui/**/*.test.js',
'ui/__mocks__/*.js',
'shared/lib/error-utils.test.js',

View File

@ -20,5 +20,6 @@ When you're done with your project / bugfix / feature and ready to submit a PR,
- [ ] **Keep it simple**: Try not to include multiple features in a single PR, and don't make extraneous changes outside the scope of your contribution. All those touched files make things harder to review ;)
- [ ] **PR against `develop`**: Submit your PR against the `develop` branch. This is where we merge new features so they get some time to receive extra testing before being pushed to `master` for production. If your PR is a hot-fix that needs to be published urgently, you may submit a PR against the `master` branch, but this PR will receive tighter scrutiny before merging.
- [ ] **Get reviewed by a core contributor**: Make sure you get a `:thumbsup`, `:+1`, or `LGTM` from a user with a `Member` badge before merging.
- [ ] **Ensure the PR is correctly labeled.**: More detail about labels definitions can be found [here](https://github.com/MetaMask/metamask-extension/blob/develop/.github/LABELING_GUIDELINES.md).
And that's it! Thanks for helping out.

24
.github/LABELING_GUIDELINES.md vendored Normal file
View File

@ -0,0 +1,24 @@
# PR Labeling Guidelines
To maintain a consistent and efficient development workflow, we have set specific label guidelines for all pull requests (PRs). Please ensure you adhere to the following instructions:
### Mandatory Labels:
- **Internal Developers**: Every PR raised by an internal developer must include a label prefixed with `team-` (e.g., `team-extension-ux`, `team-extension-platform`, etc.). This indicates the respective internal team responsible for the PR.
- **External Contributors**: PRs from contributors outside the organization must have the `external-contributor` label.
It's essential to ensure that PRs have the appropriate labels before they are considered for merging.
### Prohibited Labels:
Any PR that includes one of the following labels can not be merged:
- **needs-qa**: The PR requires a full manual QA prior to being added to a release.
- **QA'd but questions**: The PR has been checked by QA, but there are pending questions or clarifications needed on minor issues that were found.
- **issues-found**: The PR has been checked by QA or other reviewers, and appeared to include issues that need to be addressed.
- **need-ux-ds-review**: The PR requires a review from the User Experience or Design System teams.
- **blocked**: There are unresolved dependencies or other issues blocking the progress of this PR.
- **stale**: The PR has not had recent activity in the last 90 days. It will be closed in 7 days.
- **DO-NOT-MERGE**: The PR should not be merged under any circumstances.
To maintain code quality and project integrity, it's crucial to respect these label guidelines. Please ensure you review and update labels appropriately throughout the PR lifecycle.
Thank you for your cooperation!

View File

@ -0,0 +1,97 @@
import * as core from '@actions/core';
import { context, getOctokit } from '@actions/github';
import { GitHub } from '@actions/github/lib/utils';
main().catch((error: Error): void => {
console.error(error);
process.exit(1);
});
async function main(): Promise<void> {
// "GITHUB_TOKEN" is an automatically generated, repository-specific access token provided by GitHub Actions.
const githubToken = process.env.GITHUB_TOKEN;
if (!githubToken) {
core.setFailed('GITHUB_TOKEN not found');
process.exit(1);
}
// Initialise octokit, required to call Github GraphQL API
const octokit: InstanceType<typeof GitHub> = getOctokit(githubToken);
// Retrieve pull request info from context
const prRepoOwner = context.repo.owner;
const prRepoName = context.repo.repo;
const prNumber = context.payload.pull_request?.number;
if (!prNumber) {
core.setFailed('Pull request number not found');
process.exit(1);
}
// Retrieve pull request labels
const prLabels = await retrievePullRequestLabels(octokit, prRepoOwner, prRepoName, prNumber);
const preventMergeLabels = ["needs-qa", "QA'd but questions", "issues-found", "need-ux-ds-review", "blocked", "stale", "DO-NOT-MERGE"];
let hasTeamLabel = false;
// Check pull request has at least required QA label and team label
for (const label of prLabels) {
if (label.startsWith("team-") || label === "external-contributor") {
console.log(`PR contains a team label as expected: ${label}`);
hasTeamLabel = true;
}
if (preventMergeLabels.includes(label)) {
throw new Error(`PR cannot be merged because it still contains this label: ${label}`);
}
if (hasTeamLabel) {
return;
}
}
// Otherwise, throw an arror to prevent from merging
let errorMessage = '';
if (!hasTeamLabel) {
errorMessage += 'No team labels found on the PR. ';
}
errorMessage += `Please make sure the PR is appropriately labeled before merging it.\n\nSee labeling guidelines for more detail: https://github.com/MetaMask/metamask-extension/blob/develop/.github/LABELING_GUIDELINES.md`;
throw new Error(errorMessage);
}
// This function retrieves the pull request on a specific repo
async function retrievePullRequestLabels(octokit: InstanceType<typeof GitHub>, repoOwner: string, repoName: string, prNumber: number): Promise<string[]> {
const retrievePullRequestLabelsQuery = `
query RetrievePullRequestLabels($repoOwner: String!, $repoName: String!, $prNumber: Int!) {
repository(owner: $repoOwner, name: $repoName) {
pullRequest(number: $prNumber) {
labels(first: 100) {
nodes {
name
}
}
}
}
}
`;
const retrievePullRequestLabelsResult: {
repository: {
pullRequest: {
labels: {
nodes: {
name: string;
}[];
}
};
};
} = await octokit.graphql(retrievePullRequestLabelsQuery, {
repoOwner,
repoName,
prNumber,
});
const pullRequestLabels = retrievePullRequestLabelsResult?.repository?.pullRequest?.labels?.nodes?.map(labelObject => labelObject?.name);
return pullRequestLabels || [];
}

View File

@ -0,0 +1,120 @@
import * as core from '@actions/core';
import { context, getOctokit } from '@actions/github';
import { GitHub } from '@actions/github/lib/utils';
main().catch((error: Error): void => {
console.error(error);
process.exit(1);
});
async function main(): Promise<void> {
// "GITHUB_TOKEN" is an automatically generated, repository-specific access token provided by GitHub Actions.
// We can't use "GITHUB_TOKEN" here, as its permissions are scoped to the repository where the action is running.
// "GITHUB_TOKEN" does not have access to other repositories, even when they belong to the same organization.
// As we want to update bug report issues which are not located in the same repository,
// we need to create our own "BUG_REPORT_TOKEN" with "repo" permissions.
// Such a token allows to access other repositories of the MetaMask organisation.
const personalAccessToken = process.env.BUG_REPORT_TOKEN;
if (!personalAccessToken) {
core.setFailed('BUG_REPORT_TOKEN not found');
process.exit(1);
}
const repoOwner = context.repo.owner; // MetaMask
const bugReportRepo = process.env.BUG_REPORT_REPO;
if (!bugReportRepo) {
core.setFailed('BUG_REPORT_REPO not found');
process.exit(1);
}
// Extract branch name from the context
const branchName: string = context.payload.pull_request?.head.ref || "";
// Extract semver version number from the branch name
const releaseVersionNumberMatch = branchName.match(/^Version-v(\d+\.\d+\.\d+)$/);
if (!releaseVersionNumberMatch) {
core.setFailed(`Failed to extract version number from branch name: ${branchName}`);
process.exit(1);
}
const releaseVersionNumber = releaseVersionNumberMatch[1];
// Initialise octokit, required to call Github GraphQL API
const octokit: InstanceType<typeof GitHub> = getOctokit(personalAccessToken);
const bugReportIssue = await retrieveOpenBugReportIssue(octokit, repoOwner, bugReportRepo, releaseVersionNumber);
if (!bugReportIssue) {
throw new Error(`No open bug report issue was found for release ${releaseVersionNumber} on ${repoOwner}/${bugReportRepo} repo`);
}
if (bugReportIssue.title?.toLocaleLowerCase() !== `v${releaseVersionNumber} Bug Report`.toLocaleLowerCase()) {
throw new Error(`Unexpected bug report title: "${bugReportIssue.title}" instead of "v${releaseVersionNumber} Bug Report"`);
}
console.log(`Closing bug report issue with title "${bugReportIssue.title}" and id: ${bugReportIssue.id}`);
await closeIssue(octokit, bugReportIssue.id);
console.log(`Issue with id: ${bugReportIssue.id} successfully closed`);
}
// This function retrieves the issue titled "vx.y.z Bug Report" on a specific repo
async function retrieveOpenBugReportIssue(octokit: InstanceType<typeof GitHub>, repoOwner: string, repoName: string, releaseVersionNumber: string): Promise<{
id: string;
title: string;
} | undefined> {
const retrieveOpenBugReportIssueQuery = `
query RetrieveOpenBugReportIssue {
search(query: "repo:${repoOwner}/${repoName} type:issue is:open in:title v${releaseVersionNumber} Bug Report", type: ISSUE, first: 1) {
nodes {
... on Issue {
id
title
}
}
}
}
`;
const retrieveOpenBugReportIssueQueryResult: {
search: {
nodes: {
id: string;
title: string;
}[];
};
} = await octokit.graphql(retrieveOpenBugReportIssueQuery);
const bugReportIssues = retrieveOpenBugReportIssueQueryResult?.search?.nodes;
return bugReportIssues?.length > 0 ? bugReportIssues[0] : undefined;
}
// This function closes a Github issue, based on its ID
async function closeIssue(octokit: InstanceType<typeof GitHub>, issueId: string): Promise<string> {
const closeIssueMutation = `
mutation CloseIssue($issueId: ID!) {
updateIssue(input: {id: $issueId, state: CLOSED}) {
clientMutationId
}
}
`;
const closeIssueMutationResult: {
updateIssue: {
clientMutationId: string;
};
} = await octokit.graphql(closeIssueMutation, {
issueId,
});
const clientMutationId = closeIssueMutationResult?.updateIssue?.clientMutationId;
return clientMutationId;
}

View File

@ -37,4 +37,4 @@ jobs:
env:
RELEASE_LABEL_TOKEN: ${{ secrets.RELEASE_LABEL_TOKEN }}
NEXT_SEMVER_VERSION: ${{ env.NEXT_SEMVER_VERSION }}
run: npm run add-release-label-to-pr-and-linked-issues
run: yarn run add-release-label-to-pr-and-linked-issues

38
.github/workflows/check-pr-labels.yml vendored Normal file
View File

@ -0,0 +1,38 @@
name: "Check PR has required labels"
on:
pull_request:
branches:
- develop
types:
- opened
- reopened
- synchronize
- labeled
- unlabeled
jobs:
check-pr-labels:
runs-on: ubuntu-latest
permissions:
pull-requests: read
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 0 # This is needed to checkout all branches
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version-file: '.nvmrc'
cache: yarn
- name: Install dependencies
run: yarn --immutable
- name: Check PR has required labels
id: check-pr-has-required-labels
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: yarn run check-pr-has-required-labels

34
.github/workflows/close-bug-report.yml vendored Normal file
View File

@ -0,0 +1,34 @@
name: Close release bug report issue when release branch gets merged
on:
pull_request:
branches:
- master
types:
- closed
jobs:
close-bug-report:
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true && startsWith(github.event.pull_request.head.ref, 'Version-v')
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 1 # This retrieves only the latest commit.
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version-file: '.nvmrc'
cache: yarn
- name: Install dependencies
run: yarn --immutable
- name: Close release bug report issue
id: close-release-bug-report-issue
env:
BUG_REPORT_REPO: MetaMask-planning
BUG_REPORT_TOKEN: ${{ secrets.BUG_REPORT_TOKEN }}
run: yarn run close-release-bug-report-issue

35
.github/workflows/create-bug-report.yml vendored Normal file
View File

@ -0,0 +1,35 @@
name: Create release bug report issue when release branch gets created
on: create
jobs:
create-bug-report:
runs-on: ubuntu-latest
steps:
- name: Extract version from branch name if release branch
id: extract_version
run: |
if [[ "$GITHUB_REF" == "refs/heads/Version-v"* ]]; then
version="${GITHUB_REF#refs/heads/Version-v}"
echo "New release branch($version), continue next steps"
echo "version=$version" >> "$GITHUB_ENV"
else
echo "Not a release branch, skip next steps"
fi
- name: Create bug report issue on planning repo
if: env.version
run: |
payload=$(cat <<EOF
{
"title": "v${{ env.version }} Bug Report",
"body": "This bug report was automatically created by a GitHub action upon the creation of release branch \`Version-v${{ env.version }}\` (release cut).\n\n**Expected actions for release engineers:**\n\n1. Convert this issue into a Zenhub epic and link all bugs identified during the release regression testing phase to this epic.\n\n2. After completing the first regression run, move this epic to \"Regression Completed\" on the [Extension Release Regression board](https://app.zenhub.com/workspaces/extension-release-regression-6478c62d937eaa15e95c33c5/board?filterLogic=any&labels=release-${{ env.version }},release-task).\n\nNote that once the release is prepared for store submission, meaning the \`Version-v${{ env.version }}\` branch merges into \`master\`, another GitHub action will automatically close this epic.",
"labels": ["type-bug", "regression-RC", "release-${{ env.version }}"]
}
EOF
)
curl -X POST \
-H "Authorization: token ${{ secrets.BUG_REPORT_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/MetaMask/MetaMask-planning/issues \
-d "$payload"

View File

@ -1,17 +0,0 @@
# Fails the pull request if it has the "DO-NOT-MERGE" label
name: Check "DO-NOT-MERGE" label
on:
pull_request:
types: [opened, reopened, labeled, unlabeled, synchronize]
jobs:
do-not-merge:
runs-on: ubuntu-latest
if: ${{ contains(github.event.pull_request.labels.*.name, 'DO-NOT-MERGE') }}
steps:
- name: 'Check for label "DO-NOT-MERGE"'
run: |
echo 'This check fails PRs with the "DO-NOT-MERGE" label to block merging'
exit 1

View File

@ -1,7 +1,9 @@
name: 'Close stale issues and PRs'
# run every 2 hours
on:
schedule:
- cron: '0 12 * * *'
- cron: '0 */2 * * *'
jobs:
stale:
@ -12,17 +14,16 @@ jobs:
steps:
- uses: actions/stale@72afbce2b0dbd1d903bb142cebe2d15dc307ae57
with:
stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity in the last 90 days. It will be closed in 45 days. Thank you for your contributions.'
stale-issue-label: 'stale'
only-issue-labels: 'type-bug'
exempt-issue-labels: 'type-security, type-pinned, feature-request, awaiting-metamask'
stale-pr-message: 'This PR has been automatically marked as stale because it has not had recent activity in the last 60 days. It will be closed in 14 days. Thank you for your contributions.'
stale-pr-label: 'stale'
exempt-pr-labels: 'work-in-progress'
close-issue-message: 'This issue was closed because there has been no follow up activity in the last 7 days. If you feel this was closed in error, please reopen and provide evidence on the latest release of the extension. Thank you for your contributions.'
close-pr-message: 'This PR was closed because there has been no follow up activity in the last 7 days. Thank you for your contributions.'
exempt-issue-labels: 'type-security'
days-before-issue-stale: 90
days-before-pr-stale: 60
stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity in the last 90 days. It will be closed in 45 days if there is no further activity. The MetaMask team intends on reviewing this issue before close, and removing the stale label if it is still a bug. We welcome new comments on this issue. We do not intend on closing issues if they report bugs that are still reproducible. Thank you for your contributions.'
days-before-issue-close: 45
close-issue-message: 'This issue was closed because there has been no follow up activity in the last 45 days. If you feel this was closed in error, please reopen and provide evidence on the latest release of the extension. Thank you for your contributions.'
stale-pr-label: 'stale'
days-before-pr-stale: 60
stale-pr-message: 'This PR has been automatically marked as stale because it has not had recent activity in the last 60 days. It will be closed in 14 days. Thank you for your contributions.'
days-before-pr-close: 14
operations-per-run: 1
close-pr-message: 'This PR was closed because there has been no follow up activity in the last 14 days. Thank you for your contributions.'
operations-per-run: 600

10
.iyarc
View File

@ -1,10 +0,0 @@
# improved-yarn-audit advisory exclusions
GHSA-257v-vj4p-3w2h
# request library is subject to SSRF.
# addressed by temporary patch in .yarn/patches/request-npm-2.88.2-f4a57c72c4.patch
GHSA-p8p7-x288-28g6
# tough-cookie
# this will go away soon when we get rid of web3-provider-engine
GHSA-72xf-g2v4-qvf3

View File

@ -12,3 +12,5 @@ INFURA_PROJECT_ID=00000000000
; Set this to test changes to the phishing warning page.
;PHISHING_WARNING_PAGE_URL=
BLOCKAID_FILE_CDN=
BLOCKAID_PUBLIC_KEY=

View File

@ -8,7 +8,10 @@ module.exports = {
'./app/scripts/controllers/app-state.test.js',
'./app/scripts/controllers/permissions/**/*.test.js',
'./app/scripts/controllers/mmi-controller.test.js',
'./app/scripts/controllers/preferences.test.js',
'./app/scripts/constants/error-utils.test.js',
'./development/fitness-functions/**/*.test.ts',
'./test/e2e/helpers.test.js',
],
recursive: true,
require: ['test/env.js', 'test/setup.js'],

2
.nvmrc
View File

@ -1 +1 @@
v16
v18

View File

@ -1,2 +1,5 @@
# All of these are defaults except singleQuote and endOfLine, but we specify them
# for explicitness
endOfLine: auto
singleQuote: true
trailingComma: all

View File

@ -1,5 +1,8 @@
import { draftTransactionInitialState } from '../ui/ducks/send';
import { KeyringType } from '../shared/constants/keyring';
import { NetworkType } from '@metamask/controller-utils';
import { NetworkStatus } from '@metamask/network-controller';
import { CHAIN_IDS } from '../shared/constants/network';
const state = {
invalidCustomNetwork: {
@ -17,6 +20,15 @@ const state = {
url: 'https://metamask.github.io/test-dapp/',
},
metamask: {
announcements: {
22: {
id: 22,
date: null,
image: {
src: 'images/global-menu-block-explorer.svg',
},
},
},
tokenList: {
'0x514910771af9ca656af840dff83e8264ecf986ca': {
address: '0x514910771af9ca656af840dff83e8264ecf986ca',
@ -164,6 +176,15 @@ const state = {
1559: true,
},
},
selectedNetworkClientId: NetworkType.mainnet,
networksMetadata: {
[NetworkType.mainnet]: {
EIPS: {
1559: true,
},
status: NetworkStatus.Available,
},
},
gasFeeEstimates: '0x5208',
swapsState: {
quotes: {},
@ -293,8 +314,8 @@ const state = {
address: '0x9d0ba4ddac06032527b140912ec808ab9451b788',
},
},
unapprovedTxs: {
3111025347726181: {
transactions: [
{
id: 3111025347726181,
time: 1620710815484,
status: 'unapproved',
@ -344,7 +365,7 @@ const state = {
],
],
},
},
],
addressBook: {
undefined: {
0: {
@ -509,6 +530,12 @@ const state = {
preferences: {
useNativeCurrencyAsPrimaryCurrency: true,
},
incomingTransactionsPreferences: {
[CHAIN_IDS.MAINNET]: true,
[CHAIN_IDS.GOERLI]: false,
[CHAIN_IDS.OPTIMISM_TESTNET]: false,
[CHAIN_IDS.AVALANCHE_TESTNET]: true,
},
firstTimeFlowType: 'create',
completedOnboarding: true,
knownMethodData: {
@ -547,7 +574,7 @@ const state = {
},
},
currentBlockGasLimit: '0x793af4',
currentNetworkTxList: [
transactions: [
{
chainId: '0x38',
dappSuggestedGasFees: null,
@ -1599,7 +1626,7 @@ const state = {
},
};
export const networkList = [
export const networkList = [
{
blockExplorerUrl: 'https://etherscan.io',
chainId: '0x1',
@ -1673,6 +1700,6 @@ export const networkList = [
rpcUrl: 'https://polygon-rpc.com',
ticker: 'MATIC',
},
]
];
export default state;

View File

@ -0,0 +1,46 @@
diff --git a/dist/KeyringController.d.ts b/dist/KeyringController.d.ts
index ccfd5ca9accf782b0a612ab1666501898cf2abb9..f772552156491b308f2aa29a734a5138237d951e 100644
--- a/dist/KeyringController.d.ts
+++ b/dist/KeyringController.d.ts
@@ -1,10 +1,11 @@
import type { TxData, TypedTransaction } from '@ethereumjs/tx';
-import { type MetaMaskKeyring as QRKeyring, type IKeyringState as IQRKeyringState } from '@keystonehq/metamask-airgapped-keyring';
+import type { MetaMaskKeyring as QRKeyring, IKeyringState as IQRKeyringState } from '@keystonehq/metamask-airgapped-keyring';
import type { RestrictedControllerMessenger } from '@metamask/base-controller';
import { BaseControllerV2 } from '@metamask/base-controller';
import type { PersonalMessageParams, TypedMessageParams } from '@metamask/message-manager';
import type { PreferencesController } from '@metamask/preferences-controller';
-import { type Hex, type Keyring, type Json } from '@metamask/utils';
+import type { Hex, Keyring, Json } from '@metamask/utils';
+import type { KeyringController as EthKeyringController } from '@metamask/eth-keyring-controller';
import type { Patch } from 'immer';
declare const name = "KeyringController";
/**
@@ -135,6 +136,10 @@ export declare class KeyringController extends BaseControllerV2<typeof name, Key
* @param opts.state - Initial state to set on this controller.
*/
constructor({ removeIdentity, syncIdentities, updateIdentities, setSelectedAddress, setAccountLabel, encryptor, keyringBuilders, cacheEncryptionKey, messenger, state, }: KeyringControllerOptions);
+ /**
+ * Gets the internal keyring controller.
+ */
+ getEthKeyringController(): EthKeyringController;
/**
* Adds a new account to the default (first) HD seed phrase keyring.
*
diff --git a/dist/KeyringController.js b/dist/KeyringController.js
index 9e241ba3b5445a053e3b20ee70a579118b7b2934..eb1f7bce9d3607017b39e087db227e8a7dadd849 100644
--- a/dist/KeyringController.js
+++ b/dist/KeyringController.js
@@ -153,6 +153,12 @@ class KeyringController extends base_controller_1.BaseControllerV2 {
this.setSelectedAddress = setSelectedAddress;
this.setAccountLabel = setAccountLabel;
}
+ /**
+ * Gets the internal keyring controller.
+ */
+ getEthKeyringController() {
+ return __classPrivateFieldGet(this, _KeyringController_keyring, "f");
+ }
/**
* Adds a new account to the default (first) HD seed phrase keyring.
*

View File

@ -1,17 +0,0 @@
diff --git a/dist/SignatureController.js b/dist/SignatureController.js
index b58b27e84aa84393afb366d4585c084d0380d21d..0629bcf517db744ccfa40e4d7d8f2829fa95559e 100644
--- a/dist/SignatureController.js
+++ b/dist/SignatureController.js
@@ -237,8 +237,11 @@ _SignatureController_keyringController = new WeakMap(), _SignatureController_isE
yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_requestApproval).call(this, messageParamsWithId, approvalType);
}
catch (error) {
+ signaturePromise.catch(() => {
+ // Expecting reject error but throwing manually rather than waiting
+ });
__classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId);
- throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest('User rejected the request.');
+ throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest(`MetaMask ${messageName} Signature: User denied message signature.`);
}
yield signMessage(messageParamsWithId, version, signingOpts);
return signaturePromise;

View File

@ -0,0 +1,26 @@
diff --git a/dist/SignatureController.js b/dist/SignatureController.js
index a2f064efa2a2700db00767daa4ce6bd22b1932c4..17edb51b6c526f27fb4c19f2d2fda3d7140c66b4 100644
--- a/dist/SignatureController.js
+++ b/dist/SignatureController.js
@@ -283,8 +283,11 @@ _SignatureController_keyringController = new WeakMap(), _SignatureController_isE
resultCallbacks = acceptResult.resultCallbacks;
}
catch (_a) {
+ signaturePromise.catch(() => {
+ // Expecting reject error but throwing manually rather than waiting
+ });
__classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_cancelAbstractMessage).call(this, messageManager, messageId);
- throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest('User rejected the request.');
+ throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest(`MetaMask ${messageName} Signature: User denied message signature.`);
}
yield signMessage(messageParamsWithId, signingOpts);
const signatureResult = yield signaturePromise;
@@ -305,7 +308,7 @@ _SignatureController_keyringController = new WeakMap(), _SignatureController_isE
return __awaiter(this, void 0, void 0, function* () {
return yield __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_signAbstractMessage).call(this, __classPrivateFieldGet(this, _SignatureController_personalMessageManager, "f"), controller_utils_1.ApprovalType.PersonalSign, msgParams, (cleanMsgParams) => __awaiter(this, void 0, void 0, function* () { return yield __classPrivateFieldGet(this, _SignatureController_keyringController, "f").signPersonalMessage(cleanMsgParams); }));
});
-}, _SignatureController_signTypedMessage = function _SignatureController_signTypedMessage(msgParams,
+}, _SignatureController_signTypedMessage = function _SignatureController_signTypedMessage(msgParams,
/* istanbul ignore next */
opts = { parseJsonData: true }) {
return __awaiter(this, void 0, void 0, function* () {

View File

@ -1,69 +0,0 @@
# Improved yarn audit is patched to work with yarn version 2+. The primary need
# is to retool the script to first use yarn's new audit command and parameters
# as well as to change the process for how it reads the result due to an update
# in returned shape of audit command's data.
diff --git a/bin/improved-yarn-audit b/bin/improved-yarn-audit
index 52df548151aa28289565e3335b2cd7a92fa38325..7e058df6a4a159596df72c9475a36b747580cd98 100755
--- a/bin/improved-yarn-audit
+++ b/bin/improved-yarn-audit
@@ -15,6 +15,7 @@ const { tmpdir } = require("os")
const path = require("path")
const { env, exit, platform } = require("process")
const { createInterface } = require("readline")
+const { Stream } = require("stream")
const GITHUB_ADVISORY_CODE = "GHSA"
@@ -250,7 +251,15 @@ async function iterateOverAuditResults(action) {
const auditResultsFileStream = getAuditResultsFileStream("r")
const iterator = createInterface(auditResultsFileStream)
- iterator.on("line", action)
+ iterator.on("line", async (result) => {
+ const parsed = parseAuditJson(result);
+ const advisories = Stream.Readable.from(
+ Object.values(parsed.advisories).map(advisory => JSON.stringify(advisory))
+ );
+ for await (const data of advisories) {
+ action(data);
+ }
+ });
await new Promise((resolve) => iterator.on("close", resolve))
@@ -305,10 +314,10 @@ async function streamYarnAuditOutput(auditParams, auditResultsFileStream) {
}
async function invokeYarnAudit() {
- const auditParams = ["audit", "--json", `--level=${minSeverityName}`]
+ const auditParams = ["npm", "audit", "--recursive", "--json", `--severity=${minSeverityName}`]
if (ignoreDevDependencies) {
- auditParams.push("--groups=dependencies")
+ auditParams.push("--environment=production")
}
cleanupAuditResultsFile()
@@ -420,17 +429,17 @@ async function runAuditReport() {
let devDependencyAdvisories = []
let devDependencyAdvisoryIds = []
- await iterateOverAuditResults((resultJson) => {
- const potentialResult = parseAuditJson(resultJson)
+ await iterateOverAuditResults((resultJsonString) => {
+ const potentialResult = parseAuditJson(resultJsonString);
if (
- typeof potentialResult.type !== "string" ||
- potentialResult.type !== "auditAdvisory"
+ typeof potentialResult.github_advisory_id !== "string"
) {
return
}
- const result = potentialResult.data.advisory
+
+ const result = potentialResult;
allAdvisories.push(result)

View File

@ -1,48 +0,0 @@
# Lockfile lint's current version does not work with the updated structure of the yarn v2 lockfile
# This patch updates it so that it can parse and read the lockfile entries.
diff --git a/src/ParseLockfile.js b/src/ParseLockfile.js
index 0f0c951027ec83c61769bb6a48943420dff133b8..bad2d251cf376bf3ef4b444a0d49f03a602d7a6e 100644
--- a/src/ParseLockfile.js
+++ b/src/ParseLockfile.js
@@ -21,13 +21,13 @@ const {
* @return boolean
*/
function checkSampleContent (lockfile) {
- const [sampleKey, sampleValue] = Object.entries(lockfile)[0]
+ const [sampleKey, sampleValue] = Object.entries(lockfile)[1]
return (
sampleKey.match(/.*@.*/) &&
(sampleValue &&
typeof sampleValue === 'object' &&
sampleValue.hasOwnProperty('version') &&
- sampleValue.hasOwnProperty('resolved'))
+ sampleValue.hasOwnProperty('resolution'))
)
}
/**
@@ -41,7 +41,24 @@ function yarnParseAndVerify (lockfileBuffer) {
if (!hasSensibleContent) {
throw Error('Lockfile does not seem to contain a valid dependency list')
}
- return {type: 'success', object: lockfile}
+ const normalized = Object.fromEntries(Object.entries(lockfile).map(([packageName, packageDetails]) => {
+ const resolution = packageDetails.resolution;
+ if (!resolution) {
+ return [packageName, packageDetails];
+ }
+ const splitByAt = resolution.split('@');
+ let resolvedPackageName;
+ let host;
+ if (splitByAt.length > 2 && resolution[0] === '@') {
+ resolvedPackageName = `@${splitByAt[1]}`;
+ host = splitByAt[2];
+ } else {
+ [resolvedPackageName, host] = splitByAt;
+ }
+
+ return [packageName, { ...packageDetails, resolved: host}]
+ }))
+ return {type: 'success', object: normalized}
}
class ParseLockfile {
/**

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

881
.yarn/releases/yarn-4.0.0-rc.48.cjs vendored Executable file

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,7 @@
compressionLevel: mixed
enableGlobalCache: false
enableScripts: false
enableTelemetry: false
@ -8,21 +12,101 @@ logFilters:
nodeLinker: node-modules
npmAuditIgnoreAdvisories:
### Advisories:
# Issue: yargs-parser Vulnerable to Prototype Pollution
# URL - https://github.com/advisories/GHSA-p9pc-299p-vxgp
# The affected version (<5.0.0) is only included via @ensdomains/ens via
# 'solc' which is not used in the imports we use from this package.
- 1088783
# Issue: protobufjs Prototype Pollution vulnerability
# URL - https://github.com/advisories/GHSA-h755-8qp9-cq85
# Not easily patched. Minimally effects the extension due to usage of
# LavaMoat lockdown.
- 1092429
# Issue: Regular Expression Denial of Service (ReDOS)
# URL: https://github.com/advisories/GHSA-257v-vj4p-3w2h
# color-string is listed as a dependency of 'color' which is brought in by
# @metamask/jazzicon v2.0.0 but there is work done on that repository to
# remove the color dependency. We should upgrade
- 1089718
# Issue: semver vulnerable to Regular Expression Denial of Service
# URL: https://github.com/advisories/GHSA-c2qf-rxjj-qqgw
# semver is used in the solidity compiler portion of @truffle/codec that does
# not appear to be used.
- 1092461
### Package Deprecations:
# React-tippy brings in popper.js and react-tippy has not been updated in
# three years.
- 'popper.js (deprecation)'
# React-router is out of date and brings in the following deprecated package
- 'mini-create-react-context (deprecation)'
# The affected version, which is less than 7.0.0, is brought in by
# ethereumjs-wallet version 0.6.5 used in the extension but only in a single
# file app/scripts/account-import-strategies/index.js, which may be easy to
# upgrade.
- 'uuid (deprecation)'
# @npmcli/move-file is brought in via CopyWebpackPlugin used in the storybook
# main.js file, which can be upgraded to remove this dependency in favor of
# @npmcli/fs
- '@npmcli/move-file (deprecation)'
# Upgrading babel will result in the following deprecated packages being
# updated:
- 'core-js (deprecation)'
# Material UI dependencies are planned for removal
- '@material-ui/core (deprecation)'
- '@material-ui/styles (deprecation)'
- '@material-ui/system (deprecation)'
# @ensdomains/ens should be explored for upgrade. The following packages are
# deprecated and would be resolved by upgrading to newer versions of
# ensdomains packages:
- '@ensdomains/ens (deprecation)'
- '@ensdomains/resolver (deprecation)'
- 'testrpc (deprecation)'
# Dependencies brought in by @truffle/decoder that are deprecated:
- 'cids (deprecation)' # via @ensdomains/content-hash
- 'multibase (deprecation)' # via cids
- 'multicodec (deprecation)' # via cids
# MetaMask owned repositories brought in by other MetaMask dependencies that
# can be resolved by updating the versions throughout the dependency tree
- 'eth-sig-util (deprecation)' # via @metamask/eth-ledger-bridge-keyring
- '@metamask/controller-utils (deprecation)' # via @metamask/phishin-controller
- 'safe-event-emitter (deprecation)' # via eth-block-tracker and others
# @metamask-institutional relies upon crypto which is deprecated
- 'crypto (deprecation)'
# @metamask/providers uses webextension-polyfill-ts which has been moved to
# @types/webextension-polyfill
- 'webextension-polyfill-ts (deprecation)'
npmRegistries:
"https://npm.pkg.github.com":
'https://npm.pkg.github.com':
npmAlwaysAuth: true
npmAuthToken: "${GITHUB_PACKAGE_READ_TOKEN-}"
npmAuthToken: '${GITHUB_PACKAGE_READ_TOKEN-}'
npmScopes:
metamask:
npmRegistryServer: "${METAMASK_NPM_REGISTRY:-https://registry.yarnpkg.com}"
npmRegistryServer: '${METAMASK_NPM_REGISTRY:-https://registry.yarnpkg.com}'
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-allow-scripts.cjs
spec: "https://raw.githubusercontent.com/LavaMoat/LavaMoat/main/packages/yarn-plugin-allow-scripts/bundles/@yarnpkg/plugin-allow-scripts.js"
- path: .yarn/plugins/@yarnpkg/plugin-version.cjs
spec: "@yarnpkg/plugin-version"
spec: 'https://raw.githubusercontent.com/LavaMoat/LavaMoat/main/packages/yarn-plugin-allow-scripts/bundles/@yarnpkg/plugin-allow-scripts.js'
- path: .yarn/plugins/@yarnpkg/plugin-engines.cjs
spec: "https://raw.githubusercontent.com/devoto13/yarn-plugin-engines/main/bundles/%40yarnpkg/plugin-engines.js"
spec: 'https://raw.githubusercontent.com/devoto13/yarn-plugin-engines/main/bundles/%40yarnpkg/plugin-engines.js'
yarnPath: .yarn/releases/yarn-3.2.4.cjs
yarnPath: .yarn/releases/yarn-4.0.0-rc.48.cjs

View File

@ -122,7 +122,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [10.34.1]
### Fixed
- Fix bug that could cause a failure in the persistence of network related data ([#20080](https://github.com/MetaMask/metamask-extension/pull/20080))
- Fix ([#20080](https://github.com/MetaMask/metamask-extension/pull/20080))
- Fix possible crash when opening the network menu ([#20181](https://github.com/MetaMask/metamask-extension/pull/20181))
## [10.34.0]
### Added

View File

@ -14,11 +14,9 @@ To learn how to contribute to the MetaMask project itself, visit our [Internal D
## Building locally
- Install [Node.js](https://nodejs.org) version 16
- Install [Node.js](https://nodejs.org) version 18
- If you are using [nvm](https://github.com/nvm-sh/nvm#installing-and-updating) (recommended) running `nvm use` will automatically choose the right node version for you.
- Install [Yarn v3](https://yarnpkg.com/getting-started/install)
- ONLY follow the steps in the "Install Corepack" and "Updating the global Yarn version" sections
- DO NOT take any of the steps in the "Initializing your project", "Updating to the latest versions" or "Installing the latest build fresh from master" sections. These steps could result in your repo being reset or installing the wrong yarn version, which can break your build.
- Enable Corepack by executing the command `corepack enable` within the metamask-extension project. Corepack is a utility included with Node.js by default. It manages Yarn on a per-project basis, using the version specified by the `packageManager` property in the project's package.json file. Please note that modern releases of [Yarn](https://yarnpkg.com/getting-started/install) are not intended to be installed globally or via npm.
- Duplicate `.metamaskrc.dist` within the root and rename it to `.metamaskrc`
- Replace the `INFURA_PROJECT_ID` value with your own personal [Infura Project ID](https://infura.io/docs).
- If debugging MetaMetrics, you'll need to add a value for `SEGMENT_WRITE_KEY` [Segment write key](https://segment.com/docs/connections/find-writekey/), see [Developing on MetaMask - Segment](./development/README.md#segment).
@ -88,15 +86,17 @@ These test scripts all support additional options, which might be helpful for de
Single e2e tests can be run with `yarn test:e2e:single test/e2e/tests/TEST_NAME.spec.js` along with the options below.
```console
--browser Set the browser used; either 'chrome' or 'firefox'.
[string] [choices: "chrome", "firefox"]
--debug Run tests in debug mode, logging each driver interaction
[boolean] [default: false]
--retries Set how many times the test should be retried upon failure.
[number] [default: 0]
--leave-running Leaves the browser running after a test fails, along with
anything else that the test used (ganache, the test dapp,
etc.) [boolean] [default: false]
--browser Set the browser used; either 'chrome' or 'firefox'.
[string] [choices: "chrome", "firefox"]
--debug Run tests in debug mode, logging each driver interaction
[boolean] [default: false]
--retries Set how many times the test should be retried upon failure.
[number] [default: 0]
--leave-running Leaves the browser running after a test fails, along with
anything else that the test used (ganache, the test dapp,
etc.) [boolean] [default: false]
--update-snapshot Update E2E test snapshots
[alias: -u] [boolean] [default: false]
```
For example, to run the `account-details` tests using Chrome, with debug logging and with the browser set to remain open upon failure, you would use:

View File

@ -169,9 +169,6 @@
"copyAddress": {
"message": "አድራሻን ወደ ቅንጥብ ሰሌዳ ቅዳ"
},
"copyPrivateKey": {
"message": "የግል ቁልፍዎ ይህ ነው (ለመቅዳት ጠቅ ያድርጉ)"
},
"copyToClipboard": {
"message": "ወደ ቅንጥብ ሰሌዳ ገልብጥ"
},
@ -205,9 +202,6 @@
"deleteNetwork": {
"message": "አውታረ መረብ ይሰረዝ?"
},
"deleteNetworkDescription": {
"message": "ይህን አውታረ መረብ ለመሰረዝ እንደሚፈልጉ እርግጠኛ ነዎት?"
},
"details": {
"message": "ዝርዝሮች"
},
@ -235,9 +229,6 @@
"ensRegistrationError": {
"message": "በ ENS የስም ምዝገባ ላይ የተፈጠረ ስህተት"
},
"enterPassword": {
"message": "የይለፍ ቃል ያስገቡ"
},
"enterPasswordContinue": {
"message": "ለመቀጠል የይለፍ ቃል ያስገቡ"
},
@ -250,9 +241,6 @@
"expandView": {
"message": "እይታን ዘርጋ"
},
"exportPrivateKey": {
"message": "የግል ቁልፍን ላክ"
},
"failed": {
"message": "አልተሳካም"
},
@ -612,9 +600,6 @@
"searchResults": {
"message": "ውጤቶችን ፈልግ"
},
"searchTokens": {
"message": "ተለዋጭ ስሞችን ፈልግ"
},
"securityAndPrivacy": {
"message": "ደህንነት እና ግላዊነት"
},
@ -654,9 +639,6 @@
"showHexDataDescription": {
"message": "በመላኪያ ማያ ላይ የ hex ውሂብ መስክን ለማሳየት ይህን ይምረጡ"
},
"showPrivateKeys": {
"message": "የግል ቁልፎችን አሳይ"
},
"sigRequest": {
"message": "የፊርማ ጥያቄ"
},
@ -777,9 +759,6 @@
"tryAgain": {
"message": "እንደገና ሞክር"
},
"typePassword": {
"message": "የ MetaMask የይለፍ ቃልዎን ይጻፉ"
},
"unapproved": {
"message": "ያልተፈቀደ"
},

View File

@ -179,9 +179,6 @@
"copyAddress": {
"message": "نسخ العنوان إلى الحافظة"
},
"copyPrivateKey": {
"message": "هذا هو مفتاحك الخاص (انقر للنسخ)"
},
"copyToClipboard": {
"message": "نسخ إلى الحافظة"
},
@ -218,9 +215,6 @@
"deleteNetwork": {
"message": "هل تريد حذف الشبكة؟"
},
"deleteNetworkDescription": {
"message": "هل أنت متأكد أنك تريد حذف هذه الشبكة؟"
},
"details": {
"message": "التفاصيل"
},
@ -248,9 +242,6 @@
"ensRegistrationError": {
"message": "خطأ في تسجيل اسم ENS"
},
"enterPassword": {
"message": "أدخل كلمة مرور"
},
"enterPasswordContinue": {
"message": "أدخل كلمة المرور للمتابعة"
},
@ -263,9 +254,6 @@
"expandView": {
"message": "توسيع العرض"
},
"exportPrivateKey": {
"message": "تصدير المفتاح الخاص"
},
"failed": {
"message": "فشل"
},
@ -624,9 +612,6 @@
"searchResults": {
"message": "نتائج البحث"
},
"searchTokens": {
"message": "البحث عن العملات الرمزية"
},
"securityAndPrivacy": {
"message": "الأمن والخصوصية"
},
@ -666,9 +651,6 @@
"showHexDataDescription": {
"message": "حدد هذا لإظهار حقل بيانات سداسي عشرية على شاشة الإرسال"
},
"showPrivateKeys": {
"message": "عرض المفاتيح الخاصة"
},
"sigRequest": {
"message": "طلب التوقيع"
},
@ -789,9 +771,6 @@
"tryAgain": {
"message": "إعادة المحاولة"
},
"typePassword": {
"message": "أدخل كلمة مرور MetaMask الخاصة بك"
},
"unapproved": {
"message": "تم الرفض"
},

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Копирайте адреса в клипборда"
},
"copyPrivateKey": {
"message": "Това е Вашият личен ключ (кликнете, за да го копирате)"
},
"copyToClipboard": {
"message": "Копиране в буферната памет"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Да се изтрие ли мрежата?"
},
"deleteNetworkDescription": {
"message": "Наистина ли искате да изтриете тази мрежа?"
},
"details": {
"message": "Подробности"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "Грешка при регистрацията на име на ENS"
},
"enterPassword": {
"message": "Въведете парола"
},
"enterPasswordContinue": {
"message": "Въведете парола, за да продължите"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Разгъване на изглед"
},
"exportPrivateKey": {
"message": "Експортиране на частен ключ"
},
"failed": {
"message": "Неуспешно"
},
@ -623,9 +611,6 @@
"searchResults": {
"message": "Резултати от търсенето"
},
"searchTokens": {
"message": "Търсене на маркери"
},
"securityAndPrivacy": {
"message": "Сигурност и поверителност"
},
@ -665,9 +650,6 @@
"showHexDataDescription": {
"message": "Изберете това, за да се покаже полето с шестнадесетични данни на екрана за изпращане"
},
"showPrivateKeys": {
"message": "Показване на частни ключове"
},
"sigRequest": {
"message": "Заявка за подпис"
},
@ -788,9 +770,6 @@
"tryAgain": {
"message": "Нов опит"
},
"typePassword": {
"message": "Въведете паролата си за MetaMask"
},
"unapproved": {
"message": "Неодобрено"
},

View File

@ -172,9 +172,6 @@
"copyAddress": {
"message": "ক্লিপবোর্ডে ঠিকানা কপি করুন"
},
"copyPrivateKey": {
"message": "এটি হল আপনার গোপন কী (কপি করতে ক্লিক করুন)"
},
"copyToClipboard": {
"message": "ক্লিপবোর্ডে কপি করুন"
},
@ -211,9 +208,6 @@
"deleteNetwork": {
"message": "নেটওয়ার্ক মুছবেন?"
},
"deleteNetworkDescription": {
"message": "আপনি কি এই নেটওয়ার্কটি মোছার বিষয়ে নিশ্চিত?"
},
"details": {
"message": "বিশদ বিবরণ"
},
@ -241,9 +235,6 @@
"ensRegistrationError": {
"message": "ENS নাম নিবন্ধীকরণে ত্রুটি হয়েছে"
},
"enterPassword": {
"message": "পাসওয়ার্ড লিখুন"
},
"enterPasswordContinue": {
"message": "অবিরত রাখতে পাসওয়ার্ড লিখুন"
},
@ -256,9 +247,6 @@
"expandView": {
"message": "ভিউ সম্প্রসারিত করুন"
},
"exportPrivateKey": {
"message": "ব্যক্তিগত কী রপ্তানি করুন"
},
"failed": {
"message": "ব্যর্থ হয়েছে"
},
@ -621,9 +609,6 @@
"searchResults": {
"message": "অনুসন্ধানের ফলাফলগুলি"
},
"searchTokens": {
"message": "টোকেনগুলি অনুসন্ধান করুন"
},
"securityAndPrivacy": {
"message": "নিরাপত্তা এবং গোপনীয়তা"
},
@ -663,9 +648,6 @@
"showHexDataDescription": {
"message": "পাঠাবার স্ক্রিনে হেক্স ডেটা ফিল্ডটি দেখাবার জন্য এটি নির্বাচন করুন"
},
"showPrivateKeys": {
"message": "গোপনীয় কীগুলি দেখান"
},
"sigRequest": {
"message": "স্বাক্ষরের অনুরোধ"
},
@ -786,9 +768,6 @@
"tryAgain": {
"message": "আবার করুন"
},
"typePassword": {
"message": "আপনার MetaMask পাসওয়ার্ড টাইপ করুন"
},
"unapproved": {
"message": "অননুমোদিত"
},

View File

@ -172,9 +172,6 @@
"copyAddress": {
"message": "Copiar adreça al porta-retalls"
},
"copyPrivateKey": {
"message": "Aquesta és la teva clau privada (fes clic per a copiar)"
},
"copyToClipboard": {
"message": "Copia al porta-retalls"
},
@ -211,9 +208,6 @@
"deleteNetwork": {
"message": "Esborrar Xarxa?"
},
"deleteNetworkDescription": {
"message": "Estàs segur que vols eliminar aquesta xarxa?"
},
"details": {
"message": "Detalls"
},
@ -241,9 +235,6 @@
"ensRegistrationError": {
"message": "Error al registre de nom ENS"
},
"enterPassword": {
"message": "Introdueix contrasenya"
},
"enterPasswordContinue": {
"message": "Introdueix la contrasenya per continuar"
},
@ -256,9 +247,6 @@
"expandView": {
"message": "Eixamplar Vista"
},
"exportPrivateKey": {
"message": "Exportar Clau Privada."
},
"failed": {
"message": "Fallit"
},
@ -608,9 +596,6 @@
"searchResults": {
"message": "Resultats de Cerca"
},
"searchTokens": {
"message": "Tokens per cercar"
},
"securityAndPrivacy": {
"message": "Seguretat i privacitat"
},
@ -650,9 +635,6 @@
"showHexDataDescription": {
"message": "Selecciona això per a mostrar el camp de dades Hex a la pantalla d'enviament"
},
"showPrivateKeys": {
"message": "Mostrar Claus Privades"
},
"sigRequest": {
"message": "Sol·licitud de Signatura"
},
@ -767,9 +749,6 @@
"tryAgain": {
"message": "Torna-ho a provar"
},
"typePassword": {
"message": "Tecleja la teva contrasenya de MetaMask"
},
"unapproved": {
"message": "Pendent d'aprovació"
},

View File

@ -72,9 +72,6 @@
"copiedExclamation": {
"message": "Zkopírováno!"
},
"copyPrivateKey": {
"message": "Toto je váš privátní klíč (kliknutím zkopírujte)"
},
"copyToClipboard": {
"message": "Kopírovat do schránky"
},
@ -105,15 +102,9 @@
"edit": {
"message": "Upravit"
},
"enterPassword": {
"message": "Zadejte heslo"
},
"etherscanView": {
"message": "Prohlédněte si účet na Etherscan"
},
"exportPrivateKey": {
"message": "Exportovat privátní klíč"
},
"failed": {
"message": "Neúspěšné"
},
@ -289,9 +280,6 @@
"search": {
"message": "Hledat"
},
"searchTokens": {
"message": "Hledat tokeny"
},
"seedPhraseReq": {
"message": "klíčové fráze mají 12 slov"
},
@ -307,9 +295,6 @@
"settings": {
"message": "Nastavení"
},
"showPrivateKeys": {
"message": "Zobrazit privátní klíče"
},
"sigRequest": {
"message": "Požadavek podpisu"
},
@ -358,9 +343,6 @@
"transactionError": {
"message": "Chyba transakce. Vyhozena výjimka v kódu kontraktu."
},
"typePassword": {
"message": "Zadejte své heslo"
},
"unapproved": {
"message": "Neschváleno"
},

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Kopier adresse til udklipsholder"
},
"copyPrivateKey": {
"message": "Dette er din private nøgle (klik for at kopiere)"
},
"copyToClipboard": {
"message": "Kopiér til udklipsholderen"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Slet Netværk?"
},
"deleteNetworkDescription": {
"message": "Er du sikker på, at du vil slette dette netværk?"
},
"details": {
"message": "Detaljer"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "Fejl i ENS-navneregistrering"
},
"enterPassword": {
"message": "Indtast kodeord"
},
"enterPasswordContinue": {
"message": "Indtast adgangskode for at fortsætte"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Udvis Visning"
},
"exportPrivateKey": {
"message": "Eksporter privat nøgle"
},
"failed": {
"message": "Mislykkedes"
},
@ -608,9 +596,6 @@
"searchResults": {
"message": "Søg Resultater"
},
"searchTokens": {
"message": "Søg efter tokens"
},
"securityAndPrivacy": {
"message": "Sikkerhed & Privatliv"
},
@ -647,9 +632,6 @@
"showHexDataDescription": {
"message": "Vælg dette for at vise hex-datafeltet på send-skærmen"
},
"showPrivateKeys": {
"message": "Vis private nøgler"
},
"sigRequest": {
"message": "Signaturforespørgsel"
},
@ -761,9 +743,6 @@
"tryAgain": {
"message": "Prøv igen"
},
"typePassword": {
"message": "Skriv din MetaMask-adgangskode"
},
"unapproved": {
"message": "Ikke godkendt"
},

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -153,9 +153,6 @@
"accountSelectionRequired": {
"message": "You need to select an account!"
},
"activated": {
"message": "Active"
},
"active": {
"message": "Active"
},
@ -192,18 +189,9 @@
"addContact": {
"message": "Add contact"
},
"addCustomIPFSGateway": {
"message": "Add custom IPFS gateway"
},
"addCustomIPFSGatewayDescription": {
"message": "The IPFS gateway makes it possible to access and view data hosted by third parties. You can add a custom IPFS gateway or continue using the default."
},
"addCustomNetwork": {
"message": "Add custom network"
},
"addCustomToken": {
"message": "Add custom token"
},
"addEthereumChainConfirmationDescription": {
"message": "This will allow this network to be used within MetaMask."
},
@ -252,6 +240,9 @@
"addHardwareWallet": {
"message": "Add hardware wallet"
},
"addIPFSGateway": {
"message": "Add your preferred IPFS gateway"
},
"addMemo": {
"message": "Add memo"
},
@ -296,6 +287,9 @@
"address": {
"message": "Address"
},
"addressCopied": {
"message": "Address copied!"
},
"advanced": {
"message": "Advanced"
},
@ -374,9 +368,6 @@
"message": "Allow $1 to withdraw and spend up to the following amount:",
"description": "The url of the site that requested permission to 'withdraw and spend'"
},
"amlCompliance": {
"message": "AML/CFT Compliance"
},
"amount": {
"message": "Amount"
},
@ -569,12 +560,48 @@
"blockaid": {
"message": "Blockaid"
},
"blockaidDescriptionApproveFarming": {
"message": "If you approve this request, a third party known for scams might take all your assets."
},
"blockaidDescriptionBlurFarming": {
"message": "If you approve this request, someone can steal your assets listed on Blur."
},
"blockaidDescriptionFailed": {
"message": "Because of an error, this request was not verified by the security provider. Proceed with caution."
},
"blockaidDescriptionMaliciousDomain": {
"message": "You're interacting with a malicious domain. If you approve this request, you might lose your assets."
},
"blockaidDescriptionMightLoseAssets": {
"message": "If you approve this request, you might lose your assets."
},
"blockaidDescriptionSeaportFarming": {
"message": "If you approve this request, someone can steal your assets listed on OpenSea."
},
"blockaidDescriptionTransferFarming": {
"message": "If you approve this request, a third party known for scams will take all your assets."
},
"blockaidTitleDeceptive": {
"message": "This is a deceptive request"
},
"blockaidTitleMayNotBeSafe": {
"message": "Request may not be safe"
},
"blockaidTitleSuspicious": {
"message": "This is a suspicious request"
},
"blockies": {
"message": "Blockies"
},
"bridge": {
"message": "Bridge"
},
"bridgeDescription": {
"message": "Transfer tokens from different networks"
},
"bridgeDisabled": {
"message": "Bridge is not available in this network"
},
"browserNotSupported": {
"message": "Your browser is not supported..."
},
@ -594,6 +621,16 @@
"message": "Buy $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
"buyDescription": {
"message": "Hold up your crypto and earn potential profits"
},
"buyDisabled": {
"message": "Buy is not available in this network"
},
"buyMoreAsset": {
"message": "Buy more $1",
"description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase"
},
"buyNow": {
"message": "Buy Now"
},
@ -674,45 +711,9 @@
"close": {
"message": "Close"
},
"codefiCompliance": {
"message": "Codefi Compliance"
},
"coingecko": {
"message": "CoinGecko"
},
"complianceActivatedDesc": {
"message": "You can now use compliance in MetaMask Institutional. Receiving AML/CFT analysis within the confirmation screen on all the addresses you interact with."
},
"complianceActivatedTitle": {
"message": "Your compliance feature is activated"
},
"complianceBlurb0": {
"message": "DeFi raises AML/CFT risk for institutions, given the decentralised pools and pseudonymous counterparties."
},
"complianceBlurb1": {
"message": "Codefi Compliance is the only product capable of running AML/CFT analysis on DeFi pools. This allows you to identify and avoid pools and counterparties that fail your risk setting."
},
"complianceBlurbStep1": {
"message": "Sign up to Codefi Compliance below"
},
"complianceBlurbStep2": {
"message": "Create an organisation"
},
"complianceBlurbStep3": {
"message": "Create a project"
},
"complianceBlurbStep4": {
"message": "Set your compliance settings"
},
"complianceBlurbStep5": {
"message": "Click the \"Enable Compliance in MMI\" button"
},
"complianceBlurpStep0": {
"message": "Steps to enable AML/CFT Compliance:"
},
"complianceSettingsExplanation": {
"message": "Change your settings or view reports by opening up Codefi Compliance or disconnect below."
},
"configureSnapPopupDescription": {
"message": "You're now leaving MetaMask to configure this snap."
},
@ -836,9 +837,6 @@
"connectingToSepolia": {
"message": "Connecting to Sepolia test network"
},
"connectionError": {
"message": "Connection error"
},
"connectionFailed": {
"message": "Connection failed"
},
@ -849,6 +847,9 @@
"connectionRequest": {
"message": "Connection request"
},
"connections": {
"message": "Connections"
},
"contactUs": {
"message": "Contact us"
},
@ -913,9 +914,6 @@
"copyAddress": {
"message": "Copy address to clipboard"
},
"copyPrivateKey": {
"message": "This is your private key (click to copy)"
},
"copyRawTransactionData": {
"message": "Copy raw transaction data"
},
@ -1138,8 +1136,12 @@
"deleteNetwork": {
"message": "Delete network?"
},
"deleteNetworkDescription": {
"message": "Are you sure you want to delete this network?"
"deleteNetworkIntro": {
"message": "If you delete this network, you will need to add it again to view your assets in this network"
},
"deleteNetworkTitle": {
"message": "Delete $1 network?",
"description": "$1 represents the name of the network"
},
"deposit": {
"message": "Deposit"
@ -1157,6 +1159,9 @@
"message": "Description from $1",
"description": "$1 represents the name of the snap"
},
"desktopApp": {
"message": "Desktop App"
},
"desktopConnectionCriticalErrorDescription": {
"message": "This error could be intermittent, so try restarting the extension or disable MetaMask Desktop."
},
@ -1287,6 +1292,12 @@
"dismissReminderField": {
"message": "Dismiss Secret Recovery Phrase backup reminder"
},
"displayNftMedia": {
"message": "Display NFT media"
},
"displayNftMediaDescription": {
"message": "Displaying NFT media and data exposes your IP address to OpenSea or other third parties. This can allow attackers to associate your IP address with your Ethereum address. NFT autodetection relies on this setting, and won't be available when this is turned off."
},
"domain": {
"message": "Domain"
},
@ -1409,15 +1420,12 @@
"enableAutoDetect": {
"message": " Enable autodetect"
},
"enableForAllNetworks": {
"message": "Enable for all networks"
},
"enableFromSettings": {
"message": " Enable it from Settings."
},
"enableOpenSeaAPI": {
"message": "Enable OpenSea API"
},
"enableOpenSeaAPIDescription": {
"message": "Use OpenSea's API to fetch NFT data. NFT auto-detection relies on OpenSea's API, and will not be available when this is turned off."
},
"enableSmartSwaps": {
"message": "Enable smart swaps"
},
@ -1445,6 +1453,24 @@
"enhancedTokenDetectionAlertMessage": {
"message": "Enhanced token detection is currently available on $1. $2"
},
"ensDomainsSettingDescriptionIntro": {
"message": "MetaMask lets you see ENS domains like \"https://metamask.eth\" right in your browser's address bar. Here's how it works:"
},
"ensDomainsSettingDescriptionOutro": {
"message": "Regular browsers don't usually handle ENS or IPFS addresses, but MetaMask helps with that. Using this feature might share your IP address with IPFS third-party services."
},
"ensDomainsSettingDescriptionPoint1": {
"message": "MetaMask checks with Ethereum's ENS contract to find the code connected to the ENS name."
},
"ensDomainsSettingDescriptionPoint2": {
"message": "If the code is linked to IPFS, it gets the content from the IPFS network."
},
"ensDomainsSettingDescriptionPoint3": {
"message": "Then, you can see the content, usually a website or something similar."
},
"ensDomainsSettingTitle": {
"message": "Show ENS domains in address bar"
},
"ensIllegalCharacter": {
"message": "Illegal character for ENS."
},
@ -1472,9 +1498,6 @@
"enterOptionalPassword": {
"message": "Enter optional password"
},
"enterPassword": {
"message": "Enter password"
},
"enterPasswordContinue": {
"message": "Enter password to continue"
},
@ -1551,9 +1574,6 @@
"exploreMetaMaskSnaps": {
"message": "Explore MetaMask Snaps"
},
"exportPrivateKey": {
"message": "Export private key"
},
"extendWalletWithSnaps": {
"message": "Customize your wallet experience."
},
@ -1772,8 +1792,11 @@
"hardwareWallets": {
"message": "Connect a hardware wallet"
},
"hardwareWalletsInfo": {
"message": "Hardware wallet integrations use API calls to external servers, which can see your IP address and the smart contract addresses you interact with."
},
"hardwareWalletsMsg": {
"message": "Select a hardware wallet you'd like to use with MetaMask."
"message": "Select a hardware wallet you would like to use with MetaMask."
},
"here": {
"message": "here",
@ -1972,9 +1995,6 @@
"message": "Installed on $1",
"description": "$1 is the date when the snap has been installed"
},
"institutionalFeatures": {
"message": "Institutional Features"
},
"insufficientBalance": {
"message": "Insufficient balance."
},
@ -2055,6 +2075,22 @@
"invalidSeedPhraseCaseSensitive": {
"message": "Invalid input! Secret Recovery Phrase is case sensitive."
},
"ipfsGateway": {
"message": "IPFS gateway"
},
"ipfsGatewayDescription": {
"message": "MetaMask uses third-party services to show images of your NFTs stored on IPFS, display information related to ENS addresses entered in your browser's address bar, and fetch icons for different tokens. Your IP address may be exposed to these services when youre using them."
},
"ipfsToggleModalDescriptionOne": {
"message": "We use third-party services to show images of your NFTs stored on IPFS, display information related to ENS addresses entered in your browser's address bar, and fetch icons for different tokens. Your IP address may be exposed to these services when youre using them."
},
"ipfsToggleModalDescriptionTwo": {
"message": "Selecting Confirm turns on IPFS resolution. You can turn it off in $1 at any time.",
"description": "$1 is the method to turn off ipfs"
},
"ipfsToggleModalSettings": {
"message": "Settings > Security and privacy"
},
"jazzAndBlockies": {
"message": "Jazzicons and Blockies are two different styles of unique icons that help you identify an account at a glance."
},
@ -2313,18 +2349,12 @@
"mmiAddToken": {
"message": "The page at $1 would like to authorise the following custodian token in MetaMask Institutional"
},
"mmiAuthenticate": {
"message": "The page at $1 would like to authorise the following projects compliance settings in MetaMask Institutional"
},
"mmiBuiltAroundTheWorld": {
"message": "MetaMask Institutional is designed and built around the world."
},
"more": {
"message": "more"
},
"moreComingSoon": {
"message": "More coming soon..."
},
"multipleSnapConnectionWarning": {
"message": "$1 wants to connect with $2 snaps. Only proceed if you trust this website.",
"description": "$1 is the dapp and $2 is the number of snaps it wants to connect to."
@ -2539,8 +2569,8 @@
"noNFTs": {
"message": "No NFTs yet"
},
"noReport": {
"message": "No Report"
"noNetworksFound": {
"message": "No networks found for the given search query"
},
"noSnaps": {
"message": "You don't have any snaps installed."
@ -2747,6 +2777,18 @@
"notifications22Title": {
"message": "Looking for your account details or the block explorer URL?"
},
"notifications23ActionText": {
"message": "Enable security alerts"
},
"notifications23DescriptionOne": {
"message": "Steer clear of known scams while still preserving your privacy with security alerts powered by Blockaid on Ethereum Mainnet."
},
"notifications23DescriptionTwo": {
"message": "Always do your own due diligence before approving requests."
},
"notifications23Title": {
"message": "Stay safe with security alerts"
},
"notifications24ActionText": {
"message": "Got it"
},
@ -2837,6 +2879,14 @@
"notifications9Title": {
"message": "👓 We are making transactions easier to read."
},
"notificationsDropLedgerFirefoxDescription": {
"message": "Firefox no longer supports U2F, so Ledger won't work with MetaMask on Firefox. Try MetaMask on Google Chrome instead.",
"description": "Description of a notification in the 'See What's New' popup. Describes that ledger will not longer be supported for firefox users and they should use MetaMask on chrome for ledger support instead."
},
"notificationsDropLedgerFirefoxTitle": {
"message": "Dropping Ledger Support for Firefox",
"description": "Title for a notification in the 'See What's New' popup. Tells firefox users that ledger support is being dropped."
},
"notificationsEmptyText": {
"message": "This is where you can find notifications from your installed snaps."
},
@ -3002,10 +3052,6 @@
"onboardingPinExtensionTitle": {
"message": "Your MetaMask install is complete!"
},
"onboardingShowIncomingTransactionsDescription": {
"message": "Showing incoming transactions in your wallet relies on communication with $1. Etherscan will have access to your Ethereum address and your IP address. View $2.",
"description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key."
},
"onboardingUsePhishingDetectionDescription": {
"message": "Phishing detection alerts rely on communication with $1. jsDeliver will have access to your IP address. View $2.",
"description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link"
@ -3016,9 +3062,6 @@
"onlyConnectTrust": {
"message": "Only connect with sites you trust."
},
"openCodefiCompliance": {
"message": "Open Codefi Compliance"
},
"openFullScreenForLedgerWebHid": {
"message": "Go to full screen to connect your Ledger.",
"description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid."
@ -3314,9 +3357,6 @@
"portfolioDashboard": {
"message": "Portfolio Dashboard"
},
"portfolioView": {
"message": "Portfolio view"
},
"preferredLedgerConnectionType": {
"message": "Preferred Ledger connection type",
"description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message"
@ -3362,12 +3402,6 @@
"proceedWithTransaction": {
"message": "I want to proceed anyway"
},
"projectIdInvalid": {
"message": "Provided Project ID is invalid"
},
"projectName": {
"message": "Project Name"
},
"proposedApprovalLimit": {
"message": "Proposed approval limit"
},
@ -3486,12 +3520,6 @@
"replace": {
"message": "replace"
},
"reportLastRun": {
"message": "Report last run"
},
"reportLastRunTooltip": {
"message": "The date and time of when the last AML/CFT report was run"
},
"requestFlaggedAsMaliciousFallbackCopyReason": {
"message": "The security provider has not shared additional details"
},
@ -3630,18 +3658,9 @@
"revokeSpendingCapTooltipText": {
"message": "This third party will be unable to spend any more of your current or future tokens."
},
"riskRating": {
"message": "Risk rating"
},
"riskRatingTooltip": {
"message": "The risk rating of the address you are interacting with based on your risk settings"
},
"rpcUrl": {
"message": "New RPC URL"
},
"runReport": {
"message": "Run report"
},
"safeTransferFrom": {
"message": "Safe transfer from"
},
@ -3666,9 +3685,6 @@
"searchResults": {
"message": "Search results"
},
"searchTokens": {
"message": "Search tokens"
},
"secretRecoveryPhrase": {
"message": "Secret Recovery Phrase"
},
@ -3681,9 +3697,22 @@
"securityAlert": {
"message": "Security alert from $1 and $2"
},
"securityAlerts": {
"message": "Security alerts"
},
"securityAlertsDescription": {
"message": "This feature alerts you to malicious activity on Ethereum Mainnet by actively reviewing transaction and signature requests while preserving your privacy. Your data isn't shared with the third party providing this service. Always do your own due diligence before approving any requests. There's no guarantee that this feature will detect all malicious activity."
},
"securityAndPrivacy": {
"message": "Security & privacy"
},
"securityProviderPoweredBy": {
"message": "Powered by $1",
"description": "The security provider that is providing data"
},
"seeDetails": {
"message": "See details"
},
"seedPhraseConfirm": {
"message": "Confirm Secret Recovery Phrase"
},
@ -3762,6 +3791,9 @@
"selectAnAccountHelp": {
"message": "Select the custodian accounts to use in MetaMask Institutional."
},
"selectAnAction": {
"message": "Select an action"
},
"selectHdPath": {
"message": "Select HD path"
},
@ -3774,9 +3806,6 @@
"selectPathHelp": {
"message": "If you don't see the accounts you expect, try switching the HD path."
},
"selectProvider": {
"message": "Select providers:"
},
"selectType": {
"message": "Select Type"
},
@ -3789,6 +3818,9 @@
"sendBugReport": {
"message": "Send us a bug report."
},
"sendDescription": {
"message": "Send crypto to any account"
},
"sendSpecifiedTokens": {
"message": "Send $1",
"description": "Symbol of the specified token"
@ -3854,21 +3886,21 @@
"message": "This relies on $1 which will have access to your Ethereum address and your IP address. $2",
"description": "$1 is the link to etherscan url and $2 is the link to the privacy policy of consensys APIs"
},
"showIncomingTransactionsInformation": {
"message": "This relies on each network which will have access to your Ethereum address and your IP address."
},
"showMore": {
"message": "Show more"
},
"showNft": {
"message": "Show NFT"
},
"showPermissions": {
"message": "Show permissions"
},
"showPrivateKey": {
"message": "Show private key"
},
"showPrivateKeys": {
"message": "Show Private Keys"
},
"showReport": {
"message": "Show report"
},
"showTestnetNetworks": {
"message": "Show test networks"
},
@ -3908,6 +3940,9 @@
"skipAccountSecurityDetails": {
"message": "I understand that until I back up my Secret Recovery Phrase, I may lose my accounts and all of their assets."
},
"smartContracts": {
"message": "Smart contracts"
},
"smartSwap": {
"message": "Smart swap"
},
@ -4098,9 +4133,6 @@
"somethingWentWrong": {
"message": "Oops! Something went wrong."
},
"source": {
"message": "Source"
},
"speedUp": {
"message": "Speed up"
},
@ -4235,6 +4267,9 @@
"stake": {
"message": "Stake"
},
"stakeDescription": {
"message": "Hold up your crypto and earn potential profits"
},
"stateLogError": {
"message": "Error in retrieving state logs."
},
@ -4371,6 +4406,9 @@
"swap": {
"message": "Swap"
},
"swapAdjustSlippage": {
"message": "Adjust slippage"
},
"swapAggregator": {
"message": "Aggregator"
},
@ -4423,15 +4461,18 @@
"swapDecentralizedExchange": {
"message": "Decentralized exchange"
},
"swapDescription": {
"message": "Swap and trade your tokens"
},
"swapDirectContract": {
"message": "Direct contract"
},
"swapDisabled": {
"message": "Swap is not available in this network"
},
"swapEditLimit": {
"message": "Edit limit"
},
"swapEditTransactionSettings": {
"message": "Edit transaction settings"
},
"swapEnableDescription": {
"message": "This is required and gives MetaMask permission to swap your $1.",
"description": "Gives the user info about the required approval transaction for swaps. $1 will be the symbol of a token being approved for swaps."
@ -4492,6 +4533,9 @@
"message": "Gas fees are paid to crypto miners who process transactions on the $1 network. MetaMask does not profit from gas fees.",
"description": "$1 is the selected network, e.g. Ethereum or BSC"
},
"swapHighSlippage": {
"message": "High slippage"
},
"swapHighSlippageWarning": {
"message": "Slippage amount is very high."
},
@ -4506,6 +4550,9 @@
"swapLearnMore": {
"message": "Learn more about Swaps"
},
"swapLowSlippage": {
"message": "Low slippage"
},
"swapLowSlippageError": {
"message": "Transaction may fail, max slippage too low."
},
@ -4616,6 +4663,20 @@
"swapShowLatestQuotes": {
"message": "Show latest quotes"
},
"swapSlippageHighDescription": {
"message": "The slippage entered ($1%) is considered very high and may result in a bad rate",
"description": "$1 is the amount of % for slippage"
},
"swapSlippageHighTitle": {
"message": "High slippage"
},
"swapSlippageLowDescription": {
"message": "A value this low ($1%) may result in a failed swap",
"description": "$1 is the amount of % for slippage"
},
"swapSlippageLowTitle": {
"message": "Low slippage"
},
"swapSlippageNegative": {
"message": "Slippage must be greater or equal to zero"
},
@ -4629,27 +4690,15 @@
"message": "Slippage tolerance must be 15% or less. Anything higher will result in a bad rate."
},
"swapSlippageOverLimitTitle": {
"message": "Reduce slippage to continue"
"message": "Very high slippage"
},
"swapSlippagePercent": {
"message": "$1%",
"description": "$1 is the amount of % for slippage"
},
"swapSlippageTooLowDescription": {
"message": "Max slippage is too low which may cause your transaction to fail."
},
"swapSlippageTooLowTitle": {
"message": "Increase slippage to avoid transaction failure"
},
"swapSlippageTooltip": {
"message": "If the price changes between the time your order is placed and confirmed its called “slippage”. Your swap will automatically cancel if slippage exceeds your “slippage tolerance” setting."
},
"swapSlippageVeryHighDescription": {
"message": "The slippage entered is considered very high and may result in a bad rate"
},
"swapSlippageVeryHighTitle": {
"message": "Very high slippage"
},
"swapSlippageZeroDescription": {
"message": "There are fewer zero-slippage quote providers which will result in a less competitive quote."
},
@ -4695,6 +4744,9 @@
"message": "We were unable to retrieve your $1 balance",
"description": "This message communicates to the user that their balance of a given token is currently unavailable. $1 will be replaced by a token symbol"
},
"swapTokenNotAvailable": {
"message": "Token is not available to swap in this region"
},
"swapTokenToToken": {
"message": "Swap $1 to $2",
"description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap."
@ -5128,9 +5180,6 @@
"txInsightsNotSupported": {
"message": "Transaction insights not supported for this contract at this time."
},
"typePassword": {
"message": "Type your MetaMask password"
},
"typeYourSRP": {
"message": "Type your Secret Recovery Phrase"
},
@ -5201,11 +5250,17 @@
"urlExistsErrorMsg": {
"message": "This URL is currently used by the $1 network."
},
"use4ByteResolution": {
"message": "Decode smart contracts"
},
"use4ByteResolutionDescription": {
"message": "To improve user experience, we customize the activity tab with messages based on the smart contracts you interact with. MetaMask uses a service called 4byte.directory to decode data and show you a version of a smart contract that's easier to read. This helps reduce your chances of approving malicious smart contract actions, but can result in your IP address being shared."
},
"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."
"useMultiAccountBalanceCheckerSettingDescription": {
"message": "Get faster balance updates by batching account balance requests. This lets us fetch your account balances together, so you get quicker updates for an improved experience. When this feature is off, third parties may be less likely to associate your accounts with each other."
},
"useNftDetection": {
"message": "Autodetect NFTs"
@ -5312,6 +5367,9 @@
"visitWebSite": {
"message": "Visit our website"
},
"wallet": {
"message": "Wallet"
},
"walletConnectionGuide": {
"message": "our hardware wallet connection guide"
},
@ -5339,8 +5397,7 @@
"message": "Want to add this network?"
},
"wantsToAddThisAsset": {
"message": "$1 wants to add this asset to your wallet",
"description": "$1 is the name of the website that wants to add an asset to your wallet"
"message": "This allows the following asset to be added to your wallet."
},
"warning": {
"message": "Warning"

File diff suppressed because it is too large Load Diff

View File

@ -100,9 +100,6 @@
"addContact": {
"message": "Agregar contacto"
},
"addCustomToken": {
"message": "Añadir token personalizado"
},
"addEthereumChainConfirmationDescription": {
"message": "Esto permitirá que la red se utilice en MetaMask."
},
@ -472,9 +469,6 @@
"copyAddress": {
"message": "Copiar dirección al Portapapeles"
},
"copyPrivateKey": {
"message": "Esta es su clave privada (haga clic para copiarla)"
},
"copyRawTransactionData": {
"message": "Copiar los datos de las transacciones en bruto"
},
@ -578,9 +572,6 @@
"deleteNetwork": {
"message": "¿Eliminar red?"
},
"deleteNetworkDescription": {
"message": "¿Está seguro de que quiere eliminar esta red?"
},
"description": {
"message": "Descripción"
},
@ -734,12 +725,6 @@
"enableFromSettings": {
"message": " Actívela en Configuración."
},
"enableOpenSeaAPI": {
"message": "Activar API de OpenSea"
},
"enableOpenSeaAPIDescription": {
"message": "Utilice la API de OpenSea para obtener los datos de NFT. La autodetección de NFT depende de la API de OpenSea y no estará disponible si la API está desactivada."
},
"enableToken": {
"message": "activar $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -773,9 +758,6 @@
"enterMaxSpendLimit": {
"message": "Escribir límite máximo de gastos"
},
"enterPassword": {
"message": "Escribir contraseña"
},
"enterPasswordContinue": {
"message": "Escribir contraseña para continuar"
},
@ -832,9 +814,6 @@
"experimental": {
"message": "Experimental"
},
"exportPrivateKey": {
"message": "Exportar clave privada"
},
"externalExtension": {
"message": "Extensión externa"
},
@ -1626,14 +1605,6 @@
"onboardingPinExtensionTitle": {
"message": "¡Su instalación de MetaMask ha finalizado!"
},
"onboardingShowIncomingTransactionsDescription": {
"message": "Mostrar las transacciones entrantes en su cartera depende de la comunicación con $1. Etherscan tendrá acceso a su dirección de Ethereum y a su dirección IP. Ver $2.",
"description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key."
},
"onboardingUsePhishingDetectionDescription": {
"message": "Las alertas de detección de phishing se basan en la comunicación con $1. jsDeliver tendrá acceso a su dirección IP. Ver $2.",
"description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link"
},
"onlyAddTrustedNetworks": {
"message": "Un proveedor de red malintencionado puede mentir sobre el estado de la cadena de bloques y registrar su actividad de red. Agregue solo redes personalizadas de confianza."
},
@ -1882,9 +1853,6 @@
"searchResults": {
"message": "Resultados de la búsqueda"
},
"searchTokens": {
"message": "Buscar tokens"
},
"secretRecoveryPhrase": {
"message": "Frase secreta de recuperación"
},
@ -2026,9 +1994,6 @@
"showPermissions": {
"message": "Mostrar permisos"
},
"showPrivateKeys": {
"message": "Mostrar claves privadas"
},
"showTestnetNetworks": {
"message": "Mostrar redes de prueba"
},
@ -2062,9 +2027,6 @@
"somethingWentWrong": {
"message": "Lo lamentamos, se produjo un error."
},
"source": {
"message": "Fuente"
},
"speedUp": {
"message": "Acelerar"
},
@ -2646,9 +2608,6 @@
"txInsightsNotSupported": {
"message": "En este momento no se admiten informaciones sobre las transacciones para este contrato."
},
"typePassword": {
"message": "Escriba su contraseña de MetaMask"
},
"u2f": {
"message": "U2F",
"description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices."

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Kopeeri aadress lõikelauale"
},
"copyPrivateKey": {
"message": "See on teie privaatne võti (klõpsake kopeerimiseks)"
},
"copyToClipboard": {
"message": "Kopeeri lõikelauale"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Võrk kustutada?"
},
"deleteNetworkDescription": {
"message": "Olete kindel, et soovite selle võrgu kustutada?"
},
"details": {
"message": "Üksikasjad"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "Tõrge ENS-i nime registreerimisel"
},
"enterPassword": {
"message": "Sisestage parool"
},
"enterPasswordContinue": {
"message": "Jätkamiseks sisestage parool"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Laienda vaadet"
},
"exportPrivateKey": {
"message": "Ekspordi privaatvõti"
},
"failed": {
"message": "Nurjus"
},
@ -617,9 +605,6 @@
"searchResults": {
"message": "Otsingutulemused"
},
"searchTokens": {
"message": "Lubade otsimine"
},
"securityAndPrivacy": {
"message": "Turvalisus ja privaatsus"
},
@ -659,9 +644,6 @@
"showHexDataDescription": {
"message": "Valige see, et kuvada saatmisekraanil hex-andmete väli"
},
"showPrivateKeys": {
"message": "Kuva privaatvõtmed"
},
"sigRequest": {
"message": "Allkirja taotlus"
},
@ -782,9 +764,6 @@
"tryAgain": {
"message": "Proovi uuesti"
},
"typePassword": {
"message": "Sisestage oma MetaMaski parool"
},
"unapproved": {
"message": "Kinnitamata"
},

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "کاپی آدرس به کلیپ بورد"
},
"copyPrivateKey": {
"message": "این کلید خصوصی شما است (برای کاپی نمودن کلیک کنید)"
},
"copyToClipboard": {
"message": "کپی در بریده‌دان"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "شبکه حذف شود؟"
},
"deleteNetworkDescription": {
"message": "آیا مطمئن هستید که این شبکه حذف شود؟"
},
"details": {
"message": "جزئیات"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "خطا در ثبت نام ENS"
},
"enterPassword": {
"message": "رمز عبور را وارد کنید"
},
"enterPasswordContinue": {
"message": "برای ادامه رمز عبور را وارد کنید"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "توسعه ساحه دید"
},
"exportPrivateKey": {
"message": "صدور کلید شخصی"
},
"failed": {
"message": "ناموفق شد"
},
@ -627,9 +615,6 @@
"searchResults": {
"message": "نتایج جستجو"
},
"searchTokens": {
"message": "رمزیاب های جستجو"
},
"securityAndPrivacy": {
"message": "امنیت و حریم خصوصی"
},
@ -669,9 +654,6 @@
"showHexDataDescription": {
"message": "برای نمایش بخش اطلاعات hex در صفحه ارسال این را انتخاب نمایید"
},
"showPrivateKeys": {
"message": "نمایش کلید های شخصی"
},
"sigRequest": {
"message": "درخواست امضاء"
},
@ -792,9 +774,6 @@
"tryAgain": {
"message": "امتحان مجدد"
},
"typePassword": {
"message": "رمز عبور MetaMask تان را تایپ نمایید"
},
"unapproved": {
"message": "تصدیق ناشده"
},

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Kopioi osoite leikepöydälle"
},
"copyPrivateKey": {
"message": "Tämä on yksityinen avaimesi (kopioi napsauttamalla)"
},
"copyToClipboard": {
"message": "Kopioi leikepöydälle"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Poistetaanko verkko?"
},
"deleteNetworkDescription": {
"message": "Haluatko varmasti poistaa tämän verkon?"
},
"details": {
"message": "Tiedot"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "Virhe ENS-nimen rekisteröinnissä"
},
"enterPassword": {
"message": "Kirjoita salasana"
},
"enterPasswordContinue": {
"message": "Syötä salasana voidaksesi jatkaa"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Laajenna näkymää"
},
"exportPrivateKey": {
"message": "Vie yksityinen avain"
},
"failed": {
"message": "Epäonnistui"
},
@ -624,9 +612,6 @@
"searchResults": {
"message": "Hakutulokset"
},
"searchTokens": {
"message": "Hae tietueita"
},
"securityAndPrivacy": {
"message": "Turva & yksityisyys"
},
@ -666,9 +651,6 @@
"showHexDataDescription": {
"message": "Näytä hex-tietokenttä lähetysnäytössä valitsemalla tämän"
},
"showPrivateKeys": {
"message": "Näytä yksityiset avaimet"
},
"sigRequest": {
"message": "Allekirjoitus pyydetään"
},
@ -789,9 +771,6 @@
"tryAgain": {
"message": "Yritä uudelleen"
},
"typePassword": {
"message": "Kirjoita MetaMask-salasanasi"
},
"unapproved": {
"message": "Ei hyväksytty"
},

View File

@ -154,9 +154,6 @@
"copyAddress": {
"message": "Kopyahin ang address sa clipboard"
},
"copyPrivateKey": {
"message": "Ito ang iyong pribadong private key (i-click para kopyahin)"
},
"copyToClipboard": {
"message": "Kopyahin sa clipboard"
},
@ -190,9 +187,6 @@
"deleteNetwork": {
"message": "I-delete ang Network?"
},
"deleteNetworkDescription": {
"message": "Sigurado ka bang gusto mong i-delete ang network na ito?"
},
"details": {
"message": "Mga Detalye"
},
@ -220,9 +214,6 @@
"ensRegistrationError": {
"message": "May error sa pagrerehistro ng ENS name"
},
"enterPassword": {
"message": "Ilagay ang password"
},
"enterPasswordContinue": {
"message": "Ilagay ang password para magpatuloy"
},
@ -232,9 +223,6 @@
"expandView": {
"message": "I-expand ang View"
},
"exportPrivateKey": {
"message": "I-export ang Private Key"
},
"failed": {
"message": "Nabigo"
},
@ -551,9 +539,6 @@
"searchResults": {
"message": "Mga Resulta ng Paghahanap"
},
"searchTokens": {
"message": "Maghanap ng Mga Token"
},
"securityAndPrivacy": {
"message": "Seguridad at Privacy"
},
@ -593,9 +578,6 @@
"showHexDataDescription": {
"message": "Piliin ito para ipakita ang hex data field sa screen ng pagpapadala"
},
"showPrivateKeys": {
"message": "Ipakita ang mga Private Key"
},
"sign": {
"message": "I-sign"
},
@ -704,9 +686,6 @@
"tryAgain": {
"message": "Subukang muli"
},
"typePassword": {
"message": "I-type ang iyong password sa MetaMask"
},
"unapproved": {
"message": "Hindi inaprubahan"
},

File diff suppressed because it is too large Load Diff

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "העתק כתובת ללוח"
},
"copyPrivateKey": {
"message": "זה המפתח הפרטי שלך (נא להקיש כדי להעתיק)"
},
"copyToClipboard": {
"message": "העתק ללוח"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "למחוק את הרשת?"
},
"deleteNetworkDescription": {
"message": "הנך בטוח/ה שברצונך למחוק רשת זו?"
},
"details": {
"message": "פרטים"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "שגיאה ברישום שם ENS"
},
"enterPassword": {
"message": "יש להזין ססמה"
},
"enterPasswordContinue": {
"message": "יש להזין ססמה כדי להמשיך"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "הרחב תצוגה"
},
"exportPrivateKey": {
"message": "יצא/י מפתח פרטי"
},
"failed": {
"message": "נכשל"
},
@ -624,9 +612,6 @@
"searchResults": {
"message": "תוצאות חיפוש"
},
"searchTokens": {
"message": "חיפוש טוקנים"
},
"securityAndPrivacy": {
"message": "אבטחה ופרטיות"
},
@ -666,9 +651,6 @@
"showHexDataDescription": {
"message": "בחר/י בזה כדי להציג את שדה הנתונים ההקסדצימאלים על מסך השליחה"
},
"showPrivateKeys": {
"message": "הצג מפתחות פרטיים"
},
"sigRequest": {
"message": "בקשת חתימה"
},
@ -789,9 +771,6 @@
"tryAgain": {
"message": "ניסיון חוזר"
},
"typePassword": {
"message": "נא להקליד את סיסמת MetaMask שלך"
},
"unapproved": {
"message": "לא אושר"
},

File diff suppressed because it is too large Load Diff

View File

@ -60,9 +60,6 @@
"copiedExclamation": {
"message": "कॉपी कर दिया गया!"
},
"copyPrivateKey": {
"message": "यह आपकी निजी कुंजी है (कॉपी करने के लिए क्लिक करें)।"
},
"copyToClipboard": {
"message": "क्लिपबोर्ड पर कॉपी करें"
},
@ -87,15 +84,9 @@
"edit": {
"message": "संपादित करें"
},
"enterPassword": {
"message": "पासवर्ड दर्ज करें"
},
"etherscanView": {
"message": "ईथरस्कैन पर खाता देखें"
},
"exportPrivateKey": {
"message": "निजी कुंजी निर्यात करें"
},
"failed": {
"message": "विफल"
},
@ -281,9 +272,6 @@
"settings": {
"message": "सेटिंग्स"
},
"showPrivateKeys": {
"message": "निजी कुंजी दिखाएँ"
},
"sigRequest": {
"message": "हस्ताक्षर अनुरोध"
},
@ -317,9 +305,6 @@
"total": {
"message": "कुल"
},
"typePassword": {
"message": "अपना पासवर्ड टाइप करें"
},
"unknown": {
"message": "अज्ञात नेटवर्क"
},

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Kopiraj adresu u međuspremnik"
},
"copyPrivateKey": {
"message": "Ovo je vaš privatni ključ (kliknite za kopiranje)"
},
"copyToClipboard": {
"message": "Kopiraj u međuspremnik"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Izbrisati mrežu?"
},
"deleteNetworkDescription": {
"message": "Sigurno želite izbrisati ovu mrežu?"
},
"details": {
"message": "Detalji"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "Greška u registraciji naziva ENS"
},
"enterPassword": {
"message": "Upiši lozinku"
},
"enterPasswordContinue": {
"message": "Upišite lozinku za nastavak"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Proširi prikaz"
},
"exportPrivateKey": {
"message": "Izvezi privatni ključ"
},
"failed": {
"message": "Neuspješno"
},
@ -620,9 +608,6 @@
"searchResults": {
"message": "Rezultati pretraživanja"
},
"searchTokens": {
"message": "Pretraži tokene"
},
"securityAndPrivacy": {
"message": "Sigurnost i privatnost"
},
@ -662,9 +647,6 @@
"showHexDataDescription": {
"message": "Odaberite ovu stavku za prikaz polja namijenjenog za podatke hex na zaslonu za slanje"
},
"showPrivateKeys": {
"message": "Prikaži privatne ključe"
},
"sigRequest": {
"message": "Zahtjev za potpisom"
},
@ -782,9 +764,6 @@
"tryAgain": {
"message": "Pokušaj ponovo"
},
"typePassword": {
"message": "Upišite svoju lozinku MetaMask."
},
"unapproved": {
"message": "Neodobreno"
},

View File

@ -108,9 +108,6 @@
"copyAddress": {
"message": "Kopi adrès clipboard"
},
"copyPrivateKey": {
"message": "Sa a se kle prive ou (klike pou ou kopye)"
},
"copyToClipboard": {
"message": "Kopi clipboard"
},
@ -147,9 +144,6 @@
"edit": {
"message": "Korije"
},
"enterPassword": {
"message": "Mete modpas"
},
"enterPasswordContinue": {
"message": "Mete modpas pou kontinye"
},
@ -159,9 +153,6 @@
"expandView": {
"message": "Elaji Wè"
},
"exportPrivateKey": {
"message": "Voye Kòd Prive"
},
"failed": {
"message": "Tonbe"
},
@ -452,9 +443,6 @@
"searchResults": {
"message": "Rezilta rechèch"
},
"searchTokens": {
"message": "Rechèch Tokens"
},
"seedPhraseReq": {
"message": "Seed fraz yo se 12 long mo"
},
@ -485,9 +473,6 @@
"showHexDataDescription": {
"message": "Pran sa pouw ka montre chan entèfas hex data a"
},
"showPrivateKeys": {
"message": "Montre Kle Prive"
},
"sigRequest": {
"message": "Demann Siyati"
},
@ -557,9 +542,6 @@
"tryAgain": {
"message": "Eseye anko"
},
"typePassword": {
"message": "Tape modpas ou"
},
"unapproved": {
"message": "Pa apwouve"
},

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Másolja a címet a vágólapra"
},
"copyPrivateKey": {
"message": "Ez a saját titkos kulcsod (kattints rá a másoláshoz)"
},
"copyToClipboard": {
"message": "Másolás a vágólapra"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Törli a hálózatot?"
},
"deleteNetworkDescription": {
"message": "Biztosan törli ezt a hálózatot?"
},
"details": {
"message": "Részletek"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "Hiba történt az ENS név regisztrációjakor"
},
"enterPassword": {
"message": "Adja meg a jelszót"
},
"enterPasswordContinue": {
"message": "A folytatáshoz adja meg a jelszót"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Nézet nagyítása"
},
"exportPrivateKey": {
"message": "Privát kulcs exportálása"
},
"failed": {
"message": "Sikertelen"
},
@ -620,9 +608,6 @@
"searchResults": {
"message": "Keresési eredmények"
},
"searchTokens": {
"message": "Keresés a tokenek között"
},
"securityAndPrivacy": {
"message": "Biztonság és adatvédelem"
},
@ -662,9 +647,6 @@
"showHexDataDescription": {
"message": "Válassza ezt, ha a hex adatmezőt a küldő képernyőn szeretné megnézni"
},
"showPrivateKeys": {
"message": "Mutassa a privát kulcsokat"
},
"sigRequest": {
"message": "Aláírás kérése"
},
@ -782,9 +764,6 @@
"tryAgain": {
"message": "Újra"
},
"typePassword": {
"message": "Írd be MetaMask jelszavadat"
},
"unapproved": {
"message": "Jóvá nem hagyott"
},

File diff suppressed because it is too large Load Diff

View File

@ -155,9 +155,6 @@
"addContact": {
"message": "Aggiungi contatto"
},
"addCustomToken": {
"message": "Aggiungi token personalizzato"
},
"addEthereumChainConfirmationDescription": {
"message": "Ciò consentirà a questa rete di essere utilizzata all'interno di MetaMask."
},
@ -576,9 +573,6 @@
"copyAddress": {
"message": "Copia l'indirizzo"
},
"copyPrivateKey": {
"message": "Questa è la tua chiave privata (clicca per copiare)"
},
"copyRawTransactionData": {
"message": "Copia i dati grezzi della transazione"
},
@ -713,9 +707,6 @@
"deleteNetwork": {
"message": "Cancella la rete?"
},
"deleteNetworkDescription": {
"message": "Sei sicuro di voler eliminare questa rete?"
},
"deprecatedTestNetworksLink": {
"message": "Scopri di più"
},
@ -840,9 +831,6 @@
"enterMaxSpendLimit": {
"message": "Inserisici Limite Spesa"
},
"enterPassword": {
"message": "Inserisci password"
},
"enterPasswordContinue": {
"message": "Inserisci la tua password per continuare"
},
@ -875,9 +863,6 @@
"expandView": {
"message": "Espandi Vista"
},
"exportPrivateKey": {
"message": "Esporta Chiave Privata"
},
"externalExtension": {
"message": "Estensione Esterna"
},
@ -1377,9 +1362,6 @@
"searchResults": {
"message": "Risultati Ricerca"
},
"searchTokens": {
"message": "Cerca Tokens"
},
"securityAndPrivacy": {
"message": "Sicurezza & Privacy"
},
@ -1442,9 +1424,6 @@
"showPermissions": {
"message": "Mostra permessi"
},
"showPrivateKeys": {
"message": "Mostra Chiave Privata"
},
"sigRequest": {
"message": "Firma Richiesta"
},
@ -1797,9 +1776,6 @@
"tryAgain": {
"message": "Prova di nuovo"
},
"typePassword": {
"message": "Inserisci Password"
},
"unapproved": {
"message": "Non approvata"
},

File diff suppressed because it is too large Load Diff

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "ವಿಳಾಸವನ್ನು ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಿ"
},
"copyPrivateKey": {
"message": "ಇದು ನಿಮ್ಮ ಖಾಸಗಿ ಕೀ ಆಗಿದೆ (ನಕಲಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ)"
},
"copyToClipboard": {
"message": "ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಿ"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "ನೆಟ್‌ವರ್ಕ್ ಅಳಿಸುವುದೇ?"
},
"deleteNetworkDescription": {
"message": "ನೀವು ಈ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಖಚಿತವಾಗಿ ಅಳಿಸಲು ಬಯಸುತ್ತೀರಾ?"
},
"details": {
"message": "ವಿವರಗಳು"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "ENS ಹೆಸರಿನ ನೋಂದಣಿಯಲ್ಲಿ ದೋಷ"
},
"enterPassword": {
"message": "ಪಾಸ್‌ವರ್ಡ್‌ ಅನ್ನು ನಮೂದಿಸಿ"
},
"enterPasswordContinue": {
"message": "ಮುಂದುವರೆಯಲು ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "ವಿಸ್ತರಿಸಿದ ವೀಕ್ಷಣೆ"
},
"exportPrivateKey": {
"message": "ಖಾಸಗಿ ಕೀಲಿಯನ್ನು ರಫ್ತು ಮಾಡಿ"
},
"failed": {
"message": "ವಿಫಲವಾಗಿದೆ"
},
@ -627,9 +615,6 @@
"searchResults": {
"message": "ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳು"
},
"searchTokens": {
"message": "ಟೋಕನ್‌ಗಳನ್ನು ಹುಡುಕಿ"
},
"securityAndPrivacy": {
"message": "ಭದ್ರತೆ ಮತ್ತು ಗೌಪ್ಯತೆ"
},
@ -669,9 +654,6 @@
"showHexDataDescription": {
"message": "ಕಳುಹಿಸುವ ಪರದೆಯಲ್ಲಿ ಹೆಕ್ಸ್ ಡೇಟಾ ಕ್ಷೇತ್ರವನ್ನು ತೋರಿಸಲು ಇದನ್ನು ಆಯ್ಕೆಮಾಡಿ"
},
"showPrivateKeys": {
"message": "ಖಾಸಗಿ ಕೀಗಳನ್ನು ತೋರಿಸಿ"
},
"sigRequest": {
"message": "ಸಹಿಯ ವಿನಂತಿ"
},
@ -792,9 +774,6 @@
"tryAgain": {
"message": "ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"
},
"typePassword": {
"message": "ನಿಮ್ಮ MetaMask ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಟೈಪ್ ಮಾಡಿ"
},
"unapproved": {
"message": "ಅನುಮೋದಿಸದಿರುವುದು"
},

File diff suppressed because it is too large Load Diff

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Kopijuoti adresą į iškarpinę"
},
"copyPrivateKey": {
"message": "Tai yra jūsų asmeninis raktas (spustelėkite, kad nukopijuotumėte)"
},
"copyToClipboard": {
"message": "Kopijuoti į iškarpinę"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Panaikinti tinklą?"
},
"deleteNetworkDescription": {
"message": "Ar tikrai norite panaikinti šį tinklą?"
},
"details": {
"message": "Išsami informacija"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "ENS pavadinimo registracijos klaida"
},
"enterPassword": {
"message": "Įveskite slaptažodį"
},
"enterPasswordContinue": {
"message": "Norėdami tęsti, įveskite slaptažodį"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Išskleisti rodinį"
},
"exportPrivateKey": {
"message": "Eksportuoti asmeninį raktą"
},
"failed": {
"message": "Nepavyko"
},
@ -627,9 +615,6 @@
"searchResults": {
"message": "Paieškos rezultatai"
},
"searchTokens": {
"message": "Ieškoti žetonų"
},
"securityAndPrivacy": {
"message": "Sauga ir privatumas"
},
@ -669,9 +654,6 @@
"showHexDataDescription": {
"message": "Pasirinkite tai, kad siuntimo ekrane būtų rodomas šešioliktainių duomenų laukas"
},
"showPrivateKeys": {
"message": "Rodyti asmeninius raktus"
},
"sigRequest": {
"message": "Parašo užklausa"
},
@ -792,9 +774,6 @@
"tryAgain": {
"message": "Bandyti dar kartą"
},
"typePassword": {
"message": "Įveskite savo „MetaMask“ slaptažodį"
},
"unapproved": {
"message": "Nepatvirtinta"
},

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Iekopēt adresi starpliktuvē"
},
"copyPrivateKey": {
"message": "Šī ir jūsu privātā atslēga (noklikšķiniet, lai nokopētu)"
},
"copyToClipboard": {
"message": "Kopēt starpliktuvē"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Dzēst tīklu?"
},
"deleteNetworkDescription": {
"message": "Vai tiešām vēlaties dzēst šo tīklu?"
},
"details": {
"message": "Informācija"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "Kļūda ENS vārda reģistrācijā"
},
"enterPassword": {
"message": "Ievadiet paroli"
},
"enterPasswordContinue": {
"message": "Ievadiet paroli, lai turpinātu"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Izvērst skatījumu"
},
"exportPrivateKey": {
"message": "Eksportēt privāto atslēgu"
},
"failed": {
"message": "Neizdevās"
},
@ -623,9 +611,6 @@
"searchResults": {
"message": "Meklēšanas rezultāti"
},
"searchTokens": {
"message": "Meklēt marķierus"
},
"securityAndPrivacy": {
"message": "Drošība un konfidencialitāte"
},
@ -665,9 +650,6 @@
"showHexDataDescription": {
"message": "Atlasiet šo, lai atvērtu hex datus sūtīšanas ekrānā"
},
"showPrivateKeys": {
"message": "Rādīt privātās atslēgas"
},
"sigRequest": {
"message": "Paraksta pieprasījums"
},
@ -788,9 +770,6 @@
"tryAgain": {
"message": "Mēģināt vēlreiz"
},
"typePassword": {
"message": "Ievadiet savu MetaMask paroli"
},
"unapproved": {
"message": "Nav apstiprināts"
},

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Salin alamat kepada papan klip"
},
"copyPrivateKey": {
"message": "Ini kunci persendirian anda (klik untuk menyalin)"
},
"copyToClipboard": {
"message": "Salin ke papan keratan"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Padamkan Rangkaian?"
},
"deleteNetworkDescription": {
"message": "Anda pasti anda ingin padamkan rangkaian ini?"
},
"details": {
"message": "Butiran"
},
@ -241,9 +235,6 @@
"ensRegistrationError": {
"message": "Ralat dalam pendaftaran nama ENS"
},
"enterPassword": {
"message": "Masukkan kata laluan"
},
"enterPasswordContinue": {
"message": "Masukkan kata laluan untuk teruskan"
},
@ -256,9 +247,6 @@
"expandView": {
"message": "Kembangkan Paparan"
},
"exportPrivateKey": {
"message": "Eksport Kekunci Persendirian"
},
"failed": {
"message": "Gagal"
},
@ -607,9 +595,6 @@
"searchResults": {
"message": "Hasil Carian"
},
"searchTokens": {
"message": "Cari Token"
},
"securityAndPrivacy": {
"message": "Keselamatan & Privasi"
},
@ -649,9 +634,6 @@
"showHexDataDescription": {
"message": "Pilih ini untuk menunjukkan medan data hex pada skrin hantar"
},
"showPrivateKeys": {
"message": "Tunjukkan Kunci Persendirian"
},
"sigRequest": {
"message": "Permintaan Tandatangan"
},
@ -769,9 +751,6 @@
"tryAgain": {
"message": "Cuba lagi"
},
"typePassword": {
"message": "Taip kata laluan MetaMask anda"
},
"unapproved": {
"message": "Belum Diluluskan"
},

View File

@ -60,9 +60,6 @@
"copiedExclamation": {
"message": "Gekopieerd!"
},
"copyPrivateKey": {
"message": "Dit is uw privésleutel (klik om te kopiëren)"
},
"copyToClipboard": {
"message": "Kopieer naar klembord"
},
@ -84,15 +81,9 @@
"edit": {
"message": "Bewerk"
},
"enterPassword": {
"message": "Voer wachtwoord in"
},
"etherscanView": {
"message": "Bekijk account op Etherscan"
},
"exportPrivateKey": {
"message": "Exporteer privésleutel"
},
"failed": {
"message": "mislukt"
},
@ -271,9 +262,6 @@
"settings": {
"message": "instellingen"
},
"showPrivateKeys": {
"message": "Privésleutels weergeven"
},
"sigRequest": {
"message": "Ondertekeningsverzoek"
},
@ -307,9 +295,6 @@
"total": {
"message": "Totaal"
},
"typePassword": {
"message": "Typ uw wachtwoord"
},
"unknown": {
"message": "Onbekend"
},

View File

@ -172,9 +172,6 @@
"copyAddress": {
"message": "Kopier adresse til utklippstavlen "
},
"copyPrivateKey": {
"message": "Dette er din private nøkkel (klikk for å kopiere)"
},
"copyToClipboard": {
"message": "Kopiér til utklippstavlen"
},
@ -211,9 +208,6 @@
"deleteNetwork": {
"message": "Slette nettverk? "
},
"deleteNetworkDescription": {
"message": "Er du sikker på at du vil slette dette nettverket?"
},
"details": {
"message": "Detaljer"
},
@ -241,9 +235,6 @@
"ensRegistrationError": {
"message": "Feil i ENS-navneregistrering"
},
"enterPassword": {
"message": "Skriv inn passord "
},
"enterPasswordContinue": {
"message": "Skriv inn passord for å fortsette"
},
@ -256,9 +247,6 @@
"expandView": {
"message": "Utvid visning"
},
"exportPrivateKey": {
"message": "Eksporter privat nøkkel"
},
"failed": {
"message": "Mislyktes"
},
@ -611,9 +599,6 @@
"searchResults": {
"message": "Søkeresultater"
},
"searchTokens": {
"message": "Søk i sjetonger"
},
"securityAndPrivacy": {
"message": "Sikkerhet og personvern"
},
@ -650,9 +635,6 @@
"showHexDataDescription": {
"message": "Velg dette for å vise hex-datafeltet på sendskjermen"
},
"showPrivateKeys": {
"message": "Vis private nøkler"
},
"sigRequest": {
"message": "Signaturforespørsel "
},
@ -767,9 +749,6 @@
"tryAgain": {
"message": "Prøv igjen"
},
"typePassword": {
"message": "Skriv inn MetaMask-passordet"
},
"unapproved": {
"message": "Ikke godkjent "
},

View File

@ -338,9 +338,6 @@
"copyAddress": {
"message": "Kopyahin ang address sa clipboard"
},
"copyPrivateKey": {
"message": "Ito ang iyong pribadong key (i-click para kopyahin)"
},
"copyToClipboard": {
"message": "Kopyahin sa clipboard"
},
@ -409,9 +406,6 @@
"deleteNetwork": {
"message": "I-delete ang Network?"
},
"deleteNetworkDescription": {
"message": "Sigurado ka bang gusto mong i-delete ang network na ito?"
},
"details": {
"message": "Mga Detalye"
},
@ -492,9 +486,6 @@
"enterMaxSpendLimit": {
"message": "Ilagay ang Max na Limitasyon sa Paggastos"
},
"enterPassword": {
"message": "Ilagay ang password"
},
"enterPasswordContinue": {
"message": "Ilagay ang password para magpatuloy"
},
@ -545,9 +536,6 @@
"expandView": {
"message": "I-expand ang view"
},
"exportPrivateKey": {
"message": "I-export ang Pribadong Key"
},
"externalExtension": {
"message": "External Extension"
},
@ -1214,9 +1202,6 @@
"searchResults": {
"message": "Mga Resulta ng Paghahanap"
},
"searchTokens": {
"message": "Maghanap ng Mga Token"
},
"securityAndPrivacy": {
"message": "Seguridad at Privacy"
},
@ -1315,9 +1300,6 @@
"showPermissions": {
"message": "Ipakita ang mga pahintulot"
},
"showPrivateKeys": {
"message": "Ipakita ang Mga Private Key"
},
"sigRequest": {
"message": "Request ng Signature"
},
@ -1770,9 +1752,6 @@
"tryAgain": {
"message": "Subukan ulit"
},
"typePassword": {
"message": "Uri ng password ng iyong MetaMask"
},
"unapproved": {
"message": "Hindi inaprubahan"
},

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Skopiuj adres do schowka"
},
"copyPrivateKey": {
"message": "To jest Twój prywatny klucz (kliknij żeby skopiować)"
},
"copyToClipboard": {
"message": "Skopiuj do schowka"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Usunąć sieć?"
},
"deleteNetworkDescription": {
"message": "Czy na pewno chcesz usunąć tę sieć?"
},
"details": {
"message": "Szczegóły"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "Błąd w rejestracji nazwy ENS"
},
"enterPassword": {
"message": "Wpisz hasło"
},
"enterPasswordContinue": {
"message": "Podaj hasło żeby kontynuować"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Rozwiń widok"
},
"exportPrivateKey": {
"message": "Eksportuj klucz prywatny"
},
"failed": {
"message": "Nie udało się"
},
@ -621,9 +609,6 @@
"searchResults": {
"message": "Wyniki wyszukiwania"
},
"searchTokens": {
"message": "Szukaj tokenów"
},
"securityAndPrivacy": {
"message": "Bezpieczeństwo i prywatność"
},
@ -663,9 +648,6 @@
"showHexDataDescription": {
"message": "Wybierz to żeby pokazać pole danych hex na ekranie wysyłania"
},
"showPrivateKeys": {
"message": "Pokaż prywatne klucze"
},
"sigRequest": {
"message": "Prośba o podpis"
},
@ -780,9 +762,6 @@
"tryAgain": {
"message": "Spróbuj ponownie"
},
"typePassword": {
"message": "Wpisz hasło"
},
"unapproved": {
"message": "Niezatwierdzone"
},

File diff suppressed because it is too large Load Diff

View File

@ -100,9 +100,6 @@
"addContact": {
"message": "Adicionar contato"
},
"addCustomToken": {
"message": "Adicionar token personalizado"
},
"addEthereumChainConfirmationDescription": {
"message": "Isso permitirá que essa rede seja usada dentro da MetaMask."
},
@ -472,9 +469,6 @@
"copyAddress": {
"message": "Copiar endereço para a área de transferência"
},
"copyPrivateKey": {
"message": "Essa é a sua chave privada (clique para copiar)"
},
"copyRawTransactionData": {
"message": "Copiar dados brutos da transação"
},
@ -578,9 +572,6 @@
"deleteNetwork": {
"message": "Excluir rede?"
},
"deleteNetworkDescription": {
"message": "Quer mesmo excluir essa rede?"
},
"description": {
"message": "Descrição"
},
@ -734,12 +725,6 @@
"enableFromSettings": {
"message": " Ative nas Configurações."
},
"enableOpenSeaAPI": {
"message": "Ativar a API OpenSea"
},
"enableOpenSeaAPIDescription": {
"message": "Use a API OpenSea para recuperar dados de NFTs. A detecção automática de NFTs depende da API OpenSea e não estará disponível quando essa opção estiver desativada."
},
"enableToken": {
"message": "ativar $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -773,9 +758,6 @@
"enterMaxSpendLimit": {
"message": "Digite um limite máximo de gastos"
},
"enterPassword": {
"message": "Digite a senha"
},
"enterPasswordContinue": {
"message": "Digite a senha para continuar"
},
@ -832,9 +814,6 @@
"experimental": {
"message": "Experimental"
},
"exportPrivateKey": {
"message": "Exportar chave privada"
},
"externalExtension": {
"message": "Extensão externa"
},
@ -1626,10 +1605,6 @@
"onboardingPinExtensionTitle": {
"message": "Sua instalação da MetaMask está concluída!"
},
"onboardingShowIncomingTransactionsDescription": {
"message": "A exibição de transações recebidas na sua carteira depende de comunicação com $1. O Etherscan terá acesso ao seu endereço Ethereum e ao seu endereço IP. Veja $2.",
"description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key."
},
"onboardingUsePhishingDetectionDescription": {
"message": "Os alertas de detecção de phishing dependem de comunicação com $1. O jsDeliver terá acesso ao seu endereço IP. Veja $2.",
"description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link"
@ -1882,9 +1857,6 @@
"searchResults": {
"message": "Resultados da busca"
},
"searchTokens": {
"message": "Buscar tokens"
},
"secretRecoveryPhrase": {
"message": "Frase de Recuperação Secreta"
},
@ -2026,9 +1998,6 @@
"showPermissions": {
"message": "Mostrar permissões"
},
"showPrivateKeys": {
"message": "Mostrar chaves privadas"
},
"showTestnetNetworks": {
"message": "Mostrar redes de teste"
},
@ -2062,9 +2031,6 @@
"somethingWentWrong": {
"message": "Opa! Ocorreu algum erro."
},
"source": {
"message": "Fonte"
},
"speedUp": {
"message": "Acelerar"
},
@ -2646,9 +2612,6 @@
"txInsightsNotSupported": {
"message": "As informações sobre transações não são suportadas para esse contrato, por ora."
},
"typePassword": {
"message": "Digite sua senha da MetaMask"
},
"u2f": {
"message": "U2F",
"description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices."

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Copiere adresă în clipboard"
},
"copyPrivateKey": {
"message": "Aceasta este cheia dumneavoastră privată (clic pentru a copia)"
},
"copyToClipboard": {
"message": "Copiați în clipboard"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Ștergeți rețeaua?"
},
"deleteNetworkDescription": {
"message": "Sigur vreți să ștergeți această rețea?"
},
"details": {
"message": "Detalii"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "Eroare la înregistrarea numelui ENS"
},
"enterPassword": {
"message": "Introduceți parola"
},
"enterPasswordContinue": {
"message": "Introduceți parola pentru a continua"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Extindeți vizualizarea"
},
"exportPrivateKey": {
"message": "Exportați cheia privată"
},
"failed": {
"message": "Eșuat"
},
@ -614,9 +602,6 @@
"searchResults": {
"message": "Rezultate căutare"
},
"searchTokens": {
"message": "Căutați token-uri"
},
"securityAndPrivacy": {
"message": "Securitate și confidențialitate"
},
@ -656,9 +641,6 @@
"showHexDataDescription": {
"message": "Selectați această opțiune pentru a arăta câmpul de date hexazecimale în ecranul de trimitere."
},
"showPrivateKeys": {
"message": "Afișați cheile private"
},
"sigRequest": {
"message": "Solicitare de semnătură"
},
@ -773,9 +755,6 @@
"tryAgain": {
"message": "Încearcă din nou"
},
"typePassword": {
"message": "Scrieți parola dvs. pentru MetaMask"
},
"unapproved": {
"message": "Neaprobat"
},

File diff suppressed because it is too large Load Diff

View File

@ -169,9 +169,6 @@
"copyAddress": {
"message": "Kopírovať adresu do schránky"
},
"copyPrivateKey": {
"message": "Toto je váš privátní klíč (kliknutím zkopírujte)"
},
"copyToClipboard": {
"message": "Kopírovat do schránky"
},
@ -208,9 +205,6 @@
"deleteNetwork": {
"message": "Odstrániť sieť?"
},
"deleteNetworkDescription": {
"message": "Naozaj chcete túto sieť odstrániť?"
},
"details": {
"message": "Podrobnosti"
},
@ -238,9 +232,6 @@
"ensRegistrationError": {
"message": "Chyba pri registrácii názvu ENS"
},
"enterPassword": {
"message": "Zadejte heslo"
},
"enterPasswordContinue": {
"message": "Pokračujte zadaním hesla"
},
@ -253,9 +244,6 @@
"expandView": {
"message": "Rozbaliť zobrazenie"
},
"exportPrivateKey": {
"message": "Exportovat privátní klíč"
},
"failed": {
"message": "Neúspěšné"
},
@ -599,9 +587,6 @@
"searchResults": {
"message": "Výsledky vyhľadávania"
},
"searchTokens": {
"message": "Hledat tokeny"
},
"securityAndPrivacy": {
"message": "Bezpečnosť a súkromie"
},
@ -641,9 +626,6 @@
"showHexDataDescription": {
"message": "Vyberte toto, ak chcete, aby sa na obrazovke odosielania zobrazilo hex dátové pole"
},
"showPrivateKeys": {
"message": "Zobrazit privátní klíče"
},
"sigRequest": {
"message": "Požadavek podpisu"
},
@ -758,9 +740,6 @@
"tryAgain": {
"message": "Skúsiť znova"
},
"typePassword": {
"message": "Zadejte své heslo"
},
"unapproved": {
"message": "Neschváleno"
},

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Kopiraj naslov v odložišče"
},
"copyPrivateKey": {
"message": "To je vaš zesebni ključ (kliknite za kopiranje)"
},
"copyToClipboard": {
"message": "Kopiraj v odložišče"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Izbrišem to omrežje?"
},
"deleteNetworkDescription": {
"message": "Ali ste prepričani, da želite izbrisati to omrežje?"
},
"details": {
"message": "Podrobnosti"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "Napaka pri registraciji imena ENS"
},
"enterPassword": {
"message": "Vnesite geslo"
},
"enterPasswordContinue": {
"message": "Za nadaljevanje vnesite geslo"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Razširi pogled"
},
"exportPrivateKey": {
"message": "Izvozi zasebni ključ"
},
"failed": {
"message": "Ni uspelo"
},
@ -615,9 +603,6 @@
"searchResults": {
"message": "Rezultati iskanja"
},
"searchTokens": {
"message": "Iskanje žetonov"
},
"securityAndPrivacy": {
"message": "Varnost in zasebnost"
},
@ -657,9 +642,6 @@
"showHexDataDescription": {
"message": "Izberite za prikaz hex podatkov na zaslonu za pošiljanje"
},
"showPrivateKeys": {
"message": "Pokaži zasebni ključ"
},
"sigRequest": {
"message": "Zahteva za podpis"
},
@ -780,9 +762,6 @@
"tryAgain": {
"message": "Poskusi znova"
},
"typePassword": {
"message": "Vnesite vaše MetaMask geslo"
},
"unapproved": {
"message": "Neodobreno"
},

View File

@ -172,9 +172,6 @@
"copyAddress": {
"message": "Kopirajte adresu u ostavu"
},
"copyPrivateKey": {
"message": "Ovo je vaš privatni ključ (kliknite kako biste ga kopirali)"
},
"copyToClipboard": {
"message": "Копирај у меморију"
},
@ -211,9 +208,6 @@
"deleteNetwork": {
"message": "Da li želite da obrišete mrežu?"
},
"deleteNetworkDescription": {
"message": "Da li ste sigurni da želite da izbrišete ovu mrežu?"
},
"details": {
"message": "Детаљи"
},
@ -241,9 +235,6 @@
"ensRegistrationError": {
"message": "Greška u registraciji ENS imena."
},
"enterPassword": {
"message": "Unesite lozinku"
},
"enterPasswordContinue": {
"message": "Unesite lozinku kako biste nastavili"
},
@ -256,9 +247,6 @@
"expandView": {
"message": "Proširite prikaz"
},
"exportPrivateKey": {
"message": "Izvezite privatni ključ"
},
"failed": {
"message": "Neuspešno"
},
@ -618,9 +606,6 @@
"searchResults": {
"message": "Rezultati pretrage"
},
"searchTokens": {
"message": "Pretražite tokene"
},
"securityAndPrivacy": {
"message": "Bezbednost i privatnost"
},
@ -660,9 +645,6 @@
"showHexDataDescription": {
"message": "Izaberite ovo da bi se pokazalo polje sa hex podacima na „Pošalji” ekranu "
},
"showPrivateKeys": {
"message": "Prikažite privatne ključeve"
},
"sigRequest": {
"message": "Zahtev za potpisom"
},
@ -780,9 +762,6 @@
"tryAgain": {
"message": "Пробај поново"
},
"typePassword": {
"message": "Ukucajte svoju MetaMask šifru"
},
"unapproved": {
"message": "Neodobren"
},

View File

@ -169,9 +169,6 @@
"copyAddress": {
"message": "Kopiera adress till urklipp"
},
"copyPrivateKey": {
"message": "Det här är din privata nyckel (klicka för att kopiera)"
},
"copyToClipboard": {
"message": "Kopiera till Urklipp"
},
@ -208,9 +205,6 @@
"deleteNetwork": {
"message": "Radera nätverk?"
},
"deleteNetworkDescription": {
"message": "Är du säker på att du vill ta bort detta nätverk?"
},
"details": {
"message": "Info"
},
@ -238,9 +232,6 @@
"ensRegistrationError": {
"message": "Fel i ENS-namnregistrering"
},
"enterPassword": {
"message": "Ange lösenord"
},
"enterPasswordContinue": {
"message": "Ange lösenord för att fortsätta"
},
@ -253,9 +244,6 @@
"expandView": {
"message": "Expandera vy"
},
"exportPrivateKey": {
"message": "Exportera privat nyckel"
},
"failed": {
"message": "Misslyckades"
},
@ -611,9 +599,6 @@
"searchResults": {
"message": "Sökresultat"
},
"searchTokens": {
"message": "Sök tokens"
},
"securityAndPrivacy": {
"message": "Säkerhet och integritet"
},
@ -653,9 +638,6 @@
"showHexDataDescription": {
"message": "Välj detta för att visa hex-datafältet på sändarskärmen"
},
"showPrivateKeys": {
"message": "Visa privata nycklar"
},
"sigRequest": {
"message": "Signaturförfrågan"
},
@ -767,9 +749,6 @@
"tryAgain": {
"message": "Försök igen"
},
"typePassword": {
"message": "Ange ditt MetaMask-lösenord"
},
"unapproved": {
"message": "Inte godkänd"
},

View File

@ -169,9 +169,6 @@
"copyAddress": {
"message": "Nakili anwani kwenye ubao wa kunakilia"
},
"copyPrivateKey": {
"message": "Huu ni ufunguo wako wa kibinafsi (bofya ili unakili)"
},
"copyToClipboard": {
"message": "Nakili kwenye ubao wa kunakili"
},
@ -208,9 +205,6 @@
"deleteNetwork": {
"message": "Futa Mtandao?"
},
"deleteNetworkDescription": {
"message": "Una uhakika unataka kufuta mtandao huu?"
},
"details": {
"message": "Maelezo"
},
@ -238,9 +232,6 @@
"ensRegistrationError": {
"message": "Hitilafu imetokea kwenye usajili wa jina la ENS"
},
"enterPassword": {
"message": "Ingiza nenosiri"
},
"enterPasswordContinue": {
"message": "Ingiza nenosiri ili uendelee"
},
@ -253,9 +244,6 @@
"expandView": {
"message": "Panua Mwonekano"
},
"exportPrivateKey": {
"message": "Panua Mwonekano"
},
"failed": {
"message": "Imeshindwa"
},
@ -605,9 +593,6 @@
"searchResults": {
"message": "Matokeo ya Utafutaji"
},
"searchTokens": {
"message": "Tafuta Vianzio"
},
"securityAndPrivacy": {
"message": "Ulinzi na Faragha"
},
@ -647,9 +632,6 @@
"showHexDataDescription": {
"message": "Chagua hii ili uonyeshe sehemu ya data ya hex kwenye skrini ya tuma"
},
"showPrivateKeys": {
"message": "Onyesha Fungo Binafsi"
},
"sigRequest": {
"message": "Ombi la Saini"
},
@ -770,9 +752,6 @@
"tryAgain": {
"message": "Jaribu tena"
},
"typePassword": {
"message": "Andika nenosiri lako la MetaMask"
},
"unapproved": {
"message": "Haijaidhinishwa"
},

View File

@ -87,9 +87,6 @@
"copiedExclamation": {
"message": "நகலெடுக்கப்பட்டன!"
},
"copyPrivateKey": {
"message": "இது உங்கள் தனிப்பட்ட விசை (நகலெடுக்க கிளிக் செய்யவும்)"
},
"copyToClipboard": {
"message": "கிளிப்போர்டுக்கு நகலெடு"
},
@ -126,15 +123,9 @@
"edit": {
"message": "திருத்து"
},
"enterPassword": {
"message": "கடவுச்சொல்லை உள்ளிடவும்"
},
"etherscanView": {
"message": "Etherscan கணக்கைப் பார்க்கவும்"
},
"exportPrivateKey": {
"message": "தனியார் விசை ஐ ஏற்றுமதி செய்க"
},
"failed": {
"message": "தோல்வி"
},
@ -359,9 +350,6 @@
"search": {
"message": "தேடல்"
},
"searchTokens": {
"message": "தேடல் டோக்கன்ஸ்"
},
"seedPhraseReq": {
"message": "விதை வாக்கியங்கள் 12 வார்த்தைகள் நீண்டவை"
},
@ -377,9 +365,6 @@
"settings": {
"message": "அமைப்புகள்"
},
"showPrivateKeys": {
"message": "தனிப்பட்ட விசைகளைக் காண்பி"
},
"sigRequest": {
"message": "கையொப்பம் கோரிக்கை"
},
@ -428,9 +413,6 @@
"tryAgain": {
"message": "மீண்டும் முயல்க"
},
"typePassword": {
"message": "உங்கள் கடவுச்சொல்லை தட்டச்சு செய்யவும்"
},
"unapproved": {
"message": "அங்கீகரிக்கப்படாத"
},

View File

@ -78,9 +78,6 @@
"copiedExclamation": {
"message": "คัดลอกแล้ว!"
},
"copyPrivateKey": {
"message": "นี่คือคีย์ส่วนตัวของคุณ(กดเพื่อคัดลอก)"
},
"copyToClipboard": {
"message": "คัดลอกไปคลิปบอร์ด"
},
@ -117,18 +114,12 @@
"editContact": {
"message": "แก้ไขผู้ติดต่อ"
},
"enterPassword": {
"message": "ใส่รหัสผ่าน"
},
"etherscanView": {
"message": "ดูบัญชีบน Etherscan"
},
"expandView": {
"message": "ขยายมุมมอง"
},
"exportPrivateKey": {
"message": "ส่งออกคีย์ส่วนตัว"
},
"failed": {
"message": "ล้มเหลว"
},
@ -338,9 +329,6 @@
"settings": {
"message": "การตั้งค่า"
},
"showPrivateKeys": {
"message": "แสดงคีย์ส่วนตัว"
},
"sigRequest": {
"message": "ขอลายเซ็น"
},
@ -392,9 +380,6 @@
"transactionDropped": {
"message": "ธุรกรรมถูกยกเลิกเมื่อ $2"
},
"typePassword": {
"message": "พิมพ์รหัสผ่านของคุณ"
},
"unknown": {
"message": "ไม่รู้จัก"
},

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -175,9 +175,6 @@
"copyAddress": {
"message": "Копіювати адресу в буфер обміну"
},
"copyPrivateKey": {
"message": "Це ваш закритий ключ (натисніть, щоб скопіювати)"
},
"copyToClipboard": {
"message": "Копіювати в буфер"
},
@ -214,9 +211,6 @@
"deleteNetwork": {
"message": "Видалити мережу?"
},
"deleteNetworkDescription": {
"message": "Ви впевнені, що хочете видалити цю мережу?"
},
"details": {
"message": "Деталі"
},
@ -244,9 +238,6 @@
"ensRegistrationError": {
"message": "Помилка у реєстрації ENS ім'я"
},
"enterPassword": {
"message": "Введіть пароль"
},
"enterPasswordContinue": {
"message": "Введіть пароль, щоб продовжити"
},
@ -259,9 +250,6 @@
"expandView": {
"message": "Розгорнути подання"
},
"exportPrivateKey": {
"message": "Експортувати приватний ключ"
},
"failed": {
"message": "Помилка"
},
@ -627,9 +615,6 @@
"searchResults": {
"message": "Результати пошуку"
},
"searchTokens": {
"message": "Шукати токени"
},
"securityAndPrivacy": {
"message": "Безпека й конфіденційність"
},
@ -669,9 +654,6 @@
"showHexDataDescription": {
"message": "Оберіть це, щоб показати поле для шістнадцятирикових даних на екрані надсилання"
},
"showPrivateKeys": {
"message": "Показати приватні ключі"
},
"sigRequest": {
"message": "Запит підпису"
},
@ -792,9 +774,6 @@
"tryAgain": {
"message": "Повторити"
},
"typePassword": {
"message": "Введіть ваш пароль MetaMask"
},
"unapproved": {
"message": "Не затверджено"
},

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -42,9 +42,6 @@
"addContact": {
"message": "新增合約"
},
"addCustomToken": {
"message": "Add Custom Token"
},
"addEthereumChainConfirmationDescription": {
"message": "這會允許在 MetaMask 內使用這個網路。"
},
@ -337,9 +334,6 @@
"copyAddress": {
"message": "複製到剪貼簿"
},
"copyPrivateKey": {
"message": "這是您的私鑰(點擊複製)"
},
"copyToClipboard": {
"message": "複製到剪貼簿"
},
@ -411,9 +405,6 @@
"deleteNetwork": {
"message": "刪除網路?"
},
"deleteNetworkDescription": {
"message": "你確定要刪除網路嗎?"
},
"details": {
"message": "詳情"
},
@ -503,9 +494,6 @@
"enterMaxSpendLimit": {
"message": "輸入最大花費限制"
},
"enterPassword": {
"message": "請輸入密碼"
},
"enterPasswordContinue": {
"message": "請輸入密碼"
},
@ -553,9 +541,6 @@
"expandView": {
"message": "展開畫面"
},
"exportPrivateKey": {
"message": "匯出私鑰"
},
"externalExtension": {
"message": "外部擴充功能"
},
@ -1136,9 +1121,6 @@
"searchResults": {
"message": "搜尋結果"
},
"searchTokens": {
"message": "搜尋代幣"
},
"secureWallet": {
"message": "Secure Wallet"
},
@ -1240,9 +1222,6 @@
"showPermissions": {
"message": "顯示權限"
},
"showPrivateKeys": {
"message": "顯示私鑰"
},
"sigRequest": {
"message": "請求簽署"
},
@ -1449,9 +1428,6 @@
"tryAgain": {
"message": "再試一次"
},
"typePassword": {
"message": "請輸入密碼"
},
"unapproved": {
"message": "未批准"
},

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

View File

@ -1,6 +0,0 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M12.36 6L12.76 8H18V14H14.64L14.24 12H7V6H12.36ZM14 4H5V21H7V14H12.6L13 16H20V6H14.4L14 4Z"
fill="black"
/>
</svg>

Before

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
app/images/default_nft.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

47
app/images/gnosis.svg Normal file
View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1080" height="1080" viewBox="0 0 1080 1080" xml:space="preserve">
<desc>Created with Fabric.js 5.2.4</desc>
<defs>
</defs>
<g transform="matrix(1 0 0 1 540 540)" id="6d236122-bb3d-4e42-9c6b-8d2a0958998c" >
</g>
<g transform="matrix(1 0 0 1 540 540)" id="e68d71f6-858d-496f-973e-8d82de5e6bfb" >
<rect style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: nonzero; opacity: 1; visibility: hidden;" vector-effect="non-scaling-stroke" x="-540" y="-540" rx="0" ry="0" width="1080" height="1080" />
</g>
<g transform="matrix(12.89 0 0 12.89 539.9 539.9)" id="fc2f5ed2-9b97-4553-a90e-ba5317325e12" >
<circle style="stroke: rgb(0,0,0); stroke-opacity: 0; stroke-width: 0; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(240,235,222); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" cx="0" cy="0" r="35" />
</g>
<g transform="matrix(1 0 0 1 540 540)" >
<g style="" vector-effect="non-scaling-stroke" >
<g transform="matrix(1 0 0 1 -184.84 -28.38)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(19,54,41); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-215.27, -371.55)" d="M 131.685 352.096 C 131.319 328.91 138.859 306.291 153.063 287.962 L 298.861 433.76 C 280.484 447.873 257.897 455.402 234.727 455.138 C 207.433 455.025 181.289 444.133 161.989 424.833 C 142.69 405.534 131.797 379.39 131.685 352.096 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 185.45 -28.86)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(19,54,41); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-585.54, -371.07)" d="M 565.443 455.03 C 579.094 455.087 592.621 452.441 605.245 447.247 C 617.869 442.052 629.34 434.411 638.997 424.763 C 648.655 415.116 656.308 403.652 661.516 391.034 C 666.723 378.415 669.383 364.891 669.34 351.24 C 669.596 328.071 662.068 305.487 647.962 287.106 L 501.736 433.332 C 519.913 447.55 542.367 455.198 565.443 455.03 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 0 96.31)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(19,54,41); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-400.1, -496.24)" d="M 678.219 257.499 C 700.697 283.894 713.049 317.427 713.065 352.097 C 713.037 391.086 697.528 428.47 669.948 456.03 C 642.369 483.589 604.974 499.071 565.984 499.071 C 531.496 499.109 498.103 486.956 471.707 464.759 L 400.946 535.52 L 330.184 464.759 C 303.77 486.996 270.329 499.153 235.8 499.071 C 216.449 499.141 197.275 495.392 179.376 488.039 C 161.476 480.685 145.204 469.872 131.491 456.219 C 117.778 442.566 106.893 426.34 99.4623 408.473 C 92.0311 390.606 88.1987 371.448 88.1848 352.097 C 88.2124 317.587 100.356 284.183 122.497 257.713 L 89.4674 224.684 L 57.9353 192.616 C 19.9503 255.069 -0.0950739 326.78 0.000339029 399.877 C -0.0137127 452.416 10.3265 504.443 30.4292 552.985 C 50.532 601.526 80.0034 645.631 117.159 682.777 C 154.315 719.923 198.428 749.382 246.975 769.472 C 295.521 789.562 347.551 799.888 400.09 799.86 C 506.118 799.832 607.802 757.729 682.815 682.796 C 757.828 607.863 800.04 506.225 800.181 400.197 C 800.841 327.112 780.991 255.307 742.887 192.937 L 678.219 257.499 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 0 -162.9)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(19,54,41); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-400.09, -237.03)" d="M 689.873 123.993 C 652.563 84.7656 607.659 53.5429 557.896 32.2262 C 508.132 10.9095 454.551 -0.0550433 400.414 0.000207773 C 346.266 -0.0259924 292.677 10.9513 242.9 32.2658 C 193.123 53.5803 148.197 84.7874 110.848 123.993 C 101.121 134.682 91.6082 145.371 82.7363 156.808 L 400.093 474.058 L 717.45 156.488 C 709.071 144.991 699.854 134.13 689.873 123.993 L 689.873 123.993 Z M 400.414 399.984 L 154.566 154.136 C 186.709 121.65 225.008 95.8997 267.221 78.3905 C 309.434 60.8813 354.714 51.9648 400.414 52.1627 C 446.121 51.9109 491.418 60.8027 533.638 78.3151 C 575.859 95.8274 614.151 121.607 646.261 154.136 L 400.414 399.984 Z" stroke-linecap="round" />
</g>
</g>
</g>
<g transform="matrix(0 0 0 0 0 0)" >
<g style="" >
</g>
</g>
<g transform="matrix(0 0 0 0 0 0)" >
<g style="" >
</g>
</g>
<g transform="matrix(NaN NaN NaN NaN 0 0)" >
<g style="" >
</g>
</g>
<g transform="matrix(NaN NaN NaN NaN 0 0)" >
<g style="" >
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -1,72 +0,0 @@
import { strict as assert } from 'assert';
import { stripHexPrefix } from '../../../shared/modules/hexstring-utils';
import accountImporter from '.';
describe('Account Import Strategies', function () {
const privkey =
'0x4cfd3e90fc78b0f86bf7524722150bb8da9c60cd532564d7ff43f5716514f553';
const json =
'{"version":3,"id":"dbb54385-0a99-437f-83c0-647de9f244c3","address":"a7f92ce3fba24196cf6f4bd2e1eb3db282ba998c","Crypto":{"ciphertext":"bde13d9ade5c82df80281ca363320ce254a8a3a06535bbf6ffdeaf0726b1312c","cipherparams":{"iv":"fbf93718a57f26051b292f072f2e5b41"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"7ffe00488319dec48e4c49a120ca49c6afbde9272854c64d9541c83fc6acdffe","n":8192,"r":8,"p":1},"mac":"2adfd9c4bc1cdac4c85bddfb31d9e21a684e0e050247a70c5698facf6b7d4681"}}';
describe('private key import', function () {
it('imports a private key and strips 0x prefix', async function () {
const importPrivKey = await accountImporter.importAccount('Private Key', [
privkey,
]);
assert.equal(importPrivKey, stripHexPrefix(privkey));
});
it('throws an error for empty string private key', async function () {
await assert.rejects(
async () => {
await accountImporter.importAccount('Private Key', ['']);
},
Error,
'no empty strings',
);
});
it('throws an error for undefined string private key', async function () {
await assert.rejects(async () => {
await accountImporter.importAccount('Private Key', [undefined]);
});
await assert.rejects(async () => {
await accountImporter.importAccount('Private Key', []);
});
});
it('throws an error for invalid private key', async function () {
await assert.rejects(async () => {
await accountImporter.importAccount('Private Key', ['popcorn']);
});
});
});
describe('JSON keystore import', function () {
it('fails when password is incorrect for keystore', async function () {
const wrongPassword = 'password2';
try {
await accountImporter.importAccount('JSON File', [json, wrongPassword]);
} catch (error) {
assert.equal(
error.message,
'Key derivation failed - possibly wrong passphrase',
);
}
});
it('imports json string and password to return a private key', async function () {
const fileContentsPassword = 'password1';
const importJson = await accountImporter.importAccount('JSON File', [
json,
fileContentsPassword,
]);
assert.equal(
importJson,
'0x5733876abe94146069ce8bcbabbde2677f2e35fa33e875e92041ed2ac87e5bc7',
);
});
});
});

View File

@ -1,75 +0,0 @@
import { isValidMnemonic } from '@ethersproject/hdnode';
import {
bufferToHex,
getBinarySize,
isValidPrivate,
toBuffer,
} from 'ethereumjs-util';
import Wallet from 'ethereumjs-wallet';
import importers from 'ethereumjs-wallet/thirdparty';
import log from 'loglevel';
import { stripHexPrefix } from '../../../shared/modules/hexstring-utils';
import { addHexPrefix } from '../lib/util';
const accountImporter = {
async importAccount(strategy, args) {
const importer = this.strategies[strategy];
const privateKeyHex = importer(...args);
return privateKeyHex;
},
strategies: {
'Private Key': (privateKey) => {
if (!privateKey) {
throw new Error('Cannot import an empty key.'); // It should never get here, because this should be stopped in the UI
}
// Check if the user has entered an SRP by mistake instead of a private key
if (isValidMnemonic(privateKey.trim())) {
throw new Error(`t('importAccountErrorIsSRP')`);
}
const trimmedPrivateKey = privateKey.replace(/\s+/gu, ''); // Remove all whitespace
const prefixedPrivateKey = addHexPrefix(trimmedPrivateKey);
let buffer;
try {
buffer = toBuffer(prefixedPrivateKey);
} catch (e) {
throw new Error(`t('importAccountErrorNotHexadecimal')`);
}
try {
if (
!isValidPrivate(buffer) ||
getBinarySize(prefixedPrivateKey) !== 64 + '0x'.length // Fixes issue #17719 -- isValidPrivate() will let a key of 63 hex digits through without complaining, this line ensures 64 hex digits + '0x' = 66 digits
) {
throw new Error(`t('importAccountErrorNotAValidPrivateKey')`);
}
} catch (e) {
throw new Error(`t('importAccountErrorNotAValidPrivateKey')`);
}
const strippedPrivateKey = stripHexPrefix(prefixedPrivateKey);
return strippedPrivateKey;
},
'JSON File': (input, password) => {
let wallet;
try {
wallet = importers.fromEtherWallet(input, password);
} catch (e) {
log.debug('Attempt to import as EtherWallet format failed, trying V3');
wallet = Wallet.fromV3(input, password, true);
}
return walletToPrivateKey(wallet);
},
},
};
function walletToPrivateKey(wallet) {
const privateKeyBuffer = wallet.getPrivateKey();
return bufferToHex(privateKeyBuffer);
}
export default accountImporter;

View File

@ -218,7 +218,6 @@ browser.runtime.onConnectExternal.addListener(async (...args) => {
* @property {boolean} isAccountMenuOpen - Represents whether the main account selection UI is currently displayed.
* @property {boolean} isNetworkMenuOpen - Represents whether the main network selection UI is currently displayed.
* @property {object} identities - An object matching lower-case hex addresses to Identity objects with "address" and "name" (nickname) keys.
* @property {object} unapprovedTxs - An object mapping transaction hashes to unapproved transactions.
* @property {object} networkConfigurations - A list of network configurations, containing RPC provider details (eg chainId, rpcUrl, rpcPreferences).
* @property {Array} addressBook - A list of previously sent to addresses.
* @property {object} contractExchangeRates - Info about current token prices.
@ -235,7 +234,6 @@ browser.runtime.onConnectExternal.addListener(async (...args) => {
* @property {string} networkStatus - Either "unknown", "available", "unavailable", or "blocked", depending on the status of the currently selected network.
* @property {object} accounts - An object mapping lower-case hex addresses to objects with "balance" and "address" keys, both storing hex string values.
* @property {hex} currentBlockGasLimit - The most recently seen block gas limit, in a lower case hex prefixed string.
* @property {TransactionMeta[]} currentNetworkTxList - An array of transactions associated with the currently selected network.
* @property {object} unapprovedMsgs - An object of messages pending approval, mapping a unique ID to the options.
* @property {number} unapprovedMsgCount - The number of messages in unapprovedMsgs.
* @property {object} unapprovedPersonalMsgs - An object of messages pending approval, mapping a unique ID to the options.
@ -493,6 +491,9 @@ export function setupController(
getIpfsGateway: controller.preferencesController.getIpfsGateway.bind(
controller.preferencesController,
),
getUseAddressBarEnsResolution: () =>
controller.preferencesController.store.getState()
.useAddressBarEnsResolution,
provider: controller.provider,
});

View File

@ -456,7 +456,6 @@ export default class AppStateController extends EventEmitter {
_acceptApproval() {
if (!this._approvalRequestId) {
log.error('Attempted to accept missing unlock approval request');
return;
}
try {
@ -465,7 +464,7 @@ export default class AppStateController extends EventEmitter {
this._approvalRequestId,
);
} catch (error) {
log.error('Failed to accept transaction approval request', error);
log.error('Failed to unlock approval request', error);
}
this._approvalRequestId = null;

View File

@ -1,10 +1,7 @@
import { ObservableStore } from '@metamask/obs-store';
import log from 'loglevel';
import { ORIGIN_METAMASK } from '../../../shared/constants/app';
import AppStateController from './app-state';
jest.mock('loglevel');
let appStateController, mockStore;
describe('AppStateController', () => {
@ -147,52 +144,6 @@ describe('AppStateController', () => {
expect.any(String),
);
});
it('logs if rejecting approval request throws', async () => {
appStateController._approvalRequestId = 'mock-approval-request-id';
appStateController = new AppStateController({
addUnlockListener: jest.fn(),
isUnlocked: jest.fn(() => true),
onInactiveTimeout: jest.fn(),
showUnlockRequest: jest.fn(),
preferencesStore: {
subscribe: jest.fn(),
getState: jest.fn(() => ({
preferences: {
autoLockTimeLimit: 0,
},
})),
},
qrHardwareStore: {
subscribe: jest.fn(),
},
messenger: {
call: jest.fn(() => {
throw new Error('mock error');
}),
},
});
appStateController.handleUnlock();
expect(log.error).toHaveBeenCalledTimes(1);
expect(log.error).toHaveBeenCalledWith(
'Attempted to accept missing unlock approval request',
);
});
it('returns without call messenger if no approval request in pending', async () => {
const emitSpy = jest.spyOn(appStateController, 'emit');
appStateController.handleUnlock();
expect(emitSpy).toHaveBeenCalledTimes(0);
expect(appStateController.messagingSystem.call).toHaveBeenCalledTimes(0);
expect(log.error).toHaveBeenCalledTimes(1);
expect(log.error).toHaveBeenCalledWith(
'Attempted to accept missing unlock approval request',
);
});
});
describe('setDefaultHomeActiveTabName', () => {

View File

@ -45,7 +45,10 @@ export type CoreMessage = AbstractMessage & {
};
export type StateMessage = Required<
Omit<AbstractMessage, 'securityProviderResponse' | 'metadata' | 'error'>
Omit<
AbstractMessage,
'securityAlertResponse' | 'securityProviderResponse' | 'metadata' | 'error'
>
>;
export type DecryptMessageControllerState = {

View File

@ -225,6 +225,8 @@ describe('DetectTokensController', function () {
tokenListController,
onInfuraIsBlocked: sinon.stub(),
onInfuraIsUnblocked: sinon.stub(),
networkConfigurations: {},
onAccountRemoved: sinon.stub(),
});
preferences.setAddresses([
'0x7e57e2',

View File

@ -19,7 +19,7 @@ const messageIdMock2 = '456';
const stateMock = { test: 123 };
const addressMock = '0xc38bf1ad06ef69f0c04e29dbeb4152b4175f0a8d';
const publicKeyMock = '32762347862378feb87123781623a=';
const keyringMock = { type: KeyringType.hdKeyTree };
const keyringTypeMock = KeyringType.hdKeyTree;
const messageParamsMock = {
from: addressMock,
@ -73,11 +73,6 @@ const createEncryptionPublicKeyManagerMock = <T>() =>
},
} as any as jest.Mocked<T>);
const createKeyringControllerMock = () => ({
getKeyringForAccount: jest.fn(),
getEncryptionPublicKey: jest.fn(),
});
describe('EncryptionPublicKeyController', () => {
let encryptionPublicKeyController: EncryptionPublicKeyController;
@ -88,7 +83,8 @@ describe('EncryptionPublicKeyController', () => {
const encryptionPublicKeyManagerMock =
createEncryptionPublicKeyManagerMock<EncryptionPublicKeyManager>();
const messengerMock = createMessengerMock();
const keyringControllerMock = createKeyringControllerMock();
const getEncryptionPublicKeyMock = jest.fn();
const getAccountKeyringTypeMock = jest.fn();
const getStateMock = jest.fn();
const metricsEventMock = jest.fn();
@ -101,7 +97,8 @@ describe('EncryptionPublicKeyController', () => {
encryptionPublicKeyController = new EncryptionPublicKeyController({
messenger: messengerMock as any,
keyringController: keyringControllerMock as any,
getEncryptionPublicKey: getEncryptionPublicKeyMock as any,
getAccountKeyringType: getAccountKeyringTypeMock as any,
getState: getStateMock as any,
metricsEvent: metricsEventMock as any,
} as EncryptionPublicKeyControllerOptions);
@ -203,9 +200,7 @@ describe('EncryptionPublicKeyController', () => {
])(
'throws if keyring is not supported',
async (keyringName, keyringType) => {
keyringControllerMock.getKeyringForAccount.mockResolvedValueOnce({
type: keyringType,
});
getAccountKeyringTypeMock.mockResolvedValueOnce(keyringType);
await expect(
encryptionPublicKeyController.newRequestEncryptionPublicKey(
@ -219,9 +214,7 @@ describe('EncryptionPublicKeyController', () => {
);
it('adds message to message manager', async () => {
keyringControllerMock.getKeyringForAccount.mockResolvedValueOnce(
keyringMock,
);
getAccountKeyringTypeMock.mockResolvedValueOnce(keyringTypeMock);
await encryptionPublicKeyController.newRequestEncryptionPublicKey(
addressMock,
@ -243,9 +236,7 @@ describe('EncryptionPublicKeyController', () => {
from: messageParamsMock.data,
});
keyringControllerMock.getEncryptionPublicKey.mockResolvedValueOnce(
publicKeyMock,
);
getEncryptionPublicKeyMock.mockResolvedValueOnce(publicKeyMock);
});
it('approves message and signs', async () => {
@ -253,10 +244,8 @@ describe('EncryptionPublicKeyController', () => {
messageParamsMock,
);
expect(
keyringControllerMock.getEncryptionPublicKey,
).toHaveBeenCalledTimes(1);
expect(keyringControllerMock.getEncryptionPublicKey).toHaveBeenCalledWith(
expect(getEncryptionPublicKeyMock).toHaveBeenCalledTimes(1);
expect(getEncryptionPublicKeyMock).toHaveBeenCalledWith(
messageParamsMock.data,
);
@ -294,10 +283,8 @@ describe('EncryptionPublicKeyController', () => {
});
it('rejects message on error', async () => {
keyringControllerMock.getEncryptionPublicKey.mockReset();
keyringControllerMock.getEncryptionPublicKey.mockRejectedValue(
new Error('Test Error'),
);
getEncryptionPublicKeyMock.mockReset();
getEncryptionPublicKeyMock.mockRejectedValue(new Error('Test Error'));
await expect(
encryptionPublicKeyController.encryptionPublicKey(messageParamsMock),
@ -312,10 +299,8 @@ describe('EncryptionPublicKeyController', () => {
});
it('rejects approval on error', async () => {
keyringControllerMock.getEncryptionPublicKey.mockReset();
keyringControllerMock.getEncryptionPublicKey.mockRejectedValue(
new Error('Test Error'),
);
getEncryptionPublicKeyMock.mockReset();
getEncryptionPublicKeyMock.mockRejectedValue(new Error('Test Error'));
await expect(
encryptionPublicKeyController.encryptionPublicKey(messageParamsMock),

View File

@ -4,7 +4,6 @@ import {
EncryptionPublicKeyManager,
EncryptionPublicKeyParamsMetamask,
} from '@metamask/message-manager';
import { KeyringController } from '@metamask/eth-keyring-controller';
import {
AbstractMessageManager,
AbstractMessage,
@ -45,7 +44,10 @@ export type CoreMessage = AbstractMessage & {
};
export type StateMessage = Required<
Omit<AbstractMessage, 'securityProviderResponse' | 'metadata' | 'error'>
Omit<
AbstractMessage,
'securityAlertResponse' | 'securityProviderResponse' | 'metadata' | 'error'
>
> & {
msgParams: string;
};
@ -83,7 +85,8 @@ export type EncryptionPublicKeyControllerMessenger =
export type EncryptionPublicKeyControllerOptions = {
messenger: EncryptionPublicKeyControllerMessenger;
keyringController: KeyringController;
getEncryptionPublicKey: (address: string) => Promise<string>;
getAccountKeyringType: (account: string) => Promise<string>;
getState: () => any;
metricsEvent: (payload: any, options?: any) => void;
};
@ -98,7 +101,9 @@ export default class EncryptionPublicKeyController extends BaseControllerV2<
> {
hub: EventEmitter;
private _keyringController: KeyringController;
private _getEncryptionPublicKey: (address: string) => Promise<string>;
private _getAccountKeyringType: (account: string) => Promise<string>;
private _getState: () => any;
@ -111,13 +116,15 @@ export default class EncryptionPublicKeyController extends BaseControllerV2<
*
* @param options - The controller options.
* @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
* @param options.keyringController - An instance of a keyring controller used to extract the encryption public key.
* @param options.getEncryptionPublicKey - Callback to get the keyring encryption public key.
* @param options.getAccountKeyringType - Callback to get the keyring type.
* @param options.getState - Callback to retrieve all user state.
* @param options.metricsEvent - A function for emitting a metric event.
*/
constructor({
messenger,
keyringController,
getEncryptionPublicKey,
getAccountKeyringType,
getState,
metricsEvent,
}: EncryptionPublicKeyControllerOptions) {
@ -128,7 +135,8 @@ export default class EncryptionPublicKeyController extends BaseControllerV2<
state: getDefaultState(),
});
this._keyringController = keyringController;
this._getEncryptionPublicKey = getEncryptionPublicKey;
this._getAccountKeyringType = getAccountKeyringType;
this._getState = getState;
this._metricsEvent = metricsEvent;
@ -186,9 +194,9 @@ export default class EncryptionPublicKeyController extends BaseControllerV2<
address: string,
req: OriginalRequest,
): Promise<string> {
const keyring = await this._keyringController.getKeyringForAccount(address);
const keyringType = await this._getAccountKeyringType(address);
switch (keyring.type) {
switch (keyringType) {
case KeyringType.ledger: {
return new Promise((_, reject) => {
reject(
@ -244,7 +252,7 @@ export default class EncryptionPublicKeyController extends BaseControllerV2<
await this._encryptionPublicKeyManager.approveMessage(msgParams);
// EncryptionPublicKey message
const publicKey = await this._keyringController.getEncryptionPublicKey(
const publicKey = await this._getEncryptionPublicKey(
cleanMessageParams.from,
);

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