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

Merge branch 'develop' of github.com:MetaMask/metamask-extension into minimal

This commit is contained in:
Matthias Kretschmann 2023-06-20 12:26:26 +01:00
commit 354c39c063
Signed by: m
GPG Key ID: 606EEEF3C479A91F
673 changed files with 37128 additions and 17264 deletions

View File

@ -655,7 +655,7 @@ jobs:
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:chrome --retries 2
yarn test:e2e:chrome --retries 2 --debug
fi
no_output_timeout: 20m
- run:
@ -692,7 +692,7 @@ jobs:
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:chrome --retries 2 --mv3 || echo "Temporarily suppressing MV3 e2e test failures"
yarn test:e2e:chrome --retries 2 --debug --mv3 || echo "Temporarily suppressing MV3 e2e test failures"
fi
no_output_timeout: 20m
- store_artifacts:
@ -720,7 +720,7 @@ jobs:
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:firefox:snaps --retries 2
yarn test:e2e:firefox:snaps --retries 2 --debug
fi
no_output_timeout: 20m
- run:
@ -757,7 +757,7 @@ jobs:
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:chrome:snaps --retries 2
yarn test:e2e:chrome:snaps --retries 2 --debug
fi
no_output_timeout: 20m
- run:
@ -794,7 +794,7 @@ jobs:
command: |
if .circleci/scripts/test-run-e2e.sh
then
yarn test:e2e:firefox --retries 2
yarn test:e2e:firefox --retries 2 --debug
fi
no_output_timeout: 20m
- run:

View File

@ -237,6 +237,7 @@ module.exports = {
],
excludedFiles: [
'app/scripts/controllers/app-state.test.js',
'app/scripts/controllers/mmi-controller.test.js',
'app/scripts/controllers/network/**/*.test.js',
'app/scripts/controllers/permissions/**/*.test.js',
'app/scripts/lib/**/*.test.js',
@ -265,6 +266,7 @@ module.exports = {
files: [
'**/__snapshots__/*.snap',
'app/scripts/controllers/app-state.test.js',
'app/scripts/controllers/mmi-controller.test.js',
'app/scripts/controllers/network/**/*.test.js',
'app/scripts/controllers/network/**/*.test.ts',
'app/scripts/controllers/network/provider-api-tests/*.ts',

4
.iyarc
View File

@ -3,4 +3,6 @@ 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
# NOTE: Disabled for now since this library seems to have been removed from the
# dependency tree — we can re-enable this line later if it appears again
#GHSA-p8p7-x288-28g6

View File

@ -9,7 +9,6 @@ INFURA_PROJECT_ID=00000000000
;SWAPS_USE_DEV_APIS=
;PORTFOLIO_URL=
;TRANSACTION_SECURITY_PROVIDER=
;MULTICHAIN=
; Set this to test changes to the phishing warning page.
;PHISHING_WARNING_PAGE_URL=

View File

@ -8,6 +8,7 @@ module.exports = {
'./app/scripts/controllers/app-state.test.js',
'./app/scripts/controllers/network/**/*.test.js',
'./app/scripts/controllers/permissions/**/*.test.js',
'./app/scripts/controllers/mmi-controller.test.js',
'./app/scripts/constants/error-utils.test.js',
],
recursive: true,

View File

@ -1,83 +1,121 @@
export const suggestedAssets = [
{
asset: {
address: '0x6b175474e89094c44da98b954eedeac495271d0f',
symbol: 'ETH',
decimals: 18,
image: './images/eth_logo.png',
unlisted: false,
import { ApprovalType } from '@metamask/controller-utils';
export const pendingTokenApprovals = {
1: {
id: 1,
type: ApprovalType.WatchAsset,
requestData: {
asset: {
address: '0x6b175474e89094c44da98b954eedeac495271d0f',
symbol: 'ETH',
decimals: 18,
image: './images/eth_logo.png',
unlisted: false,
},
},
},
{
asset: {
address: '0xB8c77482e45F1F44dE1745F52C74426C631bDD52',
symbol: '0X',
decimals: 18,
image: '0x.svg',
unlisted: false,
2: {
id: 2,
type: ApprovalType.WatchAsset,
requestData: {
asset: {
address: '0xB8c77482e45F1F44dE1745F52C74426C631bDD52',
symbol: '0X',
decimals: 18,
image: '0x.svg',
unlisted: false,
},
},
},
{
asset: {
address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984',
symbol: 'AST',
decimals: 18,
image: 'ast.png',
unlisted: false,
3: {
id: 3,
type: ApprovalType.WatchAsset,
requestData: {
asset: {
address: '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984',
symbol: 'AST',
decimals: 18,
image: 'ast.png',
unlisted: false,
},
},
},
{
asset: {
address: '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2',
symbol: 'BAT',
decimals: 18,
image: 'BAT_icon.svg',
unlisted: false,
4: {
id: 4,
type: ApprovalType.WatchAsset,
requestData: {
asset: {
address: '0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2',
symbol: 'BAT',
decimals: 18,
image: 'BAT_icon.svg',
unlisted: false,
},
},
},
{
asset: {
address: '0xe83cccfabd4ed148903bf36d4283ee7c8b3494d1',
symbol: 'CVL',
decimals: 18,
image: 'CVL_token.svg',
unlisted: false,
5: {
id: 5,
type: ApprovalType.WatchAsset,
requestData: {
asset: {
address: '0xe83cccfabd4ed148903bf36d4283ee7c8b3494d1',
symbol: 'CVL',
decimals: 18,
image: 'CVL_token.svg',
unlisted: false,
},
},
},
{
asset: {
address: '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e',
symbol: 'GLA',
decimals: 18,
image: 'gladius.svg',
unlisted: false,
6: {
id: 6,
type: ApprovalType.WatchAsset,
requestData: {
asset: {
address: '0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e',
symbol: 'GLA',
decimals: 18,
image: 'gladius.svg',
unlisted: false,
},
},
},
{
asset: {
address: '0x467Bccd9d29f223BcE8043b84E8C8B282827790F',
symbol: 'GNO',
decimals: 18,
image: 'gnosis.svg',
unlisted: false,
7: {
id: 7,
type: ApprovalType.WatchAsset,
requestData: {
asset: {
address: '0x467Bccd9d29f223BcE8043b84E8C8B282827790F',
symbol: 'GNO',
decimals: 18,
image: 'gnosis.svg',
unlisted: false,
},
},
},
{
asset: {
address: '0xff20817765cb7f73d4bde2e66e067e58d11095c2',
symbol: 'OMG',
decimals: 18,
image: 'omg.jpg',
unlisted: false,
8: {
id: 8,
type: ApprovalType.WatchAsset,
requestData: {
asset: {
address: '0xff20817765cb7f73d4bde2e66e067e58d11095c2',
symbol: 'OMG',
decimals: 18,
image: 'omg.jpg',
unlisted: false,
},
},
},
{
asset: {
address: '0x8e870d67f660d95d5be530380d0ec0bd388289e1',
symbol: 'WED',
decimals: 18,
image: 'wed.png',
unlisted: false,
9: {
id: 9,
type: ApprovalType.WatchAsset,
requestData: {
asset: {
address: '0x8e870d67f660d95d5be530380d0ec0bd388289e1',
symbol: 'WED',
decimals: 18,
image: 'wed.png',
unlisted: false,
},
},
},
];
};

View File

@ -16,81 +16,6 @@ const state = {
protocol: 'https:',
url: 'https://metamask.github.io/test-dapp/',
},
networkList: [
{
blockExplorerUrl: 'https://etherscan.io',
chainId: '0x1',
iconColor: 'var(--mainnet)',
isATestNetwork: false,
labelKey: 'mainnet',
providerType: 'mainnet',
rpcUrl: 'https://mainnet.infura.io/v3/',
ticker: 'ETH',
viewOnly: true,
},
{
blockExplorerUrl: 'https://goerli.etherscan.io',
chainId: '0x5',
iconColor: 'var(--color-network-goerli-default)',
isATestNetwork: true,
labelKey: 'goerli',
providerType: 'goerli',
rpcUrl: 'https://goerli.infura.io/v3/',
ticker: 'ETH',
viewOnly: true,
},
{
blockExplorerUrl: 'https://sepolia.etherscan.io',
chainId: '0xaa36a7',
iconColor: 'var(--color-network-sepolia-default)',
isATestNetwork: true,
labelKey: 'sepolia',
providerType: 'sepolia',
rpcUrl: 'https://sepolia.infura.io/v3/',
ticker: 'ETH',
viewOnly: true,
},
{
blockExplorerUrl: '',
chainId: '0x539',
iconColor: 'var(--color-network-localhost-default)',
isATestNetwork: true,
label: 'Localhost 8545',
providerType: 'rpc',
rpcUrl: 'http://localhost:8545',
ticker: 'ETH',
},
{
blockExplorerUrl: 'https://bscscan.com',
chainId: '0x38',
iconColor: 'var(--color-network-localhost-default)',
isATestNetwork: false,
label: 'Binance Smart Chain',
providerType: 'rpc',
rpcUrl: 'https://bsc-dataseed.binance.org/',
ticker: 'BNB',
},
{
blockExplorerUrl: 'https://cchain.explorer.avax.network/',
chainId: '0xa86a',
iconColor: 'var(--color-network-localhost-default)',
isATestNetwork: false,
label: 'Avalanche',
providerType: 'rpc',
rpcUrl: 'https://api.avax.network/ext/bc/C/rpc',
ticker: 'AVAX',
},
{
blockExplorerUrl: 'https://polygonscan.com',
chainId: '0x89',
iconColor: 'var(--color-network-localhost-default)',
isATestNetwork: false,
label: 'Polygon',
providerType: 'rpc',
rpcUrl: 'https://polygon-rpc.com',
ticker: 'MATIC',
},
],
metamask: {
tokenList: {
'0x514910771af9ca656af840dff83e8264ecf986ca': {
@ -1228,7 +1153,6 @@ const state = {
'0xaD6D458402F60fD3Bd25163575031ACDce07538D': './sai.svg',
},
hiddenTokens: [],
suggestedAssets: [],
useNonceField: false,
usePhishDetect: true,
useTokenDetection: true,
@ -1425,23 +1349,6 @@ const state = {
},
},
},
swapsState: {
quotes: {},
fetchParams: null,
tokens: null,
tradeTxId: null,
approveTxId: null,
quotesLastFetched: null,
customMaxGas: '',
customGasPrice: null,
selectedAggId: null,
customApproveTxData: '',
errorKey: '',
topAggId: null,
routeState: '',
swapsFeatureIsLive: false,
swapsQuoteRefreshTime: 60000,
},
ensResolutionsByAddress: {},
pendingApprovals: {},
pendingApprovalCount: 0,
@ -1692,4 +1599,80 @@ const state = {
},
};
export const networkList = [
{
blockExplorerUrl: 'https://etherscan.io',
chainId: '0x1',
iconColor: 'var(--mainnet)',
isATestNetwork: false,
labelKey: 'mainnet',
providerType: 'mainnet',
rpcUrl: 'https://mainnet.infura.io/v3/',
ticker: 'ETH',
viewOnly: true,
},
{
blockExplorerUrl: 'https://goerli.etherscan.io',
chainId: '0x5',
iconColor: 'var(--color-network-goerli-default)',
isATestNetwork: true,
labelKey: 'goerli',
providerType: 'goerli',
rpcUrl: 'https://goerli.infura.io/v3/',
ticker: 'ETH',
viewOnly: true,
},
{
blockExplorerUrl: 'https://sepolia.etherscan.io',
chainId: '0xaa36a7',
iconColor: 'var(--color-network-sepolia-default)',
isATestNetwork: true,
labelKey: 'sepolia',
providerType: 'sepolia',
rpcUrl: 'https://sepolia.infura.io/v3/',
ticker: 'ETH',
viewOnly: true,
},
{
blockExplorerUrl: '',
chainId: '0x539',
iconColor: 'var(--color-network-localhost-default)',
isATestNetwork: true,
label: 'Localhost 8545',
providerType: 'rpc',
rpcUrl: 'http://localhost:8545',
ticker: 'ETH',
},
{
blockExplorerUrl: 'https://bscscan.com',
chainId: '0x38',
iconColor: 'var(--color-network-localhost-default)',
isATestNetwork: false,
label: 'Binance Smart Chain',
providerType: 'rpc',
rpcUrl: 'https://bsc-dataseed.binance.org/',
ticker: 'BNB',
},
{
blockExplorerUrl: 'https://cchain.explorer.avax.network/',
chainId: '0xa86a',
iconColor: 'var(--color-network-localhost-default)',
isATestNetwork: false,
label: 'Avalanche',
providerType: 'rpc',
rpcUrl: 'https://api.avax.network/ext/bc/C/rpc',
ticker: 'AVAX',
},
{
blockExplorerUrl: 'https://polygonscan.com',
chainId: '0x89',
iconColor: 'var(--color-network-localhost-default)',
isATestNetwork: false,
label: 'Polygon',
providerType: 'rpc',
rpcUrl: 'https://polygon-rpc.com',
ticker: 'MATIC',
},
]
export default state;

View File

@ -1,38 +0,0 @@
diff --git a/dist/AssetsContractController.js b/dist/AssetsContractController.js
index 332c87d7cc5687dec4d80ec3c51dcc4bda632c32..1d88cd313efb00c9c9b57f6824ed74bbca6349e3 100644
--- a/dist/AssetsContractController.js
+++ b/dist/AssetsContractController.js
@@ -33,6 +33,7 @@ exports.SINGLE_CALL_BALANCES_ADDRESS_BY_CHAINID = {
[assetsUtil_1.SupportedTokenDetectionNetworks.bsc]: '0x2352c63A83f9Fd126af8676146721Fa00924d7e4',
[assetsUtil_1.SupportedTokenDetectionNetworks.polygon]: '0x2352c63A83f9Fd126af8676146721Fa00924d7e4',
[assetsUtil_1.SupportedTokenDetectionNetworks.avax]: '0xD023D153a0DFa485130ECFdE2FAA7e612EF94818',
+ [assetsUtil_1.SupportedTokenDetectionNetworks.aurora]: '0x1286415D333855237f89Df27D388127181448538',
};
exports.MISSING_PROVIDER_ERROR = 'AssetsContractController failed to set the provider correctly. A provider must be set for this method to be available';
/**
diff --git a/dist/assetsUtil.d.ts b/dist/assetsUtil.d.ts
index 1b69903a3f8e19f5a451c94791ea16fb18e94d93..d45fe80652fea24d19b2b30dd9af7e6219939153 100644
--- a/dist/assetsUtil.d.ts
+++ b/dist/assetsUtil.d.ts
@@ -45,7 +45,8 @@ export declare enum SupportedTokenDetectionNetworks {
mainnet = "1",
bsc = "56",
polygon = "137",
- avax = "43114"
+ avax = "43114",
+ aurora = "1313161554"
}
/**
* Check if token detection is enabled for certain networks.
diff --git a/dist/assetsUtil.js b/dist/assetsUtil.js
index 4b54e82504cdfae1d937860b0b89b14860385b8e..232228688454d32df818065119dff104f5b0c16c 100644
--- a/dist/assetsUtil.js
+++ b/dist/assetsUtil.js
@@ -120,6 +120,7 @@ var SupportedTokenDetectionNetworks;
SupportedTokenDetectionNetworks["bsc"] = "56";
SupportedTokenDetectionNetworks["polygon"] = "137";
SupportedTokenDetectionNetworks["avax"] = "43114";
+ SupportedTokenDetectionNetworks["aurora"] = "1313161554";
})(SupportedTokenDetectionNetworks = exports.SupportedTokenDetectionNetworks || (exports.SupportedTokenDetectionNetworks = {}));
/**
* Check if token detection is enabled for certain networks.

View File

@ -0,0 +1,18 @@
diff --git a/dist/SignatureController.js b/dist/SignatureController.js
index b39d274f4547ab4e8b647293199ec21c4a9e38ca..288e55c97c3e4a234874dd8b8986ba77576b0dc4 100644
--- a/dist/SignatureController.js
+++ b/dist/SignatureController.js
@@ -308,12 +308,12 @@ _SignatureController_keyringController = new WeakMap(), _SignatureController_isE
const messageId = msgParams.metamaskId;
try {
const cleanMessageParams = yield messageManager.approveMessage(msgParams);
+ __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_acceptApproval).call(this, messageId);
const signature = yield getSignature(cleanMessageParams);
this.hub.emit(`${methodName}:signed`, { signature, messageId });
if (!cleanMessageParams.deferSetAsSigned) {
messageManager.setMessageStatusSigned(messageId, signature);
}
- __classPrivateFieldGet(this, _SignatureController_instances, "m", _SignatureController_acceptApproval).call(this, messageId);
return __classPrivateFieldGet(this, _SignatureController_getAllState, "f").call(this);
}
catch (error) {

View File

@ -1,5 +1,5 @@
diff --git a/dist/squirrelly.cjs.js b/dist/squirrelly.cjs.js
index 4680ee747900853b9af01b480c749880dedb9824..95dce7623bc115508063a78c7de9ed7b6e4d3d82 100644
index b87580be5da8a9a5af4cf60c8c5acf910c8f9ed2..e037b8a986d331f7075bbd448c80104de8a3453c 100644
--- a/dist/squirrelly.cjs.js
+++ b/dist/squirrelly.cjs.js
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });

View File

@ -0,0 +1,9 @@
/* eslint-disable */
//prettier-ignore
module.exports = {
name: "@yarnpkg/plugin-engines",
factory: function (require) {
var plugin=(()=>{var P=Object.create,f=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,Y=Object.prototype.hasOwnProperty;var b=n=>f(n,"__esModule",{value:!0});var i=n=>{if(typeof require!="undefined")return require(n);throw new Error('Dynamic require of "'+n+'" is not supported')};var T=(n,e)=>{for(var r in e)f(n,r,{get:e[r],enumerable:!0})},V=(n,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of N(e))!Y.call(n,t)&&t!=="default"&&f(n,t,{get:()=>e[t],enumerable:!(r=R(e,t))||r.enumerable});return n},s=n=>V(b(f(n!=null?P(j(n)):{},"default",n&&n.__esModule&&"default"in n?{get:()=>n.default,enumerable:!0}:{value:n,enumerable:!0})),n);var U={};T(U,{default:()=>q});var o=s(i("@yarnpkg/core")),c;(function(r){r.Yarn="Yarn",r.Console="Console"})(c||(c={}));var h=class{constructor(e){this.throwWrongEngineError=(e,r)=>{let t=this.formatErrorMessage(e,r);this.throwError(t)};this.throwError=e=>{switch(this.errorReporter){case c.Yarn:this.reportYarnError(e);break;case c.Console:default:this.reportConsoleError(e);break}};this.reportYarnError=e=>{throw new o.ReportError(o.MessageName.UNNAMED,e)};this.reportConsoleError=e=>{console.error(e),process.exit(1)};this.formatErrorMessage=(e,r)=>{let{configuration:t}=this.project,p=o.formatUtils.applyStyle(t,o.formatUtils.pretty(t,this.engine,"green"),2),g=o.formatUtils.pretty(t,e,"cyan"),d=o.formatUtils.pretty(t,r,"cyan"),w=`The current ${p} version ${g} does not satisfy the required version ${d}.`;return o.formatUtils.pretty(t,w,"red")};this.project=e.project,this.errorReporter=e.errorReporter}};var m=s(i("fs")),y=s(i("path")),l=s(i("semver")),k=s(i("@yarnpkg/fslib")),a=s(i("@yarnpkg/core"));var v=class extends h{constructor(){super(...arguments);this.resolveNvmRequiredVersion=()=>{let{configuration:e,cwd:r}=this.project,t=(0,y.resolve)(k.npath.fromPortablePath(r),".nvmrc"),p=a.formatUtils.applyStyle(e,a.formatUtils.pretty(e,this.engine,"green"),2);if(!(0,m.existsSync)(t)){this.throwError(a.formatUtils.pretty(e,`Unable to verify the ${p} version. The .nvmrc file does not exist.`,"red"));return}let g=(0,m.readFileSync)(t,"utf-8").trim();if((0,l.validRange)(g))return g;let d=a.formatUtils.pretty(e,".nvmrc","yellow");this.throwError(a.formatUtils.pretty(e,`Unable to verify the ${p} version. The ${d} file contains an invalid semver range.`,"red"))}}get engine(){return"Node"}verifyEngine(e){let r=e.node;r!=null&&(r===".nvmrc"&&(r=this.resolveNvmRequiredVersion()),(0,l.satisfies)(process.version,r,{includePrerelease:!0})||this.throwWrongEngineError(process.version.replace(/^v/i,""),r.replace(/^v/i,"")))}};var x=s(i("semver")),E=s(i("@yarnpkg/core"));var u=class extends h{get engine(){return"Yarn"}verifyEngine(e){let r=e.yarn;r!=null&&((0,x.satisfies)(E.YarnVersion,r,{includePrerelease:!0})||this.throwWrongEngineError(E.YarnVersion,r))}};var C=n=>e=>{if(process.env.PLUGIN_YARN_ENGINES_DISABLE!=null)return;let{engines:r={}}=e.getWorkspaceByCwd(e.cwd).manifest.raw,t={project:e,errorReporter:n};[new v(t),new u(t)].forEach(g=>g.verifyEngine(r))},S={hooks:{validateProject:C(c.Yarn),setupScriptEnvironment:C(c.Console)}},q=S;return U;})();
return plugin;
}
};

View File

@ -13,5 +13,7 @@ plugins:
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"
- path: .yarn/plugins/@yarnpkg/plugin-engines.cjs
spec: "https://raw.githubusercontent.com/devoto13/yarn-plugin-engines/main/bundles/%40yarnpkg/plugin-engines.js"
yarnPath: .yarn/releases/yarn-3.2.4.cjs

View File

@ -6,6 +6,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [10.32.0]
### Added
- Enable token detection for the Aurora network ([#19009](https://github.com/MetaMask/metamask-extension/pull/19009))
- Add reveal UI to export private key flow ([#18170](https://github.com/MetaMask/metamask-extension/pull/18170))
### Changed
- [FLASK] **BREAKING:** Block `wallet_requestPermissions` (#18913)
- [FLASK] Fix issues with installing specific versions of snaps (#18913)
### Fixed
- [FLASK] Fix an issue with submitting an empty Snaps UI prompt (#19227)
- Display contract address as recipient when value is included with standard token transactions (#18855)
- Fix the display of token count in SetApprovalForAll screen (#18863)
- Disable Previous Button on First Page of hardware wallet account selection flow (#17610)
- [Flask] Prevent lavamoat errors in the console caused by attempting to inject the provider to snaps iframe (#19096)
- Fix to ensure popover scroll button is correctly shown and hidden in the WhatsNewPopup (#19017)
- Fix: Show network picker when locked (#19063)
## [10.31.1]
### Fixed
- Fix signature requests for Keystone Hardware Wallet users ([#19349](https://github.com/MetaMask/metamask-extension/pull/19349))
## [10.31.0]
### Added
- Add extra friction to enable eth_sign in advanced settings ([#18848](https://github.com/MetaMask/metamask-extension/pull/18848))
@ -3757,7 +3779,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Uncategorized
- Added the ability to restore accounts from seed words.
[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v10.31.0...HEAD
[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v10.32.0...HEAD
[10.32.0]: https://github.com/MetaMask/metamask-extension/compare/v10.31.1...v10.32.0
[10.31.1]: https://github.com/MetaMask/metamask-extension/compare/v10.31.0...v10.31.1
[10.31.0]: https://github.com/MetaMask/metamask-extension/compare/v10.30.4...v10.31.0
[10.30.4]: https://github.com/MetaMask/metamask-extension/compare/v10.30.3...v10.30.4
[10.30.3]: https://github.com/MetaMask/metamask-extension/compare/v10.30.2...v10.30.3

View File

@ -54,7 +54,7 @@ To learn how to contribute to the MetaMask project itself, visit our [Internal D
- 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.
- Copy the `.metamaskrc.dist` file to `.metamaskrc`
- 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).
- If debugging unhandled exceptions, you'll need to add a value for `SENTRY_DSN` [Sentry Dsn](https://docs.sentry.io/product/sentry-basics/dsn-explainer/), see [Developing on MetaMask - Sentry](./development/README.md#sentry).

View File

@ -87,9 +87,6 @@
"back": {
"message": "ተመለስ"
},
"backToAll": {
"message": "ወደ ሁሉም ተመለስ"
},
"backupApprovalInfo": {
"message": "መሳሪያዎ ቢጠፋ፣ የይለፍ ቃልዎን ቢረሱ፣ MetaMask እንደገና መጫን ቢያስፈልግዎ ወይም በሌላ መሳሪያ ወደ ቋትዎ ለመድረስ ቢፈልጉ ይህ ሚስጥራዊ ኮድ ቋትዎን መልሶ ለማግኘት ያስፈልጋል።"
},
@ -148,16 +145,13 @@
"connect": {
"message": "ይገናኙ"
},
"connectHardwareWallet": {
"message": "ከሃርድዌር ቋት ጋር ይገናኙ"
},
"connectingTo": {
"message": "ከ $1ጋር መገናኘት"
},
"connectingToGoerli": {
"message": "ከ Goerli የሙከራ አውታረ መረብ ጋር መገናኘት"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "ከ Linea Goerli የሙከራ አውታረ መረብ ጋር መገናኘት"
},
"connectingToMainnet": {
@ -187,9 +181,6 @@
"create": {
"message": "ፍጠር"
},
"createAccount": {
"message": "መለያ ፍጠር"
},
"createPassword": {
"message": "የይለፍ ቃል ፍጠር"
},
@ -403,7 +394,7 @@
"likeToImportTokens": {
"message": "እነዚህን ተለዋጭ ስሞች ለማከል ይፈልጋሉ?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "የ Linea Goerli የሙከራ አውታረ መረብ"
},
"links": {
@ -439,9 +430,6 @@
"mustSelectOne": {
"message": "ቢያንስ 1 ተለዋጭ ስም መምረጥ አለብዎ።"
},
"myAccounts": {
"message": "የእኔ መለያዎች"
},
"needImportFile": {
"message": "የሚያስመጡትን ፋይል መምረጥ አለብዎት።",
"description": "User is important an account and needs to add a file to continue"
@ -566,9 +554,6 @@
"readdToken": {
"message": "በመለያ አማራጮችዎ ምናሌ ውስጥ ወደ “ተለዋጭ ስም አክል” በመግባት ለወደፊቱ ይህን ተለዋጭ ስም መልሰው ማከል ይችላሉ።"
},
"recents": {
"message": "የቅርብ ጊዜያት"
},
"recipientAddressPlaceholder": {
"message": "ፍለጋ፣ ለሕዝብ ክፍት የሆነ አድራሻ (0x), ወይም ENS"
},
@ -792,16 +777,9 @@
"transfer": {
"message": "ያስተላልፉ"
},
"transferBetweenAccounts": {
"message": "በመለያዎች መካከል አስተላልፍ"
},
"transferFrom": {
"message": "የማዛወሪያ ቅጽ"
},
"troubleTokenBalances": {
"message": "የተለዋጭ ስም ቀሪ ሂሳብዎን ስንጭን ችግር አጋጥሞናል። ማየት ይችላሉ",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "እንደገና ሞክር"
},

View File

@ -97,9 +97,6 @@
"back": {
"message": "الرجوع إلى الوراء"
},
"backToAll": {
"message": "العودة إلى الجميع"
},
"backupApprovalInfo": {
"message": "هذا الرمز السري مطلوب لاسترداد محفظتك في حالة فقد جهازك أو نسيان كلمة مرورك أو إعادة تثبيت MetaMask أو الرغبة في الوصول إلى محفظتك عبر جهاز آخر."
},
@ -158,16 +155,13 @@
"connect": {
"message": "اتصال"
},
"connectHardwareWallet": {
"message": "ربط محفظة الأجهزة"
},
"connectingTo": {
"message": "جارِ الاتصال بـ $1"
},
"connectingToGoerli": {
"message": "الاتصال بشبكة اختبار Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "الاتصال بشبكة اختبار Linea Goerli"
},
"connectingToMainnet": {
@ -197,9 +191,6 @@
"create": {
"message": "إنشاء"
},
"createAccount": {
"message": "إنشاء حساب"
},
"createPassword": {
"message": "إنشاء كلمة مرور"
},
@ -415,7 +406,7 @@
"likeToImportTokens": {
"message": "هل ترغب في إضافة هذه الرموز؟"
},
"lineatestnet": {
"lineaGoerli": {
"message": "شبكة اختبار Linea Goerli"
},
"links": {
@ -451,9 +442,6 @@
"mustSelectOne": {
"message": "يجب تحديد عملة رمزية واحدة على الأقل."
},
"myAccounts": {
"message": "حساباتي"
},
"needImportFile": {
"message": "يلزم تحديد ملف للاستيراد.",
"description": "User is important an account and needs to add a file to continue"
@ -578,9 +566,6 @@
"readdToken": {
"message": "يمكنك إضافة هذه العملة الرمزية مرة أخرى في المستقبل من خلال الانتقال إلى \"إضافة عملة رمزية\" في قائمة خيارات الحسابات الخاصة بك."
},
"recents": {
"message": "الحديث"
},
"recipientAddressPlaceholder": {
"message": "البحث، العنوان العام (0x)، أو ENS"
},
@ -804,16 +789,9 @@
"transfer": {
"message": "تحويل"
},
"transferBetweenAccounts": {
"message": "التحويل بين حساباتي"
},
"transferFrom": {
"message": "التحويل من"
},
"troubleTokenBalances": {
"message": "واجهتنا مشكلة في تحميل أرصدتك من العملات الرمزية. يمكنك الاطلاع عليها",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "إعادة المحاولة"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Назад"
},
"backToAll": {
"message": "Назад към всички"
},
"backupApprovalInfo": {
"message": "Този секретен код е необходим за възстановяване на портфейла ви, в случай че загубите устройството си, забравите паролата си, трябва да инсталирате отново MetaMask или искате да получите достъп до портфейла си на друго устройство."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Свързване"
},
"connectHardwareWallet": {
"message": "Свържете хардуерен портфейл"
},
"connectingTo": {
"message": "Свързване с $1"
},
"connectingToGoerli": {
"message": "Свързване с тестова мрежа на Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Свързване с тестова мрежа на Linea Goerli"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Създаване"
},
"createAccount": {
"message": "Създай акаунт"
},
"createPassword": {
"message": "Създаване на парола"
},
@ -411,7 +402,7 @@
"likeToImportTokens": {
"message": "Искате ли да добавите тези жетони?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Тестова мрежа на Linea Goerli"
},
"links": {
@ -450,9 +441,6 @@
"mustSelectOne": {
"message": "Трябва да изберете поне 1 жетон."
},
"myAccounts": {
"message": "Моите акаунти"
},
"needImportFile": {
"message": "Трябва да изберете файл за импортиране.",
"description": "User is important an account and needs to add a file to continue"
@ -577,9 +565,6 @@
"readdToken": {
"message": "Можете да добавите този жетон в бъдеще, като отидете на „Добавяне на жетон“ в менюто с опции на акаунти."
},
"recents": {
"message": "Скорошни"
},
"recipientAddressPlaceholder": {
"message": "Търсене, публичен адрес (0x) или ENS"
},
@ -803,16 +788,9 @@
"transfer": {
"message": "Трансфер"
},
"transferBetweenAccounts": {
"message": "Прехвърляне между моите акаунти"
},
"transferFrom": {
"message": "Трансфер от"
},
"troubleTokenBalances": {
"message": "Имахме проблеми със зареждането на вашите символи. Можете да ги видите",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Нов опит"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "ফিরুন"
},
"backToAll": {
"message": "সমস্ততে ফিরে আসুন"
},
"backupApprovalInfo": {
"message": "আপনি আপনার ডিভাইস হারিয়ে ফেললে, পাসওয়ার্ড ভুলে গেলে, MetaMask রিইনস্টল করতে হলে বা অন্য ডিভাইসে আপনার ওয়ালেট অ্যাক্সেস করার ক্ষেত্রে আপনার ওয়ালেট পুনরুদ্ধার করতে এই গোপন কোডটি প্রয়োজন।"
},
@ -154,9 +151,6 @@
"connect": {
"message": "সংযুক্ত করুন"
},
"connectHardwareWallet": {
"message": "হার্ডওয়্যার ওয়ালেট সংযুক্ত করুন"
},
"connectingTo": {
"message": " $1 এর সাথে সংযোগ করছে"
},
@ -190,9 +184,6 @@
"create": {
"message": "তৈরি করুন"
},
"createAccount": {
"message": "অ্যাকাউন্ট তৈরি করুন"
},
"createPassword": {
"message": "পাসওয়ার্ড তৈরি করুন"
},
@ -448,9 +439,6 @@
"mustSelectOne": {
"message": "অবশ্যই অন্তত 1টি টোকেন নির্বাচন করতে হবে।"
},
"myAccounts": {
"message": "আমার অ্যাকাউন্টগুলি"
},
"needImportFile": {
"message": "আমদানি করার জন্য আপনাকে অবশ্যই একটি ফাইল নির্বাচন করতে হবে।",
"description": "User is important an account and needs to add a file to continue"
@ -575,9 +563,6 @@
"readdToken": {
"message": "আপনি আপনার অ্যাকাউন্টস বিকল্পের মেনুতে \"টোকেনগুলি যোগ করুন\" এ গিয়ে ভবিষ্যতে আবার এই টোকেনটি যোগ করতে পারবেন। "
},
"recents": {
"message": "সাম্প্রতিকগুলি"
},
"recipientAddressPlaceholder": {
"message": "অনুসন্ধান, সার্বজনীন ঠিকানা (0x), বা ENS"
},
@ -801,16 +786,9 @@
"transfer": {
"message": "ট্রান্সফার করুন"
},
"transferBetweenAccounts": {
"message": "আমার অ্যাকাউন্টগুলির মধ্যে ট্রান্সফার করুন"
},
"transferFrom": {
"message": "থেকে ট্রান্সফার করুন"
},
"troubleTokenBalances": {
"message": "আপনার টোকেন ব্যালেন্সগুলি লোড করতে আমাদের সমস্যা হয়েছিল। আপনি সেগুলি দেখতে পারেন",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "আবার করুন"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Enrere"
},
"backToAll": {
"message": "Torna a Tot"
},
"backupApprovalInfo": {
"message": "Aquest codi secret es requereix per recuperar el teu moneder en cas que perdis el dispositiu, oblidis la teva contrasenya, hagis de reinstal·lar MetaMask, o vulguis accedir al teu moneder des d'un altre dispositiu."
},
@ -151,16 +148,13 @@
"connect": {
"message": "Connecta"
},
"connectHardwareWallet": {
"message": "Connectar Moneder Hardaware"
},
"connectingTo": {
"message": "Connectant a $1 "
},
"connectingToGoerli": {
"message": "Connectant a Xarxa de Prova Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Connectant a Xarxa de Prova Linea Goerli"
},
"connectingToMainnet": {
@ -190,9 +184,6 @@
"create": {
"message": "Crea"
},
"createAccount": {
"message": "Crea "
},
"createPassword": {
"message": "Crear Contrasenya"
},
@ -402,7 +393,7 @@
"likeToImportTokens": {
"message": "T'agradaria afegir aquestes fitxes?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Xarxa de test Linea Goerli"
},
"links": {
@ -438,9 +429,6 @@
"mustSelectOne": {
"message": "Has de seleccionar "
},
"myAccounts": {
"message": "Els meus Comptes"
},
"needImportFile": {
"message": "Has de seleccionar un arxiu per a importar.",
"description": "User is important an account and needs to add a file to continue"
@ -779,16 +767,9 @@
"transfer": {
"message": "Transferència"
},
"transferBetweenAccounts": {
"message": "Transferir entre els meus comptes"
},
"transferFrom": {
"message": "Transferir Des de"
},
"troubleTokenBalances": {
"message": "Hem tingut problemes en carregar el teu saldo de fitxes. Els pots veure",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Torna-ho a provar"
},

View File

@ -81,9 +81,6 @@
"create": {
"message": "Vytvořit"
},
"createAccount": {
"message": "Vytvořit účet"
},
"customToken": {
"message": "Vlastní token"
},
@ -209,9 +206,6 @@
"mustSelectOne": {
"message": "Musíte zvolit aspoň 1 token."
},
"myAccounts": {
"message": "Moje účty"
},
"needImportFile": {
"message": "Musíte zvolit soubor k importu.",
"description": "User is important an account and needs to add a file to continue"
@ -364,10 +358,6 @@
"transactionError": {
"message": "Chyba transakce. Vyhozena výjimka v kódu kontraktu."
},
"troubleTokenBalances": {
"message": "Měli jsme problém s načtením vašich tokenových zůstatků. Můžete je vidět ",
"description": "Followed by a link (here) to view token balances"
},
"typePassword": {
"message": "Zadejte své heslo"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Tilbage"
},
"backToAll": {
"message": "Tilbage til Alle"
},
"backupApprovalInfo": {
"message": "Den hemmelige kode er påkrævet for at gendanne din pung, hvis du mister din enhed, glemmer dit kodeord, er nødt til at geninstallere MetaMask eller ønsker adgang til din pung fra en anden enhed."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Få forbindelse"
},
"connectHardwareWallet": {
"message": "Forbind Hardwarepung"
},
"connectingTo": {
"message": "Forbinder til $1"
},
"connectingToGoerli": {
"message": "Opretter forbindelse til Goerli Testnetværk"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Opretter forbindelse til Linea Goerli Testnetværk"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Opret"
},
"createAccount": {
"message": "Opret konto"
},
"createPassword": {
"message": "Opret adgangskode"
},
@ -408,7 +399,7 @@
"likeToImportTokens": {
"message": "Ønsker du at tilføje disse tokens?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea-testnetværk"
},
"loadMore": {
@ -438,9 +429,6 @@
"mustSelectOne": {
"message": "Skal vælge mindst 1 token."
},
"myAccounts": {
"message": "Mine Konti"
},
"needImportFile": {
"message": "Du skal vælge en fil, der skal importeres.",
"description": "User is important an account and needs to add a file to continue"
@ -562,9 +550,6 @@
"readdToken": {
"message": "Du kan tilføje denne token i fremtiden, ved at gå til \"Tilføj token\" under dine valgmenuen for dine konti."
},
"recents": {
"message": "Seneste"
},
"recipientAddressPlaceholder": {
"message": "Søg, offentlig adresse (0x) eller ENS"
},
@ -776,16 +761,9 @@
"transfer": {
"message": "Overfør"
},
"transferBetweenAccounts": {
"message": "Overfør mellem konti"
},
"transferFrom": {
"message": "Overfør fra"
},
"troubleTokenBalances": {
"message": "Vi havde problemer med at indlæse dine tokenbalancer. Du kan se dem",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Prøv igen"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "Kunden-Token hinzufügen"
},
"addCustomTokenByContractAddress": {
"message": "Sie können kein Token finden? Sie können ein beliebiges Token manuell hinzufügen, indem Sie seine Adresse eingeben. Token-Vertragsadressen finden Sie auf $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Dadurch kann dieses Netzwerk innerhalb MetaMask verwendet werden."
},
@ -263,6 +259,10 @@
"addToken": {
"message": "Token hinzufügen"
},
"addTokenByContractAddress": {
"message": "Sie können kein Token finden? Sie können ein beliebiges Token manuell hinzufügen, indem Sie seine Adresse eingeben. Token-Vertragsadressen finden Sie auf $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Adresse"
},
@ -359,12 +359,6 @@
"message": "Erlauben Sie den Zugriff auf und die Übertragung von all Ihren $1?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "Genehmigen und installieren"
},
"approveAndUpdate": {
"message": "Genehmigen & aktualisieren"
},
"approveButtonText": {
"message": "Genehmigen"
},
@ -429,9 +423,6 @@
"back": {
"message": "Zurück"
},
"backToAll": {
"message": "Zurück zur Übersicht"
},
"backup": {
"message": "Datensicherung"
},
@ -557,13 +548,6 @@
"message": "Für eine Transaktion im Wert von $1 muss die Gasgebühr um mindestens 10 % erhöht werden, damit sie vom Netz erkannt wird.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "Tausch für ~$1 abbrechen",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Tausch kostenlos abbrechen"
},
"cancelled": {
"message": "Abgebrochen"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "Konto verbinden oder Neues erstellen"
},
"connectHardwareWallet": {
"message": "Hardware-Wallet verknüpfen"
},
"connectManually": {
"message": "Manuelle Verbindung zur aktuellen Site"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Verbindungsaufbau zum Goerli-Testnetzwerk"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Verbindungsaufbau zum Linea-Testnetzwerk"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "Erstellen"
},
"createAccount": {
"message": "Konto erstellen"
},
"createNewWallet": {
"message": "Eine neue Wallet erstellen"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "Verwenden Sie die OpenSea's API, um NFT-Daten abzurufen. Die NFT-Auto-Erkennung basiert auf der OpenSea's API und wird nicht verfügbar sein, wenn diese deaktiviert ist."
},
"enableSmartTransactions": {
"message": "Intelligente Transaktionen ermöglichen"
},
"enableToken": {
"message": "$1 aktivieren",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "Jeder kann ein Token mit beliebigem Namen erstellen, einschließlich gefälschter Versionen bestehender Token. Hinzufügen und Handeln auf eigene Gefahr!"
},
"importTokens": {
"message": "Token importieren"
},
"importTokensCamelCase": {
"message": "Token importieren"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "Möchtest du diese Token hinzufügen?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea-Testnetzwerk"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "Hier anfragen"
},
"missingToken": {
"message": "Sie sehen Ihren Token nicht?"
},
"moreComingSoon": {
"message": "Mehr in Kürze ..."
},
"mustSelectOne": {
"message": "Du musst mindestens 1 Token auswählen."
},
"myAccounts": {
"message": "Meine Konten"
},
"name": {
"message": "Name"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "Nicht genügend Gas"
},
"notifications": {
"message": "Benachrichtigungen"
},
"notifications10ActionText": {
"message": "Einstellungen ansehen",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2309,7 +2272,7 @@
"description": "The 'call to action' on the button, or link, of the 'Stay secure' notification. Upon clicking, users will be taken to a page about security on the metamask support website."
},
"notifications3Description": {
"message": "Bleiben Sie auf dem Laufenden bezüglich der bewährten Sicherheitsverfahren von MetaMask und erhalten Sie die neuesten Sicherheitstipps des offiziellen Metamask-Supports.",
"message": "Bleiben Sie auf dem Laufenden bezüglich der bewährten Sicherheitsverfahren von MetaMask und erhalten Sie die neuesten Sicherheitstipps des offiziellen MetaMask-Supports.",
"description": "Description of a notification in the 'See What's New' popup. Describes the information they can get on security from the linked support page."
},
"notifications3Title": {
@ -2817,9 +2780,6 @@
"receive": {
"message": "Erhalten"
},
"recents": {
"message": "Letzte"
},
"recipientAddressPlaceholder": {
"message": "Suchen, öffentliche Adresse (0x) oder ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "Wählen Sie dies aus, um das Hexdatenfeld auf dem Senden-Bildschirm anzuzeigen"
},
"showHide": {
"message": "Ein-/Ausblenden"
},
"showIncomingTransactions": {
"message": "Eingehende Transaktionen anzeigen"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "Mir ist klar, dass ich meine Konten und alle dazugehörigen Vermögenswerte verlieren kann, solange ich keine Sicherungskopie meiner Geheimen Wiederherstellungsphrase erstelle."
},
"smartTransaction": {
"message": "Intelligente Transaktionen"
},
"snapContent": {
"message": "Diese Inhalte stammen von $1",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "Snap installieren"
},
"snapInstallWarningCheck": {
"message": "Um zu bestätigen, dass Sie das verstanden haben, markieren Sie das Kästchen."
"message": "Um zu bestätigen, dass Sie das verstanden haben, markieren Sie das Kästchen.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "Um zu bestätigen, dass Sie alles verstanden haben, markieren Sie alle Kästchen."
"message": "Um zu bestätigen, dass Sie alles verstanden haben, markieren Sie alle Kästchen.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "Sie gewähren dem Snap „$1“ wichtige $2-Zugriffsrechte. Dies kann nicht rückgängig gemacht werden und gibt „$1“ Kontrolle über Ihre $2-Konten und Vermögenswerte. Stellen Sie sicher, dass Sie „$1“ vertrauen, bevor Sie fortfahren.",
@ -3416,9 +3372,6 @@
"status": {
"message": "Status"
},
"statusConnected": {
"message": "Verbinden"
},
"statusNotConnected": {
"message": "Nicht verbunden"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "Stark"
},
"stxAreHere": {
"message": "Intelligente Transaktionen sind da!"
},
"stxBenefit1": {
"message": "Transaktionskosten minimieren"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "Versuchen Sie Ihren Swap erneut. Wir werden hier sein, um Sie beim nächsten Mal vor ähnlichen Risiken zu schützen."
},
"stxDescription": {
"message": "MetaMask-Swap ist jetzt viel intelligenter geworden! Wenn Sie intelligente Transaktionen aktivieren, kann MetaMask Ihren Swap programmgesteuert optimieren, um Ihnen zu helfen:"
},
"stxErrorNotEnoughFunds": {
"message": "Nicht genügend Mittel für eine intelligente Transaktion."
},
"stxErrorUnavailable": {
"message": "Intelligente Transaktionen sind vorübergehend nicht verfügbar."
},
"stxFailure": {
"message": "Swap fehlgeschlagen"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "Ihr Swap wird öffentlich eingereicht ..."
},
"stxSubDescription": {
"message": "* Intelligente Transaktionen versuchen mehrmals, Ihre Transaktion privat zu übermitteln. Wenn alle Versuche fehlschlagen, wird die Transaktion öffentlich übertragen, um sicherzustellen, dass Ihr Swap erfolgreich durchgeführt wird."
},
"stxSuccess": {
"message": "Swap abgeschlossen!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "eth_sign-Anfragen ein- oder ausschalten"
},
"toggleTestNetworks": {
"message": "$1 Test-Netzwerke",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Token"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "Überweisung"
},
"transferBetweenAccounts": {
"message": "Zwischen meinen Konten transferieren"
},
"transferFrom": {
"message": "Transferieren von"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "Beim Starten von MetaMask ist ein Problem aufgetreten. Dies könnte ein vorübergehendes Problem sein. Versuchen Sie daher, die Erweiterung neu zu starten."
},
"troubleTokenBalances": {
"message": "Wir haben Schwierigkeiten dein Tokenguthaben zu laden. Du kannst es hier anzeigen lassen",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "Durch Erteilung der Erlaubnis erlauben Sie den folgenden $1 Zugriff auf Ihr Guthaben"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "Προσθήκη Προσαρμοσμένου Token"
},
"addCustomTokenByContractAddress": {
"message": "Αδυναμία εύρεσης token; Μπορείτε να προσθέσετε χειροκίνητα οποιοδήποτε διακριτικό επικολλώντας τη διεύθυνσή του. Οι διευθύνσεις συμβολαίων Token μπορούν να βρεθούν στο $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Αυτό θα επιτρέψει σε αυτό το δίκτυο να χρησιμοποιηθεί στο MetaMask."
},
@ -263,6 +259,10 @@
"addToken": {
"message": "Προσθήκη Token"
},
"addTokenByContractAddress": {
"message": "Αδυναμία εύρεσης token; Μπορείτε να προσθέσετε χειροκίνητα οποιοδήποτε διακριτικό επικολλώντας τη διεύθυνσή του. Οι διευθύνσεις συμβολαίων Token μπορούν να βρεθούν στο $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Διεύθυνση"
},
@ -359,12 +359,6 @@
"message": "Δίνετε άδεια για να αποκτήσετε πρόσβαση σε όλα σας τα $1;",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "Έγκριση και Εγκατάσταση"
},
"approveAndUpdate": {
"message": "Έγκριση και ενημέρωση"
},
"approveButtonText": {
"message": "Έγκριση"
},
@ -429,9 +423,6 @@
"back": {
"message": "Πίσω"
},
"backToAll": {
"message": "Πίσω σε Όλα"
},
"backup": {
"message": "Αντίγραφο ασφαλείας"
},
@ -557,13 +548,6 @@
"message": "Για να $1 τη συναλλαγή, τα τέλη συναλλαγής πρέπει να αυξηθούν κατά τουλάχιστον 10% ώστε να αναγνωριστούν από το δίκτυο.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "Ακυρώστε τη συναλλαγή για ~$1",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Ακυρώστε τη συναλλαγή δωρεάν"
},
"cancelled": {
"message": "Ακυρώθηκε"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "Σύνδεση λογαριασμού ή δημιουργία νέου"
},
"connectHardwareWallet": {
"message": "Σύνδεση Πορτοφολιού Υλικού"
},
"connectManually": {
"message": "Χειροκίνητη σύνδεση στον τρέχοντα ιστότοπο"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Σύνδεση στο Δίκτυο Δοκιμής Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Σύνδεση στο δίκτυο δοκιμών Linea Goerli"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "Δημιουργία"
},
"createAccount": {
"message": "Δημιουργία Λογαριασμού"
},
"createNewWallet": {
"message": "Δημιουργήστε ένα νέο πορτοφόλι"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "Χρησιμοποιήστε το API OpenSea για λήψη δεδομένων NFT. Η αυτόματη ανίχνευση NFT βασίζεται στο API του OpenSea, και δεν θα είναι διαθέσιμη όταν αυτό είναι απενεργοποιημένο."
},
"enableSmartTransactions": {
"message": "Ενεργοποίηση Έξυπνων Συναλλαγών"
},
"enableToken": {
"message": "ενεργοποίηση $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "Ο καθένας μπορεί να δημιουργήσει ένα token με οποιοδήποτε όνομα, συμπεριλαμβανομένων ψεύτικων εκδόσεων των υφιστάμενων νομισμάτων. Προσθέστε και ανταλλάξτε με δική σας ευθύνη!"
},
"importTokens": {
"message": "εισαγωγή token"
},
"importTokensCamelCase": {
"message": "Εισαγωγή Token"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "Θέλετε να προσθέσετε αυτά τα token;"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Δίκτυο δοκιμών Linea Goerli"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "Υποβάλετε αίτημα εδώ"
},
"missingToken": {
"message": "Δεν βλέπετε το token σας;"
},
"moreComingSoon": {
"message": "Περισσότερα έρχονται σύντομα..."
},
"mustSelectOne": {
"message": "Πρέπει να επιλέξετε 1 τουλάχιστον διακριτικό."
},
"myAccounts": {
"message": "Οι Λογαριασμοί μου"
},
"name": {
"message": "Όνομα"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "Δεν Υπάρχει Αρκετό τέλος συναλλαγής"
},
"notifications": {
"message": "Ειδοποιήσεις"
},
"notifications10ActionText": {
"message": "Μετάβαση στις Ρυθμίσεις",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2817,9 +2780,6 @@
"receive": {
"message": "Λήψη"
},
"recents": {
"message": "Πρόσφατα"
},
"recipientAddressPlaceholder": {
"message": "Αναζήτηση, δημόσια διεύθυνση (0x) ή ENS"
},
@ -3211,9 +3171,6 @@
"showHexDataDescription": {
"message": "Επιλέξτε αυτό για να εμφανίσετε το πεδίο hex δεδομένων στην οθόνη αποστολής"
},
"showHide": {
"message": "Εμφάνιση/απόκρυψη"
},
"showIncomingTransactions": {
"message": "Εμφάνιση Εισερχομένων Συναλλαγών"
},
@ -3266,9 +3223,6 @@
"skipAccountSecurityDetails": {
"message": "Καταλαβαίνω ότι μέχρι να δημιουργήσω αντίγραφα ασφαλείας για τη Μυστική Φράση Ανάκτησής μου, μπορεί να χάσω τους λογαριασμούς μου και όλα τα περιουσιακά στοιχεία τους."
},
"smartTransaction": {
"message": "Έξυπνη Συναλλαγή"
},
"snapContent": {
"message": "Αυτό το περιεχόμενο προέρχεται από το $1",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3281,10 +3235,12 @@
"message": "Εγκατάσταση Snap"
},
"snapInstallWarningCheck": {
"message": "Για να επιβεβαιώσετε ότι καταλαβαίνετε, επιλέξτε όλα τα πλαίσια ελέγχου."
"message": "Για να επιβεβαιώσετε ότι καταλαβαίνετε, επιλέξτε όλα τα πλαίσια ελέγχου.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "Για να επιβεβαιώσετε ότι καταλαβαίνετε, επιλέξτε όλα τα κουτάκια."
"message": "Για να επιβεβαιώσετε ότι καταλαβαίνετε, επιλέξτε όλα τα κουτάκια.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "Εκχωρείτε στο $2 βασική πρόσβαση στο snap \"$1\". Αυτό είναι αμετάκλητο και παρέχει στο \"$1\" τον έλεγχο των λογαριασμών και των περιουσιακών σας στοιχείων $2. Βεβαιωθείτε ότι εμπιστεύεστε το \"$1\" προτού συνεχίσετε.",
@ -3413,9 +3369,6 @@
"status": {
"message": "Κατάσταση"
},
"statusConnected": {
"message": "Συνδεδεμένο"
},
"statusNotConnected": {
"message": "Δεν έχει συνδεθεί"
},
@ -3453,9 +3406,6 @@
"strong": {
"message": "Ισχυρός"
},
"stxAreHere": {
"message": "Οι Έξυπνες Συναλλαγές είναι εδώ!"
},
"stxBenefit1": {
"message": "Ελαχιστοποίηση του κόστους συναλλαγής"
},
@ -3477,15 +3427,6 @@
"stxCancelledSubDescription": {
"message": "Προσπαθήστε ξανά να κάνετε ανταλλαγή. Θα είμαστε εδώ για να σας προστατεύσουμε από παρόμοιους κινδύνους και την επόμενη φορά."
},
"stxDescription": {
"message": "Οι Ανταλλαγές MetaMask μόλις έγιναν πολύ πιο έξυπνες! Η ενεργοποίηση των Έξυπνων Συναλλαγών θα επιτρέψει στο MetaMask να βελτιώσει προγραμματικά τις Ανταλλαγές σας ώστε να απολαμβάνετε:"
},
"stxErrorNotEnoughFunds": {
"message": "Δεν υπάρχουν αρκετοί πόροι για αυτή την έξυπνη συναλλαγή."
},
"stxErrorUnavailable": {
"message": "Οι Έξυπνες Συναλλαγές είναι προσωρινά μη διαθέσιμες."
},
"stxFailure": {
"message": "Η Ανταλλαγή απέτυχε"
},
@ -3499,9 +3440,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "Δημόσια υποβολή της Ανταλλαγής σας..."
},
"stxSubDescription": {
"message": "* Οι Έξυπνες Συναλλαγές θα προσπαθήσουν να υποβάλουν τη συναλλαγή σας ιδιωτικά, πολλές φορές. Εάν όλες οι προσπάθειες αποτύχουν, η συναλλαγή θα μεταδοθεί δημόσια για να διασφαλιστεί η επιτυχής πραγματοποίηση της ανταλλαγής σας."
},
"stxSuccess": {
"message": "Η ανταλλαγή ολοκληρώθηκε!"
},
@ -3920,10 +3858,6 @@
"toggleEthSignField": {
"message": "Εναλλαγή αιτημάτων eth_sign"
},
"toggleTestNetworks": {
"message": "$1 δοκιμαστικά δίκτυα",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Διακριτικό"
},
@ -4090,9 +4024,6 @@
"transfer": {
"message": "Μεταφορά"
},
"transferBetweenAccounts": {
"message": "Μεταφορά μεταξύ λογαριασμών μου"
},
"transferFrom": {
"message": "Μεταφορά Από"
},
@ -4103,10 +4034,6 @@
"troubleStarting": {
"message": "Το MetaMask αντιμετώπισε πρόβλημα κατά την εκκίνηση. Αυτό το σφάλμα μπορεί να είναι τυχαίο, γι' αυτό προσπαθήστε να επανεκκινήσετε την επέκταση."
},
"troubleTokenBalances": {
"message": "Είχαμε πρόβλημα να φορτώσουμε τα υπόλοιπα του διακριτικού σας. Μπορείτε να τα δείτε ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "Χορηγώντας άδεια, επιτρέπετε στα ακόλουθα $1 να έχουν πρόσβαση στα χρήματά σας"
},

View File

@ -204,10 +204,6 @@
"addCustomToken": {
"message": "Add custom token"
},
"addCustomTokenByContractAddress": {
"message": "Cant find a token? You can manually add any token by pasting its address. Token contract addresses can be found on $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "This will allow this network to be used within MetaMask."
},
@ -269,12 +265,25 @@
"addNewToken": {
"message": "Add new token"
},
"addNft": {
"message": "Add NFT"
},
"addNfts": {
"message": "Add NFTs"
},
"addSuggestedNFTs": {
"message": "Add suggested NFTs"
},
"addSuggestedTokens": {
"message": "Add suggested tokens"
},
"addToken": {
"message": "Add token"
},
"addTokenByContractAddress": {
"message": "Cant find a token? You can manually add any token by pasting its address. Token contract addresses can be found on $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addingCustomNetwork": {
"message": "Adding Network"
},
@ -306,7 +315,7 @@
"message": "Priority fee (aka “miner tip”) goes directly to miners and incentivizes them to prioritize your transaction."
},
"agreeTermsOfUse": {
"message": "I agree to Metamask's $1",
"message": "I agree to MetaMask's $1",
"description": "$1 is the `terms` link"
},
"airgapVault": {
@ -398,12 +407,6 @@
"message": "Allow access to and transfer all of your NFTs from $1?",
"description": "$1 a link to contract on the block explorer when we're not able to retrieve a erc721 or erc1155 name"
},
"approveAndInstall": {
"message": "Approve & install"
},
"approveAndUpdate": {
"message": "Approve & update"
},
"approveButtonText": {
"message": "Approve"
},
@ -444,6 +447,10 @@
"attemptSendingAssets": {
"message": "If you attempt to send assets directly from one network to another, this may result in permanent asset loss. Make sure to use a bridge."
},
"attemptToCancelSwap": {
"message": "Attempt to cancel swap for ~$1",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Swap"
},
"attemptingConnect": {
"message": "Attempting to connect to blockchain."
},
@ -475,9 +482,6 @@
"back": {
"message": "Back"
},
"backToAll": {
"message": "Back to all"
},
"backup": {
"message": "Backup"
},
@ -609,13 +613,6 @@
"message": "To $1 a transaction the gas fee must be increased by at least 10% for it to be recognized by the network.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "Cancel swap for ~$1",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Cancel swap for free"
},
"cancelled": {
"message": "Cancelled"
},
@ -654,6 +651,9 @@
"clearActivityDescription": {
"message": "This resets the account's nonce and erases data from the activity tab in your wallet. Only the current account and network will be affected. Your balances and incoming transactions won't change."
},
"click": {
"message": "Click"
},
"clickToConnectLedgerViaWebHID": {
"message": "Click here to connect your Ledger via WebHID",
"description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid"
@ -742,12 +742,13 @@
"connectCustodialAccountTitle": {
"message": "Custodial Accounts"
},
"connectHardwareWallet": {
"message": "Connect hardware wallet"
},
"connectManually": {
"message": "Manually connect to current site"
},
"connectSnap": {
"message": "Connect $1",
"description": "$1 is the snap for which a connection is being requested."
},
"connectTo": {
"message": "Connect to $1",
"description": "$1 is the name/origin of a web3 site/application that the user can connect to metamask"
@ -801,9 +802,12 @@
"connectingToGoerli": {
"message": "Connecting to Goerli test network"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Connecting to Linea Goerli test network"
},
"connectingToLineaMainnet": {
"message": "Connecting to Linea Mainnet"
},
"connectingToMainnet": {
"message": "Connecting to Ethereum Mainnet"
},
@ -813,6 +817,16 @@
"connectionError": {
"message": "Connection error"
},
"connectionFailed": {
"message": "Connection failed"
},
"connectionFailedDescription": {
"message": "Fetching of $1 failed, check your network and try again.",
"description": "$1 is the name of the snap being fetched."
},
"connectionRequest": {
"message": "Connection request"
},
"contactUs": {
"message": "Contact us"
},
@ -892,9 +906,6 @@
"create": {
"message": "Create"
},
"createAccount": {
"message": "Create account"
},
"createNewWallet": {
"message": "Create a new wallet"
},
@ -1033,6 +1044,12 @@
"message": "$1 has suggested this price.",
"description": "$1 is url for the dapp that has suggested gas settings"
},
"dappSuggestedHigh": {
"message": "Site suggested"
},
"dappSuggestedHighShortLabel": {
"message": "Site (high)"
},
"dappSuggestedShortLabel": {
"message": "Site"
},
@ -1370,8 +1387,8 @@
"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."
},
"enableSmartTransactions": {
"message": "Enable smart transactions"
"enableSmartSwaps": {
"message": "Enable smart swaps"
},
"enableSnap": {
"message": "Enable"
@ -1380,6 +1397,9 @@
"message": "enable $1",
"description": "$1 is a token symbol, e.g. ETH"
},
"enabled": {
"message": "Enabled"
},
"encryptionPublicKeyNotice": {
"message": "$1 would like your public encryption key. By consenting, this site will be able to compose encrypted messages to you.",
"description": "$1 is the web3 site name"
@ -1427,6 +1447,9 @@
"enterPasswordContinue": {
"message": "Enter password to continue"
},
"enterTokenNameOrAddress": {
"message": "Enter token name or paste address"
},
"enterYourPassword": {
"message": "Enter your password"
},
@ -1791,7 +1814,9 @@
"message": "full access to your wallet and funds.",
"description": "Is the bolded text in 'holdToRevealContentPrivateKey2'"
},
"holdToRevealLockedLabel": { "message": "hold to reveal circle locked" },
"holdToRevealLockedLabel": {
"message": "hold to reveal circle locked"
},
"holdToRevealPrivateKey": {
"message": "Hold to reveal Private Key"
},
@ -1804,7 +1829,9 @@
"holdToRevealSRPTitle": {
"message": "Keep your SRP safe"
},
"holdToRevealUnlockedLabel": { "message": "hold to reveal circle unlocked" },
"holdToRevealUnlockedLabel": {
"message": "hold to reveal circle unlocked"
},
"id": {
"message": "Id"
},
@ -1872,9 +1899,6 @@
"importTokenWarning": {
"message": "Anyone can create a token with any name, including fake versions of existing tokens. Add and trade at your own risk!"
},
"importTokens": {
"message": "import tokens"
},
"importTokensCamelCase": {
"message": "Import tokens"
},
@ -2114,9 +2138,12 @@
"likeToImportTokens": {
"message": "Would you like to import these tokens?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli test network"
},
"lineaMainnet": {
"message": "Linea Mainnet"
},
"link": {
"message": "Link"
},
@ -2255,9 +2282,6 @@
"missingSettingRequest": {
"message": "Request here"
},
"missingToken": {
"message": "Don't see your token?"
},
"mmiAddToken": {
"message": "The page at $1 would like to authorise the following custodian token in MetaMask Institutional"
},
@ -2270,12 +2294,13 @@
"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."
},
"mustSelectOne": {
"message": "Must select at least 1 token."
},
"myAccounts": {
"message": "My accounts"
},
"name": {
"message": "Name"
},
@ -2522,6 +2547,9 @@
"notCurrentAccount": {
"message": "Is this the correct account? It's different from the currently selected account in your wallet"
},
"notEnoughBalance": {
"message": "Insufficient balance"
},
"notEnoughGas": {
"message": "Not enough gas"
},
@ -2648,6 +2676,16 @@
"message": "Ledger and Firefox Users Experiencing Connection Issues",
"description": "Title for a notification in the 'See What's New' popup. Tells users that latest firefox users using U2F may experience connection issues."
},
"notifications21ActionText": {
"message": "Try it out"
},
"notifications21Description": {
"message": "We've updated Swaps in the MetaMask extension to be easier and faster to use.",
"description": "Description of a notification in the 'See What's New' popup. Describes NFT autodetection feature."
},
"notifications21Title": {
"message": "Introducing new and refreshed Swaps!"
},
"notifications3ActionText": {
"message": "Read more",
"description": "The 'call to action' on the button, or link, of the 'Stay secure' notification. Upon clicking, users will be taken to a page about security on the metamask support website."
@ -2991,6 +3029,9 @@
"message": "You have (1) pending transaction.",
"description": "$1 is count of pending transactions"
},
"percentage": {
"message": "$1%"
},
"permissionRequest": {
"message": "Permission request"
},
@ -3248,6 +3289,9 @@
"queued": {
"message": "Queued"
},
"quoteRate": {
"message": "Quote rate"
},
"reAddAccounts": {
"message": "re-add any other accounts"
},
@ -3260,11 +3304,8 @@
"receive": {
"message": "Receive"
},
"recents": {
"message": "Recents"
},
"recipientAddressPlaceholder": {
"message": "Search, public address (0x), or ENS"
"message": "Enter public address (0x) or ENS name"
},
"recommendedGasLabel": {
"message": "Recommended"
@ -3360,9 +3401,6 @@
"reportLastRunTooltip": {
"message": "The date and time of when the last AML/CFT report was run"
},
"requestFailed": {
"message": "Request failed"
},
"requestFlaggedAsMaliciousFallbackCopyReason": {
"message": "The security provider has not shared additional details"
},
@ -3708,9 +3746,6 @@
"showHexDataDescription": {
"message": "Select this to show the hex data field on the send screen"
},
"showHide": {
"message": "Show/hide"
},
"showIncomingTransactions": {
"message": "Show incoming transactions"
},
@ -3772,8 +3807,27 @@
"skipAccountSecurityDetails": {
"message": "I understand that until I back up my Secret Recovery Phrase, I may lose my accounts and all of their assets."
},
"smartTransaction": {
"message": "Smart transaction"
"smartSwap": {
"message": "Smart swap"
},
"smartSwapsAreHere": {
"message": "Smart Swaps are here!"
},
"smartSwapsDescription": {
"message": "MetaMask Swaps just got a whole lot smarter! Enabling Smart Swaps will allow MetaMask to programmatically optimize your Swap to help:"
},
"smartSwapsErrorNotEnoughFunds": {
"message": "Not enough funds for a smart swap."
},
"smartSwapsErrorUnavailable": {
"message": "Smart Swaps are temporarily unavailable."
},
"smartSwapsSubDescription": {
"message": "* Smart Swaps will attempt to submit your transaction privately, multiple times. If all attempts fail, the transaction will be broadcast publicly to ensure your Swap successfully goes through."
},
"snapConnectionWarning": {
"message": "$1 wants to connect to $2. Only continue if you trust this website.",
"description": "$2 is the snap and $1 is the dapp requesting connection to the snap."
},
"snapContent": {
"message": "This content is coming from $1",
@ -3787,30 +3841,39 @@
"message": "Install snap"
},
"snapInstallRequest": {
"message": "$1 wants to install $2. Make sure you trust the authors before you proceed.",
"description": "$1 is the dApp origin requesting the snap and $2 is the snap name"
"message": "Installing $1 gives it the following permissions. Only continue if you trust $1.",
"description": "$1 is the snap name."
},
"snapInstallRequestsPermission": {
"message": "$1 wants to install $2, which is requesting the following permissions. Make sure you trust the authors before you proceed.",
"description": "$1 is the dApp origin requesting the snap and $2 is the snap name"
"snapInstallSuccess": {
"message": "Installation complete"
},
"snapInstallWarningCheck": {
"message": "Ensure that the permission below aligns with your intended actions. Only proceed with authors you trust."
"message": "Take a moment to review the permission being requested. Only continue if you trust $1.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "Ensure that the permissions below align with your intended actions. Only proceed with authors you trust."
"message": "Take a moment to review the permissions being requested. Only continue if you trust $1.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningHeading": {
"message": "Proceed with caution"
},
"snapInstallWarningKeyAccess": {
"message": "Grant $2 account control to $1",
"message": "Give $2 account control to $1",
"description": "The first parameter is the name of the snap and the second one is the protocol"
},
"snapInstallWarningPublicKeyAccess": {
"message": "Grant $2 public key access to $1",
"message": "Give $2 public key access to $1",
"description": "The first parameter is the name of the snap and the second one is the protocol"
},
"snapInstallationErrorDescription": {
"message": "$1 couldnt be installed.",
"description": "Error description used when snap installation fails. $1 is the snap name."
},
"snapInstallationErrorTitle": {
"message": "Installation failed",
"description": "Error title used when snap installation fails."
},
"snapResultError": {
"message": "Error"
},
@ -3818,18 +3881,25 @@
"message": "Success"
},
"snapResultSuccessDescription": {
"message": "$1 is now available to use."
"message": "$1 is ready to use"
},
"snapUpdate": {
"message": "Update snap"
},
"snapUpdateRequest": {
"message": "$1 wants to update $2. Make sure you trust the authors before you proceed.",
"description": "$1 is the dApp origin requesting the snap and $2 is the snap name"
"snapUpdateErrorDescription": {
"message": "$1 couldnt be updated.",
"description": "Error description used when snap update fails. $1 is the snap name."
},
"snapUpdateRequestsPermission": {
"message": "$1 wants to update $2, which is requesting the following permissions. Make sure you trust the authors before you proceed.",
"description": "$1 is the dApp origin requesting the snap and $2 is the snap name"
"snapUpdateErrorTitle": {
"message": "Update failed",
"description": "Error title used when snap update fails."
},
"snapUpdateRequest": {
"message": "$1 wants to update $2 to $3 which gives it the following permissions. Only continue if you trust $2.",
"description": "$1 is the dApp origin requesting the snap, $2 is the snap name and $3 is the snap version."
},
"snapUpdateSuccess": {
"message": "Update complete"
},
"snaps": {
"message": "Snaps"
@ -3843,9 +3913,24 @@
"snapsNoInsight": {
"message": "The snap didn't return any insight"
},
"snapsPrivacyWarningFirstMessage": {
"message": "You acknowledge that the snap that you are about to install is a Third Party Service as defined in the Consensys $1. Your use of Third Party Services is governed by separate terms and conditions set forth by the Third Party Service provider. You access, rely upon or use the Third Party Service at your own risk. Consensys disclaims all responsibility and liability for any losses on account of your use of Third Party Services.",
"description": "First part of a message in popup modal displayed when installing a snap for the first time. $1 is terms of use link."
},
"snapsPrivacyWarningSecondMessage": {
"message": "Any information you share with Third Party Services will be collected directly by those Third Party Services in accordance with their privacy policies. Please refer to their privacy policies for more information.",
"description": "Second part of a message in popup modal displayed when installing a snap for the first time."
},
"snapsPrivacyWarningThirdMessage": {
"message": "Consensys has no access to information you share with these third parties.",
"description": "Third part of a message in popup modal displayed when installing a snap for the first time."
},
"snapsSettingsDescription": {
"message": "Manage your Snaps"
},
"snapsTermsOfUse": {
"message": "Terms of Use"
},
"snapsToggle": {
"message": "A snap will only run if it is enabled"
},
@ -3957,9 +4042,6 @@
"status": {
"message": "Status"
},
"statusConnected": {
"message": "Connected"
},
"statusNotConnected": {
"message": "Not connected"
},
@ -4000,9 +4082,6 @@
"strong": {
"message": "Strong"
},
"stxAreHere": {
"message": "Smart Transactions are here!"
},
"stxBenefit1": {
"message": "Minimize transaction costs"
},
@ -4024,15 +4103,6 @@
"stxCancelledSubDescription": {
"message": "Try your swap again. Well be here to protect you against similar risks next time."
},
"stxDescription": {
"message": "MetaMask Swaps just got a whole lot smarter! Enabling Smart Transactions will allow MetaMask to programmatically optimize your Swap to help:"
},
"stxErrorNotEnoughFunds": {
"message": "Not enough funds for a smart transaction."
},
"stxErrorUnavailable": {
"message": "Smart Transactions are temporarily unavailable."
},
"stxFailure": {
"message": "Swap failed"
},
@ -4046,9 +4116,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "Publicly submitting your Swap..."
},
"stxSubDescription": {
"message": "* Smart Transactions will attempt to submit your transaction privately, multiple times. If all attempts fail, the transaction will be broadcast publicly to ensure your Swap successfully goes through."
},
"stxSuccess": {
"message": "Swap complete!"
},
@ -4109,6 +4176,9 @@
"swapAmountReceivedInfo": {
"message": "This is the minimum amount you will receive. You may receive more depending on slippage."
},
"swapAnyway": {
"message": "Swap anyway"
},
"swapApproval": {
"message": "Approve $1 for swaps",
"description": "Used in the transaction display list to describe a transaction that is an approve call on a token that is to be swapped.. $1 is the symbol of a token that has been approved."
@ -4117,6 +4187,12 @@
"message": "You need $1 more $2 to complete this swap",
"description": "Tells the user how many more of a given token they need for a specific swap. $1 is an amount of tokens and $2 is the token symbol."
},
"swapAreYouStillThere": {
"message": "Are you still there?"
},
"swapAreYouStillThereDescription": {
"message": "Were ready to show you the latest quotes when you want to continue"
},
"swapBuildQuotePlaceHolderText": {
"message": "No tokens available matching $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
@ -4124,6 +4200,9 @@
"swapConfirmWithHwWallet": {
"message": "Confirm with your hardware wallet"
},
"swapContinueSwapping": {
"message": "Continue swapping"
},
"swapContractDataDisabledErrorDescription": {
"message": "In the Ethereum app on your Ledger, go to \"Settings\" and allow contract data. Then, try your swap again."
},
@ -4142,6 +4221,9 @@
"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."
@ -4150,6 +4232,9 @@
"message": "This will $1 for swapping",
"description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'"
},
"swapEnterAmount": {
"message": "Enter an amount"
},
"swapEstimatedNetworkFees": {
"message": "Estimated network fees"
},
@ -4163,6 +4248,9 @@
"swapFailedErrorTitle": {
"message": "Swap failed"
},
"swapFetchingQuote": {
"message": "Fetching quote"
},
"swapFetchingQuoteNofN": {
"message": "Fetching quote $1 of $2",
"description": "A count of possible quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of resources that we check for quotes. Keep in mind that not all resources will have a quote for a particular swap."
@ -4203,6 +4291,9 @@
"message": "Includes a $1% MetaMask fee.",
"description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number."
},
"swapLearnMore": {
"message": "Learn more about Swaps"
},
"swapLowSlippageError": {
"message": "Transaction may fail, max slippage too low."
},
@ -4224,6 +4315,10 @@
"message": "New quotes in $1",
"description": "Tells the user the amount of time until the currently displayed quotes are update. $1 is a time that is counting down from 1:00 to 0:00"
},
"swapNoTokensAvailable": {
"message": "No tokens available matching $1",
"description": "Tells the user that a given search string does not match any tokens in our token lists. $1 can be any string of text"
},
"swapOnceTransactionHasProcess": {
"message": "Your $1 will be added to your account once this transaction has processed.",
"description": "This message communicates the token that is being transferred. It is shown on the awaiting swap screen. The $1 will be a token symbol."
@ -4251,6 +4346,10 @@
"swapQuoteDetails": {
"message": "Quote details"
},
"swapQuoteNofM": {
"message": "$1 of $2",
"description": "A count of possible quotes shown to the user while they are waiting for quotes to be fetched. $1 is the number of quotes already loaded, and $2 is the total number of resources that we check for quotes. Keep in mind that not all resources will have a quote for a particular swap."
},
"swapQuoteSource": {
"message": "Quote source"
},
@ -4260,6 +4359,9 @@
"swapQuotesExpiredErrorTitle": {
"message": "Quotes timeout"
},
"swapQuotesNotAvailableDescription": {
"message": "Reduce the size of your trade or use a different token."
},
"swapQuotesNotAvailableErrorDescription": {
"message": "Try adjusting the amount or slippage settings and try again."
},
@ -4296,16 +4398,52 @@
"swapSelectQuotePopoverDescription": {
"message": "Below are all the quotes gathered from multiple liquidity sources."
},
"swapSelectToken": {
"message": "Select token"
},
"swapShowLatestQuotes": {
"message": "Show latest quotes"
},
"swapSlippageNegative": {
"message": "Slippage must be greater or equal to zero"
},
"swapSlippageNegativeDescription": {
"message": "Slippage must be greater or equal to zero"
},
"swapSlippageNegativeTitle": {
"message": "Increase slippage to continue"
},
"swapSlippageOverLimitDescription": {
"message": "Slippage tolerance must be 15% or less. Anything higher will result in a bad rate."
},
"swapSlippageOverLimitTitle": {
"message": "Reduce slippage to continue"
},
"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."
},
"swapSlippageZeroTitle": {
"message": "Sourcing zero-slippage providers"
},
"swapSource": {
"message": "Liquidity source"
},
@ -4322,7 +4460,7 @@
"message": "Swap from"
},
"swapSwapSwitch": {
"message": "Switch from and to tokens"
"message": "Switch token order"
},
"swapSwapTo": {
"message": "Swap to"
@ -4330,6 +4468,13 @@
"swapToConfirmWithHwWallet": {
"message": "to confirm with your hardware wallet"
},
"swapTokenAddedManuallyDescription": {
"message": "Verify this token on $1 and make sure it is the token you want to trade.",
"description": "$1 points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"swapTokenAddedManuallyTitle": {
"message": "Token added manually"
},
"swapTokenAvailable": {
"message": "Your $1 has been added to your account.",
"description": "This message is shown after a swap is successful and communicates the exact amount of tokens the user has received for a swap. The $1 is a decimal number of tokens followed by the token symbol."
@ -4356,6 +4501,13 @@
"message": "Verified on $1 sources.",
"description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number."
},
"swapTokenVerifiedOn1SourceDescription": {
"message": "$1 is only verified on 1 source. Consider verifying it on $2 before proceeding.",
"description": "$1 is a token name, $2 points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\""
},
"swapTokenVerifiedOn1SourceTitle": {
"message": "Potentially inauthentic token"
},
"swapTooManyDecimalsError": {
"message": "$1 allows up to $2 decimals",
"description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token"
@ -4393,9 +4545,16 @@
"message": "Not enough $1 to complete this transaction",
"description": "Tells the user that they don't have enough of a token for a proposed swap. $1 is a token symbol"
},
"swapsNotEnoughToken": {
"message": "Not enough $1",
"description": "Tells the user that they don't have enough of a token for a proposed swap. $1 is a token symbol"
},
"swapsViewInActivity": {
"message": "View in activity"
},
"switch": {
"message": "Switch"
},
"switchEthereumChainConfirmationDescription": {
"message": "This will switch the selected network within MetaMask to a previously added network:"
},
@ -4466,6 +4625,10 @@
"thingsToKeep": {
"message": "Things to keep in mind:"
},
"thirdPartySoftware": {
"message": "Third-party software notice",
"description": "Title of a popup modal displayed when installing a snap for the first time."
},
"thisCollection": {
"message": "this collection"
},
@ -4525,10 +4688,6 @@
"toggleEthSignOn": {
"message": "ON (Not recommended)"
},
"toggleTestNetworks": {
"message": "$1 test networks",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Token"
},
@ -4698,6 +4857,9 @@
"transactionSecurityCheckDescription": {
"message": "We use third-party APIs to detect and display risks involved in unsigned transaction and signature requests before you sign them. These services will have access to your unsigned transaction and signature requests, your account address, and your preferred language."
},
"transactionSettings": {
"message": "Transaction settings"
},
"transactionSubmitted": {
"message": "Transaction submitted with estimated gas fee of $1 at $2."
},
@ -4710,9 +4872,6 @@
"transfer": {
"message": "Transfer"
},
"transferBetweenAccounts": {
"message": "Transfer between my accounts"
},
"transferFrom": {
"message": "Transfer from"
},
@ -4739,10 +4898,6 @@
"troubleStarting": {
"message": "MetaMask had trouble starting. This error could be intermittent, so try restarting the extension."
},
"troubleTokenBalances": {
"message": "We had trouble loading your token balances. You can view them ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "By granting permission, you are allowing the following $1 to access your funds"
},
@ -4965,6 +5120,10 @@
"wantToAddThisNetwork": {
"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"
},
"warning": {
"message": "Warning"
},
@ -5036,6 +5195,9 @@
"youSign": {
"message": "You are signing"
},
"yourAccounts": {
"message": "Your accounts"
},
"yourFundsMayBeAtRisk": {
"message": "Your funds may be at risk"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "Añadir token personalizado"
},
"addCustomTokenByContractAddress": {
"message": "¿No encuentra un token? Puede agregar cualquier token si copia su dirección. Puede encontrar la dirección de contrato del token en $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Esto permitirá que la red se utilice en MetaMask."
},
@ -263,6 +259,10 @@
"addToken": {
"message": "Agregar token"
},
"addTokenByContractAddress": {
"message": "¿No encuentra un token? Puede agregar cualquier token si copia su dirección. Puede encontrar la dirección de contrato del token en $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Dirección"
},
@ -359,12 +359,6 @@
"message": "¿Dar permiso para acceder a todo su $1?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "Aprobar e instalar"
},
"approveAndUpdate": {
"message": "Aprobar y actualizar"
},
"approveButtonText": {
"message": "Aprobar"
},
@ -429,9 +423,6 @@
"back": {
"message": "Volver"
},
"backToAll": {
"message": "Volver a Todos"
},
"backup": {
"message": "Respaldo"
},
@ -557,13 +548,6 @@
"message": "Para $1 una transacción, la tarifa de gas debe aumentar al menos un 10% para que sea reconocida por la red.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "Cancelar el swap por ~$1",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Cancelar el swap gratuitamente"
},
"cancelled": {
"message": "Cancelado"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "Conectar cuenta o crear nueva"
},
"connectHardwareWallet": {
"message": "Conectar la cartera de hardware"
},
"connectManually": {
"message": "Conectarse manualmente al sitio actual"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Estableciendo conexión a la red de prueba Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Conectando a la red de prueba Linea Goerli"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "Crear"
},
"createAccount": {
"message": "Crear cuenta"
},
"createNewWallet": {
"message": "Crear una cartera nueva"
},
@ -1215,9 +1193,6 @@
"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."
},
"enableSmartTransactions": {
"message": "Habilitar transacciones inteligentes"
},
"enableToken": {
"message": "activar $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "Toda persona puede crear un token con cualquier nombre, incluso versiones falsas de tokens existentes. ¡Agréguelo y realice transacciones bajo su propio riesgo!"
},
"importTokens": {
"message": "agregar activo"
},
"importTokensCamelCase": {
"message": "Importar tokens"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "¿Le gustaría agregar estos tokens?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Red de prueba Linea Goerli"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "Solicítelo aquí"
},
"missingToken": {
"message": "¿No ve su token?"
},
"moreComingSoon": {
"message": "Más próximamente..."
},
"mustSelectOne": {
"message": "Debe seleccionar al menos 1 token."
},
"myAccounts": {
"message": "Mis cuentas"
},
"name": {
"message": "Nombre"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "No hay gas suficiente"
},
"notifications": {
"message": "Notificaciones"
},
"notifications10ActionText": {
"message": "Ir a configuración",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2817,9 +2780,6 @@
"receive": {
"message": "Recibir"
},
"recents": {
"message": "Recientes"
},
"recipientAddressPlaceholder": {
"message": "Búsqueda, dirección pública (0x) o ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "Seleccione esta opción para mostrar el campo de datos hexadecimales en la pantalla de envío"
},
"showHide": {
"message": "Mostrar/ocultar"
},
"showIncomingTransactions": {
"message": "Mostrar transacciones entrantes"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "Entiendo que hasta que no haga una copia de seguridad de mi frase secreta de recuperación, puedo perder mis cuentas y todos los activos asociados."
},
"smartTransaction": {
"message": "Transacción inteligente"
},
"snapContent": {
"message": "Este contenido proviene de $1",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "Instalar complemento"
},
"snapInstallWarningCheck": {
"message": "Para confirmar que comprende, verifique la casilla."
"message": "Para confirmar que comprende, verifique la casilla.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "Para confirmar que comprende, marque todas las casillas."
"message": "Para confirmar que comprende, marque todas las casillas.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "Está otorgando acceso clave de $2 al complemento \"$1\". Esto es irrevocable y le otorga a \"$1\" el control de sus cuentas y activos de $2. Asegúrese de que confía en \"$1\" antes de continuar.",
@ -3416,9 +3372,6 @@
"status": {
"message": "Estado"
},
"statusConnected": {
"message": "Conectado"
},
"statusNotConnected": {
"message": "No conectado"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "Fuerte"
},
"stxAreHere": {
"message": "¡Las transacciones inteligentes están aquí!"
},
"stxBenefit1": {
"message": "Minimizar los costos de transacción"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "Intente su swap nuevamente. Estaremos aquí para protegerlo contra riesgos similares la próxima vez."
},
"stxDescription": {
"message": "¡MetaMask Swaps ahora es mucho más inteligente! Habilitar transacciones inteligentes permitirá que MetaMask optimice mediante programación su swap para ayudar:"
},
"stxErrorNotEnoughFunds": {
"message": "No hay suficientes fondos para una transacción inteligente."
},
"stxErrorUnavailable": {
"message": "Las transacciones inteligentes no están disponibles temporalmente."
},
"stxFailure": {
"message": "Error al canjear"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "Enviando su swap de forma pública..."
},
"stxSubDescription": {
"message": "* Transacciones inteligentes intentará enviar su transacción de forma privada varias veces. Si todos los intentos fallan, la transacción se transmitirá públicamente para garantizar que su swap se realice con éxito."
},
"stxSuccess": {
"message": "¡Swap finalizado!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "Alternar solicitudes de eth_sign"
},
"toggleTestNetworks": {
"message": "$1 redes de prueba",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Token"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "Transferir"
},
"transferBetweenAccounts": {
"message": "Transferir entre mis cuentas"
},
"transferFrom": {
"message": "Transferir desde"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "MetaMask tuvo problemas para iniciar. Este error podría ser intermitente, así que intente reiniciar la extensión."
},
"troubleTokenBalances": {
"message": "Tuvimos problemas al cargar los saldos de token. Puede verlos ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "Al conceder el permiso, usted permite que los siguientes $1 tengan acceso a sus fondos"
},

View File

@ -103,10 +103,6 @@
"addCustomToken": {
"message": "Añadir token personalizado"
},
"addCustomTokenByContractAddress": {
"message": "¿No encuentra un token? Para agregar un token, copie su dirección. Puede encontrar la dirección de contrato del token en $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Esto permitirá que la red se utilice en MetaMask."
},
@ -139,6 +135,10 @@
"addToken": {
"message": "Agregar token"
},
"addTokenByContractAddress": {
"message": "¿No encuentra un token? Para agregar un token, copie su dirección. Puede encontrar la dirección de contrato del token en $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Dirección"
},
@ -250,9 +250,6 @@
"back": {
"message": "Volver"
},
"backToAll": {
"message": "Volver a Todos"
},
"backupApprovalInfo": {
"message": "Este código secreto es necesario para que recupere la cartera en caso de que pierda el dispositivo, olvide su contraseña, tenga que volver a instalar MetaMask o quiera acceder a la cartera en otro dispositivo."
},
@ -389,9 +386,6 @@
"connectAccountOrCreate": {
"message": "Conectar cuenta o crear nueva"
},
"connectHardwareWallet": {
"message": "Conectar la cartera de hardware"
},
"connectManually": {
"message": "Conectarse manualmente al sitio actual"
},
@ -448,7 +442,7 @@
"connectingToGoerli": {
"message": "Estableciendo conexión a la red de prueba Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Estableciendo conexión a la red de prueba Linea Goerli"
},
"connectingToMainnet": {
@ -499,9 +493,6 @@
"create": {
"message": "Crear"
},
"createAccount": {
"message": "Crear cuenta"
},
"createNewWallet": {
"message": "Crear una nueva cartera"
},
@ -1091,9 +1082,6 @@
"importTokenWarning": {
"message": "Toda persona puede crear un token con cualquier nombre, incluso versiones falsas de tokens existentes. ¡Agréguelo y realice transacciones bajo su propio riesgo!"
},
"importTokens": {
"message": "importar tokens"
},
"importTokensCamelCase": {
"message": "Importar tokens"
},
@ -1257,7 +1245,7 @@
"likeToImportTokens": {
"message": "¿Quiere agregar estos tokens?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Red de prueba Linea Goerli"
},
"link": {
@ -1351,15 +1339,9 @@
"missingNFT": {
"message": "¿No ve su NFT?"
},
"missingToken": {
"message": "¿No ve su token?"
},
"mustSelectOne": {
"message": "Debe seleccionar al menos 1 token."
},
"myAccounts": {
"message": "Mis cuentas"
},
"name": {
"message": "Nombre"
},
@ -1812,9 +1794,6 @@
"receive": {
"message": "Recibir"
},
"recents": {
"message": "Recientes"
},
"recipientAddressPlaceholder": {
"message": "Búsqueda, dirección pública (0x) o ENS"
},
@ -2064,9 +2043,6 @@
"showHexDataDescription": {
"message": "Seleccione esta opción para mostrar el campo de datos hexadecimales en la pantalla de envío"
},
"showHide": {
"message": "Mostrar/ocultar"
},
"showIncomingTransactions": {
"message": "Mostrar transacciones entrantes"
},
@ -2168,9 +2144,6 @@
"stateLogsDescription": {
"message": "Los registros de estado contienen sus direcciones de cuentas públicas y las transacciones enviadas."
},
"statusConnected": {
"message": "Conectado"
},
"statusNotConnected": {
"message": "No conectado"
},
@ -2549,10 +2522,6 @@
"message": "Para: $1",
"description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress"
},
"toggleTestNetworks": {
"message": "$1 redes de prueba",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Token"
},
@ -2682,9 +2651,6 @@
"transfer": {
"message": "Transferir"
},
"transferBetweenAccounts": {
"message": "Transferir entre mis cuentas"
},
"transferFrom": {
"message": "Transferir desde"
},
@ -2692,10 +2658,6 @@
"message": "Tuvimos problemas al conectar su $1. Pruebe revisar $2 e inténtelo de nuevo.",
"description": "$1 is the wallet device name; $2 is a link to wallet connection guide"
},
"troubleTokenBalances": {
"message": "Tuvimos problemas al cargar los saldos de token. Puede verlos ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "Al conceder el permiso, usted permite que los siguientes $1 tengan acceso a sus fondos"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Tagasi"
},
"backToAll": {
"message": "Tagasi kõigile"
},
"backupApprovalInfo": {
"message": "See salakood on vajalik teie rahakoti taastamiseks, kui kaotate oma seadme, unustate parooli, peate MetaMaski uuesti alla laadima, või kui soovite avada oma rahakoti mõnel teisel seadmel."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Ühendamine"
},
"connectHardwareWallet": {
"message": "Ühendage riistvara rahakott"
},
"connectingTo": {
"message": "Ühenduse loomine $1"
},
"connectingToGoerli": {
"message": "Ühendamine Goerli testvõrguga"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Ühendamine Linea Goerli testvõrguga"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Loo"
},
"createAccount": {
"message": "Loo konto"
},
"createPassword": {
"message": "Loo parool"
},
@ -411,7 +402,7 @@
"likeToImportTokens": {
"message": "Kas soovite need load lisada?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli testvõrk"
},
"links": {
@ -444,9 +435,6 @@
"mustSelectOne": {
"message": "Peate valima vähemalt 1 loa."
},
"myAccounts": {
"message": "Minu kontod"
},
"needImportFile": {
"message": "Peate importimiseks faili valima.",
"description": "User is important an account and needs to add a file to continue"
@ -571,9 +559,6 @@
"readdToken": {
"message": "Saate selle loa tulevikus tagasi lisada, kui lähete oma kontovalikute menüüs vahelehele „Lisa luba“."
},
"recents": {
"message": "Hiljutised"
},
"recipientAddressPlaceholder": {
"message": "Otsing, avalik aadress (0x) või ENS"
},
@ -797,16 +782,9 @@
"transfer": {
"message": "Ülekandmine"
},
"transferBetweenAccounts": {
"message": "Ülekandmine minu kontode vahel"
},
"transferFrom": {
"message": "Ülekandmine asukohast"
},
"troubleTokenBalances": {
"message": "Teie loasaldode laadimisega oli probleem. Saate neid vaadata",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Proovi uuesti"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "بازگشت"
},
"backToAll": {
"message": "برگشت به همه"
},
"backupApprovalInfo": {
"message": "در صورت مفقود شدن دستگاه، فراموش شدن رمز عبور، لزوم نصب-دوباره MetaMask، یا اقدام دسترسی به کیف تان از دستگاه دیگر، کود مخفی جهت بازیابی کیف تان، لازم خواهد بود."
},
@ -154,16 +151,13 @@
"connect": {
"message": "اتصال"
},
"connectHardwareWallet": {
"message": "اتصال کیف سخت افزار"
},
"connectingTo": {
"message": "در حال اتصال به 1$1"
},
"connectingToGoerli": {
"message": "در حال اتصال به شبکه آزمایشی Goerli "
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "در حال اتصال به شبکه آزمایشی Linea Goerli"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "ایجاد"
},
"createAccount": {
"message": "ایجاد حساب"
},
"createPassword": {
"message": "ایجاد رمز عبور"
},
@ -415,7 +406,7 @@
"likeToImportTokens": {
"message": "آیا میخواهید این رمزیاب ها را اضافه نمایید؟"
},
"lineatestnet": {
"lineaGoerli": {
"message": "شبکه آزمایشی Linea Goerli"
},
"links": {
@ -454,9 +445,6 @@
"mustSelectOne": {
"message": "باید حداقل 1 رمزیاب را انتخاب کنید."
},
"myAccounts": {
"message": "حساب های من"
},
"needImportFile": {
"message": "شما باید یک فایل برای وارد کردن را انتخاب کنید.",
"description": "User is important an account and needs to add a file to continue"
@ -581,9 +569,6 @@
"readdToken": {
"message": "شما میتوانید این رمزیاب را دوباره برای آینده با رفتن به گزینه \"Add token\" در مینوی تنظیمات حساب ها، اضافه نمایید."
},
"recents": {
"message": "واپسین"
},
"recipientAddressPlaceholder": {
"message": "جستجو، آدرس عمومی (0x)، یا ENS"
},
@ -807,16 +792,9 @@
"transfer": {
"message": "انتقال"
},
"transferBetweenAccounts": {
"message": "انتقال میان حساب های من"
},
"transferFrom": {
"message": "انتقال از"
},
"troubleTokenBalances": {
"message": "ما در بارگیری صورت حساب های رمزیاب تان دچار مشکل شدیم. شما میتوانید آنها را مشاهده کنید",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "امتحان مجدد"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Edellinen"
},
"backToAll": {
"message": "Takaisin kaikkiin"
},
"backupApprovalInfo": {
"message": "Tämä salainen koodi vaaditaan kukkarosi palauttamiseen siinä tapauksessa, että kadotat laitteesi, unohdat salasanasi, joudut asentamaan MetaMaskin uudestaan tai haluat käyttää lompakkoasi jollakin toisella laitteella."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Muodosta yhteys"
},
"connectHardwareWallet": {
"message": "Yhdistä laitteistokukkaro"
},
"connectingTo": {
"message": "Yhdistetään summaan $1 "
},
"connectingToGoerli": {
"message": "Yhdistetään Goerlin testiverkostoon"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Yhdistetään Linea Goerli testiverkostoon"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Luo"
},
"createAccount": {
"message": "Luo tili"
},
"createPassword": {
"message": "Luo salasana"
},
@ -415,7 +406,7 @@
"likeToImportTokens": {
"message": "Haluaisitko lisätä nämä poletit?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea-testiverkko"
},
"links": {
@ -454,9 +445,6 @@
"mustSelectOne": {
"message": "Valittava vähintään 1 poletti."
},
"myAccounts": {
"message": "Omat tilit"
},
"needImportFile": {
"message": "Sinun tarvitsee valita tuotava tiedosto.",
"description": "User is important an account and needs to add a file to continue"
@ -578,9 +566,6 @@
"readdToken": {
"message": "Voit lisätä tämän tietueen myöhemmin takaisin siirtymällä tilisi vaihtoehtovalikon kohtaan ”Lisää tietue”."
},
"recents": {
"message": "Viimeaikaiset"
},
"recipientAddressPlaceholder": {
"message": "Haku, julkinen osoite (0x) tai ENS"
},
@ -804,16 +789,9 @@
"transfer": {
"message": "Siirrä"
},
"transferBetweenAccounts": {
"message": "Siirrä tilieni välillä"
},
"transferFrom": {
"message": "Siirto kohteesta"
},
"troubleTokenBalances": {
"message": "Kohtasimme ongelmia ladatessamme tietuesaldojasi. Voit katsella niitä kohteessa",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Yritä uudelleen"
},

View File

@ -81,9 +81,6 @@
"back": {
"message": "Bumalik"
},
"backToAll": {
"message": "Bumalik sa Lahat"
},
"backupApprovalInfo": {
"message": "Ang secret code na ito ay kinakailangan para ma-recover ang iyong wallet kung sakaling mawawala mo ang iyong device, nakalimutan mo ang iyong password, kailangan mong i-install ulit ang MetaMask, o gusto mong i-access ang iyong wallet sa ibang device."
},
@ -133,16 +130,13 @@
"connect": {
"message": "Kumonekta"
},
"connectHardwareWallet": {
"message": "Magkonekta ng Hardware Wallet"
},
"connectingTo": {
"message": "Kumokonekta sa $1"
},
"connectingToGoerli": {
"message": "Kumokonekta sa Goerli Test Network"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Kumokonekta sa Linea Goerli Test Network"
},
"connectingToMainnet": {
@ -172,9 +166,6 @@
"create": {
"message": "Gumawa"
},
"createAccount": {
"message": "Gumawa ng Account"
},
"createPassword": {
"message": "Gumawa ng Password"
},
@ -392,9 +383,6 @@
"mustSelectOne": {
"message": "Dapat pumili ng kahit 1 token."
},
"myAccounts": {
"message": "Mga Account Ko"
},
"needImportFile": {
"message": "Dapat kang pumili ng file na ii-import.",
"description": "User is important an account and needs to add a file to continue"
@ -505,9 +493,6 @@
"readdToken": {
"message": "Puwede mong idagdag ulit ang token na ito sa hinaharap sa pamamagitan ng pagpunta sa “Magdagdag ng token” sa menu ng mga opsyon ng iyong mga accounts."
},
"recents": {
"message": "Kamakailan"
},
"recipientAddressPlaceholder": {
"message": "Maghanap, pampublikong address (0x), o ENS"
},
@ -719,16 +704,9 @@
"transfer": {
"message": "Mag-transfer"
},
"transferBetweenAccounts": {
"message": "Mag-transfer sa pagitan ng aking mga account"
},
"transferFrom": {
"message": "I-transfer Mula Sa"
},
"troubleTokenBalances": {
"message": "Nagkaroon kami ng problema sa pag-loading sa iyong mga token balance. Makikita mo ang mga iyon ",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Subukang muli"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "Ajouter un jeton personnalisé"
},
"addCustomTokenByContractAddress": {
"message": "Vous ne trouvez pas de jeton? Vous pouvez ajouter manuellement nimporte quel jeton avec son adresse par copier-coller. Les adresses des contrats de jetons sont disponibles sur $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Cela permettra dutiliser ce réseau dans MetaMask."
},
@ -263,6 +259,10 @@
"addToken": {
"message": "Ajouter le jeton"
},
"addTokenByContractAddress": {
"message": "Vous ne trouvez pas de jeton? Vous pouvez ajouter manuellement nimporte quel jeton avec son adresse par copier-coller. Les adresses des contrats de jetons sont disponibles sur $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Adresse"
},
@ -359,12 +359,6 @@
"message": "Voulez-vous lui accorder lautorisation daccéder et de transférer tous vos $1 ?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "Approuver et installer"
},
"approveAndUpdate": {
"message": "Approuver et mettre à jour"
},
"approveButtonText": {
"message": "Approuver"
},
@ -429,9 +423,6 @@
"back": {
"message": "Retour"
},
"backToAll": {
"message": "Retour à Tous"
},
"backup": {
"message": "Sauvegarder"
},
@ -557,13 +548,6 @@
"message": "Pour $1 la transaction, les gas fees doivent être augmentés dau moins 10 % pour être reconnus par le réseau.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "Annuler le swap pour ~$1",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Annuler le swap gratuitement"
},
"cancelled": {
"message": "Annulé"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "Connecter un compte ou en créer un nouveau"
},
"connectHardwareWallet": {
"message": "Connecter un portefeuille matériel"
},
"connectManually": {
"message": "Se connecter manuellement au site actuel"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Connexion au testnet Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Connexion au réseau de test Linea Goerli"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "Créer"
},
"createAccount": {
"message": "Créer un compte"
},
"createNewWallet": {
"message": "Créer un nouveau portefeuille"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "Utilisez lAPI OpenSea pour récupérer les données de NFT. La détection automatique de NFT repose sur lAPI OpenSea et ne sera pas disponible si elle est désactivée."
},
"enableSmartTransactions": {
"message": "Activer les transactions intelligentes"
},
"enableToken": {
"message": "activer $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "Tout un chacun peut créer un jeton avec nimporte quel nom, y compris de fausses versions de jetons existants. Ajoutez et échangez avec prudence!"
},
"importTokens": {
"message": "importer des jetons"
},
"importTokensCamelCase": {
"message": "Importer des jetons"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "Souhaitez-vous ajouter ces jetons ?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Réseau de test Linea Goerli"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "Demandez ici"
},
"missingToken": {
"message": "Vous ne voyez pas votre jeton?"
},
"moreComingSoon": {
"message": "Dautres à venir..."
},
"mustSelectOne": {
"message": "Vous devez sélectionner au moins 1 jeton."
},
"myAccounts": {
"message": "Mes comptes"
},
"name": {
"message": "Nom"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "Pas assez de gaz"
},
"notifications": {
"message": "Notifications"
},
"notifications10ActionText": {
"message": "Ouvrir les paramètres",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2817,9 +2780,6 @@
"receive": {
"message": "Recevoir"
},
"recents": {
"message": "Récents"
},
"recipientAddressPlaceholder": {
"message": "Recherche, adresse publique (0x) ou ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "Selectionner ici pour afficher le champs de données hex dans lécran denvoi"
},
"showHide": {
"message": "Afficher/masquer"
},
"showIncomingTransactions": {
"message": "Afficher les transactions entrantes"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "Je suis conscient(e) que tant que je naurai pas sauvegardé ma phrase secrète de récupération, je risque de perdre mes comptes et tous leurs actifs."
},
"smartTransaction": {
"message": "Transaction intelligente"
},
"snapContent": {
"message": "Ce contenu provient de $1",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "Installer Snap"
},
"snapInstallWarningCheck": {
"message": "Cochez la case pour confirmer que vous avez compris."
"message": "Cochez la case pour confirmer que vous avez compris.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "Veuillez confirmer que vous avez bien compris en cochant toutes les cases."
"message": "Veuillez confirmer que vous avez bien compris en cochant toutes les cases.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "Vous autorisez $2 à accéder à la clé du snap « $1 ». Cette action est irréversible et accorde à « $1 » le contrôle de vos comptes et actifs $2. Assurez-vous que vous faites confiance à « $1 » avant de continuer.",
@ -3416,9 +3372,6 @@
"status": {
"message": "État"
},
"statusConnected": {
"message": "Connecté"
},
"statusNotConnected": {
"message": "Non connecté"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "Robuste"
},
"stxAreHere": {
"message": "Les transactions intelligentes sont là !"
},
"stxBenefit1": {
"message": "Minimise les frais de transaction"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "Réessayez le swap. Nous serons là pour vous protéger contre des risques similaires la prochaine fois."
},
"stxDescription": {
"message": "MetaMask Swaps vient de devenir beaucoup plus intelligent ! Si vous activez les transactions intelligentes, MetaMask pourra optimiser programmatiquement votre swap pour vous aider à :"
},
"stxErrorNotEnoughFunds": {
"message": "Fonds insuffisants pour une transaction intelligente."
},
"stxErrorUnavailable": {
"message": "Les transactions intelligentes sont temporairement indisponibles."
},
"stxFailure": {
"message": "Échec du swap"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "Soumission publique de votre Swap..."
},
"stxSubDescription": {
"message": "* Avec les transactions intelligentes, votre transaction sera soumise plusieurs fois en privé. Si toutes les tentatives échouent, la transaction sera diffusée publiquement pour sassurer de la réussite de votre swap."
},
"stxSuccess": {
"message": "Swap terminé !"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "Activer/Désactiver les requêtes eth-sign"
},
"toggleTestNetworks": {
"message": "$1 réseaux de test",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Jeton"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "Transfert"
},
"transferBetweenAccounts": {
"message": "Transfert entre mes comptes"
},
"transferFrom": {
"message": "Transfert depuis"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "Impossible de démarrer MetaMask. Cette erreur peut être occasionnelle, essayez donc de redémarrer lextension."
},
"troubleTokenBalances": {
"message": "Nous avons eu du mal à charger votre balance de jetons, vous pouvez la consulter ici :",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "En accordant cette autorisation, vous permettez au(x) $1 suivant(s) daccéder à vos fonds"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "חזור"
},
"backToAll": {
"message": "חזרה אל 'הכל'"
},
"backupApprovalInfo": {
"message": "קוד סודי זה נדרש כדי לשחזר את הארנק שלך במקרה שתאבד/י את מכשירך, תשכח/י את הססמה, תצטרכ/י להתקין מחדש את MetaMask או שתרצה/י לגשת לארנק שלך במכשיר אחר."
},
@ -154,16 +151,13 @@
"connect": {
"message": "התחברות"
},
"connectHardwareWallet": {
"message": "חבר ארנק חומרה"
},
"connectingTo": {
"message": "מתחבר ל- $1 "
},
"connectingToGoerli": {
"message": "מתחבר ל-Goerli Test Network"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "מתחבר ל-Linea Goerli Test Network"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "צור"
},
"createAccount": {
"message": "פתיחת חשבון"
},
"createPassword": {
"message": "יצירת ססמה"
},
@ -415,7 +406,7 @@
"likeToImportTokens": {
"message": "האם ברצונך להוסיף טוקנים אלה?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "רשת בדיקה Linea Goerli"
},
"links": {
@ -451,9 +442,6 @@
"mustSelectOne": {
"message": "חובה לבחור לפחות אסימון אחד."
},
"myAccounts": {
"message": "החשבונות שלי"
},
"needImportFile": {
"message": "יש לבחור קובץ לייצוא.",
"description": "User is important an account and needs to add a file to continue"
@ -578,9 +566,6 @@
"readdToken": {
"message": "באפשרותך להוסיף טוקן זה בחזרה בעתיד על ידי מעבר אל \"הוסף טוקן\" בתפריט אפשרויות החשבונות שלך."
},
"recents": {
"message": "אחרונים"
},
"recipientAddressPlaceholder": {
"message": "חיפוש, כתובת ציבורית (0x), או ENS"
},
@ -804,16 +789,9 @@
"transfer": {
"message": "העברה"
},
"transferBetweenAccounts": {
"message": "בצע העברה בין חשבונותיי"
},
"transferFrom": {
"message": "העברה מ-"
},
"troubleTokenBalances": {
"message": "לא הצלחנו לטעון את יתרות הטוקנים שלך. באפשרותך להציג אותן",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "ניסיון חוזר"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "कस्टम टोकन जोड़ें"
},
"addCustomTokenByContractAddress": {
"message": "टोकन नहीं मिल रहा है? आप किसी भी टोकन का पता पेस्ट करके उसे मैन्युअल रूप से भी जोड़ सकते हैं। टोकन अनुबंध पते $1 पर मिल सकते हैं।",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "इससे इस नेटवर्क को MetaMask के अंदर उपयोग करने की अनुमति मिलेगी।"
},
@ -263,6 +259,10 @@
"addToken": {
"message": "टोकन जोड़ें"
},
"addTokenByContractAddress": {
"message": "टोकन नहीं मिल रहा है? आप किसी भी टोकन का पता पेस्ट करके उसे मैन्युअल रूप से भी जोड़ सकते हैं। टोकन अनुबंध पते $1 पर मिल सकते हैं।",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "पता"
},
@ -359,12 +359,6 @@
"message": "आपके सभी $1 को एक्सेस और ट्रांसफर करने के लिए अनुमति दें",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "स्वीकृत और इंस्टॉल करें"
},
"approveAndUpdate": {
"message": "स्वीकृत और अपडेट करें"
},
"approveButtonText": {
"message": "अनुमोदित करें"
},
@ -429,9 +423,6 @@
"back": {
"message": "वापस"
},
"backToAll": {
"message": "सभी पर वापस"
},
"backup": {
"message": "बैकअप"
},
@ -557,13 +548,6 @@
"message": "किसी लेनदेन को $1 करने के लिए गैस शुल्क में कम से कम 10% की वृद्धि की जानी चाहिए ताकि उसे नेटवर्क द्वारा मान्यता मिल सके।",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "~$1 में स्वैप रद्द करें",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "मुफ्त में स्वैप रद्द करें"
},
"cancelled": {
"message": "रद्द किया गया"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "खाता कनेक्ट करें या नया बनाएं"
},
"connectHardwareWallet": {
"message": "हार्डवेयर वॉलेट कनेक्ट करें"
},
"connectManually": {
"message": "वर्तमान साइट से मैन्युअल रूप से कनेक्ट करें"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Goerli टेस्ट नेटवर्क से कनेक्ट हो रहा है"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Linea Goerli टेस्ट नेटवर्क से कनेक्ट हो रहा है"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "बनाएं"
},
"createAccount": {
"message": "अकाउंट बनाएं"
},
"createNewWallet": {
"message": "एक नया वॉलेट बनाएं"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "NFT डेटा लाने के लिए OpenSea के API का उपयोग करें। NFT ऑटो-डिटेक्शन OpenSea के API पर निर्भर करता है, और इसके बंद होने पर उपलब्ध नहीं होगा।"
},
"enableSmartTransactions": {
"message": "स्मार्ट लेनदेन को सक्षम करें"
},
"enableToken": {
"message": "$1 इनेबल करें",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "कोई भी किसी भी नाम के साथ एक टोकन बना सकता है, जिसमें मौजूदा टोकन के नकली संस्करण शामिल हैं। अपने जोखिम पर जोड़ें और व्यापार करें!"
},
"importTokens": {
"message": "टोकन आयात करें"
},
"importTokensCamelCase": {
"message": "टोकन आयात करें"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "क्या आप इन टोकन को इंपोर्ट करना चाहते हैं?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli टेस्ट नेटवर्क"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "यहां अनुरोध करें"
},
"missingToken": {
"message": "क्या अपना टोकन नहीं देख रहे हैं?"
},
"moreComingSoon": {
"message": "और अधिक जल्द ही आ रहा..."
},
"mustSelectOne": {
"message": "कम से कम 1 टोकन का चयन करना होगा।"
},
"myAccounts": {
"message": "मेरे खाते"
},
"name": {
"message": "नाम"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "पर्याप्त गैस नहीं"
},
"notifications": {
"message": "सूचनाएं"
},
"notifications10ActionText": {
"message": "सेटिंग्स में जाएं",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2817,9 +2780,6 @@
"receive": {
"message": "प्राप्त करें"
},
"recents": {
"message": "हाल ही के"
},
"recipientAddressPlaceholder": {
"message": "खोज, सार्वजनिक पता (0x) या ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "भेजने की स्क्रीन पर हेक्स डेटा फील्ड दिखाने के लिए इसका चयन करें"
},
"showHide": {
"message": "दिखाएं/छिपाएं"
},
"showIncomingTransactions": {
"message": "आने वाले लेन-देन दिखाएं"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "मैं समझता हूं कि जब तक मैं अपने सीक्रेट रिकवरी फ्रेज का बैकअप नहीं लेता, मैं अपने खाते और उनकी सभी संपत्ति खो सकता हूं।"
},
"smartTransaction": {
"message": "स्मार्ट लेनदेन"
},
"snapContent": {
"message": "यह सामग्री $1 से आ रही है",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "स्नैप इंस्टाल करें"
},
"snapInstallWarningCheck": {
"message": "ये पुष्टि करने के लिए कि आप समझते हैं, सभी बॉक्स पर सही का निशान लगाएं।"
"message": "ये पुष्टि करने के लिए कि आप समझते हैं, सभी बॉक्स पर सही का निशान लगाएं।",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "ये पुष्टि करने के लिए कि आप समझते हैं, सभी बॉक्स पर सही का निशान लगाएं:"
"message": "ये पुष्टि करने के लिए कि आप समझते हैं, सभी बॉक्स पर सही का निशान लगाएं:",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "आप स्नैप \"$1\" के लिए $2 कुंजी का एक्सेस प्रदान कर रहे हैं। यह अपरिवर्तनीय है और आपके $2 खातों और संपत्तियों पर \"$1\" नियंत्रण प्रदान करता है। आगे बढ़ने से पहले सुनिश्चित करें कि आप \"$1\" पर भरोसा करते हैं।",
@ -3416,9 +3372,6 @@
"status": {
"message": "स्टेटस"
},
"statusConnected": {
"message": "कनेक्ट किया गया"
},
"statusNotConnected": {
"message": "कनेक्ट नहीं है"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "मजबूत"
},
"stxAreHere": {
"message": "स्मार्ट लेनदेन यहां पर हैं!"
},
"stxBenefit1": {
"message": "लेनदेन लागतें मिनिमाइज़ करें"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "अपना स्वैप फिर से कोशिश करें। अगली बार भी इस तरह के जोखिमों से आपको बचाने के लिए हम यहां होंगे।"
},
"stxDescription": {
"message": "MetaMask के स्वैप अब और अधिक स्मार्ट हो गए हैं! इन हेतु सहयता के लिए स्मार्ट लेनदेन को सक्षम करने से MetaMask आपके स्वैप को प्रोग्रामेटिक रूप से ऑप्टिमाइज़ कर पाएगा:"
},
"stxErrorNotEnoughFunds": {
"message": "एक स्मार्ट लेनदेन के लिए पर्याप्त फंड नहीं है।"
},
"stxErrorUnavailable": {
"message": "स्मार्ट लेनदेन अस्थाई तौर पर अनुपबल्ध हैं।"
},
"stxFailure": {
"message": "स्वैप विफल हुआ"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "आपका स्वैप सार्वजनिक रूप से सबमिट किया जा रहा है..."
},
"stxSubDescription": {
"message": "* स्मार्ट लेनदेन आपके लेनदेन को निजी तौर पर, अनेक बार जमा करने का प्रयास करेंगे। यदि सभी प्रयास विफल हो जाते हैं, तो लेनदेन को सार्वजनिक रूप से प्रसारित किया जाएगा ताकि यह सुनिश्चित हो सके कि आपका स्वैप सफलतापूर्वक पूरा हो।"
},
"stxSuccess": {
"message": "स्वैप पूरा हुआ!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "Eth_sign अनुरोधों को टॉगल करें"
},
"toggleTestNetworks": {
"message": "$1 परीक्षण नेटवर्क",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "टोकन"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "स्थानांतरण"
},
"transferBetweenAccounts": {
"message": "मेरे खातों के बीच स्थानांतरित करें"
},
"transferFrom": {
"message": "इससे स्थानांतरित करें"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "MetaMask को शुरू करने में परेशानी आई। यह त्रुटि रुक-रुक कर हो सकती है, इसलिए एक्सटेंशन को फिर से शुरू करके देखें।"
},
"troubleTokenBalances": {
"message": "हमें आपके टोकन की शेषराशि लोड करने में परेशानी हुई। आप उन्हें देख सकते हैं ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "अनुमति प्रदान करके, आप निम्नलिखित $1 को अपने फंड तक पहुंचने की इजाजत दे रहे हैं"
},

View File

@ -69,9 +69,6 @@
"create": {
"message": "बनाएं"
},
"createAccount": {
"message": "खाता बनाएं"
},
"decimal": {
"message": "दशमलव परिशुद्धता"
},
@ -192,9 +189,6 @@
"mustSelectOne": {
"message": "कम से कम 1 टोकन का चयन करना आवश्यक है।"
},
"myAccounts": {
"message": "मेरे खाते"
},
"needImportFile": {
"message": "आयात करने के लिए आपको एक फ़ाइल का चयन करना होगा।",
"description": "User is important an account and needs to add a file to continue"
@ -323,10 +317,6 @@
"total": {
"message": "कुल"
},
"troubleTokenBalances": {
"message": "मुसीबत... आपके टोकन शेष राशि को लोड करने में हमें परेशानी हुई थी। आप उन्हें देख सकते हैं",
"description": "Followed by a link (here) to view token balances"
},
"typePassword": {
"message": "अपना पासवर्ड टाइप करें"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Natrag"
},
"backToAll": {
"message": "Natrag na sve"
},
"backupApprovalInfo": {
"message": "Ovaj je sigurnosni kôd potreban za obnavljanje novčanika ako izgubite svoj uređaj, zaboravite svoju lozinku, morate ponovno instalirati MetaMask ili želite pristupiti svojem novčaniku na drugom uređaju."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Povežite se"
},
"connectHardwareWallet": {
"message": "Poveži hardverski novčanik"
},
"connectingTo": {
"message": "Povezivanje na $1"
},
"connectingToGoerli": {
"message": "Povezivanje na testnu mrežu Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Povezivanje na testnu mrežu Linea Goerli"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Stvori"
},
"createAccount": {
"message": "Stvori račun"
},
"createPassword": {
"message": "Stvori lozinku"
},
@ -411,7 +402,7 @@
"likeToImportTokens": {
"message": "Želite li dodati ove tokene?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Testna mreža Linea Goerli"
},
"links": {
@ -447,9 +438,6 @@
"mustSelectOne": {
"message": "Mora se odabrati barem jedan token."
},
"myAccounts": {
"message": "Moji računi"
},
"needImportFile": {
"message": "Morate odabrati datoteku za uvoz.",
"description": "User is important an account and needs to add a file to continue"
@ -574,9 +562,6 @@
"readdToken": {
"message": "Ovaj token možete dodati kasnije odlaskom pod stavku „Dodaj token” u izborniku mogućnosti računa. "
},
"recents": {
"message": "Nedavno"
},
"recipientAddressPlaceholder": {
"message": "Pretraži, javne adrese (0x) ili ENS"
},
@ -797,16 +782,9 @@
"transfer": {
"message": "Prenesi"
},
"transferBetweenAccounts": {
"message": "Prenesi između mojih računa"
},
"transferFrom": {
"message": "Prenesi od"
},
"troubleTokenBalances": {
"message": "Imamo problema s učitavanjem raspoloživog stanja vaših tokena. Možete ih vidjeti",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Pokušaj ponovo"
},

View File

@ -96,9 +96,6 @@
"connect": {
"message": "Konekte"
},
"connectHardwareWallet": {
"message": "Konekte Materyèl Wallet"
},
"connectingToMainnet": {
"message": "Konekte ak Prensipal Ethereum Rezo a"
},
@ -120,9 +117,6 @@
"create": {
"message": "Kreye"
},
"createAccount": {
"message": "Kreye Kont"
},
"currentLanguage": {
"message": "Lang Aktyèl"
},
@ -306,9 +300,6 @@
"mustSelectOne": {
"message": "Ou dwe chwazi omwen 1 token."
},
"myAccounts": {
"message": "Kont mwen"
},
"needImportFile": {
"message": "Ou dwe chwazi yon dosye pou enpòte.",
"description": "User is important an account and needs to add a file to continue"
@ -563,10 +554,6 @@
"transfer": {
"message": "Transfè"
},
"troubleTokenBalances": {
"message": "Nou te gen pwoblèm chaje balans token ou. Ou ka wè yo ",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Eseye anko"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Vissza"
},
"backToAll": {
"message": "Vissza az összeshez"
},
"backupApprovalInfo": {
"message": "Ez a titkos kód a tárca helyreállításához szükséges, ha elveszíti eszközét, elfelejti jelszavát, újra kell telepítenie a MetaMask alkalmazást, vagy ha a tárcájához egy másik eszközről szeretne hozzáférni."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Csatlakozás"
},
"connectHardwareWallet": {
"message": "Hardverpénztárca csatlakoztatása"
},
"connectingTo": {
"message": "Kapcsolódás: $1"
},
"connectingToGoerli": {
"message": "Csatlakozás a Goerli teszthálózathoz"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Csatlakozás a Linea Goerli teszthálózathoz"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Létrehozás"
},
"createAccount": {
"message": "Fiók létrehozása"
},
"createPassword": {
"message": "Jelszó létrehozása"
},
@ -411,7 +402,7 @@
"likeToImportTokens": {
"message": "Hozzá szeretné adni ezeket az érméket?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli teszthálózat"
},
"links": {
@ -447,9 +438,6 @@
"mustSelectOne": {
"message": "Legalább 1 tokent ki kell választania."
},
"myAccounts": {
"message": "Fiókjaim"
},
"needImportFile": {
"message": "Ki kell választania az importálni kívánt fájlt.",
"description": "User is important an account and needs to add a file to continue"
@ -574,9 +562,6 @@
"readdToken": {
"message": "Ezt a tokent a jövőben is hozzáadhatja, ha a fiókbeállítások menü „Token hozzáadása” elemére lép."
},
"recents": {
"message": "Legutóbbiak"
},
"recipientAddressPlaceholder": {
"message": "Keresés, nyilvános cím (0x) vagy ENS"
},
@ -797,16 +782,9 @@
"transfer": {
"message": "Átutalás"
},
"transferBetweenAccounts": {
"message": "Fiókok közötti küldés"
},
"transferFrom": {
"message": "Átvezetés innen: "
},
"troubleTokenBalances": {
"message": "Gondjaink voltak tokenegyenlegeid betöltésével. Megtekintheted őket",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Újra"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "Tambahkan token kustom"
},
"addCustomTokenByContractAddress": {
"message": "Tidak dapat menemukan token? Tambahkan token secara manual dengan menempelkan alamatnya. Alamat kontrak token dapat ditemukan di $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Tindakan ini akan membantu jaringan ini agar dapat digunakan dengan MetaMask."
},
@ -263,6 +259,10 @@
"addToken": {
"message": "Tambahkan token"
},
"addTokenByContractAddress": {
"message": "Tidak dapat menemukan token? Tambahkan token secara manual dengan menempelkan alamatnya. Alamat kontrak token dapat ditemukan di $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Alamat"
},
@ -359,12 +359,6 @@
"message": "Berikan izin untuk mengakses dan mentransfer seluruh $1 Anda?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "Setujui & instal"
},
"approveAndUpdate": {
"message": "Setujui dan perbarui"
},
"approveButtonText": {
"message": "Setujui"
},
@ -429,9 +423,6 @@
"back": {
"message": "Kembali"
},
"backToAll": {
"message": "Kembali ke semua"
},
"backup": {
"message": "Pencadangan"
},
@ -557,13 +548,6 @@
"message": "Untuk $1 suatu transaksi, biaya gas harus dinaikkan minimal 10% agar dapat dikenali oleh jaringan.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "Batalkan swap untuk ~$",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Batalkan swap gratis"
},
"cancelled": {
"message": "Dibatalkan"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "Hubungkan akun atau buat baru"
},
"connectHardwareWallet": {
"message": "Hubungkan dompet perangkat keras"
},
"connectManually": {
"message": "Hubungkan ke situs saat ini secara manual"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Menghubungkan ke jaringan uji Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Menghubungkan ke jaringan uji Linea Goerli"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "Buat"
},
"createAccount": {
"message": "Buat akun"
},
"createNewWallet": {
"message": "Buat dompet baru"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "Gunakan API OpenSea untuk mengambil data NFT. Deteksi otomatis NFT bergantung pada API OpenSea, dan tidak akan tersedia saat API ditutup."
},
"enableSmartTransactions": {
"message": "Aktifkan transaksi pintar"
},
"enableToken": {
"message": "aktifkan $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "Siapa pun dapat membuat token dengan nama apa pun, termasuk versi palsu dari token yang ada. Tambahkan dan perdagangkan dengan risiko ditanggung sendiri!"
},
"importTokens": {
"message": "impor token"
},
"importTokensCamelCase": {
"message": "Impor token"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "Apakah Anda ingin menambahkan token ini?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Jaringan uji Linea Goerli"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "Minta di sini"
},
"missingToken": {
"message": "Tidak melihat token Anda?"
},
"moreComingSoon": {
"message": "Selanjutnya akan segera hadir..."
},
"mustSelectOne": {
"message": "Harus memilih minimal 1 token."
},
"myAccounts": {
"message": "Akun saya"
},
"name": {
"message": "Nama"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "Gas tidak cukup"
},
"notifications": {
"message": "Notifikasi"
},
"notifications10ActionText": {
"message": "Lihat di Pengaturan",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2817,9 +2780,6 @@
"receive": {
"message": "Terima"
},
"recents": {
"message": "Terkini"
},
"recipientAddressPlaceholder": {
"message": "Cari, alamat publik (0x), atau ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "Pilih ini untuk menampilkan bidang data hex di layar kirim"
},
"showHide": {
"message": "Tampil/Sembunyi"
},
"showIncomingTransactions": {
"message": "Tampilkan transaksi masuk"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "Saya memahami bahwa sampai saya mencadangkan Frasa Pemulihan Rahasia, saya dapat kehilangan akun saya dan semua aset yang ada."
},
"smartTransaction": {
"message": "Transaksi pintar"
},
"snapContent": {
"message": "Konten ini berasal dari $1",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "Instal Snap"
},
"snapInstallWarningCheck": {
"message": "Untuk mengonfirmasikan bahwa Anda sudah paham, centang kotaknya."
"message": "Untuk mengonfirmasikan bahwa Anda sudah paham, centang kotaknya.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "Untuk mengonfirmasikan bahwa Anda memahaminya, centang semua kotak."
"message": "Untuk mengonfirmasikan bahwa Anda memahaminya, centang semua kotak.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "Anda memberikan $2 akses kunci ke snap \"$1\". Tindakan ini tidak dapat dibatalkan dan memberikan kendali \"$1\" atas akun dan aset $2 Anda. Sebelum melanjutkan, pastikan \"$1\" aman.",
@ -3416,9 +3372,6 @@
"status": {
"message": "Status"
},
"statusConnected": {
"message": "Terhubung"
},
"statusNotConnected": {
"message": "Tidak terhubung"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "Kuat"
},
"stxAreHere": {
"message": "Transaksi Pintar hadir di sini!"
},
"stxBenefit1": {
"message": "Meminimalkan biaya transaksi"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "Cobalah untuk menukar lagi. Kami akan selalu hadir untuk melindungi Anda dari risiko serupa di lain waktu."
},
"stxDescription": {
"message": "Pertukaran MetaMask menjadi semakin pintar! Mengaktifkan Transaksi Pintar akan memungkinkan MetaMask mengoptimalkan Pertukaran Anda secara terprogram untuk membantu:"
},
"stxErrorNotEnoughFunds": {
"message": "Dana tidak cukup untuk mengaktifkan transaksi pintar."
},
"stxErrorUnavailable": {
"message": "Transaksi Pintar tidak tersedia untuk sementara waktu."
},
"stxFailure": {
"message": "Pertukaran gagal"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "Kirimkan Swap Anda secara publik..."
},
"stxSubDescription": {
"message": "* Transaksi Pintar akan mencoba mengirimkan transaksi Anda secara pribadi, beberapa kali. Jika semua upaya gagal, transaksi akan disiarkan secara publik untuk memastikan Pertukaran telah berhasil dilakukan."
},
"stxSuccess": {
"message": "Pertukaran selesai!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "Alihkan permintaan eth_sign"
},
"toggleTestNetworks": {
"message": "$1 jaringan pengujian",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Token"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "Transfer"
},
"transferBetweenAccounts": {
"message": "Transfer antar akun saya"
},
"transferFrom": {
"message": "Transfer dari"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "MetaMask mengalami masalah saat memulai. Kesalahan ini dapat terjadi berselang, coba mulai ulang ekstensi."
},
"troubleTokenBalances": {
"message": "Kami mengalami masalah saat memuat saldo token Anda. Anda dapat melihatnya ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "Dengan memberikan izin, Anda mengizinkan $1 berikut untuk mengakses dana Anda"
},

View File

@ -158,10 +158,6 @@
"addCustomToken": {
"message": "Aggiungi token personalizzato"
},
"addCustomTokenByContractAddress": {
"message": "Non trovi un token? Puoi aggiungere qualsiasi token incollando il suo indirizzo. L'indirizzo del contratto del Token può essere trovato su $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Ciò consentirà a questa rete di essere utilizzata all'interno di MetaMask."
},
@ -204,6 +200,10 @@
"addToken": {
"message": "Aggiungi Token"
},
"addTokenByContractAddress": {
"message": "Non trovi un token? Puoi aggiungere qualsiasi token incollando il suo indirizzo. L'indirizzo del contratto del Token può essere trovato su $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Indirizzo"
},
@ -290,12 +290,6 @@
"message": "Consenti l'accesso e il trasferimento di tutti i tuoi $1?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "Approva & installa"
},
"approveAndUpdate": {
"message": "Approva & aggiorna"
},
"approveButtonText": {
"message": "Approva"
},
@ -339,9 +333,6 @@
"back": {
"message": "Indietro"
},
"backToAll": {
"message": "Torna a \"Tutti\""
},
"backupApprovalInfo": {
"message": "Questo codice è necessario per recuperare il tuo portafoglio nel caso in cui perdi il tuo dispositivo, dimentichi la tua password, debba reinstallare MetaMask o voglia accedere al tuo portafoglio su un altro dispositivo."
},
@ -428,13 +419,6 @@
"message": "Per $1 una transazione la commissione di gas deve crescere almeno del 10% per essere riconosciuto dalla rete.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "Annulla scambio per ~$1",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Annulla scambio gratuitamente"
},
"cancelled": {
"message": "Annullata"
},
@ -485,9 +469,6 @@
"connectAccountOrCreate": {
"message": "Connetti un account o creane uno nuovo"
},
"connectHardwareWallet": {
"message": "Connetti Portafoglio Hardware"
},
"connectManually": {
"message": "Connettiti al sito manualmente"
},
@ -544,7 +525,7 @@
"connectingToGoerli": {
"message": "Connessione alla Rete di Test Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Connessione alla Rete di test Linea Goerli"
},
"connectingToMainnet": {
@ -616,9 +597,6 @@
"create": {
"message": "Crea"
},
"createAccount": {
"message": "Crea Account"
},
"createNewWallet": {
"message": "Crea un nuovo portafoglio"
},
@ -1121,7 +1099,7 @@
"likeToImportTokens": {
"message": "Vorresti aggiungere questi token?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Rete di test Linea Goerli"
},
"links": {
@ -1172,9 +1150,6 @@
"mustSelectOne": {
"message": "Devi selezionare almeno un token."
},
"myAccounts": {
"message": "Miei Account"
},
"needImportFile": {
"message": "Devi selezionare un file da importare.",
"description": "User is important an account and needs to add a file to continue"
@ -1344,9 +1319,6 @@
"receive": {
"message": "Ricevi"
},
"recents": {
"message": "Recenti"
},
"recipientAddressPlaceholder": {
"message": "Ricerca, indirizzo pubblico (0x) o ENS"
},
@ -1540,9 +1512,6 @@
"stateLogsDescription": {
"message": "I log di stato contengono i tuoi indirizzi pubblici e le transazioni effettuate."
},
"statusConnected": {
"message": "Connesso"
},
"statusNotConnected": {
"message": "Non connesso"
},
@ -1833,9 +1802,6 @@
"transfer": {
"message": "Trasferisci"
},
"transferBetweenAccounts": {
"message": "Trasferimento tra i miei account"
},
"transferFrom": {
"message": "Trasferisci Da"
},
@ -1843,10 +1809,6 @@
"message": "Abbiamo riscontrato un errore nella connessione a $1, guarda la documentazione $2 e prova di nuovo.",
"description": "$1 is the wallet device name; $2 is a link to wallet connection guide"
},
"troubleTokenBalances": {
"message": "Abbiamo avuto un problema a caricare il bilancio dei tuoi token. Puoi vederlo ",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Prova di nuovo"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "カスタムトークンを追加"
},
"addCustomTokenByContractAddress": {
"message": "トークンが見つからない場合、アドレスをペーストして手動でトークンを追加できます。トークンコントラクトアドレスは$1にあります。",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "これにより、このネットワークはMetaMask内で使用できるようになります。"
},
@ -263,6 +259,10 @@
"addToken": {
"message": "トークンを追加"
},
"addTokenByContractAddress": {
"message": "トークンが見つからない場合、アドレスをペーストして手動でトークンを追加できます。トークンコントラクトアドレスは$1にあります",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "アドレス"
},
@ -359,12 +359,6 @@
"message": "すべての $1 へのアクセスとその送金を許可しますか?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "承認してインストール"
},
"approveAndUpdate": {
"message": "承認して更新"
},
"approveButtonText": {
"message": "承認"
},
@ -429,9 +423,6 @@
"back": {
"message": "戻る"
},
"backToAll": {
"message": "一覧に戻る"
},
"backup": {
"message": "バックアップ"
},
@ -557,13 +548,6 @@
"message": "トランザクションを$1するには、ネットワークに認識されるようにガス代を 10% 以上増額する必要があります。",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "$1 以下でスワップをキャンセル",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "無料でスワップをキャンセル"
},
"cancelled": {
"message": "キャンセル済み"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "アカウントを接続するか、または新規に作成します"
},
"connectHardwareWallet": {
"message": "ハードウェアウォレットの接続"
},
"connectManually": {
"message": "現在のサイトに手動で接続"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Goerliテストネットワークに接続中"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Linea Goerli テストネットワークに接続中"
},
"connectingToMainnet": {
@ -760,7 +741,7 @@
"message": "トークンコントラクト"
},
"convertTokenToNFTDescription": {
"message": "このアセットは NFT であることが検出されました。Metamask では現在、NFT が完全にネイティブでサポートされています。トークンリストから削除して、NFT として追加しますか?"
"message": "このアセットは NFT であることが検出されました。MetaMask では現在、NFT が完全にネイティブでサポートされています。トークンリストから削除して、NFT として追加しますか?"
},
"convertTokenToNFTExistDescription": {
"message": "このアセットは NFT として追加されていることが検出されました。トークンリストから削除しますか?"
@ -789,9 +770,6 @@
"create": {
"message": "作成"
},
"createAccount": {
"message": "アカウントを作成"
},
"createNewWallet": {
"message": "新規ウォレットを作成"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "OpenSea APIを使用してNFTデータを取得します。NFT自動検出はOpenSea APIを使用するため、この設定をオフにすると利用できなくなります。"
},
"enableSmartTransactions": {
"message": "スマートトランザクションを有効にする"
},
"enableToken": {
"message": "$1を有効にする",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "誰でも既存のトークンの偽バージョンを含めて、任意の名前でトークンを作成することができます。追加および取引は自己責任となります!"
},
"importTokens": {
"message": "トークンをインポート"
},
"importTokensCamelCase": {
"message": "トークンをインポート"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "これらのトークンを追加しますか?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli テストネットワーク"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "ここからリクエスト"
},
"missingToken": {
"message": "トークンが見当たりませんか?"
},
"moreComingSoon": {
"message": "さらに近日追加予定..."
},
"mustSelectOne": {
"message": "トークンを1つ以上選択する必要があります。"
},
"myAccounts": {
"message": "マイアカウント"
},
"name": {
"message": "名前"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "ガスが不足しています"
},
"notifications": {
"message": "通知"
},
"notifications10ActionText": {
"message": "設定に移動",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2817,9 +2780,6 @@
"receive": {
"message": "受領"
},
"recents": {
"message": "最近"
},
"recipientAddressPlaceholder": {
"message": "検索、パブリックアドレス (0x)、またはENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "これを選択すると、送金画面に16進データフィールドが表示されます"
},
"showHide": {
"message": "表示・非表示"
},
"showIncomingTransactions": {
"message": "受信トランザクションを表示"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "私は、シークレットリカバリーフレーズをバックアップするまで、アカウントとそのアセットのすべてを失う可能性があることを理解しています。"
},
"smartTransaction": {
"message": "スマートトランザクション"
},
"snapContent": {
"message": "このコンテンツは $1 からのものです",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "スナップをインストール"
},
"snapInstallWarningCheck": {
"message": "理解したことを確認するために、次の項目にチェックを入れてください."
"message": "理解したことを確認するために、次の項目にチェックを入れてください.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "理解したことを確認するために、すべての項目にチェックを入れてください。"
"message": "理解したことを確認するために、すべての項目にチェックを入れてください。",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "スナップ「$1」に $2 へのキーアクセスを許可しようとしています。この操作は取り消し不能であり、$2 アカウントとアセットのコントロールを「$1」に許可することになります。続行する前に、必ず「$1」が信頼できることを確認してください。",
@ -3416,9 +3372,6 @@
"status": {
"message": "ステータス"
},
"statusConnected": {
"message": "接続済み"
},
"statusNotConnected": {
"message": "未接続"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "強"
},
"stxAreHere": {
"message": "スマートトランザクションが利用可能になりました!"
},
"stxBenefit1": {
"message": "トランザクションコストを最小化"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "もう一度スワップをお試しください。次回は同様のリスクを避けられるようサポートします。"
},
"stxDescription": {
"message": "MetaMask Swaps がはるかに賢くなりましたスマートトランザクションを有効にすると、MetaMask がプログラムに従ってスワップを最適化できるようになるため、以下のようなメリットがあります。"
},
"stxErrorNotEnoughFunds": {
"message": "スマートトランザクションに十分な資金がありません。"
},
"stxErrorUnavailable": {
"message": "スマートトランザクションは一時的に利用できません。"
},
"stxFailure": {
"message": "スワップに失敗しました"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "スワップを公開で送信中..."
},
"stxSubDescription": {
"message": "* スマートトランザクションは、非公開でトランザクションのの送信を数回試みます。すべての試みが失敗した場合、スワップが成功するようトランザクションが公開されます。"
},
"stxSuccess": {
"message": "スワップ完了!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "eth_sign 要求の設定"
},
"toggleTestNetworks": {
"message": "$1テストネットワーク",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "トークン"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "送金"
},
"transferBetweenAccounts": {
"message": "自分のアカウント間での振替"
},
"transferFrom": {
"message": "送金元"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "MetaMask がうまく起動しませんでした。このエラーは断続的に発生する可能性があるため、拡張機能を再起動してみてください。"
},
"troubleTokenBalances": {
"message": "トークンバランスのロードに問題があります。トークンバランスを表示できます",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "パーミッションを付与することで、次の$1による資金へのアクセスが許可されます"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "ಹಿಂದೆ"
},
"backToAll": {
"message": "ಎಲ್ಲವನ್ನು ಹಿಂತಿರುಗಿಸಿ"
},
"backupApprovalInfo": {
"message": "ನಿಮ್ಮ ಸಾಧನವನ್ನು ನೀವು ಕಳೆದುಕೊಂಡಾಗ, ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಮರೆತರೆ, MetaMask ಅನ್ನು ಮರು-ಸ್ಥಾಪಿಸಲು ಅಥವಾ ಬೇರೊಂದು ಸಾಧನದಲ್ಲಿ ನಿಮ್ಮ ವ್ಯಾಲೆಟ್‌ ಅನ್ನು ಪ್ರವೇಶಿಸಲು ಬಯಸಿದ ಸಂದರ್ಭದಲ್ಲಿ ನಿಮ್ಮ ವ್ಯಾಲೆಟ್‌ ಅನ್ನು ಮರುಪಡೆದುಕೊಳ್ಳಲು ಈ ರಹಸ್ಯ ಕೋಡ್ ಅಗತ್ಯವಿರುತ್ತದೆ."
},
@ -154,16 +151,13 @@
"connect": {
"message": "ಸಂಪರ್ಕಿಸು"
},
"connectHardwareWallet": {
"message": "ಹಾರ್ಡ್‌ವೆರ್ ವ್ಯಾಲೆಟ್‌‌ಗೆ ಸಂಪರ್ಕಪಡಿಸಿ"
},
"connectingTo": {
"message": "$1 ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗುತ್ತಿದೆ"
},
"connectingToGoerli": {
"message": "Goerli ಪರೀಕ್ಷಾ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Linea Goerli ಪರೀಕ್ಷಾ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "ರಚಿಸಿ"
},
"createAccount": {
"message": "ಖಾತೆಯನ್ನು ರಚಿಸಿ"
},
"createPassword": {
"message": "ಪಾಸ್‌ವರ್ಡ್ ರಚಿಸಿ"
},
@ -415,7 +406,7 @@
"likeToImportTokens": {
"message": "ನೀವು ಈ ಟೋಕನ್‌ಗಳನ್ನು ಸೇರಿಸಲು ಬಯಸುತ್ತೀರಾ?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli ಪರೀಕ್ಷೆ ನೆಟ್‌ವರ್ಕ್"
},
"links": {
@ -454,9 +445,6 @@
"mustSelectOne": {
"message": "ಕನಿಷ್ಟ 1 ಟೋಕನ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಬೇಕು."
},
"myAccounts": {
"message": "ನನ್ನ ಖಾತೆಗಳು"
},
"needImportFile": {
"message": "ಆಮದು ಮಾಡಲು ನೀವು ಫೈಲ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಬೇಕು.",
"description": "User is important an account and needs to add a file to continue"
@ -581,9 +569,6 @@
"readdToken": {
"message": "ನಿಮ್ಮ ಖಾತೆಗಳ ಆಯ್ಕೆಗಳ ಮೆನುವಿನಲ್ಲಿ \"ಟೋಕನ್ ಸೇರಿಸು\" ಗೆ ಹೋಗುವ ಮೂಲಕ ನೀವು ಈ ಟೋಕನ್ ಅನ್ನು ಭವಿಷ್ಯದಲ್ಲಿ ಮರಳಿ ಸೇರಿಸಬಹುದು."
},
"recents": {
"message": "ಇತ್ತೀಚಿನವುಗಳು"
},
"recipientAddressPlaceholder": {
"message": "ಸಾರ್ವಜನಿಕ ವಿಳಾಸ (0x) ಅಥವಾ ENS ಹುಡುಕಿ"
},
@ -807,16 +792,9 @@
"transfer": {
"message": "ವರ್ಗಾಯಿಸಿ"
},
"transferBetweenAccounts": {
"message": "ನನ್ನ ಖಾತೆಗಳ ನಡುವೆ ವರ್ಗಾಯಿಸಿ"
},
"transferFrom": {
"message": "ಇದರಿಂದ ವರ್ಗಾಯಿಸಿ"
},
"troubleTokenBalances": {
"message": "ನಿಮ್ಮ ಟೋಕನ್ ಬ್ಯಾಲೆನ್ಸ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ನಮಗೆ ಸಮಸ್ಯೆಯಾಗಿದೆ. ನೀವು ಅವುಗಳನ್ನು ನೋಡಬಹುದು",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "커스텀 토큰 추가"
},
"addCustomTokenByContractAddress": {
"message": "이 토큰을 찾을 수 없으신가요? 토큰 주소를 붙여넣으면 토큰을 직접 추가할 수 있습니다. 토큰의 계약 주소는 $1에서 찾을 수 있습니다.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "이렇게 하면 MetaMask 내에서 이 네트워크를 사용할 수 있습니다."
},
@ -263,6 +259,10 @@
"addToken": {
"message": "토큰 추가"
},
"addTokenByContractAddress": {
"message": "이 토큰을 찾을 수 없으신가요? 토큰 주소를 붙여넣으면 토큰을 직접 추가할 수 있습니다. 토큰의 계약 주소는 $1에서 찾을 수 있습니다",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "주소"
},
@ -359,12 +359,6 @@
"message": "내 모든 $1에 액세스 및 전송할 수 있는 권한을 부여할까요?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "승인 및 설치"
},
"approveAndUpdate": {
"message": "승인 및 업데이트"
},
"approveButtonText": {
"message": "승인"
},
@ -429,9 +423,6 @@
"back": {
"message": "뒤로"
},
"backToAll": {
"message": "전체 목록으로 돌아가기"
},
"backup": {
"message": "백업"
},
@ -557,13 +548,6 @@
"message": "거래를 $1하려면 가스비를 최소 10%를 인상해야 네트워크에서 인식될 수 있습니다.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "~$1 비용으로 스왑 취소",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "무료로 스왑 취소"
},
"cancelled": {
"message": "취소됨"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "계정 연결 또는 새 계정 만들기"
},
"connectHardwareWallet": {
"message": "하드웨어 지갑 연결"
},
"connectManually": {
"message": "현재 사이트에 수동으로 연결"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Goerli 테스트 네트워크에 연결 중"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Linea Goerli 테스트 네트워크에 연결 중"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "생성"
},
"createAccount": {
"message": "계정 생성"
},
"createNewWallet": {
"message": "새 지갑 생성"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "OpenSea의 API를 사용하여 NFT 데이터를 가져옵니다. NFT 자동 감지는 OpenSea의 API에 의존하며 이 API가 꺼져 있으면 사용할 수 없습니다."
},
"enableSmartTransactions": {
"message": "스마트 트랜잭션 활성화"
},
"enableToken": {
"message": "$1 활성화",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "기존 토큰의 가짜 버전을 포함하여 누구나 어떤 이름으로든 토큰을 만들 수 있습니다. 추가 및 거래는 사용자의 책임입니다."
},
"importTokens": {
"message": "토큰 가져오기"
},
"importTokensCamelCase": {
"message": "토큰 가져오기"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "이 토큰을 추가할까요?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli 테스트 네트워크"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "여기에서 요청하세요"
},
"missingToken": {
"message": "토큰이 보이지 않나요?"
},
"moreComingSoon": {
"message": "더 추가 예정..."
},
"mustSelectOne": {
"message": "토큰을 1개 이상 선택해야 합니다."
},
"myAccounts": {
"message": "내 계정"
},
"name": {
"message": "이름"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "가스 부족"
},
"notifications": {
"message": "알림"
},
"notifications10ActionText": {
"message": "설정으로 이동하기",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2817,9 +2780,6 @@
"receive": {
"message": "받기"
},
"recents": {
"message": "최근"
},
"recipientAddressPlaceholder": {
"message": "검색, 공개 주소(0x) 또는 ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "이 항목을 선택하면 보내기 화면에 16진수 데이터 필드가 표시됩니다."
},
"showHide": {
"message": "보기/숨기기"
},
"showIncomingTransactions": {
"message": "수신 거래 표시"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "본인은 본인의 비밀 복구 구문을 백업하지 않는 한 본인의 계정과 모든 자산을 잃을 수 있다는 사실을 이해합니다."
},
"smartTransaction": {
"message": "스마트 트랜잭션"
},
"snapContent": {
"message": "콘텐츠 출처: $1",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "스냅 설치"
},
"snapInstallWarningCheck": {
"message": "이해하셨으면 모두 체크해 주세요."
"message": "이해하셨으면 모두 체크해 주세요.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "이해하셨으면 모든 란에 체크하세요."
"message": "이해하셨으면 모든 란에 체크하세요.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "'$1' 스냅 이용에 필요한 $2 키 액세스 권한을 부여하고 있습니다. 이 작업은 사용자의 $2 계정과 자산에 '$1' 제어 권한을 부여하며 취소가 불가능합니다. '$1의 신뢰성을 확인한 후에 진행하세요.",
@ -3416,9 +3372,6 @@
"status": {
"message": "상태"
},
"statusConnected": {
"message": "연결됨"
},
"statusNotConnected": {
"message": "연결되지 않음"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "강함"
},
"stxAreHere": {
"message": "스마트 거래가 가능합니다!"
},
"stxBenefit1": {
"message": "거래 비용 최소화하기"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "스왑을 다시 진행하세요. 다음에도 유사한 위험이 발생한다면 보호해 드리겠습니다."
},
"stxDescription": {
"message": "MetaMask 스왑이 더욱 스마트해졌습니다! 스마트 거래를 활성화하면 MetaMask가 프로그램을 통해 스왑을 최적화하여 다음을 도울 수 있습니다."
},
"stxErrorNotEnoughFunds": {
"message": "스마트 거래 자금 부족"
},
"stxErrorUnavailable": {
"message": "스마트 거래를 잠시 사용할 수 없습니다."
},
"stxFailure": {
"message": "스왑 실패"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "스왑을 공개로 제출하는 중..."
},
"stxSubDescription": {
"message": "*스마트 거래는 비공개로 거래를 제출하기 위해 여러 번 시도할 것입니다. 모든 시도가 실패하면 성공적인 스왑을 위해 거래는 공개적으로 브로드캐스트될 것입니다."
},
"stxSuccess": {
"message": "스왑 완료!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "eth_sign 요청 토글"
},
"toggleTestNetworks": {
"message": "$1 테스트 네트워크",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "토큰"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "전송"
},
"transferBetweenAccounts": {
"message": "내 계정 간 전송"
},
"transferFrom": {
"message": "전송 위치"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "MetaMask 실행 중 오류가 발생했습니다. 일시적인 오류일 수 있으니 확장 프로그램을 재시작해 보세요."
},
"troubleTokenBalances": {
"message": "토큰 잔액을 로드하는 도중 문제가 발생했습니다. 다음에서 잔액을 확인하세요. ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "권한을 부여하면 다음 $1이(가) 귀하의 자금에 액세스할 수 있습니다."
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Grįžti"
},
"backToAll": {
"message": "Atgal prie visų"
},
"backupApprovalInfo": {
"message": "Šis slaptas kodas reikalingas norint atkurti jūsų slaptažodinę, jeigu pamestumėte savo įrenginį, pamirštumėte savo slaptažodį, iš naujo įdiegtumėte „MetaMask“, taip pat norint pasiekti slaptažodinę iš kito įrenginio."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Prisijungti"
},
"connectHardwareWallet": {
"message": "Susieti aparatinės įrangos slaptažodinę"
},
"connectingTo": {
"message": "Jungiamasi prie $1"
},
"connectingToGoerli": {
"message": "Jungiamasi prie „Goerli“ bandomojo tinklo"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Jungiamasi prie „Linea“ bandomojo tinklo"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Sukurti"
},
"createAccount": {
"message": "Sukurti paskyrą"
},
"createPassword": {
"message": "Sukurti slaptažodį"
},
@ -415,7 +406,7 @@
"likeToImportTokens": {
"message": "Ar norėtumėte pridėti šiuos žetonus?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "„Linea“ bandomasis tinklas"
},
"links": {
@ -454,9 +445,6 @@
"mustSelectOne": {
"message": "Turite pasirinkti bent 1 žetoną."
},
"myAccounts": {
"message": "Mano paskyros"
},
"needImportFile": {
"message": "Turite pasirinkti failą, kurį pageidaujate importuoti.",
"description": "User is important an account and needs to add a file to continue"
@ -581,9 +569,6 @@
"readdToken": {
"message": "Šį žetoną galite bet kada galite įtraukti ir vėl, tiesiog savo paskyros parinkčių meniu nueikite į „Įtraukti žetoną“."
},
"recents": {
"message": "Naujausi"
},
"recipientAddressPlaceholder": {
"message": "Ieška, viešieji adresai (0x) arba ENS"
},
@ -807,16 +792,9 @@
"transfer": {
"message": "Pervesti"
},
"transferBetweenAccounts": {
"message": "Perkėlimas tarp savo paskyrų"
},
"transferFrom": {
"message": "Pervedimas iš"
},
"troubleTokenBalances": {
"message": "Susidurta su sunkumais įkeliant jūsų žetonų likučius. Galite juos peržiūrėti ",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Bandyti dar kartą"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Atpakaļ"
},
"backToAll": {
"message": "Atgriezties pie visiem"
},
"backupApprovalInfo": {
"message": "Šis slepenais kods ir nepieciešams, lai atjaunotu jūsu maku, ja pazaudējat ierīci, aizmirstat paroli, jāpārinstalē MetaMask vai vēlaties piekļūt makam no citas ierīces."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Pievienošana"
},
"connectHardwareWallet": {
"message": "Pieslēgt aparatūras maku"
},
"connectingTo": {
"message": "Pieslēdzas $1"
},
"connectingToGoerli": {
"message": "Pieslēdzas Goerli testa tīklam"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Pieslēdzas Linea Goerli testa tīklam"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Izveidot"
},
"createAccount": {
"message": "Izveidot kontu"
},
"createPassword": {
"message": "Izveidot paroli"
},
@ -411,7 +402,7 @@
"likeToImportTokens": {
"message": "Vai vēlaties pievienot šos marķierus?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli testa tīkls"
},
"links": {
@ -450,9 +441,6 @@
"mustSelectOne": {
"message": "Jāatlasa vismaz 1 marķieris."
},
"myAccounts": {
"message": "Mani konti"
},
"needImportFile": {
"message": "Jums jāatlasa fails, ko importēt",
"description": "User is important an account and needs to add a file to continue"
@ -577,9 +565,6 @@
"readdToken": {
"message": "Jūs varat šo marķieri iestatīt atpakaļ nākotnē, konta opciju izvēlnē atverot \"Pievienot marķieri\"."
},
"recents": {
"message": "Nesenie"
},
"recipientAddressPlaceholder": {
"message": "Meklēšana, publiskā adrese (0x) vai ENS"
},
@ -803,16 +788,9 @@
"transfer": {
"message": "Pārsūtīt"
},
"transferBetweenAccounts": {
"message": "Pārsūtīt starp saviem kontiem"
},
"transferFrom": {
"message": "Nosūtīt no"
},
"troubleTokenBalances": {
"message": "Mums neizdevās ielādēt marķieru bilanci. Varat tos skatīt",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Mēģināt vēlreiz"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Kembali"
},
"backToAll": {
"message": "Kembali kepada Semua"
},
"backupApprovalInfo": {
"message": "Kod rahsia ini diperlukan untuk memulihkan dompet anda sekiranya anda kehilangan peranti anda, terlupa kata laluan anda, perlu memasang semua MetaMask, atau mahu mengakses dompet anda menggunakan peranti lain."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Sambung"
},
"connectHardwareWallet": {
"message": "Sambungkan Dompet Perkakasan"
},
"connectingTo": {
"message": "Menyambungkan kepada $1"
},
"connectingToGoerli": {
"message": "Menyambung kepada Rangkaian Ujian Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Menyambung kepada Rangkaian Ujian Linea Goerli"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Cipta"
},
"createAccount": {
"message": "Cipta Akaun"
},
"createPassword": {
"message": "Cipta Kata Laluan"
},
@ -404,7 +395,7 @@
"likeToImportTokens": {
"message": "Adakah anda ingin menambah token ini?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Rangkaian Ujian Linea Goerli"
},
"links": {
@ -437,9 +428,6 @@
"mustSelectOne": {
"message": "Mesti memilih sekurang-kurangnya 1 token."
},
"myAccounts": {
"message": "Akaun Saya"
},
"needImportFile": {
"message": "Anda mesti pilih fail untuk diimport.",
"description": "User is important an account and needs to add a file to continue"
@ -561,9 +549,6 @@
"readdToken": {
"message": "Anda boleh tambah token ini kembali pada masa depan dengan pergi ke \"Tambah token\" di dalam menu pilihan akaun anda."
},
"recents": {
"message": "Baru-baru ini"
},
"recipientAddressPlaceholder": {
"message": "Cari, alamat awam (0x), atau ENS"
},
@ -784,16 +769,9 @@
"transfer": {
"message": "Pindah"
},
"transferBetweenAccounts": {
"message": "Pindahkan antara akaun saya"
},
"transferFrom": {
"message": "Pindah Daripada"
},
"troubleTokenBalances": {
"message": "Kami menghadapi masalah memuatkan baki token anda. Anda boleh melihatnya",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Cuba lagi"
},

View File

@ -69,9 +69,6 @@
"create": {
"message": "creëren"
},
"createAccount": {
"message": "Account aanmaken"
},
"decimal": {
"message": "Decimalen van precisie"
},
@ -186,9 +183,6 @@
"mustSelectOne": {
"message": "Moet ten minste één token selecteren."
},
"myAccounts": {
"message": "Mijn accounts"
},
"needImportFile": {
"message": "U moet een bestand selecteren om te importeren.",
"description": "User is important an account and needs to add a file to continue"
@ -313,10 +307,6 @@
"total": {
"message": "Totaal"
},
"troubleTokenBalances": {
"message": "We hadden problemen bij het laden van uw tokenbalansen. Je kunt ze bekijken",
"description": "Followed by a link (here) to view token balances"
},
"typePassword": {
"message": "Typ uw wachtwoord"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Tilbake"
},
"backToAll": {
"message": "Tilbake til alt"
},
"backupApprovalInfo": {
"message": "Denne hemmelige koden behøves for å gjenopprette lommeboken din i tilfelle du mister enheten din, glemmer passordet ditt, trenger å re-installere MetaMask, eller ønsker å få tilgang til lommeboken din på en annen enhet."
},
@ -151,16 +148,13 @@
"connect": {
"message": "Koble til"
},
"connectHardwareWallet": {
"message": "Koble til maskinvarelommebok"
},
"connectingTo": {
"message": "Forbinder til $1 "
},
"connectingToGoerli": {
"message": "Oppretter forbindelse med Goerli Test Network"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Oppretter forbindelse med Linea Goerli Test Network"
},
"connectingToMainnet": {
@ -190,9 +184,6 @@
"create": {
"message": "Opprett"
},
"createAccount": {
"message": "Opprett konto"
},
"createPassword": {
"message": "Opprett passord "
},
@ -438,9 +429,6 @@
"mustSelectOne": {
"message": "Må velge minst 1 token. "
},
"myAccounts": {
"message": "Mine kontoer "
},
"needImportFile": {
"message": "Du må velge en fil å importere.",
"description": "User is important an account and needs to add a file to continue"
@ -565,9 +553,6 @@
"readdToken": {
"message": "Du kan legge til dette tokenet igjen i fremtiden ved å gå til \"Legg til token\" i menyen for kontoalternativer."
},
"recents": {
"message": "Nylige"
},
"recipientAddressPlaceholder": {
"message": "Søk, offentlig adresse (0x) eller ENS"
},
@ -782,16 +767,9 @@
"transfer": {
"message": "Overfør"
},
"transferBetweenAccounts": {
"message": "Overfør mellom kontoene mine"
},
"transferFrom": {
"message": "Overfør fra"
},
"troubleTokenBalances": {
"message": "Vi hadde problemer med å laste inn sjetongsaldoen din. Du kan se dem",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Prøv igjen"
},

View File

@ -42,10 +42,6 @@
"addContact": {
"message": "Magdagdag ng contact"
},
"addCustomTokenByContractAddress": {
"message": "Walang makitang token? Puwede kang manual na magdagdag ng anumang token sa pamamagitan ng pag-paste ng address nito. Makikita ang mga address ng kontrata ng token sa $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Bibigyang-daan nito na magamit ang network na ito sa MetaMask."
},
@ -75,6 +71,10 @@
"addToken": {
"message": "Magdagdag ng Token"
},
"addTokenByContractAddress": {
"message": "Walang makitang token? Puwede kang manual na magdagdag ng anumang token sa pamamagitan ng pag-paste ng address nito. Makikita ang mga address ng kontrata ng token sa $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"advanced": {
"message": "Advanced"
},
@ -161,9 +161,6 @@
"back": {
"message": "Bumalik"
},
"backToAll": {
"message": "Bumalik sa Lahat"
},
"backupApprovalInfo": {
"message": "Ang lihim na code na ito ay kinakailangan para ma-recover ang iyong wallet sakaling maiwala mo ang iyong device, makalimutan ang iyong password, kailanganin mong i-install ulit ang MetaMask, o gusto mong i-access ang iyong wallet sa ibang device."
},
@ -252,9 +249,6 @@
"connectAccountOrCreate": {
"message": "Ikonekta ang account o gumawa ng bago"
},
"connectHardwareWallet": {
"message": "Ikonekta ang Hardware Wallet"
},
"connectManually": {
"message": "Manu-manong kumonekta sa kasalukuyang site"
},
@ -311,7 +305,7 @@
"connectingToGoerli": {
"message": "Kumokonekta sa Goerli Test Network"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Kumokonekta sa Linea Goerli Test Network"
},
"connectingToMainnet": {
@ -356,9 +350,6 @@
"create": {
"message": "Gumawa"
},
"createAccount": {
"message": "Gumawa ng Account"
},
"createPassword": {
"message": "Gumawa ng Password"
},
@ -804,7 +795,7 @@
"likeToImportTokens": {
"message": "Gusto mo bang idagdag ang mga token na ito?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli Test Network"
},
"links": {
@ -865,9 +856,6 @@
"mustSelectOne": {
"message": "Dapat pumili ng kahit 1 token lang."
},
"myAccounts": {
"message": "Mga Account Ko"
},
"name": {
"message": "Pangalan"
},
@ -1135,9 +1123,6 @@
"receive": {
"message": "Tumanggap"
},
"recents": {
"message": "Mga Kamakailan"
},
"recipientAddressPlaceholder": {
"message": "Maghanap, pampublikong address (0x), o ENS"
},
@ -1394,9 +1379,6 @@
"stateLogsDescription": {
"message": "Naglalaman ang mga log ng estado ng iyong mga address ng pampublikong account at ipinadalang transaksyon."
},
"statusConnected": {
"message": "Nakakonekta"
},
"statusNotConnected": {
"message": "Hindi nakakonekta"
},
@ -1787,9 +1769,6 @@
"transfer": {
"message": "Mag-transfer"
},
"transferBetweenAccounts": {
"message": "Mag-transfer sa iba't ibang account ko"
},
"transferFrom": {
"message": "Mag-transfer Mula Kay/Sa"
},
@ -1797,10 +1776,6 @@
"message": "Nagkaproblema kami sa pagkonekta sa iyong $1, subukang suriin ang $2 at subukan ulit.",
"description": "$1 is the wallet device name; $2 is a link to wallet connection guide"
},
"troubleTokenBalances": {
"message": "Nagkaproblema kami sa pag-load ng mga balanse ng iyong token. Puwede mong tingnan ang mga iyon ",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Subukan ulit"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Wstecz"
},
"backToAll": {
"message": "Wróć do wszystkich"
},
"backupApprovalInfo": {
"message": "Ten tajny kod jest wymagany do odzyskania portfela w przypadku zgubienia urządzenia, zapomnienia hasła, ponownego zainstalowania MetaMask lub potrzeby uzyskania dostępu do portfela na innym urządzeniu."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Połącz"
},
"connectHardwareWallet": {
"message": "Podłącz portfel sprzętowy"
},
"connectingTo": {
"message": "Łączenie z $1"
},
"connectingToGoerli": {
"message": "Łączenie z siecią testową Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Łączenie z siecią testową Linea Goerli"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Utwórz"
},
"createAccount": {
"message": "Utwórz konto"
},
"createPassword": {
"message": "Utwórz hasło"
},
@ -415,7 +406,7 @@
"likeToImportTokens": {
"message": "Czy chcesz dodać te tokeny?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Sieć testowa Linea Goerli"
},
"links": {
@ -451,9 +442,6 @@
"mustSelectOne": {
"message": "Należy wybrać co najmniej 1 token."
},
"myAccounts": {
"message": "Moje konta"
},
"needImportFile": {
"message": "Musisz wybrać plik do zaimportowania.",
"description": "User is important an account and needs to add a file to continue"
@ -575,9 +563,6 @@
"readdToken": {
"message": "Możesz później ponownie dodać ten token poprzez \"Dodaj token\" w opcjach menu swojego konta."
},
"recents": {
"message": "Ostatnie"
},
"recipientAddressPlaceholder": {
"message": "Szukaj, adres publiczny (0x) lub ENS"
},
@ -795,16 +780,9 @@
"transfer": {
"message": "Przelew"
},
"transferBetweenAccounts": {
"message": "Przelew między moimi kontami"
},
"transferFrom": {
"message": "Przelew z"
},
"troubleTokenBalances": {
"message": "Wystąpił problem z załadowaniem informacji o Twoich tokenach. Można je zobaczyć ",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Spróbuj ponownie"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "Adicionar token personalizado"
},
"addCustomTokenByContractAddress": {
"message": "Não consegue encontrar um token? Cole o endereço para adicionar manualmente qualquer token. Os endereços de contrato do token se encontram em $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Isso permitirá que essa rede seja usada dentro da MetaMask."
},
@ -263,6 +259,10 @@
"addToken": {
"message": "Adicionar token"
},
"addTokenByContractAddress": {
"message": "Não consegue encontrar um token? Cole o endereço para adicionar manualmente qualquer token. Os endereços de contrato do token se encontram em $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Endereço"
},
@ -359,12 +359,6 @@
"message": "Permitir acesso a todos os seus $1?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "Aprovar e instalar"
},
"approveAndUpdate": {
"message": "Aprovar e atualizar"
},
"approveButtonText": {
"message": "Aprovar"
},
@ -429,9 +423,6 @@
"back": {
"message": "Voltar"
},
"backToAll": {
"message": "Voltar para todos"
},
"backup": {
"message": "Backup"
},
@ -557,13 +548,6 @@
"message": "Para $1 uma transação, a taxa de gás deve ser aumentada em pelo menos 10% para que seja reconhecida pela rede.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "Cancelar swap por ~$1",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Cancelar swap gratuitamente"
},
"cancelled": {
"message": "Cancelada"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "Conectar conta ou criar nova"
},
"connectHardwareWallet": {
"message": "Conectar carteira de hardware"
},
"connectManually": {
"message": "Conectar manualmente ao site atual"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Conectando à rede de testes Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Conectando à rede de teste Linea Goerli"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "Criar"
},
"createAccount": {
"message": "Criar conta"
},
"createNewWallet": {
"message": "Criar uma nova carteira"
},
@ -1215,9 +1193,6 @@
"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."
},
"enableSmartTransactions": {
"message": "Ativar transações inteligentes"
},
"enableToken": {
"message": "ativar $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "Qualquer pessoa pode criar um token com qualquer nome, incluindo versões falsas de tokens existentes. Adicione e negocie por sua conta e risco!"
},
"importTokens": {
"message": "importar tokens"
},
"importTokensCamelCase": {
"message": "Importar tokens"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "Gostaria de adicionar estes tokens?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Rede de teste Linea Goerli"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "Solicite aqui"
},
"missingToken": {
"message": "Não está vendo seu token?"
},
"moreComingSoon": {
"message": "Mais em breve..."
},
"mustSelectOne": {
"message": "Deve escolher no mínimo 1 token."
},
"myAccounts": {
"message": "Minhas contas"
},
"name": {
"message": "Nome"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "Não há gás suficiente"
},
"notifications": {
"message": "Notificações"
},
"notifications10ActionText": {
"message": "Visite nas configurações",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2817,9 +2780,6 @@
"receive": {
"message": "Receber"
},
"recents": {
"message": "Recentes"
},
"recipientAddressPlaceholder": {
"message": "Pesquisa, endereço público (0x) ou ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "Selecione essa opção para mostrar o campo de dados hexadecimais na tela de envio"
},
"showHide": {
"message": "Mostrar/ocultar"
},
"showIncomingTransactions": {
"message": "Mostrar transações recebidas"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "Compreendo que, até fazer o backup da minha Frase de Recuperação Secreta, poderei perder minhas contas e todos os ativos contidos nela."
},
"smartTransaction": {
"message": "Transação inteligente"
},
"snapContent": {
"message": "Esse conteúdo vem de $1",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "Instalar snap"
},
"snapInstallWarningCheck": {
"message": "Para confirmar que você entende, marque a caixa."
"message": "Para confirmar que você entende, marque a caixa.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "Para confirmar que você entende, marque todas as caixas."
"message": "Para confirmar que você entende, marque todas as caixas.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "Você está concedendo ao snap \"$1\" acesso à sua chave $2. Isso é irrevogável e concede a \"$1\" controle de suas contas e ativos $2. Certifique-se de que confia em \"$1\" antes de prosseguir.",
@ -3416,9 +3372,6 @@
"status": {
"message": "Status"
},
"statusConnected": {
"message": "Conectado"
},
"statusNotConnected": {
"message": "Não conectado"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "Forte"
},
"stxAreHere": {
"message": "As transações inteligentes chegaram!"
},
"stxBenefit1": {
"message": "Minimize os custos das transações"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "Tente fazer sua swap novamente. Estaremos aqui para te proteger contra riscos semelhantes no futuro."
},
"stxDescription": {
"message": "As swaps na MetaMask ficaram muito mais inteligentes! A ativação de Transações Inteligentes permite que o MetaMask otimize programaticamente suas swaps para evitar:"
},
"stxErrorNotEnoughFunds": {
"message": "Insuficiência de fundos para fazer uma transação inteligente."
},
"stxErrorUnavailable": {
"message": "Indisponibilidade temporária de Transações Inteligentes."
},
"stxFailure": {
"message": "Falha na troca"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "Enviando seu swap de forma pública..."
},
"stxSubDescription": {
"message": "* A função de Transações Inteligentes tentará enviar a sua transação várias vezes de forma privada. Se todas as tentativas falharem, a transação será transmitida publicamente para garantir que sua Swap seja realizada com sucesso."
},
"stxSuccess": {
"message": "Swap concluído!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "Ativar/desativar solicitações eth_sign"
},
"toggleTestNetworks": {
"message": "$1 redes de teste",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Token"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "Transferir"
},
"transferBetweenAccounts": {
"message": "Transferir entre minhas contas"
},
"transferFrom": {
"message": "Transferir de"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "A MetaMask teve problemas para iniciar. Esse erro pode ser intermitente, por isso tente reiniciar a extensão."
},
"troubleTokenBalances": {
"message": "Tivemos um problema a carregar o balanço dos seus tokens. Pode vê-los em ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "Ao conceder permissão, você estará autorizando que o $1 a seguir acesse seus fundos"
},

View File

@ -103,10 +103,6 @@
"addCustomToken": {
"message": "Adicionar token personalizado"
},
"addCustomTokenByContractAddress": {
"message": "Não consegue encontrar um token? Cole o endereço para adicionar manualmente qualquer token. Os endereços de contrato do token se encontram em $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Isso permitirá que essa rede seja usada dentro da MetaMask."
},
@ -139,6 +135,10 @@
"addToken": {
"message": "Adicionar token"
},
"addTokenByContractAddress": {
"message": "Não consegue encontrar um token? Cole o endereço para adicionar manualmente qualquer token. Os endereços de contrato do token se encontram em $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Endereço"
},
@ -250,9 +250,6 @@
"back": {
"message": "Voltar"
},
"backToAll": {
"message": "Voltar para todos"
},
"backupApprovalInfo": {
"message": "Esse código secreto é obrigatório para recuperar sua carteira caso você perca seu dispositivo, esqueça sua senha, precise reinstalar a MetaMask ou queira acessar sua carteira em outro dispositivo."
},
@ -389,9 +386,6 @@
"connectAccountOrCreate": {
"message": "Conectar conta ou criar nova"
},
"connectHardwareWallet": {
"message": "Conectar carteira de hardware"
},
"connectManually": {
"message": "Conectar manualmente ao site atual"
},
@ -448,7 +442,7 @@
"connectingToGoerli": {
"message": "Conectando à rede de testes Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Conectando à rede de testes Linea Goerli"
},
"connectingToMainnet": {
@ -499,9 +493,6 @@
"create": {
"message": "Criar"
},
"createAccount": {
"message": "Criar conta"
},
"createNewWallet": {
"message": "Criar uma nova carteira"
},
@ -1091,9 +1082,6 @@
"importTokenWarning": {
"message": "Qualquer pessoa pode criar um token com qualquer nome, incluindo versões falsas de tokens existentes. Adicione e negocie por sua conta e risco!"
},
"importTokens": {
"message": "importar tokens"
},
"importTokensCamelCase": {
"message": "Importar tokens"
},
@ -1257,7 +1245,7 @@
"likeToImportTokens": {
"message": "Você gostaria de importar esses tokens?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Rede de testes Linea Goerli"
},
"link": {
@ -1351,15 +1339,9 @@
"missingNFT": {
"message": "Não está vendo o seu NFT?"
},
"missingToken": {
"message": "Não está vendo o seu token?"
},
"mustSelectOne": {
"message": "Selecione pelo menos 1 token."
},
"myAccounts": {
"message": "Minhas contas"
},
"name": {
"message": "Nome"
},
@ -1812,9 +1794,6 @@
"receive": {
"message": "Receber"
},
"recents": {
"message": "Recentes"
},
"recipientAddressPlaceholder": {
"message": "Busca, endereço público (0x) ou ENS"
},
@ -2064,9 +2043,6 @@
"showHexDataDescription": {
"message": "Selecione essa opção para mostrar o campo de dados hexadecimais na tela de envio"
},
"showHide": {
"message": "Mostrar/ocultar"
},
"showIncomingTransactions": {
"message": "Mostrar transações recebidas"
},
@ -2168,9 +2144,6 @@
"stateLogsDescription": {
"message": "Os registros de estado contêm os endereços da sua conta pública e as transações enviadas."
},
"statusConnected": {
"message": "Conectado"
},
"statusNotConnected": {
"message": "Não conectado"
},
@ -2549,10 +2522,6 @@
"message": "Para: $1",
"description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress"
},
"toggleTestNetworks": {
"message": "$1 redes de teste",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Token"
},
@ -2682,9 +2651,6 @@
"transfer": {
"message": "Transferir"
},
"transferBetweenAccounts": {
"message": "Transferência entre minhas contas"
},
"transferFrom": {
"message": "Transferir de"
},
@ -2692,10 +2658,6 @@
"message": "Tivemos dificuldade para conectar-nos à sua $1. Revise $2 e tente novamente.",
"description": "$1 is the wallet device name; $2 is a link to wallet connection guide"
},
"troubleTokenBalances": {
"message": "Tivemos dificuldade para carregar os saldos do seu token. Você pode vê-los ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "Ao conceder permissão, você estará autorizando que o $1 a seguir acesse seus fundos"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Înapoi"
},
"backToAll": {
"message": "Înapoi la toate"
},
"backupApprovalInfo": {
"message": "Acest cod secret este necesar pentru recuperarea portofelului în cazul în care pierdeți dispozitivul, uitați parola, trebuie să reinstalați MetaMask sau vreți să accesați portofelul de pe alt dispozitiv."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Conectează-te"
},
"connectHardwareWallet": {
"message": "Conectare portofel hardware"
},
"connectingTo": {
"message": "Se conectează la $1"
},
"connectingToGoerli": {
"message": "Se conectează la rețeaua de test Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Se conectează la rețeaua de test Linea Goerli"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Creați"
},
"createAccount": {
"message": "Creați cont"
},
"createPassword": {
"message": "Creare parolă"
},
@ -405,7 +396,7 @@
"likeToImportTokens": {
"message": "Adăugați aceste indicative?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Rețea de test Linea Goerli"
},
"links": {
@ -441,9 +432,6 @@
"mustSelectOne": {
"message": "Trebuie să selectați cel puțin 1 simbol."
},
"myAccounts": {
"message": "Conturile mele"
},
"needImportFile": {
"message": "Trebuie să selectați un fișier pentru importare.",
"description": "User is important an account and needs to add a file to continue"
@ -568,9 +556,6 @@
"readdToken": {
"message": "Puteți adăuga din nou acest indicativ în viitor accesând „Adăugați indicativ” din meniul de opțiuni al contului dvs."
},
"recents": {
"message": "Recente"
},
"recipientAddressPlaceholder": {
"message": "Căutare, adresa publică (0x) sau ENS"
},
@ -788,16 +773,9 @@
"transactionUpdated": {
"message": "Tranzacție actualizată la $2."
},
"transferBetweenAccounts": {
"message": "Transferă între conturile mele"
},
"transferFrom": {
"message": "Transferați de la"
},
"troubleTokenBalances": {
"message": "Am avut dificultăți cu încărcarea soldurilor dvs. de tokenuri. Le puteți vizualiza",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Încearcă din nou"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "Добавить пользовательский токен"
},
"addCustomTokenByContractAddress": {
"message": "Не можете найти токен? Можно вручную добавить любой токен, вставив его адрес. Адреса контракта токена можно найти на $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Это позволит использовать эту сеть в MetaMask."
},
@ -263,6 +259,10 @@
"addToken": {
"message": "Добавить токен"
},
"addTokenByContractAddress": {
"message": "Не можете найти токен? Можно вручную добавить любой токен, вставив его адрес. Адреса контракта токена можно найти на $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Адрес"
},
@ -359,12 +359,6 @@
"message": "Разрешить доступ ко всем вашим $1?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "Одобрить и установить"
},
"approveAndUpdate": {
"message": "Утвердить и обновить"
},
"approveButtonText": {
"message": "Одобрить"
},
@ -429,9 +423,6 @@
"back": {
"message": "Назад"
},
"backToAll": {
"message": "Назад ко всем"
},
"backup": {
"message": "Резервное копирование"
},
@ -557,13 +548,6 @@
"message": "Чтобы $1 транзакции плата за газ должна быть увеличена как минимум на 10%. Это позволит обеспечить прием транзакции сетью.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "Отменить обмен на ~$1",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Отменить обмен бесплатно"
},
"cancelled": {
"message": "Отменено"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "Подключите счет или создайте новый"
},
"connectHardwareWallet": {
"message": "Подключить аппаратный кошелек"
},
"connectManually": {
"message": "Подключиться к текущему сайту вручную"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Подключение к тестовой сети Goerli..."
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Подключение к тестовой сети Linea..."
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "Создать"
},
"createAccount": {
"message": "Создать счет"
},
"createNewWallet": {
"message": "Создать новый кошелек"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "Используйте API OpenSea для получения данных NFT. Для автоматического обнаружения NFT используется API OpenSea, и такое обнаружение будет недоступно, если этот API отключен."
},
"enableSmartTransactions": {
"message": "Включить смарт-транзакции"
},
"enableToken": {
"message": "активирует для $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "Кто угодно может создать токен с любым именем, включая поддельные версии существующих токенов. Добавляйте и торгуйте на свой страх и риск!"
},
"importTokens": {
"message": "импорт токенов"
},
"importTokensCamelCase": {
"message": "Импорт токенов"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "Вы хотели бы импортировать эти токены?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Тестовая сеть Linea Goerli"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "Запросите здесь"
},
"missingToken": {
"message": "Не видите свой токен?"
},
"moreComingSoon": {
"message": "Скоро появится больше..."
},
"mustSelectOne": {
"message": "Необходимо выбрать хотя бы 1 токен."
},
"myAccounts": {
"message": "Мои счета"
},
"name": {
"message": "Имя"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "Недостаточно газа"
},
"notifications": {
"message": "Уведомления"
},
"notifications10ActionText": {
"message": "Смотреть в настройках",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2817,9 +2780,6 @@
"receive": {
"message": "Получить"
},
"recents": {
"message": "Недавние"
},
"recipientAddressPlaceholder": {
"message": "Поиск, открытый адрес (0x) или ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "Выберите эту опцию, чтобы отобразить поле шестнадцатеричных данных на экране отправки"
},
"showHide": {
"message": "Показать/скрыть"
},
"showIncomingTransactions": {
"message": "Показать входящие транзакции"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "Я понимаю, что, если я не создам резервную копию своей секретной фразы для восстановления, я могу потерять доступ ко всем своим счетам и всем средствам на них."
},
"smartTransaction": {
"message": "Смарт-транзакция"
},
"snapContent": {
"message": "Этот контент поступает от $1",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "Установить снап"
},
"snapInstallWarningCheck": {
"message": "Чтобы подтвердить, что вы понимаете, отметьте все."
"message": "Чтобы подтвердить, что вы понимаете, отметьте все.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "Чтобы подтвердить, что вы понимаете, отметьте все ячейки."
"message": "Чтобы подтвердить, что вы понимаете, отметьте все ячейки.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "Вы предоставляете ключ доступа $2 к привязке \"$1\". Это действие нельзя отменить, и оно предоставляет \"$1\" управление всеми счетами и активами $2. Перед тем как продолжить, убедитесь, что доверяете \"$1\".",
@ -3416,9 +3372,6 @@
"status": {
"message": "Статус"
},
"statusConnected": {
"message": "Подключено"
},
"statusNotConnected": {
"message": "Не подключено"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "Сильный"
},
"stxAreHere": {
"message": "Появились смарт-транзакции!"
},
"stxBenefit1": {
"message": "Минимизируйте транзакционные издержки"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "Попробуйте обменять еще раз. Мы готовы защитить вас от подобных рисков в следующий раз."
},
"stxDescription": {
"message": "Функция обмена в MetaMask стала намного умнее! Включение смарт-транзакций позволит MetaMask программно оптимизировать ваш обмен, чтобы помочь:"
},
"stxErrorNotEnoughFunds": {
"message": "Недостаточно средств для смарт-транзакции."
},
"stxErrorUnavailable": {
"message": "Смарт-транзакции временно недоступны."
},
"stxFailure": {
"message": "Обмен не удался"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "Публичная отправка вашей операции обмена..."
},
"stxSubDescription": {
"message": "* Смарт-транзакции попытаются несколько раз отправить вашу транзакцию в конфиденциальном порядке. Если все попытки не увенчаются успехом, транзакция будет показана публично, чтобы гарантировать успешное завершение вашего обмена."
},
"stxSuccess": {
"message": "Обмен завершен!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "Переключить запросы eth_sign"
},
"toggleTestNetworks": {
"message": "$1 тестовые сети",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Токен"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "Перевести"
},
"transferBetweenAccounts": {
"message": "Перевод между моими счетами"
},
"transferFrom": {
"message": "Перевести с"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "У MetaMask возникли проблемы с запуском. Эта ошибка может быть непостоянной, поэтому попробуйте перезапустить расширение."
},
"troubleTokenBalances": {
"message": "У нас возникли проблемы с загрузкой вашего баланса токенов. Вы можете просмотреть их ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "Давая разрешение, вы предоставляете следующему $1 доступ к вашим средствам."
},

View File

@ -90,9 +90,6 @@
"back": {
"message": "Zpět"
},
"backToAll": {
"message": "Späť na všetko"
},
"backupApprovalInfo": {
"message": "Tento tajný kód je potrebný na obnovenie peňaženky v prípade straty zariadenia, zabudnutia hesla, preinštalovania MetaMask alebo prístupu k peňaženke na inom zariadení."
},
@ -148,16 +145,13 @@
"connect": {
"message": "Pripojenie"
},
"connectHardwareWallet": {
"message": "Pripojiť hardvérovú peňaženku"
},
"connectingTo": {
"message": "Pripája sa k $1"
},
"connectingToGoerli": {
"message": "Pripája sa k testovacej sieti Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Pripája sa k testovacej sieti Linea Goerli"
},
"connectingToMainnet": {
@ -187,9 +181,6 @@
"create": {
"message": "Vytvořit"
},
"createAccount": {
"message": "Vytvořit účet"
},
"createPassword": {
"message": "Vytvoriť heslo"
},
@ -402,7 +393,7 @@
"likeToImportTokens": {
"message": "Chcete přidat tyto tokeny?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Testovacia sieť Linea Goerli"
},
"links": {
@ -429,9 +420,6 @@
"mustSelectOne": {
"message": "Musíte zvolit aspoň 1 token."
},
"myAccounts": {
"message": "Moje účty"
},
"needImportFile": {
"message": "Musíte zvolit soubor k importu.",
"description": "User is important an account and needs to add a file to continue"
@ -553,9 +541,6 @@
"readdToken": {
"message": "Tento token můžete v budoucnu přidat zpět s „Přidat token“ v nastavení účtu."
},
"recents": {
"message": "Posledné"
},
"recipientAddressPlaceholder": {
"message": "Vyhľadávať verejnú adresu (0x) alebo ENS"
},
@ -773,16 +758,9 @@
"transfer": {
"message": "Prevod"
},
"transferBetweenAccounts": {
"message": "Prevod medzi mojimi účtami"
},
"transferFrom": {
"message": "Presun z"
},
"troubleTokenBalances": {
"message": "Měli jsme problém s načtením vašich tokenových zůstatků. Můžete je vidět ",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Skúsiť znova"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Nazaj"
},
"backToAll": {
"message": "Nazaj na vse"
},
"backupApprovalInfo": {
"message": "Ta skrivna koda je potrebna za obnovitev denarnice, če izgubite napravo, pozabite geslo, ponovno namestite MetaMask ali želite dostopati do denarnice v drugi napravi."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Poveži"
},
"connectHardwareWallet": {
"message": "Poveži strojno denarnico"
},
"connectingTo": {
"message": "Povezovanje na $1"
},
"connectingToGoerli": {
"message": "Povezovanje na testno omrežje Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Povezovanje na testno omrežje Linea Goerli"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Ustvari"
},
"createAccount": {
"message": "Ustvari račun"
},
"createPassword": {
"message": "Ustvari geslo"
},
@ -409,7 +400,7 @@
"likeToImportTokens": {
"message": "Želite dodati te žetone?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Testno omrežje Linea Goerli"
},
"links": {
@ -442,9 +433,6 @@
"mustSelectOne": {
"message": "Izbran mora biti vsaj 1 žeton."
},
"myAccounts": {
"message": "Moji računi"
},
"needImportFile": {
"message": "Za uvoz morate izbrati datoteko.",
"description": "User is important an account and needs to add a file to continue"
@ -569,9 +557,6 @@
"readdToken": {
"message": "Ta žeton lahko dodate tudi kasneje z uporabo gumba “Dodaj žeton” v možnostih vašega računa."
},
"recents": {
"message": "Nedavno"
},
"recipientAddressPlaceholder": {
"message": "Iskanje, javni naslov (0x) ali ENS"
},
@ -795,16 +780,9 @@
"transfer": {
"message": "Prenesi"
},
"transferBetweenAccounts": {
"message": "Prenos med mojimi računi"
},
"transferFrom": {
"message": "Prenesi od"
},
"troubleTokenBalances": {
"message": "Če imate težave pri ogledu zneskov žetonov si jih lahko ogledate ",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Poskusi znova"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Назад"
},
"backToAll": {
"message": "Povratak na Sve"
},
"backupApprovalInfo": {
"message": "Potreban je tajni kôd za oporavak vašeg novčanika u slučaju da izgubite uređaj, zaboravite lozinku, morate ponovo da instalirate MetaMask ili želite da pristupite novčaniku sa drugog uređaja."
},
@ -151,16 +148,13 @@
"connect": {
"message": "Повезивање"
},
"connectHardwareWallet": {
"message": "Povežite Hardverski novčanik"
},
"connectingTo": {
"message": "Povezuje se na $1"
},
"connectingToGoerli": {
"message": "Povezuje se sa test mrežom Goerli "
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Povezuje se sa test mrežom Linea Goerli"
},
"connectingToMainnet": {
@ -190,9 +184,6 @@
"create": {
"message": "Направи"
},
"createAccount": {
"message": "Kreirajte nalog"
},
"createPassword": {
"message": "Kreirajte lozinku"
},
@ -412,7 +403,7 @@
"likeToImportTokens": {
"message": "Želite li da dodate ove tokene?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Test mreža Linea Goerli"
},
"links": {
@ -445,9 +436,6 @@
"mustSelectOne": {
"message": "Morate izabrati najmanje 1 token."
},
"myAccounts": {
"message": "Moji nalozi"
},
"needImportFile": {
"message": "Morate izabrati fajl koji ćete uvesti.",
"description": "User is important an account and needs to add a file to continue"
@ -572,9 +560,6 @@
"readdToken": {
"message": "U budućnosti možete vratiti ovaj token tako što ćete otvoriti „Dodaj token“ u meniju opcija vašeg naloga."
},
"recents": {
"message": "Skorašnje"
},
"recipientAddressPlaceholder": {
"message": "Pretraga, javna adresa (0x) ili ENS"
},
@ -795,16 +780,9 @@
"transfer": {
"message": "Prenos"
},
"transferBetweenAccounts": {
"message": "Prenos između mojih naloga"
},
"transferFrom": {
"message": "Prebacite iz"
},
"troubleTokenBalances": {
"message": "Imali smo problema sa učitavanjem bilansa Vaših tokena. Možete ih pogledati",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Пробај поново"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Bakåt"
},
"backToAll": {
"message": "Tillbaka till Alla"
},
"backupApprovalInfo": {
"message": "Den hemliga koden krävs för att komma åt din plånbok ifall du tappar bort din enhet, glömmer ditt lösenord, behöver installera om MetaMask eller om du vill komma åt din plånbok på en annan enhet."
},
@ -148,16 +145,13 @@
"connect": {
"message": "Ansluta"
},
"connectHardwareWallet": {
"message": "Anslut hårdvaruplånbok"
},
"connectingTo": {
"message": "Ansluter till $1"
},
"connectingToGoerli": {
"message": "Ansluter till Goerli Test Network"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Ansluter till Linea Goerli Test Network"
},
"connectingToMainnet": {
@ -187,9 +181,6 @@
"create": {
"message": "Skapa"
},
"createAccount": {
"message": "Skapa konto"
},
"createPassword": {
"message": "Skapa lösenord"
},
@ -405,7 +396,7 @@
"likeToImportTokens": {
"message": "Vill du lägga till dessa tokens?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli testnätverk"
},
"links": {
@ -438,9 +429,6 @@
"mustSelectOne": {
"message": "Minst 1 token måste väljas."
},
"myAccounts": {
"message": "Mina konton"
},
"needImportFile": {
"message": "Du måste välja en fil att importera.",
"description": "User is important an account and needs to add a file to continue"
@ -565,9 +553,6 @@
"readdToken": {
"message": "Du kan lägga till denna token i framtiden genom att välja \"Lägg till token\" i kontots alternativmeny."
},
"recents": {
"message": "Senaste"
},
"recipientAddressPlaceholder": {
"message": "Sök, allmän adress (0x) eller ENS"
},
@ -782,16 +767,9 @@
"transfer": {
"message": "Överföring"
},
"transferBetweenAccounts": {
"message": "Överför mellan mina konton"
},
"transferFrom": {
"message": "Överför från"
},
"troubleTokenBalances": {
"message": "Vi hade problem med att ladda dina token-saldon. Du kan se dem",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Försök igen"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Nyuma"
},
"backToAll": {
"message": "Rudi kwenye Zote"
},
"backupApprovalInfo": {
"message": "Msimbo huu wa siri unahitajika ili kurejesha waleti yako ikitokea umepoteza kifaa chako, umesahau nenosiri lako, umelazimika kusakinisha MetaMask, au unataka kufikia waleti yako kwenye kifaa kingine."
},
@ -148,16 +145,13 @@
"connect": {
"message": "Unganisha"
},
"connectHardwareWallet": {
"message": "Unganisha Waleti ya Programu Maunzi"
},
"connectingTo": {
"message": "Inaunganisha kwenye $1"
},
"connectingToGoerli": {
"message": "Inaunganisha kwenye Mtandao wa Majaribio wa Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Inaunganisha kwenye Mtandao wa Majaribio wa Linea Goerli"
},
"connectingToMainnet": {
@ -187,9 +181,6 @@
"create": {
"message": "Unda"
},
"createAccount": {
"message": "Fungua Akaunti"
},
"createPassword": {
"message": "Unda Nenosiri"
},
@ -402,7 +393,7 @@
"likeToImportTokens": {
"message": "Je, ungependa kuongeza vianzio hivi?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Mtandao wa Majaribio wa Linea Goerli"
},
"links": {
@ -432,9 +423,6 @@
"mustSelectOne": {
"message": "Lazima uchague angalau kianzio 1."
},
"myAccounts": {
"message": "Akaunti zangu"
},
"needImportFile": {
"message": "Unapaswa kuchagua faili la kuhamisha.",
"description": "User is important an account and needs to add a file to continue"
@ -559,9 +547,6 @@
"readdToken": {
"message": "Unaweza kuongeza tena kianzio hiki hapo baadaye kwa kwenda kwenye \"Ongeza kianzio\" kwenye machaguo yako ya menyu ya akaunti."
},
"recents": {
"message": "Za hivi karibuni"
},
"recipientAddressPlaceholder": {
"message": "Tafuta, anwani za umma (0x), au ENS"
},
@ -785,16 +770,9 @@
"transfer": {
"message": "Kutuma"
},
"transferBetweenAccounts": {
"message": "Kutuma baina ya akaunti zangu"
},
"transferFrom": {
"message": "Tuma Kutoka"
},
"troubleTokenBalances": {
"message": "Tulipata shida kupakia salio lako la kianzio. Unaweza kuliona",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Jaribu tena"
},

View File

@ -96,9 +96,6 @@
"create": {
"message": "உருவாக்கு"
},
"createAccount": {
"message": "உங்கள் கணக்கை துவங்குங்கள்"
},
"custom": {
"message": "மேம்பட்டவை"
},
@ -252,9 +249,6 @@
"mustSelectOne": {
"message": "குறைந்தது 1 டோக்கனை தேர்ந்தெடுக்க வேண்டும்."
},
"myAccounts": {
"message": "எனது கணக்குகள்"
},
"needImportFile": {
"message": "இறக்குமதி செய்ய ஒரு கோப்பை நீங்கள் தேர்ந்தெடுக்க வேண்டும்.",
"description": "User is important an account and needs to add a file to continue"
@ -434,10 +428,6 @@
"transactionError": {
"message": "பரிவர்த்தனை பிழை. விதிமுறை ஒப்பந்தத்தில் விதிவிலக்கு."
},
"troubleTokenBalances": {
"message": "உங்கள் டோக்கன் நிலுவைகளை ஏற்றுவதில் சிக்கல் ஏற்பட்டது. நீங்கள் அவர்களை பார்க்க முடியும்.",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "மீண்டும் முயல்க"
},

View File

@ -87,9 +87,6 @@
"create": {
"message": "สร้าง"
},
"createAccount": {
"message": "สร้างบัญชี"
},
"currencyConversion": {
"message": "การแปลงสกุลเงิน"
},
@ -237,9 +234,6 @@
"mustSelectOne": {
"message": "ต้องเลือกอย่างน้อย 1 โทเค็น"
},
"myAccounts": {
"message": "บัญชีของฉัน"
},
"needImportFile": {
"message": "คุณต้องเลือกไฟล์ที่จะนำเข้า",
"description": "User is important an account and needs to add a file to continue"
@ -398,13 +392,6 @@
"transactionDropped": {
"message": "ธุรกรรมถูกยกเลิกเมื่อ $2"
},
"transferBetweenAccounts": {
"message": "โอนระหว่างบัญชีของฉัน"
},
"troubleTokenBalances": {
"message": "เรามีปัญหาในการโหลดยอดโทเค็นคงเหลือของคุณ คุณสามารถดูได้ที่นี่",
"description": "Followed by a link (here) to view token balances"
},
"typePassword": {
"message": "พิมพ์รหัสผ่านของคุณ"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "Magdagdag ng Custom na Token"
},
"addCustomTokenByContractAddress": {
"message": "Hindi makahanap ng token? Maaari kang manu-manong magdagdag ng anumang token sa pamamagitan ng pag-paste ng address nito. Ang mga address ng token contract ay matatagpuan sa $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Magpapahintulot ito sa network na ito na gamitin sa loob ng MetaMask."
},
@ -263,6 +259,10 @@
"addToken": {
"message": "Magdagdag ng Token"
},
"addTokenByContractAddress": {
"message": "Hindi makahanap ng token? Maaari kang manu-manong magdagdag ng anumang token sa pamamagitan ng pag-paste ng address nito. Ang mga address ng token contract ay matatagpuan sa $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Address"
},
@ -359,12 +359,6 @@
"message": "Payagan ang pag-access at paglipat ng lahat ng iyong $1?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "Aprubahan at I-install"
},
"approveAndUpdate": {
"message": "Aprubahan at i-update"
},
"approveButtonText": {
"message": "Aprubahan"
},
@ -429,9 +423,6 @@
"back": {
"message": "Bumalik"
},
"backToAll": {
"message": "Bumalik sa Lahat"
},
"backup": {
"message": "I-backup"
},
@ -557,13 +548,6 @@
"message": "Sa $1 na transaksyon ang singil sa gas ay dapat tumaas nang hindi bababa sa 10% para ito ay makilala ng network.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "Kanselahin ang swap sa halagang ~$1",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Kanselahin ang swap nang libre"
},
"cancelled": {
"message": "Nakansela"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "Ikonekta ang account o gumawa ng bago"
},
"connectHardwareWallet": {
"message": "Ikonekta ang hardware wallet"
},
"connectManually": {
"message": "Manu-manong kumonekta sa kasalukuyang site"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Kumokonekta sa Goerli Test Network"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Kumokonekta sa Linea Goerli test network"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "Gumawa"
},
"createAccount": {
"message": "Gumawa ng account"
},
"createNewWallet": {
"message": "Gumawa ng bagong wallet"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "Gamitin ang API ng Opensea upang kunin ang NFT data. ang NFT auto-detection ay umaasa sa API ng OpenSea, at hindi magiging available kapag ito ay isinara."
},
"enableSmartTransactions": {
"message": "Payagan ang mga smart transaction"
},
"enableToken": {
"message": "paganahin ang $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "Sinumang ay maaaring lumikha ng token gamit ang alinmang pangalan, kabilang ang mga pekeng bersyon ng umiiral na mga token. Magdagdag at mag-trade sa sarili mong panganib!"
},
"importTokens": {
"message": "magdagdag ng mga token"
},
"importTokensCamelCase": {
"message": "Mag-import ng mga Token"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "Gusto mo bang idagdag ang mga token na ito?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli test network"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "Hilingin dito"
},
"missingToken": {
"message": "Hindi mo ba nakikita ang iyong mga token?"
},
"moreComingSoon": {
"message": "Marami pang parating..."
},
"mustSelectOne": {
"message": "Dapat pumili ng kahit 1 token lang."
},
"myAccounts": {
"message": "Mga Account Ko"
},
"name": {
"message": "Pangalan"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "Hindi Sapat ang Gas"
},
"notifications": {
"message": "Mga Abiso"
},
"notifications10ActionText": {
"message": "Bisitahin sa mga setting",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2817,9 +2780,6 @@
"receive": {
"message": "Tumanggap"
},
"recents": {
"message": "Mga Kamakailan"
},
"recipientAddressPlaceholder": {
"message": "Maghanap, pampublikong address (0x), o ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "Piliin ito para ipakita ang field ng hex data sa screen ng pagpapadala"
},
"showHide": {
"message": "Ipakita/itago"
},
"showIncomingTransactions": {
"message": "Ipakita ang Mga Papasok na Transaksyon"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "Nauunawaan ko na hanggang sa i-back up ko ang aking Secret Recovery Phrase, maaari kong maiwala ang aking mga account at lahat ng kanilang mga asset."
},
"smartTransaction": {
"message": "Smart Transaction"
},
"snapContent": {
"message": "Ang nilalamang ito ay nagmumula sa $1",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "I-install ang snap"
},
"snapInstallWarningCheck": {
"message": "Para kumpirmahing naunawaan mo, tsekan lahat."
"message": "Para kumpirmahing naunawaan mo, tsekan lahat.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "Para kumpirmahin na naiintindihan mo, lagyan ng tsek ang lahat ng kahon."
"message": "Para kumpirmahin na naiintindihan mo, lagyan ng tsek ang lahat ng kahon.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "Binibigyan mo ang $2 ng key access sa snap na \"$1\". Hindi na ito mababawi at nagbibigay ito sa \"$1\" ng kontrol sa iyong mga $2 account at asset. Tiyaking pinagkakatiwalaan mo ang \"$1\" bago magpatuloy.",
@ -3416,9 +3372,6 @@
"status": {
"message": "Istado"
},
"statusConnected": {
"message": "Nakakonekta"
},
"statusNotConnected": {
"message": "Hindi konektado"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "Mahirap"
},
"stxAreHere": {
"message": "Narito na ang mga Smart Transaction!"
},
"stxBenefit1": {
"message": "Bawasan ang mga gastos sa transaksyon"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "Subukan muli ang iyong pagpapalit. Narito kami para protektahan ka sa mga katulad na panganib sa susunod."
},
"stxDescription": {
"message": "Mas humusay pa ang mga Pagpapalit sa MetaMask! Papayagan ng Pagpapagana sa mga Smart Transaction ang MetaMask na pahusayin ang iyong Pagpapalit gamit ang program para makatulong sa: "
},
"stxErrorNotEnoughFunds": {
"message": "Hindi sapat na pondo para sa smart transaction."
},
"stxErrorUnavailable": {
"message": "Pansamantalang hindi available ang mga Smart Transaction."
},
"stxFailure": {
"message": "Hindi matagumpay ang pag-swap"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "Pampublikong isinusumite ang iyong Swap..."
},
"stxSubDescription": {
"message": "* Susubukan ng mga Smart Transaction na isumite nang pribado ang iyong transaksyon, maraming beses. Kapag nabigo ang lahat ng pagsubok, ipapakita sa publiko ang transaksyon upang matiyak na ang Pagpapalit ay naging matagupay."
},
"stxSuccess": {
"message": "Nakumpleto ang pagpapalit!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "I-toggle ang mga kahilingan sa eth_sign"
},
"toggleTestNetworks": {
"message": "$1 na test network",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Token"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "Mag-transfer"
},
"transferBetweenAccounts": {
"message": "Mag-transfer sa iba't ibang account ko"
},
"transferFrom": {
"message": "Mag-transfer Mula Kay/Sa"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "Nagkaproblema ang MetaMask sa pagsisimula. Maaaring paulit-ulit ang error na ito, kaya subukang i-restart ang extension."
},
"troubleTokenBalances": {
"message": "Nagkaproblema kami sa pag-load ng mga balanse ng iyong token. Puwede mong tingnan ang mga iyon ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "Sa pamamagitan ng pagbibigay ng pahintulot, pinapayagan mo ang sumusunod na $1 para ma-access ang pondo mo"
},
@ -4361,7 +4288,7 @@
"message": "Magsimula na tayo"
},
"welcomeToMetaMaskIntro": {
"message": "Ang Metamask na pinagkakatiwalaan ng milyun-milyon ay isang ligtas na wallet na ginagawang accessible ang mundo ng web3 para sa lahat."
"message": "Ang MetaMask na pinagkakatiwalaan ng milyun-milyon ay isang ligtas na wallet na ginagawang accessible ang mundo ng web3 para sa lahat."
},
"whatsNew": {
"message": "Ano'ng bago",

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "Özel token ekle"
},
"addCustomTokenByContractAddress": {
"message": "Bir tokeni bulamadınız mı? Adresini yapıştırarak dilediğiniz tokeni manuel olarak ekleyebilirsiniz. Token sözleşme adreslerini $1 alanında bulabilirsiniz.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Bu, bu ağın MetaMas dahilinde kullanılmasına olanak tanıyacaktır."
},
@ -263,6 +259,10 @@
"addToken": {
"message": "Token ekle"
},
"addTokenByContractAddress": {
"message": "Bir tokeni bulamadınız mı? Adresini yapıştırarak dilediğiniz tokeni manuel olarak ekleyebilirsiniz. Token sözleşme adreslerini $1 alanında bulabilirsiniz",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Adres"
},
@ -359,12 +359,6 @@
"message": "Sahip olduğun tüm $1 için erişim ve transfer izni verilsin mi?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "Onayla ve Yükle"
},
"approveAndUpdate": {
"message": "Onayla ve güncelle"
},
"approveButtonText": {
"message": "Onayla"
},
@ -429,9 +423,6 @@
"back": {
"message": "Geri"
},
"backToAll": {
"message": "Tümüne Geri Git"
},
"backup": {
"message": "Yedekle"
},
@ -557,13 +548,6 @@
"message": "İşlemi $1 için, gaz ücretinin ağ tarafından tanınması amacıyla en az %10 oranında artırılması gerekir.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "~$1 için swap işlemini iptal edin",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Swap işlemini ücretsiz iptal edin"
},
"cancelled": {
"message": "İptal edildi"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "Hesabı bağla ya da yeni hesap oluştur"
},
"connectHardwareWallet": {
"message": "Donanım Cüzdanı Bağla"
},
"connectManually": {
"message": "Mevcut siteye manuel olarak bağlan"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Goerli Test Ağına Bağlanıyor"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Linea Goerli test ağına bağlanılıyor"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "Oluştur"
},
"createAccount": {
"message": "Hesap Oluştur"
},
"createNewWallet": {
"message": "Yeni bir cüzdan oluştur"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "NFT verilerini almak için OpenSea API'sini kullanın. NFT otomatik algılama OpenSea API'ye dayalıdır ve bu kapatılırsa mevcut olmayacaktır."
},
"enableSmartTransactions": {
"message": "Akıllı işlemleri etkinleştir"
},
"enableToken": {
"message": "şunu etkinleştir: $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "Herkes, mevcut tokenlerin sahte sürümleri de dahil olmak üzere herhangi bir ada sahip bir token oluşturabilir. Riski tamamen size ait olacak şekikde token ekleyin ve işlem yapın!"
},
"importTokens": {
"message": "tokenleri içe aktar"
},
"importTokensCamelCase": {
"message": "Tokenleri içe aktar"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "Bu tokenleri içe aktarmak ister misiniz?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli test ağı"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "Buradan talep et"
},
"missingToken": {
"message": "Tokeninizi görmüyor musunuz?"
},
"moreComingSoon": {
"message": "Daha fazlası çok yakında..."
},
"mustSelectOne": {
"message": "En az bir token seçilmeli."
},
"myAccounts": {
"message": "Hesaplarım"
},
"name": {
"message": "Adı"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "Yeterli gaz yok"
},
"notifications": {
"message": "Bildirimler"
},
"notifications10ActionText": {
"message": "Ayarlarda ziyaret et",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2365,7 +2328,7 @@
"description": "Description on an action button that appears in the What's New popup. Tells the user that if they click it, they will go to our Advanced settings page."
},
"notifications8DescriptionOne": {
"message": "MetaMask 10.4.0 sürümü itibariyle Kayıt Defteri cihazınızı Metamask'e bağlamak için artık Ledger Live'e ihtiyacınız yok.",
"message": "MetaMask 10.4.0 sürümü itibariyle Kayıt Defteri cihazınızı MetaMask'e bağlamak için artık Ledger Live'e ihtiyacınız yok.",
"description": "Description of a notification in the 'See What's New' popup. Describes changes for how Ledger Live is no longer needed to connect the device."
},
"notifications8DescriptionTwo": {
@ -2524,7 +2487,7 @@
"message": "Hemen erişim sağlamak için tarayıcı uzantısı simgesine tıklayın"
},
"onboardingPinExtensionLabel": {
"message": "Metamask'i sabitle"
"message": "MetaMask'i sabitle"
},
"onboardingPinExtensionStep1": {
"message": "1"
@ -2817,9 +2780,6 @@
"receive": {
"message": "Al"
},
"recents": {
"message": "Son Kullanılanlar"
},
"recipientAddressPlaceholder": {
"message": "Ara, genel adres (0x) veya ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "Gönder ekranında on altılık veri alanını göstermek için bunu seçin"
},
"showHide": {
"message": "Göster/gizle"
},
"showIncomingTransactions": {
"message": "Gelen işlemleri göster"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "Gizli Kurtarma İfademi yedekleyene kadar hesaplarımı ve tüm varlıkları kaybedebileceğimi anlıyorum."
},
"smartTransaction": {
"message": "Akıllı işlem"
},
"snapContent": {
"message": "Bu içerik $1 kaynaklıdır",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "Snap'i yükle"
},
"snapInstallWarningCheck": {
"message": "Anladığını doğrulamak için kutucuğu işaretle."
"message": "Anladığını doğrulamak için kutucuğu işaretle.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "Anladığınızı kontrol etmek için tüm kutuları işaretleyin."
"message": "Anladığınızı kontrol etmek için tüm kutuları işaretleyin.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "\"$1\" için $2 anahtar erişimi veriyorsunuz. Bu iptal edilemez ve $2 hesaplarınıza ve varlıklarınıza \"$1\" kontrolü verir. İlerlemeden önce \"$1\" alanına güvendiğinizden emin olun.",
@ -3416,9 +3372,6 @@
"status": {
"message": "Durum"
},
"statusConnected": {
"message": "Bağlandı"
},
"statusNotConnected": {
"message": "Bağlanmadı"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "Güçlü"
},
"stxAreHere": {
"message": "Akıllı İşlemler burada!"
},
"stxBenefit1": {
"message": "İşlem maliyetlerini en aza indir"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "Takasını tekrar dene. Bir dahaki sefere seni benzer risklere karşı korumak için burada olacağız."
},
"stxDescription": {
"message": "MetaMask Swapları artık çok daha akıllı! Akıllı İşlemleri, MetaMask'in renklerine yardımcı olmak için Swap'ını programlı olarak optimize etme bölümünden yararlanmak:"
},
"stxErrorNotEnoughFunds": {
"message": "Akıllı işlem için yeterli para yok."
},
"stxErrorUnavailable": {
"message": "Akıllı İşlemler geçici olarak kullanılamıyor."
},
"stxFailure": {
"message": "Takas başarısız oldu"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "Swap işlemin herkese açık olarak gönderiliyor..."
},
"stxSubDescription": {
"message": "* Akıllı İşlemler, işlemini birden çok kez özel olarak göndermeye çalışır. Tüm denemeler başarısız olursa Takas'ının başarılı bir şekilde gerçekleşmesini sağlamak için işlem herkese açık olarak yayınlanacaktır."
},
"stxSuccess": {
"message": "Takas tamamlandı!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "eth_sign taleplerini değiştirin"
},
"toggleTestNetworks": {
"message": "Test ağlarını $1",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Token"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "Transfer et"
},
"transferBetweenAccounts": {
"message": "Hesaplarım arası transfer"
},
"transferFrom": {
"message": "Transfer kaynağı:"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "MetaMask başlatılırken bir sorun oldu. Bu hata sürekli bir hata olmayabilir; bu yüzden uzantıyı yeniden başlatmayı dene."
},
"troubleTokenBalances": {
"message": "Token bakiyeleriniz yüklenirken sorun yaşadık. Burada görüntüleyebilirsiniz ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "İzin verdiğinizde paranıza aşağıdaki $1 erişimine izin verirsiniz"
},

View File

@ -93,9 +93,6 @@
"back": {
"message": "Назад"
},
"backToAll": {
"message": "Повернутися до всіх"
},
"backupApprovalInfo": {
"message": "Цей секретний код буде потрібен, щоб відновити ваш гаманець у разі втрати вашого пристрою, забуття паролю, потреби у перевстановленні MetaMask або виникнення бажання отримати доступ до вашого гаманця з іншого пристрою."
},
@ -154,16 +151,13 @@
"connect": {
"message": "Під’єднатися"
},
"connectHardwareWallet": {
"message": "Приєднайте апаратний гаманець"
},
"connectingTo": {
"message": "Під'єднуємось до $1"
},
"connectingToGoerli": {
"message": "Підключення до тестової мережі Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Підключення до тестової мережі Linea Goerli"
},
"connectingToMainnet": {
@ -193,9 +187,6 @@
"create": {
"message": "Створити"
},
"createAccount": {
"message": "Створити обліковий запис"
},
"createPassword": {
"message": "Створити пароль"
},
@ -415,7 +406,7 @@
"likeToImportTokens": {
"message": "Ви б хотіли додати ці токени?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Тестова мережа Linea Goerli"
},
"links": {
@ -454,9 +445,6 @@
"mustSelectOne": {
"message": "Слід вибрати хоча б 1 токен."
},
"myAccounts": {
"message": "Мої облікові записи"
},
"needImportFile": {
"message": "Потрібно вибрати файл для імпорту.",
"description": "User is important an account and needs to add a file to continue"
@ -581,9 +569,6 @@
"readdToken": {
"message": "Ви можете знову додати цей токен у меню облікового запису у розділі “Додати токен”. "
},
"recents": {
"message": "Останні"
},
"recipientAddressPlaceholder": {
"message": "Пошук, публічна адреса (0x), або ENS"
},
@ -807,16 +792,9 @@
"transfer": {
"message": "Передати"
},
"transferBetweenAccounts": {
"message": "Передати між моїми обліковими записами"
},
"transferFrom": {
"message": "Передати від"
},
"troubleTokenBalances": {
"message": "В нас виникли складнощі при завантаженні ваших залишків токенів. Ви можете переглянути їх",
"description": "Followed by a link (here) to view token balances"
},
"tryAgain": {
"message": "Повторити"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "Thêm token tùy chỉnh"
},
"addCustomTokenByContractAddress": {
"message": "Bạn không tìm thấy token? Bạn có thể dán địa chỉ của bất kỳ token nào để thêm token đó theo cách thủ công. Bạn có thể tìm thấy địa chỉ hợp đồng token trên $1.",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "Thao tác này sẽ cho phép sử dụng mạng này trong MetaMask."
},
@ -263,6 +259,10 @@
"addToken": {
"message": "Thêm token"
},
"addTokenByContractAddress": {
"message": "Bạn không tìm thấy token? Bạn có thể dán địa chỉ của bất kỳ token nào để thêm token đó theo cách thủ công. Bạn có thể tìm thấy địa chỉ hợp đồng token trên $1",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "Địa chỉ"
},
@ -359,12 +359,6 @@
"message": "Cấp quyền truy cập vào và chuyển tất cả $1 của bạn?",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "Chấp nhận và cài đặt"
},
"approveAndUpdate": {
"message": "Phê duyệt và cập nhật"
},
"approveButtonText": {
"message": "Phê duyệt"
},
@ -429,9 +423,6 @@
"back": {
"message": "Quay lại"
},
"backToAll": {
"message": "Quay lại toàn bộ danh sách"
},
"backup": {
"message": "Sao lưu"
},
@ -557,13 +548,6 @@
"message": "Để $1 một giao dịch, phí gas phải tăng tối thiểu 10% để mạng nhận ra giao dịch này.",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "Hủy hoán đổi với giá ~$1",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "Hủy hoán đổi miễn phí"
},
"cancelled": {
"message": "Đã hủy"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "Kết nối tài khoản hoặc tạo tài khoản mới"
},
"connectHardwareWallet": {
"message": "Kết nối với ví cứng"
},
"connectManually": {
"message": "Kết nối thủ công với trang web hiện tại"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "Đang kết nối với mạng thử nghiệm Goerli"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "Đang kết nối với mạng thử nghiệm Linea Goerli"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "Tạo"
},
"createAccount": {
"message": "Tạo tài khoản"
},
"createNewWallet": {
"message": "Tạo ví mới"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "Sử dụng API của OpenSea để tìm nạp dữ liệu NFT. Tính năng tự động phát hiện NFT dựa vào API của OpenSea và sẽ không khả dụng nếu tính năng này bị tắt."
},
"enableSmartTransactions": {
"message": "Bật giao dịch thông minh"
},
"enableToken": {
"message": "bật $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "Bất kỳ ai cũng tạo được token bằng bất kỳ tên nào, kể cả phiên bản giả của token hiện có. Bạn tự chịu rủi ro khi thêm và giao dịch!"
},
"importTokens": {
"message": "nhập token"
},
"importTokensCamelCase": {
"message": "Nhập token"
},
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "Bạn có muốn nhập những token này không?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Mạng thử nghiệm Linea Goerli"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "Yêu cầu tại đây"
},
"missingToken": {
"message": "Không thấy token của mình?"
},
"moreComingSoon": {
"message": "Sắp có thêm..."
},
"mustSelectOne": {
"message": "Phải chọn ít nhất 1 token."
},
"myAccounts": {
"message": "Tài khoản của tôi"
},
"name": {
"message": "Tên"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "Không đủ gas"
},
"notifications": {
"message": "Thông báo"
},
"notifications10ActionText": {
"message": "Xem trong phần Cài đặt",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2817,9 +2780,6 @@
"receive": {
"message": "Nhận"
},
"recents": {
"message": "Gần đây"
},
"recipientAddressPlaceholder": {
"message": "Tìm kiếm, địa chỉ công khai (0x) hoặc ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "Chọn tùy chọn này để hiển thị trường dữ liệu thập lục phân trên màn hình gửi"
},
"showHide": {
"message": "Hiển thị/ẩn"
},
"showIncomingTransactions": {
"message": "Hiển thị các giao dịch đến"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "Tôi hiểu rằng nếu chưa sao lưu Cụm Mật Khẩu Khôi Phục Bí Mật của mình, tôi có thể bị mất tài khoản và toàn bộ tài sản bên trong."
},
"smartTransaction": {
"message": "Giao dịch thông minh"
},
"snapContent": {
"message": "Nội dung này đến từ $1",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "Cài đặt Snap"
},
"snapInstallWarningCheck": {
"message": "Để xác nhận rằng bạn hiểu, hãy đánh dấu vào ô."
"message": "Để xác nhận rằng bạn hiểu, hãy đánh dấu vào ô.",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "Để xác nhận rằng bạn hiểu, hãy đánh dấu vào tất cả các ô."
"message": "Để xác nhận rằng bạn hiểu, hãy đánh dấu vào tất cả các ô.",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "Bạn đang cấp quyền truy cập khóa $2 cho Snap \"$1\". Hành động này không thể hủy bỏ và sẽ cấp quyền kiểm soát tài khoản và tài sản $2 của bạn cho \"$1\". Đảm bảo bạn tin tưởng \"$1\" trước khi tiếp tục.",
@ -3416,9 +3372,6 @@
"status": {
"message": "Trạng thái"
},
"statusConnected": {
"message": "Đã kết nối"
},
"statusNotConnected": {
"message": "Chưa kết nối"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "Mạnh"
},
"stxAreHere": {
"message": "Giao dịch thông minh đã ra mắt!"
},
"stxBenefit1": {
"message": "Giảm thiểu chi phí giao dịch"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "Hãy thử hoán đổi lại. Chúng tôi ở đây để bảo vệ bạn trước những rủi ro tương tự trong lần tới."
},
"stxDescription": {
"message": "Tính năng Hoán đổi của MetaMask nay đã thông minh hơn rất nhiều! Kích hoạt Giao dịch thông minh sẽ cho phép MetaMask tối ưu quy trình Hoán đổi để giúp bạn:"
},
"stxErrorNotEnoughFunds": {
"message": "Không có đủ tiền để thực hiện giao dịch thông minh."
},
"stxErrorUnavailable": {
"message": "Giao dịch thông minh tạm thời không khả dụng."
},
"stxFailure": {
"message": "Hoán đổi không thành công"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "Đang công khai gửi yêu cầu Hoán đổi của bạn..."
},
"stxSubDescription": {
"message": "* Giao dịch thông minh sẽ cố gắng gửi giao dịch của bạn nhiều lần theo cách riêng tư. Nếu tất cả các lần thử đều không thành công, giao dịch sẽ được phát công khai để đảm bảo Hoán đổi của bạn được thực hiện thành công."
},
"stxSuccess": {
"message": "Hoán đổi hoàn tất!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "Bật/tắt yêu cầu eth_sign"
},
"toggleTestNetworks": {
"message": "$1 mạng thử nghiệm",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "Token"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "Chuyển"
},
"transferBetweenAccounts": {
"message": "Chuyển giữa các tài khoản của tôi"
},
"transferFrom": {
"message": "Chuyển từ"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "MetaMask đã gặp sự cố khi khởi động. Lỗi này có thể xảy ra không liên tục, vì vậy hãy thử khởi động lại tiện ích."
},
"troubleTokenBalances": {
"message": "Chúng tôi đã gặp phải vấn đề khi tải số dư token của bạn. Bạn có thể xem số dư ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "Bằng cách cấp quyền, bạn cho phép $1 sau đây truy cập vào các khoản tiền của mình"
},

View File

@ -195,10 +195,6 @@
"addCustomToken": {
"message": "添加自定义代币"
},
"addCustomTokenByContractAddress": {
"message": "找不到代币?您可以通过粘贴其地址手动添加任何代币。代币合约地址可以在 $1 上找到。",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"addEthereumChainConfirmationDescription": {
"message": "这将允许在 MetaMask 中使用此网络。"
},
@ -263,6 +259,10 @@
"addToken": {
"message": "添加代币"
},
"addTokenByContractAddress": {
"message": "找不到代币?您可以通过粘贴其地址手动添加任何代币。代币合约地址可以在 $1 上找到",
"description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum"
},
"address": {
"message": "地址"
},
@ -359,12 +359,6 @@
"message": "是否允许访问您的所有$1",
"description": "$1 is the symbol of the token for which the user is granting approval"
},
"approveAndInstall": {
"message": "批准并安装"
},
"approveAndUpdate": {
"message": "批准并更新"
},
"approveButtonText": {
"message": "批准"
},
@ -429,9 +423,6 @@
"back": {
"message": "返回"
},
"backToAll": {
"message": "返回全部"
},
"backup": {
"message": "备份"
},
@ -557,13 +548,6 @@
"message": "若要$1交易燃料费用必须增加至少10%才能被网络认可。",
"description": "$1 is string 'cancel' or 'speed up'"
},
"cancelSwapForFee": {
"message": "以~$1取消兑换",
"description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction"
},
"cancelSwapForFree": {
"message": "免费取消兑换"
},
"cancelled": {
"message": "已取消"
},
@ -642,9 +626,6 @@
"connectAccountOrCreate": {
"message": "连接账户或创建新账户"
},
"connectHardwareWallet": {
"message": "连接硬件钱包"
},
"connectManually": {
"message": "手动连接到当前站点"
},
@ -701,7 +682,7 @@
"connectingToGoerli": {
"message": "正在连接 Goerli 测试网络"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "正在连接Linea测试网络"
},
"connectingToMainnet": {
@ -789,9 +770,6 @@
"create": {
"message": "创建"
},
"createAccount": {
"message": "创建账户"
},
"createNewWallet": {
"message": "创建新钱包"
},
@ -1215,9 +1193,6 @@
"enableOpenSeaAPIDescription": {
"message": "使用 OpenSea 的 API 获取 NFT 数据。NFT 自动检测依赖于 OpenSea 的 API在后者关闭时自动检测将不可用。"
},
"enableSmartTransactions": {
"message": "启用智能交易"
},
"enableToken": {
"message": "启用 $1",
"description": "$1 is a token symbol, e.g. ETH"
@ -1636,9 +1611,6 @@
"importTokenWarning": {
"message": "任何人都可以用任何名称创建代币,包括现有代币的虚假版本。添加和交易风险自负!"
},
"importTokens": {
"message": "添加资产"
},
"importTokensCamelCase": {
"message": "添加代币"
},
@ -1823,7 +1795,7 @@
"message": "打开和解锁 Ledger Live 应用程序"
},
"ledgerConnectionPreferenceDescription": {
"message": "自定义连接您的 Ledger 到 Metamask 的方式。建议使用 $1但也可使用其他选项。请在这里阅读更多信息$2",
"message": "自定义连接您的 Ledger 到 MetaMask 的方式。建议使用 $1但也可使用其他选项。请在这里阅读更多信息$2",
"description": "A description that appears above a dropdown where users can select between up to three options - Ledger Live, U2F or WebHID - depending on what is supported in their browser. $1 is the recommended browser option, it will be either WebHID or U2f. $2 is a link to an article where users can learn more, but will be the translation of the learnMore message."
},
"ledgerDeviceOpenFailureMessage": {
@ -1858,7 +1830,7 @@
"likeToImportTokens": {
"message": "您想导入这些代币吗?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea测试网络"
},
"link": {
@ -1990,18 +1962,12 @@
"missingSettingRequest": {
"message": "在这里请求"
},
"missingToken": {
"message": "没有看到您的代币?"
},
"moreComingSoon": {
"message": "更多即将到来……"
},
"mustSelectOne": {
"message": "至少选择1种代币。"
},
"myAccounts": {
"message": "我的账户"
},
"name": {
"message": "名称"
},
@ -2235,9 +2201,6 @@
"notEnoughGas": {
"message": "燃料不足"
},
"notifications": {
"message": "通知"
},
"notifications10ActionText": {
"message": "在设置中访问",
"description": "The 'call to action' on the button, or link, of the 'Visit in Settings' notification. Upon clicking, users will be taken to Settings page."
@ -2337,7 +2300,7 @@
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionThree": {
"message": "在 Metamask 中与您的 Ledger 账户交互时,将打开一个新选项卡,并且将要求您打开 Ledger Live 应用程序。应用程序打开后,您将被要求允许 WebSocket 连接到您的 MetaMask 账户。就是这样!",
"message": "在 MetaMask 中与您的 Ledger 账户交互时,将打开一个新选项卡,并且将要求您打开 Ledger Live 应用程序。应用程序打开后,您将被要求允许 WebSocket 连接到您的 MetaMask 账户。就是这样!",
"description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update."
},
"notifications6DescriptionTwo": {
@ -2817,9 +2780,6 @@
"receive": {
"message": "接收"
},
"recents": {
"message": "最近"
},
"recipientAddressPlaceholder": {
"message": "搜索、公共地址 (0x) 或 ENS"
},
@ -3214,9 +3174,6 @@
"showHexDataDescription": {
"message": "选择此项以在发送屏幕上显示十六进制数据字段"
},
"showHide": {
"message": "显示/隐藏"
},
"showIncomingTransactions": {
"message": "显示传入的交易"
},
@ -3269,9 +3226,6 @@
"skipAccountSecurityDetails": {
"message": "我明白,在我备份我的账户助记词之前,我可能会丢失我的账户及其所有资产。"
},
"smartTransaction": {
"message": "智能交易"
},
"snapContent": {
"message": "此内容来自$1",
"description": "This is shown when a snap shows transaction insight information in the confirmation UI. $1 is a link to the snap's settings page with the link text being the name of the snap."
@ -3284,10 +3238,12 @@
"message": "安装Snap"
},
"snapInstallWarningCheck": {
"message": "请勾选选项框以确认您理解。"
"message": "请勾选选项框以确认您理解。",
"description": "Warning message used in popup displayed on snap install. $1 is the snap name."
},
"snapInstallWarningCheckPlural": {
"message": "请勾选所有方框以确认您理解。"
"message": "请勾选所有方框以确认您理解。",
"description": "Warning message used in popup displayed on snap install when having multiple permissions. $1 is the snap name."
},
"snapInstallWarningKeyAccess": {
"message": "您正在向snap \"$1\"授予$2的密钥访问权限。此操作不可撤销并会向\"$1\"授予对您的$2账户和资产的控制权。在继续之前请确保您信任\"$1\"。",
@ -3416,9 +3372,6 @@
"status": {
"message": "状态"
},
"statusConnected": {
"message": "已连接"
},
"statusNotConnected": {
"message": "未连接"
},
@ -3456,9 +3409,6 @@
"strong": {
"message": "强"
},
"stxAreHere": {
"message": "智能交易已推出!"
},
"stxBenefit1": {
"message": "将交易成本减至最低"
},
@ -3480,15 +3430,6 @@
"stxCancelledSubDescription": {
"message": "再次尝试进行交换。下次我们会在这里保护您免受类似风险。 "
},
"stxDescription": {
"message": "MetaMask Swap变得更加智能启用智能交易将允许MetaMask从编程上优化您的交换以帮助"
},
"stxErrorNotEnoughFunds": {
"message": "没有足够的资金进行智能交易。"
},
"stxErrorUnavailable": {
"message": "智能交易暂时不可用。"
},
"stxFailure": {
"message": "交换失败"
},
@ -3502,9 +3443,6 @@
"stxPendingPubliclySubmittingSwap": {
"message": "正在公开提交您的Swap..."
},
"stxSubDescription": {
"message": "*智能交易将尝试多次隐秘提交您的交易。如果所有尝试都失败,交易将会公开广播,以确保您的交换能成功进行。"
},
"stxSuccess": {
"message": "交换完成!"
},
@ -3923,10 +3861,6 @@
"toggleEthSignField": {
"message": "切换eth_sign请求"
},
"toggleTestNetworks": {
"message": "$1 测试网络",
"description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open Settings > Advanced where users can enable the display of test networks in the network dropdown."
},
"token": {
"message": "代币"
},
@ -4093,9 +4027,6 @@
"transfer": {
"message": "转移"
},
"transferBetweenAccounts": {
"message": "在我的账户之间转移"
},
"transferFrom": {
"message": "转移自"
},
@ -4106,10 +4037,6 @@
"troubleStarting": {
"message": "MetaMask无法启动。可能发生间歇性错误因此请尝试重新启动扩展程序。"
},
"troubleTokenBalances": {
"message": "我们在加载您的代币余额时遇到问题。您可以查看它们 ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "通过授予权限,您允许以下 $1 访问您的资金"
},

View File

@ -160,9 +160,6 @@
"back": {
"message": "上一頁"
},
"backToAll": {
"message": "回到全部"
},
"backupApprovalInfo": {
"message": "在裝置遺失、忘記密碼、需要重新安裝 MetaMask、或是想在另一裝置開啟錢包的情形下你需要此秘密代碼來復原錢包。"
},
@ -251,9 +248,6 @@
"connectAccountOrCreate": {
"message": "連結帳戶或建立新的"
},
"connectHardwareWallet": {
"message": "連線硬體錢包"
},
"connectManually": {
"message": "手動連結到目前的網站"
},
@ -310,7 +304,7 @@
"connectingToGoerli": {
"message": "連線到 Goerli 測試網路"
},
"connectingToLineaTestnet": {
"connectingToLineaGoerli": {
"message": "連線到 Linea Goerli 測試網路"
},
"connectingToMainnet": {
@ -355,9 +349,6 @@
"create": {
"message": "建立"
},
"createAccount": {
"message": "建立帳戶"
},
"createPassword": {
"message": "建立密碼"
},
@ -812,7 +803,7 @@
"likeToImportTokens": {
"message": "確定要加入代幣?"
},
"lineatestnet": {
"lineaGoerli": {
"message": "Linea Goerli 測試網路"
},
"links": {
@ -870,9 +861,6 @@
"mustSelectOne": {
"message": "必須選擇至少 1 代幣。"
},
"myAccounts": {
"message": "我的帳戶"
},
"name": {
"message": "名稱"
},
@ -1081,9 +1069,6 @@
"receive": {
"message": "接收"
},
"recents": {
"message": "最近"
},
"recipientAddressPlaceholder": {
"message": "搜尋、公開位址 (0x)、或 ENS"
},
@ -1322,9 +1307,6 @@
"stateLogsDescription": {
"message": "狀態紀錄包含您的公開帳戶位址和已傳送的交易資訊"
},
"statusConnected": {
"message": "已連結"
},
"statusNotConnected": {
"message": "未連結"
},
@ -1463,9 +1445,6 @@
"transfer": {
"message": "交易"
},
"transferBetweenAccounts": {
"message": "在我的帳戶間轉帳"
},
"transferFrom": {
"message": "交易來源"
},
@ -1473,10 +1452,6 @@
"message": "我們在連線到您的 $1 的時候遇到問題,試著檢查 $2 然後再試一次。",
"description": "$1 is the wallet device name; $2 is a link to wallet connection guide"
},
"troubleTokenBalances": {
"message": "無法取得代幣餘額。您可以到這裡查看 ",
"description": "Followed by a link (here) to view token balances"
},
"trustSiteApprovePermission": {
"message": "您信任這個網站嗎?當您授予這個權限,$1 就能提領您的 $2 並且代替您自動發送交易。"
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 239 KiB

View File

@ -6,5 +6,5 @@
"matches": ["https://metamask.io/*"],
"ids": ["*"]
},
"minimum_chrome_version": "80"
"minimum_chrome_version": "88"
}

View File

@ -676,10 +676,8 @@ export function setupController(
//
// User Interface setup
//
updateBadge();
controller.txController.initApprovals().then(() => {
updateBadge();
});
controller.txController.on(
METAMASK_CONTROLLER_EVENTS.UPDATE_BADGE,
updateBadge,
@ -706,6 +704,8 @@ export function setupController(
updateBadge,
);
controller.txController.initApprovals();
/**
* Updates the Web Extension's "badge" number, on the little fox in the toolbar.
* The number reflects the current number of pending transactions or message signatures needing user approval.

View File

@ -183,6 +183,20 @@ export default class AppStateController extends EventEmitter {
});
}
///: BEGIN:ONLY_INCLUDE_IN(snaps)
/**
* Record if popover for snaps privacy warning has been shown
* on the first install of a snap.
*
* @param {boolean} shown - shown status
*/
setSnapsInstallPrivacyWarningShownStatus(shown) {
this.store.updateState({
snapsInstallPrivacyWarningShown: shown,
});
}
///: END:ONLY_INCLUDE_IN
/**
* Record the timestamp of the last time the user has seen the outdated browser warning
*

View File

@ -346,4 +346,23 @@ describe('AppStateController', () => {
);
});
});
describe('setSnapsInstallPrivacyWarningShownStatus', () => {
it('updates the status of snaps install privacy warning', () => {
appStateController = createAppStateController();
const updateStateSpy = jest.spyOn(
appStateController.store,
'updateState',
);
appStateController.setSnapsInstallPrivacyWarningShownStatus(true);
expect(updateStateSpy).toHaveBeenCalledTimes(1);
expect(updateStateSpy).toHaveBeenCalledWith({
snapsInstallPrivacyWarningShown: true,
});
updateStateSpy.mockRestore();
});
});
});

View File

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

View File

@ -9,7 +9,7 @@ import {
TokensController,
AssetsContractController,
} from '@metamask/assets-controllers';
import { convertHexToDecimal } from '@metamask/controller-utils';
import { toHex } from '@metamask/controller-utils';
import { NETWORK_TYPES } from '../../../shared/constants/network';
import { toChecksumHexAddress } from '../../../shared/modules/hexstring-utils';
import DetectTokensController from './detect-tokens';
@ -204,7 +204,7 @@ describe('DetectTokensController', function () {
name: 'TokenListController',
});
tokenListController = new TokenListController({
chainId: '1',
chainId: toHex(1),
preventPollingOnNetworkRestart: false,
onNetworkStateChange: sinon.spy(),
onPreferencesStateChange: sinon.spy(),
@ -246,23 +246,7 @@ describe('DetectTokensController', function () {
onPreferencesStateChange: preferences.store.subscribe.bind(
preferences.store,
),
onNetworkStateChange: (cb) =>
networkControllerMessenger.subscribe(
'NetworkController:networkDidChange',
() => {
const networkState = network.store.getState();
const modifiedNetworkState = {
...networkState,
providerConfig: {
...networkState.providerConfig,
chainId: convertHexToDecimal(
networkState.providerConfig.chainId,
),
},
};
return cb(modifiedNetworkState);
},
),
onNetworkStateChange: network.store.subscribe.bind(network.store),
});
});
@ -311,7 +295,7 @@ describe('DetectTokensController', function () {
name: 'TokenListController',
});
tokenListController = new TokenListController({
chainId: '11155111',
chainId: toHex(11155111),
onNetworkStateChange: sinon.spy(),
onPreferencesStateChange: sinon.spy(),
messenger: tokenListMessengerSepolia,

View File

@ -45,7 +45,7 @@ export type CoreMessage = AbstractMessage & {
};
export type StateMessage = Required<
Omit<AbstractMessage, 'securityProviderResponse'>
Omit<AbstractMessage, 'securityProviderResponse' | 'metadata'>
> & {
msgParams: string;
};

View File

@ -1,5 +1,6 @@
import { strict as assert } from 'assert';
import sinon from 'sinon';
import { toHex } from '@metamask/controller-utils';
import { ENVIRONMENT_TYPE_BACKGROUND } from '../../../shared/constants/app';
import { createSegmentMock } from '../lib/segment';
import {
@ -885,7 +886,7 @@ describe('MetaMetricsController', function () {
describe('_buildUserTraitsObject', function () {
it('should return full user traits object on first call', function () {
const MOCK_ALL_TOKENS = {
'0x1': {
[toHex(1)]: {
'0x1235ce91d74254f29d4609f25932fe6d97bf4842': [
{
address: '0xd2cea331e5f5d8ee9fb1055c297795937645de91',
@ -900,7 +901,7 @@ describe('MetaMetricsController', function () {
},
],
},
'0x4': {
[toHex(4)]: {
'0x1235ce91d74254f29d4609f25932fe6d97bf4842': [
{
address: '0xd2cea331e5f5d8ee9fb1055c297795937645de91',
@ -920,7 +921,7 @@ describe('MetaMetricsController', function () {
},
allNfts: {
'0xac706cE8A9BF27Afecf080fB298d0ee13cfb978A': {
56: [
[toHex(56)]: [
{
address: '0xd2cea331e5f5d8ee9fb1055c297795937645de91',
tokenId: '100',
@ -936,7 +937,7 @@ describe('MetaMetricsController', function () {
],
},
'0xe04AB39684A24D8D4124b114F3bd6FBEB779cacA': {
69: [
[toHex(59)]: [
{
address: '0x63d646bc7380562376d5de205123a57b1718184d',
tokenId: '14',
@ -1022,7 +1023,9 @@ describe('MetaMetricsController', function () {
[CHAIN_IDS.GOERLI]: [{ address: '0x' }, { address: '0x0' }],
},
allTokens: {
'0x1': { '0xabcde': [{ '0x12345': { address: '0xtestAddress' } }] },
[toHex(1)]: {
'0xabcde': [{ '0x12345': { address: '0xtestAddress' } }],
},
},
networkConfigurations: {
'network-configuration-id-1': { chainId: CHAIN_IDS.MAINNET },

View File

@ -0,0 +1,586 @@
import EventEmitter from 'events';
import log from 'loglevel';
import { captureException } from '@sentry/browser';
import {
PersonalMessageManager,
TypedMessageManager,
} from '@metamask/message-manager';
import { CUSTODIAN_TYPES } from '@metamask-institutional/custody-keyring';
import {
updateCustodianTransactions,
custodianEventHandlerFactory,
} from '@metamask-institutional/extension';
import {
REFRESH_TOKEN_CHANGE_EVENT,
INTERACTIVE_REPLACEMENT_TOKEN_CHANGE_EVENT,
} from '@metamask-institutional/sdk';
import { toChecksumHexAddress } from '../../../shared/modules/hexstring-utils';
import {
BUILD_QUOTE_ROUTE,
CONNECT_HARDWARE_ROUTE,
} from '../../../ui/helpers/constants/routes';
import { getPermissionBackgroundApiMethods } from './permissions';
export default class MMIController extends EventEmitter {
constructor(opts) {
super();
this.opts = opts;
this.mmiConfigurationController = opts.mmiConfigurationController;
this.keyringController = opts.keyringController;
this.txController = opts.txController;
this.securityProviderRequest = opts.securityProviderRequest;
this.preferencesController = opts.preferencesController;
this.appStateController = opts.appStateController;
this.transactionUpdateController = opts.transactionUpdateController;
this.custodyController = opts.custodyController;
this.institutionalFeaturesController = opts.institutionalFeaturesController;
this.getState = opts.getState;
this.getPendingNonce = opts.getPendingNonce;
this.accountTracker = opts.accountTracker;
this.metaMetricsController = opts.metaMetricsController;
this.networkController = opts.networkController;
this.permissionController = opts.permissionController;
this.platform = opts.platform;
this.extension = opts.extension;
this.personalMessageManager = new PersonalMessageManager(
undefined,
undefined,
this.securityProviderRequest,
);
this.typedMessageManager = new TypedMessageManager(
undefined,
undefined,
this.securityProviderRequest,
);
// Prepare event listener after transactionUpdateController gets initiated
this.transactionUpdateController.prepareEventListener(
this.custodianEventHandlerFactory.bind(this),
);
// Get configuration from MMIConfig controller
if (!process.env.IN_TEST) {
this.mmiConfigurationController.storeConfiguration().then(() => {
// This must happen after the configuration is fetched
// Otherwise websockets will always be disabled in the first run
this.transactionUpdateController.subscribeToEvents();
});
}
} // End of constructor
async persistKeyringsAfterRefreshTokenChange() {
this.keyringController.persistAllKeyrings();
}
async trackTransactionEventFromCustodianEvent(txMeta, event) {
this.txController._trackTransactionMetricsEvent(txMeta, event);
}
async addKeyringIfNotExists(type) {
let keyring = await this.keyringController.getKeyringsByType(type)[0];
if (!keyring) {
keyring = await this.keyringController.addNewKeyring(type);
}
return keyring;
}
custodianEventHandlerFactory() {
return custodianEventHandlerFactory({
log,
getState: () => this.getState(),
getPendingNonce: (address) => this.getPendingNonce(address),
setTxHash: (txId, txHash) => this.txController.setTxHash(txId, txHash),
typedMessageManager: this.typedMessageManager,
personalMessageManager: this.personalMessageManager,
txStateManager: this.txController.txStateManager,
custodyController: this.custodyController,
trackTransactionEvent:
this.trackTransactionEventFromCustodianEvent.bind(this),
});
}
async storeCustodianSupportedChains(address) {
const custodyType = this.custodyController.getCustodyTypeByAddress(
toChecksumHexAddress(address),
);
const keyring = await this.addKeyringIfNotExists(custodyType);
const supportedChains = await keyring.getSupportedChains(address);
if (supportedChains?.status === 401) {
return;
}
const accountDetails = this.custodyController.getAccountDetails(address);
await this.custodyController.storeSupportedChainsForAddress(
toChecksumHexAddress(address),
supportedChains,
accountDetails.custodianName,
);
}
async onSubmitPassword() {
// Create a keyring for each custodian type
let addresses = [];
const custodyTypes = this.custodyController.getAllCustodyTypes();
for (const type of custodyTypes) {
try {
const keyring = await this.addKeyringIfNotExists(type);
keyring.on(REFRESH_TOKEN_CHANGE_EVENT, () => {
log.info(`Refresh token change event for ${type}`);
this.persistKeyringsAfterRefreshTokenChange();
});
// Trigger this event, listen to sdk, sdk change the state and then Ui is listening for the state changed
keyring.on(INTERACTIVE_REPLACEMENT_TOKEN_CHANGE_EVENT, (payload) => {
log.info(`Interactive refresh token change event for ${payload}`);
this.appStateController.showInteractiveReplacementTokenBanner(
payload,
);
});
// store the supported chains for this custodian type
const accounts = await keyring.getAccounts();
addresses = addresses.concat(...accounts);
for (const address of accounts) {
try {
await this.storeCustodianSupportedChains(address);
} catch (error) {
captureException(error);
log.error('Error while unlocking extension.', error);
}
}
const txList = this.txController.txStateManager.getTransactions(
{},
[],
false,
); // Includes all transactions, but we are looping through keyrings. Currently filtering is done in updateCustodianTransactions :-/
try {
updateCustodianTransactions({
keyring,
type,
txList,
getPendingNonce: this.getPendingNonce.bind(this),
txStateManager: this.txController.txStateManager,
setTxHash: this.txController.setTxHash.bind(this.txController),
custodyController: this.custodyController,
transactionUpdateController: this.transactionUpdateController,
});
} catch (error) {
log.error('Error doing offline transaction updates', error);
captureException(error);
}
} catch (error) {
log.error(
`Error while unlocking extension with custody type ${type}`,
error,
);
captureException(error);
}
}
try {
await this.mmiConfigurationController.storeConfiguration();
} catch (error) {
log.error('Error while unlocking extension.', error);
}
try {
await this.transactionUpdateController.subscribeToEvents();
} catch (error) {
log.error('Error while unlocking extension.', error);
}
const mmiConfigData =
await this.mmiConfigurationController.store.getState();
if (
mmiConfigData &&
mmiConfigData.mmiConfiguration.features?.websocketApi
) {
this.transactionUpdateController.getCustomerProofForAddresses(addresses);
}
try {
if (this.institutionalFeaturesController.getComplianceProjectId()) {
this.institutionalFeaturesController.startPolling();
}
} catch (e) {
log.error('Failed to start Compliance polling');
log.error(e);
}
}
async connectCustodyAddresses(custodianType, custodianName, accounts) {
if (!custodianType) {
throw new Error('No custodian');
}
const custodian = CUSTODIAN_TYPES[custodianType.toUpperCase()];
if (!custodian) {
throw new Error('No such custodian');
}
const newAccounts = Object.keys(accounts);
// Check if any address is already added
const identities = Object.keys(
this.preferencesController.store.getState().identities,
);
if (newAccounts.some((address) => identities.indexOf(address) !== -1)) {
throw new Error('Cannot import duplicate accounts');
}
const keyring = await this.addKeyringIfNotExists(
custodian.keyringClass.type,
);
keyring.on(REFRESH_TOKEN_CHANGE_EVENT, () => {
log.info(`Refresh token change event for ${keyring.type}`);
this.persistKeyringsAfterRefreshTokenChange();
});
// Trigger this event, listen to sdk, sdk change the state and then Ui is listening for the state changed
keyring.on(INTERACTIVE_REPLACEMENT_TOKEN_CHANGE_EVENT, (payload) => {
log.info(`Interactive refresh token change event for ${payload}`);
this.appStateController.showInteractiveReplacementTokenBanner(payload);
});
if (!keyring) {
throw new Error('Unable to get keyring');
}
const oldAccounts = await this.keyringController.getAccounts();
await keyring.setSelectedAddresses(
newAccounts.map((item) => ({
address: toChecksumHexAddress(item),
name: accounts[item].name,
custodianDetails: accounts[item].custodianDetails,
labels: accounts[item].labels,
token: accounts[item].token,
apiUrl: accounts[item].apiUrl,
custodyType: custodian.keyringClass.type,
chainId: accounts[item].chainId,
})),
);
this.custodyController.setAccountDetails(
newAccounts.map((item) => ({
address: toChecksumHexAddress(item),
name: accounts[item].name,
custodianDetails: accounts[item].custodianDetails,
labels: accounts[item].labels,
apiUrl: accounts[item].apiUrl,
custodyType: custodian.keyringClass.type,
custodianName,
chainId: accounts[item].chainId,
})),
);
newAccounts.forEach(
async () => await this.keyringController.addNewAccount(keyring),
);
const allAccounts = await this.keyringController.getAccounts();
this.preferencesController.setAddresses(allAccounts);
const accountsToTrack = [
...new Set(oldAccounts.concat(allAccounts.map((a) => a.toLowerCase()))),
];
allAccounts.forEach((address) => {
if (!oldAccounts.includes(address.toLowerCase())) {
const label = newAccounts
.filter((item) => item.toLowerCase() === address)
.map((item) => accounts[item].name)[0];
this.preferencesController.setAccountLabel(address, label);
}
});
this.accountTracker.syncWithAddresses(accountsToTrack);
for (const address of newAccounts) {
try {
await this.storeCustodianSupportedChains(address);
} catch (error) {
captureException(error);
}
}
// FIXME: status maps are not a thing anymore
this.custodyController.storeCustodyStatusMap(
custodian.name,
keyring.getStatusMap(),
);
// MMI - get a WS stream for this account
const mmiConfigData =
await this.mmiConfigurationController.store.getState();
if (
mmiConfigData &&
mmiConfigData.mmiConfiguration.features?.websocketApi
) {
this.transactionUpdateController.getCustomerProofForAddresses(
newAccounts,
);
}
return newAccounts;
}
async getCustodianAccounts(
token,
apiUrl,
custodianType,
getNonImportedAccounts,
) {
let currentCustodyType;
if (!custodianType) {
const address = this.preferencesController.getSelectedAddress();
currentCustodyType = this.custodyController.getCustodyTypeByAddress(
toChecksumHexAddress(address),
);
}
let keyring;
if (custodianType) {
const custodian = CUSTODIAN_TYPES[custodianType.toUpperCase()];
if (!custodian) {
throw new Error('No such custodian');
}
keyring = await this.addKeyringIfNotExists(custodian.keyringClass.type);
} else if (currentCustodyType) {
keyring = await this.addKeyringIfNotExists(currentCustodyType);
} else {
throw new Error('No custodian specified');
}
const accounts = await keyring.getCustodianAccounts(
token,
apiUrl,
null,
getNonImportedAccounts,
);
return accounts;
}
async getCustodianAccountsByAddress(token, apiUrl, address, custodianType) {
let keyring;
if (custodianType) {
const custodian = CUSTODIAN_TYPES[custodianType.toUpperCase()];
if (!custodian) {
throw new Error('No such custodian');
}
keyring = await this.addKeyringIfNotExists(custodian.keyringClass.type);
} else {
throw new Error('No custodian specified');
}
const accounts = await keyring.getCustodianAccounts(token, apiUrl, address);
return accounts;
}
async getCustodianTransactionDeepLink(address, txId) {
const custodyType = this.custodyController.getCustodyTypeByAddress(
toChecksumHexAddress(address),
);
const keyring = await this.addKeyringIfNotExists(custodyType);
return keyring.getTransactionDeepLink(address, txId);
}
async getCustodianConfirmDeepLink(txId) {
const txMeta = this.txController.txStateManager.getTransaction(txId);
const address = txMeta.txParams.from;
const custodyType = this.custodyController.getCustodyTypeByAddress(
toChecksumHexAddress(address),
);
const keyring = await this.addKeyringIfNotExists(custodyType);
return {
deepLink: await keyring.getTransactionDeepLink(
txMeta.txParams.from,
txMeta.custodyId,
),
custodyId: txMeta.custodyId,
};
}
async getCustodianSignMessageDeepLink(from, custodyTxId) {
const custodyType = this.custodyController.getCustodyTypeByAddress(
toChecksumHexAddress(from),
);
const keyring = await this.addKeyringIfNotExists(custodyType);
return keyring.getTransactionDeepLink(from, custodyTxId);
}
async getCustodianToken(custodianType) {
let currentCustodyType;
const address = this.preferencesController.getSelectedAddress();
if (!custodianType) {
const resultCustody = this.custodyController.getCustodyTypeByAddress(
toChecksumHexAddress(address),
);
currentCustodyType = resultCustody;
}
let keyring = await this.keyringController.getKeyringsByType(
currentCustodyType || `Custody - ${custodianType}`,
)[0];
if (!keyring) {
keyring = await this.keyringController.addNewKeyring(
currentCustodyType || `Custody - ${custodianType}`,
);
}
const { authDetails } = keyring.getAccountDetails(address);
return keyring ? authDetails.jwt || authDetails.refreshToken : '';
}
// Based on a custodian name, get all the tokens associated with that custodian
async getCustodianJWTList(custodianName) {
console.log('getCustodianJWTList', custodianName);
const { identities } = this.preferencesController.store.getState();
const { mmiConfiguration } =
this.mmiConfigurationController.store.getState();
const addresses = Object.keys(identities);
const tokenList = [];
const { custodians } = mmiConfiguration;
const custodian = custodians.find((item) => item.name === custodianName);
if (!custodian) {
return [];
}
const keyrings = await this.keyringController.getKeyringsByType(
`Custody - ${custodian.type}`,
);
for (const address of addresses) {
for (const keyring of keyrings) {
// Narrow down to custodian Type
const accountDetails = keyring.getAccountDetails(address);
if (!accountDetails) {
log.debug(`${address} does not belong to ${custodian.type} keyring`);
continue;
}
const custodyAccountDetails =
this.custodyController.getAccountDetails(address);
if (
!custodyAccountDetails ||
custodyAccountDetails.custodianName !== custodianName
) {
log.debug(`${address} does not belong to ${custodianName} keyring`);
continue;
}
const { authDetails } = accountDetails;
let token;
if (authDetails.jwt) {
token = authDetails.jwt;
} else if (authDetails.refreshToken) {
token = authDetails.refreshToken;
}
if (!tokenList.includes(token)) {
tokenList.push(token);
}
}
}
return tokenList;
}
async getAllCustodianAccountsWithToken(custodyType, token) {
const keyring = await this.keyringController.getKeyringsByType(
`Custody - ${custodyType}`,
)[0];
return keyring ? keyring.getAllAccountsWithToken(token) : [];
}
async setCustodianNewRefreshToken({ address, newAuthDetails }) {
const custodyType = this.custodyController.getCustodyTypeByAddress(
toChecksumHexAddress(address),
);
const keyring = await this.addKeyringIfNotExists(custodyType);
await keyring.replaceRefreshTokenAuthDetails(address, newAuthDetails);
}
async handleMmiCheckIfTokenIsPresent(req) {
const { token, apiUrl } = req.params;
const custodyType = 'Custody - JSONRPC'; // Only JSONRPC is supported for now
// This can only work if the extension is unlocked
await this.appStateController.getUnlockPromise(true);
const keyring = await this.addKeyringIfNotExists(custodyType);
return await this.custodyController.handleMmiCheckIfTokenIsPresent({
token,
apiUrl,
keyring,
});
}
async setAccountAndNetwork(origin, address, chainId) {
await this.appStateController.getUnlockPromise(true);
const selectedAddress = this.preferencesController.getSelectedAddress();
if (selectedAddress.toLowerCase() !== address.toLowerCase()) {
this.preferencesController.setSelectedAddress(address);
}
const selectedChainId = parseInt(
this.networkController.getCurrentChainId(),
16,
);
if (selectedChainId !== chainId && chainId === 1) {
this.networkController.setProviderType('mainnet');
} else if (selectedChainId !== chainId) {
const network = this.preferencesController
.getFrequentRpcListDetail()
.find((item) => parseInt(item.chainId, 16) === chainId);
this.networkController.setRpcTarget(
network.rpcUrl,
network.chainId,
network.ticker,
network.nickname,
);
}
getPermissionBackgroundApiMethods(
this.permissionController,
).addPermittedAccount(origin, address);
return true;
}
async handleMmiOpenSwaps(origin, address, chainId) {
await this.setAccountAndNetwork(origin, address, chainId);
this.platform.openExtensionInBrowser(BUILD_QUOTE_ROUTE);
return true;
}
async handleMmiOpenAddHardwareWallet() {
await this.appStateController.getUnlockPromise(true);
this.platform.openExtensionInBrowser(CONNECT_HARDWARE_ROUTE);
return true;
}
}

View File

@ -0,0 +1,129 @@
/* eslint-disable */
import { KeyringController } from '@metamask/eth-keyring-controller';
import { MmiConfigurationController } from '@metamask-institutional/custody-keyring';
import { TransactionUpdateController } from '@metamask-institutional/transaction-update';
import MMIController from './mmi-controller';
import TransactionController from './transactions';
import PreferencesController from './preferences';
import AppStateController from './app-state';
describe('MMIController', function () {
let mmiController;
beforeEach(function () {
mmiController = new MMIController({
mmiConfigurationController: new MmiConfigurationController(),
keyringController: new KeyringController({
initState: {},
}),
transactionUpdateController: new TransactionUpdateController({
getCustodyKeyring: jest.fn(),
}),
txController: new TransactionController({
initState: {},
provider: {
chainId: 'fail',
nickname: '',
rpcTarget: 'https://api.myetherwallet.com/eth',
ticker: 'ETH',
type: 'rinkeby',
},
getCurrentChainId: jest.fn(),
getNetworkId: jest.fn(),
onNetworkStateChange: jest.fn(),
}),
preferencesController: new PreferencesController({
initState: {},
onInfuraIsBlocked: jest.fn(),
onInfuraIsUnblocked: jest.fn(),
provider: {},
}),
appStateController: new AppStateController({
addUnlockListener: jest.fn(),
isUnlocked: jest.fn(() => true),
initState: {},
onInactiveTimeout: jest.fn(),
showUnlockRequest: jest.fn(),
preferencesStore: {
subscribe: jest.fn(),
getState: jest.fn(() => ({
preferences: {
autoLockTimeLimit: 0,
},
})),
},
qrHardwareStore: {
subscribe: jest.fn(),
},
messenger: {
call: jest.fn(() => ({
catch: jest.fn(),
})),
},
}),
custodianEventHandlerFactory: jest.fn(),
});
});
describe('mmiController constructor', function () {
it('should instantiate correctly', function () {
expect(mmiController).toBeInstanceOf(MMIController);
});
it('should have all required properties', function () {
expect(mmiController.opts).toBeDefined();
expect(mmiController.mmiConfigurationController).toBeDefined();
expect(mmiController.preferencesController).toBeDefined();
expect(mmiController.transactionUpdateController).toBeDefined();
});
});
describe('persistKeyringsAfterRefreshTokenChange', function () {
it('should call keyringController.persistAllKeyrings', async function () {
mmiController.keyringController.persistAllKeyrings = jest.fn();
await mmiController.persistKeyringsAfterRefreshTokenChange();
expect(
mmiController.keyringController.persistAllKeyrings,
).toHaveBeenCalled();
});
});
describe('trackTransactionEventFromCustodianEvent', function () {
it('should call txController._trackTransactionMetricsEvent', function () {
const txMeta = {};
const event = 'event';
mmiController.txController._trackTransactionMetricsEvent = jest.fn();
mmiController.trackTransactionEventFromCustodianEvent(txMeta, event);
expect(
mmiController.txController._trackTransactionMetricsEvent,
).toHaveBeenCalledWith(txMeta, event);
});
});
describe('custodianEventHandlerFactory', function () {
it('should call custodianEventHandlerFactory', async function () {
mmiController.custodianEventHandlerFactory = jest.fn();
mmiController.custodianEventHandlerFactory();
expect(mmiController.custodianEventHandlerFactory).toHaveBeenCalled();
});
});
describe('storeCustodianSupportedChains', function () {
it('should call storeCustodianSupportedChains', async function () {
mmiController.storeCustodianSupportedChains = jest.fn();
mmiController.storeCustodianSupportedChains('0x1');
expect(mmiController.storeCustodianSupportedChains).toHaveBeenCalledWith(
'0x1',
);
});
});
});

File diff suppressed because it is too large Load Diff

View File

@ -130,12 +130,26 @@ export type NetworkControllerEvent =
| NetworkControllerInfuraIsBlockedEvent
| NetworkControllerInfuraIsUnblockedEvent;
export type NetworkControllerGetProviderConfigAction = {
type: `NetworkController:getProviderConfig`;
handler: () => ProviderConfiguration;
};
export type NetworkControllerGetEthQueryAction = {
type: `NetworkController:getEthQuery`;
handler: () => EthQuery | undefined;
};
export type NetworkControllerAction =
| NetworkControllerGetProviderConfigAction
| NetworkControllerGetEthQueryAction;
/**
* The messenger that the NetworkController uses to publish events.
*/
export type NetworkControllerMessenger = RestrictedControllerMessenger<
typeof name,
never,
NetworkControllerAction,
NetworkControllerEvent,
string,
string
@ -174,6 +188,10 @@ export type ProviderConfiguration = {
rpcPrefs?: {
blockExplorerUrl?: string;
};
/**
* The ID of the network configuration used to build this provider config.
*/
id?: NetworkConfigurationId;
};
/**
@ -350,9 +368,7 @@ function buildDefaultNetworkStatusState(): NetworkStatus {
*/
function buildDefaultNetworkDetailsState(): NetworkDetails {
return {
EIPS: {
1559: undefined,
},
EIPS: {},
};
}
@ -434,6 +450,8 @@ export class NetworkController extends EventEmitter {
#blockTrackerProxy: SwappableProxy<PollingBlockTracker> | null;
#ethQuery: EthQuery | undefined;
#infuraProjectId: NetworkControllerOptions['infuraProjectId'];
#trackMetaMetricsEvent: NetworkControllerOptions['trackMetaMetricsEvent'];
@ -477,6 +495,13 @@ export class NetworkController extends EventEmitter {
}
this.#infuraProjectId = infuraProjectId;
this.#trackMetaMetricsEvent = trackMetaMetricsEvent;
this.#messenger.registerActionHandler(`${name}:getProviderConfig`, () => {
return this.store.getState().providerConfig;
});
this.#messenger.registerActionHandler(`${name}:getEthQuery`, () => {
return this.#ethQuery;
});
}
/**
@ -560,7 +585,7 @@ export class NetworkController extends EventEmitter {
* blocking requests, or if the network is not Infura-supported.
*/
async lookupNetwork(): Promise<void> {
const { chainId, type } = this.store.getState().providerConfig;
const { type } = this.store.getState().providerConfig;
const { provider } = this.getProviderAndBlockTracker();
let networkChanged = false;
let networkId: NetworkIdState = null;
@ -574,16 +599,6 @@ export class NetworkController extends EventEmitter {
return;
}
if (!chainId) {
log.warn(
'NetworkController - lookupNetwork aborted due to missing chainId',
);
this.#resetNetworkId();
this.#resetNetworkStatus();
this.#resetNetworkDetails();
return;
}
const isInfura = isInfuraProviderType(type);
const listener = () => {
@ -727,6 +742,7 @@ export class NetworkController extends EventEmitter {
ticker: 'ticker' in network ? network.ticker : 'ETH',
nickname: undefined,
rpcPrefs: { blockExplorerUrl: network.blockExplorerUrl },
id: undefined,
});
}
@ -864,11 +880,12 @@ export class NetworkController extends EventEmitter {
* the new network.
*/
async #switchNetwork(providerConfig: ProviderConfiguration) {
const { type, rpcUrl, chainId } = providerConfig;
this.#messenger.publish('NetworkController:networkWillChange');
this.#resetNetworkId();
this.#resetNetworkStatus();
this.#resetNetworkDetails();
this.#configureProvider(providerConfig);
this.#configureProvider({ type, rpcUrl, chainId });
this.#messenger.publish('NetworkController:networkDidChange');
await this.lookupNetwork();
}
@ -878,8 +895,7 @@ export class NetworkController extends EventEmitter {
* block tracker) to talk to a network.
*
* @param args - The arguments.
* @param args.type - The shortname of an Infura-supported network (see
* {@link NETWORK_TYPES}).
* @param args.type - The provider type.
* @param args.rpcUrl - The URL of the RPC endpoint that represents the
* network. Only used for non-Infura networks.
* @param args.chainId - The chain ID of the network (as per EIP-155). Only
@ -887,21 +903,43 @@ export class NetworkController extends EventEmitter {
* any Infura-supported network).
* @throws if the `type` if not a known Infura-supported network.
*/
#configureProvider({ type, rpcUrl, chainId }: ProviderConfiguration): void {
#configureProvider({
type,
rpcUrl,
chainId,
}: {
type: ProviderType;
rpcUrl: string | undefined;
chainId: Hex | undefined;
}): void {
const isInfura = isInfuraProviderType(type);
if (isInfura) {
// infura type-based endpoints
this.#configureInfuraProvider({
type,
infuraProjectId: this.#infuraProjectId,
});
} else if (type === NETWORK_TYPES.RPC && rpcUrl) {
// url-based rpc endpoints
} else if (type === NETWORK_TYPES.RPC) {
if (chainId === undefined) {
throw new Error('chainId must be provided for custom RPC endpoints');
}
if (rpcUrl === undefined) {
throw new Error('rpcUrl must be provided for custom RPC endpoints');
}
this.#configureStandardProvider(rpcUrl, chainId);
} else {
throw new Error(
`NetworkController - #configureProvider - unknown type "${type}"`,
);
throw new Error(`Unrecognized network type: '${type}'`);
}
}
/**
* Creates a new instance of EthQuery that wraps the current provider and
* saves it for future usage.
*/
#registerProvider() {
const { provider } = this.getProviderAndBlockTracker();
if (provider) {
this.#ethQuery = new EthQuery(provider);
}
}
@ -928,7 +966,7 @@ export class NetworkController extends EventEmitter {
infuraProjectId,
type: NetworkClientType.Infura,
});
this.#setProviderAndBlockTracker({ provider, blockTracker });
this.#updateProvider(provider, blockTracker);
}
/**
@ -945,7 +983,27 @@ export class NetworkController extends EventEmitter {
rpcUrl,
type: NetworkClientType.Custom,
});
this.#setProviderAndBlockTracker({ provider, blockTracker });
this.#updateProvider(provider, blockTracker);
}
/**
* Given a provider and a block tracker, updates any proxies pointing to
* these objects that have been previously set, or initializes any proxies
* that have not been previously set, then creates an instance of EthQuery
* that wraps the provider.
*
* @param provider - The provider.
* @param blockTracker - The block tracker.
*/
#updateProvider(
provider: SafeEventEmitterProvider,
blockTracker: PollingBlockTracker,
) {
this.#setProviderAndBlockTracker({
provider,
blockTracker,
});
this.#registerProvider();
}
/**

View File

@ -8,15 +8,17 @@ import {
ExcludedSnapPermissions,
} from '../../../../../shared/constants/permissions';
// TODO: Use the exported versions of these functions from the snaps monorepo after stable release.
/**
* @returns {Record<string, Record<string, unknown>>} All endowment permission
* specifications.
*/
export const buildSnapEndowmentSpecifications = () =>
Object.values(endowmentPermissionBuilders).reduce(
(allSpecifications, { targetKey, specificationBuilder }) => {
if (!Object.keys(ExcludedSnapEndowments).includes(targetKey)) {
allSpecifications[targetKey] = specificationBuilder();
(allSpecifications, { targetName, specificationBuilder }) => {
if (!Object.keys(ExcludedSnapEndowments).includes(targetName)) {
allSpecifications[targetName] = specificationBuilder();
}
return allSpecifications;
},
@ -29,9 +31,9 @@ export const buildSnapEndowmentSpecifications = () =>
*/
export const buildSnapRestrictedMethodSpecifications = (hooks) =>
Object.values(restrictedMethodPermissionBuilders).reduce(
(specifications, { targetKey, specificationBuilder, methodHooks }) => {
if (!Object.keys(ExcludedSnapPermissions).includes(targetKey)) {
specifications[targetKey] = specificationBuilder({
(specifications, { targetName, specificationBuilder, methodHooks }) => {
if (!Object.keys(ExcludedSnapPermissions).includes(targetName)) {
specifications[targetName] = specificationBuilder({
methodHooks: selectHooks(hooks, methodHooks),
});
}

View File

@ -8,6 +8,14 @@ import {
buildSnapRestrictedMethodSpecifications,
} from './snap-permissions';
// Temporarily replace the snaps packages with the Flask versions.
jest.mock('@metamask/snaps-controllers', () =>
jest.requireActual('@metamask/snaps-controllers-flask'),
);
jest.mock('@metamask/rpc-methods', () =>
jest.requireActual('@metamask/rpc-methods-flask'),
);
describe('buildSnapRestrictedMethodSpecifications', () => {
it('creates valid permission specification objects', () => {
const hooks = {
@ -29,7 +37,7 @@ describe('buildSnapRestrictedMethodSpecifications', () => {
Object.values(specifications).forEach((specification) => {
expect(specification).toMatchObject({
targetKey: expect.stringMatching(/^(snap_|wallet_)/u),
targetName: expect.stringMatching(/^(snap_|wallet_)/u),
methodImplementation: expect.any(Function),
});
});
@ -43,8 +51,8 @@ describe('buildSnapEndowmentSpecifications', () => {
).toStrictEqual(
Object.keys(EndowmentPermissions)
.filter(
(targetKey) =>
!Object.keys(ExcludedSnapEndowments).includes(targetKey),
(targetName) =>
!Object.keys(ExcludedSnapEndowments).includes(targetName),
)
.sort(),
);

View File

@ -21,7 +21,7 @@ import {
* The "keys" of all of permissions recognized by the PermissionController.
* Permission keys and names have distinct meanings in the permission system.
*/
const PermissionKeys = Object.freeze({
const PermissionNames = Object.freeze({
...RestrictedMethods,
});
@ -61,9 +61,7 @@ export const getCaveatSpecifications = ({ getIdentities }) => {
decorator: (method, caveat) => {
return async (args) => {
const result = await method(args);
return result
.filter((account) => caveat.value.includes(account))
.slice(0, 1);
return result.filter((account) => caveat.value.includes(account));
};
},
@ -101,22 +99,22 @@ export const getPermissionSpecifications = ({
captureKeyringTypesWithMissingIdentities,
}) => {
return {
[PermissionKeys.eth_accounts]: {
[PermissionNames.eth_accounts]: {
permissionType: PermissionType.RestrictedMethod,
targetKey: PermissionKeys.eth_accounts,
targetName: PermissionNames.eth_accounts,
allowedCaveats: [CaveatTypes.restrictReturnedAccounts],
factory: (permissionOptions, requestData) => {
if (Array.isArray(permissionOptions.caveats)) {
throw new Error(
`${PermissionKeys.eth_accounts} error: Received unexpected caveats. Any permitted caveats will be added automatically.`,
`${PermissionNames.eth_accounts} error: Received unexpected caveats. Any permitted caveats will be added automatically.`,
);
}
// This value will be further validated as part of the caveat.
if (!requestData.approvedAccounts) {
throw new Error(
`${PermissionKeys.eth_accounts} error: No approved accounts specified.`,
`${PermissionNames.eth_accounts} error: No approved accounts specified.`,
);
}
@ -169,7 +167,7 @@ export const getPermissionSpecifications = ({
caveats[0].type !== CaveatTypes.restrictReturnedAccounts
) {
throw new Error(
`${PermissionKeys.eth_accounts} error: Invalid caveats. There must be a single caveat of type "${CaveatTypes.restrictReturnedAccounts}".`,
`${PermissionNames.eth_accounts} error: Invalid caveats. There must be a single caveat of type "${CaveatTypes.restrictReturnedAccounts}".`,
);
}
},
@ -189,7 +187,7 @@ export const getPermissionSpecifications = ({
function validateCaveatAccounts(accounts, getIdentities) {
if (!Array.isArray(accounts) || accounts.length === 0) {
throw new Error(
`${PermissionKeys.eth_accounts} error: Expected non-empty array of Ethereum addresses.`,
`${PermissionNames.eth_accounts} error: Expected non-empty array of Ethereum addresses.`,
);
}
@ -197,13 +195,13 @@ function validateCaveatAccounts(accounts, getIdentities) {
accounts.forEach((address) => {
if (!address || typeof address !== 'string') {
throw new Error(
`${PermissionKeys.eth_accounts} error: Expected an array of Ethereum addresses. Received: "${address}".`,
`${PermissionNames.eth_accounts} error: Expected an array of Ethereum addresses. Received: "${address}".`,
);
}
if (!identities[address]) {
throw new Error(
`${PermissionKeys.eth_accounts} error: Received unrecognized address: "${address}".`,
`${PermissionNames.eth_accounts} error: Received unrecognized address: "${address}".`,
);
}
});

View File

@ -46,7 +46,7 @@ describe('PermissionController specifications', () => {
describe('restrictReturnedAccounts', () => {
describe('decorator', () => {
it('returns the first array member included in the caveat value', async () => {
it('only returns array members included in the caveat value', async () => {
const getIdentities = jest.fn();
const { decorator } = getCaveatSpecifications({ getIdentities })[
CaveatTypes.restrictReturnedAccounts
@ -55,10 +55,10 @@ describe('PermissionController specifications', () => {
const method = async () => ['0x1', '0x2', '0x3'];
const caveat = {
type: CaveatTypes.restrictReturnedAccounts,
value: ['0x1', '0x2'],
value: ['0x1', '0x3'],
};
const decorated = decorator(method, caveat);
expect(await decorated()).toStrictEqual(['0x1']);
expect(await decorated()).toStrictEqual(['0x1', '0x3']);
});
it('returns an empty array if no array members are included in the caveat value', async () => {
@ -144,7 +144,7 @@ describe('PermissionController specifications', () => {
const permissionSpecifications = getPermissionSpecifications({});
expect(Object.keys(permissionSpecifications)).toHaveLength(1);
expect(
permissionSpecifications[RestrictedMethods.eth_accounts].targetKey,
permissionSpecifications[RestrictedMethods.eth_accounts].targetName,
).toStrictEqual(RestrictedMethods.eth_accounts);
});

View File

@ -6,6 +6,7 @@ import { setDashboardCookie } from '@metamask-institutional/portfolio-dashboard'
import { IPFS_DEFAULT_GATEWAY_URL } from '../../../shared/constants/network';
import { LedgerTransportTypes } from '../../../shared/constants/hardware-wallets';
import { ThemeType } from '../../../shared/constants/preferences';
import { shouldShowLineaMainnet } from '../../../shared/modules/network.utils';
export default class PreferencesController {
/**
@ -69,13 +70,10 @@ export default class PreferencesController {
: LedgerTransportTypes.u2f,
transactionSecurityCheckEnabled: false,
theme: ThemeType.os,
isLineaMainnetReleased: false,
...opts.initState,
};
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
initState.useTokenDetection = Boolean(process.env.TOKEN_DETECTION_V2);
///: END:ONLY_INCLUDE_IN
this.network = opts.network;
this._onInfuraIsBlocked = opts.onInfuraIsBlocked;
this._onInfuraIsUnblocked = opts.onInfuraIsUnblocked;
@ -84,7 +82,7 @@ export default class PreferencesController {
this.tokenListController = opts.tokenListController;
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
this.handleMmiPortfolio = opts.handleMmiPortfolio;
this.handleMmiDashboardData = opts.handleMmiDashboardData;
if (!process.env.IN_TEST) {
this.mmiConfigurationStore = opts.mmiConfigurationStore.getState();
@ -96,6 +94,8 @@ export default class PreferencesController {
global.setPreference = (key, value) => {
return this.setFeatureFlag(key, value);
};
this._showShouldLineaMainnetNetwork();
}
// PUBLIC METHODS
@ -538,7 +538,7 @@ export default class PreferencesController {
async prepareMmiPortfolio() {
if (!process.env.IN_TEST) {
try {
const mmiDashboardData = await this.handleMmiPortfolio();
const mmiDashboardData = await this.handleMmiDashboardData();
const cookieSetUrls =
this.mmiConfigurationStore.mmiConfiguration?.portfolio?.cookieSetUrls;
setDashboardCookie(mmiDashboardData, cookieSetUrls);
@ -578,4 +578,12 @@ export default class PreferencesController {
this.store.updateState({ infuraBlocked: isBlocked });
}
/**
* A method to check is the linea mainnet network should be displayed
*/
_showShouldLineaMainnetNetwork() {
const showLineaMainnet = shouldShowLineaMainnet();
this.store.updateState({ isLineaMainnetReleased: showLineaMainnet });
}
}

View File

@ -104,23 +104,34 @@ const initialState = {
};
export default class SwapsController {
constructor({
getBufferedGasLimit,
networkController,
provider,
getProviderConfig,
getTokenRatesState,
fetchTradesInfo = defaultFetchTradesInfo,
getCurrentChainId,
getEIP1559GasFeeEstimates,
onNetworkStateChange,
}) {
constructor(
{
getBufferedGasLimit,
networkController,
provider,
getProviderConfig,
getTokenRatesState,
fetchTradesInfo = defaultFetchTradesInfo,
getCurrentChainId,
getEIP1559GasFeeEstimates,
onNetworkStateChange,
},
state,
) {
this.store = new ObservableStore({
swapsState: { ...initialState.swapsState },
swapsState: {
...initialState.swapsState,
swapsFeatureFlags: state?.swapsState?.swapsFeatureFlags || {},
},
});
this.resetState = () => {
this.store.updateState({ swapsState: { ...initialState.swapsState } });
this.store.updateState({
swapsState: {
...initialState.swapsState,
swapsFeatureFlags: state?.swapsState?.swapsFeatureFlags,
},
});
};
this._fetchTradesInfo = fetchTradesInfo;
@ -662,6 +673,7 @@ export default class SwapsController {
swapsQuoteRefreshTime: swapsState.swapsQuoteRefreshTime,
swapsQuotePrefetchingRefreshTime:
swapsState.swapsQuotePrefetchingRefreshTime,
swapsFeatureFlags: swapsState.swapsFeatureFlags,
},
});
clearTimeout(this.pollingTimeout);

View File

@ -2,7 +2,7 @@ import EventEmitter from '@metamask/safe-event-emitter';
import { ObservableStore } from '@metamask/obs-store';
import { bufferToHex, keccak, toBuffer, isHexString } from 'ethereumjs-util';
import EthQuery from 'ethjs-query';
import { ethErrors } from 'eth-rpc-errors';
import { errorCodes, ethErrors } from 'eth-rpc-errors';
import { Common, Hardfork } from '@ethereumjs/common';
import { TransactionFactory } from '@ethereumjs/tx';
import { ApprovalType } from '@metamask/controller-utils';
@ -202,7 +202,7 @@ export default class TransactionController extends EventEmitter {
const approved = this.txStateManager.getApprovedTransactions();
return [...pending, ...approved];
},
approveTransaction: this.approveTransaction.bind(this),
approveTransaction: this._approveTransaction.bind(this),
getCompletedTransactions:
this.txStateManager.getConfirmedTransactions.bind(this.txStateManager),
});
@ -277,7 +277,12 @@ export default class TransactionController extends EventEmitter {
// type will be one of our default network names or 'rpc'. the default
// network names are sufficient configuration, simply pass the name as the
// chain argument in the constructor.
if (type !== NETWORK_TYPES.RPC && type !== NETWORK_TYPES.SEPOLIA) {
if (
type !== NETWORK_TYPES.RPC &&
type !== NETWORK_TYPES.SEPOLIA &&
type !== NETWORK_TYPES.LINEA_GOERLI &&
type !== NETWORK_TYPES.LINEA_MAINNET
) {
return new Common({
chain: type,
hardfork,
@ -347,7 +352,7 @@ export default class TransactionController extends EventEmitter {
`MetaMaskController newUnapprovedTransaction ${JSON.stringify(txParams)}`,
);
const initialTxMeta = await this.addUnapprovedTransaction(
const { txMeta: initialTxMeta, isExisting } = await this._createTransaction(
opts.method,
txParams,
opts.origin,
@ -356,58 +361,59 @@ export default class TransactionController extends EventEmitter {
opts.id,
);
// listen for tx completion (success, fail)
return new Promise((resolve, reject) => {
this.txStateManager.once(
`${initialTxMeta.id}:finished`,
(finishedTxMeta) => {
switch (finishedTxMeta.status) {
case TransactionStatus.submitted:
return resolve(finishedTxMeta.hash);
case TransactionStatus.rejected:
return reject(
cleanErrorStack(
ethErrors.provider.userRejectedRequest(
'MetaMask Tx Signature: User denied transaction signature.',
),
),
);
case TransactionStatus.failed:
return reject(
cleanErrorStack(
ethErrors.rpc.internal(finishedTxMeta.err.message),
),
);
default:
return reject(
cleanErrorStack(
ethErrors.rpc.internal(
`MetaMask Tx Signature: Unknown problem: ${JSON.stringify(
finishedTxMeta.txParams,
)}`,
),
),
);
}
},
);
});
const txId = initialTxMeta.id;
const isCompleted = this._isTransactionCompleted(initialTxMeta);
const finishedPromise = isCompleted
? Promise.resolve(initialTxMeta)
: this._waitForTransactionFinished(txId);
if (!isExisting && !isCompleted) {
try {
await this._requestTransactionApproval(initialTxMeta);
} catch (error) {
// Errors generated from final status using finished event
}
}
const finalTxMeta = await finishedPromise;
const finalStatus = finalTxMeta?.status;
switch (finalStatus) {
case TransactionStatus.submitted:
return finalTxMeta.hash;
case TransactionStatus.rejected:
throw cleanErrorStack(
ethErrors.provider.userRejectedRequest(
'MetaMask Tx Signature: User denied transaction signature.',
),
);
case TransactionStatus.failed:
throw cleanErrorStack(ethErrors.rpc.internal(finalTxMeta.err.message));
default:
throw cleanErrorStack(
ethErrors.rpc.internal(
`MetaMask Tx Signature: Unknown problem: ${JSON.stringify(
finalTxMeta?.txParams,
)}`,
),
);
}
}
/**
* Creates approvals for all unapproved transactions in the txStateManager.
*
* @returns {Promise<void>}
*/
async initApprovals() {
initApprovals() {
const unapprovedTxs = this.txStateManager.getUnapprovedTxList();
return Promise.all(
Object.values(unapprovedTxs).map((txMeta) =>
this._requestApproval(txMeta, {
shouldShowRequest: false,
}),
),
);
Object.values(unapprovedTxs).forEach((txMeta) => {
this._requestTransactionApproval(txMeta, {
shouldShowRequest: false,
}).catch((error) => {
log.error('Error during persisted transaction approval', error);
});
});
}
// ====================================================================================================================================================
@ -606,81 +612,6 @@ export default class TransactionController extends EventEmitter {
return this._getTransaction(txId);
}
/**
* updates a swap approval transaction with provided metadata and source token symbol
* if the transaction state is unapproved.
*
* @param {string} txId
* @param {object} swapApprovalTransaction - holds the metadata and token symbol
* @param {string} swapApprovalTransaction.type
* @param {string} swapApprovalTransaction.sourceTokenSymbol
* @returns {TransactionMeta} the txMeta of the updated transaction
*/
updateSwapApprovalTransaction(txId, { type, sourceTokenSymbol }) {
this._throwErrorIfNotUnapprovedTx(txId, 'updateSwapApprovalTransaction');
let swapApprovalTransaction = { type, sourceTokenSymbol };
// only update what is defined
swapApprovalTransaction = pickBy(swapApprovalTransaction);
const note = `Update Swap Approval Transaction for ${txId}`;
this._updateTransaction(txId, swapApprovalTransaction, note);
return this._getTransaction(txId);
}
/**
* updates a swap transaction with provided metadata and source token symbol
* if the transaction state is unapproved.
*
* @param {string} txId
* @param {object} swapTransaction - holds the metadata
* @param {string} swapTransaction.sourceTokenSymbol
* @param {string} swapTransaction.destinationTokenSymbol
* @param {string} swapTransaction.type
* @param {string} swapTransaction.destinationTokenDecimals
* @param {string} swapTransaction.destinationTokenAddress
* @param {string} swapTransaction.swapMetaData
* @param {string} swapTransaction.swapTokenValue
* @param {string} swapTransaction.estimatedBaseFee
* @param {string} swapTransaction.approvalTxId
* @returns {TransactionMeta} the txMeta of the updated transaction
*/
updateSwapTransaction(
txId,
{
sourceTokenSymbol,
destinationTokenSymbol,
type,
destinationTokenDecimals,
destinationTokenAddress,
swapMetaData,
swapTokenValue,
estimatedBaseFee,
approvalTxId,
},
) {
this._throwErrorIfNotUnapprovedTx(txId, 'updateSwapTransaction');
let swapTransaction = {
sourceTokenSymbol,
destinationTokenSymbol,
type,
destinationTokenDecimals,
destinationTokenAddress,
swapMetaData,
swapTokenValue,
estimatedBaseFee,
approvalTxId,
};
// only update what is defined
swapTransaction = pickBy(swapTransaction);
const note = `Update Swap Transaction for ${txId}`;
this._updateTransaction(txId, swapTransaction, note);
return this._getTransaction(txId);
}
/**
* updates a transaction's user settings only if the transaction state is unapproved
*
@ -789,7 +720,7 @@ export default class TransactionController extends EventEmitter {
* @param transactionType
* @param sendFlowHistory
* @param actionId
* @returns {txMeta}
* @param options
*/
async addUnapprovedTransaction(
txMethodType,
@ -798,98 +729,30 @@ export default class TransactionController extends EventEmitter {
transactionType,
sendFlowHistory = [],
actionId,
options,
) {
if (
transactionType !== undefined &&
!VALID_UNAPPROVED_TRANSACTION_TYPES.includes(transactionType)
) {
throw new Error(
`TransactionController - invalid transactionType value: ${transactionType}`,
);
}
// If a transaction is found with the same actionId, do not create a new speed-up transaction.
if (actionId) {
let existingTxMeta =
this.txStateManager.getTransactionWithActionId(actionId);
if (existingTxMeta) {
this.emit('newUnapprovedTx', existingTxMeta);
existingTxMeta = await this.addTransactionGasDefaults(existingTxMeta);
this._requestApproval(existingTxMeta);
return existingTxMeta;
}
}
// validate
const normalizedTxParams = txUtils.normalizeTxParams(txParams);
const eip1559Compatibility = await this.getEIP1559Compatibility();
txUtils.validateTxParams(normalizedTxParams, eip1559Compatibility);
/**
* `generateTxMeta` adds the default txMeta properties to the passed object.
* These include the tx's `id`. As we use the id for determining order of
* txes in the tx-state-manager, it is necessary to call the asynchronous
* method `determineTransactionType` after `generateTxMeta`.
*/
let txMeta = this.txStateManager.generateTxMeta({
txParams: normalizedTxParams,
const { txMeta, isExisting } = await this._createTransaction(
txMethodType,
txParams,
origin,
transactionType,
sendFlowHistory,
});
// Add actionId to txMeta to check if same actionId is seen again
// IF request to create transaction with same actionId is submitted again, new transaction will not be added for it.
if (actionId) {
txMeta.actionId = actionId;
}
if (origin === ORIGIN_METAMASK) {
// Assert the from address is the selected address
if (normalizedTxParams.from !== this.getSelectedAddress()) {
throw ethErrors.rpc.internal({
message: `Internally initiated transaction is using invalid account.`,
data: {
origin,
fromAddress: normalizedTxParams.from,
selectedAddress: this.getSelectedAddress(),
},
});
}
} else {
// Assert that the origin has permissions to initiate transactions from
// the specified address
const permittedAddresses = await this.getPermittedAccounts(origin);
if (!permittedAddresses.includes(normalizedTxParams.from)) {
throw ethErrors.provider.unauthorized({ data: { origin } });
}
}
const { type } = await determineTransactionType(
normalizedTxParams,
this.query,
actionId,
options,
);
txMeta.type = transactionType || type;
if (isExisting) {
const isCompleted = this._isTransactionCompleted(txMeta);
// ensure value
txMeta.txParams.value = txMeta.txParams.value
? addHexPrefix(txMeta.txParams.value)
: '0x0';
if (txMethodType && this.securityProviderRequest) {
const securityProviderResponse = await this.securityProviderRequest(
txMeta,
txMethodType,
);
txMeta.securityProviderResponse = securityProviderResponse;
return isCompleted
? txMeta
: await this._waitForTransactionFinished(txMeta.id);
}
this.addTransaction(txMeta);
this.emit('newUnapprovedTx', txMeta);
txMeta = await this.addTransactionGasDefaults(txMeta);
this._requestApproval(txMeta);
if (options?.requireApproval === false) {
await this._updateAndApproveTransaction(txMeta, actionId);
} else {
await this._requestTransactionApproval(txMeta, { actionId });
}
return txMeta;
}
@ -1260,7 +1123,7 @@ export default class TransactionController extends EventEmitter {
}
this.addTransaction(newTxMeta);
await this.approveTransaction(newTxMeta.id, actionId, {
await this._approveTransaction(newTxMeta.id, actionId, {
hasApprovalRequest: false,
});
return newTxMeta;
@ -1320,9 +1183,7 @@ export default class TransactionController extends EventEmitter {
}
this.addTransaction(newTxMeta);
await this.approveTransaction(newTxMeta.id, actionId, {
hasApprovalRequest: false,
});
await this._approveTransaction(newTxMeta.id, actionId);
return newTxMeta;
}
@ -1338,113 +1199,6 @@ export default class TransactionController extends EventEmitter {
);
}
/**
* updates and approves the transaction
*
* @param {object} txMeta
* @param {string} actionId
*/
async updateAndApproveTransaction(txMeta, actionId) {
this.txStateManager.updateTransaction(
txMeta,
'confTx: user approved transaction',
);
await this.approveTransaction(txMeta.id, actionId);
}
/**
* sets the tx status to approved
* auto fills the nonce
* signs the transaction
* publishes the transaction
* if any of these steps fails the tx status will be set to failed
*
* @param {number} txId - the tx's Id
* @param {string} actionId - actionId passed from UI
* @param opts - options object
* @param opts.hasApprovalRequest - whether the transaction has an approval request
*/
async approveTransaction(txId, actionId, { hasApprovalRequest = true } = {}) {
// TODO: Move this safety out of this function.
// Since this transaction is async,
// we need to keep track of what is currently being signed,
// So that we do not increment nonce + resubmit something
// that is already being incremented & signed.
const txMeta = this.txStateManager.getTransaction(txId);
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
// MMI does not broadcast transactions, as that is the responsibility of the custodian
if (txMeta.custodyStatus) {
this.inProcessOfSigning.delete(txId);
await this.signTransaction(txId);
return;
}
///: END:ONLY_INCLUDE_IN
if (this.inProcessOfSigning.has(txId)) {
return;
}
this.inProcessOfSigning.add(txId);
let nonceLock;
try {
// approve
this.txStateManager.setTxStatusApproved(txId);
if (hasApprovalRequest) {
this._acceptApproval(txMeta);
}
// get next nonce
const fromAddress = txMeta.txParams.from;
// wait for a nonce
let { customNonceValue } = txMeta;
customNonceValue = Number(customNonceValue);
nonceLock = await this.nonceTracker.getNonceLock(fromAddress);
// add nonce to txParams
// if txMeta has previousGasParams then it is a retry at same nonce with
// higher gas settings and therefor the nonce should not be recalculated
const nonce = txMeta.previousGasParams
? txMeta.txParams.nonce
: nonceLock.nextNonce;
const customOrNonce =
customNonceValue === 0 ? customNonceValue : customNonceValue || nonce;
txMeta.txParams.nonce = addHexPrefix(customOrNonce.toString(16));
// add nonce debugging information to txMeta
txMeta.nonceDetails = nonceLock.nonceDetails;
if (customNonceValue) {
txMeta.nonceDetails.customNonceValue = customNonceValue;
}
this.txStateManager.updateTransaction(
txMeta,
'transactions#approveTransaction',
);
// sign transaction
const rawTx = await this.signTransaction(txId);
await this.publishTransaction(txId, rawTx, actionId);
this._trackTransactionMetricsEvent(
txMeta,
TransactionMetaMetricsEvent.approved,
actionId,
);
// must set transaction to submitted/failed before releasing lock
nonceLock.releaseLock();
} catch (err) {
// this is try-catch wrapped so that we can guarantee that the nonceLock is released
try {
this._failTransaction(txId, err, actionId);
} catch (err2) {
log.error(err2);
}
// must set transaction to submitted/failed before releasing lock
if (nonceLock) {
nonceLock.releaseLock();
}
// continue with error chain
throw err;
} finally {
this.inProcessOfSigning.delete(txId);
}
}
async approveTransactionsWithSameNonce(listOfTxParams = []) {
if (listOfTxParams.length === 0) {
return '';
@ -1779,24 +1533,6 @@ export default class TransactionController extends EventEmitter {
}
}
/**
* Convenience method for the ui thats sets the transaction to rejected
*
* @param {number} txId - the tx's Id
* @param {string} actionId - actionId passed from UI
* @returns {Promise<void>}
*/
async cancelTransaction(txId, actionId) {
const txMeta = this.txStateManager.getTransaction(txId);
this.txStateManager.setTxStatusRejected(txId);
this._rejectApproval(txMeta);
this._trackTransactionMetricsEvent(
txMeta,
TransactionMetaMetricsEvent.rejected,
actionId,
);
}
/**
* Sets the txHas on the txMeta
*
@ -1835,6 +1571,368 @@ export default class TransactionController extends EventEmitter {
//
// PRIVATE METHODS
//
_isTransactionCompleted(txMeta) {
return [
TransactionStatus.submitted,
TransactionStatus.rejected,
TransactionStatus.failed,
TransactionStatus.dropped,
TransactionStatus.confirmed,
].includes(txMeta.status);
}
async _waitForTransactionFinished(txId) {
return new Promise((resolve) => {
this.txStateManager.once(`${txId}:finished`, (txMeta) => {
resolve(txMeta);
});
});
}
async _createTransaction(
txMethodType,
txParams,
origin,
transactionType,
sendFlowHistory = [],
actionId,
options,
) {
if (
transactionType !== undefined &&
!VALID_UNAPPROVED_TRANSACTION_TYPES.includes(transactionType)
) {
throw new Error(
`TransactionController - invalid transactionType value: ${transactionType}`,
);
}
// If a transaction is found with the same actionId, do not create a new speed-up transaction.
if (actionId) {
let existingTxMeta =
this.txStateManager.getTransactionWithActionId(actionId);
if (existingTxMeta) {
existingTxMeta = await this.addTransactionGasDefaults(existingTxMeta);
return { txMeta: existingTxMeta, isExisting: true };
}
}
// validate
const normalizedTxParams = txUtils.normalizeTxParams(txParams);
const eip1559Compatibility = await this.getEIP1559Compatibility();
txUtils.validateTxParams(normalizedTxParams, eip1559Compatibility);
/**
* `generateTxMeta` adds the default txMeta properties to the passed object.
* These include the tx's `id`. As we use the id for determining order of
* txes in the tx-state-manager, it is necessary to call the asynchronous
* method `determineTransactionType` after `generateTxMeta`.
*/
let txMeta = this.txStateManager.generateTxMeta({
txParams: normalizedTxParams,
origin,
sendFlowHistory,
});
// Add actionId to txMeta to check if same actionId is seen again
// IF request to create transaction with same actionId is submitted again, new transaction will not be added for it.
if (actionId) {
txMeta.actionId = actionId;
}
if (origin === ORIGIN_METAMASK) {
// Assert the from address is the selected address
if (normalizedTxParams.from !== this.getSelectedAddress()) {
throw ethErrors.rpc.internal({
message: `Internally initiated transaction is using invalid account.`,
data: {
origin,
fromAddress: normalizedTxParams.from,
selectedAddress: this.getSelectedAddress(),
},
});
}
} else {
// Assert that the origin has permissions to initiate transactions from
// the specified address
const permittedAddresses = await this.getPermittedAccounts(origin);
if (!permittedAddresses.includes(normalizedTxParams.from)) {
throw ethErrors.provider.unauthorized({ data: { origin } });
}
}
const { type } = await determineTransactionType(
normalizedTxParams,
this.query,
);
txMeta.type = transactionType || type;
// ensure value
txMeta.txParams.value = txMeta.txParams.value
? addHexPrefix(txMeta.txParams.value)
: '0x0';
if (txMethodType && this.securityProviderRequest) {
const securityProviderResponse = await this.securityProviderRequest(
txMeta,
txMethodType,
);
txMeta.securityProviderResponse = securityProviderResponse;
}
this.addTransaction(txMeta);
txMeta = await this.addTransactionGasDefaults(txMeta);
if (
[TransactionType.swap, TransactionType.swapApproval].includes(
transactionType,
)
) {
txMeta = await this._createSwapsTransaction(
options?.swaps,
transactionType,
txMeta,
);
}
return { txMeta, isExisting: false };
}
async _createSwapsTransaction(swapOptions, transactionType, txMeta) {
// The simulationFails property is added if the estimateGas call fails. In cases
// when no swaps approval tx is required, this indicates that the swap will likely
// fail. There was an earlier estimateGas call made by the swaps controller,
// but it is possible that external conditions have change since then, and
// a previously succeeding estimate gas call could now fail. By checking for
// the `simulationFails` property here, we can reduce the number of swap
// transactions that get published to the blockchain only to fail and thereby
// waste the user's funds on gas.
if (
transactionType === TransactionType.swap &&
swapOptions?.hasApproveTx === false &&
txMeta.simulationFails
) {
await this._cancelTransaction(txMeta.id);
throw new Error('Simulation failed');
}
const swapsMeta = swapOptions?.meta;
if (!swapsMeta) {
return txMeta;
}
if (transactionType === TransactionType.swapApproval) {
this.emit('newSwapApproval', txMeta);
return this._updateSwapApprovalTransaction(txMeta.id, swapsMeta);
}
if (transactionType === TransactionType.swap) {
this.emit('newSwap', txMeta);
return this._updateSwapTransaction(txMeta.id, swapsMeta);
}
return txMeta;
}
/**
* updates a swap approval transaction with provided metadata and source token symbol
* if the transaction state is unapproved.
*
* @param {string} txId
* @param {object} swapApprovalTransaction - holds the metadata and token symbol
* @param {string} swapApprovalTransaction.type
* @param {string} swapApprovalTransaction.sourceTokenSymbol
* @returns {TransactionMeta} the txMeta of the updated transaction
*/
_updateSwapApprovalTransaction(txId, { type, sourceTokenSymbol }) {
this._throwErrorIfNotUnapprovedTx(txId, 'updateSwapApprovalTransaction');
let swapApprovalTransaction = { type, sourceTokenSymbol };
// only update what is defined
swapApprovalTransaction = pickBy(swapApprovalTransaction);
const note = `Update Swap Approval Transaction for ${txId}`;
this._updateTransaction(txId, swapApprovalTransaction, note);
return this._getTransaction(txId);
}
/**
* updates a swap transaction with provided metadata and source token symbol
* if the transaction state is unapproved.
*
* @param {string} txId
* @param {object} swapTransaction - holds the metadata
* @param {string} swapTransaction.sourceTokenSymbol
* @param {string} swapTransaction.destinationTokenSymbol
* @param {string} swapTransaction.type
* @param {string} swapTransaction.destinationTokenDecimals
* @param {string} swapTransaction.destinationTokenAddress
* @param {string} swapTransaction.swapMetaData
* @param {string} swapTransaction.swapTokenValue
* @param {string} swapTransaction.estimatedBaseFee
* @param {string} swapTransaction.approvalTxId
* @returns {TransactionMeta} the txMeta of the updated transaction
*/
_updateSwapTransaction(
txId,
{
sourceTokenSymbol,
destinationTokenSymbol,
type,
destinationTokenDecimals,
destinationTokenAddress,
swapMetaData,
swapTokenValue,
estimatedBaseFee,
approvalTxId,
},
) {
this._throwErrorIfNotUnapprovedTx(txId, 'updateSwapTransaction');
let swapTransaction = {
sourceTokenSymbol,
destinationTokenSymbol,
type,
destinationTokenDecimals,
destinationTokenAddress,
swapMetaData,
swapTokenValue,
estimatedBaseFee,
approvalTxId,
};
// only update what is defined
swapTransaction = pickBy(swapTransaction);
const note = `Update Swap Transaction for ${txId}`;
this._updateTransaction(txId, swapTransaction, note);
return this._getTransaction(txId);
}
/**
* updates and approves the transaction
*
* @param {object} txMeta
* @param {string} actionId
*/
async _updateAndApproveTransaction(txMeta, actionId) {
this.txStateManager.updateTransaction(
txMeta,
'confTx: user approved transaction',
);
await this._approveTransaction(txMeta.id, actionId);
}
/**
* sets the tx status to approved
* auto fills the nonce
* signs the transaction
* publishes the transaction
* if any of these steps fails the tx status will be set to failed
*
* @param {number} txId - the tx's Id
* @param {string} actionId - actionId passed from UI
*/
async _approveTransaction(txId, actionId) {
// TODO: Move this safety out of this function.
// Since this transaction is async,
// we need to keep track of what is currently being signed,
// So that we do not increment nonce + resubmit something
// that is already being incremented & signed.
const txMeta = this.txStateManager.getTransaction(txId);
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
// MMI does not broadcast transactions, as that is the responsibility of the custodian
if (txMeta.custodyStatus) {
this.inProcessOfSigning.delete(txId);
await this.signTransaction(txId);
return;
}
///: END:ONLY_INCLUDE_IN
if (this.inProcessOfSigning.has(txId)) {
return;
}
this.inProcessOfSigning.add(txId);
let nonceLock;
try {
// approve
this.txStateManager.setTxStatusApproved(txId);
// get next nonce
const fromAddress = txMeta.txParams.from;
// wait for a nonce
let { customNonceValue } = txMeta;
customNonceValue = Number(customNonceValue);
nonceLock = await this.nonceTracker.getNonceLock(fromAddress);
// add nonce to txParams
// if txMeta has previousGasParams then it is a retry at same nonce with
// higher gas settings and therefor the nonce should not be recalculated
const nonce = txMeta.previousGasParams
? txMeta.txParams.nonce
: nonceLock.nextNonce;
const customOrNonce =
customNonceValue === 0 ? customNonceValue : customNonceValue || nonce;
txMeta.txParams.nonce = addHexPrefix(customOrNonce.toString(16));
// add nonce debugging information to txMeta
txMeta.nonceDetails = nonceLock.nonceDetails;
if (customNonceValue) {
txMeta.nonceDetails.customNonceValue = customNonceValue;
}
this.txStateManager.updateTransaction(
txMeta,
'transactions#approveTransaction',
);
// sign transaction
const rawTx = await this.signTransaction(txId);
await this.publishTransaction(txId, rawTx, actionId);
this._trackTransactionMetricsEvent(
txMeta,
TransactionMetaMetricsEvent.approved,
actionId,
);
// must set transaction to submitted/failed before releasing lock
nonceLock.releaseLock();
} catch (err) {
// this is try-catch wrapped so that we can guarantee that the nonceLock is released
try {
this._failTransaction(txId, err, actionId);
} catch (err2) {
log.error(err2);
}
// must set transaction to submitted/failed before releasing lock
if (nonceLock) {
nonceLock.releaseLock();
}
// continue with error chain
throw err;
} finally {
this.inProcessOfSigning.delete(txId);
}
}
/**
* Convenience method for the ui thats sets the transaction to rejected
*
* @param {number} txId - the tx's Id
* @param {string} actionId - actionId passed from UI
* @returns {Promise<void>}
*/
async _cancelTransaction(txId, actionId) {
const txMeta = this.txStateManager.getTransaction(txId);
this.txStateManager.setTxStatusRejected(txId);
this._trackTransactionMetricsEvent(
txMeta,
TransactionMetaMetricsEvent.rejected,
actionId,
);
}
/** maps methods for convenience*/
_mapMethods() {
/** @returns {object} the state in transaction controller */
@ -1923,7 +2021,7 @@ export default class TransactionController extends EventEmitter {
// Line below will try to publish transaction which is in
// APPROVED state at the time of controller bootup
this.approveTransaction(txMeta.id);
this._approveTransaction(txMeta.id);
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
}
@ -2662,56 +2760,70 @@ export default class TransactionController extends EventEmitter {
);
}
async _requestApproval(
// Approvals
async _requestTransactionApproval(
txMeta,
{ shouldShowRequest = true, actionId } = {},
) {
let txId, result;
try {
txId = txMeta.id;
const { origin } = txMeta;
const approvalResult = await this._requestApproval(
String(txId),
origin,
{ txId },
{
shouldShowRequest,
},
);
result = approvalResult.resultCallbacks;
const { value } = approvalResult;
const { txMeta: updatedTxMeta } = value;
await this._updateAndApproveTransaction(updatedTxMeta, actionId);
result?.success();
} catch (error) {
const transaction = this.txStateManager.getTransaction(txId);
if (transaction && !this._isTransactionCompleted(transaction)) {
if (error.code === errorCodes.provider.userRejectedRequest) {
await this._cancelTransaction(txId, actionId);
} else {
this._failTransaction(txId, error, actionId);
}
}
result?.error(error);
throw error;
}
}
async _requestApproval(
id,
origin,
requestData,
{ shouldShowRequest } = { shouldShowRequest: true },
) {
const id = this._getApprovalId(txMeta);
const { origin } = txMeta;
const type = ApprovalType.Transaction;
const requestData = { txId: txMeta.id };
return this.messagingSystem
.call(
'ApprovalController:addRequest',
{
id,
origin,
type,
requestData,
},
shouldShowRequest,
)
.catch(() => {
// Intentionally ignored as promise not currently used
});
}
_acceptApproval(txMeta) {
const id = this._getApprovalId(txMeta);
try {
this.messagingSystem.call('ApprovalController:acceptRequest', id);
} catch (error) {
log.error('Failed to accept transaction approval request', error);
}
}
_rejectApproval(txMeta) {
const id = this._getApprovalId(txMeta);
try {
this.messagingSystem.call(
'ApprovalController:rejectRequest',
return this.messagingSystem.call(
'ApprovalController:addRequest',
{
id,
new Error('Rejected'),
);
} catch (error) {
log.error('Failed to reject transaction approval request', error);
}
}
_getApprovalId(txMeta) {
return String(txMeta.id);
origin,
type,
requestData,
expectsResult: true,
},
shouldShowRequest,
);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -7,6 +7,16 @@ import sendMetadata from './send-metadata';
import switchEthereumChain from './switch-ethereum-chain';
import watchAsset from './watch-asset';
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
import mmiSupported from './institutional/mmi-supported';
import mmiAuthenticate from './institutional/mmi-authenticate';
import mmiPortfolio from './institutional/mmi-portfolio';
import mmiOpenSwaps from './institutional/mmi-open-swaps';
import mmiCheckIfTokenIsPresent from './institutional/mmi-check-if-token-is-present';
import mmiSetAccountAndNetwork from './institutional/mmi-set-account-and-network';
import mmiOpenAddHardwareWallet from './institutional/mmi-open-add-hardware-wallet';
///: END:ONLY_INCLUDE_IN
const handlers = [
addEthereumChain,
ethAccounts,
@ -16,5 +26,14 @@ const handlers = [
sendMetadata,
switchEthereumChain,
watchAsset,
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
mmiAuthenticate,
mmiSupported,
mmiPortfolio,
mmiOpenSwaps,
mmiCheckIfTokenIsPresent,
mmiSetAccountAndNetwork,
mmiOpenAddHardwareWallet,
///: END:ONLY_INCLUDE_IN
];
export default handlers;

View File

@ -0,0 +1,43 @@
import { MESSAGE_TYPE } from '../../../../../../shared/constants/app';
const mmiAuthenticate = {
methodNames: [MESSAGE_TYPE.MMI_AUTHENTICATE, MESSAGE_TYPE.MMI_REAUTHENTICATE],
implementation: mmiAuthenticateHandler,
hookNames: {
handleMmiAuthenticate: true,
},
};
export default mmiAuthenticate;
/**
* @typedef {object} MmiAuthenticateOptions
* @property {Function} handleWatchAssetRequest - The wallet_watchAsset method implementation.
*/
/**
* @typedef {object} MmiAuthenticateParam
* @property {string} service - The service to which we are authenticating, e.g. 'codefi-compliance'
* @property {object} token - The token used to authenticate
*/
/**
* @param {import('json-rpc-engine').JsonRpcRequest<WatchAssetParam>} req - The JSON-RPC request object.
* @param {import('json-rpc-engine').JsonRpcResponse<true>} res - The JSON-RPC response object.
* @param {Function} _next - The json-rpc-engine 'next' callback.
* @param {Function} end - The json-rpc-engine 'end' callback.
* @param {WatchAssetOptions} options
*/
async function mmiAuthenticateHandler(
req,
res,
_next,
end,
{ handleMmiAuthenticate },
) {
try {
res.result = await handleMmiAuthenticate(req);
return end();
} catch (error) {
return end(error);
}
}

View File

@ -0,0 +1,46 @@
import { MESSAGE_TYPE } from '../../../../../../shared/constants/app';
const mmiAuthenticate = {
methodNames: [MESSAGE_TYPE.MMI_CHECK_IF_TOKEN_IS_PRESENT],
implementation: mmiCheckIfTokenIsPresentHandler,
hookNames: {
handleMmiCheckIfTokenIsPresent: true,
},
};
export default mmiAuthenticate;
/**
* @typedef {object} MmiAuthenticateOptions
* @property {Function} handleMmiCheckIfTokenIsPresent - The metamaskinstitutional_checkIfTokenIsPresent method implementation.
*/
/**
* @typedef {object} MmiCheckIfTokenIsPresentParam
* @property {string} service - The service to which we are authenticating, e.g. 'codefi-compliance'
* @property {object} environment - The environment in which we are authenticating, e.g. 'saturn-dev'
* @property {apiUrl} apiUrl - The API URL to which we are authenticating, e.g. 'https://saturn-custody.codefi.network/eth'
* @property {object} token - The token used to authenticate
*/
/**
* @param {import('json-rpc-engine').JsonRpcRequest<MmiCheckIfTokenIsPresentParam>} req - The JSON-RPC request object.
* @param {import('json-rpc-engine').JsonRpcResponse<true>} res - The JSON-RPC response object.
* @param {Function} _next - The json-rpc-engine 'next' callback.
* @param {Function} end - The json-rpc-engine 'end' callback.
* @param options0
* @param options0.handleMmiCheckIfTokenIsPresent
*/
async function mmiCheckIfTokenIsPresentHandler(
req,
res,
_next,
end,
{ handleMmiCheckIfTokenIsPresent },
) {
try {
res.result = await handleMmiCheckIfTokenIsPresent(req);
return end();
} catch (error) {
return end(error);
}
}

View File

@ -0,0 +1,50 @@
import { RPC_ALLOWED_ORIGINS } from '@metamask-institutional/rpc-allowlist';
import { MESSAGE_TYPE } from '../../../../../../shared/constants/app';
const mmiOpenAddHardwareWallet = {
methodNames: [MESSAGE_TYPE.MMI_OPEN_ADD_HARDWARE_WALLET],
implementation: mmiOpenAddHardwareWalletHandler,
hookNames: {
handleMmiOpenAddHardwareWallet: true,
},
};
export default mmiOpenAddHardwareWallet;
/**
* @typedef {object} MmiOpenAddHardwareWalletOptions
* @property {Function} handleMmiOpenAddHardwareWallet - The metmaskinsititutional_openAddHardwareWallet method implementation.
*/
/**
* @param {import('json-rpc-engine').JsonRpcRequest} req - The JSON-RPC request object.
* @param {import('json-rpc-engine').JsonRpcResponse<true>} res - The JSON-RPC response object.
* @param {Function} _next - The json-rpc-engine 'next' callback.
* @param {Function} end - The json-rpc-engine 'end' callback.
* @param {WatchAssetOptions} options
*/
async function mmiOpenAddHardwareWalletHandler(
req,
res,
_next,
end,
{ handleMmiOpenAddHardwareWallet },
) {
try {
let validUrl = false;
// if (!RPC_ALLOWED_ORIGINS[MESSAGE_TYPE.MMI_PORTFOLIO].includes(req.origin)) {
RPC_ALLOWED_ORIGINS[MESSAGE_TYPE.MMI_PORTFOLIO].forEach((regexp) => {
// eslint-disable-next-line require-unicode-regexp
if (regexp.test(req.origin)) {
validUrl = true;
}
});
// eslint-disable-next-line no-negated-condition
if (!validUrl) {
throw new Error('Unauthorized');
}
res.result = await handleMmiOpenAddHardwareWallet();
return end();
} catch (error) {
return end(error);
}
}

View File

@ -0,0 +1,68 @@
import { ethErrors } from 'eth-rpc-errors';
import { RPC_ALLOWED_ORIGINS } from '@metamask-institutional/rpc-allowlist';
import { MESSAGE_TYPE } from '../../../../../../shared/constants/app';
const mmiOpenSwaps = {
methodNames: [MESSAGE_TYPE.MMI_OPEN_SWAPS],
implementation: mmiOpenSwapsHandler,
hookNames: {
handleMmiOpenSwaps: true,
},
};
export default mmiOpenSwaps;
/**
* @typedef {object} MmiOpenSwapsOptions
* @property {Function} handleMmiOpenSwaps - The metmaskinsititutional_open_swaps method implementation.
*/
/**
* @typedef {object} MmiOpenSwapsParam
* @property {string} service - The service to which we are authenticating, e.g. 'codefi-compliance'
* @property {object} token - The token used to authenticate
*/
/**
* @param {import('json-rpc-engine').JsonRpcRequest<MmiOpenSwapsParam>} req - The JSON-RPC request object.
* @param {import('json-rpc-engine').JsonRpcResponse<true>} res - The JSON-RPC response object.
* @param {Function} _next - The json-rpc-engine 'next' callback.
* @param {Function} end - The json-rpc-engine 'end' callback.
* @param {WatchAssetOptions} options
*/
async function mmiOpenSwapsHandler(
req,
res,
_next,
end,
{ handleMmiOpenSwaps },
) {
try {
let validUrl = false;
// if (!RPC_ALLOWED_ORIGINS[MESSAGE_TYPE.MMI_PORTFOLIO].includes(req.origin)) {
RPC_ALLOWED_ORIGINS[MESSAGE_TYPE.MMI_PORTFOLIO].forEach((regexp) => {
// eslint-disable-next-line require-unicode-regexp
if (regexp.test(req.origin)) {
validUrl = true;
}
});
// eslint-disable-next-line no-negated-condition
if (!validUrl) {
throw new Error('Unauthorized');
}
if (!req.params?.[0] || typeof req.params[0] !== 'object') {
return end(
ethErrors.rpc.invalidParams({
message: `Expected single, object parameter. Received:\n${JSON.stringify(
req.params,
)}`,
}),
);
}
const { address, network } = req.params[0];
res.result = await handleMmiOpenSwaps(req.origin, address, network);
return end();
} catch (error) {
return end(error);
}
}

View File

@ -0,0 +1,56 @@
import { RPC_ALLOWED_ORIGINS } from '@metamask-institutional/rpc-allowlist';
import { MESSAGE_TYPE } from '../../../../../../shared/constants/app';
const mmiPortfolio = {
methodNames: [MESSAGE_TYPE.MMI_PORTFOLIO],
implementation: mmiPortfolioHandler,
hookNames: {
handleMmiDashboardData: true,
},
};
export default mmiPortfolio;
/**
* @typedef {object} MmiPortfolioOptions
* @property {Function} handleMmiDashboardData - The metmaskinsititutional_portfolio method implementation.
*/
/**
* @typedef {object} MmiPortfolioParam
* @property {string} service - The service to which we are authenticating, e.g. 'codefi-compliance'
* @property {object} token - The token used to authenticate
*/
/**
* @param {import('json-rpc-engine').JsonRpcRequest<MmiPortfolioParam>} req - The JSON-RPC request object.
* @param {import('json-rpc-engine').JsonRpcResponse<true>} res - The JSON-RPC response object.
* @param {Function} _next - The json-rpc-engine 'next' callback.
* @param {Function} end - The json-rpc-engine 'end' callback.
* @param {WatchAssetOptions} options
*/
async function mmiPortfolioHandler(
req,
res,
_next,
end,
{ handleMmiDashboardData },
) {
try {
let validUrl = false;
RPC_ALLOWED_ORIGINS[MESSAGE_TYPE.MMI_PORTFOLIO].forEach((regexp) => {
// eslint-disable-next-line require-unicode-regexp
if (regexp.test(req.origin)) {
validUrl = true;
}
});
// eslint-disable-next-line no-negated-condition
if (!validUrl) {
throw new Error('Unauthorized');
} else {
res.result = await handleMmiDashboardData(req);
return end();
}
} catch (error) {
return end(error);
}
}

View File

@ -0,0 +1,71 @@
import { ethErrors } from 'eth-rpc-errors';
import { RPC_ALLOWED_ORIGINS } from '@metamask-institutional/rpc-allowlist';
import { MESSAGE_TYPE } from '../../../../../../shared/constants/app';
const mmiSetAccountAndNetwork = {
methodNames: [MESSAGE_TYPE.MMI_SET_ACCOUNT_AND_NETWORK],
implementation: mmiSetAccountAndNetworkHandler,
hookNames: {
handleMmiSetAccountAndNetwork: true,
},
};
export default mmiSetAccountAndNetwork;
/**
* @typedef {object} MmiSetAccountAndNetworkOptions
* @property {Function} handleMmiSetAccountAndNetwork - The metmaskinsititutional_set_account_and_network method implementation.
*/
/**
* @typedef {object} MmiSetAccountAndNetworkParam
* @property {string} account - Account address
* @property {number} network - Chain Id
*/
/**
* @param {import('json-rpc-engine').JsonRpcRequest<MmiSetAccountAndNetworkParam>} req - The JSON-RPC request object.
* @param {import('json-rpc-engine').JsonRpcResponse<true>} res - The JSON-RPC response object.
* @param {Function} _next - The json-rpc-engine 'next' callback.
* @param {Function} end - The json-rpc-engine 'end' callback.
* @param {WatchAssetOptions} options
*/
async function mmiSetAccountAndNetworkHandler(
req,
res,
_next,
end,
{ handleMmiSetAccountAndNetwork },
) {
try {
let validUrl = false;
RPC_ALLOWED_ORIGINS[MESSAGE_TYPE.MMI_PORTFOLIO].forEach((regexp) => {
// eslint-disable-next-line require-unicode-regexp
if (regexp.test(req.origin)) {
validUrl = true;
}
});
// eslint-disable-next-line no-negated-condition
if (!validUrl) {
throw new Error('Unauthorized');
}
if (!req.params?.[0] || typeof req.params[0] !== 'object') {
return end(
ethErrors.rpc.invalidParams({
message: `Expected single, object parameter. Received:\n${JSON.stringify(
req.params,
)}`,
}),
);
}
const { address, network } = req.params[0];
res.result = await handleMmiSetAccountAndNetwork(
req.origin,
address,
network,
);
return end();
} catch (error) {
return end(error);
}
}

View File

@ -0,0 +1,34 @@
import { MESSAGE_TYPE } from '../../../../../../shared/constants/app';
const mmiSupported = {
methodNames: [MESSAGE_TYPE.MMI_SUPPORTED],
implementation: mmiSupportedHandler,
hookNames: {},
};
export default mmiSupported;
/**
* @typedef {object} MmiAuthenticateOptions
* @property {Function} mmiSupportedHandler
* This method simply returns true if this is Metamask Institutional
*/
/**
* @typedef {object} MmiSupportedParam
* @property {string} mmiSupported No parameters
*/
/**
* @param {import('json-rpc-engine').JsonRpcRequest<WatchAssetParam>} _req - The JSON-RPC request object.
* @param {import('json-rpc-engine').JsonRpcResponse<true>} res - The JSON-RPC response object.
* @param {Function} _next - The json-rpc-engine 'next' callback.
* @param {Function} end - The json-rpc-engine 'end' callback.
*/
async function mmiSupportedHandler(_req, res, _next, end) {
try {
res.result = true;
return end();
} catch (error) {
return end(error);
}
}

View File

@ -1,4 +1,3 @@
import { ethErrors } from 'eth-rpc-errors';
import { MESSAGE_TYPE } from '../../../../../shared/constants/app';
const watchAsset = {
@ -36,15 +35,14 @@ async function watchAssetHandler(
{ handleWatchAssetRequest },
) {
try {
const { options: asset, type } = req.params;
const handleWatchAssetResult = await handleWatchAssetRequest(asset, type);
await handleWatchAssetResult.result;
const {
params: { options: asset, type },
origin,
} = req;
await handleWatchAssetRequest(asset, type, origin);
res.result = true;
return end();
} catch (error) {
if (error.message === 'User rejected to watch the asset.') {
return end(ethErrors.provider.userRejectedRequest());
}
return end(error);
}
}

View File

@ -5,7 +5,6 @@ import proxyquire from 'proxyquire';
import { ApprovalRequestNotFoundError } from '@metamask/approval-controller';
import { PermissionsRequestNotFoundError } from '@metamask/permission-controller';
import nock from 'nock';
import { ORIGIN_METAMASK } from '../../shared/constants/app';
const Ganache = require('../../test/e2e/ganache');
@ -43,11 +42,26 @@ const createLoggerMiddlewareMock = () => (req, res, next) => {
next();
};
// Temporarily replace the snaps packages with the Flask versions.
const proxyPermissions = proxyquire('./controllers/permissions', {
'./snaps/snap-permissions': proxyquire(
'./controllers/permissions/snaps/snap-permissions',
{
// eslint-disable-next-line node/global-require
'@metamask/snaps-controllers': require('@metamask/snaps-controllers-flask'),
// eslint-disable-next-line node/global-require
'@metamask/rpc-methods': require('@metamask/rpc-methods-flask'),
},
),
});
const TEST_SEED =
'debris dizzy just program just float decrease vacant alarm reduce speak stadium';
const MetaMaskController = proxyquire('./metamask-controller', {
'./lib/createLoggerMiddleware': { default: createLoggerMiddlewareMock },
// Temporarily replace the snaps packages with the Flask versions.
'./controllers/permissions': proxyPermissions,
}).default;
describe('MetaMaskController', function () {
@ -222,35 +236,6 @@ describe('MetaMaskController', function () {
});
});
describe('#updateTransactionSendFlowHistory', function () {
it('two sequential calls with same history give same result', async function () {
const recipientAddress = '0xc42edfcc21ed14dda456aa0756c153f7985d8813';
await metamaskController.createNewVaultAndKeychain('test@123');
const accounts = await metamaskController.keyringController.getAccounts();
const txMeta = await metamaskController.getApi().addUnapprovedTransaction(
undefined,
{
from: accounts[0],
to: recipientAddress,
},
ORIGIN_METAMASK,
);
const [transaction1, transaction2] = await Promise.all([
metamaskController
.getApi()
.updateTransactionSendFlowHistory(txMeta.id, 2, ['foo1', 'foo2']),
Promise.resolve(1).then(() =>
metamaskController
.getApi()
.updateTransactionSendFlowHistory(txMeta.id, 2, ['foo1', 'foo2']),
),
]);
assert.deepEqual(transaction1, transaction2);
});
});
describe('#removePermissionsFor', function () {
it('should not propagate PermissionsRequestNotFoundError', function () {
const error = new PermissionsRequestNotFoundError('123');
@ -327,7 +312,7 @@ describe('MetaMaskController', function () {
});
describe('#resolvePendingApproval', function () {
it('should not propagate ApprovalRequestNotFoundError', function () {
it('should not propagate ApprovalRequestNotFoundError', async function () {
const error = new ApprovalRequestNotFoundError('123');
metamaskController.approvalController = {
accept: () => {
@ -335,7 +320,10 @@ describe('MetaMaskController', function () {
},
};
// Line below will not throw error, in case it throws this test case will fail.
metamaskController.resolvePendingApproval('DUMMY_ID', 'DUMMY_VALUE');
await metamaskController.resolvePendingApproval(
'DUMMY_ID',
'DUMMY_VALUE',
);
});
it('should propagate Error other than ApprovalRequestNotFoundError', function () {
@ -345,9 +333,11 @@ describe('MetaMaskController', function () {
throw error;
},
};
assert.throws(() => {
metamaskController.resolvePendingApproval('DUMMY_ID', 'DUMMY_VALUE');
}, error);
assert.rejects(
() =>
metamaskController.resolvePendingApproval('DUMMY_ID', 'DUMMY_VALUE'),
error,
);
});
});

View File

@ -29,13 +29,13 @@ import {
} from '@metamask/approval-controller';
import { ControllerMessenger } from '@metamask/base-controller';
import {
CurrencyRateController,
TokenListController,
TokensController,
TokenRatesController,
NftController,
AssetsContractController,
CurrencyRateController,
NftController,
NftDetectionController,
TokenListController,
TokenRatesController,
TokensController,
} from '@metamask/assets-controllers';
import { PhishingController } from '@metamask/phishing-controller';
import { AnnouncementController } from '@metamask/announcement-controller';
@ -63,8 +63,34 @@ import {
} from '@metamask/snaps-controllers';
///: END:ONLY_INCLUDE_IN
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
import {
CUSTODIAN_TYPES,
MmiConfigurationController,
} from '@metamask-institutional/custody-keyring';
import { InstitutionalFeaturesController } from '@metamask-institutional/institutional-features';
import { CustodyController } from '@metamask-institutional/custody-controller';
import { handleMmiPortfolio } from '@metamask-institutional/portfolio-dashboard';
import { TransactionUpdateController } from '@metamask-institutional/transaction-update';
///: END:ONLY_INCLUDE_IN
import { SignatureController } from '@metamask/signature-controller';
import { ApprovalType } from '@metamask/controller-utils';
///: BEGIN:ONLY_INCLUDE_IN(desktop)
// eslint-disable-next-line import/order
import { DesktopController } from '@metamask/desktop/dist/controllers/desktop';
///: END:ONLY_INCLUDE_IN
import {
ApprovalType,
ERC1155,
ERC20,
ERC721,
} from '@metamask/controller-utils';
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
import { toChecksumHexAddress } from '../../shared/modules/hexstring-utils';
///: END:ONLY_INCLUDE_IN
import {
AssetType,
TransactionStatus,
@ -116,15 +142,16 @@ import { STATIC_MAINNET_TOKEN_LIST } from '../../shared/constants/tokens';
import { getTokenValueParam } from '../../shared/lib/metamask-controller-utils';
import { isManifestV3 } from '../../shared/modules/mv3.utils';
import { hexToDecimal } from '../../shared/modules/conversion.utils';
///: BEGIN:ONLY_INCLUDE_IN(desktop)
// eslint-disable-next-line import/order
import { DesktopController } from '@metamask/desktop/dist/controllers/desktop';
///: END:ONLY_INCLUDE_IN
import { ACTION_QUEUE_METRICS_E2E_TEST } from '../../shared/constants/test-flags';
import {
onMessageReceived,
checkForMultipleVersionsRunning,
} from './detect-multiple-instances';
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
import MMIController from './controllers/mmi-controller';
import { mmiKeyringBuilderFactory } from './mmi-keyring-builder-factory';
///: END:ONLY_INCLUDE_IN
import ComposableObservableStore from './lib/ComposableObservableStore';
import AccountTracker from './lib/account-tracker';
import createDupeReqFilterMiddleware from './lib/createDupeReqFilterMiddleware';
@ -264,6 +291,13 @@ export default class MetamaskController extends EventEmitter {
],
});
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
this.mmiConfigurationController = new MmiConfigurationController({
initState: initState.MmiConfigurationController,
mmiConfigurationServiceUrl: process.env.MMI_CONFIGURATION_SERVICE_URL,
});
///: END:ONLY_INCLUDE_IN
const networkControllerMessenger = this.controllerMessenger.getRestricted({
name: 'NetworkController',
allowedEvents: [
@ -273,6 +307,7 @@ export default class MetamaskController extends EventEmitter {
'NetworkController:infuraIsUnblocked',
],
});
this.networkController = new NetworkController({
messenger: networkControllerMessenger,
state: initState.NetworkController,
@ -288,27 +323,20 @@ export default class MetamaskController extends EventEmitter {
const tokenListMessenger = this.controllerMessenger.getRestricted({
name: 'TokenListController',
allowedEvents: [
'TokenListController:stateChange',
'NetworkController:stateChange',
],
});
this.tokenListController = new TokenListController({
chainId: hexToDecimal(
this.networkController.store.getState().providerConfig.chainId,
),
chainId: this.networkController.store.getState().providerConfig.chainId,
preventPollingOnNetworkRestart: initState.TokenListController
? initState.TokenListController.preventPollingOnNetworkRestart
: true,
onNetworkStateChange: (cb) => {
this.networkController.store.subscribe((networkState) => {
const modifiedNetworkState = {
...networkState,
providerConfig: {
...networkState.providerConfig,
chainId: hexToDecimal(networkState.providerConfig.chainId),
},
};
return cb(modifiedNetworkState);
});
},
onNetworkStateChange: this.networkController.store.subscribe.bind(
this.networkController.store,
),
messenger: tokenListMessenger,
state: initState.TokenListController,
});
@ -326,36 +354,31 @@ export default class MetamaskController extends EventEmitter {
),
tokenListController: this.tokenListController,
provider: this.provider,
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
handleMmiDashboardData: this.handleMmiDashboardData.bind(this),
mmiConfigurationStore: this.mmiConfigurationController.store,
///: END:ONLY_INCLUDE_IN
});
this.tokensController = new TokensController({
chainId: this.networkController.store.getState().providerConfig.chainId,
onPreferencesStateChange: this.preferencesController.store.subscribe.bind(
this.preferencesController.store,
),
onNetworkStateChange: (cb) =>
this.networkController.store.subscribe((networkState) => {
const modifiedNetworkState = {
...networkState,
providerConfig: {
...networkState.providerConfig,
},
};
return cb(modifiedNetworkState);
}),
onNetworkStateChange: this.networkController.store.subscribe.bind(
this.networkController.store,
),
config: { provider: this.provider },
state: initState.TokensController,
messenger: this.controllerMessenger.getRestricted({
name: 'TokensController',
allowedActions: [
`${this.approvalController.name}:addRequest`,
`${this.approvalController.name}:acceptRequest`,
`${this.approvalController.name}:rejectRequest`,
],
allowedActions: [`${this.approvalController.name}:addRequest`],
}),
});
this.assetsContractController = new AssetsContractController(
{
chainId: this.networkController.store.getState().providerConfig.chainId,
onPreferencesStateChange: (listener) =>
this.preferencesController.store.subscribe(listener),
// This handler is misnamed, and is a known issue that will be resolved
@ -371,14 +394,7 @@ export default class MetamaskController extends EventEmitter {
'NetworkController:networkDidChange',
() => {
const networkState = this.networkController.store.getState();
const modifiedNetworkState = {
...networkState,
providerConfig: {
...networkState.providerConfig,
chainId: hexToDecimal(networkState.providerConfig.chainId),
},
};
return cb(modifiedNetworkState);
return cb(networkState);
},
),
},
@ -388,23 +404,21 @@ export default class MetamaskController extends EventEmitter {
initState.AssetsContractController,
);
const nftControllerMessenger = this.controllerMessenger.getRestricted({
name: 'NftController',
allowedActions: [`${this.approvalController.name}:addRequest`],
});
this.nftController = new NftController(
{
messenger: nftControllerMessenger,
chainId: this.networkController.store.getState().providerConfig.chainId,
onPreferencesStateChange:
this.preferencesController.store.subscribe.bind(
this.preferencesController.store,
),
onNetworkStateChange: (cb) =>
this.networkController.store.subscribe((networkState) => {
const modifiedNetworkState = {
...networkState,
providerConfig: {
...networkState.providerConfig,
chainId: hexToDecimal(networkState.providerConfig.chainId),
},
};
return cb(modifiedNetworkState);
}),
onNetworkStateChange: this.networkController.store.subscribe.bind(
this.networkController.store,
),
getERC721AssetName:
this.assetsContractController.getERC721AssetName.bind(
this.assetsContractController,
@ -450,21 +464,14 @@ export default class MetamaskController extends EventEmitter {
this.nftController.setApiKey(process.env.OPENSEA_KEY);
this.nftDetectionController = new NftDetectionController({
chainId: this.networkController.store.getState().providerConfig.chainId,
onNftsStateChange: (listener) => this.nftController.subscribe(listener),
onPreferencesStateChange: this.preferencesController.store.subscribe.bind(
this.preferencesController.store,
),
onNetworkStateChange: (cb) =>
this.networkController.store.subscribe((networkState) => {
const modifiedNetworkState = {
...networkState,
providerConfig: {
...networkState.providerConfig,
chainId: hexToDecimal(networkState.providerConfig.chainId),
},
};
return cb(modifiedNetworkState);
}),
onNetworkStateChange: this.networkController.store.subscribe.bind(
this.networkController.store,
),
getOpenSeaApiKey: () => this.nftController.openSeaApiKey,
getBalancesInSingleCall:
this.assetsContractController.getBalancesInSingleCall.bind(
@ -516,10 +523,12 @@ export default class MetamaskController extends EventEmitter {
this.networkController.getProviderAndBlockTracker().provider,
// NOTE: This option is inaccurately named; it should be called
// onNetworkDidChange
onNetworkStateChange: networkControllerMessenger.subscribe.bind(
networkControllerMessenger,
'NetworkController:networkDidChange',
),
onNetworkStateChange: (eventHandler) => {
networkControllerMessenger.subscribe(
'NetworkController:networkDidChange',
() => eventHandler(this.networkController.store.getState()),
);
},
getCurrentNetworkEIP1559Compatibility:
this.networkController.getEIP1559Compatibility.bind(
this.networkController,
@ -533,11 +542,8 @@ export default class MetamaskController extends EventEmitter {
this.networkController.store.getState().providerConfig;
return process.env.IN_TEST || chainId === CHAIN_IDS.MAINNET;
},
getChainId: () => {
return process.env.IN_TEST
? CHAIN_IDS.MAINNET
: this.networkController.store.getState().providerConfig.chainId;
},
getChainId: () =>
this.networkController.store.getState().providerConfig.chainId,
});
this.qrHardwareKeyring = new QRHardwareKeyring();
@ -595,6 +601,7 @@ export default class MetamaskController extends EventEmitter {
// token exchange rate tracker
this.tokenRatesController = new TokenRatesController(
{
chainId: this.networkController.store.getState().providerConfig.chainId,
onTokensStateChange: (listener) =>
this.tokensController.subscribe(listener),
onCurrencyRateStateChange: (listener) =>
@ -602,17 +609,9 @@ export default class MetamaskController extends EventEmitter {
`${this.currencyRateController.name}:stateChange`,
listener,
),
onNetworkStateChange: (cb) =>
this.networkController.store.subscribe((networkState) => {
const modifiedNetworkState = {
...networkState,
providerConfig: {
...networkState.providerConfig,
chainId: hexToDecimal(networkState.providerConfig.chainId),
},
};
return cb(modifiedNetworkState);
}),
onNetworkStateChange: this.networkController.store.subscribe.bind(
this.networkController.store,
),
},
{
disabled:
@ -725,9 +724,21 @@ export default class MetamaskController extends EventEmitter {
keyringOverrides?.lattice || LatticeKeyring,
QRHardwareKeyring,
];
additionalKeyrings = additionalKeyringTypes.map((keyringType) =>
keyringBuilderFactory(keyringType),
);
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
for (const custodianType of Object.keys(CUSTODIAN_TYPES)) {
additionalKeyrings.push(
mmiKeyringBuilderFactory(
CUSTODIAN_TYPES[custodianType].keyringClass,
{ mmiConfigurationController: this.mmiConfigurationController },
),
);
}
///: END:ONLY_INCLUDE_IN
}
this.keyringController = new KeyringController({
@ -892,29 +903,39 @@ export default class MetamaskController extends EventEmitter {
name: 'RateLimitController',
}),
implementations: {
showNativeNotification: (origin, message) => {
const subjectMetadataState = this.controllerMessenger.call(
'SubjectMetadataController:getState',
);
showNativeNotification: {
method: (origin, message) => {
const subjectMetadataState = this.controllerMessenger.call(
'SubjectMetadataController:getState',
);
const originMetadata = subjectMetadataState.subjectMetadata[origin];
const originMetadata = subjectMetadataState.subjectMetadata[origin];
this.platform
._showNotification(originMetadata?.name ?? origin, message)
.catch((error) => {
log.error('Failed to create notification', error);
});
this.platform
._showNotification(originMetadata?.name ?? origin, message)
.catch((error) => {
log.error('Failed to create notification', error);
});
return null;
return null;
},
// 2 calls per 5 minutes
rateLimitCount: 2,
rateLimitTimeout: 300000,
},
showInAppNotification: (origin, message) => {
this.controllerMessenger.call(
'NotificationController:show',
origin,
message,
);
showInAppNotification: {
method: (origin, message) => {
this.controllerMessenger.call(
'NotificationController:show',
origin,
message,
);
return null;
return null;
},
// 5 calls per minute
rateLimitCount: 5,
rateLimitTimeout: 60000,
},
},
});
@ -984,6 +1005,22 @@ export default class MetamaskController extends EventEmitter {
preferencesStore: this.preferencesController.store,
});
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
this.custodyController = new CustodyController({
initState: initState.CustodyController,
});
this.institutionalFeaturesController = new InstitutionalFeaturesController({
initState: initState.InstitutionalFeaturesController,
showConfirmRequest: opts.showUserConfirmation,
});
this.transactionUpdateController = new TransactionUpdateController({
initState: initState.TransactionUpdateController,
getCustodyKeyring: this.getCustodyKeyringIfExists.bind(this),
mmiConfigurationController: this.mmiConfigurationController,
captureException,
});
///: END:ONLY_INCLUDE_IN
this.backupController = new BackupController({
preferencesController: this.preferencesController,
addressBookController: this.addressBookController,
@ -1054,6 +1091,9 @@ export default class MetamaskController extends EventEmitter {
getDeviceModel: this.getDeviceModel.bind(this),
getTokenStandardAndDetails: this.getTokenStandardAndDetails.bind(this),
securityProviderRequest: this.securityProviderRequest.bind(this),
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
transactionUpdateController: this.transactionUpdateController,
///: END:ONLY_INCLUDE_IN
messenger: this.controllerMessenger.getRestricted({
name: 'TransactionController',
allowedActions: [
@ -1064,6 +1104,28 @@ export default class MetamaskController extends EventEmitter {
}),
});
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
this.mmiController = new MMIController({
mmiConfigurationController: this.mmiConfigurationController,
keyringController: this.keyringController,
txController: this.txController,
securityProviderRequest: this.securityProviderRequest.bind(this),
preferencesController: this.preferencesController,
appStateController: this.appStateController,
transactionUpdateController: this.transactionUpdateController,
custodyController: this.custodyController,
institutionalFeaturesController: this.institutionalFeaturesController,
getState: this.getState.bind(this),
getPendingNonce: this.getPendingNonce.bind(this),
accountTracker: this.accountTracker,
metaMetricsController: this.metaMetricsController,
networkController: this.networkController,
permissionController: this.permissionController,
platform: this.platform,
extension: this.extension,
});
///: END:ONLY_INCLUDE_IN
this.txController.on(`tx:status-update`, async (txId, status) => {
if (
status === TransactionStatus.confirmed ||
@ -1112,9 +1174,8 @@ export default class MetamaskController extends EventEmitter {
getTokenValueParam(transactionData);
const { allNfts } = this.nftController.state;
const chainIdAsDecimal = hexToDecimal(chainId);
// check if its a known NFT
const knownNft = allNfts?.[userAddress]?.[chainIdAsDecimal]?.find(
const knownNft = allNfts?.[userAddress]?.[chainId]?.find(
({ address, tokenId }) =>
isEqualCaseInsensitive(address, contractAddress) &&
tokenId === transactionDataTokenId,
@ -1125,7 +1186,7 @@ export default class MetamaskController extends EventEmitter {
this.nftController.checkAndUpdateSingleNftOwnershipStatus(
knownNft,
false,
{ userAddress, chainId: chainIdAsDecimal },
{ userAddress, chainId },
);
}
}
@ -1232,22 +1293,28 @@ export default class MetamaskController extends EventEmitter {
},
);
this.swapsController = new SwapsController({
getBufferedGasLimit: this.txController.txGasUtil.getBufferedGasLimit.bind(
this.txController.txGasUtil,
),
networkController: this.networkController,
onNetworkStateChange: (listener) =>
this.networkController.store.subscribe(listener),
provider: this.provider,
getProviderConfig: () =>
this.networkController.store.getState().providerConfig,
getTokenRatesState: () => this.tokenRatesController.state,
getCurrentChainId: () =>
this.networkController.store.getState().providerConfig.chainId,
getEIP1559GasFeeEstimates:
this.gasFeeController.fetchGasFeeEstimates.bind(this.gasFeeController),
});
this.swapsController = new SwapsController(
{
getBufferedGasLimit:
this.txController.txGasUtil.getBufferedGasLimit.bind(
this.txController.txGasUtil,
),
networkController: this.networkController,
onNetworkStateChange: (listener) =>
this.networkController.store.subscribe(listener),
provider: this.provider,
getProviderConfig: () =>
this.networkController.store.getState().providerConfig,
getTokenRatesState: () => this.tokenRatesController.state,
getCurrentChainId: () =>
this.networkController.store.getState().providerConfig.chainId,
getEIP1559GasFeeEstimates:
this.gasFeeController.fetchGasFeeEstimates.bind(
this.gasFeeController,
),
},
initState.SwapsController,
);
this.smartTransactionsController = new SmartTransactionsController(
{
onNetworkStateChange: (cb) => {
@ -1279,6 +1346,14 @@ export default class MetamaskController extends EventEmitter {
initState.SmartTransactionsController,
);
this.txController.on('newSwapApproval', (txMeta) => {
this.swapsController.setApproveTxId(txMeta.id);
});
this.txController.on('newSwap', (txMeta) => {
this.swapsController.setTradeTxId(txMeta.id);
});
// ensure accountTracker updates balances after network change
networkControllerMessenger.subscribe(
'NetworkController:networkDidChange',
@ -1431,6 +1506,13 @@ export default class MetamaskController extends EventEmitter {
///: BEGIN:ONLY_INCLUDE_IN(desktop)
DesktopController: this.desktopController.store,
///: END:ONLY_INCLUDE_IN
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
CustodyController: this.custodyController.store,
InstitutionalFeaturesController:
this.institutionalFeaturesController.store,
MmiConfigurationController: this.mmiConfigurationController.store,
///: END:ONLY_INCLUDE_IN
...resetOnRestartStore,
});
@ -1467,6 +1549,13 @@ export default class MetamaskController extends EventEmitter {
///: BEGIN:ONLY_INCLUDE_IN(desktop)
DesktopController: this.desktopController.store,
///: END:ONLY_INCLUDE_IN
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
CustodyController: this.custodyController.store,
InstitutionalFeaturesController:
this.institutionalFeaturesController.store,
MmiConfigurationController: this.mmiConfigurationController.store,
///: END:ONLY_INCLUDE_IN
...resetOnRestartStore,
},
controllerMessenger: this.controllerMessenger,
@ -2025,10 +2114,6 @@ export default class MetamaskController extends EventEmitter {
preferencesController,
),
addToken: tokensController.addToken.bind(tokensController),
rejectWatchAsset:
tokensController.rejectWatchAsset.bind(tokensController),
acceptWatchAsset:
tokensController.acceptWatchAsset.bind(tokensController),
updateTokenType: tokensController.updateTokenType.bind(tokensController),
setAccountLabel: preferencesController.setAccountLabel.bind(
preferencesController,
@ -2111,6 +2196,12 @@ export default class MetamaskController extends EventEmitter {
),
setTermsOfUseLastAgreed:
appStateController.setTermsOfUseLastAgreed.bind(appStateController),
///: BEGIN:ONLY_INCLUDE_IN(snaps)
setSnapsInstallPrivacyWarningShownStatus:
appStateController.setSnapsInstallPrivacyWarningShownStatus.bind(
appStateController,
),
///: END:ONLY_INCLUDE_IN
setOutdatedBrowserWarningLastShown:
appStateController.setOutdatedBrowserWarningLastShown.bind(
appStateController,
@ -2139,10 +2230,7 @@ export default class MetamaskController extends EventEmitter {
exportAccount: this.exportAccount.bind(this),
// txController
cancelTransaction: txController.cancelTransaction.bind(txController),
updateTransaction: txController.updateTransaction.bind(txController),
updateAndApproveTransaction:
txController.updateAndApproveTransaction.bind(txController),
approveTransactionsWithSameNonce:
txController.approveTransactionsWithSameNonce.bind(txController),
createCancelTransaction: this.createCancelTransaction.bind(this),
@ -2162,11 +2250,6 @@ export default class MetamaskController extends EventEmitter {
updateTransactionSendFlowHistory:
txController.updateTransactionSendFlowHistory.bind(txController),
updateSwapApprovalTransaction:
txController.updateSwapApprovalTransaction.bind(txController),
updateSwapTransaction:
txController.updateSwapTransaction.bind(txController),
updatePreviousGasParams:
txController.updatePreviousGasParams.bind(txController),
@ -2236,6 +2319,72 @@ export default class MetamaskController extends EventEmitter {
rejectPermissionsRequest: this.rejectPermissionsRequest,
...getPermissionBackgroundApiMethods(permissionController),
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
connectCustodyAddresses:
this.mmiController.connectCustodyAddresses.bind(this),
getCustodianAccounts: this.mmiController.getCustodianAccounts.bind(this),
getCustodianAccountsByAddress:
this.mmiController.getCustodianAccountsByAddress.bind(this),
getCustodianTransactionDeepLink:
this.mmiController.getCustodianTransactionDeepLink.bind(this),
getCustodianConfirmDeepLink:
this.mmiController.getCustodianConfirmDeepLink.bind(this),
getCustodianSignMessageDeepLink:
this.mmiController.getCustodianSignMessageDeepLink.bind(this),
getCustodianToken: this.mmiController.getCustodianToken.bind(this),
getCustodianJWTList: this.mmiController.getCustodianJWTList.bind(this),
setWaitForConfirmDeepLinkDialog:
this.custodyController.setWaitForConfirmDeepLinkDialog.bind(
this.custodyController,
),
setCustodianConnectRequest:
this.custodyController.setCustodianConnectRequest.bind(
this.custodyController,
),
getCustodianConnectRequest:
this.custodyController.getCustodianConnectRequest.bind(
this.custodyController,
),
getAllCustodianAccountsWithToken:
this.mmiController.getAllCustodianAccountsWithToken.bind(this),
getMmiConfiguration:
this.mmiConfigurationController.getConfiguration.bind(
this.mmiConfigurationController,
),
setComplianceAuthData:
this.institutionalFeaturesController.setComplianceAuthData.bind(
this.institutionalFeaturesController,
),
deleteComplianceAuthData:
this.institutionalFeaturesController.deleteComplianceAuthData.bind(
this.institutionalFeaturesController,
),
generateComplianceReport:
this.institutionalFeaturesController.generateComplianceReport.bind(
this.institutionalFeaturesController,
),
syncReportsInProgress:
this.institutionalFeaturesController.syncReportsInProgress.bind(
this.institutionalFeaturesController,
),
removeConnectInstitutionalFeature:
this.institutionalFeaturesController.removeConnectInstitutionalFeature.bind(
this.institutionalFeaturesController,
),
getComplianceHistoricalReportsByAddress:
this.institutionalFeaturesController.getComplianceHistoricalReportsByAddress.bind(
this.institutionalFeaturesController,
),
removeAddTokenConnectRequest:
this.institutionalFeaturesController.removeAddTokenConnectRequest.bind(
this.institutionalFeaturesController,
),
setCustodianNewRefreshToken:
this.mmiController.setCustodianNewRefreshToken.bind(this),
///: END:ONLY_INCLUDE_IN
///: BEGIN:ONLY_INCLUDE_IN(snaps)
// snaps
removeSnapError: this.controllerMessenger.call.bind(
@ -2666,6 +2815,10 @@ export default class MetamaskController extends EventEmitter {
async submitPassword(password) {
await this.keyringController.submitPassword(password);
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
this.mmiController.onSubmitPassword();
///: END:ONLY_INCLUDE_IN
try {
await this.blockTracker.checkForLatestBlock();
} catch (error) {
@ -2785,6 +2938,16 @@ export default class MetamaskController extends EventEmitter {
return keyring.mnemonic;
}
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
async getCustodyKeyringIfExists(address) {
const custodyType = this.custodyController.getCustodyTypeByAddress(
toChecksumHexAddress(address),
);
const keyring = this.keyringController.getKeyringsByType(custodyType)[0];
return keyring?.getAccountDetails(address) ? keyring : undefined;
}
///: END:ONLY_INCLUDE_IN
//
// Hardware
//
@ -3173,6 +3336,10 @@ export default class MetamaskController extends EventEmitter {
// Remove account from the account tracker controller
this.accountTracker.removeAccount([address]);
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
this.custodyController.removeAccount(address);
///: END:ONLY_INCLUDE_IN(build-mmi)
const keyring = await this.keyringController.getKeyringForAccount(address);
// Remove account from the keyring
await this.keyringController.removeAccount(address);
@ -3293,6 +3460,18 @@ export default class MetamaskController extends EventEmitter {
});
}
handleWatchAssetRequest = (asset, type, origin) => {
switch (type) {
case ERC20:
return this.tokensController.watchAsset(asset, type);
case ERC721:
case ERC1155:
return this.nftController.watchNft(asset, type, origin);
default:
throw new Error(`Asset type ${type} not supported`);
}
};
//=============================================================================
// PASSWORD MANAGEMENT
//=============================================================================
@ -3672,9 +3851,7 @@ export default class MetamaskController extends EventEmitter {
getUnlockPromise: this.appStateController.getUnlockPromise.bind(
this.appStateController,
),
handleWatchAssetRequest: this.tokensController.watchAsset.bind(
this.tokensController,
),
handleWatchAssetRequest: this.handleWatchAssetRequest.bind(this),
requestUserApproval:
this.approvalController.addAndShowApprovalRequest.bind(
this.approvalController,
@ -3731,6 +3908,21 @@ export default class MetamaskController extends EventEmitter {
this.alertController.setWeb3ShimUsageRecorded.bind(
this.alertController,
),
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
handleMmiAuthenticate:
this.institutionalFeaturesController.handleMmiAuthenticate.bind(
this.institutionalFeaturesController,
),
handleMmiCheckIfTokenIsPresent:
this.mmiController.handleMmiCheckIfTokenIsPresent.bind(this),
handleMmiDashboardData: this.handleMmiDashboardData.bind(this),
handleMmiOpenSwaps: this.mmiController.handleMmiOpenSwaps.bind(this),
handleMmiSetAccountAndNetwork:
this.mmiController.setAccountAndNetwork.bind(this),
handleMmiOpenAddHardwareWallet:
this.mmiController.handleMmiOpenAddHardwareWallet.bind(this),
///: END:ONLY_INCLUDE_IN
}),
);
@ -3783,6 +3975,37 @@ export default class MetamaskController extends EventEmitter {
return engine;
}
///: BEGIN:ONLY_INCLUDE_IN(build-mmi)
/**
* This method is needed in preferences controller
* so it needs to be here and not in our controller because
* preferences controllers is initiated first
*/
async handleMmiDashboardData() {
await this.appStateController.getUnlockPromise(true);
const keyringAccounts = await this.keyringController.getAccounts();
const { identities } = this.preferencesController.store.getState();
const { metaMetricsId } = this.metaMetricsController.store.getState();
const getAccountDetails = (address) =>
this.custodyController.getAccountDetails(address);
const extensionId = this.extension.runtime.id;
const networks = [
...this.preferencesController.getRpcMethodPreferences(),
{ chainId: CHAIN_IDS.MAINNET },
{ chainId: CHAIN_IDS.GOERLI },
];
return handleMmiPortfolio({
keyringAccounts,
identities,
metaMetricsId,
networks,
getAccountDetails,
extensionId,
});
}
///: END:ONLY_INCLUDE_IN
/**
* TODO:LegacyProvider: Delete
* A method for providing our public config info over a stream.
@ -4270,9 +4493,9 @@ export default class MetamaskController extends EventEmitter {
}
};
resolvePendingApproval = (id, value) => {
resolvePendingApproval = async (id, value, options) => {
try {
this.approvalController.accept(id, value);
await this.approvalController.accept(id, value, options);
} catch (exp) {
if (!(exp instanceof ApprovalRequestNotFoundError)) {
throw exp;

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