diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 000000000000..b604b35ebbac --- /dev/null +++ b/.browserslistrc @@ -0,0 +1 @@ +chrome >= 66, firefox >= 68 \ No newline at end of file diff --git a/.circleci/config.yml b/.circleci/config.yml index 8527946595d9..40d8bdb9082a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -59,12 +59,9 @@ workflows: - prep-build-test-flask: requires: - prep-deps - - test-storybook: - requires: - - prep-deps - prep-build-storybook: requires: - - test-storybook + - prep-deps - prep-build-ts-migration-dashboard: requires: - prep-deps @@ -90,6 +87,9 @@ workflows: - test-e2e-firefox-snaps: requires: - prep-build-test-flask + - test-e2e-chrome-mv3: + requires: + - prep-build-test-mv3 - test-unit: requires: - prep-deps @@ -280,9 +280,25 @@ jobs: - checkout - attach_workspace: at: . - - run: - name: build:dist - command: yarn build --build-type beta dist + - when: + condition: + not: + matches: + pattern: /^master$/ + value: << pipeline.git.branch >> + steps: + - run: + name: build:dist + command: yarn build --build-type beta dist + - when: + condition: + matches: + pattern: /^master$/ + value: << pipeline.git.branch >> + steps: + - run: + name: build:prod + command: yarn build --build-type beta prod - run: name: build:debug command: find dist/ -type f -exec md5sum {} \; | sort -k 2 @@ -386,7 +402,7 @@ jobs: - builds-test prep-build-storybook: - executor: node-browsers + executor: node-browsers-medium-plus steps: - checkout - attach_workspace: @@ -413,16 +429,6 @@ jobs: paths: - development/ts-migration-dashboard/build - test-storybook: - executor: node-browsers - steps: - - checkout - - attach_workspace: - at: . - - run: - name: Test Storybook - command: yarn storybook:test - test-yarn-dedupe: executor: node-browsers steps: @@ -513,6 +519,7 @@ jobs: test-e2e-chrome: executor: node-browsers + parallelism: 8 steps: - checkout - run: @@ -538,8 +545,37 @@ jobs: path: test-artifacts destination: test-artifacts + test-e2e-chrome-mv3: + executor: node-browsers + parallelism: 8 + steps: + - checkout + - run: + name: Re-Install Chrome + command: ./.circleci/scripts/chrome-install.sh + - attach_workspace: + at: . + - run: + name: Move test build to dist + command: mv ./dist-test-mv3 ./dist + - run: + name: Move test zips to builds + command: mv ./builds-test-mv3 ./builds + - run: + name: test:e2e:chrome + command: | + if .circleci/scripts/test-run-e2e.sh + then + yarn test:e2e:chrome --retries 2 || echo "Temporarily suppressing MV3 e2e test failures" + fi + no_output_timeout: 20m + - store_artifacts: + path: test-artifacts + destination: test-artifacts + test-e2e-firefox-snaps: executor: node-browsers + parallelism: 2 steps: - checkout - run: @@ -567,6 +603,7 @@ jobs: test-e2e-chrome-snaps: executor: node-browsers + parallelism: 2 steps: - checkout - run: @@ -594,6 +631,7 @@ jobs: test-e2e-firefox: executor: node-browsers-medium-plus + parallelism: 8 steps: - checkout - run: @@ -644,7 +682,7 @@ jobs: root: . paths: - test-artifacts - + user-actions-benchmark: executor: node-browsers-medium-plus steps: @@ -697,6 +735,9 @@ jobs: - run: name: Run page load benchmark command: yarn mv3:stats:chrome --out test-artifacts/chrome/mv3 + - run: + name: Install jq + command: sudo apt install jq -y - run: name: Record bundle size at commit command: ./.circleci/scripts/bundle-stats-commit.sh @@ -759,6 +800,11 @@ jobs: - store_artifacts: path: development/ts-migration-dashboard/build destination: ts-migration-dashboard + - run: + name: Set branch parent commit env var + command: | + echo "export PARENT_COMMIT=$(git rev-parse "$(git rev-list --topo-order --reverse HEAD ^origin/develop | head -1)"^)" >> $BASH_ENV + source $BASH_ENV - run: name: build:announce command: ./development/metamaskbot-build-announce.js diff --git a/.circleci/scripts/bundle-stats-commit.sh b/.circleci/scripts/bundle-stats-commit.sh index 31f0ca9d5e7b..b7cb44ac756a 100755 --- a/.circleci/scripts/bundle-stats-commit.sh +++ b/.circleci/scripts/bundle-stats-commit.sh @@ -50,6 +50,28 @@ cp temp/stats/bundle_size_data.temp.js temp/stats/bundle_size_data.js echo " }" >> temp/stats/bundle_size_data.js +if [ -f temp/stats/bundle_size_data.json ]; then + # copy bundle_size_data.json in bundle_size_data.temp.json without last 2 lines + head -$(($(wc -l < temp/stats/bundle_size_data.json) - 2)) temp/stats/bundle_size_data.json > bundle_size_stats.temp.json + + { + echo "},"; + echo "\"$CIRCLE_SHA1\":"; + cat test-artifacts/chrome/mv3/bundle_size_stats.json; + echo "}"; + } >> bundle_size_stats.temp.json +else + { + echo "{"; + echo "\"$CIRCLE_SHA1\":"; + cat test-artifacts/chrome/mv3/bundle_size_stats.json; + echo "}"; + } > bundle_size_stats.temp.json +fi + +jq . bundle_size_stats.temp.json > temp/stats/bundle_size_data.json +rm bundle_size_stats.temp.json + cd temp git add . diff --git a/.circleci/scripts/chrome-install.sh b/.circleci/scripts/chrome-install.sh index 083b6bbafda1..691475a2905e 100755 --- a/.circleci/scripts/chrome-install.sh +++ b/.circleci/scripts/chrome-install.sh @@ -5,12 +5,12 @@ set -u set -o pipefail # To get the latest version, see -CHROME_VERSION='105.0.5195.102-1' +CHROME_VERSION='107.0.5304.87-1' CHROME_BINARY="google-chrome-stable_${CHROME_VERSION}_amd64.deb" CHROME_BINARY_URL="https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-stable/${CHROME_BINARY}" # To retrieve this checksum, run the `wget` and `shasum` commands below -CHROME_BINARY_SHA512SUM='3a1f2267ae009424ee8c623c3f78760d969dc1f3acb490e103e667d11e52cf0d955f201aeb3892dd41f33e68625af77ca5a20244b5be718f794eccb07a4c0413' +CHROME_BINARY_SHA512SUM='07b443bc1382431da84f6812b7e19f1149aa195fb8b3d28834630cc5964fb9d12124abbf4ec1c98d5c0513cdf16c2a3f16a74518c984aaf57ca418b3cd36a4e2' wget -O "${CHROME_BINARY}" -t 5 "${CHROME_BINARY_URL}" diff --git a/.circleci/scripts/firefox-install.sh b/.circleci/scripts/firefox-install.sh index f2f9f284d1d0..fb574f13e93b 100755 --- a/.circleci/scripts/firefox-install.sh +++ b/.circleci/scripts/firefox-install.sh @@ -4,7 +4,7 @@ set -e set -u set -o pipefail -FIREFOX_VERSION='102.0' +FIREFOX_VERSION='106.0.4' FIREFOX_BINARY="firefox-${FIREFOX_VERSION}.tar.bz2" FIREFOX_BINARY_URL="https://ftp.mozilla.org/pub/firefox/releases/${FIREFOX_VERSION}/linux-x86_64/en-US/${FIREFOX_BINARY}" FIREFOX_PATH='/opt/firefox' diff --git a/.eslintrc.js b/.eslintrc.js index 13fa5251cae7..f2a5be01ec76 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -15,6 +15,7 @@ module.exports = { 'development/ts-migration-dashboard/build/**', 'dist/**/*', 'node_modules/**/*', + 'jest-coverage/**/*', ], overrides: [ /** diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6df4c6e65ac4..8f4c7ba9eac2 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -6,18 +6,6 @@ Thanks for the pull request. Take a moment to answer these questions so that rev * What is the current state of things and why does it need to change? * What is the solution your changes offer and how does it work? -Below is a template to give you some ideas. Feel free to use your own words! - -Currently, ... - -This is a problem because ... - -In order to solve this problem, this pull request ... ---> - -## More Information - - -## Pre-Merge Checklist +## Pre-merge author checklist + +- [ ] I've clearly explained: + - [ ] What problem this PR is solving + - [ ] How this problem was solved + - [ ] How reviewers can test my changes +- [ ] Sufficient automated test coverage has been added + +## Pre-merge reviewer checklist -- [ ] PR template is filled out -- [ ] **IF** this PR fixes a bug, a test that _would have_ caught the bug has been added +- [ ] Manual testing (e.g. pull and build branch, run in browser, test code being changed) - [ ] PR is linked to the appropriate GitHub issue -- [ ] PR has been added to the appropriate release Milestone +- [ ] **IF** this PR fixes a bug in the release milestone, add this PR to the release milestone -### + If there are functional changes: +If further QA is required (e.g. new feature, complex testing steps, large refactor), add the `Extension QA Board` label. -- [ ] Manual testing complete & passed -- [ ] "Extension QA Board" label has been applied +In this case, a QA Engineer approval will be be required. diff --git a/.gitignore b/.gitignore index c86fb82dbd35..1d8d1f276d92 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,6 @@ notes.txt # TypeScript tsout/ + +# Test results +test-results/ \ No newline at end of file diff --git a/.iyarc b/.iyarc index bbd5d06c106d..316510d7d26a 100644 --- a/.iyarc +++ b/.iyarc @@ -1,5 +1,2 @@ # improved-yarn-audit advisory exclusions -GHSA-93q8-gq69-wqmw GHSA-257v-vj4p-3w2h -GHSA-wm7h-9275-46v2 -GHSA-pfrx-2q88-qq97 diff --git a/.storybook/initial-states/transactions.js b/.storybook/initial-states/transactions.js index 34b848712231..70885e4a606d 100644 --- a/.storybook/initial-states/transactions.js +++ b/.storybook/initial-states/transactions.js @@ -24,10 +24,10 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 643368596521636, time: 1653527035634, status: 'submitted', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '5208', userEditedGasLimit: false, - chainId: '0x4', + chainId: '0x5', loadingDefaults: false, dappSuggestedGasFees: null, sendFlowHistory: [], @@ -50,10 +50,10 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 643368596521636, time: 1653527035634, status: 'approved', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '5208', userEditedGasLimit: false, - chainId: '0x4', + chainId: '0x5', loadingDefaults: false, dappSuggestedGasFees: null, sendFlowHistory: [], @@ -204,7 +204,7 @@ export const MOCK_TRANSACTION_BY_TYPE = { submittedTime: 1653527035924, }, [MOCK_TX_TYPE.CONTRACT_INTERACTION]: { - chainId: '0x4', + chainId: '0x5', dappSuggestedGasFees: { gas: '0x118f4', maxFeePerGas: '0x9502f91a', @@ -212,7 +212,7 @@ export const MOCK_TRANSACTION_BY_TYPE = { }, id: 7694052085150913, loadingDefaults: true, - metamaskNetworkId: '4', + metamaskNetworkId: '5', origin: 'https://remix.ethereum.org', originalGasEstimate: '0x118f4', sendFlowHistory: [], @@ -235,7 +235,7 @@ export const MOCK_TRANSACTION_BY_TYPE = { [MOCK_TX_TYPE.DEPLOY_CONTRACT]: { blockNumber: '6195527', id: 4243712234858468, - metamaskNetworkId: '4', + metamaskNetworkId: '5', status: 'confirmed', time: 1585088013000, txParams: { @@ -292,7 +292,7 @@ export const MOCK_TRANSACTION_BY_TYPE = { [MOCK_TX_TYPE.INCOMING]: { blockNumber: '6477257', id: 4243712234858505, - metamaskNetworkId: '4', + metamaskNetworkId: '5', status: 'confirmed', time: 1589314295000, txParams: { @@ -346,10 +346,10 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 3938342322880462, time: 1653459456297, status: 'failed', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '14609', userEditedGasLimit: false, - chainId: '0x4', + chainId: '0x5', loadingDefaults: false, dappSuggestedGasFees: null, sendFlowHistory: [], @@ -376,10 +376,10 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 3938342322880462, time: 1653459456297, status: 'approved', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '14609', userEditedGasLimit: false, - chainId: '0x4', + chainId: '0x5', loadingDefaults: false, dappSuggestedGasFees: null, sendFlowHistory: [], @@ -589,7 +589,7 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 4243712234858512, time: 1589314601567, status: 'confirmed', - metamaskNetworkId: '4', + metamaskNetworkId: '5', loadingDefaults: false, txParams: { from: '0xabca64466f257793eaa52fcfff5066894b76a149', @@ -605,7 +605,7 @@ export const MOCK_TRANSACTION_BY_TYPE = { [MOCK_TX_TYPE.SMART]: { blockNumber: '6195527', id: 4243712234858468, - metamaskNetworkId: '4', + metamaskNetworkId: '5', status: 'confirmed', time: 1585088013000, txParams: { @@ -625,7 +625,7 @@ export const MOCK_TRANSACTION_BY_TYPE = { [MOCK_TX_TYPE.SWAP]: { blockNumber: '6195527', id: 4243712234858467, - metamaskNetworkId: '4', + metamaskNetworkId: '5', status: 'confirmed', time: 1585088013000, txParams: { @@ -644,7 +644,7 @@ export const MOCK_TRANSACTION_BY_TYPE = { [MOCK_TX_TYPE.SWAP_APPROVAL]: { blockNumber: '6195527', id: 4243712234858467, - metamaskNetworkId: '4', + metamaskNetworkId: '5', status: 'confirmed', time: 1585088013000, txParams: { @@ -664,10 +664,10 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 5177046356058729, time: 1653457101080, status: 'submitted', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '0xb427', userEditedGasLimit: false, - chainId: '0x4', + chainId: '0x5', loadingDefaults: false, dappSuggestedGasFees: { gasPrice: '0x4a817c800', @@ -692,10 +692,10 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 5177046356058729, time: 1653457101080, status: 'unapproved', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '0xb427', userEditedGasLimit: false, - chainId: '0x4', + chainId: '0x5', loadingDefaults: true, dappSuggestedGasFees: { gasPrice: '0x4a817c800', @@ -918,10 +918,10 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 1441203963845330, time: 1652206763566, status: 'confirmed', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '0x118e0', userEditedGasLimit: false, - chainId: '0x4', + chainId: '0x5', loadingDefaults: false, dappSuggestedGasFees: { maxPriorityFeePerGas: '0x3B9ACA00', @@ -939,7 +939,7 @@ export const MOCK_TRANSACTION_BY_TYPE = { maxFeePerGas: '0x7be830aec', maxPriorityFeePerGas: '0x3B9ACA00', }, - origin: 'https://rinkeby.etherscan.io', + origin: 'https://goerli.etherscan.io', type: 'safetransferfrom', userFeeLevel: 'dappSuggested', defaultGasEstimates: { @@ -1042,10 +1042,10 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 5177046356058725, time: 1653457077370, status: 'confirmed', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '0xea60', userEditedGasLimit: false, - chainId: '0x4', + chainId: '0x5', loadingDefaults: false, dappSuggestedGasFees: { gasPrice: '0x4a817c800', @@ -1055,7 +1055,7 @@ export const MOCK_TRANSACTION_BY_TYPE = { txParams: { from: '0xabc539a7d5c43940af498008a7c8f3abb35c3725', to: '0xefg60bbf4ba1de43f3b4983a539feebfbd5fd976', - nonce: '0x4', + nonce: '0x5', value: '0x0', data: '0xa9059cbb0000000000000000000000002f318c334780961fb129d2a6c30d0763d9a5c9700000000000000000000000000000000000000000000000000000000000003a98', @@ -1070,10 +1070,10 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 5177046356058725, time: 1653457077370, status: 'unapproved', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '0xea60', userEditedGasLimit: false, - chainId: '0x4', + chainId: '0x5', loadingDefaults: true, dappSuggestedGasFees: { gasPrice: '0x4a817c800', @@ -1152,7 +1152,7 @@ export const MOCK_TRANSACTION_BY_TYPE = { { op: 'add', path: '/txParams/nonce', - value: '0x4', + value: '0x5', note: 'transactions#approveTransaction', timestamp: 1653457091939, }, @@ -1446,15 +1446,15 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 5177046356058754, time: 1653457323504, status: 'confirmed', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '0x10896', userEditedGasLimit: false, - chainId: '0x4', + chainId: '0x5', loadingDefaults: false, dappSuggestedGasFees: null, sendFlowHistory: [ { - entry: 'sendFlow - user set asset type to COLLECTIBLE', + entry: 'sendFlow - user set asset type to NFT', timestamp: 1653457317999, }, { @@ -1496,15 +1496,15 @@ export const MOCK_TRANSACTION_BY_TYPE = { id: 5177046356058754, time: 1653457323504, status: 'unapproved', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '0x10896', userEditedGasLimit: false, - chainId: '0x4', + chainId: '0x5', loadingDefaults: true, dappSuggestedGasFees: null, sendFlowHistory: [ { - entry: 'sendFlow - user set asset type to COLLECTIBLE', + entry: 'sendFlow - user set asset type to NFT', timestamp: 1653457317999, }, { diff --git a/.storybook/test-data.js b/.storybook/test-data.js index e087b6990241..b2e1691c1aa8 100644 --- a/.storybook/test-data.js +++ b/.storybook/test-data.js @@ -1,4 +1,6 @@ import { draftTransactionInitialState } from '../ui/ducks/send'; +import { KEYRING_TYPES } from '../shared/constants/keyrings'; + const state = { invalidCustomNetwork: { state: 'CLOSED', @@ -26,32 +28,10 @@ const state = { ticker: 'ETH', viewOnly: true, }, - { - blockExplorerUrl: 'https://ropsten.etherscan.io', - chainId: '0x3', - iconColor: 'var(--ropsten)', - isATestNetwork: true, - labelKey: 'ropsten', - providerType: 'ropsten', - rpcUrl: 'https://ropsten.infura.io/v3/', - ticker: 'ETH', - viewOnly: true, - }, - { - blockExplorerUrl: 'https://rinkeby.etherscan.io', - chainId: '0x4', - iconColor: 'var(--rinkeby)', - isATestNetwork: true, - labelKey: 'rinkeby', - providerType: 'rinkeby', - rpcUrl: 'https://rinkeby.infura.io/v3/', - ticker: 'ETH', - viewOnly: true, - }, { blockExplorerUrl: 'https://goerli.etherscan.io', chainId: '0x5', - iconColor: 'var(--goerli)', + iconColor: 'var(--color-network-goerli-default)', isATestNetwork: true, labelKey: 'goerli', providerType: 'goerli', @@ -59,21 +39,10 @@ const state = { ticker: 'ETH', viewOnly: true, }, - { - blockExplorerUrl: 'https://kovan.etherscan.io', - chainId: '0x2a', - iconColor: 'var(--kovan)', - isATestNetwork: true, - labelKey: 'kovan', - providerType: 'kovan', - rpcUrl: 'https://kovan.infura.io/v3/', - ticker: 'ETH', - viewOnly: true, - }, { blockExplorerUrl: 'https://sepolia.etherscan.io', chainId: '0xaa36a7', - iconColor: 'var(--sepolia)', + iconColor: 'var(--color-network-sepolia-default)', isATestNetwork: true, labelKey: 'sepolia', providerType: 'sepolia', @@ -84,7 +53,7 @@ const state = { { blockExplorerUrl: '', chainId: '0x539', - iconColor: 'var(--localhost)', + iconColor: 'var(--color-network-localhost-default)', isATestNetwork: true, label: 'Localhost 8545', providerType: 'rpc', @@ -94,7 +63,7 @@ const state = { { blockExplorerUrl: 'https://bscscan.com', chainId: '0x38', - iconColor: 'var(--localhost)', + iconColor: 'var(--color-network-localhost-default)', isATestNetwork: false, label: 'Binance Smart Chain', providerType: 'rpc', @@ -104,7 +73,7 @@ const state = { { blockExplorerUrl: 'https://cchain.explorer.avax.network/', chainId: '0xa86a', - iconColor: 'var(--localhost)', + iconColor: 'var(--color-network-localhost-default)', isATestNetwork: false, label: 'Avalanche', providerType: 'rpc', @@ -114,7 +83,7 @@ const state = { { blockExplorerUrl: 'https://polygonscan.com', chainId: '0x89', - iconColor: 'var(--localhost)', + iconColor: 'var(--color-network-localhost-default)', isATestNetwork: false, label: 'Polygon', providerType: 'rpc', @@ -175,7 +144,7 @@ const state = { iconUrl: 'https://assets.coingecko.com/coins/images/12256/thumb/falconswap.png?1598534184', aggregators: ['CoinGecko', '1inch', 'Lifi'], - occurrences:3, + occurrences: 3, unlisted: false, }, '0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f': { @@ -406,16 +375,15 @@ const state = { id: 3111025347726181, time: 1620710815484, status: 'unapproved', - metamaskNetworkId: '3', + metamaskNetworkId: '5', msgParams: '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4', - chainId: '0x3', + chainId: '0x5', loadingDefaults: false, txParams: { from: '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4', to: '0xaD6D458402F60fD3Bd25163575031ACDce07538D', value: '0x0', - data: - '0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000', + data: '0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000', gas: '0xcb28', gasPrice: '0x77359400', }, @@ -427,15 +395,14 @@ const state = { id: 7786962153682822, time: 1620710815484, status: 'unapproved', - metamaskNetworkId: '3', - chainId: '0x3', + metamaskNetworkId: '5', + chainId: '0x5', loadingDefaults: true, txParams: { from: '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4', to: '0xaD6D458402F60fD3Bd25163575031ACDce07538D', value: '0x0', - data: - '0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000', + data: '0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000', gas: '0xcb28', gasPrice: '0x77359400', }, @@ -550,8 +517,8 @@ const state = { maxModeOn: false, editingTransactionId: null, toNickname: 'Account 2', - ensResolution: null, - ensResolutionError: '', + domainResolution: null, + domainResolutionError: '', token: { address: '0xaD6D458402F60fD3Bd25163575031ACDce07538D', symbol: 'DAI', @@ -581,20 +548,20 @@ const state = { swapsWelcomeMessageHasBeenShown: true, defaultHomeActiveTabName: 'Assets', provider: { - type: 'rinkeby', + type: 'goerli', ticker: 'ETH', nickname: '', rpcUrl: '', - chainId: '0x4', + chainId: '0x5', }, previousProviderStore: { - type: 'rinkeby', + type: 'goerli', ticker: 'ETH', nickname: '', rpcUrl: '', - chainId: '0x4', + chainId: '0x5', }, - network: '3', + network: '5', accounts: { '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4': { address: '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4', @@ -615,8 +582,7 @@ const state = { chainId: '0x38', dappSuggestedGasFees: null, firstRetryBlockNumber: '0x9c2686', - hash: - '0xf45e7a751adfc0fbadccc972816baf33eb34543e52ace51f0f8d0d7f357afdc6', + hash: '0xf45e7a751adfc0fbadccc972816baf33eb34543e52ace51f0f8d0d7f357afdc6', history: [ { chainId: '0x38', @@ -628,8 +594,7 @@ const state = { status: 'unapproved', time: 1629582710520, txParams: { - data: - '0xa9059cbb0000000000000000000000004ef2d5a1d056e7c9e8bcdbf2bd9ac0df749a1c2900000000000000000000000000000000000000000000000029a2241af62c0000', + data: '0xa9059cbb0000000000000000000000004ef2d5a1d056e7c9e8bcdbf2bd9ac0df749a1c2900000000000000000000000000000000000000000000000029a2241af62c0000', from: '0x17f62b1b2407c41c43e14da0699d6b4b0a521548', gas: '0x2eb27', gasPrice: '0x12a05f200', @@ -813,8 +778,7 @@ const state = { blockHash: '0x30bf5dfa12e460a5d121267c00ba3047a14ba286e0c4fe75fa979010f527cba0', blockNumber: '9c2688', - data: - '0x00000000000000000000000000000000000000000000000028426c213d688000', + data: '0x00000000000000000000000000000000000000000000000028426c213d688000', logIndex: '245', removed: false, topics: [ @@ -831,8 +795,7 @@ const state = { blockHash: '0x30bf5dfa12e460a5d121267c00ba3047a14ba286e0c4fe75fa979010f527cba0', blockNumber: '9c2688', - data: - '0x000000000000000000000000000000000000000000000000006a94d74f430000', + data: '0x000000000000000000000000000000000000000000000000006a94d74f430000', logIndex: '246', removed: false, topics: [ @@ -849,8 +812,7 @@ const state = { blockHash: '0x30bf5dfa12e460a5d121267c00ba3047a14ba286e0c4fe75fa979010f527cba0', blockNumber: '9c2688', - data: - '0x000000000000000000000000000000000000000000000000001ff973cafa8000', + data: '0x000000000000000000000000000000000000000000000000001ff973cafa8000', logIndex: '247', removed: false, topics: [ @@ -974,8 +936,7 @@ const state = { submittedTime: 1629582711337, time: 1629582710520, txParams: { - data: - '0xa9059cbb0000000000000000000000004ef2d5a1d056e7c9e8bcdbf2bd9ac0df749a1c2900000000000000000000000000000000000000000000000029a2241af62c0000', + data: '0xa9059cbb0000000000000000000000004ef2d5a1d056e7c9e8bcdbf2bd9ac0df749a1c2900000000000000000000000000000000000000000000000029a2241af62c0000', from: '0x17f62b1b2407c41c43e14da0699d6b4b0a521548', gas: '0x2eb27', gasPrice: '0x12a05f200', @@ -1013,8 +974,7 @@ const state = { red: null, words: [10233480, null], }, - data: - '0x00000000000000000000000000000000000000000000000028426c213d688000', + data: '0x00000000000000000000000000000000000000000000000028426c213d688000', logIndex: { length: 1, negative: 0, @@ -1046,8 +1006,7 @@ const state = { red: null, words: [10233480, null], }, - data: - '0x000000000000000000000000000000000000000000000000006a94d74f430000', + data: '0x000000000000000000000000000000000000000000000000006a94d74f430000', logIndex: { length: 1, negative: 0, @@ -1079,8 +1038,7 @@ const state = { red: null, words: [10233480, null], }, - data: - '0x000000000000000000000000000000000000000000000000001ff973cafa8000', + data: '0x000000000000000000000000000000000000000000000000001ff973cafa8000', logIndex: { length: 1, negative: 0, @@ -1132,7 +1090,7 @@ const state = { '0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e': '0x2d3142f5000', '0x9d0ba4ddac06032527b140912ec808ab9451b788': '0x15f6f0b9d4f8d000', }, - '0x3': { + 5: { '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4': '0x176e5b6f173ebe66', '0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e': '0x2d3142f5000', '0x9d0ba4ddac06032527b140912ec808ab9451b788': '0x15f6f0b9d4f8d000', @@ -1158,14 +1116,14 @@ const state = { unapprovedTypedMessages: {}, unapprovedTypedMessagesCount: 0, keyringTypes: [ - 'Simple Key Pair', - 'HD Key Tree', - 'Trezor Hardware', - 'Ledger Hardware', + KEYRING_TYPES.IMPORTED, + KEYRING_TYPES.HD_KEY_TREE, + KEYRING_TYPES.TREZOR, + KEYRING_TYPES.LEDGER, ], keyrings: [ { - type: 'HD Key Tree', + type: KEYRING_TYPES.HD_KEY_TREE, accounts: [ '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4', '0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e', @@ -1196,7 +1154,7 @@ const state = { decimals: 18, }, ], - '0x3': [ + '0x5': [ { address: '0xaD6D458402F60fD3Bd25163575031ACDce07538D', symbol: 'DAI', @@ -1209,7 +1167,7 @@ const state = { }, accountHiddenTokens: { '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4': { - '0x3': [], + '0x5': [], }, }, assetImages: { @@ -1257,8 +1215,7 @@ const state = { to: '0x045c619e4d29bba3b92769508831b681b83d6a96', value: '0xbca9bce4d98ca3', }, - hash: - '0x2de9256a7c604586f7ecfd87ae9509851e217f588f9f85feed793c54ed2ce0aa', + hash: '0x2de9256a7c604586f7ecfd87ae9509851e217f588f9f85feed793c54ed2ce0aa', transactionCategory: 'incoming', }, '0x320a1fd769373578f78570e5d8f56e89bc7bce9657bb5f4c12d8fe790d471bfd': { @@ -1275,8 +1232,7 @@ const state = { to: '0x045c619e4d29bba3b92769508831b681b83d6a96', value: '0xcdb08ab4254000', }, - hash: - '0x320a1fd769373578f78570e5d8f56e89bc7bce9657bb5f4c12d8fe790d471bfd', + hash: '0x320a1fd769373578f78570e5d8f56e89bc7bce9657bb5f4c12d8fe790d471bfd', transactionCategory: 'incoming', }, '0x8add6c1ea089a8de9b15fa2056b1875360f17916755c88ace9e5092b7a4b1239': { @@ -1293,8 +1249,7 @@ const state = { to: '0x045c619e4d29bba3b92769508831b681b83d6a96', value: '0xe6ed27d6668000', }, - hash: - '0x8add6c1ea089a8de9b15fa2056b1875360f17916755c88ace9e5092b7a4b1239', + hash: '0x8add6c1ea089a8de9b15fa2056b1875360f17916755c88ace9e5092b7a4b1239', transactionCategory: 'incoming', }, '0x50be62ab1cabd03ff104c602c11fdef7a50f3d73c55006d5583ba97950ab1144': { @@ -1311,15 +1266,11 @@ const state = { to: '0x045c619e4d29bba3b92769508831b681b83d6a96', value: '0x63eb89da4ed00000', }, - hash: - '0x50be62ab1cabd03ff104c602c11fdef7a50f3d73c55006d5583ba97950ab1144', + hash: '0x50be62ab1cabd03ff104c602c11fdef7a50f3d73c55006d5583ba97950ab1144', transactionCategory: 'incoming', }, }, incomingTxLastFetchedBlocksByNetwork: { - ropsten: 8872820, - rinkeby: null, - kovan: null, goerli: null, sepolia: null, mainnet: 10902989, @@ -1419,12 +1370,6 @@ const state = { }, }, }, - threeBoxSyncingAllowed: false, - showRestorePrompt: true, - threeBoxLastUpdated: 0, - threeBoxAddress: null, - threeBoxSynced: false, - threeBoxDisabled: false, swapsState: { quotes: {}, fetchParams: null, @@ -1515,8 +1460,6 @@ const state = { }, networksTabSelectedRpcUrl: '', loadingMethodData: false, - show3BoxModalAfterImport: false, - threeBoxLastUpdated: null, requestAccountTabs: {}, openMetaMaskTabs: {}, currentWindowTab: {}, @@ -1549,15 +1492,14 @@ const state = { id: 3111025347726181, time: 1620723786838, status: 'unapproved', - metamaskNetworkId: '3', - chainId: '0x3', + metamaskNetworkId: '5', + chainId: '0x5', loadingDefaults: false, txParams: { from: '0x64a845a5b02460acf8a3d84503b0d68d028b4bb4', to: '0xaD6D458402F60fD3Bd25163575031ACDce07538D', value: '0x0', - data: - '0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170', + data: '0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170', gas: '0xea60', gasPrice: '0x4a817c800', }, @@ -1569,15 +1511,14 @@ const state = { id: 3111025347726181, time: 1620723786838, status: 'unapproved', - metamaskNetworkId: '3', - chainId: '0x3', + metamaskNetworkId: '5', + chainId: '0x5', loadingDefaults: true, txParams: { from: '0x983211ce699ea5ab57cc528086154b6db1ad8e55', to: '0xaD6D458402F60fD3Bd25163575031ACDce07538D', value: '0x0', - data: - '0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170', + data: '0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170', gas: '0xea60', gasPrice: '0x4a817c800', }, diff --git a/CHANGELOG.md b/CHANGELOG.md index 743ffb254795..22e62b2f7dc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,118 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [10.22.2] +### Changed +- Restore changes from v10.22.0 +- Fix deadlock encountered while performing Swaps on unsupported testnets ([#16511](https://github.com/MetaMask/metamask-extension/pull/16511)) + +## [10.22.1] +### Changed +- Temporarily revert v10.22.0 + +### Fixed +- Prevent user from editing a contract interaction initiated by a dapp ([#16498](https://github.com/MetaMask/metamask-extension/pull/16498)) + +## [10.22.0] +### Added +- Add Aurora network to the Popular Custom Network list ([#16039](https://github.com/MetaMask/metamask-extension/pull/16039)) +- Add array of valid sizes for Box `height` and `width` to support responsive layout ([#16111](https://github.com/MetaMask/metamask-extension/pull/16111)) +- [FLASK] Allow snaps insights to show on regular EOA transactions ([#16093](https://github.com/MetaMask/metamask-extension/pull/16093)) + +### Changed +- Update `eth-lattice-keyring` to `v0.12.3` ([#15997](https://github.com/MetaMask/metamask-extension/pull/15997)) + - Updates `@ethereumjs/util` to `v8.0.0` to reduce bundle size + - Removes `secp256k1` and `@ethereumjs/common` to reduce bundle size + - Updates `gridplus-sdk` to v2.2.9 + - Adds caching for calls to block explorers to improve UX ([PR](https://github.com/GridPlus/gridplus-sdk/pull/469)) +- Remove unused `zh` locales directory in favor of `zh_CN` for Chinese translations ([#16322](https://github.com/MetaMask/metamask-extension/pull/16322)) +- Remove 3box sync feature and delete the `ThreeBoxController` ([#14571](https://github.com/MetaMask/metamask-extension/pull/14571)) + +### Fixed +- Fix Secret Recovery Phrase video overlapping lateral box for smaller viewports ([#16345](https://github.com/MetaMask/metamask-extension/pull/16345)) +- Fix "Learn more" link on Connected Account notification ([#16339](https://github.com/MetaMask/metamask-extension/pull/16339)) +- Fix default users with browser language code `zh` to point the supported `zh_CN` language code ([#16329](https://github.com/MetaMask/metamask-extension/pull/16329)) +- Fix Forgot Password flow after Wallet Creation ([#16156](https://github.com/MetaMask/metamask-extension/pull/16156)) +- Fix fiat conversion for Popular Custom networks displaying it by default ([#16132](https://github.com/MetaMask/metamask-extension/pull/16132)) +- Fix restricted injection, by removing docs.google.com from blocked domains list ([#16154](https://github.com/MetaMask/metamask-extension/pull/16154)) +- Fix squeezing avatar, by adding a flex property to keep always the same ratio ([#16047](https://github.com/MetaMask/metamask-extension/pull/16047)) +- Fix domain names not always being rendered correctly in the connected sites list ([#16074](https://github.com/MetaMask/metamask-extension/pull/16074)) +- Fix transaction confirmation page performance ([#16205](https://github.com/MetaMask/metamask-extension/pull/16205)) +- Fix Add Network form by blocking the submission when `chainId` does not match the one returned by the `rpcUrl` ([#16452](https://github.com/MetaMask/metamask-extension/pull/16452)) +- Swaps: fix tokens being removed from the Asset lists, after canceling a Swap ([#16167](https://github.com/MetaMask/metamask-extension/pull/16167)) +- Swaps: add debouncing for the `Swap from` and `Swap to` form fields ([#16326](https://github.com/MetaMask/metamask-extension/pull/16326)) +- [FLASK] Fix crash on snaps settings page if snap has no permissions ([#16354](https://github.com/MetaMask/metamask-extension/pull/16354)) +- [FLASK] Fix crash after restoring MetaMask if you had snaps installed ([#16228](https://github.com/MetaMask/metamask-extension/pull/16228)) +- [FLASK] Fix a problem with displaying snaps transaction insight data ([#16023](https://github.com/MetaMask/metamask-extension/pull/16023)) + +## [10.21.2] +### Fixed +- Fix undefined txParams when calling approveTransaction, by adding the id on the txMeta argument ([#16382](https://github.com/MetaMask/metamask-extension/pull/16382)) + +## [10.21.1] +### Changed +- Improve rate limiting for metric events ([#16308](https://github.com/MetaMask/metamask-extension/pull/16308)) + +## [10.21.0] +### Added +- Add functionality for buying native currency and tokens on Optimism and Arbitrum, using Transak ([#16031](https://github.com/MetaMask/metamask-extension/pull/16031)) +- Add functionality for buying tokens with Wyre ([#15992](https://github.com/MetaMask/metamask-extension/pull/15992)) +- Add functionality for buying tokens with Moonpay ([#15924](https://github.com/MetaMask/metamask-extension/pull/15924)) +- Add functionality for buying tokens with Coinbase Pay and Transak ([#15551](https://github.com/MetaMask/metamask-extension/pull/15551)) +- Add new translations for DE, EL, ES, FR, HI, ID, JA, KO, PT, RU, TL TR, VI and ZH_CN ([#15411](https://github.com/MetaMask/metamask-extension/pull/15411)) +- Add Hardware wallet Buy and Tutorial buttons and update copies ([#14738](https://github.com/MetaMask/metamask-extension/pull/14738)) +- [FLASK] Add support for blocking Snaps by source shasum ([#15830](https://github.com/MetaMask/metamask-extension/pull/15830)) +- [FLASK] Add transaction insights via Snaps ([#15814](https://github.com/MetaMask/metamask-extension/pull/15814)) + +### Changed +- Dark Mode: elevate the Theme functionality from Experimental to General Settings ([#15865](https://github.com/MetaMask/metamask-extension/pull/15865)) +- Update Arbitrum symbol from `AETH` to `ETH` ([#15747](https://github.com/MetaMask/metamask-extension/pull/15747)) +- Update warning dialog copy on SetApprovalForAll Confirmation page ([#15744](https://github.com/MetaMask/metamask-extension/pull/15744)) +- Update header display on NFT Approval and SetApprovalForAll Confirmation pages ([#15727](https://github.com/MetaMask/metamask-extension/pull/15727)) +- Bump `@metamask/contract-metadata` from `1.35.0` to `1.36.0` ([#15597](https://github.com/MetaMask/metamask-extension/pull/15597)) + - Add tokens: ZKP, GTON, PRVG, XCHF, XHT, OGV, veOFV, wOUSD and SUSHI + - Fix SVG icons for sETH and sUSD tokens + - Add the top NFT contracts on Opensea +- Enable Add Popular Networks by default for all users ([#16172](https://github.com/MetaMask/metamask-extension/pull/16172)) +- Update `@metamask/controllers` to v31.2.0 ([#16033](https://github.com/MetaMask/metamask-extension/pull/16033)) +- Swaps: replace Rinkeby with Goerli for performing swaps on a testnet ([#15781](https://github.com/MetaMask/metamask-extension/pull/15781)) +- Swaps: only render tooltip component if swap network is disabled ([#15733](https://github.com/MetaMask/metamask-extension/pull/15733)) +- Swaps: use `gasEstimateWithRefund` instead of `gasEstimate` for more precise estimations ([#15968](https://github.com/MetaMask/metamask-extension/pull/15968)) +- Swaps: improve Build Quote page ([#15758](https://github.com/MetaMask/metamask-extension/pull/15758)) + - Preserve search query for the `Swap from` and `Swap to` form fields + - Update placeholder text on `Swap to` and `Swap from` search fields + - Update copy on slippage tolerance tooltip +- [FLASK] `Add snap_getBip32PublicKey` RPC method ([#15889](https://github.com/MetaMask/metamask-extension/pull/15889)) +- **[FLASK] BREAKING:** Remove deprecated snap_getBip44Entropy_* method ([#15889](https://github.com/MetaMask/metamask-extension/pull/15889)) +- [FLASK] Miscellaneous fixes to the Snaps platform ([#15889](https://github.com/MetaMask/metamask-extension/pull/15889)) + +### Fixed +- Fix double account creation when using keyboard controls on New Account page ([#15077](https://github.com/MetaMask/metamask-extension/pull/15077)) +- Fix error message getting cut when introducing wrong private key format on Import Account page ([#15940](https://github.com/MetaMask/metamask-extension/pull/15940)) +- Fix edit button not being displayed when sending tx with hex data to a contract on Confirm tx page ([#15812](https://github.com/MetaMask/metamask-extension/pull/15812)) +- Fix incorrect balance asset on Encrypt and Decrypt Request pages ([#15885](https://github.com/MetaMask/metamask-extension/pull/15885)) +- Fix spelling errors and improve grammar for German translation ([#15592](https://github.com/MetaMask/metamask-extension/pull/15592)) +- Fix typos for French translation ([#15735](https://github.com/MetaMask/metamask-extension/pull/15735)) +- Fix incorrect identicon type for Account, by ensuring Blockies is displayed everywhere when enabled instead of Jazzicon ([#15768](https://github.com/MetaMask/metamask-extension/pull/15768)) +- Fix query verification for signatures, by ensuring we skip searching 4byte directory if we don't have a full 4 bytes of data ([#15473](https://github.com/MetaMask/metamask-extension/pull/15473)) +- Fix address resolution to Account name, when editing a tx instead of displaying the hex address ([#15873](https://github.com/MetaMask/metamask-extension/pull/15873)) +- Fix "Get ether from faucet" message, by including the end of the sentence and a full stop ([#15875](https://github.com/MetaMask/metamask-extension/pull/15875)) +- Fix font weight of the `` element, by restoring the `b` style ([#15784](https://github.com/MetaMask/metamask-extension/pull/15784)) +- Fix ETH badge being displayed to networks where ETH is not the primary currency ([#16102](https://github.com/MetaMask/metamask-extension/pull/16102)) +- Fix overlapping Portfolio tooltip with Network popup, when a custom network is added ([#16090](https://github.com/MetaMask/metamask-extension/pull/16090)) +- Fix typo in French translation for "removeAccount" ([#16095](https://github.com/MetaMask/metamask-extension/pull/16095)) +- Fix What's New notification not displayed to users who created a new wallet ([#16042](https://github.com/MetaMask/metamask-extension/pull/16042)) +- [FLASK] Fix an issue with installing snaps that request the `eth_accounts` permission ([#16161](https://github.com/MetaMask/metamask-extension/pull/16161)) + +## [10.20.0] +### Changed +- Deprecate Rinkeby, Ropsten and Kovan test networks and define Goerli as the default network in test mode ([#15989](https://github.com/MetaMask/metamask-extension/pull/15989)) + +### Fixed +- [FLASK] Fix crash when uninstalling snap ([#15799](https://github.com/MetaMask/metamask-extension/pull/15799)) +- [FLASK] Fix crash with certain permissions on the snap settings page ([#15797](https://github.com/MetaMask/metamask-extension/pull/15797)) +- [FLASK] Fix an issue with installing and updating snaps with 0 permissions ([#15796](https://github.com/MetaMask/metamask-extension/pull/15796)) + ## [10.19.0] ### Added - Add ENS wildcard and secure offchain resolution (ENSIP-10 & EIP3668) ([#14675](https://github.com/MetaMask/metamask-extension/pull/14675)) @@ -3189,7 +3301,14 @@ 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.19.0...HEAD +[Unreleased]: https://github.com/MetaMask/metamask-extension/compare/v10.22.2...HEAD +[10.22.2]: https://github.com/MetaMask/metamask-extension/compare/v10.22.1...v10.22.2 +[10.22.1]: https://github.com/MetaMask/metamask-extension/compare/v10.22.0...v10.22.1 +[10.22.0]: https://github.com/MetaMask/metamask-extension/compare/v10.21.2...v10.22.0 +[10.21.2]: https://github.com/MetaMask/metamask-extension/compare/v10.21.1...v10.21.2 +[10.21.1]: https://github.com/MetaMask/metamask-extension/compare/v10.21.0...v10.21.1 +[10.21.0]: https://github.com/MetaMask/metamask-extension/compare/v10.20.0...v10.21.0 +[10.20.0]: https://github.com/MetaMask/metamask-extension/compare/v10.19.0...v10.20.0 [10.19.0]: https://github.com/MetaMask/metamask-extension/compare/v10.18.4...v10.19.0 [10.18.4]: https://github.com/MetaMask/metamask-extension/compare/v10.18.3...v10.18.4 [10.18.3]: https://github.com/MetaMask/metamask-extension/compare/v10.18.2...v10.18.3 diff --git a/LICENSE b/LICENSE index f245dcd0ef1a..6e31b327d7f8 100644 --- a/LICENSE +++ b/LICENSE @@ -15,4 +15,4 @@ You are granted a non-exclusive, non-transferable, non-sublicensable license to You will not use any trade mark, service mark, trade name, logo of ConsenSys or any other company or organization in a way that is likely or intended to cause confusion about the owner or authorized user of such marks, names or logos. -If you have any questions, comments or interest in pursuing any other use cases, please reach out to us at metamask.license@consensys.net. +If you have any questions, comments or interest in pursuing any other use cases, please reach out to us at communications@metamask.io. diff --git a/README.md b/README.md index 7d7c5f19b872..302c32ca626a 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ To learn how to contribute to the MetaMask project itself, visit our [Internal D ## Building locally - Install [Node.js](https://nodejs.org) version 16 - - If you are using [nvm](https://github.com/creationix/nvm#installation) (recommended) running `nvm use` will automatically choose the right node version for you. + - If you are using [nvm](https://github.com/nvm-sh/nvm#installing-and-updating) (recommended) running `nvm use` will automatically choose the right node version for you. - Install [Yarn](https://yarnpkg.com/en/docs/install) - Install dependencies: `yarn setup` (not the usual install command) - Copy the `.metamaskrc.dist` file to `.metamaskrc` @@ -61,13 +61,16 @@ You can run the linter by itself with `yarn lint`, and you can automatically fix ### Running E2E Tests -Our e2e test suite can be run on either Firefox or Chrome. In either case, start by creating a test build by running `yarn build:test`. +Our e2e test suite can be run on either Firefox or Chrome. -- Firefox e2e tests can be run with `yarn test:e2e:firefox`. +1. **required** `yarn build:test` to create a test build. +2. run tests, targetting the browser: + * Firefox e2e tests can be run with `yarn test:e2e:firefox`. + * Chrome e2e tests can be run with `yarn test:e2e:chrome`. The `chromedriver` package major version must match the major version of your local Chrome installation. If they don't match, update whichever is behind before running Chrome e2e tests. -- Chrome e2e tests can be run with `yarn test:e2e:chrome`. The `chromedriver` package major version must match the major version of your local Chrome installation. If they don't match, update whichever is behind before running Chrome e2e tests. +#### Running a single e2e test -- Single e2e tests can be run with `yarn test:e2e:single test/e2e/tests/TEST_NAME.spec.js` along with the options below. +Single e2e tests can be run with `yarn test:e2e:single test/e2e/tests/TEST_NAME.spec.js` along with the options below. ```console --browser Set the browser used; either 'chrome' or 'firefox'. @@ -107,7 +110,7 @@ Whenever you change dependencies (adding, removing, or updating, either in `pack ## Architecture -- [Visual of the controller heirarchy and dependencies as of summer 2022.](https://gist.github.com/rekmarks/8dba6306695dcd44967cce4b6a94ae33) +- [Visual of the controller hierarchy and dependencies as of summer 2022.](https://gist.github.com/rekmarks/8dba6306695dcd44967cce4b6a94ae33) - [Visual of the entire codebase.](https://mango-dune-07a8b7110.1.azurestaticapps.net/?repo=metamask%2Fmetamask-extension) [![Architecture Diagram](./docs/architecture.png)][1] diff --git a/app/_locales/am/messages.json b/app/_locales/am/messages.json index 6a3d69bc2d0f..569051949596 100644 --- a/app/_locales/am/messages.json +++ b/app/_locales/am/messages.json @@ -2,9 +2,6 @@ "about": { "message": "ስለ" }, - "acceleratingATransaction": { - "message": "* ከፍተኛ የነዳጅ ዋጋን በመጠቀም ግብይትን ማፋጠን በአውታረ መረቡ በፍጥነት እንዲከወን የማድረግ ዕድልን ይጨምራል፤ ነገር ግን ሁልጊዜም የተረጋገጠ አይደለም።" - }, "accessingYourCamera": { "message": "ወደ ካሜራዎ መድረስ..." }, @@ -187,18 +184,9 @@ "connectingToGoerli": { "message": "ከ Goerli የሙከራ አውታረ መረብ ጋር መገናኘት" }, - "connectingToKovan": { - "message": "ከ Kovan የሙከራ አውታረ መረብ መገናኘት" - }, "connectingToMainnet": { "message": "ከዋናው የ Ethereum አውታረ መረብ ጋር መገናኘት" }, - "connectingToRinkeby": { - "message": "ከ Rinkeby የሙከራ አውታረ መረብ ጋር በመገናኘት ላይ" - }, - "connectingToRopsten": { - "message": "ከ Ropsten የሙከራ አውታረ መረብ ጋር በመገናኘት ላይ" - }, "continueToWyre": { "message": "ወደ Wyre ይቀጥሉ" }, @@ -241,12 +229,6 @@ "currentLanguage": { "message": "ወቅታዊ ቋንቋ" }, - "customGas": { - "message": "ነዳጅን አብጅ" - }, - "customGasSubTitle": { - "message": "ክፍያ መጨመር የመከወኛ ጊዜን ሊቀንስ ቢችልም ይህ ግን ዋስትና የለውም።" - }, "customToken": { "message": "ብጁ ተለዋጭ ስም" }, @@ -331,9 +313,6 @@ "enterPasswordContinue": { "message": "ለመቀጠል የይለፍ ቃል ያስገቡ" }, - "estimatedProcessingTimes": { - "message": "የሚገመት የክወና ጊዜያት" - }, "ethereumPublicAddress": { "message": "Ethereum ሕዝባዊ አድራሻ" }, @@ -494,9 +473,6 @@ "knownAddressRecipient": { "message": "የሚታወቅ የግንኙነት አድራሻ።" }, - "kovan": { - "message": "Kovan የሙከራ አውታረ መረብ" - }, "learnMore": { "message": "የበለጠ ይወቁ" }, @@ -589,12 +565,6 @@ "newToMetaMask": { "message": "ለ MetaMask አዲስ ነዎት?" }, - "newTotal": { - "message": "አዲስ ድምር" - }, - "newTransactionFee": { - "message": "አዲስ የግብይት ክፍያ" - }, "next": { "message": "ቀጣይ" }, @@ -753,12 +723,6 @@ "revealSeedWordsWarningTitle": { "message": "ይህን ሐረግ ለየትኛውም ሰው አያጋሩ!" }, - "rinkeby": { - "message": "Rinkeby የሙከራ አውታረ መረብ" - }, - "ropsten": { - "message": "Ropsten የሙከራ አውታረ መረብ " - }, "rpcUrl": { "message": "አዲስ የ RPC URL" }, @@ -795,9 +759,6 @@ "seedPhraseReq": { "message": "የዘር ሐረጋት የ 12 ቃላት ርዝመት አላቸው" }, - "selectAHigherGasFee": { - "message": "የግብይትዎን ክዋኔ ለማቀላጠፍ የበለጠ የነዳጅ ዋጋ ይምረጡ።*" - }, "selectAnAccount": { "message": "መለያ ይምረጡ" }, @@ -816,9 +777,6 @@ "send": { "message": "ላክ" }, - "sendAmount": { - "message": "መጠኑን ላክ" - }, "sendTokens": { "message": "ተለዋጭ ስሞችን ላክ" }, @@ -861,9 +819,6 @@ "signed": { "message": "ተፈርሟል" }, - "slow": { - "message": "ቀስ" - }, "somethingWentWrong": { "message": "ኤጭ! የሆነ ችግር ተፈጥሯል።" }, diff --git a/app/_locales/ar/messages.json b/app/_locales/ar/messages.json index 6d99fc54b78a..f06f120ba09b 100644 --- a/app/_locales/ar/messages.json +++ b/app/_locales/ar/messages.json @@ -8,9 +8,6 @@ "about": { "message": "حول" }, - "acceleratingATransaction": { - "message": "* تسريع المعاملات باستخدام سعر عملة جاس أعلى يزيد من فرص معالجتها بواسطة الشبكة بشكلٍ أسرع، لكن ذلك غير مضمون دائماً." - }, "acceptTermsOfUse": { "message": "لقد قرأت دولار واحد وأوافق عليه", "description": "$1 is the `terms` message" @@ -201,18 +198,9 @@ "connectingToGoerli": { "message": "الاتصال بشبكة اختبار Goerli" }, - "connectingToKovan": { - "message": "الاتصال بشبكة اختبار Kovan" - }, "connectingToMainnet": { "message": "جارِ الاتصال بشبكة إيثيريوم الرئيسية" }, - "connectingToRinkeby": { - "message": "جارِ الاتصال بشبكة اختبار Rinkeby " - }, - "connectingToRopsten": { - "message": "جارِ الاتصال بشبكة اختبار Ropsten " - }, "continueToWyre": { "message": "الاستمرار إلى Wyre" }, @@ -258,12 +246,6 @@ "custom": { "message": "إعدادات متقدمة" }, - "customGas": { - "message": "تخصيص الغاز" - }, - "customGasSubTitle": { - "message": "قد تؤدي زيادة الرسوم إلى تقليل أزمنة المعالجة، ولكن ذلك غير مضمون." - }, "customToken": { "message": "عملة رمزية مخصصة" }, @@ -348,9 +330,6 @@ "enterPasswordContinue": { "message": "أدخل كلمة المرور للمتابعة" }, - "estimatedProcessingTimes": { - "message": "أوقات المعالجة المقدرة" - }, "ethereumPublicAddress": { "message": "عنوان الإيثيريوم العمومي" }, @@ -507,9 +486,6 @@ "knownAddressRecipient": { "message": "عنوان العقد المعروف." }, - "kovan": { - "message": "شبكة اختبار Kovan " - }, "learnMore": { "message": "اكتشف المزيد" }, @@ -605,12 +581,6 @@ "newToMetaMask": { "message": "هل انت جديد في MetaMask؟" }, - "newTotal": { - "message": "إجمالي جديد" - }, - "newTransactionFee": { - "message": "رسوم المعاملات الجديدة" - }, "next": { "message": "التالي" }, @@ -769,12 +739,6 @@ "revealSeedWordsWarningTitle": { "message": "لا تشارك هذه الجملة مع أي شخص آخر!" }, - "rinkeby": { - "message": "شبكة اختبارات Rinkeby" - }, - "ropsten": { - "message": "شبكة اختبار Ropsten" - }, "rpcUrl": { "message": "عنوان جديد لاستدعاء الإجراء عن بعد" }, @@ -811,9 +775,6 @@ "seedPhraseReq": { "message": "طول الجمل البذرية 12 كلمة" }, - "selectAHigherGasFee": { - "message": "حدد رسوم جاس أعلى لتسريع معالجة معاملتك. *" - }, "selectAnAccount": { "message": "قم بتحديد حساب" }, @@ -832,9 +793,6 @@ "send": { "message": "إرسال" }, - "sendAmount": { - "message": "إرسال المبلغ" - }, "sendTokens": { "message": "إرسال عملات رمزية" }, @@ -877,9 +835,6 @@ "signed": { "message": "مسجل الدخول" }, - "slow": { - "message": "بطيء" - }, "somethingWentWrong": { "message": "عذراً! حدث خطأ ما." }, diff --git a/app/_locales/bg/messages.json b/app/_locales/bg/messages.json index 49b76836583e..3de7201897b2 100644 --- a/app/_locales/bg/messages.json +++ b/app/_locales/bg/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Информация" }, - "acceleratingATransaction": { - "message": "* Ускоряването на транзакция чрез използване на по-висока цена на газа увеличава шансовете й да се обработва по-бързо от мрежата, но това не винаги е гарантирано." - }, "accessingYourCamera": { "message": "Достъп до вашата камера ..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Свързване с тестова мрежа на Goerli" }, - "connectingToKovan": { - "message": "Свързване с тестовата мрежа на Kovan" - }, "connectingToMainnet": { "message": "Свързване с главната мрежа Ethereum" }, - "connectingToRinkeby": { - "message": "Свързване с тестова мрежа на Rinkeby" - }, - "connectingToRopsten": { - "message": "Свързване с тестова мрежа Ropsten" - }, "continueToWyre": { "message": "Продължете към Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "Разширени" }, - "customGas": { - "message": "Персонализирайте газ" - }, - "customGasSubTitle": { - "message": "Увеличаването на таксата може да намали времето за обработка, но това не е гарантирано." - }, "customToken": { "message": "Персонализиран маркер" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "Въведете парола, за да продължите" }, - "estimatedProcessingTimes": { - "message": "Приблизителни времена за обработка" - }, "ethereumPublicAddress": { "message": "Публичен адрес за етереум" }, @@ -499,9 +478,6 @@ "knownAddressRecipient": { "message": "Известен адрес на договора." }, - "kovan": { - "message": "Тестова мрежа на Кован" - }, "learnMore": { "message": "Научете повече" }, @@ -600,12 +576,6 @@ "newToMetaMask": { "message": "Нови ли сте в MetaMask?" }, - "newTotal": { - "message": "Ново общо" - }, - "newTransactionFee": { - "message": "Нова такса за транзакция" - }, "next": { "message": "Напред" }, @@ -764,12 +734,6 @@ "revealSeedWordsWarningTitle": { "message": "НЕ споделяйте тази фраза с никого!" }, - "rinkeby": { - "message": "Тестова мрежа на Rinkeby" - }, - "ropsten": { - "message": "Тестова мрежа Ropsten" - }, "rpcUrl": { "message": "Нов URL адрес за RPC" }, @@ -806,9 +770,6 @@ "seedPhraseReq": { "message": "Фразите зародиш се състоят от 12 думи" }, - "selectAHigherGasFee": { - "message": "\nИзберете по-висока такса за газ, за ​​да ускорите обработката на Вашата транзакция.*" - }, "selectAnAccount": { "message": "Изберете акаунт" }, @@ -827,9 +788,6 @@ "send": { "message": "Изпращане" }, - "sendAmount": { - "message": "Изпратете сумата" - }, "sendTokens": { "message": "Изпращане на жетони" }, @@ -872,9 +830,6 @@ "signed": { "message": "Подписан" }, - "slow": { - "message": "Бавно" - }, "somethingWentWrong": { "message": "Упс! Нещо се обърка." }, diff --git a/app/_locales/bn/messages.json b/app/_locales/bn/messages.json index 88fedac63b1f..5df4a9ba7f03 100644 --- a/app/_locales/bn/messages.json +++ b/app/_locales/bn/messages.json @@ -8,9 +8,6 @@ "about": { "message": "সম্পর্কে" }, - "acceleratingATransaction": { - "message": "* একটি উচ্চতর গ্যাসের মূল্য ব্যবহার করে একটি লেনদেনের গতি বৃদ্ধি নেটওয়ার্কের দ্বারা সেটির প্রক্রিয়াকরণ দ্রুততর হওয়ার সম্ভাবনা বৃদ্ধি করে, কিন্তু সবসময় সেটির নিশ্চয়তা দেওয়া যায় না।" - }, "accessingYourCamera": { "message": "আপনার ক্যামেরা অ্যাক্সেস করছে..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "গোয়েরলি টেস্ট নেটওয়ার্কের সাথে সংযোগ করা হচ্ছে" }, - "connectingToKovan": { - "message": "কোভান টেস্ট নেটওয়ার্কের সাথে সংযোগ করছে" - }, "connectingToMainnet": { "message": "মুখ্য Ethereum নেটওয়ার্কের সাথে সংযোগ করছে" }, - "connectingToRinkeby": { - "message": "রিঙ্কেবি টেস্ট নেটওয়ার্কের সাথে সংযোগ করছে" - }, - "connectingToRopsten": { - "message": "রপস্টেন টেস্ট নেটওয়ার্কের সাথে সংযোগ করছে" - }, "continueToWyre": { "message": "Wyre এ অবিরত রাখুন" }, @@ -250,12 +238,6 @@ "custom": { "message": "উন্নত" }, - "customGas": { - "message": "গ্যাস কাস্টোমাইজ করুন" - }, - "customGasSubTitle": { - "message": "ফী বৃদ্ধি করা প্রক্রিয়াকরণের সময় কমাতে পারে, কিন্তু সেটির নিশ্চয়তা দেওয়া হয় না।" - }, "customToken": { "message": "কাস্টম টোকেন" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "অবিরত রাখতে পাসওয়ার্ড লিখুন" }, - "estimatedProcessingTimes": { - "message": "আনুমানিক প্রক্রিয়াকরণের সময়" - }, "ethereumPublicAddress": { "message": "Ethereum পাবলিক অ্যাড্রেস" }, @@ -503,9 +482,6 @@ "knownAddressRecipient": { "message": "জানা পরিচিতির ঠিকানা৷" }, - "kovan": { - "message": "কোভান টেস্ট নেটওয়ার্ক" - }, "learnMore": { "message": "আরও জানুন" }, @@ -604,12 +580,6 @@ "newToMetaMask": { "message": "MetaMask এ নতুন?" }, - "newTotal": { - "message": "নতুন সমষ্টি" - }, - "newTransactionFee": { - "message": "নতুন লেনদেন ফী" - }, "next": { "message": "পরবর্তী" }, @@ -768,12 +738,6 @@ "revealSeedWordsWarningTitle": { "message": "এই ফ্রেজটি কারোর সাথে শেয়ার করবেন না!" }, - "rinkeby": { - "message": "রিঙ্কেবি টেস্ট নেটওয়ার্ক" - }, - "ropsten": { - "message": "রোপস্টেন টেস্ট নেটওয়ার্ক" - }, "rpcUrl": { "message": "নতুন RPC URL" }, @@ -810,9 +774,6 @@ "seedPhraseReq": { "message": "সীড ফ্রেজগুলি 12 শব্দের" }, - "selectAHigherGasFee": { - "message": "আপনার লেনদেনটি প্রক্রিয়াকরণ ত্বরান্বিত করতে একটি উচ্চতর গ্যাস ফী নির্বাচন করুন।*" - }, "selectAnAccount": { "message": "একটি অ্যাকাউন্ট নির্বাচন করুন" }, @@ -831,9 +792,6 @@ "send": { "message": "পাঠান" }, - "sendAmount": { - "message": "পাঠানো অর্থরাশি" - }, "sendTokens": { "message": "টোকেনগুলি পাঠান" }, @@ -876,9 +834,6 @@ "signed": { "message": "স্বাক্ষরিত" }, - "slow": { - "message": "মন্থর" - }, "somethingWentWrong": { "message": "ওহো! কিছু সমস্যা হয়েছে।" }, diff --git a/app/_locales/ca/messages.json b/app/_locales/ca/messages.json index 3bdaf93ba630..1c3c0f0557dd 100644 --- a/app/_locales/ca/messages.json +++ b/app/_locales/ca/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Informació" }, - "acceleratingATransaction": { - "message": "* Accelerar una transacció utilitzant un preu de gas més alt augmenta les possibilitats de ser processat més ràpidament per la xarxa, però no sempre es pot garantir." - }, "accessingYourCamera": { "message": "Accedint a la teva càmera..." }, @@ -190,18 +187,9 @@ "connectingToGoerli": { "message": "Connectant a Xarxa de Prova Goerli" }, - "connectingToKovan": { - "message": "Conectant a la xarxa de Kovan Test" - }, "connectingToMainnet": { "message": "Connectant a Xarxa Principal Ethereum" }, - "connectingToRinkeby": { - "message": "Connectant a la Xarxa de Prova Rinkeby" - }, - "connectingToRopsten": { - "message": "Connectant a la xarxa de test Ropsten" - }, "continueToWyre": { "message": "Continua a Wyre" }, @@ -247,12 +235,6 @@ "custom": { "message": "Configuració avançada" }, - "customGas": { - "message": "Customitza el gas" - }, - "customGasSubTitle": { - "message": "Augmentar la tarifa pot disminuir els temps de processament, però això no està garantit." - }, "customToken": { "message": "Fitxa a Mida" }, @@ -337,9 +319,6 @@ "enterPasswordContinue": { "message": "Introdueix la contrasenya per continuar" }, - "estimatedProcessingTimes": { - "message": "Temps de processament estimats" - }, "ethereumPublicAddress": { "message": "Adreça Pública d'Ethereum" }, @@ -490,9 +469,6 @@ "knownAddressRecipient": { "message": "Adreça de contracte coneguda" }, - "kovan": { - "message": "Xarxa de Prova Kovan" - }, "learnMore": { "message": "Saber més" }, @@ -588,12 +564,6 @@ "newToMetaMask": { "message": "Nou a MetaMask?" }, - "newTotal": { - "message": "Nou total" - }, - "newTransactionFee": { - "message": "Nova Tarifa de Transacció" - }, "next": { "message": "Següent" }, @@ -746,12 +716,6 @@ "revealSeedWordsWarningTitle": { "message": "NO comparteixis aquesta frase amb ningú!" }, - "rinkeby": { - "message": "Xarxa del test Rinkeby" - }, - "ropsten": { - "message": "Xarxa de Prova Ropsten" - }, "rpcUrl": { "message": "Nova URL de RPC" }, @@ -788,9 +752,6 @@ "seedPhraseReq": { "message": "Les frases de recuperació tenen 12 paraules" }, - "selectAHigherGasFee": { - "message": "Selecciona un preu de gas més alt per a accelerar el procès de la teva transacció.*" - }, "selectAnAccount": { "message": "Selecciona un Compte" }, @@ -809,9 +770,6 @@ "send": { "message": "Envia" }, - "sendAmount": { - "message": "Enviar Quantitat" - }, "sendTokens": { "message": "Enviar Fitxes" }, @@ -854,9 +812,6 @@ "signed": { "message": "Signat" }, - "slow": { - "message": "Lent" - }, "somethingWentWrong": { "message": "Ui! Alguna cosa ha fallat." }, diff --git a/app/_locales/cs/messages.json b/app/_locales/cs/messages.json index 51ec1eac69d1..35146b89fe4e 100644 --- a/app/_locales/cs/messages.json +++ b/app/_locales/cs/messages.json @@ -63,18 +63,9 @@ "confirmed": { "message": "Potvrzeno" }, - "connectingToKovan": { - "message": "Připojuji se k Kovan Test Network" - }, "connectingToMainnet": { "message": "Připojuji se k Ethereum Mainnet" }, - "connectingToRinkeby": { - "message": "Připojuji se k Rinkeby Test Network" - }, - "connectingToRopsten": { - "message": "Připojuji se k Ropsten Test Network" - }, "contractDeployment": { "message": "Nasazení kontraktu" }, @@ -93,9 +84,6 @@ "createAccount": { "message": "Vytvořit účet" }, - "customGas": { - "message": "Nastavit palivo" - }, "customToken": { "message": "Vlastní token" }, diff --git a/app/_locales/da/messages.json b/app/_locales/da/messages.json index 4b642ef37499..762aab73d1fc 100644 --- a/app/_locales/da/messages.json +++ b/app/_locales/da/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Om" }, - "acceleratingATransaction": { - "message": "* At gøre din transaktion hurtigere ved at bruge en højere Gas-priser, øger dennes chancer for at blive behandlet af netværket hurtigere, men det er ikke altid garanteret." - }, "accessingYourCamera": { "message": "Tilgår din kamera..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Opretter forbindelse til Goerli Testnetværk" }, - "connectingToKovan": { - "message": "Forbinder til Kovan Testnetværk" - }, "connectingToMainnet": { "message": "Forbinder til dit Primære Ethereum Netværk" }, - "connectingToRinkeby": { - "message": "Forbinder til Rinkeby-testnetværk" - }, - "connectingToRopsten": { - "message": "Forbinder til Ropsten-testnetværk" - }, "continueToWyre": { "message": "Fortsæt til Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "Avanceret" }, - "customGas": { - "message": "Tilpas brændstof" - }, - "customGasSubTitle": { - "message": "Forøgelse af gebyr kan mindske bearbejdningstiden, men det er ikke en garanti." - }, "customToken": { "message": "Brugerdefineret Token" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "Indtast adgangskode for at fortsætte" }, - "estimatedProcessingTimes": { - "message": "Estimerede behandlingstider" - }, "ethereumPublicAddress": { "message": "Offentlig Ethereum-adresse" }, @@ -496,9 +475,6 @@ "knownAddressRecipient": { "message": "Kendte kontaktadresser." }, - "kovan": { - "message": "Kovan Test-Netværk" - }, "learnMore": { "message": "Lær mere" }, @@ -588,12 +564,6 @@ "newToMetaMask": { "message": "Ny på MetaMask?" }, - "newTotal": { - "message": "Ny Sum" - }, - "newTransactionFee": { - "message": "Nyt Transaktionsgebyr" - }, "next": { "message": "Næste" }, @@ -749,12 +719,6 @@ "revealSeedWordsWarningTitle": { "message": "DEL IKKE denne sætning med nogen!" }, - "rinkeby": { - "message": "Rinkeby-testnetværk" - }, - "ropsten": { - "message": "Ropsten Test-netværk" - }, "rpcUrl": { "message": "Ny RPC-URL" }, @@ -791,9 +755,6 @@ "seedPhraseReq": { "message": "Backupsætninger er 12 ord lange" }, - "selectAHigherGasFee": { - "message": "Vælg et højere Gas-gebyr, for at gøre behandlingen af din transaktion hurtigere.*" - }, "selectAnAccount": { "message": "Vælg en Konto" }, @@ -809,9 +770,6 @@ "selectType": { "message": "Vælg type" }, - "sendAmount": { - "message": "Send Beløb" - }, "sendTokens": { "message": "Send tokens" }, @@ -854,9 +812,6 @@ "signed": { "message": "Underskrevet" }, - "slow": { - "message": "Langsom" - }, "somethingWentWrong": { "message": "Ups! Noget gik galt." }, diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index 2f6199786021..42aa54bfd0d6 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -44,12 +44,59 @@ "QRHardwareWalletSteps2Description": { "message": "AirGap Vault & Ngrave (demnächst)" }, + "SIWEAddressInvalid": { + "message": "Die Adresse in der Anmeldeanfrage entspricht nicht der Adresse des Kontos, mit dem Sie sich anmelden." + }, + "SIWEDomainWarningBody": { + "message": "Die Webseite ($1) bittet Sie, sich in der falschen Domain anzumelden. Dies könnte ein Phishing-Angriff sein.", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "Chain-ID:" + }, + "SIWELabelExpirationTime": { + "message": "Gültig bis:" + }, + "SIWELabelIssuedAt": { + "message": "Ausgestellt am:" + }, + "SIWELabelMessage": { + "message": "Nachricht:" + }, + "SIWELabelNonce": { + "message": "Nonce:" + }, + "SIWELabelNotBefore": { + "message": "Nicht vor:" + }, + "SIWELabelRequestID": { + "message": "Anfrage-ID:" + }, + "SIWELabelResources": { + "message": "Ressourcen: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "Version:" + }, + "SIWESiteRequestSubtitle": { + "message": "Diese Seite bittet Sie, sich anzumelden mit" + }, + "SIWESiteRequestTitle": { + "message": "Anmeldeanfrage" + }, + "SIWEWarningSubtitle": { + "message": "Um zu bestätigen, dass Sie alles verstanden haben, markieren Sie:" + }, + "SIWEWarningTitle": { + "message": "Sind Sie sicher?" + }, "about": { "message": "Über" }, - "acceleratingATransaction": { - "message": "* Die Beschleunigung einer Transaktion durch die Verwendung eines höheren Gaspreises erhöht die Chancen einer schnelleren Verarbeitung durch das Netz, wofür es allerdings keine Garantie gibt." - }, "acceptTermsOfUse": { "message": "Ich habe die $1 gelesen und stimme ihnen zu", "description": "$1 is the `terms` message" @@ -82,7 +129,7 @@ "message": "Konto-Identicon" }, "accountName": { - "message": "Accountname" + "message": "Kontoname" }, "accountNameDuplicate": { "message": "Dieser Kontoname existiert bereits", @@ -121,6 +168,9 @@ "addAlias": { "message": "Alias hinzufügen" }, + "addBlockExplorer": { + "message": "Einen Block-Explorer hinzufügen" + }, "addContact": { "message": "Kontakt hinzufügen" }, @@ -209,9 +259,6 @@ "airgapVault": { "message": "AirGap-Tresor" }, - "airgapVaultTutorial": { - "message": " (Tutorials)" - }, "alertDisableTooltip": { "message": "Dies kann in \"Einstellungen > Warnungen\" geändert werden" }, @@ -230,6 +277,10 @@ "alerts": { "message": "Warnungen" }, + "allOfYour": { + "message": "Alle Ihre $1", + "description": "$1 is the symbol or name of the token that the user is approving spending" + }, "allowExternalExtensionTo": { "message": "Erlauben dieser externen Erweiterung auf:" }, @@ -266,9 +317,16 @@ "approve": { "message": "Genehmigen" }, + "approveAllTokensTitle": { + "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" }, @@ -285,6 +343,10 @@ "approvedAsset": { "message": "Genehmigtes Asset" }, + "approvedOn": { + "message": "Genehmigt am $1", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "Sind Sie sicher?" }, @@ -297,6 +359,9 @@ "assets": { "message": "Vermögenswerte" }, + "attemptSendingAssets": { + "message": "Wenn Sie versuchen, Assets direkt von einem Netzwerk in ein anderes zu senden, kann dies zu einem dauerhaften Asset-Verlust führen. Verwenden Sie unbedingt eine Bridge." + }, "attemptToCancel": { "message": "Stornierung versuchen?" }, @@ -313,7 +378,7 @@ "message": "Sie haben die folgenden Berechtigungen autorisiert" }, "autoLockTimeLimit": { - "message": "Auto-Logout-Timer (Minuten)" + "message": "Auto-Lock-Timer (Minuten)" }, "autoLockTimeLimitDescription": { "message": "Stellen Sie die Ruhezeit in Minuten ein, nach der sich MetaMask automatisch ausloggen soll" @@ -327,6 +392,9 @@ "backToAll": { "message": "Zurück zur Übersicht" }, + "backup": { + "message": "Datensicherung" + }, "backupApprovalInfo": { "message": "Dieser geheime Code ist zum Wiedererlangen Ihres Wallets erforderlich, falls Sie Ihr Gerät verlieren, Ihr Passwort vergessen, MetaMask neu installieren müssen oder auf einem anderen Gerät auf Ihr Wallet zugreifen möchten." }, @@ -336,6 +404,12 @@ "backupNow": { "message": "Jetzt sichern" }, + "backupUserData": { + "message": "Sichern Sie Ihre Daten" + }, + "backupUserDataDescription": { + "message": "Sie können Benutzereinstellungen, die Präferenzen und Kontoadressen enthalten, in einer JSON-Datei sichern." + }, "balance": { "message": "Guthaben:" }, @@ -348,6 +422,9 @@ "basic": { "message": "Grundlegend" }, + "beCareful": { + "message": "Sein Sie vorsichtig" + }, "betaMetamaskDescription": { "message": "MetaMask ist eine sichere Wallet, welche die Welt von web3 für alle zugänglich macht." }, @@ -364,6 +441,9 @@ "betaMetamaskVersion": { "message": "MetaMask-Version" }, + "betaPortfolioSite": { + "message": "Beta-Portfolio-Seite" + }, "betaWelcome": { "message": "Willkommen bei MetaMask Beta" }, @@ -412,7 +492,7 @@ "description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase" }, "buyCryptoWithCoinbasePay": { - "message": "$1 mit Coinbase Pay kaufen", + "message": "1 $ mit Coinbase Pay kaufen", "description": "$1 represents the crypto symbol to be purchased" }, "buyCryptoWithCoinbasePayDescription": { @@ -467,7 +547,7 @@ "description": "$1 is string 'cancel' or 'speed up'" }, "cancelSwapForFee": { - "message": "Tausch für $1 abbrechen", + "message": "Tausch für ~$1 abbrechen", "description": "$1 could be e.g. $2.98, it is a cost for cancelling a Smart Transaction" }, "cancelSwapForFree": { @@ -499,6 +579,9 @@ "message": "Klicken Sie hier, um Ihren Ledger über WebHID zu verbinden", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "Klicken Sie hier, um die Token manuell hinzuzufügen." + }, "clickToRevealSeed": { "message": "Hier klicken, um Geheimwörter zu enthüllen" }, @@ -515,6 +598,16 @@ "confirm": { "message": "Bestätigen" }, + "confirmPageDialogSetApprovalForAll": { + "message": "Sie gewähren den Zugriff auf $1, auch auf solche, die Sie in Zukunft besitzen könnten. Die Gegenseite kann jederzeit NFTs aus Ihrer Brieftasche übertragen, ohne Sie zu fragen, bis Sie diese Genehmigung widerrufen. $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "alle NFTs in diesem Contract" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "Seien Sie vorsichtig." + }, "confirmPassword": { "message": "Passwort bestätigen" }, @@ -606,19 +699,13 @@ "message": "Verbindung mit $1 wird hergestellt" }, "connectingToGoerli": { - "message": "Verbindung mit Goerli Test Network wird hergestellt" - }, - "connectingToKovan": { - "message": " Verbinde zum Kovan Testnetzwerk" + "message": "Verbindungsaufbau zum Goerli-Testnetzwerk" }, "connectingToMainnet": { "message": "Verbinde zum Ethereum Mainnet" }, - "connectingToRinkeby": { - "message": " Verbinde zum Rinkeby Testnetzwerk" - }, - "connectingToRopsten": { - "message": " Verbinde zum Ropsten Testnetzwerk" + "connectingToSepolia": { + "message": "Verbindungsaufbau zum Sepolia-Testnetzwerk" }, "contactUs": { "message": "Kontaktaufnahme" @@ -651,11 +738,23 @@ "message": "Sie senden Token an die Vertragsadresse des Tokens. Dies kann zum Verlust dieser Token führen." }, "contractDeployment": { - "message": "Smart Contract Ausführung" + "message": "Vertragsausführung" + }, + "contractDescription": { + "message": "Nehmen Sie sich einen Moment Zeit, um die Contract-Details zu überprüfen und sich so vor Betrügern zu schützen." }, "contractInteraction": { "message": "Vertragsinteraktion" }, + "contractRequestingSpendingCap": { + "message": "Contract fordert eine Ausgabenobergrenze" + }, + "contractTitle": { + "message": "Contract-Details" + }, + "contractToken": { + "message": "Token-Contract" + }, "convertTokenToNFTDescription": { "message": "Wir haben festgestellt, dass dieses Asset eine NFT ist. MetaMask hat jetzt volle native Unterstützung für NFTs. Möchten Sie es aus Ihrer Tokenliste entfernen und als NFT hinzufügen?" }, @@ -684,10 +783,10 @@ "message": "Erstellen" }, "createAWallet": { - "message": "Eine Wallet erstellen" + "message": "Ein Wallet erstellen" }, "createAccount": { - "message": "Account erstellen" + "message": "Konto erstellen" }, "createNewWallet": { "message": "Eine neue Wallet erstellen" @@ -734,21 +833,18 @@ "customContentSearch": { "message": "Suche nach einem zuvor hinzugefügten Netzwerk" }, - "customGas": { - "message": "Gas anpassen" - }, "customGasSettingToolTipMessage": { "message": "$1 verwenden, um den Gaspreis anzupassen. Das kann verwirrend sein, wenn Sie damit nicht vertraut sind. Interaktion auf eigene Gefahr.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "Höhere Gebühren können Bearbeitungszeiten verkürzen, wofür es allerdings keine Garantie gibt." - }, "customSpendLimit": { "message": "Benutzerdefiniertes Ausgabelimit" }, + "customSpendingCap": { + "message": "Benutzerdefinierte Ausgabenobergrenze" + }, "customToken": { - "message": "Custom-Token" + "message": "Benutzerdefiniertes Token" }, "customTokenWarningInNonTokenDetectionNetwork": { "message": "Die Token-Erkennung ist in diesem Netzwerk noch nicht verfügbar. Bitte importieren Sie das Token manuell und stellen Sie sicher, dass Sie ihm vertrauen. Erfahren Sie mehr über $1" @@ -756,6 +852,9 @@ "customTokenWarningInTokenDetectionNetwork": { "message": "Vergewissern Sie sich vor dem manuellen Importieren eines Tokens, dass Sie ihm vertrauen. Erfahren Sie mehr über $1." }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "Stellen Sie sicher, dass Sie einem Token vertrauen, bevor Sie es importieren. Erfahren Sie, wie Sie 1$ vermeiden und die Token-Erkennung $2 aktivieren können." + }, "customerSupport": { "message": "Kundensupport" }, @@ -779,8 +878,8 @@ "data": { "message": "Daten" }, - "dataBackupFoundInfo": { - "message": "Einige Ihrer Kontodaten wurden während einer früheren MetaMask-Installation gesichert. Dies könnte Ihre Einstellungen, Kontakte und Token umfassen. Möchten Sie diese Daten jetzt wiederherstellen?" + "dataBackupSeemsCorrupt": { + "message": "Ihre Daten konnten nicht wiederhergestellt werden. Die Datei scheint beschädigt zu sein." }, "dataHex": { "message": "Hexadezimal" @@ -827,6 +926,12 @@ "message": "$1 einzahlen", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "Mehr erfahren" + }, + "deprecatedTestNetworksMsg": { + "message": "Aufgrund der Protokolländerungen von Ethereum: Die Testnetzwerke Rinkeby, Ropsten und Kovan funktionieren möglicherweise nicht mehr so zuverlässig und werden bald veraltet sein." + }, "description": { "message": "Beschreibung" }, @@ -1086,7 +1191,7 @@ "message": "Vorsicht vor Phishing! MetaMask fragt Sie niemals spontan nach Ihrer mnemonischen Phrase." }, "endOfFlowMessage6": { - "message": "Wenn Sie Ihre mnemonische Phrase erneut sicherstellen müssen, finden Sie sie unter Einstellungen -> Sicherheit." + "message": "Wenn Sie Ihre geheime Wiederherstellungsphrase erneut sichern müssen, finden Sie sie unter Einstellungen > Sicherheit." }, "endOfFlowMessage7": { "message": "Wenn Sie jemals Fragen haben oder etwas Auffälliges sehen, wenden Sie sich an unseren Support $1.", @@ -1102,6 +1207,15 @@ "message": "Die von Ihnen eingegebene RPC-URL hat eine andere Chain-ID ($1) zurückgegeben. Bitte aktualisieren Sie die Chain-ID, damit sie mit der RPC-URL des Netzwerks übereinstimmt, das Sie hinzufügen möchten.", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "Erweiterte Token-Erkennung" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "Erweiterte Token-Erkennung ist derzeit über $1 verfügbar. $2" + }, + "enhancedTokenDetectionDescription": { + "message": "Die Token-API von ConsenSys aggregiert eine Liste von Token aus verschiedenen Tokenlisten von Drittanbietern. Wenn diese Option aktiviert ist, werden die Token automatisch erkannt und es kann im Ethereum-Mainnet sowie in Binance, Polygon und Avalanche danach gesucht werden. Ist sie deaktiviert, können die automatische Token-Erkennung und -Suche nur im Ethereum-Mainnet verwendet werden." + }, "ensIllegalCharacter": { "message": "Unzulässiges Zeichen für ENS." }, @@ -1115,7 +1229,7 @@ "message": "Fehler bei der ENS-Namensregistrierung" }, "ensUnknownError": { - "message": "ENS Lookup fehlgeschlagen." + "message": "ENS-Lookup fehlgeschlagen." }, "enterMaxSpendLimit": { "message": "Max. Ausgabelimit eingeben" @@ -1158,9 +1272,6 @@ "message": "Stapel:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Geschätzte Bearbeitungszeiten" - }, "ethGasPriceFetchWarning": { "message": "Der Gaspreis, der sich aus der Gaseinschätzung ergibt, ist derzeit nicht verfügbar." }, @@ -1206,9 +1317,6 @@ "fast": { "message": "Schnell" }, - "fastest": { - "message": "Schnellste" - }, "feeAssociatedRequest": { "message": "Mit dieser Anfrage ist eine Gebühr verbunden." }, @@ -1281,6 +1389,9 @@ "functionApprove": { "message": "Funktion: Freigabe" }, + "functionSetApprovalForAll": { + "message": "Funktion: ErlaubnisFürAlle" + }, "functionType": { "message": "Funktionstyp" }, @@ -1498,7 +1609,7 @@ "message": "Ein Konto mit einem Seed-Schlüssel importieren" }, "importMyWallet": { - "message": "Meine Wallet importieren" + "message": "Mein Wallet importieren" }, "importNFT": { "message": "NFT importieren" @@ -1515,6 +1626,12 @@ "importNFTs": { "message": "NFTs importieren" }, + "importSelectedTokens": { + "message": "Ausgewählte Token importieren?" + }, + "importSelectedTokensDescription": { + "message": "Es werden nur die von Ihnen ausgewählten Token in Ihrem Wallet angezeigt. Sie können versteckte Token später jederzeit hinzufügen, indem Sie nach ihnen suchen." + }, "importTokenQuestion": { "message": "Token importieren?" }, @@ -1541,6 +1658,9 @@ "message": "Importiert", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "in Ihren Einstellungen" + }, "infuraBlockedNotification": { "message": "MetaMask kann sich nicht mit dem Blockchain Host verbinden. Überprüfen Sie mögliche Gründe $1.", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1548,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "Ihre erste Transaktion wurde vom Netzwerk bestätigt. Klicken Sie auf Okay, um zurückzukehren." }, + "install": { + "message": "Installieren," + }, "insufficientBalance": { "message": "Guthaben reicht nicht aus." }, @@ -1621,6 +1744,9 @@ "invalidSeedPhrase": { "message": "Ungültiger Seedschlüssel" }, + "invalidSeedPhraseCaseSensitive": { + "message": "Ungültige Eingabe! Die geheime Wiederherstellungsphrase berücksichtigt Groß- und Kleinschreibung." + }, "ipfsGateway": { "message": "IPFS-Gateway" }, @@ -1640,27 +1766,21 @@ "message": "JSON Datei", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "um ihre Token und NFTs über Konten und Netzwerke hinweg im Auge behalten zu können." + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Tutorials)" - }, "knownAddressRecipient": { "message": "Bekannte Vertragsadresse." }, "knownTokenWarning": { "message": "Mit dieser Aktion werden Token bearbeitet, die bereits in Ihrer Wallet aufgelistet sind und die dazu verwendet werden können, Sie zu betrügen. Genehmigen Sie diese Aktion nur, wenn Sie sicher sind, dass Sie den Wert dieser Token ändern wollen. Erfahren Sie mehr über $1" }, - "kovan": { - "message": "Kovan Testnetzwerk" - }, "lastConnected": { "message": "Zuletzt verbunden" }, - "learmMoreAboutGas": { - "message": "Wollen Sie $1 über Gas?" - }, "learnCancelSpeeedup": { "message": "Erfahren Sie, wie Sie $1", "description": "$1 is link to cancel or speed up transactions" @@ -1668,6 +1788,10 @@ "learnMore": { "message": "Mehr erfahren" }, + "learnMoreAboutGas": { + "message": "Wollen Sie $1 über Gas?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Mehr erfahren" }, @@ -1729,7 +1853,7 @@ "message": "Richtungspfeil" }, "lightTheme": { - "message": "Leicht" + "message": "Hell" }, "likeToImportTokens": { "message": "Möchtest du diese Token hinzufügen?" @@ -1750,7 +1874,7 @@ "message": "NFTs werden geladen ..." }, "loadingTokens": { - "message": "Token laden..." + "message": "Token laden ..." }, "localhost": { "message": "Localhost 8545" @@ -1854,24 +1978,24 @@ "description": "This string is localized separately from some of the commitments so that we can bold it" }, "metametricsCommitmentsIntro": { - "message": "MetaMaske wird.." + "message": "MetaMask wird.." }, "metametricsCommitmentsNeverCollect": { "message": "Erfassen Sie niemals Schlüssel, Adressen, Transaktionen, Salden, Hashes oder persönliche Informationen" }, "metametricsCommitmentsNeverCollectIP": { - "message": "$1 Ihre vollständige IP-Adresse erfassen", + "message": "$1 Erfassen Sie Ihre vollständige IP-Adresse", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, "metametricsCommitmentsNeverCollectKeysEtc": { - "message": "$1 Schlüssel, Adressen, Transaktionen, Salden, Hashes oder persönliche Informationen erfassen", + "message": "$ erfassen Sie Schlüssel, Adressen, Transaktionen, Salden, Hashes oder persönliche Informationen", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, "metametricsCommitmentsNeverIP": { - "message": "Nie Ihre vollständige IP-Adresse erfassen" + "message": "Erfassen Sie nie Ihre vollständige IP-Adresse" }, "metametricsCommitmentsNeverSell": { - "message": "Nie Daten mit Gewinnabsicht verkaufen. Niemals!" + "message": "Verkaufen Sie niemals Daten mit Gewinnabsicht. Niemals!" }, "metametricsCommitmentsNeverSellDataForProfit": { "message": "$1 Daten für Gewinn verkaufen. Niemals!", @@ -1896,6 +2020,19 @@ "message": "die Netzwerkdetails überprüfen", "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." }, + "mismatchedChainRecommendation": { + "message": "Wir empfehlen, dass Sie vor dem Fortfahren $1.", + "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key. The link will open to instructions for users to validate custom network details." + }, + "mismatchedNetworkName": { + "message": "Laut unseren Aufzeichnungen stimmt dieser Netzwerkname nicht mit dieser Chain-ID überein." + }, + "mismatchedNetworkSymbol": { + "message": "Das angegebene Währungssymbol entspricht nicht dem Symbol, das wir für diese Chain-ID erwarten." + }, + "mismatchedRpcUrl": { + "message": "Laut unseren Aufzeichnungen stimmt der angegebene RPC-URL-Wert nicht mit einem bekannten Provider für diese Chain-ID überein." + }, "missingNFT": { "message": "Sie sehen Ihr NFT nicht?" }, @@ -1915,11 +2052,15 @@ "message": "Du musst mindestens 1 Token auswählen." }, "myAccounts": { - "message": "Meine Accounts" + "message": "Meine Konten" }, "name": { "message": "Name" }, + "nativeToken": { + "message": "Das native Token dieses Netzwerks ist $1. Dieses Token wird für die Gasgebühr verwendet.", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "Um mit dezentralen Anwendungen zu interagieren, die MetaMask verwenden, benötigen Sie $1 in Ihrer Wallet.", "description": "$1 represents the cypto symbol to be purchased" @@ -1971,6 +2112,9 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -1978,7 +2122,7 @@ "message": "Testnet" }, "networkSettingsChainIdDescription": { - "message": "Die Chain-ID wird zur Unterzeichnung von Transaktionen verwendet. Sie muss mit der vom Netzwerk zurückgegebenen Ketten-ID übereinstimmen. Sie können eine Dezimalzahl oder '0x'-prefix Hexadezimalzahl eingeben, aber wir werden die Zahl dezimal anzeigen." + "message": "Die Ketten-ID wird zur Unterzeichnung von Transaktionen verwendet. Sie muss mit der vom Netzwerk zurückgegebenen Ketten-ID übereinstimmen. Sie können eine Dezimalzahl oder '0x'-prefix Hexadezimalzahl eingeben, aber wir werden die Zahl dezimal anzeigen." }, "networkStatus": { "message": "Netzwerkstatus" @@ -2006,8 +2150,11 @@ "nevermind": { "message": "Schon gut" }, + "new": { + "message": "Neu!" + }, "newAccount": { - "message": "Neuer Account" + "message": "Neues Konto" }, "newAccountDetectedDialogMessage": { "message": "Neue Adresse erkannt! Klicken Sie hier, um sie zu Ihrem Adressbuch hinzuzufügen." @@ -2023,7 +2170,7 @@ "message": "Neuer Kontakt" }, "newContract": { - "message": "Neuer Smart Contract" + "message": "Neuer Contract" }, "newNFTDetectedMessage": { "message": "Erlauben Sie MetaMask, automatisch NFTs von Opensea zu erkennen und in Ihrem Wallet anzuzeigen." @@ -2047,12 +2194,6 @@ "newTokensImportedTitle": { "message": "Token importiert" }, - "newTotal": { - "message": "Neue Summe" - }, - "newTransactionFee": { - "message": "Neue Transaktionsgebühr" - }, "newValues": { "message": "neue Werte" }, @@ -2166,6 +2307,33 @@ "notifications12Title": { "message": "Wann Dunkelmodus? Jetzt Dunkelmodus! 🕶️🦊" }, + "notifications13ActionText": { + "message": "Benutzerdefinierte Netzwerkliste anzeigen" + }, + "notifications13Description": { + "message": "Sie können die folgenden beliebten benutzerdefinierten Netzwerke jetzt einfach hinzufügen: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm und Polygon! Gehen Sie zu „Einstellungen“ -> „Experimentell“ und schalten Sie „Benutzerdefinierte Netzwerkliste anzeigen“ ein, um diese Funktion zu aktivieren.", + "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." + }, + "notifications13Title": { + "message": "Beliebte Netzwerke hinzufügen" + }, + "notifications14ActionText": { + "message": "Backup-Einstellungen anzeigen" + }, + "notifications14Description": { + "message": "Wir markieren unsere 3Box-Datenfunktion Anfang Oktober als veraltet. Um Ihr Wallet manuell zu sichern und wiederherzustellen, verwenden Sie die Schaltfläche „Jetzt sichern“ in den erweiterten Einstellungen.", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "3Box Abschreibung" + }, + "notifications15Description": { + "message": "Sie müssen nichts tun – verwenden Sie Ihr Wallet also wie gewohnt. Achten Sie auf mögliche Betrugsversuche bezüglich des Merge.", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "Ethereum Merge ist da!" + }, "notifications1Description": { "message": "Mobile MetaMask-Anwender können jetzt Token in ihren mobilen Wallets swappen. Scannen Sie den QR-Code, um die mobile App zu erhalten und mit dem Swapping zu beginnen.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2179,7 +2347,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": { @@ -2268,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "Alle als gelesen markieren" }, + "numberOfNewTokensDetectedPlural": { + "message": "$1 neue Token in diesem Konto gefunden", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "1 neues Token in diesem Konto gefunden" + }, "ofTextNofM": { "message": "von" }, @@ -2347,6 +2522,9 @@ "message": "Öffnen Sie MetaMask im Vollbildmodus, um Ihren Ledger über WebHID zu verbinden.", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "Im Block-Explorer öffnen" + }, "optional": { "message": "Optional" }, @@ -2419,6 +2597,12 @@ "permissionRequestCapitalized": { "message": "Berechtigungsanfrage" }, + "permissionRequested": { + "message": "Jetzt angefragt" + }, + "permissionRevoked": { + "message": "In diesem Update entzogen" + }, "permission_accessNetwork": { "message": "Zugriff auf das Internet.", "description": "The description of the `endowment:network-access` permission." @@ -2439,9 +2623,13 @@ "message": "Für unbestimmte Zeit ausführen.", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "Verwalten Sie Ihre Konten und Vermögenswerte unter $1 ($2).", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "Verwalten Sie Ihre „$1“-Konten und Vermögenswerte.", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "Ihre Saten speichern und auf Ihrem Gerät verwalten.", @@ -2451,10 +2639,18 @@ "message": "Benachrichtigungen anzeigen.", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "Transaktions-Einsichten abrufen und anzeigen.", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "Unbekannte Berechtigung: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "Öffentlichen Key für $1 ($2) anzeigen.", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "Berechtigungen" }, @@ -2471,6 +2667,9 @@ "popularCustomNetworks": { "message": "Beliebte benutzerdefinierte Netzwerke" }, + "portfolioSite": { + "message": "Portfolio-Seite" + }, "preferredLedgerConnectionType": { "message": "Bevorzugter Ledger-Verbindungstyp", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" @@ -2628,7 +2827,7 @@ "message": "Zurücksetzen" }, "resetAccount": { - "message": "Account zurücksetzen" + "message": "Konto zurücksetzen" }, "resetAccountDescription": { "message": "Durch das Zurücksetzen Ihres Kontos wird Ihr Transaktionsverlauf gelöscht." @@ -2651,9 +2850,17 @@ "restore": { "message": "Wiederherstellen" }, - "restoreWalletPreferences": { - "message": "$1 hat ein Backup Ihrer Daten gefunden. Möchten Sie die Präferenzen Ihrer Wallet wiederherstellen?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "Wiederherstellung Ihrer Daten aus der bereitgestellten Datei nicht möglich" + }, + "restoreSuccessful": { + "message": "Ihre Daten wurden erfolgreich wiederhergestellt." + }, + "restoreUserData": { + "message": "Benutzerdaten wiederherstellen" + }, + "restoreUserDataDescription": { + "message": "Sie können die Benutzereinstellungen, die bevorzugte Einstellungen und Kontoadressen umfassen, aus einer vormals gesicherten JSON-Datei wiederherstellen." }, "retryTransaction": { "message": "Transaktion wiederholen" @@ -2676,11 +2883,16 @@ "revealTheSeedPhrase": { "message": "Seed-Phrase anzeigen" }, - "rinkeby": { - "message": "Rinkeby Testnetzwerk" + "revokeAllTokensTitle": { + "message": "Erlaubnis zum Zugriff auf alle Ihre $1 entziehen?", + "description": "$1 is the symbol of the token for which the user is revoking approval" }, - "ropsten": { - "message": "Ropsten Testnetzwerk" + "revokeApproveForAllDescription": { + "message": "Wenn Sie diese Erlaubnis entziehen, wird folgende/s/r $1 nicht mehr dazu in der Lage sein, auf Ihr/e/n $2 zuzugreifen.", + "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" + }, + "revokeSpendingCapTooltipText": { + "message": "Mit diesem Contract können Sie keine weiteren Ihrer aktuellen oder zukünftigen Token ausgeben." }, "rpcUrl": { "message": "Neue RPC-URL" @@ -2793,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "Schreiben Sie Ihre geheime Sicherungsphrase auf" }, - "selectAHigherGasFee": { - "message": "Wählen Sie eine höhere Gasgebühr, um die Abwicklung Ihrer Transaktion zu beschleunigen.*" - }, "selectAccounts": { "message": "Wählen Sie das Konto/die Konten aus, um sie auf dieser Seite zu verwenden" }, @@ -2829,9 +3038,6 @@ "send": { "message": "Senden" }, - "sendAmount": { - "message": "Betrag senden" - }, "sendBugReport": { "message": "Übermitteln Sie uns einen Fehlerbericht." }, @@ -2852,12 +3058,26 @@ "message": "$1 senden", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, + "sendingToTokenContractWarning": { + "message": "Warnhinweis: Sie sind im Begriff, an einen Token-Contract zu senden, und dies könnte zu einem Verlust Ihres Guthabens führen. $1", + "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" + }, + "sepolia": { + "message": "Sepolia-Testnetzwerk" + }, "setAdvancedPrivacySettings": { "message": "Erweiterte Privatsphäre-Einstellungen festlegen" }, "setAdvancedPrivacySettingsDetails": { "message": "MetaMask nutzt diese vertrauenswürdigen Dienstleistungen von Drittanbietern, um die Benutzerfreundlichkeit und Sicherheit der Produkte zu verbessern." }, + "setApprovalForAll": { + "message": "Erlaubnis für alle erteilen" + }, + "setApprovalForAllTitle": { + "message": "$1 ohne Ausgabenlimit genehmigen", + "description": "The token symbol that is being approved" + }, "settings": { "message": "Einstellungen" }, @@ -2877,12 +3097,6 @@ "showAdvancedGasInlineDescription": { "message": "Wählen Sie dies aus, um den Gaspreis und die Limitkontrollen direkt auf den Senden- und Bestätigen-Bildschirmen anzuzeigen." }, - "showCustomNetworkList": { - "message": "Benutzerdefinierte Netzwerkliste anzeigen" - }, - "showCustomNetworkListDescription": { - "message": "Diese Option zeigt eine Liste von Netzwerken mit vorausgefüllten Details an, sobald ein neues Netzwerk hinzugefügt wird." - }, "showFiatConversionInTestnets": { "message": "Umwandlung auf Testnets anzeigen" }, @@ -2937,6 +3151,9 @@ "signed": { "message": "Unterschrieben" }, + "signin": { + "message": "Anmelden" + }, "simulationErrorMessageV2": { "message": "Wir konnten das Gas nicht schätzen. Es könnte einen Fehler im Vertrag geben und diese Transaktion könnte fehlschlagen." }, @@ -2949,9 +3166,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." }, - "slow": { - "message": "Langsam" - }, "smartTransaction": { "message": "Intelligente Transaktionen" }, @@ -2963,6 +3177,10 @@ "message": "Am $1 von $2 hinzugefügt", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "Snap-Fehler: '$1'. Fehler-Code: '$2'", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -2971,14 +3189,34 @@ "message": "Snap installieren" }, "snapInstallWarningCheck": { - "message": "Um zu bestätigen, dass Sie alles verstanden haben, kreuzen Sie alles an." + "message": "Um zu bestätigen, dass Sie das verstanden haben, markieren Sie das Kästchen." + }, + "snapInstallWarningCheckPlural": { + "message": "Um zu bestätigen, dass Sie alles verstanden haben, markieren Sie alle Kästchen." + }, + "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.", + "description": "The first parameter is the name of the snap and the second one is the protocol" }, "snapRequestsPermission": { "message": "Für diesen Snap werden die folgenden Berechtigungen beantragt:" }, + "snapUpdate": { + "message": "Snap aktualisieren" + }, + "snapUpdateExplanation": { + "message": "$1 benötigt eine neuere Version Ihres Snaps.", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "Snaps" }, + "snapsInsightLoading": { + "message": "Transaktions-Einsicht wird geladen ..." + }, + "snapsNoInsight": { + "message": "Der Snap brachte keine Einsicht" + }, "snapsSettingsDescription": { "message": "Verwalten Sie Ihre Snaps" }, @@ -3068,7 +3306,7 @@ "message": "Fehler beim Abfragen der Statelogs." }, "stateLogFileName": { - "message": "MetaMask Statusprotokolle" + "message": "MetaMask-Statusprotokolle" }, "stateLogs": { "message": "Statelogs" @@ -3225,7 +3463,7 @@ "message": "Support" }, "supportCenter": { - "message": "Gehe zu unserem Support Center" + "message": "Besuchen Sie unser Support Center" }, "swap": { "message": "Swap" @@ -3423,6 +3661,9 @@ "swapReviewSwap": { "message": "Swap überprüfen" }, + "swapSearchNameOrAddress": { + "message": "Namen suchen oder Adresse einfügen" + }, "swapSelect": { "message": "Auswählen" }, @@ -3442,6 +3683,9 @@ "message": "$1%", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "Wenn sich der Kurs zwischen der Aufgabe Ihrer Bestellung und der Bestätigung ändert, nennt man das „Slippage”. Ihr Swap wird automatisch storniert, wenn die Abweichung die von Ihnen eingestellte „Abweichungstoleranz” überschreitet." + }, "swapSource": { "message": "Liquiditätsquelle" }, @@ -3551,6 +3795,9 @@ "switchToThisAccount": { "message": "Zu diesem Konto wechseln" }, + "switchedTo": { + "message": "Sie haben gewechselt zu" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "Das Wechseln der Netzwerke wird alle ausstehenden Bestätigungen abbrechen" }, @@ -3587,15 +3834,6 @@ "syncWithMobileTitle": { "message": "Mit Mobilgerät synchronisieren" }, - "syncWithThreeBox": { - "message": "Daten mit 3Box synchronisieren (experimentell)" - }, - "syncWithThreeBoxDescription": { - "message": "Aktivieren Sie, um Ihre Einstellungen mit 3Box zu sichern. Diese Funktion ist derzeit experimentell; verwenden Sie diese auf eigene Gefahr." - }, - "syncWithThreeBoxDisabled": { - "message": "3Box wurde aufgrund eines Fehlers während der ersten Synchronisation deaktiviert" - }, "tenPercentIncreased": { "message": "10% Erhöhung" }, @@ -3617,6 +3855,9 @@ "themeDescription": { "message": "Wählen Sie Ihr bevorzugtes MetaMask-Motiv aus." }, + "thingsToKeep": { + "message": "Was Sie beachten sollten:" + }, "thisWillCreate": { "message": "Hierdurch werden ein neues Wallet und eine mnemonische Phrase erzeugt" }, @@ -3658,12 +3899,21 @@ "tokenDetails": { "message": "Token-Details" }, + "tokenFoundTitle": { + "message": "1 neues Token gefunden" + }, "tokenId": { "message": "Token-ID" }, "tokenList": { "message": "Token-Listen:" }, + "tokenScamSecurityRisk": { + "message": "Token-Betrügereien und Sicherheitsrisiken" + }, + "tokenShowUp": { + "message": "Ihre Token werden möglicherweise nicht automatisch in Ihrem Wallet angezeigt." + }, "tokenSymbol": { "message": "Tokensymbol" }, @@ -3805,6 +4055,9 @@ "tryAgain": { "message": "Erneut versuchen" }, + "tryOur": { + "message": "Probieren Sie unser" + }, "turnOnTokenDetection": { "message": "Erweiterte Token-Erkennung aktivieren" }, @@ -3858,9 +4111,13 @@ "message": "Das dezentrale Web erwartet Sie" }, "unrecognizedChain": { - "message": "Dieses benutzerdefinierte Netzwerk ist nicht erkannt. Wir empfehlen, dass Sie $1 bevor Sie fortfahren", + "message": "Dieses benutzerdefinierte Netzwerk ist nicht erkannt.", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (unbekanntes Protokoll)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "Verwenden von Sammelbaren (ERC-721) Token wird derzeit nicht unterstützt", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -3914,7 +4171,7 @@ "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" }, "viewAccount": { - "message": " Account einsehen" + "message": " Konto einsehen" }, "viewAllDetails": { "message": "Alle Details anzeigen" @@ -3978,6 +4235,10 @@ "warning": { "message": "Warnung" }, + "warningTooltipText": { + "message": "$1 Der Contract könnte Ihr gesamtes Token-Guthaben ohne weitere Benachrichtigung oder Zustimmung ausgeben. Schützen Sie sich, indem Sie eine niedrigere Ausgabenobergrenze festlegen.", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "Schwach" }, diff --git a/app/_locales/el/messages.json b/app/_locales/el/messages.json index 73f6abd7bded..51ca24c9d469 100644 --- a/app/_locales/el/messages.json +++ b/app/_locales/el/messages.json @@ -42,14 +42,61 @@ "message": "Πορτοφόλι HW βασισμένο σε QR" }, "QRHardwareWalletSteps2Description": { - "message": "AirGap Vault & Ngrave (Έρχεται Σύντομα)" + "message": "Ngrave (Έρχεται Σύντομα)" + }, + "SIWEAddressInvalid": { + "message": "Η διεύθυνση στο αίτημα σύνδεσης δεν ταιριάζει με τη διεύθυνση του λογαριασμού που χρησιμοποιείτε για να συνδεθείτε." + }, + "SIWEDomainWarningBody": { + "message": "Ο ιστότοπος ($1) σάς ζητά να συνδεθείτε σε λάθος τομέα. Μπορεί να πρόκειται για επίθεση ηλεκτρονικού ψαρέματος.", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "Αναγνωριστικό Αλυσίδας:" + }, + "SIWELabelExpirationTime": { + "message": "Λήγει στις:" + }, + "SIWELabelIssuedAt": { + "message": "Εκδόθηκε στις:" + }, + "SIWELabelMessage": { + "message": "Μήνυμα:" + }, + "SIWELabelNonce": { + "message": "Nonce:" + }, + "SIWELabelNotBefore": { + "message": "Όχι πριν από:" + }, + "SIWELabelRequestID": { + "message": "Αναγνωριστικό αιτήματος:" + }, + "SIWELabelResources": { + "message": "Πόροι: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "Έκδοση:" + }, + "SIWESiteRequestSubtitle": { + "message": "Αυτός ο ιστότοπος ζητά να συνδεθεί με" + }, + "SIWESiteRequestTitle": { + "message": "Αίτημα σύνδεσης" + }, + "SIWEWarningSubtitle": { + "message": "Για να επιβεβαιώσετε ότι το καταλαβαίνετε πατήστε:" + }, + "SIWEWarningTitle": { + "message": "Είστε σίγουρος;" }, "about": { "message": "Σχετικά με" }, - "acceleratingATransaction": { - "message": "* Η επιτάχυνση μιας συναλλαγής με τη χρήση υψηλότερης τιμής καυσίμου αυξάνει τις πιθανότητές της για ταχύτερη επεξεργασία από το δίκτυο, αλλά δεν είναι πάντοτε εγγυημένη." - }, "acceptTermsOfUse": { "message": "Έχω διαβάσει και συμφωνώ με το $1", "description": "$1 is the `terms` message" @@ -121,6 +168,9 @@ "addAlias": { "message": "Προσθήκη ψευδωνύμου" }, + "addBlockExplorer": { + "message": "Προσθέστε έναν εξερευνητή μπλοκ" + }, "addContact": { "message": "Προσθήκη επαφής" }, @@ -209,9 +259,6 @@ "airgapVault": { "message": "Θησαυροφυλάκιο AirGap" }, - "airgapVaultTutorial": { - "message": " (Μαθήματα)" - }, "alertDisableTooltip": { "message": "Αυτό μπορεί να αλλάξει στο \"Ρυθμίσεις > Ειδοποιήσεις\"" }, @@ -277,6 +324,9 @@ "approveAndInstall": { "message": "Έγκριση και Εγκατάσταση" }, + "approveAndUpdate": { + "message": "Έγκριση και ενημέρωση" + }, "approveButtonText": { "message": "Έγκριση" }, @@ -293,6 +343,10 @@ "approvedAsset": { "message": "Εγκεκριμένο περιουσιακό στοιχείο" }, + "approvedOn": { + "message": "Εγκρίθηκε στις $1", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "Είστε βέβαιος/η;" }, @@ -305,6 +359,9 @@ "assets": { "message": "Περιουσιακά στοιχεία" }, + "attemptSendingAssets": { + "message": "Εάν επιχειρήσετε να στείλετε περιουσιακά στοιχεία απευθείας από ένα δίκτυο σε ένα άλλο, αυτό ενδέχεται να οδηγήσει σε μόνιμη απώλεια περιουσιακών στοιχείων. Βεβαιωθείτε ότι χρησιμοποιείτε μια διασύνδεση." + }, "attemptToCancel": { "message": "Προσπάθεια Ακύρωσης;" }, @@ -335,6 +392,9 @@ "backToAll": { "message": "Πίσω σε Όλα" }, + "backup": { + "message": "Αντίγραφο ασφαλείας" + }, "backupApprovalInfo": { "message": "Αυτός ο μυστικός κωδικός απαιτείται για ανάκτηση του πορτοφολιού σας σε περίπτωση που χάσετε τη συσκευή σας, ξεχάσετε τον κωδικό πρόσβασης, πρέπει να κάνετε επανεγκατάσταση του MetaMask, ή θέλετε να έχετε πρόσβαση στο πορτοφόλι σας από μια άλλη συσκευή." }, @@ -344,6 +404,12 @@ "backupNow": { "message": "Δημιουργήστε αντίγραφο ασφαλείας τώρα" }, + "backupUserData": { + "message": "Κάντε αντίγραφο ασφαλείας των δεδομένων σας" + }, + "backupUserDataDescription": { + "message": "Μπορείτε να κάνετε αντίγραφο ασφαλείας των ρυθμίσεων χρήστη που περιλαμβάνουν τις προτιμήσεις και τις διευθύνσεις λογαριασμών σε ένα αρχείο JSON." + }, "balance": { "message": "Υπόλοιπο" }, @@ -356,6 +422,9 @@ "basic": { "message": "Βασικά" }, + "beCareful": { + "message": "Να είστε προσεκτικοί" + }, "betaMetamaskDescription": { "message": "Αξιόπιστο για εκατομμύρια, το MetaMask είναι ένα ασφαλές πορτοφόλι που καθιστά τον κόσμο του web3 προσβάσιμο σε όλους." }, @@ -372,6 +441,9 @@ "betaMetamaskVersion": { "message": "Δοκιμαστική έκδοση MetaMask" }, + "betaPortfolioSite": { + "message": "δοκιμαστική ιστοσελίδα χαρτοφυλακίου" + }, "betaWelcome": { "message": "Καλώς ήλθατε στη Δοκιμαστική Έκδοση MetaMask" }, @@ -388,7 +460,7 @@ "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" }, "blockExplorerUrl": { - "message": "Εξερευνητής Μπλοκ" + "message": "Αποκλεισμός διεύθυνσης URL Explorer" }, "blockExplorerUrlDefinition": { "message": "Το URL που χρησιμοποιείται ως εξερευνητής μπλοκ για αυτό το δίκτυο." @@ -507,6 +579,9 @@ "message": "Κάντε κλικ εδώ για να συνδέσετε το Ledger σας μέσω WebHID", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "Κάντε κλικ εδώ για να προσθέσετε χειροκίνητα τα tokens." + }, "clickToRevealSeed": { "message": "Κάντε κλικ εδώ για να αποκαλύψετε μυστικές λέξεις" }, @@ -523,6 +598,16 @@ "confirm": { "message": "Επιβεβαίωση" }, + "confirmPageDialogSetApprovalForAll": { + "message": "Παραχωρείτε πρόσβαση στον $1, συμπεριλαμβανομένου οτιδήποτε ενδέχεται να αποκτήσετε στο μέλλον. Ο συμβαλλόμενος στην άλλη πλευρά μπορεί να μεταφέρει NFT από το πορτοφόλι σας ανά πάσα στιγμή χωρίς να σας ρωτήσει, μέχρι να ανακαλέσετε αυτή την έγκριση. $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "όλα τα NFT αυτού του συμβαλλόμενου" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "Προχωρήστε με προσοχή." + }, "confirmPassword": { "message": "Επιβεβαίωση Κωδικού Πρόσβασης" }, @@ -616,17 +701,11 @@ "connectingToGoerli": { "message": "Σύνδεση στο Δίκτυο Δοκιμής Goerli" }, - "connectingToKovan": { - "message": "Σύνδεση στο Δοκιμαστικό Δίκτυο Kovan" - }, "connectingToMainnet": { "message": "Σύνδεση στο Κύριο Δίκτυο Ethereum" }, - "connectingToRinkeby": { - "message": "Σύνδεση στο Δίκτυο Δοκιμών Rinkeby" - }, - "connectingToRopsten": { - "message": "Σύνδεση με το Δίκτυο Δοκιμών Ropsten" + "connectingToSepolia": { + "message": "Σύνδεση στο δίκτυο δοκιμών Sepolia" }, "contactUs": { "message": "Επικοινωνήστε μαζί μας" @@ -661,8 +740,20 @@ "contractDeployment": { "message": "Ανάπτυξη Συμβολαίου" }, + "contractDescription": { + "message": "Για να προστατευτείτε από τους απατεώνες, αφιερώστε λίγο χρόνο για να επαληθεύσετε τα στοιχεία του συμβαλλόμενου." + }, "contractInteraction": { - "message": "Αλληλεπίδραση Σύμβασης" + "message": "Αλληλεπίδραση Συμβολαίου" + }, + "contractRequestingSpendingCap": { + "message": "Ο συμβαλλόμενος απαιτεί ανώτατο όριο δαπανών" + }, + "contractTitle": { + "message": "Λεπτομέρειες του συμβαλλόμενου" + }, + "contractToken": { + "message": "Token του συμβαλλόμενου" }, "convertTokenToNFTDescription": { "message": "Εντοπίσαμε ότι αυτό το περιουσιακό στοιχείο είναι NFT. Το MetaMask υποστηρίζει πλέον εξ'ορισμού πλήρως τα NFT. Θέλετε να το αφαιρέσετε από τη λίστα των token σας και να το προσθέσετε ως NFT;" @@ -742,19 +833,16 @@ "customContentSearch": { "message": "Αναζήτηση δικτύου που προστέθηκε προηγουμένως" }, - "customGas": { - "message": "Προσαρμογή Gas" - }, "customGasSettingToolTipMessage": { "message": "Χρησιμοποιήστε 1 $ για να προσαρμόσετε την τιμή του τέλους συναλλαγής. Αυτό μπορεί να προκαλέσει σύγχυση, αν δεν είστε εξοικειωμένοι. Επεξεργαστείτε το με δικό σας ρίσκο.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "Η αύξηση των τελών μπορεί να μειώσει τους χρόνους επεξεργασίας, αλλά αυτό δεν είναι εγγυημένο." - }, "customSpendLimit": { "message": "Προσαρμοσμένο Όριο Δαπάνης" }, + "customSpendingCap": { + "message": "Προσαρμοσμένο ανώτατο όριο δαπανών" + }, "customToken": { "message": "Προσαρμοσμένο Token" }, @@ -764,6 +852,9 @@ "customTokenWarningInTokenDetectionNetwork": { "message": "Πριν εισαγάγετε το token με μη αυτόματο τρόπο, βεβαιωθείτε ότι το εμπιστεύεστε. Μάθετε σχετικά με $1." }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "Σιγουρευτείτε ότι εμπιστεύεστε ένα token προτού το εισαγάγετε. Μάθετε πώς να αποφεύγετε $1. Μπορείτε επίσης να ενεργοποιήσετε τον εντοπισμό token $2." + }, "customerSupport": { "message": "υποστήριξη πελατών" }, @@ -787,8 +878,8 @@ "data": { "message": "Δεδομένα" }, - "dataBackupFoundInfo": { - "message": "Ορισμένα από τα δεδομένα του λογαριασμού σας δημιουργήθηκαν σε προηγούμενη εγκατάσταση του MetaMask. Αυτό θα μπορούσε να περιλαμβάνει τις ρυθμίσεις, τις επαφές και τα διακριτικά σας. Θα θέλατε να επαναφέρετε αυτά τα δεδομένα τώρα;" + "dataBackupSeemsCorrupt": { + "message": "Δεν μπορείτε να επαναφέρετε τα δεδομένα σας. Το αρχείο φαίνεται να είναι κατεστραμμένο." }, "dataHex": { "message": "Δεκαεξαδικός" @@ -835,6 +926,12 @@ "message": "Κατάθεση $1", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "Μάθετε περισσότερα" + }, + "deprecatedTestNetworksMsg": { + "message": "Λόγω των αλλαγών στο πρωτόκολλο του Ethereum: τα δοκιμαστικά δίκτυα Rinkeby, Ropsten και Kovan μπορεί να μη λειτουργούν τόσο αξιόπιστα και θα καταργηθούν σύντομα." + }, "description": { "message": "Περιγραφή" }, @@ -1110,6 +1207,15 @@ "message": "Το τελικό σημείο επέστρεψε ένα διαφορετικό αναγνωριστικό αλυσίδας: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "Βελτιωμένος εντοπισμός για token" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "Ο βελτιωμένος εντοπισμός για token είναι επί του παρόντος διαθέσιμος στο $1. $2" + }, + "enhancedTokenDetectionDescription": { + "message": "Το API token της ConsenSys συγκεντρώνει μια λίστα με token από διάφορες λίστες με token τρίτων. Όταν είναι ενεργοποιημένο, τα token θα εντοπίζονται αυτόματα και θα μπορούν να αναζητηθούν στο κύριο δίκτυο του Ethereum, στο Binance, στο Polygon και στο Avalanche. Όταν είναι απενεργοποιημένο, ο αυτόματος εντοπισμός και η αναζήτηση μπορεί να γίνει μόνο στο κύριο δίκτυο του Ethereum." + }, "ensIllegalCharacter": { "message": "Μη έγκυρος χαρακτήρας για το ENS." }, @@ -1166,9 +1272,6 @@ "message": "Στοίβα:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Εκτιμώμενοι Χρόνοι Επεξεργασίας" - }, "ethGasPriceFetchWarning": { "message": "Το εφεδρικό τέλος συναλλαγής που παρέχεται ως η κύρια υπηρεσία εκτίμησης τελών συναλλαγής, δεν είναι διαθέσιμο αυτή τη στιγμή." }, @@ -1214,9 +1317,6 @@ "fast": { "message": "Γρήγορα" }, - "fastest": { - "message": "Ταχύτερη" - }, "feeAssociatedRequest": { "message": "Ένα τέλος σχετίζεται με αυτό το αίτημα." }, @@ -1312,7 +1412,7 @@ "message": "Τέλη Συναλλαγής" }, "gasLimit": { - "message": "Όριο Καυσίμου" + "message": "Όριο τέλους συναλλαγής" }, "gasLimitInfoTooltipContent": { "message": "Το όριο αερίου είναι το μέγιστο ποσό μονάδων αερίου τι οποίες είστε διατεθειμένοι να δαπανήσετε." @@ -1334,7 +1434,7 @@ "message": "Επιλογή τέλους συναλλαγής" }, "gasPrice": { - "message": "Τιμή Αερίου (GWEI)" + "message": "Τιμή τέλους συναλλαγής (GWEI)" }, "gasPriceExcessive": { "message": "Το ποσό του τέλους συναλλαγής σας ορίστηκε άσκοπα υψηλό. Εξετάστε τη μείωση του ποσού." @@ -1343,7 +1443,7 @@ "message": "Η Τιμή του Τέλους Συναλλαγής Είναι Υπερβολική" }, "gasPriceExtremelyLow": { - "message": "Τιμή Καυσίμου Εξαιρετικά Χαμηλή" + "message": "Τιμή τέλους συναλλαγής Εξαιρετικά Χαμηλή" }, "gasPriceFetchFailed": { "message": "Η εκτίμηση της τιμής του τέλους συναλλαγής απέτυχε λόγω σφάλματος δικτύου." @@ -1384,7 +1484,7 @@ "description": "$1 represents an amount of time" }, "gasUsed": { - "message": "Καύσιμο που Χρησιμοποιήθηκε" + "message": "Τέλος συναλλαγής που Χρησιμοποιήθηκε" }, "gdprMessage": { "message": "Τα δεδομένα αυτά συγκεντρωτικά και, ως εκ τούτου, είναι ανώνυμα για τους σκοπούς του Γενικού Κανονισμού για την Προστασία Δεδομένων GDPR (ΕΕ) 2016/679. Για περισσότερες πληροφορίες σχετικά με τις πρακτικές απορρήτου μας, ανατρέξτε στο $1.", @@ -1526,6 +1626,12 @@ "importNFTs": { "message": "Εισαγωγή NFT" }, + "importSelectedTokens": { + "message": "Εισαγωγή επιλεγμένων token;" + }, + "importSelectedTokensDescription": { + "message": "Μόνο τα token που επιλέξατε θα εμφανιστούν στο πορτοφόλι σας. Μπορείτε να εισάγετε αργότερα κρυφά token αναζητώντας τα." + }, "importTokenQuestion": { "message": "Εισαγωγή token;" }, @@ -1552,6 +1658,9 @@ "message": "Έγινε εισαγωγή", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "στις Ρυθμίσεις σας" + }, "infuraBlockedNotification": { "message": "Το MetaMask δεν μπορεί να συνδεθεί με τον εξυπηρετητή blockchain. Ανασκόπηση πιθανών λόγων $1.", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "Η αρχική σας συναλλαγή επιβεβαιώθηκε από το δίκτυο. Πατήστε ΕΝΤΑΞΕΙ για επιστροφή." }, + "install": { + "message": "Εγκατάσταση" + }, "insufficientBalance": { "message": "Ανεπαρκές υπόλοιπο." }, @@ -1654,27 +1766,21 @@ "message": "Αρχείο JSON", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "για να παρακολουθείτε τα token και τα NFT σε όλους τους λογαριασμούς και τα δίκτυα." + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Εκμάθηση)" - }, "knownAddressRecipient": { "message": "Γνωστή διεύθυνση συμβολαίου." }, "knownTokenWarning": { "message": "Αυτή η ενέργεια θα επεξεργαστεί tokens που είναι ήδη εισηγμένα στο πορτοφόλι σας, τα οποίαο μπορεί να χρησιμοποιηθούν για να σας κλέψουν στοιχεία. Αποδεχθείτε μόνο αν είστε σίγουροι ότι θέλετε να αλλάξετε αυτό που αντιπροσωπεύουν αυτά τα νομίσματα. Μάθετε περισσότερά γι'αυτό $1" }, - "kovan": { - "message": "Δίκτυο Δοκιμής Kovan" - }, "lastConnected": { "message": "Τελευταία Σύνδεση" }, - "learmMoreAboutGas": { - "message": "Θέλετε να $1 για το τέλος συναλλαγής;" - }, "learnCancelSpeeedup": { "message": "Μάθετε πώς να $1", "description": "$1 is link to cancel or speed up transactions" @@ -1682,6 +1788,10 @@ "learnMore": { "message": "μάθε περισσότερα" }, + "learnMoreAboutGas": { + "message": "Θέλετε να $1 για το τέλος συναλλαγής;", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Μάθε περισσότερα" }, @@ -1947,6 +2057,10 @@ "name": { "message": "Όνομα" }, + "nativeToken": { + "message": "Το αρχικό token σε αυτό το δίκτυο είναι το $1. Είναι το token που χρησιμοποιείται για τα τέλη φυσικού αερίου.", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "Για να αλληλεπιδράσετε με αποκεντρωμένες εφαρμογές χρησιμοποιώντας το MetaMask, θα χρειαστείτε $1 στο πορτοφόλι σας.", "description": "$1 represents the cypto symbol to be purchased" @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Πολύγωνο" }, @@ -2033,6 +2150,9 @@ "nevermind": { "message": "Δεν πειράζει" }, + "new": { + "message": "Νέο!" + }, "newAccount": { "message": "Νέος Λογαριασμός" }, @@ -2050,7 +2170,7 @@ "message": "Νέα Επαφή" }, "newContract": { - "message": "Νέα Σύμβαση" + "message": "Νέο συμβόλαιο" }, "newNFTDetectedMessage": { "message": "Να επιτρέπεται στο MetaMask να εντοπίζει αυτόματα τα NFT από το Opensea και να τα εμφανίζει στο πορτοφόλι σας." @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "Τα token εισήχθησαν" }, - "newTotal": { - "message": "Νέο Σύνολο" - }, - "newTransactionFee": { - "message": "Τέλος Νέας Συναλλαγής" - }, "newValues": { "message": "νέες τιμές" }, @@ -2157,7 +2271,7 @@ "message": "Είναι ο σωστός λογαριασμός; Είναι διαφορετικό από τον τρέχοντα επιλεγμένο λογαριασμό στο πορτοφόλι σας" }, "notEnoughGas": { - "message": "Δεν Υπάρχει Αρκετό Αέριο" + "message": "Δεν Υπάρχει Αρκετό τέλος συναλλαγής" }, "notifications": { "message": "Ειδοποιήσεις" @@ -2197,12 +2311,29 @@ "message": "Προβολή λίστας προσαρμοσμένων δικτύων" }, "notifications13Description": { - "message": "Τώρα μπορείτε να προσθέσετε εύκολα τα ακόλουθα δημοφιλή προσαρμοσμένα δίκτυα: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm and Polygon! Για να ενεργοποιήσετε αυτήν τη λειτουργία, πηγάινετε στις Ρυθμίσεις -> Πειραματικό και ενεργοποιήστε το «Προβολή λίστας προσαρμοσμένων δικτύων»!", + "message": "Τώρα μπορείτε να προσθέσετε εύκολα τα ακόλουθα δημοφιλή προσαρμοσμένα δίκτυα: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm and Polygon! Για να ενεργοποιήσετε αυτήν τη λειτουργία, πηγαίνετε στις Ρυθμίσεις -> Πειραματικό και ενεργοποιήστε το «Προβολή λίστας προσαρμοσμένων δικτύων»!", "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." }, "notifications13Title": { "message": "Προσθήκη Δημοφιλών Δικτύων" }, + "notifications14ActionText": { + "message": "Εμφάνιση ρυθμίσεων αντιγράφων ασφαλείας" + }, + "notifications14Description": { + "message": "Θα καταργήσουμε τη λειτουργία δεδομένων στο 3Box στις αρχές Οκτωβρίου. Για να δημιουργήσετε αντίγραφα ασφαλείας και να επαναφέρετε το πορτοφόλι σας χειροκίνητα, χρησιμοποιήστε το κουμπί «Δημιουργία Αντιγράφων Ασφαλείας τώρα» στις Ρυθμίσεις για Προχωρημένους.", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "Κατάργηση του 3Box" + }, + "notifications15Description": { + "message": "Δεν απαιτείται καμία ενέργεια εκ μέρους σας, οπότε συνεχίστε να χρησιμοποιείτε το πορτοφόλι σας ως συνήθως. Να προσέχετε για πιθανές απάτες κατά την Συγχώνευση.", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "Η συγχώνευση στο Ethereum είναι εδώ!" + }, "notifications1Description": { "message": "Οι χρήστες του MetaMask Mobile μπορούν τώρα να ανταλλάξουν tokens μέσα στο κινητό τους πορτοφόλι. Σαρώστε τον κωδικό QR για να πάρετε την εφαρμογή για κινητά και να αρχίσετε να ανταλλάζετε.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2268,7 +2399,7 @@ "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, "notifications8ActionText": { - "message": "Μεταβείτε στις Ρυθμίσεις για Προχωρημένους", + "message": "Μεταβείτε στις Ρυθμίσεις > Για Προχωρημένους", "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": { @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "Επισήμανση όλων ως αναγνωσμένων" }, + "numberOfNewTokensDetectedPlural": { + "message": "$1 νέα token βρέθηκαν σε αυτόν τον λογαριασμό", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "1 νέο token βρέθηκε σε αυτόν τον λογαριασμό" + }, "ofTextNofM": { "message": "από" }, @@ -2384,6 +2522,9 @@ "message": "Ανοίξτε το MetaMask σε πλήρη οθόνη για να συνδέσετε το ledger σας μέσω WebHID.", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "Προβολή στον εξερευνητή μπλοκ" + }, "optional": { "message": "Προαιρετικό" }, @@ -2456,6 +2597,12 @@ "permissionRequestCapitalized": { "message": "Αίτημα άδειας" }, + "permissionRequested": { + "message": "Ζητήθηκε τώρα" + }, + "permissionRevoked": { + "message": "Ανακλήθηκε σε αυτήν την ενημέρωση" + }, "permission_accessNetwork": { "message": "Πρόσβαση στο Διαδίκτυο.", "description": "The description of the `endowment:network-access` permission." @@ -2476,9 +2623,13 @@ "message": "Εκτέλεση επ' αόριστον.", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "Ελέγξτε τους λογαριασμούς και τα περιουσιακά σας στοιχεία στο $1 ($2).", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "Ελέγξτε τους λογαριασμούς και τα περιουσιακά σας στοιχεία σας στο \"$1\".", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "Αποθηκεύστε και διαχειριστείτε τα δεδομένα του στη συσκευή σας.", @@ -2488,10 +2639,18 @@ "message": "Εμφάνιση ειδοποιήσεων.", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "Λήψη και εμφάνιση πληροφοριών σχετικά με τις συναλλαγές.", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "Άγνωστη άδεια: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "Δείτε το δημόσιο κλειδί σας για το $1 ($2).", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "Άδειες" }, @@ -2508,6 +2667,9 @@ "popularCustomNetworks": { "message": "Δημοφιλή προσαρμοσμένα δίκτυα" }, + "portfolioSite": { + "message": "Ιστότοπος χαρτοφυλακίου" + }, "preferredLedgerConnectionType": { "message": "Προτιμώμενος Τύπος Σύνδεσης Ledger", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" @@ -2688,9 +2850,17 @@ "restore": { "message": "Επαναφορά" }, - "restoreWalletPreferences": { - "message": "Βρέθηκε ένα αντίγραφο ασφαλείας των δεδομένων σας από το $1. Θα θέλατε να επαναφέρετε τις προτιμήσεις του πορτοφολιού σας;", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "Δεν είναι δυνατή η επαναφορά των δεδομένων σας από το αρχείο που δόθηκε" + }, + "restoreSuccessful": { + "message": "Επιτυχής επαναφορά των δεδομένων σας" + }, + "restoreUserData": { + "message": "Επαναφορά δεδομένων χρήστη" + }, + "restoreUserDataDescription": { + "message": "Μπορείτε να επαναφέρετε τις ρυθμίσεις χρήστη που περιλαμβάνουν τις προτιμήσεις και τις διευθύνσεις λογαριασμών από ένα αρχείο JSON για το οποίο έχει δημιουργηθεί στο παρελθόν αντίγραφο ασφαλείας." }, "retryTransaction": { "message": "Επανάληψη Συναλλαγής" @@ -2721,11 +2891,8 @@ "message": "Με την ανάκληση της άδειας, το ακόλουθο $1 δεν θα έχει πλέον πρόσβαση στο $2 σας", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Δοκιμαστικό Δίκτυο Rinkeby" - }, - "ropsten": { - "message": "Δίκτυο Δοκιμών Ropsten" + "revokeSpendingCapTooltipText": { + "message": "Αυτός ο συμβαλλόμενος δεν θα μπορεί να ξοδέψει άλλα από τα τρέχοντα ή μελλοντικά σας tokens." }, "rpcUrl": { "message": "Νέο RPC URL" @@ -2758,7 +2925,7 @@ "message": "Αποτελέσματα Αναζήτησης" }, "searchSettings": { - "message": "Αναζήτηση στις ρυθμίσεις" + "message": "Αναζήτηση στις Ρυθμίσεις" }, "searchTokens": { "message": "Αναζήτηση Tokens" @@ -2838,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "Γράψτε τη Μυστική Φράση Ανάκτησης σας" }, - "selectAHigherGasFee": { - "message": "Επιλέξτε ένα μεγαλύτερο τέλος gas για να επιταχύνετε την επεξεργασία της συναλλαγής σας.*" - }, "selectAccounts": { "message": "Επιλέξτε τον/τους λογαριασμό(ούς) που θα χρησιμοποιήσετε σε αυτόν τον ιστότοπο" }, @@ -2874,9 +3038,6 @@ "send": { "message": "Αποστολή" }, - "sendAmount": { - "message": "Αποστολή Ποσού" - }, "sendBugReport": { "message": "Στείλτε μας μια αναφορά σφάλματος." }, @@ -2901,6 +3062,9 @@ "message": "Προειδοποίηση: πρόκειται να στείλετε ένα συμβόλαιο token το οποίο ίσως καταλήξει σε απώλεια χρημάτων. $1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "Δίκτυο δοκιμών Sepolia" + }, "setAdvancedPrivacySettings": { "message": "Ορίστε ρυθμίσεις απορρήτου για προχωρημένους" }, @@ -2933,12 +3097,6 @@ "showAdvancedGasInlineDescription": { "message": "Επιλέξτε αυτό για να εμφανίσετε τις τιμές αερίου και να περιορίσετε τα στοιχεία ελέγχου απευθείας στις οθόνες αποστολής και επιβεβαίωσης." }, - "showCustomNetworkList": { - "message": "Προβολή Λίστας Προσαρμοσμένων Δικτύων" - }, - "showCustomNetworkListDescription": { - "message": "Επιλέξτε αυτό για να εμφανιστεί μια λίστα δικτύων με προσυμπληρωμένα στοιχεία κατά την προσθήκη ενός νέου δικτύου." - }, "showFiatConversionInTestnets": { "message": "Εμφάνιση Μετατροπής σε Δοκιμαστικά Δίκτυα" }, @@ -2982,7 +3140,7 @@ "message": "Υπογραφή" }, "signNotice": { - "message": "Η υπογραφή αυτού του μηνύματος μπορεί να έχει\nεπικίνδυνες παρενέργειες. Υπογράφετε μηνύματα μόνο από\nτοποθεσίες που εμπιστεύεστε πλήρως με ολόκληρο τον λογαριασμό σας.\n Αυτή η επικίνδυνη μέθοδος θα καταργηθεί σε μια μελλοντική έκδοση." + "message": "Η υπογραφή αυτού του μηνύματος μπορεί να έχει\nεπικίνδυνες παρενέργειες. Υπογράφετε μηνύματα μόνο από\nτοποθεσίες που εμπιστεύεστε πλήρως με ολόκληρο τον λογαριασμό σας.\n  Αυτή η επικίνδυνη μέθοδος θα καταργηθεί σε μια μελλοντική έκδοση." }, "signatureRequest": { "message": "Αίτημα Υπογραφής" @@ -2993,6 +3151,9 @@ "signed": { "message": "Συνδεδεμένος" }, + "signin": { + "message": "Σύνδεση" + }, "simulationErrorMessageV2": { "message": "Δεν ήμασταν σε θέση να εκτιμήσουμε το τέλος συναλλαγής. Μπορεί να υπάρχει σφάλμα στο συμβόλαιο και αυτή η συναλλαγή μπορεί να αποτύχει." }, @@ -3005,9 +3166,6 @@ "skipAccountSecurityDetails": { "message": "Καταλαβαίνω ότι μέχρι να δημιουργήσω αντίγραφα ασφαλείας για τη Μυστική Φράση Ανάκτησής μου, μπορεί να χάσω τους λογαριασμούς μου και όλα τα περιουσιακά στοιχεία τους." }, - "slow": { - "message": "Αργά" - }, "smartTransaction": { "message": "Έξυπνη Συναλλαγή" }, @@ -3019,6 +3177,10 @@ "message": "Προστέθηκε στις $1 από $2", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "Σφάλμα Snap: '$1'. Κωδικός Σφάλματος: '$2'", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -3029,12 +3191,32 @@ "snapInstallWarningCheck": { "message": "Για να επιβεβαιώσετε ότι καταλαβαίνετε, επιλέξτε όλα τα πλαίσια ελέγχου." }, + "snapInstallWarningCheckPlural": { + "message": "Για να επιβεβαιώσετε ότι καταλαβαίνετε, επιλέξτε όλα τα κουτάκια." + }, + "snapInstallWarningKeyAccess": { + "message": "Εκχωρείτε στο $2 βασική πρόσβαση στο snap \"$1\". Αυτό είναι αμετάκλητο και παρέχει στο \"$1\" τον έλεγχο των λογαριασμών και των περιουσιακών σας στοιχείων $2. Βεβαιωθείτε ότι εμπιστεύεστε το \"$1\" προτού συνεχίσετε.", + "description": "The first parameter is the name of the snap and the second one is the protocol" + }, "snapRequestsPermission": { "message": "Αυτό το snap αιτείται τις παρακάτω άδειες:" }, + "snapUpdate": { + "message": "Ενημέρωση Snap" + }, + "snapUpdateExplanation": { + "message": "Το $1 χρειάζεται μια νεότερη έκδοση του snap σας.", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "Snaps" }, + "snapsInsightLoading": { + "message": "Φόρτωση πληροφοριών συναλλαγών..." + }, + "snapsNoInsight": { + "message": "Η ενέργεια δεν επέστρεψε καμία πληροφορία" + }, "snapsSettingsDescription": { "message": "Διαχειριστείτε τα Snaps σας" }, @@ -3479,6 +3661,9 @@ "swapReviewSwap": { "message": "Επανεξέταση Ανταλλαγής" }, + "swapSearchNameOrAddress": { + "message": "Αναζήτηση ονόματος ή επικόλληση διεύθυνσης" + }, "swapSelect": { "message": "Επιλογή" }, @@ -3498,6 +3683,9 @@ "message": "$1%", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "Εάν η τιμή αλλάξει μεταξύ της ώρας που η εντολή αγοράς σας υποβάλλεται και επιβεβαιώνεται, αυτό ονομάζεται «ολίσθηση». Η συναλλαγή θα ακυρωθεί αυτόματα εάν η ολίσθηση υπερβαίνει τη ρύθμιση «ανοχή ολίσθησης»." + }, "swapSource": { "message": "Πηγή ρευστότητας" }, @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "Εναλλαγή σε αυτόν τον λογαριασμό" }, + "switchedTo": { + "message": "Έχετε αλλάξει σε" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "Η εναλλαγή δικτύων θα ακυρώσει όλες τις εκκρεμείς επιβεβαιώσεις" }, @@ -3643,15 +3834,6 @@ "syncWithMobileTitle": { "message": "Συγχρονισμός με κινητό" }, - "syncWithThreeBox": { - "message": "Συγχρονισμός δεδομένων με 3Box (πειραματικό)" - }, - "syncWithThreeBoxDescription": { - "message": "Ενεργοποιήστε για να δημιουργηθούν αντίγραφα ασφαλείας των ρυθμίσεων σας με το 3Box. Αυτή η λειτουργία είναι επί του παρόντος πειραματική. Χρησιμοποιήστε τη με δική σας ευθύνη." - }, - "syncWithThreeBoxDisabled": { - "message": "Το 3Box έχει απενεργοποιηθεί λόγω σφάλματος κατά τον αρχικό συγχρονισμό" - }, "tenPercentIncreased": { "message": "10% αύξηση" }, @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "Επιλέξτε το προτιμώμενο θέμα σας για το MetaMask." }, + "thingsToKeep": { + "message": "Πράγματα που πρέπει να έχετε υπόψη σας:" + }, "thisWillCreate": { "message": "Αυτό θα δημιουργήσει ένα νέο πορτοφόλι και Μυστική Φράση Ανάκτησης" }, @@ -3714,12 +3899,21 @@ "tokenDetails": { "message": "Λεπτομέρειες token" }, + "tokenFoundTitle": { + "message": "Βρέθηκε $1 νέο token" + }, "tokenId": { "message": "Αναγνωριστικό token" }, "tokenList": { "message": "Λίστες token:" }, + "tokenScamSecurityRisk": { + "message": "απάτες token και κίνδυνοι για την ασφάλεια" + }, + "tokenShowUp": { + "message": "Τα tokens σας ενδέχεται να μην εμφανιστούν αυτόματα στο πορτοφόλι σας." + }, "tokenSymbol": { "message": "Σύμβολο Token" }, @@ -3794,7 +3988,7 @@ "message": "Η συναλλαγή υποχώρησε στα $2." }, "transactionError": { - "message": "Σφάλμα συναλλαγής. Βρέθηκε εξαίρεση στον κωδικό της σύμβασης." + "message": "Σφάλμα συναλλαγής. Βρέθηκε εξαίρεση στον κωδικό του συμβολαίου." }, "transactionErrorNoContract": { "message": "Προσπάθεια κλήσης λειτουργίας σε διεύθυνση μη συμβολαίου." @@ -3806,7 +4000,7 @@ "message": "Χρέωση Συναλλαγής" }, "transactionHistoryBaseFee": { - "message": "Βασικό Τέλος (GWEI)" + "message": "Βασικό Τέλος συναλλαγής (GWEI)" }, "transactionHistoryL1GasLabel": { "message": "Σύνολο Τέλους Συναλλαγής L1" @@ -3861,6 +4055,9 @@ "tryAgain": { "message": "Δοκιμάστε ξανά" }, + "tryOur": { + "message": "Δοκιμάστε το" + }, "turnOnTokenDetection": { "message": "Ενεργοποιήστε την ενισχυμένη ανίχνευση token" }, @@ -3914,9 +4111,13 @@ "message": "Ο αποκεντρωμένος ιστός περιμένει" }, "unrecognizedChain": { - "message": "Αυτό το προσαρμοσμένο δίκτυο δεν αναγνωρίζεται. Σας συνιστούμε να $1 πριν προχωρήσετε", + "message": "Αυτό το προσαρμοσμένο δίκτυο δεν αναγνωρίζεται", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (Μη αναγνωρισμένο πρωτόκολλο)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "Η αποστολή συλλεκτικών (ERC-721) δεν υποστηρίζεται προς το παρόν", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -4034,6 +4235,10 @@ "warning": { "message": "Προειδοποίηση" }, + "warningTooltipText": { + "message": "$1 Ο συμβαλλόμενος μπορεί να ξοδέψει ολόκληρο το υπόλοιπο των tokens σας χωρίς περαιτέρω ειδοποίηση ή συγκατάθεση. Προστατέψτε τον εαυτό σας προσαρμόζοντας ένα χαμηλότερο όριο δαπανών.", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "Αδύναμος" }, diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index b8d64b67577f..6f544eab14d8 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -36,10 +36,10 @@ "message": "Scan QR code" }, "QRHardwareWalletSteps1Description": { - "message": "Connect an airgapped hardware wallet that communicates through QR-codes. Officially supported airgapped hardware wallets include:" + "message": "You can choose from a list of official QR-code supporting partners below." }, "QRHardwareWalletSteps1Title": { - "message": "QR-based HW wallet" + "message": "Connect your QR hardware wallet" }, "QRHardwareWalletSteps2Description": { "message": "Ngrave (coming soon)" @@ -47,14 +47,19 @@ "SIWEAddressInvalid": { "message": "The address in the sign-in request does not match the address of the account you are using to sign in." }, - "SIWEDomainInvalid": { - "message": "The website you are attempting to sign in to ($1) does not match the domain in the sign-in request. Proceed with caution.", - "description": "$1 represents the website domain" + "SIWEDomainInvalidText": { + "message": "The site you're attempting to sign into doesn't match the domain in the request. Proceed with caution." + }, + "SIWEDomainInvalidTitle": { + "message": "Deceptive site request." }, "SIWEDomainWarningBody": { "message": "The website ($1) is asking you to sign in to the wrong domain. This may be a phishing attack.", "description": "$1 represents the website domain" }, + "SIWEDomainWarningLabel": { + "message": "Unsafe" + }, "SIWELabelChainID": { "message": "Chain ID:" }, @@ -101,9 +106,6 @@ "about": { "message": "About" }, - "acceleratingATransaction": { - "message": "* Accelerating a transaction by using a higher gas price increases its chances of getting processed by the network faster, but it is not always guaranteed." - }, "acceptTermsOfUse": { "message": "I have read and agree to the $1", "description": "$1 is the `terms` message" @@ -266,9 +268,6 @@ "airgapVault": { "message": "AirGap Vault" }, - "airgapVaultTutorial": { - "message": " (Tutorials)" - }, "alertDisableTooltip": { "message": "This can be changed in \"Settings > Alerts\"" }, @@ -435,18 +434,35 @@ "beCareful": { "message": "Be careful" }, + "beta": { + "message": "Beta" + }, + "betaHeaderText": { + "message": "This is a beta version. Please report bugs $1", + "description": "$1 represents the word 'here' in a hyperlink" + }, "betaMetamaskDescription": { "message": "Trusted by millions, MetaMask is a secure wallet making the world of web3 accessible to all." }, + "betaMetamaskDescriptionDisclaimerHeading": { + "message": "Beta version disclaimer" + }, "betaMetamaskDescriptionExplanation": { - "message": "Use this version to test upcoming features before they’re released. Your use and feedback helps us build the best version of MetaMask possible. Your use of MetaMask Beta is subject to our standard $1 as well as our $2. As a Beta, there may be an increased risk of bugs. By proceeding, you accept and acknowledge these risks, as well as those risks found in our Terms and Beta Terms.", + "message": "This version allows you to test upcoming features before they’re released, which helps make MetaMask even better. As with all beta versions, there may be an increased risk of bugs. MetaMask Beta is subject to our $1 as well as our $2.", "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" }, + "betaMetamaskDescriptionExplanation2": { + "message": "By proceeding, you accept and acknowledge these risks, our $1, and $2.", + "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanation2BetaTermsLinkText" + }, + "betaMetamaskDescriptionExplanation2BetaTermsLinkText": { + "message": "Beta Terms" + }, "betaMetamaskDescriptionExplanationBetaTermsLinkText": { - "message": "Supplemental Beta Terms" + "message": "supplemental Beta Terms" }, "betaMetamaskDescriptionExplanationTermsLinkText": { - "message": "Terms" + "message": "standard Terms" }, "betaMetamaskVersion": { "message": "MetaMask Beta Version" @@ -454,6 +470,15 @@ "betaPortfolioSite": { "message": "beta portfolio site" }, + "betaTerms": { + "message": "Beta Terms of use" + }, + "betaWalletCreationSuccessReminder1": { + "message": "MetaMask Beta can’t recover your Secret Recovery Phrase." + }, + "betaWalletCreationSuccessReminder2": { + "message": "MetaMask Beta will never ask you for your Secret Recovery Phrase." + }, "betaWelcome": { "message": "Welcome to MetaMask Beta" }, @@ -524,6 +549,9 @@ "message": "Transak supports credit & debit cards, Apple Pay, MobiKwik, and bank transfers (depending on location) in 100+ countries. $1 deposits directly into your MetaMask account.", "description": "$1 represents the crypto symbol to be purchased" }, + "buyNow": { + "message": "Buy Now" + }, "buyWithWyre": { "message": "Buy $1 with Wyre" }, @@ -711,18 +739,9 @@ "connectingToGoerli": { "message": "Connecting to Goerli test network" }, - "connectingToKovan": { - "message": "Connecting to Kovan test network" - }, "connectingToMainnet": { "message": "Connecting to Ethereum Mainnet" }, - "connectingToRinkeby": { - "message": "Connecting to Rinkeby test network" - }, - "connectingToRopsten": { - "message": "Connecting to Ropsten test network" - }, "connectingToSepolia": { "message": "Connecting to Sepolia test network" }, @@ -765,6 +784,12 @@ "contractInteraction": { "message": "Contract interaction" }, + "contractNFT": { + "message": "NFT contract" + }, + "contractRequestingAccess": { + "message": "Contract requesting access" + }, "contractRequestingSpendingCap": { "message": "Contract requesting spending cap" }, @@ -780,6 +805,9 @@ "convertTokenToNFTExistDescription": { "message": "We’ve detected that this asset has been added as an NFT. Would you like to remove it from your token list?" }, + "coolWallet": { + "message": "CoolWallet" + }, "copiedExclamation": { "message": "Copied!" }, @@ -831,6 +859,9 @@ "currentLanguage": { "message": "Current language" }, + "currentRpcUrlDeprecated": { + "message": "The current rpc url for this network has been deprecated." + }, "currentTitle": { "message": "Current:" }, @@ -852,16 +883,10 @@ "customContentSearch": { "message": "Search for a previously added network" }, - "customGas": { - "message": "Customize gas" - }, "customGasSettingToolTipMessage": { "message": "Use $1 to customize the gas price. This can be confusing if you aren’t familiar. Interact at your own risk.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "Increasing fee may decrease processing times, but it is not guaranteed." - }, "customSpendLimit": { "message": "Custom spend limit" }, @@ -903,15 +928,15 @@ "data": { "message": "Data" }, - "dataBackupFoundInfo": { - "message": "Some of your account data was backed up during a previous installation of MetaMask. This could include your settings, contacts, and tokens. Would you like to restore this data now?" - }, "dataBackupSeemsCorrupt": { "message": "Can not restore your data. The file appears to be corrupt." }, "dataHex": { "message": "Hex" }, + "dcent": { + "message": "D'Cent" + }, "decimal": { "message": "Token decimal" }, @@ -1015,6 +1040,9 @@ "downloadGoogleChrome": { "message": "Download Google Chrome" }, + "downloadNow": { + "message": "Download Now" + }, "downloadSecretBackup": { "message": "Download this Secret Recovery Phrase and keep it stored safely on an external encrypted hard drive or storage medium." }, @@ -1259,6 +1287,9 @@ "ensUnknownError": { "message": "ENS lookup failed." }, + "enterANumber": { + "message": "Enter a number" + }, "enterMaxSpendLimit": { "message": "Enter max spend limit" }, @@ -1300,9 +1331,6 @@ "message": "Stack:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Estimated processing times" - }, "ethGasPriceFetchWarning": { "message": "Backup gas price is provided as the main gas estimation service is unavailable right now." }, @@ -1348,9 +1376,6 @@ "fast": { "message": "Fast" }, - "fastest": { - "message": "Fastest" - }, "feeAssociatedRequest": { "message": "A fee is associated with this request." }, @@ -1692,6 +1717,12 @@ "message": "Imported", "description": "status showing that an account has been fully loaded into the keyring" }, + "improvedTokenAllowance": { + "message": "Improved token allowance experience" + }, + "improvedTokenAllowanceDescription": { + "message": "Turn this on to go through the improved token allowance experience whenever a dapp requests an ERC20 approve" + }, "inYourSettings": { "message": "in your Settings" }, @@ -1702,6 +1733,16 @@ "initialTransactionConfirmed": { "message": "Your initial transaction was confirmed by the network. Click OK to go back." }, + "inputLogicEmptyState": { + "message": "Only enter a number that you're comfortable with the contract spending now or in the future. You can always increase the spending cap later." + }, + "inputLogicEqualOrSmallerNumber": { + "message": "This allows the contract to spend $1 from your current balance.", + "description": "$1 is the current token balance in the account and the name of the current token" + }, + "inputLogicHigherNumber": { + "message": "This allows the contract to spend all your token balance until it reaches the cap or you revoke the spending cap. If this is not intended, consider setting a lower spending cap." + }, "install": { "message": "Install" }, @@ -1785,7 +1826,7 @@ "message": "IPFS Gateway" }, "ipfsGatewayDescription": { - "message": "Enter the URL of the IPFS CID gateway to use for ENS content resolution." + "message": "Enter the URL of the IPFS CID gateway to use for ENS or UNS content resolution." }, "jazzAndBlockies": { "message": "Jazzicons and Blockies are two different styles of unique icons that help you identify an account at a glance." @@ -1806,24 +1847,15 @@ "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Tutorials)" - }, "knownAddressRecipient": { "message": "Known contract address." }, "knownTokenWarning": { "message": "This action will edit tokens that are already listed in your wallet, which can be used to phish you. Only approve if you are certain that you mean to change what these tokens represent. Learn more about $1" }, - "kovan": { - "message": "Kovan test network" - }, "lastConnected": { "message": "Last connected" }, - "learmMoreAboutGas": { - "message": "Want to $1 about gas?" - }, "learnCancelSpeeedup": { "message": "Learn how to $1", "description": "$1 is link to cancel or speed up transactions" @@ -1831,6 +1863,10 @@ "learnMore": { "message": "learn more" }, + "learnMoreAboutGas": { + "message": "Want to $1 about gas?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Learn more" }, @@ -2139,6 +2175,9 @@ "networkName": { "message": "Network name" }, + "networkNameArbitrum": { + "message": "Arbitrum" + }, "networkNameAvalanche": { "message": "Avalanche" }, @@ -2154,6 +2193,9 @@ "networkNameGoerli": { "message": "Goerli" }, + "networkNameOptimism": { + "message": "Optimism" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -2233,12 +2275,6 @@ "newTokensImportedTitle": { "message": "Token imported" }, - "newTotal": { - "message": "New total" - }, - "newTransactionFee": { - "message": "New transaction fee" - }, "newValues": { "message": "new values" }, @@ -2379,6 +2415,15 @@ "notifications15Title": { "message": "The Ethereum Merge is here!" }, + "notifications16ActionText": { + "message": "Try it out here" + }, + "notifications16Description": { + "message": "We redesigned our token allowance confirmation to help you make more informed decisions." + }, + "notifications16Title": { + "message": "Improved token allowance experience" + }, "notifications1Description": { "message": "MetaMask Mobile users can now swap tokens inside their mobile wallet. Scan the QR code to get the mobile app and start swapping.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2656,6 +2701,10 @@ "message": "Connect to the $1 Snap.", "description": "The description for the `wallet_snap_*` permission. $1 is the name of the Snap." }, + "permission_cronjob": { + "message": "Schedule and execute periodic actions.", + "description": "The description for the `snap_cronjob` permission" + }, "permission_customConfirmation": { "message": "Display a confirmation in MetaMask.", "description": "The description for the `snap_confirm` permission" @@ -2670,11 +2719,11 @@ }, "permission_manageBip32Keys": { "message": "Control your accounts and assets under $1 ($2).", - "description": "The description for the `snap_getBip32Entropy_*` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." }, "permission_manageBip44Keys": { "message": "Control your \"$1\" accounts and assets.", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "Store and manage its data on your device.", @@ -2692,6 +2741,10 @@ "message": "Unknown permission: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "View your public key for $1 ($2).", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "Permissions" }, @@ -2780,7 +2833,7 @@ "message": "Recents" }, "recipientAddressPlaceholder": { - "message": "Search, public address (0x), or ENS" + "message": "Search, public address (0x), ENS, or UNS" }, "recommendedGasLabel": { "message": "Recommended" @@ -2903,10 +2956,6 @@ "restoreUserDataDescription": { "message": "You can restore user settings containing preferences and account addresses from a previously backed up JSON file." }, - "restoreWalletPreferences": { - "message": "A backup of your data from $1 has been found. Would you like to restore your wallet preferences?", - "description": "$1 is the date at which the data was backed up" - }, "retryTransaction": { "message": "Retry transaction" }, @@ -2928,6 +2977,9 @@ "revealTheSeedPhrase": { "message": "Reveal seed phrase" }, + "reviewSpendingCap": { + "message": "Review your spending cap" + }, "revokeAllTokensTitle": { "message": "Revoke permission to access all of your $1?", "description": "$1 is the symbol of the token for which the user is revoking approval" @@ -2936,15 +2988,12 @@ "message": "By revoking permission, the following $1 will no longer be able to access your $2", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, + "revokeSpendingCap": { + "message": "Revoke spending cap for your" + }, "revokeSpendingCapTooltipText": { "message": "This contract will be unable to spend any more of your current or future tokens." }, - "rinkeby": { - "message": "Rinkeby test network" - }, - "ropsten": { - "message": "Ropsten test network" - }, "rpcUrl": { "message": "New RPC URL" }, @@ -3056,9 +3105,6 @@ "seedPhraseWriteDownHeader": { "message": "Write down your Secret Recovery Phrase" }, - "selectAHigherGasFee": { - "message": "Select a higher gas fee to accelerate the processing of your transaction.*" - }, "selectAccounts": { "message": "Select the account(s) to use on this site" }, @@ -3092,9 +3138,6 @@ "send": { "message": "Send" }, - "sendAmount": { - "message": "Send amount" - }, "sendBugReport": { "message": "Send us a bug report." }, @@ -3135,6 +3178,9 @@ "message": "Approve $1 with no spend limit", "description": "The token symbol that is being approved" }, + "setSpendingCap": { + "message": "Set a spending cap for your" + }, "settings": { "message": "Settings" }, @@ -3154,12 +3200,6 @@ "showAdvancedGasInlineDescription": { "message": "Select this to show gas price and limit controls directly on the send and confirm screens." }, - "showCustomNetworkList": { - "message": "Show custom network list" - }, - "showCustomNetworkListDescription": { - "message": "Select this to show a list of networks with prefilled details when adding a new network." - }, "showFiatConversionInTestnets": { "message": "Show conversion on test networks" }, @@ -3229,9 +3269,6 @@ "skipAccountSecurityDetails": { "message": "I understand that until I back up my Secret Recovery Phrase, I may lose my accounts and all of their assets." }, - "slow": { - "message": "Slow" - }, "smartTransaction": { "message": "Smart transaction" }, @@ -3277,6 +3314,10 @@ "snaps": { "message": "Snaps" }, + "snapsInsightError": { + "message": "An error occured with $1: $2", + "description": "This is shown when the insight snap throws an error. $1 is the snap name, $2 is the error message." + }, "snapsInsightLoading": { "message": "Loading transaction insight..." }, @@ -3295,6 +3336,9 @@ "someNetworksMayPoseSecurity": { "message": "Some networks may pose security and/or privacy risks. Understand the risks before adding & using a network." }, + "somethingIsWrong": { + "message": "Something's gone wrong. Try reloading the page." + }, "somethingWentWrong": { "message": "Oops! Something went wrong." }, @@ -3338,6 +3382,13 @@ "spendLimitTooLarge": { "message": "Spend limit too large" }, + "spendingCapError": { + "message": "Error: Enter numbers only" + }, + "spendingCapErrorDescription": { + "message": "Only enter a number that you're comfortable with $1 accessing now or in the future. You can always increase the token limit later.", + "description": "$1 is origin of the site requesting the token limit" + }, "srpInputNumberOfWords": { "message": "I have a $1-word phrase", "description": "This is the text for each option in the dropdown where a user selects how many words their secret recovery phrase has during import. The $1 is the number of words (either 12, 15, 18, 21, or 24)." @@ -3390,10 +3441,10 @@ "message": "Not connected" }, "step1LatticeWallet": { - "message": "Make sure your Lattice1 is ready to connect" + "message": "Connect your Lattice1" }, "step1LatticeWalletMsg": { - "message": "You can connect MetaMask to your Lattice1 device once it is set up and online. Unlock your device and have your Device ID ready. For more on using hardware wallets, $1", + "message": "You can connect MetaMask to your Lattice1 device once it is set up and online. Unlock your device and have your Device ID ready.", "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" }, "step1LedgerWallet": { @@ -3404,17 +3455,17 @@ "description": "$1 represents the `ledgerLiveApp` localization value" }, "step1TrezorWallet": { - "message": "Plug in Trezor wallet" + "message": "Connect your Trezor" }, "step1TrezorWalletMsg": { - "message": "Connect your wallet directly to your computer. For more on using your hardware wallet device, $1", + "message": "Plug your Trezor directly into your computer and unlock it. Make sure you use the correct passphrase.", "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" }, "step2LedgerWallet": { - "message": "Plug in Ledger wallet" + "message": "Connect your Ledger" }, "step2LedgerWalletMsg": { - "message": "Connect your wallet directly to your computer. Unlock your Ledger and open the Ethereum app. For more on using your hardware wallet device, $1.", + "message": "Plug your Ledger directly into your computer, then unlock it and open the Ethereum app.", "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" }, "stillGettingMessage": { @@ -3900,15 +3951,6 @@ "syncWithMobileTitle": { "message": "Sync with mobile" }, - "syncWithThreeBox": { - "message": "Sync data with 3Box (experimental)" - }, - "syncWithThreeBoxDescription": { - "message": "Turn on to have your settings backed up with 3Box. This feature is currently experimental; use at your own risk." - }, - "syncWithThreeBoxDisabled": { - "message": "3Box has been disabled due to an error during the initial sync" - }, "tenPercentIncreased": { "message": "10% increase" }, @@ -4098,6 +4140,12 @@ "transactionResubmitted": { "message": "Transaction resubmitted with estimated gas fee increased to $1 at $2" }, + "transactionSecurityCheck": { + "message": "Transaction security check" + }, + "transactionSecurityCheckDescription": { + "message": "Turn this on to enable a third party (OpenSea) to review all your transactions and signature requests and warn you about known malicious requests." + }, "transactionSubmitted": { "message": "Transaction submitted with estimated gas fee of $1 at $2." }, @@ -4136,6 +4184,9 @@ "turnOnTokenDetection": { "message": "Turn on enhanced token detection" }, + "tutorial": { + "message": "Tutorial" + }, "twelveHrTitle": { "message": "12hr:" }, @@ -4193,6 +4244,21 @@ "message": "$1 (Unrecognized protocol)", "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." }, + "unsCommonError": { + "message": "No address has been set for this Unstoppable Domain." + }, + "unsConfusingError": { + "message": "We have detected a confusable character in the Unstoppable Domain. Check the domain name to avoid a potential scam." + }, + "unsCurrencyError": { + "message": "Unstoppable Domains does not support this currency. Try sending a different one or use the owners address instead." + }, + "unsCurrencySpecError": { + "message": "The entered Unstoppable Domain does not have a crypto address for the selected currency. Let the owner know to add one!" + }, + "unsUnknownError": { + "message": "There was an error resolving the entered Unstoppable Domain. Please use the owners address instead." + }, "unsendableAsset": { "message": "Sending collectible (ERC-721) tokens is not currently supported", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -4218,6 +4284,9 @@ "useCollectibleDetectionDescription": { "message": "Displaying NFTs media & data may expose your IP address to centralized servers. Third-party APIs (like OpenSea) are used to detect NFTs in your wallet. This exposes your account address with those services. Leave this disabled if you don’t want the app to pull data from those those services." }, + "useDefault": { + "message": "Use default" + }, "usePhishingDetection": { "message": "Use phishing detection" }, @@ -4233,6 +4302,9 @@ "userName": { "message": "Username" }, + "verifyContractDetails": { + "message": "Verify contract details" + }, "verifyThisTokenDecimalOn": { "message": "Token decimal can be found on $1", "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" @@ -4245,6 +4317,9 @@ "message": "Verify this token on $1 and make sure this is the token you want to trade.", "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" }, + "view": { + "message": "View" + }, "viewAccount": { "message": "View account" }, @@ -4254,6 +4329,9 @@ "viewContact": { "message": "View contact" }, + "viewDetails": { + "message": "View details" + }, "viewFullTransactionDetails": { "message": "View full transaction details" }, diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index 0516a55f5001..1737b1fb1ed2 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -39,17 +39,64 @@ "message": "Conecte una cartera de hardware airgapped que se comunique por códigos QR. Las carteras de hardware con soporte oficial incluyen:" }, "QRHardwareWalletSteps1Title": { - "message": "Cartera HW con QR" + "message": "Cartera de HW con QR" }, "QRHardwareWalletSteps2Description": { - "message": "AirGap Vault y Ngrave (próximamente)" + "message": "Ngrave (próximamente)" + }, + "SIWEAddressInvalid": { + "message": "La dirección de la solicitud de inicio de sesión no coincide con la dirección de la cuenta que está utilizando para iniciar sesión." + }, + "SIWEDomainWarningBody": { + "message": "El sitio web ($1) le pide que inicie sesión en un dominio incorrecto. Esto puede ser un ataque de phishing.", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "Identificador de cadena:" + }, + "SIWELabelExpirationTime": { + "message": "Caduca el:" + }, + "SIWELabelIssuedAt": { + "message": "Emitido el:" + }, + "SIWELabelMessage": { + "message": "Mensaje:" + }, + "SIWELabelNonce": { + "message": "Nonce:" + }, + "SIWELabelNotBefore": { + "message": "No antes de:" + }, + "SIWELabelRequestID": { + "message": "Identificador de la solicitud:" + }, + "SIWELabelResources": { + "message": "Recursos: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "Versión:" + }, + "SIWESiteRequestSubtitle": { + "message": "Este sitio solicita iniciar sesión con" + }, + "SIWESiteRequestTitle": { + "message": "Solicitud de inicio de sesión" + }, + "SIWEWarningSubtitle": { + "message": "Para confirmar que comprende, verifique:" + }, + "SIWEWarningTitle": { + "message": "¿Está seguro?" }, "about": { "message": "Acerca de" }, - "acceleratingATransaction": { - "message": "* Usar un precio de gas más alto para acelerar una transacción aumenta las posibilidades de un procesamiento más rápido en la red, pero esto no siempre se garantiza." - }, "acceptTermsOfUse": { "message": "Leí y estoy de acuerdo con $1", "description": "$1 is the `terms` message" @@ -121,6 +168,9 @@ "addAlias": { "message": "Agregar alias" }, + "addBlockExplorer": { + "message": "Agregar un explorador de bloque" + }, "addContact": { "message": "Agregar contacto" }, @@ -209,9 +259,6 @@ "airgapVault": { "message": "Bóveda AirGap" }, - "airgapVaultTutorial": { - "message": " (Tutoriales)" - }, "alertDisableTooltip": { "message": "Esto se puede modificar en \"Configuración > Alertas\"" }, @@ -277,6 +324,9 @@ "approveAndInstall": { "message": "Aprobar e instalar" }, + "approveAndUpdate": { + "message": "Aprobar y actualizar" + }, "approveButtonText": { "message": "Aprobar" }, @@ -293,6 +343,10 @@ "approvedAsset": { "message": "Activo aprobado" }, + "approvedOn": { + "message": "Aprobado el $1", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "¿Está seguro?" }, @@ -305,6 +359,9 @@ "assets": { "message": "Activos" }, + "attemptSendingAssets": { + "message": "Si intenta enviar activos directamente de una red a otra, esto puede provocar la pérdida permanente de activos. Asegúrese de utilizar un puente." + }, "attemptToCancel": { "message": "¿Intentar cancelar?" }, @@ -335,6 +392,9 @@ "backToAll": { "message": "Volver a Todos" }, + "backup": { + "message": "Respaldo" + }, "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." }, @@ -344,6 +404,12 @@ "backupNow": { "message": "Crear copia de seguridad ahora" }, + "backupUserData": { + "message": "Respalde sus datos" + }, + "backupUserDataDescription": { + "message": "Puede respaldar la configuración del usuario que contiene preferencias y direcciones de cuenta en un archivo JSON." + }, "balance": { "message": "Saldo" }, @@ -356,6 +422,9 @@ "basic": { "message": "Básico" }, + "beCareful": { + "message": "Sea cuidadoso" + }, "betaMetamaskDescription": { "message": "Con la confianza de millones de usuarios, MetaMask es una cartera segura que permite que todos puedan acceder al mundo de Web3." }, @@ -372,6 +441,9 @@ "betaMetamaskVersion": { "message": "Versión Beta de MetaMask" }, + "betaPortfolioSite": { + "message": "sitio de portafolio beta" + }, "betaWelcome": { "message": "Bienvenido a MetaMask Beta" }, @@ -401,7 +473,7 @@ "message": "Blockies" }, "browserNotSupported": { - "message": "El explorador no es compatible…" + "message": "Su explorador no es compatible..." }, "buildContactList": { "message": "Cree su lista de contactos" @@ -452,7 +524,7 @@ "message": "Bytes" }, "canToggleInSettings": { - "message": "Puede volver a activar esta notificación desde Configuración -> Alertas." + "message": "Puede volver a activar esta notificación desde Configuración > Alertas." }, "cancel": { "message": "Cancelar" @@ -507,6 +579,9 @@ "message": "Haga clic aquí para conectar su Ledger a través de WebHID", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "Haga clic aquí para agregar manualmente los tokens." + }, "clickToRevealSeed": { "message": "Haga clic aquí para revelar las palabras secretas" }, @@ -523,6 +598,16 @@ "confirm": { "message": "Confirmar" }, + "confirmPageDialogSetApprovalForAll": { + "message": "Está otorgando acceso a $1, incluidos los que pueda poseer en el futuro. La contraparte puede transferir los NFT de su billetera en cualquier momento sin preguntarle hasta que revoque esta aprobación. $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "todos los NFT en este contrato" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "Proceda con precaución." + }, "confirmPassword": { "message": "Confirmar contraseña" }, @@ -616,17 +701,11 @@ "connectingToGoerli": { "message": "Estableciendo conexión a la red de prueba Goerli" }, - "connectingToKovan": { - "message": "Estableciendo conexión a la red de prueba Kovan" - }, "connectingToMainnet": { "message": "Estableciendo conexión a la red principal de Ethereum" }, - "connectingToRinkeby": { - "message": "Estableciendo conexión a la red de prueba Rinkeby" - }, - "connectingToRopsten": { - "message": "Estableciendo conexión a la red de prueba Ropsten" + "connectingToSepolia": { + "message": "Conectando a la red de prueba Sepolia" }, "contactUs": { "message": "Contáctenos" @@ -661,9 +740,21 @@ "contractDeployment": { "message": "Implementación de contrato" }, + "contractDescription": { + "message": "Para protegerse contra estafadores, tómese un momento para verificar los detalles del contrato." + }, "contractInteraction": { "message": "Interacción con el contrato" }, + "contractRequestingSpendingCap": { + "message": "Contrato que solicita límite de gasto" + }, + "contractTitle": { + "message": "Detalles del contrato" + }, + "contractToken": { + "message": "Contrato del token" + }, "convertTokenToNFTDescription": { "message": "Hemos detectado que este activo es un NFT. MetaMask ahora tiene soporte nativo completo para NFT. ¿Quiere eliminarlo de su lista de tokens y añadirlo como un NFT?" }, @@ -742,19 +833,16 @@ "customContentSearch": { "message": "Buscar una red agregada anteriormente" }, - "customGas": { - "message": "Personalizar gas" - }, "customGasSettingToolTipMessage": { "message": "Use $1 para personalizar el precio de gas. Esto puede ser confuso si no está familiarizado. Interactúe bajo su propio riesgo.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "Aumentar la cuota puede disminuir los tiempos de procesamiento, pero no está garantizado." - }, "customSpendLimit": { "message": "Límite de gastos personalizado" }, + "customSpendingCap": { + "message": "Límite de gasto personalizado" + }, "customToken": { "message": "Token personalizado" }, @@ -762,7 +850,10 @@ "message": "La detección de token aún no está disponible en esta red. Importe el token de forma manual y asegúrese de que confía en él. Más información sobre $1" }, "customTokenWarningInTokenDetectionNetwork": { - "message": "Antes de importar un tóken de forma manual, asegúrese de que confía en él. Más información sobre $1." + "message": "Antes de importar un token de forma manual, asegúrese de que confía en él. Más información acerca de $1" + }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "Asegúrese de confiar en un token antes de agregarlo. Aprenda cómo evitar $1. También puede habilitar la detección de tokens $2." }, "customerSupport": { "message": "atención al cliente" @@ -787,8 +878,8 @@ "data": { "message": "Datos" }, - "dataBackupFoundInfo": { - "message": "Se crearon copias de seguridad de algunos de los datos de la cuenta durante una instalación anterior de MetaMask. Esto podría incluir configuraciones, contactos y tokens. ¿Le gustaría restaurar estos datos ahora?" + "dataBackupSeemsCorrupt": { + "message": "No se pueden restaurar sus datos. El archivo parece estar corrupto." }, "dataHex": { "message": "Hex" @@ -835,6 +926,12 @@ "message": "Deposite $1", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "Más información" + }, + "deprecatedTestNetworksMsg": { + "message": "Debido a los cambios de protocolo de Ethereum: es posible que las redes de prueba de Rinkeby, Ropsten y Kovan no funcionen de manera tan confiable y queden obsoletas pronto." + }, "description": { "message": "Descripción" }, @@ -1110,6 +1207,15 @@ "message": "El punto de conexión devolvió un id. de cadena diferente: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "Detección mejorada de tokens" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "Actualmente, la detección mejorada de token se encuentra disponible en $1. $2" + }, + "enhancedTokenDetectionDescription": { + "message": "La API de tokens de ConsenSys agrega una lista de tokens de varias listas de tokens de terceros. Cuando está activado, los tokens se detectarán automáticamente y se podrán buscar en la red principal de Ethereum, Binance, Polygon y Avalanche. Cuando está desactivada, la detección y la búsqueda automáticas solo se pueden realizar en la red principal de Ethereum." + }, "ensIllegalCharacter": { "message": "Caracter ilegal para ENS." }, @@ -1166,9 +1272,6 @@ "message": "Pila:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Tiempos de procesamiento estimados" - }, "ethGasPriceFetchWarning": { "message": "Se muestra el precio del gas de respaldo, ya que el servicio para calcular el precio del gas principal no se encuentra disponible en este momento." }, @@ -1214,9 +1317,6 @@ "fast": { "message": "Rápido" }, - "fastest": { - "message": "El más rápido" - }, "feeAssociatedRequest": { "message": "Esta solicitud tiene asociada una cuota." }, @@ -1405,7 +1505,7 @@ "description": "Displays network name for Ether faucet" }, "getStarted": { - "message": "Empezar" + "message": "Comenzar" }, "goBack": { "message": "Volver" @@ -1509,7 +1609,7 @@ "message": "Importar una cuenta con la frase secreta de recuperación" }, "importMyWallet": { - "message": "Importar Mi cartera" + "message": "Importar mi cartera" }, "importNFT": { "message": "Agregar NFT" @@ -1526,6 +1626,12 @@ "importNFTs": { "message": "AGREGAR NFT" }, + "importSelectedTokens": { + "message": "¿Agregar los tokens seleccionados?" + }, + "importSelectedTokensDescription": { + "message": "Únicamente los tokens seleccionados aparecerán en su billetera. Siempre podrá agregar tokens ocultos más tarde realizando una búsqueda de los mismos." + }, "importTokenQuestion": { "message": "¿Desea importar el token?" }, @@ -1536,7 +1642,7 @@ "message": "agregar activo" }, "importTokensCamelCase": { - "message": "Agregar Tokens" + "message": "Importar tokens" }, "importWallet": { "message": "Importar cartera" @@ -1552,6 +1658,9 @@ "message": "Importado", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "en su Configuración" + }, "infuraBlockedNotification": { "message": "MetaMask no se pudo conectar al host de la cadena de bloques. Revise las razones posibles $1.", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "La red confirmó la transacción inicial. Haga clic en Aceptar para volver." }, + "install": { + "message": "Instalar" + }, "insufficientBalance": { "message": "Saldo insuficiente." }, @@ -1654,27 +1766,21 @@ "message": "Archivo JSON", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "para controlar sus tokens y NFT en todas las cuentas y redes." + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Tutoriales)" - }, "knownAddressRecipient": { "message": "Dirección de contrato conocida." }, "knownTokenWarning": { "message": "Esta acción editará tokens que ya estén enumerados en la cartera y que se pueden usar para engañarlo. Apruebe solo si está seguro de que quiere cambiar lo que representan estos tokens." }, - "kovan": { - "message": "Red de prueba Kovan" - }, "lastConnected": { "message": "Última conexión" }, - "learmMoreAboutGas": { - "message": "¿Quiere $1 sobre el gas?" - }, "learnCancelSpeeedup": { "message": "Aprenda cómo $1", "description": "$1 is link to cancel or speed up transactions" @@ -1682,6 +1788,10 @@ "learnMore": { "message": "Más información" }, + "learnMoreAboutGas": { + "message": "¿Quiere $1 sobre el gas?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Más información" }, @@ -1764,7 +1874,7 @@ "message": "Cargando NFT..." }, "loadingTokens": { - "message": "Cargando tokens…" + "message": "Cargando tokens..." }, "localhost": { "message": "Host local 8545" @@ -1947,6 +2057,10 @@ "name": { "message": "Nombre" }, + "nativeToken": { + "message": "El token nativo en esta red es de $1. Es el token utilizado para las tarifas de gas.", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "Para interactuar con aplicaciones descentralizadas usando MetaMask, necesitará $1 en su billetera.", "description": "$1 represents the cypto symbol to be purchased" @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -2033,6 +2150,9 @@ "nevermind": { "message": "No es importante" }, + "new": { + "message": "¡Nuevo!" + }, "newAccount": { "message": "Cuenta nueva" }, @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "Token importado" }, - "newTotal": { - "message": "Total nuevo" - }, - "newTransactionFee": { - "message": "Cuota de transacción nueva" - }, "newValues": { "message": "nuevos valores" }, @@ -2094,7 +2208,7 @@ "message": "NFT" }, "nftTokenIdPlaceholder": { - "message": "Ingresa el ID del token" + "message": "Ingrese el id del token" }, "nfts": { "message": "NFT" @@ -2163,7 +2277,7 @@ "message": "Notificaciones" }, "notifications10ActionText": { - "message": "Vaya a configuración", + "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." }, "notifications10DescriptionOne": { @@ -2188,7 +2302,7 @@ "message": "Habilitar modo oscuro" }, "notifications12Description": { - "message": "¡El modo oscuro en Extensión finalmente está aquí! Para activarlo, vaya a Configuración -> Experimental y seleccione una de las opciones de visualización: Claro, Oscuro, Sistema." + "message": "¡El modo oscuro en Extensión finalmente está aquí! Para activarlo, vaya a Configuración> Experimental y seleccione una de las opciones de visualización: Claro, Oscuro, Sistema." }, "notifications12Title": { "message": "¿Cuándo estará disponible el modo oscuro? ¡Ahora! 🕶️🦊" @@ -2197,12 +2311,29 @@ "message": "Mostrar lista de redes personalizadas" }, "notifications13Description": { - "message": "Ahora puede agregar fácilmente las siguientes redes personalizadas populares: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm y Polygon. Para habilitar esta función, vaya a Configuración -> Experimental y ¡active \"Mostrar lista de redes personalizadas\"!", + "message": "¡Ahora puede agregar fácilmente las siguientes redes personalizadas populares: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm y Polygon! ¡Para habilitar esta función, vaya a Configuración > Experimental y active \"Mostrar lista de redes personalizadas\"!", "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." }, "notifications13Title": { "message": "Añadir redes populares" }, + "notifications14ActionText": { + "message": "Mostrar configuración de respaldo" + }, + "notifications14Description": { + "message": "Dejaremos de usar nuestra función de datos de 3Box a principios de octubre. Para respaldar y restaurar su billetera manualmente, use el botón \"Hacer copia de seguridad ahora\" en Configuración avanzada.", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "Desactivación de 3Box" + }, + "notifications15Description": { + "message": "No se requiere ninguna acción de su parte, así que siga usando su billetera como de costumbre. Tenga cuidado con las posibles estafas en torno a la Fusión.", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "¡La Fusión de Ethereum está aquí!" + }, "notifications1Description": { "message": "Los usuarios de la aplicación móvil de MetaMask ahora pueden canjear tokens en su cartera móvil. Escanee el código QR para obtener la aplicación móvil y comience a canjear.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2268,7 +2399,7 @@ "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, "notifications8ActionText": { - "message": "Ir a Configuración Avanzada", + "message": "Ir a Configuración > Avanzado", "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": { @@ -2276,7 +2407,7 @@ "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": { - "message": "Para una experiencia más fácil y estable, vaya a la pestaña de Configuración Avanzada y cambie el 'Tipo de Conexión de Ledger Preferida' a 'WebHID'.", + "message": "Para una experiencia más fácil y estable, vaya a la pestaña de Configuración > Avanzado y cambie el 'Tipo de conexión a Ledger preferida' a 'WebHID'.", "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." }, "notifications8Title": { @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "Marcar todo como leído" }, + "numberOfNewTokensDetectedPlural": { + "message": "$1 nuevos tokens encontrados en esta cuenta", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "1 nuevo token encontrado en esta cuenta" + }, "ofTextNofM": { "message": "de" }, @@ -2384,6 +2522,9 @@ "message": "Abra MetaMask en pantalla completa para conectar su Ledger a través de WebHID.", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "Abrir en el explorador de bloques" + }, "optional": { "message": "Opcional" }, @@ -2456,8 +2597,14 @@ "permissionRequestCapitalized": { "message": "Solicitud de permiso" }, + "permissionRequested": { + "message": "Solicitado ahora" + }, + "permissionRevoked": { + "message": "Revocado en esta actualización" + }, "permission_accessNetwork": { - "message": "Acceda a Internet.", + "message": "Acceso a internet.", "description": "The description of the `endowment:network-access` permission." }, "permission_accessSnap": { @@ -2469,16 +2616,20 @@ "description": "The description for the `snap_confirm` permission" }, "permission_ethereumAccounts": { - "message": "Ver las direcciones de las cuentas permitidas (requerido)", + "message": "Ver las direcciones, saldos, actividad de las cuentas permitidas y sugerir transacciones para aprobar (requerido)", "description": "The description for the `eth_accounts` permission" }, "permission_longRunning": { "message": "Ejecutar indefinidamente.", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "Controle sus cuentas y activos por menos de $1 ($2).", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "Controle sus cuentas y activos \"$1\".", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "Almacene y administre sus datos en su dispositivo.", @@ -2488,10 +2639,18 @@ "message": "Mostrar notificaciones.", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "Obtenga y muestre información de transacciones.", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "Permiso desconocido: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "Ver su clave pública para $1 ($2).", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "Permisos" }, @@ -2508,8 +2667,11 @@ "popularCustomNetworks": { "message": "Redes populares personalizadas" }, + "portfolioSite": { + "message": "Sitio del portafolio" + }, "preferredLedgerConnectionType": { - "message": "Tipo de conexión de Ledger preferida", + "message": "Tipo de conexión a Ledger preferida", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" }, "preparingSwap": { @@ -2688,9 +2850,17 @@ "restore": { "message": "Restaurar" }, - "restoreWalletPreferences": { - "message": "Se encontró una copia de seguridad de los datos de $1. ¿Desea restaurar las preferencias de cartera?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "No se pueden restaurar sus datos desde el archivo proporcionado" + }, + "restoreSuccessful": { + "message": "Sus datos se restauraron correctamente" + }, + "restoreUserData": { + "message": "Restaure sus datos de usuario" + }, + "restoreUserDataDescription": { + "message": "Puede restaurar la configuración del usuario que contiene preferencias y direcciones de cuenta desde en un archivo JSON previamente respaldado." }, "retryTransaction": { "message": "Reintentar transacción" @@ -2721,11 +2891,8 @@ "message": "Al revocar permisos, el/la siguiente $1 no tendrá más acceso a su $2", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Red de prueba Rinkeby" - }, - "ropsten": { - "message": "Red de prueba Ropsten" + "revokeSpendingCapTooltipText": { + "message": "Este contrato no podrá gastar más de sus tokens actuales o futuros." }, "rpcUrl": { "message": "Nueva dirección URL de RPC" @@ -2758,7 +2925,7 @@ "message": "Resultados de la búsqueda" }, "searchSettings": { - "message": "Buscar en configuración" + "message": "Buscar en Configuración" }, "searchTokens": { "message": "Buscar tokens" @@ -2838,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "Anote la frase secreta de recuperación" }, - "selectAHigherGasFee": { - "message": "Seleccione una cuota de gas más alta para acelerar el procesamiento de la transacción.*" - }, "selectAccounts": { "message": "Seleccionar cuentas" }, @@ -2874,9 +3038,6 @@ "send": { "message": "Enviar" }, - "sendAmount": { - "message": "Enviar monto" - }, "sendBugReport": { "message": "Envíenos un informe de error." }, @@ -2901,6 +3062,9 @@ "message": "Advertencia: está a punto de enviar un contrato de token que podría dar lugar a una pérdida de fondos. $1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "Red de prueba Sepolia" + }, "setAdvancedPrivacySettings": { "message": "Configuración avanzada de privacidad" }, @@ -2933,12 +3097,6 @@ "showAdvancedGasInlineDescription": { "message": "Seleccione esta opción para mostrar el precio del gas y limitar los controles directamente en las pantallas de envío y confirmación." }, - "showCustomNetworkList": { - "message": "Mostrar lista de redes personalizadas" - }, - "showCustomNetworkListDescription": { - "message": "Seleccione esto para mostrar una lista de redes con detalles precargados al agregar una red nueva." - }, "showFiatConversionInTestnets": { "message": "Mostrar conversión en redes de prueba" }, @@ -2993,6 +3151,9 @@ "signed": { "message": "Firmado" }, + "signin": { + "message": "Iniciar sesión" + }, "simulationErrorMessageV2": { "message": "No pudimos estimar el gas. Podría haber un error en el contrato y esta transacción podría fallar." }, @@ -3005,9 +3166,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." }, - "slow": { - "message": "Lento" - }, "smartTransaction": { "message": "Transacción inteligente" }, @@ -3019,6 +3177,10 @@ "message": "Se agregó en $1 de $2", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "Error de complemento: '$1'. Código de error: '$2'", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -3027,14 +3189,34 @@ "message": "Instalar complemento" }, "snapInstallWarningCheck": { - "message": "Para confirmar que comprende, marque todo." + "message": "Para confirmar que comprende, verifique la casilla." + }, + "snapInstallWarningCheckPlural": { + "message": "Para confirmar que comprende, marque todas las casillas." + }, + "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.", + "description": "The first parameter is the name of the snap and the second one is the protocol" }, "snapRequestsPermission": { "message": "Este complemento solicita los siguientes permisos:" }, + "snapUpdate": { + "message": "Actualizar complemento" + }, + "snapUpdateExplanation": { + "message": "$1 necesita una versión más reciente de su complemento.", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "Complementos" }, + "snapsInsightLoading": { + "message": "Cargando información de transacción..." + }, + "snapsNoInsight": { + "message": "El complemento no devolvió ninguna información" + }, "snapsSettingsDescription": { "message": "Administre sus complementos" }, @@ -3197,7 +3379,7 @@ "message": "El swap habría fallado" }, "stxCancelledDescription": { - "message": "Su transacción habría fallado y fue cancelada para protegerlo de pagar comisiones de gas innecesarias." + "message": "Su transacción pudo haber fallado y fue cancelada para protegerlo de pagar comisiones de gas innecesarias." }, "stxCancelledSubDescription": { "message": "Intente su swap nuevamente. Estaremos aquí para protegerlo contra riesgos similares la próxima vez." @@ -3477,7 +3659,10 @@ "message": "Solicitud de cotización" }, "swapReviewSwap": { - "message": "Revisar canje" + "message": "Revisar swap" + }, + "swapSearchNameOrAddress": { + "message": "Buscar nombre o pegar dirección" }, "swapSelect": { "message": "Seleccionar" @@ -3498,6 +3683,9 @@ "message": "$1%", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "Si el precio cambia entre el momento en que hace el pedido y cuando se confirma, se denomina \"desfase\". El canje se cancelará automáticamente si el desfase supera lo establecido en la configuración de la \"tolerancia de desfase\"." + }, "swapSource": { "message": "Fuente de liquidez" }, @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "Cambiar a esta cuenta" }, + "switchedTo": { + "message": "Ha cambiado a" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "Cambiar de red cancelará todas las confirmaciones pendientes" }, @@ -3643,15 +3834,6 @@ "syncWithMobileTitle": { "message": "Sincronizar con dispositivo móvil" }, - "syncWithThreeBox": { - "message": "Sincronizar datos con 3Box (experimental)" - }, - "syncWithThreeBoxDescription": { - "message": "Active esta opción para crear una copia de seguridad de la configuración con 3Box. Actualmente, esta función es experimental. Úsela bajo su propio riesgo." - }, - "syncWithThreeBoxDisabled": { - "message": "3Box se deshabilitó debido a un error durante la sincronización inicial" - }, "tenPercentIncreased": { "message": "10% de aumento" }, @@ -3662,7 +3844,7 @@ "message": "Términos de servicio" }, "testFaucet": { - "message": "Probar faucet" + "message": "Faucet de prueba" }, "testNetworks": { "message": "Redes de prueba" @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "Elija su tema MetaMask preferido." }, + "thingsToKeep": { + "message": "Cosas a tener en cuenta:" + }, "thisWillCreate": { "message": "Esto creará una cartera y una frase secreta de recuperación nuevas" }, @@ -3714,12 +3899,21 @@ "tokenDetails": { "message": "Detalles del token" }, + "tokenFoundTitle": { + "message": "1 nuevo token encontrado" + }, "tokenId": { "message": "Identificador de Token" }, "tokenList": { "message": "Listas de tokens:" }, + "tokenScamSecurityRisk": { + "message": "estafas de tokens y riesgos de seguridad" + }, + "tokenShowUp": { + "message": "Es posible que sus tokens no aparezcan automáticamente en su billetera." + }, "tokenSymbol": { "message": "Símbolo del token" }, @@ -3861,6 +4055,9 @@ "tryAgain": { "message": "Vuelva a intentarlo" }, + "tryOur": { + "message": "Pruebe nuestro" + }, "turnOnTokenDetection": { "message": "Activar la detección mejorada de tokens" }, @@ -3914,9 +4111,13 @@ "message": "La Web descentralizada espera" }, "unrecognizedChain": { - "message": "No se reconoce esta red personalizada. Antes de continuar, le recomendamos que $1", + "message": "No se reconoce esta red personalizada", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (Protocolo no reconocido)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "El envío de tokens coleccionables (ERC-721) no se admite actualmente", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -4034,6 +4235,10 @@ "warning": { "message": "Advertencia" }, + "warningTooltipText": { + "message": "$1 El contrato podría gastar todo su saldo de tokens sin previo aviso o consentimiento. Protéjase personalizando un límite de gasto más bajo.", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "Débil" }, @@ -4049,7 +4254,7 @@ "message": "Bienvenido a MetaMask" }, "welcomeBack": { - "message": "Hola de nuevo" + "message": "¡Bienvenido de nuevo!" }, "welcomeExploreDescription": { "message": "Almacenar, enviar y gastar criptomonedas y activos." diff --git a/app/_locales/es_419/messages.json b/app/_locales/es_419/messages.json index 9aca362edffe..1051bb56acd9 100644 --- a/app/_locales/es_419/messages.json +++ b/app/_locales/es_419/messages.json @@ -47,9 +47,6 @@ "about": { "message": "Acerca de" }, - "acceleratingATransaction": { - "message": "* Usar un precio de gas más alto para acelerar una transacción aumenta las posibilidades de un procesamiento más rápido en la red, pero esto no siempre se garantiza." - }, "acceptTermsOfUse": { "message": "Leí y estoy de acuerdo con $1", "description": "$1 is the `terms` message" @@ -514,18 +511,9 @@ "connectingToGoerli": { "message": "Estableciendo conexión a la red de prueba Goerli" }, - "connectingToKovan": { - "message": "Estableciendo conexión a la red de prueba Kovan" - }, "connectingToMainnet": { "message": "Estableciendo conexión a la red principal de Ethereum" }, - "connectingToRinkeby": { - "message": "Estableciendo conexión a la red de prueba Rinkeby" - }, - "connectingToRopsten": { - "message": "Estableciendo conexión a la red de prueba Ropsten" - }, "contactUs": { "message": "Contáctenos" }, @@ -616,12 +604,6 @@ "custom": { "message": "Avanzado" }, - "customGas": { - "message": "Personalizar gas" - }, - "customGasSubTitle": { - "message": "Aumentar la tarifa puede disminuir los tiempos de procesamiento, pero no se garantiza esto." - }, "customSpendLimit": { "message": "Límite de gastos personalizado" }, @@ -645,9 +627,6 @@ "data": { "message": "Datos" }, - "dataBackupFoundInfo": { - "message": "Se crearon copias de seguridad de algunos de los datos de la cuenta durante una instalación anterior de MetaMask. Esto podría incluir configuraciones, contactos y tokens. ¿Quiere restaurar estos datos ahora?" - }, "dataHex": { "message": "Hex" }, @@ -1008,9 +987,6 @@ "message": "Pila:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Tiempos de procesamiento estimados" - }, "ethGasPriceFetchWarning": { "message": "Se muestra el precio del gas de respaldo, ya que el servicio para calcular el precio del gas principal no se encuentra disponible en este momento." }, @@ -1050,9 +1026,6 @@ "fast": { "message": "Rápido" }, - "fastest": { - "message": "El más rápido" - }, "feeAssociatedRequest": { "message": "Esta solicitud tiene asociada una tarifa." }, @@ -1416,24 +1389,15 @@ "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Tutoriales)" - }, "knownAddressRecipient": { "message": "Dirección de contrato conocida." }, "knownTokenWarning": { "message": "Esta acción editará tokens que ya estén enumerados en la cartera y que se pueden usar para engañarlo. Apruebe solo si está seguro de que quiere cambiar lo que representan estos tokens." }, - "kovan": { - "message": "Red de prueba Kovan" - }, "lastConnected": { "message": "Última conexión" }, - "learmMoreAboutGas": { - "message": "¿Quiere $1 sobre el gas?" - }, "learnCancelSpeeedup": { "message": "Aprenda cómo $1", "description": "$1 is link to cancel or speed up transactions" @@ -1441,6 +1405,10 @@ "learnMore": { "message": "más información" }, + "learnMoreAboutGas": { + "message": "¿Quiere $1 sobre el gas?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Más información" }, @@ -1766,12 +1734,6 @@ "newToMetaMask": { "message": "¿Es nuevo en MetaMask?" }, - "newTotal": { - "message": "Total nuevo" - }, - "newTransactionFee": { - "message": "Tarifa de transacción nueva" - }, "newValues": { "message": "nuevos valores" }, @@ -2223,10 +2185,6 @@ "restore": { "message": "Restaurar" }, - "restoreWalletPreferences": { - "message": "Se encontró una copia de seguridad de los datos de $1. ¿Desea restaurar las preferencias de cartera?", - "description": "$1 is the date at which the data was backed up" - }, "retryTransaction": { "message": "Reintentar transacción" }, @@ -2245,12 +2203,6 @@ "revealSeedWordsWarningTitle": { "message": "¡NO comparta esta frase con nadie!" }, - "rinkeby": { - "message": "Red de prueba Rinkeby" - }, - "ropsten": { - "message": "Red de prueba Ropsten" - }, "rpcUrl": { "message": "Nueva dirección URL de RPC" }, @@ -2356,9 +2308,6 @@ "seedPhraseWriteDownHeader": { "message": "Anote su frase secreta de recuperación" }, - "selectAHigherGasFee": { - "message": "Seleccione una tarifa de gas más alta para acelerar el procesamiento de la transacción.*" - }, "selectAccounts": { "message": "Seleccione la(s) cuenta(s) a usar en este sitio" }, @@ -2392,9 +2341,6 @@ "send": { "message": "Enviar" }, - "sendAmount": { - "message": "Enviar monto" - }, "sendSpecifiedTokens": { "message": "Enviar $1", "description": "Symbol of the specified token" @@ -2496,9 +2442,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." }, - "slow": { - "message": "Lento" - }, "somethingWentWrong": { "message": "Lo lamentamos, se produjo un error." }, @@ -2953,15 +2896,6 @@ "syncWithMobileTitle": { "message": "Sincronizar con dispositivo móvil" }, - "syncWithThreeBox": { - "message": "Sincronizar datos con 3Box (experimental)" - }, - "syncWithThreeBoxDescription": { - "message": "Active esta opción para crear una copia de seguridad de la configuración con 3Box. Actualmente, esta función es experimental. Úsela bajo su propio riesgo." - }, - "syncWithThreeBoxDisabled": { - "message": "3Box se deshabilitó debido a un error durante la sincronización inicial" - }, "tenPercentIncreased": { "message": "10% de aumento" }, diff --git a/app/_locales/et/messages.json b/app/_locales/et/messages.json index 1b1a3872061c..3badd56814cd 100644 --- a/app/_locales/et/messages.json +++ b/app/_locales/et/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Teave" }, - "acceleratingATransaction": { - "message": "* Tehingu kiirendamine kõrgemate gaasihindadega suurendab võimalust kiiremaks võrgus töötlemiseks, kuid see ei ole alati tagatud." - }, "accessingYourCamera": { "message": "Kaamerale ligipääs..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Ühendamine Goerli testvõrguga" }, - "connectingToKovan": { - "message": "Ühendamine Kovani testvõrguga" - }, "connectingToMainnet": { "message": "Ühenduse loomine peamise Etherumi võrguga" }, - "connectingToRinkeby": { - "message": "Ühendamine Rinkeby testvõrguga" - }, - "connectingToRopsten": { - "message": "Ühendamine Ropsteni testvõrguga" - }, "continueToWyre": { "message": "Ava Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "Täpsemad" }, - "customGas": { - "message": "Gaasi kohandamine" - }, - "customGasSubTitle": { - "message": "Tasu suurendamine võib töötlemisaegu vähendada, kuid see ei ole tagatud." - }, "customToken": { "message": "Kohandatud luba" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "Jätkamiseks sisestage parool" }, - "estimatedProcessingTimes": { - "message": "Eeldatavad töötlemisajad" - }, "ethereumPublicAddress": { "message": "Ethereumi avalik aadress" }, @@ -499,9 +478,6 @@ "knownAddressRecipient": { "message": "Teadaolev lepinguaadress." }, - "kovan": { - "message": "Kovani testvõrk" - }, "learnMore": { "message": "Lisateave" }, @@ -594,12 +570,6 @@ "newToMetaMask": { "message": "Pole MetaMaski varem kasutanud?" }, - "newTotal": { - "message": "Uus kogusumma" - }, - "newTransactionFee": { - "message": "Uus vahendustasu" - }, "next": { "message": "Edasi" }, @@ -758,12 +728,6 @@ "revealSeedWordsWarningTitle": { "message": "ÄRGE jagage seda fraasi mitte kellegagi!" }, - "rinkeby": { - "message": "Rinkeby katsevõrk" - }, - "ropsten": { - "message": "Ropsteni testvõrk" - }, "rpcUrl": { "message": "Uus RPC URL" }, @@ -800,9 +764,6 @@ "seedPhraseReq": { "message": "Seemnefraasid on 12 sõna pikad" }, - "selectAHigherGasFee": { - "message": "Valige suurem gaasihind, et kiirendada tehingu töötlemist.*" - }, "selectAnAccount": { "message": "Valige konto" }, @@ -821,9 +782,6 @@ "send": { "message": "Saada" }, - "sendAmount": { - "message": "Saatke kogus" - }, "sendTokens": { "message": "Saada lube" }, @@ -866,9 +824,6 @@ "signed": { "message": "Allkirjastatud" }, - "slow": { - "message": "Aeglane" - }, "somethingWentWrong": { "message": "Oih! Midagi läks valesti." }, diff --git a/app/_locales/fa/messages.json b/app/_locales/fa/messages.json index ab74d3482c0d..c154b4cffd90 100644 --- a/app/_locales/fa/messages.json +++ b/app/_locales/fa/messages.json @@ -8,9 +8,6 @@ "about": { "message": "درباره" }, - "acceleratingATransaction": { - "message": "* تسریع یک معامله با استفاده از قیمت بالاتر گاز، فرصت تسریع پروسس آنرا توسط شبکه افزایش میدهد اما همیشه این تضمین نمیشود." - }, "accessingYourCamera": { "message": "در حال دسترسی به کمره شما..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "در حال اتصال به شبکه آزمایشی Goerli " }, - "connectingToKovan": { - "message": "در حال اتصال به شبکه آزمایشی Kovan" - }, "connectingToMainnet": { "message": "در حال اتصال به شبکه اصلی ایتریم" }, - "connectingToRinkeby": { - "message": "در حال اتصال به شبکه آزمایشی Rinkeby" - }, - "connectingToRopsten": { - "message": "در حال اتصال به شبکه آزمایشی Ropsten" - }, "continueToWyre": { "message": "ادامه به Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "پیشرفته" }, - "customGas": { - "message": "گاز دلخواه" - }, - "customGasSubTitle": { - "message": "اضافه نمودن فیس ممکن زمان پروسس را کاهش دهد، اما تضمین نمیشود." - }, "customToken": { "message": "رمزیاب دلخواه" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "برای ادامه رمز عبور را وارد کنید" }, - "estimatedProcessingTimes": { - "message": "زمان های تخمینی پروسس" - }, "ethereumPublicAddress": { "message": "آدرس عمومی ایتریم" }, @@ -503,9 +482,6 @@ "knownAddressRecipient": { "message": "آدرس شناخته شده قرارداد" }, - "kovan": { - "message": "شبکه آزمایشی Kovan" - }, "learnMore": { "message": "بیشتر بدانید" }, @@ -604,12 +580,6 @@ "newToMetaMask": { "message": "آیا به MetaMask جدید هستید؟" }, - "newTotal": { - "message": "مجموع جدید" - }, - "newTransactionFee": { - "message": "فیس جدید معامله" - }, "next": { "message": "بعدی" }, @@ -768,12 +738,6 @@ "revealSeedWordsWarningTitle": { "message": "این عبارت را با هیچکس شریک نسازید!" }, - "rinkeby": { - "message": "شبکه آزمایشی Rinkeby" - }, - "ropsten": { - "message": "شبکه آزمایشی Ropsten" - }, "rpcUrl": { "message": "RPC URL جدید" }, @@ -810,9 +774,6 @@ "seedPhraseReq": { "message": "عبارات بازیاب 12 کلمه اند" }, - "selectAHigherGasFee": { - "message": "یک فیس بالاتر گاز را انتخاب نمایید تا پروسس معامله تان تسریع یابد.*" - }, "selectAnAccount": { "message": "یک حساب را انتخاب کنید" }, @@ -831,9 +792,6 @@ "send": { "message": "ارسال" }, - "sendAmount": { - "message": "ارسال مبلغ" - }, "sendTokens": { "message": "رمزیاب ها را ارسال کنید" }, @@ -876,9 +834,6 @@ "signed": { "message": "وارد شد" }, - "slow": { - "message": "آهسته" - }, "somethingWentWrong": { "message": "اوه! مشکلی پیش آمده." }, diff --git a/app/_locales/fi/messages.json b/app/_locales/fi/messages.json index 496475976a3b..3d623bfaab85 100644 --- a/app/_locales/fi/messages.json +++ b/app/_locales/fi/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Tietoja asetuksista" }, - "acceleratingATransaction": { - "message": "* Tapahtuman nopeuttaminen käyttämällä korkeampaa gas-hintaa parantaa mahdollisuutta, että verkko käsittelee sen nopeammin, mutta tämä ei ole aina taattua." - }, "accessingYourCamera": { "message": "Muodostamme yhteyttä kameraasi..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Yhdistetään Goerlin testiverkostoon" }, - "connectingToKovan": { - "message": "Yhdistetään Kovanin koeverkkoon" - }, "connectingToMainnet": { "message": "Yhdistetään Ethereumin pääverkkoon" }, - "connectingToRinkeby": { - "message": "Yhdistetään Rinkebyn koeverkkoon" - }, - "connectingToRopsten": { - "message": "Yhdistetään Ropstenin koeverkkoon" - }, "continueToWyre": { "message": "Jatka Wyreen" }, @@ -250,12 +238,6 @@ "custom": { "message": "Lisäasetukset" }, - "customGas": { - "message": "Mukauta bensa" - }, - "customGasSubTitle": { - "message": "Taksan korottaminen saattaa vähentää käsittelyaikaa, mutta siitä ei anneta takeita." - }, "customToken": { "message": "Mukautettu tietue" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "Syötä salasana voidaksesi jatkaa" }, - "estimatedProcessingTimes": { - "message": "Arvioidut käsittelyajat" - }, "ethereumPublicAddress": { "message": "Ethereumin julkinen osoite" }, @@ -503,9 +482,6 @@ "knownAddressRecipient": { "message": "Tunnettu sopimusosoite." }, - "kovan": { - "message": "Kovanin koeverkko" - }, "learnMore": { "message": "Lisätietoa" }, @@ -604,12 +580,6 @@ "newToMetaMask": { "message": "Onko MetaMask ennestään outo?" }, - "newTotal": { - "message": "Uusi kokonaissumma" - }, - "newTransactionFee": { - "message": "Uusi tapahtumamaksu" - }, "next": { "message": "Seuraava" }, @@ -765,12 +735,6 @@ "revealSeedWordsWarningTitle": { "message": "ÄLÄ jaa tätä tekstiä kenellekään!" }, - "rinkeby": { - "message": "Rinkebyn koeverkko" - }, - "ropsten": { - "message": "Ropstenin koeverkko" - }, "rpcUrl": { "message": "Uusi RPC:n URL" }, @@ -807,9 +771,6 @@ "seedPhraseReq": { "message": "Juurilauseet ovat 12 sanan pituisia" }, - "selectAHigherGasFee": { - "message": "Valitse korkeampi bensataksa vauhdittaaksesi tapahtumasi käsittelyä.*" - }, "selectAnAccount": { "message": "Valitse tili" }, @@ -828,9 +789,6 @@ "send": { "message": "Lähetä" }, - "sendAmount": { - "message": "Lähetä summa" - }, "sendTokens": { "message": "Lähetä tietueita" }, @@ -873,9 +831,6 @@ "signed": { "message": "Allekirjoitettu" }, - "slow": { - "message": "Hidas" - }, "somethingWentWrong": { "message": "Hupsis! Jotakin meni pieleen." }, diff --git a/app/_locales/fil/messages.json b/app/_locales/fil/messages.json index 6ed19fecdfa0..b357f454787b 100644 --- a/app/_locales/fil/messages.json +++ b/app/_locales/fil/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Tungkol sa" }, - "acceleratingATransaction": { - "message": "* Ang pagpapabilis sa isang transaksyon sa pamamagitan ng paggamit ng mas mataas na presyo ng gas ay makakadagdag sa tsansa nitong maproseso ng network nang mas mabilis, pero hindi ito palaging garantisado." - }, "accessingYourCamera": { "message": "Ina-access ang iyong camera..." }, @@ -172,18 +169,9 @@ "connectingToGoerli": { "message": "Kumokonekta sa Goerli Test Network" }, - "connectingToKovan": { - "message": "Kumokonekta sa Kovan Test Network" - }, "connectingToMainnet": { "message": "Kumokonekta sa Ethereum Mainnet" }, - "connectingToRinkeby": { - "message": "Kumokonekta sa Rinkeby Test Network" - }, - "connectingToRopsten": { - "message": "Kumokonekta sa Ropsten Test Network" - }, "continueToWyre": { "message": "Magpatuloy sa Wyre" }, @@ -226,12 +214,6 @@ "currentLanguage": { "message": "Kasalukuyang Wika" }, - "customGas": { - "message": "I-customize ang Gas" - }, - "customGasSubTitle": { - "message": "Maaaring mas bumilis ang pagpoproseso kapag dinagdagan ang fee, pero hindi ito garantisado." - }, "customToken": { "message": "Custom na Token" }, @@ -316,9 +298,6 @@ "enterPasswordContinue": { "message": "Ilagay ang password para magpatuloy" }, - "estimatedProcessingTimes": { - "message": "Tinatantiyang Tagal ng Pagproseso" - }, "etherscanView": { "message": "Tingnan ang account sa Etherscan" }, @@ -538,12 +517,6 @@ "newToMetaMask": { "message": "Bago ka ba sa MetaMask?" }, - "newTotal": { - "message": "Bagong Total" - }, - "newTransactionFee": { - "message": "Bagong Transaction Fee" - }, "next": { "message": "Susunod" }, @@ -728,9 +701,6 @@ "seedPhraseReq": { "message": "Ang mga seed phrase ay may habang 12 salita" }, - "selectAHigherGasFee": { - "message": "Pumili ng mas mataas na gas fee para pabilisin ang pagproseso ng iyong transaksyon.*" - }, "selectAnAccount": { "message": "Pumili ng Account" }, @@ -749,9 +719,6 @@ "send": { "message": "Ipadala" }, - "sendAmount": { - "message": "Magpadala ng Halaga" - }, "sendTokens": { "message": "Magpadala ng Mga Token" }, @@ -788,9 +755,6 @@ "signed": { "message": "Na-sign" }, - "slow": { - "message": "Mabagal" - }, "somethingWentWrong": { "message": "Oops! Nagkaroon ng problema." }, diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 5844ab461e42..4207d700a2e2 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -9,19 +9,19 @@ "message": "Il n’y a plus de comptes. Si vous souhaitez accéder à un autre compte non répertorié ci-dessous, veuillez reconnecter votre portefeuille matériel et le sélectionner." }, "QRHardwareScanInstructions": { - "message": "Placez le code QR devant votre caméra. L’écran est flou, mais cela n’affectera pas la lecture." + "message": "Placez le code QR devant votre caméra. L’écran est flou, mais cela n’affectera pas la lecture." }, "QRHardwareSignRequestCancel": { "message": "Rejeter" }, "QRHardwareSignRequestDescription": { - "message": "Après avoir signé avec votre portefeuille, cliquez sur « Obtenir la signature » pour recevoir la signature" + "message": "Après avoir signé avec votre portefeuille, cliquez sur « Obtenir la signature » pour recevoir la signature" }, "QRHardwareSignRequestGetSignature": { "message": "Obtenir la signature" }, "QRHardwareSignRequestSubtitle": { - "message": "Veuillez scanner le code QR avec votre portefeuille" + "message": "Veuillez scanner le code QR avec votre portefeuille" }, "QRHardwareSignRequestTitle": { "message": "Demander la signature" @@ -30,26 +30,73 @@ "message": "Erreur" }, "QRHardwareUnknownWalletQRCode": { - "message": "Code QR invalide. Scannez le code QR de synchronisation du portefeuille matériel." + "message": "Code QR invalide. Scannez le code QR de synchronisation du portefeuille matériel." }, "QRHardwareWalletImporterTitle": { "message": "Scannez le code QR" }, "QRHardwareWalletSteps1Description": { - "message": "Connectez un portefeuille matériel sécurisé par air gap qui communique via des codes QR. Les portefeuilles de ce type officiellement pris en charge sont les suivants :" + "message": "Connectez un portefeuille matériel sécurisé par air gap qui communique via des codes QR. Les portefeuilles de ce type officiellement pris en charge sont les suivants :" }, "QRHardwareWalletSteps1Title": { - "message": "Portefeuille matériel basé avec code QR" + "message": "Portefeuille matériel avec code QR" }, "QRHardwareWalletSteps2Description": { - "message": "AirGap Vault et Ngrave (bientôt disponible)" + "message": "Ngrave (bientôt disponible)" + }, + "SIWEAddressInvalid": { + "message": "L'adresse figurant dans la demande de connexion ne correspond pas à l'adresse du compte que vous utilisez pour vous connecter." + }, + "SIWEDomainWarningBody": { + "message": "Le site Web ($1) vous demande de vous connecter au mauvais nom domaine. Il peut s'agir d'une tentative d'hameçonnage.", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "Identifiant de la chaîne :" + }, + "SIWELabelExpirationTime": { + "message": "Expire à :" + }, + "SIWELabelIssuedAt": { + "message": "Émis à :" + }, + "SIWELabelMessage": { + "message": "Message :" + }, + "SIWELabelNonce": { + "message": "Nonce :" + }, + "SIWELabelNotBefore": { + "message": "Pas avant :" + }, + "SIWELabelRequestID": { + "message": "Identifiant de la demande :" + }, + "SIWELabelResources": { + "message": "Ressources : $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI :" + }, + "SIWELabelVersion": { + "message": "Version :" + }, + "SIWESiteRequestSubtitle": { + "message": "Ce site vous demande de vous connecter avec" + }, + "SIWESiteRequestTitle": { + "message": "Demande de connexion" + }, + "SIWEWarningSubtitle": { + "message": "Veuillez confirmer que vous avez bien compris en cochant :" + }, + "SIWEWarningTitle": { + "message": "En êtes-vous sûr(e) ?" }, "about": { "message": "À propos" }, - "acceleratingATransaction": { - "message": "* Accélérer une transaction en utilisant un prix de l’essence plus élevé augmente ses chances d’être traitée plus rapidement par le réseau, mais ce n’est pas toujours garanti." - }, "acceptTermsOfUse": { "message": "J’ai lu et j’accepte les $1", "description": "$1 is the `terms` message" @@ -121,6 +168,9 @@ "addAlias": { "message": "Ajouter un alias" }, + "addBlockExplorer": { + "message": "Ajouter un explorateur de blocs" + }, "addContact": { "message": "Ajouter un contact" }, @@ -128,7 +178,7 @@ "message": "Ajouter un jeton personnalisé" }, "addCustomTokenByContractAddress": { - "message": "Vous ne trouvez pas de jeton ? Vous pouvez ajouter manuellement n’importe quel jeton avec son adresse par copier-coller. Les adresses des contrats de jetons sont disponibles sur $1.", + "message": "Vous ne trouvez pas de jeton ? Vous pouvez ajouter manuellement n’importe 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": { @@ -146,7 +196,7 @@ "description": "Link text for the 'addEthereumChainConfirmationRisksLearnMore' translation key" }, "addEthereumChainConfirmationTitle": { - "message": "Autoriser ce site à ajouter un réseau ?" + "message": "Autoriser ce site à ajouter un réseau ?" }, "addFriendsAndAddresses": { "message": "Ajoutez uniquement des amis et des adresses de confiance" @@ -171,7 +221,7 @@ "message": "Ajouter les jetons suggérés" }, "addToken": { - "message": "Ajouter un jeton" + "message": "Ajouter le jeton" }, "address": { "message": "Adresse" @@ -183,10 +233,10 @@ "message": "Paramètres avancés" }, "advancedBaseGasFeeToolTip": { - "message": "Lorsque votre transaction est intégrée au bloc, toute différence entre vos frais de base maximaux et les frais de base réels vous sera remboursée. Le montant total est calculé comme suit : frais de base maximaux (en GWEI) × limite de carburant." + "message": "Lorsque votre transaction est intégrée au bloc, toute différence entre vos frais de base maximaux et les frais de base réels vous sera remboursée. Le montant total est calculé comme suit : frais de base maximaux (en GWEI) × limite de carburant." }, "advancedGasFeeDefaultOptIn": { - "message": "Enregistrer ces $1 comme valeur par défaut pour « Avancé »" + "message": "Enregistrer ces $1 comme valeur par défaut pour « Avancé »" }, "advancedGasFeeDefaultOptOut": { "message": "Toujours utiliser par défaut ces valeurs et les paramètres avancés." @@ -201,7 +251,7 @@ "message": "Options avancées" }, "advancedPriorityFeeToolTip": { - "message": "Les frais de priorité (aussi appelés « pourboire du mineur ») vont directement aux mineurs et les incitent à accorder la priorité à votre transaction." + "message": "Les frais de priorité (aussi appelés « pourboire du mineur ») vont directement aux mineurs et les incitent à accorder la priorité à votre transaction." }, "affirmAgree": { "message": "Je suis d’accord" @@ -209,23 +259,20 @@ "airgapVault": { "message": "Coffre-fort AirGap" }, - "airgapVaultTutorial": { - "message": " (Tutoriels)" - }, "alertDisableTooltip": { - "message": "Vous pouvez modifier ceci dans « Paramètres > Alertes »" + "message": "Vous pouvez modifier ceci dans « Paramètres > Alertes »" }, "alertSettingsUnconnectedAccount": { "message": "Navigation sur un site Web avec un compte non connecté sélectionné" }, "alertSettingsUnconnectedAccountDescription": { - "message": "Cette alerte s’affiche dans le pop-up lorsque vous naviguez sur un site web3 connecté, mais que le compte actuellement sélectionné n’est pas connecté." + "message": "Cette alerte s’affiche dans le pop-up lorsque vous naviguez sur un site web3 connecté, mais que le compte actuellement sélectionné n’est pas connecté." }, "alertSettingsWeb3ShimUsage": { - "message": "Lorsqu’un site Web tente d’utiliser l’API window.web3 supprimée" + "message": "Lorsqu’un site Web tente d’utiliser l’API window.web3 supprimée" }, "alertSettingsWeb3ShimUsageDescription": { - "message": "Cette alerte s’affiche dans le pop-up lorsque vous naviguez sur un site qui tente d’utiliser l’API window.web3 supprimée, et qui peut par conséquent être défaillant." + "message": "Cette alerte s’affiche dans le pop-up lorsque vous naviguez sur un site qui tente d’utiliser l’API window.web3 supprimée, et qui peut par conséquent être défaillant." }, "alerts": { "message": "Alertes" @@ -235,17 +282,17 @@ "description": "$1 is the symbol or name of the token that the user is approving spending" }, "allowExternalExtensionTo": { - "message": "Autoriser cette extension externe à :" + "message": "Autoriser cette extension externe à :" }, "allowSpendToken": { - "message": "Donner l’autorisation d’accéder à votre $1 ?", + "message": "Donner l’autorisation d’accéder à votre $1 ?", "description": "$1 is the symbol of the token that are requesting to spend" }, "allowThisSiteTo": { - "message": "Autoriser ce site à :" + "message": "Autoriser ce site à :" }, "allowWithdrawAndSpend": { - "message": "Permettre à $1 de retirer et de dépenser jusqu’au montant suivant :", + "message": "Permettre à $1 de retirer et de dépenser jusqu’au montant suivant :", "description": "The url of the site that requested permission to 'withdraw and spend'" }, "amount": { @@ -271,12 +318,15 @@ "message": "Approuver" }, "approveAllTokensTitle": { - "message": "Donner l’autorisation d’accéder à tous vos $1 ?", + "message": "Voulez-vous lui accorder l'autorisation d'accé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" }, @@ -288,13 +338,17 @@ "message": "Approuvé" }, "approvedAmountWithColon": { - "message": "Montant approuvé :" + "message": "Montant approuvé :" }, "approvedAsset": { "message": "Actif approuvé" }, + "approvedOn": { + "message": "Approuver le $1", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { - "message": "En êtes-vous sûr(e) ?" + "message": "En êtes-vous sûr(e) ?" }, "asset": { "message": "Actif" @@ -305,6 +359,9 @@ "assets": { "message": "Actifs" }, + "attemptSendingAssets": { + "message": "Si vous essayez d’envoyer des actifs directement d’un réseau à un autre, une perte permanente des actifs pourrait en résulter. Assurez-vous d’utiliser une passerelle." + }, "attemptToCancel": { "message": "Tenter d’annuler ?" }, @@ -335,6 +392,9 @@ "backToAll": { "message": "Retour à Tous" }, + "backup": { + "message": "Sauvegarder" + }, "backupApprovalInfo": { "message": "Ce code secret est requis pour récupérer votre portefeuille si jamais vous perdez votre appareil, oubliez votre mot de passe, devez réinstaller MetaMask ou souhaitez accéder à votre portefeuille depuis un autre appareil." }, @@ -344,6 +404,12 @@ "backupNow": { "message": "Sauvegarder maintenant" }, + "backupUserData": { + "message": "Sauvegardez vos données" + }, + "backupUserDataDescription": { + "message": "Vous pouvez sauvegarder les paramètres de l’utilisateur qui contiennent les préférences et les adresses de compte dans un fichier JSON." + }, "balance": { "message": "Solde" }, @@ -356,11 +422,14 @@ "basic": { "message": "Général" }, + "beCareful": { + "message": "Soyez prudent" + }, "betaMetamaskDescription": { "message": "MetaMask est un portefeuille sécurisé utilisé par des millions de personnes qui rend l’univers du web3 accessible à toutes et à tous." }, "betaMetamaskDescriptionExplanation": { - "message": "Utilisez cette version pour tester les futures fonctionnalités avant leur lancement. Votre utilisation et vos commentaires nous aident à développer la meilleure version possible de MetaMask. Votre utilisation de la version bêta de MetaMask est conditionnée par notre norme $1, ainsi que par notre $2. Il s’agit de la version bêta, présentant un risque de bogues plus élevé. En continuant, vous acceptez et reconnaissez ce risque, ainsi que ceux mentionnés dans nos Conditions d’utilisation et nos Conditions bêta.", + "message": "Utilisez cette version pour tester les futures fonctionnalités avant leur lancement. Votre utilisation et vos commentaires nous aident à développer la meilleure version possible de MetaMask. Votre utilisation de MetaMask Beta est conditionnée par notre norme $1, ainsi que par notre $2. Il s’agit de la version bêta, présentant un risque de bogues plus élevé. En continuant, vous acceptez et reconnaissez ce risque, ainsi que ceux mentionnés dans nos Conditions d’utilisation et nos Conditions bêta.", "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" }, "betaMetamaskDescriptionExplanationBetaTermsLinkText": { @@ -370,10 +439,13 @@ "message": "Conditions d’utilisation" }, "betaMetamaskVersion": { - "message": "MetaMask version bêta" + "message": "Version MetaMask Beta" + }, + "betaPortfolioSite": { + "message": "site de portefeuille bêta" }, "betaWelcome": { - "message": "Bienvenue sur MetaMask Beta" + "message": "Bienvenue sur MetaMask Bêta" }, "blockExplorerAccountAction": { "message": "Compte", @@ -401,7 +473,7 @@ "message": "Blockies" }, "browserNotSupported": { - "message": "Votre navigateur internet n’est pas supporté..." + "message": "Votre navigateur internet n’est pas compatible..." }, "buildContactList": { "message": "Créez votre liste de contacts" @@ -432,27 +504,27 @@ "description": "$1 represents the cypto symbol to be purchased" }, "buyCryptoWithMoonPayDescription": { - "message": "MoonPay prend en charge les moyens de paiement populaires, incluant Visa, Mastercard, Apple / Google / Samsung Pay et les virements bancaires dans plus de 145 pays. Les tokens sont déposés sur votre compte MetaMask." + "message": "MoonPay prend en charge les moyens de paiement populaires, incluant Visa, Mastercard, Apple / Google / Samsung Pay et les virements bancaires dans plus de 145 pays. Les tokens sont déposés sur votre compte MetaMask." }, "buyCryptoWithTransak": { "message": "Acheter $1 avec Transak", "description": "$1 represents the cypto symbol to be purchased" }, "buyCryptoWithTransakDescription": { - "message": "Transak prend en charge les cartes de crédit et de débit, Apple Pay, MobiKwik et les virements bancaires (selon l’emplacement) dans plus de 100 pays. Les tokens $1 sont directement déposés sur votre compte MetaMask.", + "message": "Transak prend en charge les cartes de crédit et de débit, Apple Pay, MobiKwik et les virements bancaires (selon l’emplacement) dans plus de 100 pays. Les tokens $1 sont directement déposés sur votre compte MetaMask.", "description": "$1 represents the crypto symbol to be purchased" }, "buyWithWyre": { "message": "Acheter des $1 avec Wyre" }, "buyWithWyreDescription": { - "message": "Intégration facile pour les achats à hauteur de 1000 $. Vérification interactive et rapide des achats pour les comptes qui bénéficient d’un plafond de paiement élevé. Prise en charge des cartes de débit/crédit, d’Apple Pay et des virements bancaires. Disponible dans plus de 100 pays. Dépôt de jetons sur votre compte MetaMask." + "message": "Intégration facile pour les achats à hauteur de 1000 $. Vérification interactive et rapide des achats pour les comptes qui bénéficient d’un plafond de paiement élevé. Prise en charge des cartes de débit/crédit, d’Apple Pay et des virements bancaires. Disponible dans plus de 100 pays. Dépôt de jetons sur votre compte MetaMask." }, "bytes": { "message": "Octets" }, "canToggleInSettings": { - "message": "Vous pouvez réactiver cette notification dans Paramètres -> Alertes." + "message": "Vous pouvez réactiver cette notification dans Paramètres > Alertes." }, "cancel": { "message": "Annuler" @@ -471,7 +543,7 @@ "description": "$1 is text 'replace' in bold" }, "cancelSpeedUpTransactionTooltip": { - "message": "Pour $1 la transaction, les gas fees doivent être augmentés d’au moins 10 % pour être reconnus par le réseau.", + "message": "Pour $1 la transaction, les gas fees doivent être augmentés d’au moins 10 % pour être reconnus par le réseau.", "description": "$1 is string 'cancel' or 'speed up'" }, "cancelSwapForFee": { @@ -482,7 +554,7 @@ "message": "Annuler le swap gratuitement" }, "cancellationGasFee": { - "message": "Frais d’annulation de carburant" + "message": "Frais d’annulation de la transaction" }, "cancelled": { "message": "Annulé" @@ -507,6 +579,9 @@ "message": "Cliquez ici pour connecter votre Ledger via WebHID", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "Cliquez ici pour ajouter les jetons manuellement." + }, "clickToRevealSeed": { "message": "Cliquez ici pour révéler des mots secrets" }, @@ -523,6 +598,16 @@ "confirm": { "message": "Confirmer" }, + "confirmPageDialogSetApprovalForAll": { + "message": "Vous accordez l’accès à $1, y compris à ceux que vous pourriez posséder dans le futur. L’autre partie pourra transférer des NFT de votre portefeuille à tout moment sans demander votre consentement jusqu’à ce que vous révoquiez cette approbation. $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "tous les NFT inclus dans ce contrat" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "Soyez prudent." + }, "confirmPassword": { "message": "Confirmer le mot de passe" }, @@ -536,7 +621,7 @@ "message": "Confirmé" }, "confusableUnicode": { - "message": "« $1 » est similaire à « $2 »." + "message": "« $1 » est similaire à « $2 »." }, "confusableZeroWidthUnicode": { "message": "Caractère de largeur nulle trouvé." @@ -576,21 +661,21 @@ "description": "$1 will be replaced by the translation of connectToMultipleNumberOfAccounts" }, "connectToMultipleNumberOfAccounts": { - "message": "$1 comptes", + "message": "$1 comptes", "description": "$1 is the number of accounts to which the web3 site/application is asking to connect; this will substitute $1 in connectToMultiple" }, "connectWithMetaMask": { "message": "Connectez-vous avec MetaMask" }, "connectedAccountsDescriptionPlural": { - "message": "Vous avez $1 comptes connectés à ce site.", + "message": "Vous avez $1 comptes connectés à ce site.", "description": "$1 is the number of accounts" }, "connectedAccountsDescriptionSingular": { - "message": "Vous avez 1 compte connecté à ce site." + "message": "Vous avez 1 compte connecté à ce site." }, "connectedAccountsEmptyDescription": { - "message": "MetaMask n’est pas connecté à ce site. Pour vous connecter à un site web3, cliquez sur le bouton de connexion." + "message": "MetaMask n’est pas connecté à ce site. Pour vous connecter à un site web3, cliquez sur le bouton de connexion." }, "connectedSites": { "message": "Sites connectés" @@ -604,7 +689,7 @@ "description": "$1 is the account name" }, "connectedSnapSites": { - "message": "Le snap $1 est connecté à ces sites. Ils ont accès aux autorisations énumérées ci-dessus.", + "message": "Le snap $1 est connecté à ces sites. Ils ont accès aux autorisations énumérées ci-dessus.", "description": "$1 represents the name of the snap" }, "connecting": { @@ -614,19 +699,13 @@ "message": "Connexion à $1" }, "connectingToGoerli": { - "message": "Connexion au réseau de test Goerli" - }, - "connectingToKovan": { - "message": "Connexion au réseau de test Kovan" + "message": "Connexion au testnet Goerli" }, "connectingToMainnet": { "message": "Connexion au réseau principal Ethereum" }, - "connectingToRinkeby": { - "message": "Connexion au réseau de test Rinkeby" - }, - "connectingToRopsten": { - "message": "Connexion au réseau de test Ropsten" + "connectingToSepolia": { + "message": "Connexion au réseau de test Sepolia" }, "contactUs": { "message": "Nous contacter" @@ -661,14 +740,26 @@ "contractDeployment": { "message": "Déploiement de contrat" }, + "contractDescription": { + "message": "Pour vous protéger des escrocs, prenez un moment pour vérifier les détails du contrat." + }, "contractInteraction": { "message": "Interaction avec un contrat" }, + "contractRequestingSpendingCap": { + "message": "Contrat prévoyant un plafond de dépenses" + }, + "contractTitle": { + "message": "Détails du contrat" + }, + "contractToken": { + "message": "Contrat de jetons" + }, "convertTokenToNFTDescription": { - "message": "Nous avons détecté que cet actif est un NFT. MetaMask prend désormais nativement en charge les NFT. Voulez-vous le retirer de votre liste de jetons et l’ajouter en tant que NFT ?" + "message": "Nous avons détecté que cet actif est un NFT. MetaMask prend désormais nativement en charge les NFT. Voulez-vous le retirer de votre liste de jetons et l’ajouter en tant que NFT ?" }, "convertTokenToNFTExistDescription": { - "message": "Nous avons détecté que cet actif a été ajouté en tant que NFT. Souhaitez-vous le retirer de votre liste de tokens ?" + "message": "Nous avons détecté que cet actif a été ajouté en tant que NFT. Souhaitez-vous le retirer de votre liste de tokens ?" }, "copiedExclamation": { "message": "Copié!" @@ -686,7 +777,7 @@ "message": "Copier dans le presse-papier" }, "copyTransactionId": { - "message": "Copier l’ID de transaction" + "message": "Copier le numéro de transaction" }, "create": { "message": "Créer" @@ -722,7 +813,7 @@ "message": "Langue actuelle" }, "currentTitle": { - "message": "Actuel :" + "message": "Actuel :" }, "currentlyUnavailable": { "message": "Indisponible sur ce réseau" @@ -742,19 +833,16 @@ "customContentSearch": { "message": "Chercher un réseau ajouté précédemment" }, - "customGas": { - "message": "Personnaliser le gaz" - }, "customGasSettingToolTipMessage": { "message": "Utilisez $1 pour personnaliser le prix du carburant. Cela peut porter à confusion si vous n’en avez pas l’habitude. Agissez avec prudence !", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "Augmenter le tarif peut faire baisser le temps de traitement, mais cela n’est pas garanti." - }, "customSpendLimit": { "message": "Limite de dépenses personnalisée" }, + "customSpendingCap": { + "message": "Plafond de dépenses personnalisé" + }, "customToken": { "message": "Jeton personnalisé" }, @@ -762,7 +850,10 @@ "message": "La détection de token n’est pas encore disponible sur ce réseau. Veuillez importer le token manuellement et vous assurer que vous lui faites bien confiance. En savoir plus sur $1" }, "customTokenWarningInTokenDetectionNetwork": { - "message": "Avant d’importer manuellement un token, assurez-vous que vous lui faites bien confiance. En savoir plus sur $1." + "message": "Veuillez vous assurer que le jeton est authentique avant de l’importer. En savoir plus sur $1" + }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "Veuillez vous assurer que le jeton est authentique avant de l’importer. Apprenez à éviter $1. Vous pouvez également activer la détection des jetons $2." }, "customerSupport": { "message": "service client" @@ -787,14 +878,14 @@ "data": { "message": "Données" }, - "dataBackupFoundInfo": { - "message": "Certaines données de votre compte ont été sauvegardées lors d’une précédente installation de MetaMask. Il peut s’agir de vos paramètres, contacts et jetons. Souhaitez-vous restaurer ces données maintenant ?" + "dataBackupSeemsCorrupt": { + "message": "Impossible de restaurer vos données. Le fichier semble corrompu." }, "dataHex": { "message": "Hex" }, "decimal": { - "message": "Décimales de précision" + "message": "Nombre de décimales du jeton" }, "decimalsMustZerotoTen": { "message": "Les décimales doivent être plus grandes que 0 et inférieures à 36." @@ -806,7 +897,7 @@ "message": "Copier le message crypté" }, "decryptInlineError": { - "message": "Ce message ne peut pas être décrypté à la suite d’une erreur : $1", + "message": "Ce message ne peut pas être décrypté à la suite d’une erreur : $1", "description": "$1 is error message" }, "decryptMessageNotice": { @@ -835,6 +926,12 @@ "message": "Effectuer un dépôt de $1", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "En savoir plus" + }, + "deprecatedTestNetworksMsg": { + "message": "En raison des changements apportés au protocole d’Ethereum, les réseaux testnet Rinkeby, Ropsten et Kovan peuvent ne pas fonctionner d’une manière aussi fiable qu’auparavant et deviendront bientôt obsolètes." + }, "description": { "message": "Description" }, @@ -842,13 +939,13 @@ "message": "Détails" }, "directDepositCrypto": { - "message": "Dépôt directement de $1" + "message": "Déposer directement $1" }, "directDepositCryptoExplainer": { "message": "Si vous avez déjà un peu de $1, la façon la plus rapide d’obtenir $1 dans votre nouveau portefeuille est par dépôt direct." }, "disabledGasOptionToolTipMessage": { - "message": "« $1 » est désactivé parce qu’il ne correspond pas au minimum d’augmentation de 10 % par rapport aux gas fees initiaux.", + "message": "« $1 » est désactivé parce qu’il ne correspond pas au minimum d’augmentation de 10 % par rapport aux gas fees initiaux.", "description": "$1 is gas estimate type which can be market or aggressive" }, "disconnect": { @@ -858,7 +955,7 @@ "message": "Déconnecter tous les comptes" }, "disconnectAllAccountsConfirmationDescription": { - "message": "Souhaitez-vous vraiment vous déconnecter ? Vous risquez de perdre certaines fonctionnalités du site." + "message": "Souhaitez-vous vraiment vous déconnecter ? Vous risquez de perdre certaines fonctionnalités du site." }, "disconnectPrompt": { "message": "Déconnecter $1" @@ -894,7 +991,7 @@ "message": "Téléchargez cette phrase de sauvegarde secrète et conservez-la en lieu sûr sur un disque dur ou un support de stockage externe chiffré." }, "downloadStateLogs": { - "message": "Télécharger les Logs d’état" + "message": "Télécharger les journaux d'événements" }, "dropped": { "message": "Déconnecté" @@ -915,7 +1012,7 @@ "message": "Modifier le contact" }, "editGasEducationButtonText": { - "message": "Comment puis-je choisir ?" + "message": "Comment puis-je choisir ?" }, "editGasEducationHighExplanation": { "message": "Ce choix est préférable pour les transactions urgentes (comme les swaps), car cela multiplie les chances de réussite de la transaction. Si le traitement d’un swap prend trop de temps, il peut échouer et vous faire perdre une partie de vos frais de carburant." @@ -930,7 +1027,7 @@ "message": "Le choix du bon prix de carburant dépend du type de transaction et de son importance à vos yeux." }, "editGasEducationModalTitle": { - "message": "Comment choisir ?" + "message": "Comment choisir ?" }, "editGasFeeModalTitle": { "message": "Modifier le prix du carburant" @@ -946,7 +1043,7 @@ "description": "$1 is the minimum limit for gas and $2 is the maximum limit" }, "editGasLimitTooltip": { - "message": "La limite de carburant correspond au maximum d’unités de carburant que vous consentez à utiliser. Celles-ci servent de multiplicateur aux « Frais de priorité maximaux » et aux « Frais maximaux »." + "message": "La limite de carburant correspond au maximum d’unités de carburant que vous consentez à utiliser. Celles-ci servent de multiplicateur aux « Frais de priorité maximaux » et aux « Frais maximaux »." }, "editGasLow": { "message": "Bas" @@ -973,7 +1070,7 @@ "message": "Les frais maximaux correspondent au montant le plus élevé que vous aurez à payer (frais de base + frais de priorité)." }, "editGasMaxPriorityFeeBelowMinimum": { - "message": "Les frais de priorité maximaux doivent être supérieurs à 0 GWEI" + "message": "Les frais de priorité maximaux doivent être supérieurs à 0 GWEI" }, "editGasMaxPriorityFeeBelowMinimumV2": { "message": "Les frais de priorité doivent être supérieurs à 0." @@ -991,7 +1088,7 @@ "message": "Les frais de priorité sont faibles par rapport aux conditions actuelles du réseau" }, "editGasMaxPriorityFeeTooltip": { - "message": "Les frais de priorité maximaux (aussi appelés « pourboire du mineur ») vont directement aux mineurs et les incitent à accorder la priorité à votre transaction. Vous paierez le plus souvent votre réglage maximal" + "message": "Les frais de priorité maximaux (aussi appelés « pourboire du mineur ») vont directement aux mineurs et les incitent à accorder la priorité à votre transaction. Vous paierez le plus souvent votre réglage maximal" }, "editGasMedium": { "message": "Moyen" @@ -1000,14 +1097,14 @@ "message": "Les frais de carburant doivent être supérieurs à 0" }, "editGasPriceTooltip": { - "message": "Ce réseau exige un champ « Prix du carburant » lors de la soumission d’une transaction. Le prix du carburant correspond au montant que vous paierez par unité de carburant." + "message": "Ce réseau exige un champ « Prix du carburant » lors de la soumission d’une transaction. Le prix du carburant correspond au montant que vous paierez par unité de carburant." }, "editGasSubTextAmountLabel": { - "message": "Montant maximal :", + "message": "Montant maximal :", "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" }, "editGasSubTextFeeLabel": { - "message": "Frais maximaux :" + "message": "Frais maximaux :" }, "editGasTitle": { "message": "Modifier la priorité" @@ -1037,13 +1134,13 @@ "message": " Activer la détection automatique" }, "enableEIP1559V2": { - "message": "Active l’interface utilisateur améliorée des gas fees" + "message": "Activer l’interface utilisateur améliorée des frais de transaction" }, "enableEIP1559V2AlertMessage": { "message": "Nous avons mis à jour le fonctionnement de l’estimation et de la personnalisation des gas fees." }, "enableEIP1559V2ButtonText": { - "message": "Activer l’interface utilisateur améliorée des gas fees dans les Paramètres" + "message": "Activez l’interface utilisateur améliorée des frais de transaction dans les Paramètres" }, "enableEIP1559V2Description": { "message": "Nous avons mis à jour le fonctionnement de l’estimation et de la personnalisation du gas. À activer si vous souhaitez utiliser la nouvelle expérience de gas. $1", @@ -1079,7 +1176,7 @@ "message": "Vous avez réussi l’essai : gardez votre phrase de départ en sécurité, c’est de votre responsabilité !" }, "endOfFlowMessage10": { - "message": "Tout est terminé" + "message": "Terminé" }, "endOfFlowMessage2": { "message": "Conseils pour la ranger en toute sécurité" @@ -1094,7 +1191,7 @@ "message": "Attention à l’hameçonnage ! MetaMask ne vous demandera jamais spontanément votre phrase de départ." }, "endOfFlowMessage6": { - "message": "Si vous avez besoin de sauvegarder à nouveau votre phrase de départ, vous pouvez la trouver dans Paramètres -> Sécurité." + "message": "Si vous avez besoin de sauvegarder à nouveau votre phrase secrète de récupération, vous pouvez la trouver dans Paramètres > Sécurité." }, "endOfFlowMessage7": { "message": "Si vous avez des questions ou si vous constatez une quelconque anomalie, contactez notre service d’assistance $1.", @@ -1107,9 +1204,18 @@ "message": "En savoir plus." }, "endpointReturnedDifferentChainId": { - "message": "Le point terminal a renvoyé un ID de chaîne différent : $1", + "message": "Le point terminal a renvoyé un ID de chaîne différent : $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "Détection améliorée des jetons" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "La détection améliorée des jetons est actuellement disponible sur $1. $2" + }, + "enhancedTokenDetectionDescription": { + "message": "L’API de jetons de ConsenSys agrège une liste de jetons provenant de diverses listes de jetons tierces. Lorsqu’elle est activée, les jetons sont automatiquement détectés et peuvent être recherchés sur le réseau principal Ethereum, Binance, Polygon et Avalanche. Lorsqu’elle est désactivée, la détection automatique et la recherche ne peuvent être effectuées que sur le réseau principal Ethereum." + }, "ensIllegalCharacter": { "message": "Caractère invalide pour l’ENS." }, @@ -1135,7 +1241,7 @@ "message": "Entrez votre mot de passe pour continuer" }, "errorCode": { - "message": "Code : $1", + "message": "Code : $1", "description": "Displayed error code for debugging purposes. $1 is the error code" }, "errorDetails": { @@ -1143,11 +1249,11 @@ "description": "Title for collapsible section that displays error details for debugging purposes" }, "errorMessage": { - "message": "Message : $1", + "message": "Message : $1", "description": "Displayed error message for debugging purposes. $1 is the error message" }, "errorName": { - "message": "Code : $1", + "message": "Code : $1", "description": "Displayed error name for debugging purposes. $1 is the error name" }, "errorPageMessage": { @@ -1163,12 +1269,9 @@ "description": "Title of generic error page" }, "errorStack": { - "message": "Stack :", + "message": "Stack :", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Délais de traitement estimés" - }, "ethGasPriceFetchWarning": { "message": "Le prix de carburant de sauvegarde est fourni, car le service principal d’estimation du carburant est momentanément indisponible." }, @@ -1203,7 +1306,7 @@ "message": "Échec" }, "failedToFetchChainId": { - "message": "Impossible de récupérer l’ID de la chaîne. Votre URL de RPC est-elle correcte ?" + "message": "Impossible de récupérer l’ID de la chaîne. Votre URL de RPC est-elle correcte ?" }, "failedToFetchTickerSymbolData": { "message": "Les données de vérification de code mnémonique sont actuellement indisponibles. Assurez-vous que le code que vous avez saisi est correct. Il aura une incidence sur les taux de conversion que vous voyez pour ce réseau" @@ -1214,9 +1317,6 @@ "fast": { "message": "Rapide" }, - "fastest": { - "message": "Plus rapide" - }, "feeAssociatedRequest": { "message": "Des frais sont associés à cette demande." }, @@ -1225,7 +1325,7 @@ "description": "Exchange type" }, "fileImportFail": { - "message": "L’importation de fichier ne fonctionne pas ? Cliquez ici !", + "message": "L’importation de fichier ne fonctionne pas ? Cliquez ici !", "description": "Helps user import their account from a JSON file" }, "flaskSnapSettingsCardButtonCta": { @@ -1268,29 +1368,29 @@ "message": "Suivez-nous sur Twitter" }, "forbiddenIpfsGateway": { - "message": "Passerelle IPFS interdite : veuillez spécifier une passerelle CID" + "message": "Passerelle IPFS interdite : veuillez spécifier une passerelle CID" }, "forgetDevice": { "message": "Oublier cet appareil" }, "forgotPassword": { - "message": "Mot de passe oublié ?" + "message": "Mot de passe oublié ?" }, "from": { "message": "de" }, "fromAddress": { - "message": "De : $1", + "message": "De : $1", "description": "$1 is the address to include in the From label. It is typically shortened first using shortenAddress" }, "fromTokenLists": { - "message": "À partir des listes de tokens : $1" + "message": "À partir des listes de tokens : $1" }, "functionApprove": { - "message": "Fonction : approuver" + "message": "Fonction : approuver" }, "functionSetApprovalForAll": { - "message": "Fonction : SetApprovalForAll" + "message": "Fonction : SetApprovalForAll" }, "functionType": { "message": "Type de fonction" @@ -1309,10 +1409,10 @@ "message": "Nos estimations basses, moyennes et hautes ne sont pas disponibles." }, "gasFee": { - "message": "Gas fees" + "message": "Frais de transaction" }, "gasLimit": { - "message": "Limite carburant" + "message": "Montant maximal des frais de transaction" }, "gasLimitInfoTooltipContent": { "message": "La limite de carburant est la quantité maximale d’unités d’essence que vous consentez à dépenser." @@ -1334,16 +1434,16 @@ "message": "Option de carburant" }, "gasPrice": { - "message": "Prix du carburant (GWEI)" + "message": "Prix du gaz (GWEI)" }, "gasPriceExcessive": { "message": "Vos frais de carburant sont inutilement élevés. Songez à les réduire." }, "gasPriceExcessiveInput": { - "message": "Les frais de carburant sont excessifs" + "message": "Le prix du gaz est excessif" }, "gasPriceExtremelyLow": { - "message": "Prix de carburant extrêmement bas" + "message": "Le prix du gaz est extrêmement bas" }, "gasPriceFetchFailed": { "message": "L’estimation du prix du carburant a échoué en raison d’une erreur de réseau." @@ -1352,15 +1452,15 @@ "message": "Le prix du carburant indique la quantité d’Ether que vous acceptez de payer pour chaque unité de carburant." }, "gasTimingHoursShort": { - "message": "$1 h", + "message": "$1 h", "description": "$1 represents a number of hours" }, "gasTimingMinutes": { - "message": "$1 minutes", + "message": "$1 minutes", "description": "$1 represents a number of minutes" }, "gasTimingMinutesShort": { - "message": "$1 min", + "message": "$1 min", "description": "$1 represents a number of minutes" }, "gasTimingNegative": { @@ -1372,11 +1472,11 @@ "description": "$1 represents an amount of time" }, "gasTimingSeconds": { - "message": "$1 secondes", + "message": "$1 secondes", "description": "$1 represents a number of seconds" }, "gasTimingSecondsShort": { - "message": "$1 s", + "message": "$1 s", "description": "$1 represents a number of seconds" }, "gasTimingVeryPositive": { @@ -1384,10 +1484,10 @@ "description": "$1 represents an amount of time" }, "gasUsed": { - "message": "Carburant utilisé" + "message": "Gaz utilisé" }, "gdprMessage": { - "message": "Ces données sont agrégées et sont donc anonymes aux fins du règlement général sur la protection des données (UE) 2016/679. Pour plus d’informations concernant nos pratiques en matière de confidentialité, veuillez consulter notre $1.", + "message": "Ces données sont agrégées et sont donc anonymes aux fins du règlement général sur la protection des données (UE) 2016/679. Pour plus d’informations concernant nos pratiques en matière de confidentialité, veuillez consulter notre $1.", "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" }, "gdprMessagePrivacyPolicy": { @@ -1411,13 +1511,13 @@ "message": "Retour" }, "goerli": { - "message": "Réseau de test Goerli" + "message": "Testnet Goerli" }, "gotIt": { - "message": "J'ai compris !" + "message": "J’ai compris !" }, "grantedToWithColon": { - "message": "Accordé à :" + "message": "Accordé à :" }, "gwei": { "message": "GWEI" @@ -1497,7 +1597,7 @@ "description": "Button to import an account from a selected file" }, "importAccount": { - "message": "Importer un compte" + "message": "Importer le compte" }, "importAccountError": { "message": "Erreur d’importation de compte." @@ -1515,22 +1615,28 @@ "message": "Importer le NFT" }, "importNFTAddressToolTip": { - "message": "Sur OpenSea, par exemple, sur la page des NFT, dans la section Détails, se trouve une valeur avec un hyperlien bleu intitulée « Adresse de contrat ». Si vous cliquez dessus, vous serez redirigé vers l’adresse du contrat sur Etherscan. En haut à gauche de cette page, il devrait y avoir une icône intitulée « Contrat » et à droite, une longue chaîne de lettres et de chiffres. C’est l’adresse du contrat qui a créé votre NFT. Cliquez sur l’icône « Copier » à droite de l’adresse pour la copier dans votre presse-papiers." + "message": "Sur OpenSea, par exemple, sur la page des NFT, dans la section Détails, se trouve une valeur avec un hyperlien bleu intitulée « Adresse de contrat ». Si vous cliquez dessus, vous serez redirigé vers l’adresse du contrat sur Etherscan. En haut à gauche de cette page, il devrait y avoir une icône intitulée « Contrat » et à droite, une longue chaîne de lettres et de chiffres. C’est l’adresse du contrat qui a créé votre NFT. Cliquez sur l’icône « Copier » à droite de l’adresse pour la copier dans votre presse-papiers." }, "importNFTPage": { "message": "page Importer des NFT" }, "importNFTTokenIdToolTip": { - "message": "L’ID d’un collectible est un identifiant unique puisqu’il n’y a pas deux NFT identiques. Encore une fois, sur OpenSea, ce numéro se trouve dans la section « Détails ». Prenez-en note ou copiez-le dans votre presse-papiers." + "message": "L’ID d’un collectible est un identifiant unique puisqu’il n’y a pas deux NFT identiques. Encore une fois, sur OpenSea, ce numéro se trouve dans la section « Détails ». Prenez-en note ou copiez-le dans votre presse-papiers." }, "importNFTs": { "message": "Importer des NFT" }, + "importSelectedTokens": { + "message": "Voulez-vous importer les jetons sélectionnés ?" + }, + "importSelectedTokensDescription": { + "message": "Seuls les jetons que vous avez sélectionnés apparaîtront dans votre portefeuille. Vous pourrez toujours importer des jetons masqués en les recherchant." + }, "importTokenQuestion": { - "message": "Importer un jeton ?" + "message": "Importer un jeton ?" }, "importTokenWarning": { - "message": "Tout un chacun peut créer un jeton avec n’importe quel nom, y compris de fausses versions de jetons existants. Ajoutez et échangez avec prudence !" + "message": "Tout un chacun peut créer un jeton avec n’importe quel nom, y compris de fausses versions de jetons existants. Ajoutez et échangez avec prudence !" }, "importTokens": { "message": "importer des jetons" @@ -1552,6 +1658,9 @@ "message": "Importé", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "dans vos paramètres" + }, "infuraBlockedNotification": { "message": "MetaMask ne peut pas se connecter à l’hôte de la blockchain. Vérifiez les éventuelles raisons $1.", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "Votre transaction initiale a été confirmée par le réseau. Cliquez sur OK pour retourner à l’écran précédent." }, + "install": { + "message": "Installez" + }, "insufficientBalance": { "message": "Solde insuffisant." }, @@ -1592,13 +1704,13 @@ "message": "Cet actif est un NFT et doit être ajouté de nouveau à la page Importer des NFT qui se trouve sous l’onglet NFT" }, "invalidBlockExplorerURL": { - "message": "URL de l’explorateur de blocs invalide" + "message": "L'URL de l’explorateur de blocs est invalide" }, "invalidChainIdTooBig": { "message": "ID de chaîne invalide. L’ID de la chaîne est trop grand." }, "invalidCustomNetworkAlertContent1": { - "message": "L’ID de la chaîne pour le réseau personnalisé « $1 » doit être saisi à nouveau.", + "message": "L’ID de la chaîne pour le réseau personnalisé « $1 » doit être saisi à nouveau.", "description": "$1 is the name/identifier of the network." }, "invalidCustomNetworkAlertContent2": { @@ -1618,10 +1730,10 @@ "message": "Numéro hexadécimal invalide. Supprimez tous les zéros non significatifs." }, "invalidIpfsGateway": { - "message": "Passerelle IPFS invalide : la valeur doit être une URL valide" + "message": "Passerelle IPFS invalide : la valeur doit être une URL valide" }, "invalidNumber": { - "message": "Numéro invalide. Saisissez un nombre décimal ou hexadécimal avec le préfixe « 0x »." + "message": "Numéro invalide. Saisissez un nombre décimal ou hexadécimal avec le préfixe « 0x »." }, "invalidNumberLeadingZeros": { "message": "Numéro invalide. Supprimez tous les zéros en tête." @@ -1633,7 +1745,7 @@ "message": "Phrase secrète de récupération invalide" }, "invalidSeedPhraseCaseSensitive": { - "message": "Entrée invalide ! La phrase secrète de récupération est sensible à la casse." + "message": "Entrée invalide ! La phrase secrète de récupération est sensible à la casse." }, "ipfsGateway": { "message": "Passerelle IPFS" @@ -1654,27 +1766,21 @@ "message": "Fichier JSON", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "pour garder un œil sur vos jetons et vos NFT sur l’ensemble de vos comptes et réseaux." + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Tutoriels)" - }, "knownAddressRecipient": { "message": "Adresse contractuelle connue." }, "knownTokenWarning": { "message": "Cette action modifiera les jetons déjà présents dans votre portefeuille, et risque de favoriser les tentatives d’hameçonnage. N’approuvez que si vous êtes certain·e de vouloir modifier ce que ces jetons représentent. En savoir plus sur $1" }, - "kovan": { - "message": "Réseau de test Kovan" - }, "lastConnected": { "message": "Dernière connexion" }, - "learmMoreAboutGas": { - "message": "Souhaitez-vous $1 sur le carburant ?" - }, "learnCancelSpeeedup": { "message": "Découvrir comment $1", "description": "$1 is link to cancel or speed up transactions" @@ -1682,6 +1788,10 @@ "learnMore": { "message": "En savoir plus" }, + "learnMoreAboutGas": { + "message": "$1 à propos des frais de gaz?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "En savoir plus" }, @@ -1695,13 +1805,13 @@ "message": "Fermez tout autre logiciel connecté à votre appareil, puis cliquez ici pour actualiser." }, "ledgerConnectionInstructionHeader": { - "message": "Avant de cliquer sur confirmer :" + "message": "Avant de cliquer sur confirmer :" }, "ledgerConnectionInstructionStepFour": { - "message": "Activez les « données de contrat intelligent » ou la « signature aveugle » sur votre dispositif Ledger" + "message": "Activez les « données de contrat intelligent » ou la « signature aveugle » sur votre dispositif Ledger" }, "ledgerConnectionInstructionStepOne": { - "message": "Activez l’option « Utiliser Ledger Live » sous Paramètres > Avancés" + "message": "Activez l’option « Utiliser Ledger Live » sous Paramètres > Avancés" }, "ledgerConnectionInstructionStepThree": { "message": "Branchez votre dispositif Ledger et sélectionnez l’application Ethereum" @@ -1710,7 +1820,7 @@ "message": "Ouvrez et déverrouillez l’application Ledger Live" }, "ledgerConnectionPreferenceDescription": { - "message": "Personnalisez la façon dont vous souhaitez connecter votre Ledger à MetaMask. $1 est recommandé, mais d’autres options sont disponibles. En savoir plus ici : $2", + "message": "Personnalisez la façon dont vous souhaitez connecter votre Ledger à MetaMask. $1 est recommandé, mais d’autres options sont disponibles. En savoir plus ici : $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": { @@ -1733,11 +1843,11 @@ "message": "Si l’application Ledger Live est ouverte, désactivez toute connexion en cours à celle-ci et fermez-la." }, "ledgerWebHIDNotConnectedErrorMessage": { - "message": "Le dispositif Ledger n’est pas connecté. Si vous souhaitez le connecter, veuillez cliquer à nouveau sur « Continuer » et approuver la connexion au HID", + "message": "Le dispositif Ledger n’est pas connecté. Si vous souhaitez le connecter, veuillez cliquer à nouveau sur « Continuer » et approuver la connexion au HID", "description": "An error message shown to the user during the hardware connect flow." }, "letsGoSetUp": { - "message": "Oui, passons à la configuration !" + "message": "Oui, passons à la configuration !" }, "levelArrow": { "message": "flèche de niveau" @@ -1767,7 +1877,7 @@ "message": "Chargement des jetons..." }, "localhost": { - "message": "Localhost 8545" + "message": "Localhost 8545" }, "lock": { "message": "Déconnexion" @@ -1868,7 +1978,7 @@ "description": "This string is localized separately from some of the commitments so that we can bold it" }, "metametricsCommitmentsIntro": { - "message": "MetaMask :" + "message": "MetaMask :" }, "metametricsCommitmentsNeverCollect": { "message": "Ne collectera jamais vos clés, adresses, transactions, soldes, hachages ou toute autre information personnelle" @@ -1885,10 +1995,10 @@ "message": "Ne collectera jamais votre adresse IP complète" }, "metametricsCommitmentsNeverSell": { - "message": "Ne vendra jamais de données à des fins lucratives. Jamais !" + "message": "Ne vendra jamais de données à des fins lucratives. Jamais !" }, "metametricsCommitmentsNeverSellDataForProfit": { - "message": "Ne vendra $1 de données à des fins lucratives. Jamais !", + "message": "Ne vendra $1 de données à des fins lucratives. Jamais !", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, "metametricsCommitmentsSendAnonymizedEvents": { @@ -1904,7 +2014,7 @@ "message": "Nous aimerions recueillir des données d’utilisation de base pour améliorer la convivialité de notre produit. Ces indicateurs seront…" }, "metametricsTitle": { - "message": "Rejoignez plus de 6 M d’utilisateurs pour améliorer MetaMask" + "message": "Rejoignez plus de 6 M d’utilisateurs pour améliorer MetaMask" }, "mismatchedChainLinkText": { "message": "vérifier les détails du réseau", @@ -1924,7 +2034,7 @@ "message": "Selon nos informations, la valeur de l'URL RPC soumise ne correspond pas à un fournisseur connu pour cet ID de chaîne." }, "missingNFT": { - "message": "Vous ne voyez pas votre NFT ?" + "message": "Vous ne voyez pas votre NFT ?" }, "missingSetting": { "message": "Vous ne trouvez pas un paramètre ?" @@ -1933,10 +2043,10 @@ "message": "Demandez ici" }, "missingToken": { - "message": "Vous ne voyez pas votre jeton ?" + "message": "Vous ne voyez pas votre jeton ?" }, "mobileSyncWarning": { - "message": "La fonction « Synchronisation avec l’extension » est temporairement désactivée. Si vous souhaitez utiliser votre portefeuille d’extension sur MetaMask mobile : sur votre application mobile, revenez aux options de configuration du portefeuille et sélectionnez l’option « Importation avec la phrase secrète de récupération ». Utilisez la phrase secrète de votre portefeuille d’extension pour importer celui-ci sur votre mobile." + "message": "La fonction « Synchronisation avec l’extension » est temporairement désactivée. Si vous souhaitez utiliser votre portefeuille d’extension sur MetaMask mobile : sur votre application mobile, revenez aux options de configuration du portefeuille et sélectionnez l’option « Importation avec la phrase secrète de récupération ». Utilisez la phrase secrète de votre portefeuille d’extension pour importer celui-ci sur votre mobile." }, "mustSelectOne": { "message": "Vous devez sélectionner au moins 1 jeton." @@ -1947,12 +2057,16 @@ "name": { "message": "Nom" }, + "nativeToken": { + "message": "Le jeton natif de ce réseau est $1. C’est le jeton utilisé pour les frais de gaz.\n", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "Pour interagir avec des applications décentralisées à l’aide de MetaMask, vous devrez avoir $1 dans votre portefeuille.", "description": "$1 represents the cypto symbol to be purchased" }, "needHelp": { - "message": "Vous avez besoin d’aide ? Contactez $1", + "message": "Vous avez besoin d’aide ? Contactez $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" }, "needHelpFeedback": { @@ -1972,7 +2086,7 @@ "message": "Vous ne pouvez envoyer des montants négatifs d’ETH." }, "network": { - "message": "Réseau :" + "message": "Réseau :" }, "networkAddedSuccessfully": { "message": "Réseau ajouté avec succès !" @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -2005,20 +2122,20 @@ "message": "Testnet" }, "networkSettingsChainIdDescription": { - "message": "L’ID de la chaîne est utilisé pour la signature des transactions. Il doit correspondre à l’ID de la chaîne renvoyé par le réseau. Vous pouvez saisir un numéro décimal ou hexadécimal avec le préfixe « 0x », mais nous afficherons le numéro en décimal." + "message": "L’ID de la chaîne est utilisé pour la signature des transactions. Il doit correspondre à l’ID de la chaîne renvoyé par le réseau. Vous pouvez saisir un numéro décimal ou hexadécimal avec le préfixe « 0x », mais nous afficherons le numéro en décimal." }, "networkStatus": { "message": "Statut du réseau" }, "networkStatusBaseFeeTooltip": { - "message": "Les frais de base sont fixés par le réseau et varient toutes les 13-14 secondes. Nos options $1 et $2 tiennent compte des augmentations soudaines.", + "message": "Les frais de base sont fixés par le réseau et varient toutes les 13-14 secondes. Nos options $1 et $2 tiennent compte des augmentations soudaines.", "description": "$1 and $2 are bold text for Medium and Aggressive respectively." }, "networkStatusPriorityFeeTooltip": { - "message": "Éventail de frais de priorité (aussi appelés « pourboire du mineur »). Ils sont versés aux mineurs et les incitent à accorder la priorité à votre transaction." + "message": "Éventail de frais de priorité (aussi appelés « pourboire du mineur »). Ils sont versés aux mineurs et les incitent à accorder la priorité à votre transaction." }, "networkStatusStabilityFeeTooltip": { - "message": "Le prix du carburant est de $1 au regard des 72 dernières heures.", + "message": "Le prix du carburant est de $1 au regard des 72 dernières heures.", "description": "$1 is networks stability value - stable, low, high" }, "networkURL": { @@ -2033,6 +2150,9 @@ "nevermind": { "message": "Abandonner" }, + "new": { + "message": "Nouveau !" + }, "newAccount": { "message": "Nouveau compte" }, @@ -2044,7 +2164,7 @@ "description": "Default name of next account to be created on create account screen" }, "newCollectibleAddedMessage": { - "message": "Le collectible a été ajouté avec succès !" + "message": "Le collectible a été ajouté avec succès !" }, "newContact": { "message": "Nouveau contact" @@ -2056,10 +2176,10 @@ "message": "Cela permet à MetaMask de détecter automatiquement les NFT d’OpenSea et de les afficher dans votre portefeuille." }, "newNFTsDetected": { - "message": "Nouveau ! Détection de NFT" + "message": "Nouveau ! Détection de NFT" }, "newNetworkAdded": { - "message": "« $1 » a été ajouté avec succès !" + "message": "« $1 » a été ajouté avec succès !" }, "newPassword": { "message": "Nouveau mot de passe (min 8 caractères)" @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "Jeton importé" }, - "newTotal": { - "message": "Nouveau total" - }, - "newTransactionFee": { - "message": "Coût de la nouvelle transaction" - }, "newValues": { "message": "nouvelles valeurs" }, @@ -2094,7 +2208,7 @@ "message": "NFT" }, "nftTokenIdPlaceholder": { - "message": "Saisissez l’ID du collectible" + "message": "Saisissez l’identifiant du jeton" }, "nfts": { "message": "NFT" @@ -2112,7 +2226,7 @@ "message": "Non, j’ai déjà une phrase mnémotechnique" }, "noConversionDateAvailable": { - "message": "Aucune date de conversion de devises disponible" + "message": "Aucune date de conversion des devises n'est disponible" }, "noConversionRateAvailable": { "message": "Aucun taux de conversion disponible" @@ -2154,10 +2268,10 @@ "message": "Pas occupé" }, "notCurrentAccount": { - "message": "S’agit-il du bon compte ? Il est différent de celui actuellement sélectionné dans votre portefeuille" + "message": "S’agit-il du bon compte ? Il est différent de celui actuellement sélectionné dans votre portefeuille" }, "notEnoughGas": { - "message": "Pas assez de carburant" + "message": "Pas assez de gaz" }, "notifications": { "message": "Notifications" @@ -2167,7 +2281,7 @@ "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." }, "notifications10DescriptionOne": { - "message": "Une détection améliorée des tokens est actuellement disponible sur les réseaux Ethereum Mainnet, Polygon, BSC et Avalanche. Il y aura bientôt d’autres nouveautés !" + "message": "Une détection améliorée des tokens est actuellement disponible sur les réseaux Ethereum Mainnet, Polygon, BSC et Avalanche. Il y aura bientôt d’autres nouveautés !" }, "notifications10DescriptionThree": { "message": "La fonction de détection des tokens est ACTIVÉE par défaut. Mais vous pouvez la désactiver dans les Paramètres." @@ -2188,27 +2302,44 @@ "message": "Activer le mode sombre" }, "notifications12Description": { - "message": "Le mode sombre est enfin disponible pour l’extension ! Pour changer le mode d'affichage, allez dans « Paramètres » -> « Expérimental » et sélectionnez l’une des options suivantes : Clair, Sombre, Système." + "message": "Le mode sombre est enfin disponible pour l’extension ! Pour changer le mode d'affichage, allez dans « Paramètres » > « Expérimental » et sélectionnez l’une des options suivantes : Clair, Sombre, Système." }, "notifications12Title": { - "message": "Mode sombre, quand ? Mode sombre maintenant ! 🕶️🦊" + "message": "Mode sombre, quand ? Mode sombre maintenant ! 🕶️🦊" }, "notifications13ActionText": { "message": "Afficher la liste des réseaux personnalisés" }, "notifications13Description": { - "message": "Vous pouvez maintenant ajouter facilement les réseaux personnalisés populaires suivants : Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm et Polygon ! Pour activer cette fonctionnalité, allez dans Paramètres -> Expérimental et activez « Afficher la liste des réseaux personnalisés » !", + "message": "Vous pouvez maintenant ajouter facilement les réseaux personnalisés populaires suivants : Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm et Polygon ! Pour activer cette fonctionnalité, allez dans Paramètres > Expérimental et activez « Afficher la liste des réseaux personnalisés » !", "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." }, "notifications13Title": { "message": "Ajouter des réseaux populaires" }, + "notifications14ActionText": { + "message": "Afficher les paramètres de sauvegarde" + }, + "notifications14Description": { + "message": "Nous allons abandonner notre fonction de données 3Box début octobre. Pour sauvegarder et restaurer votre portefeuille manuellement, utilisez le bouton « Sauvegarder maintenant » dans les Paramètres avancés.", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "Dépréciation de 3Box" + }, + "notifications15Description": { + "message": "Aucune action n’est requise de votre part – vous pouvez donc continuer à utiliser votre portefeuille comme d’habitude. Méfiez-vous néanmoins des éventuelles arnaques autour de la Fusion.", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "La fusion Ethereum est en marche !" + }, "notifications1Description": { "message": "Les utilisateurs de MetaMask Mobile peuvent désormais échanger des jetons dans leur portefeuille mobile. Scannez le code QR pour obtenir l’application mobile et commencez à échanger.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." }, "notifications1Title": { - "message": "Les swaps sur mobile sont enfin possibles !", + "message": "Les swaps sur mobile sont enfin possibles !", "description": "Title for a notification in the 'See What's New' popup. Tells users that they can now use MetaMask Swaps on Mobile." }, "notifications3ActionText": { @@ -2236,15 +2367,15 @@ "description": "Title for a notification in the 'See What's New' popup. Encourages users to do swaps on Binance Smart Chain." }, "notifications5Description": { - "message": "Votre « phrase mnémonique » devient votre « phrase secrète de récupération ».", + "message": "Votre « phrase mnémonique » devient votre « phrase secrète de récupération ».", "description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update." }, "notifications6DescriptionOne": { - "message": "Depuis la version 91 de Chrome, l’API qui permettait la prise en charge de notre Ledger (U2F) ne gère plus les portefeuilles matériels. MetaMask a donc mis en place un nouveau système de prise en charge de Ledger Live qui vous permet de continuer à vous connecter à votre appareil Ledger via l’application Ledger Live.", + "message": "Depuis la version 91 de Chrome, l’API qui permettait la prise en charge de notre Ledger (U2F) ne gère plus les portefeuilles matériels. MetaMask a donc mis en place un nouveau système de prise en charge de Ledger Live qui vous permet de continuer à vous connecter à votre appareil Ledger via l’application Ledger Live.", "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." }, "notifications6DescriptionThree": { - "message": "Lorsque vous interagissez avec votre compte Ledger dans MetaMask, un nouvel onglet s’ouvre et vous invite à ouvrir l’application Ledger Live. Une fois celle-ci lancée, vous devrez autoriser une connexion WebSocket à votre compte MetaMask. Et le tour est joué !", + "message": "Lorsque vous interagissez avec votre compte Ledger dans MetaMask, un nouvel onglet s’ouvre et vous invite à ouvrir l’application Ledger Live. Une fois celle-ci lancée, vous devrez autoriser une connexion WebSocket à votre compte MetaMask. Et le tour est joué !", "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." }, "notifications6DescriptionTwo": { @@ -2256,7 +2387,7 @@ "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" }, "notifications7DescriptionOne": { - "message": "MetaMask v10.1.0 inclut une nouvelle prise en charge des transactions EIP-1559 en cas d’utilisation d’appareils Ledger.", + "message": "MetaMask v10.1.0 inclut une nouvelle prise en charge des transactions EIP-1559 en cas d’utilisation d’appareils Ledger.", "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" }, "notifications7DescriptionTwo": { @@ -2268,15 +2399,15 @@ "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, "notifications8ActionText": { - "message": "Accédez aux Paramètres avancés", + "message": "Allez dans Paramètres > Avancés", "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": "Depuis MetaMask v10.4.0, vous n’avez plus besoin de Ledger Live pour connecter votre appareil Ledger à MetaMask.", + "message": "Depuis MetaMask v10.4.0, vous n’avez plus besoin de Ledger Live pour connecter votre appareil Ledger à MetaMask.", "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": { - "message": "Pour une expérience plus conviviale et plus stable, allez dans l’onglet des paramètres Avancés et changez « Type de connexion Ledger préféré » en « WebHID ».", + "message": "Pour améliorer votre expérience utilisateur, allez dans Paramètres > Avancés et changez le « Type de connexion préférée au Ledger » en « WebHID ».", "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." }, "notifications8Title": { @@ -2284,7 +2415,7 @@ "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." }, "notifications9DescriptionOne": { - "message": "Nous vous proposons désormais plus d’informations dans l’onglet « Données » lors de la confirmation des transactions de contrats intelligents." + "message": "Nous vous proposons désormais plus d’informations dans l’onglet « Données » lors de la confirmation des transactions de contrats intelligents." }, "notifications9DescriptionTwo": { "message": "Vous pouvez à présent mieux cerner les détails de votre transaction avant de la confirmer, et ajouter plus aisément les adresses des transactions à votre carnet d’adresses, ce qui vous aidera à prendre des décisions sûres et éclairées." @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "Marquer tout comme lu" }, + "numberOfNewTokensDetectedPlural": { + "message": "$1 nouveaux jetons trouvés dans ce compte", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "1 nouveau jeton trouvé dans ce compte" + }, "ofTextNofM": { "message": "de" }, @@ -2360,18 +2498,18 @@ "message": "2" }, "onboardingPinExtensionTitle": { - "message": "Votre installation de MetaMask est terminée !" + "message": "Votre installation de MetaMask est terminée !" }, "onboardingReturnNotice": { - "message": "« $1 » va fermer cet onglet et vous rediriger vers $2", + "message": "« $1 » va fermer cet onglet et vous rediriger vers $2", "description": "Return the user to the site that initiated onboarding" }, "onboardingShowIncomingTransactionsDescription": { - "message": "L’affichage des transactions entrantes dans votre portefeuille repose sur la communication avec $1. Etherscan aura accès à votre adresse Ethereum et à votre adresse IP. Voir $2.", + "message": "L’affichage des transactions entrantes dans votre portefeuille repose sur la communication avec $1. Etherscan aura accès à votre adresse Ethereum et à votre adresse IP. Voir $2.", "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." }, "onboardingUsePhishingDetectionDescription": { - "message": "Les alertes de détection d’hameçonnage reposent sur la communication avec $1. jsDeliver aura accès à votre adresse IP. Voir $2.", + "message": "Les alertes de détection d’hameçonnage reposent sur la communication avec $1. jsDeliver aura accès à votre adresse IP. Voir $2.", "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" }, "onlyAddTrustedNetworks": { @@ -2384,6 +2522,9 @@ "message": "Ouvrez MetaMask en mode plein écran pour connecter votre Ledger via WebHID.", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "Ouvrir dans l’explorateur de blocs" + }, "optional": { "message": "Facultatif" }, @@ -2421,7 +2562,7 @@ "message": "Ce mot de passe permet de déverrouiller votre portefeuille MetaMask uniquement sur cet appareil. MetaMask ne peut pas récupérer ce mot de passe." }, "passwordStrength": { - "message": "Robustesse du mot de passe : $1", + "message": "Robustesse du mot de passe : $1", "description": "Return password strength to the user when user wants to create password." }, "passwordStrengthDescription": { @@ -2444,10 +2585,10 @@ "message": "Cette transaction ne sera pas traitée tant que la précédente ne sera pas terminée." }, "pendingTransactionMultiple": { - "message": "Vous avez ($1) transactions en attente." + "message": "Vous avez ($1) transactions en attente." }, "pendingTransactionSingle": { - "message": "Vous avez (1) transaction en attente.", + "message": "Vous avez (1) transaction en attente.", "description": "$1 is count of pending transactions" }, "permissionRequest": { @@ -2456,6 +2597,12 @@ "permissionRequestCapitalized": { "message": "Demande d’autorisation" }, + "permissionRequested": { + "message": "Demandé maintenant" + }, + "permissionRevoked": { + "message": "Révoqué dans cette mise à jour" + }, "permission_accessNetwork": { "message": "Accéder à internet.", "description": "The description of the `endowment:network-access` permission." @@ -2476,9 +2623,13 @@ "message": "Fonctionner indéfiniment.", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "Contrôlez vos comptes et vos actifs sous $1 ($2).", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { - "message": "Contrôlez vos comptes et actifs « $1 ».", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "message": "Contrôlez vos comptes et actifs « $1 ».", + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "Stockez et gérez ses données sur votre appareil.", @@ -2488,10 +2639,18 @@ "message": "Afficher les notifications.", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "Récupérez et affichez les aperçus de transaction.", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { - "message": "Autorisation inconnue : $1", + "message": "Autorisation inconnue : $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "Consultez votre clé publique pour $1 ($2).", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "Autorisations" }, @@ -2508,8 +2667,11 @@ "popularCustomNetworks": { "message": "Réseaux personnalisés populaires" }, + "portfolioSite": { + "message": "Site du portefeuille" + }, "preferredLedgerConnectionType": { - "message": "Type de connexion Ledger préféré", + "message": "Type de connexion préférée au Ledger", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" }, "preparingSwap": { @@ -2568,7 +2730,7 @@ "message": "ajouté à nouveau" }, "readdToken": { - "message": "Vous pourrez ajouter à nouveau ce jeton en allant sur « Ajouter un jeton » dans le menu des options de votre compte." + "message": "Vous pourrez ajouter à nouveau ce jeton en allant sur « Ajouter un jeton » dans le menu des options de votre compte." }, "receive": { "message": "Recevoir" @@ -2586,13 +2748,13 @@ "message": "Commencez ici" }, "recoveryPhraseReminderConfirm": { - "message": "C’est compris !" + "message": "C’est compris !" }, "recoveryPhraseReminderHasBackedUp": { "message": "Conservez toujours votre phrase secrète de récupération dans un endroit sûr et secret" }, "recoveryPhraseReminderHasNotBackedUp": { - "message": "Vous avez besoin de sauvegarder à nouveau votre phrase secrète de récupération ?" + "message": "Vous avez besoin de sauvegarder à nouveau votre phrase secrète de récupération ?" }, "recoveryPhraseReminderItemOne": { "message": "Ne partagez jamais votre phrase secrète de récupération avec qui que ce soit" @@ -2613,7 +2775,7 @@ "message": "Rejeter" }, "rejectAll": { - "message": "Tout rejeter" + "message": "Refuser tout" }, "rejectTxsDescription": { "message": "Vous êtes sur le point de rejeter en groupe les transactions $1." @@ -2625,7 +2787,7 @@ "message": "Rejeté" }, "remember": { - "message": "Rappel :" + "message": "Rappel :" }, "remindMeLater": { "message": "Rappelez-moi plus tard" @@ -2646,7 +2808,7 @@ "message": "Supprimer le Snap" }, "removeSnapConfirmation": { - "message": "Voulez-vous vraiment supprimer $1 ?", + "message": "Voulez-vous vraiment supprimer $1 ?", "description": "$1 represents the name of the snap" }, "removeSnapDescription": { @@ -2665,7 +2827,7 @@ "message": "Reinitialiser" }, "resetAccount": { - "message": "Reinitialiser le compte" + "message": "Réinitialiser le compte" }, "resetAccountDescription": { "message": "La réinitialisation de votre compte effacera l’historique de vos transactions. Les soldes de vos comptes ne seront pas modifiés. Vous ne serez pas obligé de saisir à nouveau votre phrase secrète de récupération." @@ -2688,12 +2850,20 @@ "restore": { "message": "Restaurer" }, - "restoreWalletPreferences": { - "message": "Une sauvegarde de vos données de $1 a été trouvée. Voulez-vous restaurer vos préférences de portefeuille ?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "Impossible de restaurer vos données à partir du fichier fourni" + }, + "restoreSuccessful": { + "message": "Vos données ont été restaurées avec succès" + }, + "restoreUserData": { + "message": "Restaurer les données de l’utilisateur" + }, + "restoreUserDataDescription": { + "message": "Vous pouvez restaurer les paramètres de l’utilisateur qui contiennent les préférences et les adresses de compte à partir d’un fichier JSON précédemment sauvegardé." }, "retryTransaction": { - "message": "Réessayer la transaction" + "message": "Retenter la transaction" }, "reusedTokenNameWarning": { "message": "L’un de ces jetons réutilise le symbole d’un autre jeton que vous surveillez, ce qui peut être déroutant ou trompeur." @@ -2714,18 +2884,15 @@ "message": "Révéler la phrase mnémonique" }, "revokeAllTokensTitle": { - "message": "Révoquer l'autorisation d'accéder à tous vos $1 ?", + "message": "Révoquer l'autorisation d'accéder à tous vos $1 ?", "description": "$1 is the symbol of the token for which the user is revoking approval" }, "revokeApproveForAllDescription": { "message": "En révoquant cette autorisation, les $1 suivants ne pourront plus accéder à vos $2. ", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Réseau de test Rinkeby" - }, - "ropsten": { - "message": "Réseau de test Ropsten" + "revokeSpendingCapTooltipText": { + "message": "L’autre partie à ce contrat ne pourra plus dépenser vos jetons actuels ou futurs." }, "rpcUrl": { "message": "Nouvelle URL de RPC" @@ -2755,10 +2922,10 @@ "message": "Rechercher des comptes" }, "searchResults": { - "message": "Resultats de la recherche" + "message": "Résultats de la recherche" }, "searchSettings": { - "message": "Recherche dans les paramètres" + "message": "Rechercher dans les paramètres" }, "searchTokens": { "message": "Rechercher des jetons" @@ -2806,22 +2973,22 @@ "message": "Stocker dans un coffre-fort de banque." }, "seedPhraseIntroSidebarCopyOne": { - "message": "Votre phrase secrète de récupération est une formule de 12 mots qui constitue la « clé maîtresse » de votre portefeuille et de vos fonds" + "message": "Votre phrase secrète de récupération est une formule de 12 mots qui constitue la « clé maîtresse » de votre portefeuille et de vos fonds" }, "seedPhraseIntroSidebarCopyThree": { "message": "Si quelqu’un vous demande votre phrase de récupération, il est probable qu’il essaie de vous arnaquer pour dérober les fonds de votre portefeuille" }, "seedPhraseIntroSidebarCopyTwo": { - "message": "Ne partagez jamais, au grand jamais, votre phrase secrète de récupération, pas même avec MetaMask !" + "message": "Ne partagez jamais, au grand jamais, votre phrase secrète de récupération, pas même avec MetaMask !" }, "seedPhraseIntroSidebarTitleOne": { - "message": "Qu’est-ce qu’une phrase secrète de récupération ?" + "message": "Qu’est-ce qu’une phrase secrète de récupération ?" }, "seedPhraseIntroSidebarTitleThree": { - "message": "Dois-je partager ma phrase secrète de récupération ?" + "message": "Dois-je partager ma phrase secrète de récupération ?" }, "seedPhraseIntroSidebarTitleTwo": { - "message": "Comment puis-je sauvegarder ma phrase secrète de récupération ?" + "message": "Comment puis-je sauvegarder ma phrase secrète de récupération ?" }, "seedPhraseIntroTitle": { "message": "Sécuriser votre portefeuille" @@ -2833,14 +3000,11 @@ "message": "Les phrases secrètes de récupération sont composées de 12, 15, 18, 21 ou 24 mots" }, "seedPhraseWriteDownDetails": { - "message": "Notez cette phrase secrète de récupération de 12 mots et stockez-la dans un endroit de confiance où vous seul avez accès." + "message": "Notez cette phrase secrète de récupération de 12 mots et stockez-la dans un endroit de confiance où vous seul avez accès." }, "seedPhraseWriteDownHeader": { "message": "Notez votre phrase secrète de récupération" }, - "selectAHigherGasFee": { - "message": "Choisissez des frais de carburant plus élevés pour accélérer le traitement de votre transaction*." - }, "selectAccounts": { "message": "Sélectionnez le(s) compte(s) à utiliser sur ce site" }, @@ -2874,9 +3038,6 @@ "send": { "message": "Envoyer" }, - "sendAmount": { - "message": "Envoyer le montant" - }, "sendBugReport": { "message": "Envoyez-nous un rapport de bogue." }, @@ -2898,9 +3059,12 @@ "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, "sendingToTokenContractWarning": { - "message": "Attention : vous êtes sur le point d'envoyer des jetons à l'adresse d'un contrat de jetons qui pourrait entraîner une perte de fonds. $1", + "message": "Attention : vous êtes sur le point d'envoyer des jetons à l'adresse d'un contrat de jetons qui pourrait entraîner une perte de fonds. $1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "Réseau de test Sepolia" + }, "setAdvancedPrivacySettings": { "message": "Définir des paramètres de confidentialité avancés" }, @@ -2933,14 +3097,8 @@ "showAdvancedGasInlineDescription": { "message": "Sélectionnez cette option pour afficher le prix du carburant et les contrôles des limites directement sur les écrans d’envoi et de confirmation." }, - "showCustomNetworkList": { - "message": "Afficher la liste des réseaux personnalisés" - }, - "showCustomNetworkListDescription": { - "message": "Sélectionnez cette option pour afficher une liste de réseaux dont l’adresse est préremplie lorsque vous ajoutez un nouveau réseau." - }, "showFiatConversionInTestnets": { - "message": "Afficher la conversion sur Testnets" + "message": "Afficher la conversion sur les testnets" }, "showFiatConversionInTestnetsDescription": { "message": "Sélectionnez cette option pour afficher la conversion des monnaies fiduciaires sur Testnets." @@ -2993,6 +3151,9 @@ "signed": { "message": "Signé" }, + "signin": { + "message": "Connexion" + }, "simulationErrorMessageV2": { "message": "Nous n’avons pas pu estimer le prix de carburant. Par conséquent, il se peut qu’il y ait une erreur dans le contrat et que cette transaction échoue." }, @@ -3000,41 +3161,62 @@ "message": "Ignorer" }, "skipAccountSecurity": { - "message": "Renoncer à la sécurité des comptes ?" + "message": "Sauter le réglage des paramètres de sécurité du compte ?" }, "skipAccountSecurityDetails": { "message": "Je suis conscient(e) que tant que je n’aurai pas sauvegardé ma phrase secrète de récupération, je risque de perdre mes comptes et tous leurs actifs." }, - "slow": { - "message": "Lente" - }, "smartTransaction": { "message": "Transaction intelligente" }, "snapAccess": { - "message": "Le snap $1 peut accéder à :", + "message": "Le snap $1 peut accéder à :", "description": "$1 represents the name of the snap" }, "snapAdded": { "message": "Ajouté le $1 à partir de $2", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { - "message": "Erreur de snap : « $1 ». Code d’erreur : « $2 »", + "message": "Erreur de snap : « $1 ». Code d’erreur : « $2 »", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." }, "snapInstall": { "message": "Installer Snap" }, "snapInstallWarningCheck": { - "message": "Pour confirmer que vous comprenez, cochez tout." + "message": "Cochez la case pour confirmer que vous avez compris." + }, + "snapInstallWarningCheckPlural": { + "message": "Veuillez confirmer que vous avez bien compris en cochant toutes les cases." + }, + "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.", + "description": "The first parameter is the name of the snap and the second one is the protocol" }, "snapRequestsPermission": { - "message": "Ce snap demande les autorisations suivantes :" + "message": "Ce snap demande les autorisations suivantes :" + }, + "snapUpdate": { + "message": "Mettre à jour Snap" + }, + "snapUpdateExplanation": { + "message": "$1 a besoin d'une version plus récente de votre snap.", + "description": "$1 is the dapp that is requesting an update to the snap." }, "snaps": { "message": "Snaps" }, + "snapsInsightLoading": { + "message": "Chargement de l’aperçu de transaction…" + }, + "snapsNoInsight": { + "message": "Le snap n’a renvoyé aucun aperçu" + }, "snapsSettingsDescription": { "message": "Gérez vos Snaps" }, @@ -3060,7 +3242,7 @@ "message": "Accélérer cette annulation" }, "speedUpExplanation": { - "message": "Nous avons mis à jour le prix du carburant selon les conditions actuelles du réseau et l’avons augmenté d’au moins 10 % (requis par le réseau)." + "message": "Nous avons mis à jour le prix du carburant selon les conditions actuelles du réseau et l’avons augmenté d’au moins 10 % (requis par le réseau)." }, "speedUpPopoverTitle": { "message": "Accélérer la transaction" @@ -3078,7 +3260,7 @@ "message": "Limite de dépenses insuffisante" }, "spendLimitInvalid": { - "message": "Limite de dépenses invalide ; cela doit être une valeur positive" + "message": "Limite de dépenses invalide ; cela doit être une valeur positive" }, "spendLimitPermission": { "message": "Autorisation de limite de dépenses" @@ -3091,11 +3273,11 @@ "message": "Limite de dépenses trop élevée" }, "srpInputNumberOfWords": { - "message": "J’ai une phrase de $1 mots", + "message": "J’ai une phrase de $1 mots", "description": "This is the text for each option in the dropdown where a user selects how many words their secret recovery phrase has during import. The $1 is the number of words (either 12, 15, 18, 21, or 24)." }, "srpPasteFailedTooManyWords": { - "message": "Le collage a échoué parce que la phrase contenait plus de 24 mots. Une phrase secrète de récupération peut contenir un maximum de 24 mots.", + "message": "Le collage a échoué parce que la phrase contenait plus de 24 mots. Une phrase secrète de récupération peut contenir un maximum de 24 mots.", "description": "Description of SRP paste erorr when the pasted content has too many words" }, "srpPasteTip": { @@ -3124,10 +3306,10 @@ "message": "Erreur lors du chargement des journaux d’état." }, "stateLogFileName": { - "message": "Journaux d’état MetaMask" + "message": "Journaux d'événements de MetaMask" }, "stateLogs": { - "message": "Journaux d’état" + "message": "Journaux d'événements" }, "stateLogsDescription": { "message": "Les journaux d’état contiennent les adresses publiques de vos comptes et vos transactions envoyées." @@ -3145,7 +3327,7 @@ "message": "Assurez-vous que votre Lattice1 est prêt à se connecter" }, "step1LatticeWalletMsg": { - "message": "Vous pouvez connecter MetaMask à votre dispositif Lattice1 une fois qu’il est configuré et en ligne. Déverrouillez votre appareil et munissez-vous de son ID. Pour en savoir plus sur l’utilisation des portefeuilles matériels, $1", + "message": "Vous pouvez connecter MetaMask à votre dispositif Lattice1 une fois qu’il est configuré et en ligne. Déverrouillez votre appareil et munissez-vous de son ID. Pour en savoir plus sur l’utilisation des portefeuilles matériels, $1", "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" }, "step1LedgerWallet": { @@ -3179,7 +3361,7 @@ "message": "Robuste" }, "stxAreHere": { - "message": "Les transactions intelligentes sont là !" + "message": "Les transactions intelligentes sont là !" }, "stxBenefit1": { "message": "Minimise les frais de transaction" @@ -3197,13 +3379,13 @@ "message": "Le swap aurait échoué" }, "stxCancelledDescription": { - "message": "Votre transaction aurait échoué et a été annulée pour vous protéger des gas fees inutiles." + "message": "Votre transaction aurait échoué et a été annulée pour vous éviter de payer inutilement des frais de transaction." }, "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 à :" + "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." @@ -3234,7 +3416,7 @@ "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 s’assurer de la réussite de votre swap." }, "stxSuccess": { - "message": "Swap terminé !" + "message": "Swap terminé !" }, "stxSuccessDescription": { "message": "Votre $1 est maintenant disponible.", @@ -3266,7 +3448,7 @@ "message": "Swap annulé" }, "stxUserCancelledDescription": { - "message": "Votre transaction a été annulée et vous n’avez pas payé inutilement de gas fees." + "message": "Votre transaction a été annulée et vous avez évité ainsi de payer inutilement des frais de transaction." }, "stxYouCanOptOut": { "message": "Vous pouvez vous désinscrire dans les paramètres avancés à tout moment." @@ -3304,7 +3486,7 @@ "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." }, "swapApproveNeedMoreTokens": { - "message": "Vous avez besoin de $1 $2 de plus pour effectuer ce swap", + "message": "Vous avez besoin de $1 $2 de plus pour effectuer ce 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." }, "swapApproveNeedMoreTokensSmartTransactions": { @@ -3323,7 +3505,7 @@ "message": "Confirmez avec votre portefeuille matériel" }, "swapContractDataDisabledErrorDescription": { - "message": "Dans l’application Ethereum de votre Ledger, allez dans « Paramètres » et autorisez les données de contrat. Ensuite, retentez votre swap." + "message": "Dans l’application Ethereum de votre Ledger, allez dans « Paramètres » et autorisez les données de contrat. Ensuite, retentez votre swap." }, "swapContractDataDisabledErrorTitle": { "message": "Les données de contrat ne sont pas activées sur votre Ledger" @@ -3398,7 +3580,7 @@ "message": "Le montant du glissement est très élevé." }, "swapIncludesMMFee": { - "message": "Comprend des frais MetaMask à hauteur de $1 %.", + "message": "Comprend des frais MetaMask à hauteur de $1 %.", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, "swapLowSlippageError": { @@ -3411,11 +3593,11 @@ "message": "Frais MetaMask" }, "swapMetaMaskFeeDescription": { - "message": "Nous recherchons systématiquement le meilleur prix auprès des meilleures sources de liquidité. Une commission de $1 % est automatiquement incluse dans cette cotation.", + "message": "Nous recherchons systématiquement le meilleur prix auprès des meilleures sources de liquidité. Une commission de $1 % est automatiquement incluse dans cette cotation.", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, "swapNQuotesWithDot": { - "message": "$1 cotations.", + "message": "$1 cotations.", "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" }, "swapNewQuoteIn": { @@ -3427,7 +3609,7 @@ "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." }, "swapPriceDifference": { - "message": "Vous êtes sur le point d’effectuer un swap de $1 $2 (~$3) contre $4 $5 (~$6).", + "message": "Vous êtes sur le point d’effectuer un swap de $1 $2 (~$3) contre $4 $5 (~$6).", "description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts." }, "swapPriceDifferenceTitle": { @@ -3479,6 +3661,9 @@ "swapReviewSwap": { "message": "Vérifier le swap" }, + "swapSearchNameOrAddress": { + "message": "Rechercher le nom ou coller l’adresse" + }, "swapSelect": { "message": "Sélectionner" }, @@ -3498,6 +3683,9 @@ "message": "$1 %", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "Si le prix fluctue entre le moment où vous placez un ordre et le moment où il est exécuté, on parle alors d’un « effet de glissement » ou « slippage ». Votre swap sera automatiquement annulé si ce phénomène dépasse le « seuil de glissement toléré » que vous avez fixé." + }, "swapSource": { "message": "Source de liquidité" }, @@ -3542,21 +3730,21 @@ "description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover." }, "swapTokenVerificationOnlyOneSource": { - "message": "Vérification effectuée uniquement sur 1 source." + "message": "Vérification effectuée uniquement sur 1 source." }, "swapTokenVerificationSources": { - "message": "Vérification effectuée sur $1 sources.", + "message": "Vérification effectuée sur $1 sources.", "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." }, "swapTooManyDecimalsError": { - "message": "$1 accepte jusqu’à $2 décimales", + "message": "$1 accepte jusqu’à $2 décimales", "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" }, "swapTransactionComplete": { "message": "Transaction terminée" }, "swapTwoTransactions": { - "message": "2 transactions" + "message": "2 transactions" }, "swapUnknown": { "message": "Inconnu" @@ -3566,20 +3754,20 @@ "description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network." }, "swapYourTokenBalance": { - "message": "$1 $2 disponibles pour un swap", + "message": "$1 $2 disponibles pour un swap", "description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol" }, "swapZeroSlippage": { - "message": "0 % de glissement" + "message": "0 % de glissement" }, "swapsAdvancedOptions": { "message": "Options avancées" }, "swapsExcessiveSlippageWarning": { - "message": "Le montant du glissement est trop élevé et donnera lieu à un mauvais taux. Veuillez réduire votre tolérance de glissement à une valeur inférieure à 15 %." + "message": "Le montant du glissement est trop élevé et donnera lieu à un mauvais taux. Veuillez réduire votre tolérance de glissement à une valeur inférieure à 15 %." }, "swapsMaxSlippage": { - "message": "Tolérance de glissement" + "message": "Tolérance au slippage" }, "swapsNotEnoughForTx": { "message": "Pas assez de $1 pour effectuer cette transaction", @@ -3589,10 +3777,10 @@ "message": "Afficher dans l’activité" }, "switchEthereumChainConfirmationDescription": { - "message": "Ceci permet de remplacer le réseau sélectionné dans MetaMask par un réseau précédemment ajouté :" + "message": "Ceci permet de remplacer le réseau sélectionné dans MetaMask par un réseau précédemment ajouté :" }, "switchEthereumChainConfirmationTitle": { - "message": "Autoriser ce site à changer de réseau ?" + "message": "Autoriser ce site à changer de réseau ?" }, "switchNetwork": { "message": "Changer de réseau" @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "Basculer vers ce compte" }, + "switchedTo": { + "message": "Vous êtes passé à" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "Le changement de réseau annulera toutes les confirmations en attente" }, @@ -3632,7 +3823,7 @@ "message": "Vos données ont été synchronisées avec succès. Profitez de l’application mobile MetaMask !" }, "syncWithMobileDesc": { - "message": "Vous pouvez synchroniser vos comptes et vos informations avec votre appareil mobile. Ouvrez l’application mobile MetaMask, allez dans « Paramètres » et appuyez sur « Synchroniser depuis l’extension de navigateur »" + "message": "Vous pouvez synchroniser vos comptes et vos informations avec votre appareil mobile. Ouvrez l’application mobile MetaMask, allez dans « Paramètres » et appuyez sur « Synchroniser depuis l’extension de navigateur »" }, "syncWithMobileDescNewUsers": { "message": "Si vous ouvrez l’application MetaMask Mobile pour la première fois, suivez simplement les étapes dans votre téléphone." @@ -3643,17 +3834,8 @@ "syncWithMobileTitle": { "message": "Synchroniser avec le mobile" }, - "syncWithThreeBox": { - "message": "Synchronisation des données avec 3Box (expérimental)" - }, - "syncWithThreeBoxDescription": { - "message": "Activez cette fonction pour que vos paramètres soient sauvegardés avec 3Box. Cette fonction est actuellement expérimentale ; utilisez-la avec prudence." - }, - "syncWithThreeBoxDisabled": { - "message": "3Box a été désactivé en raison d’une erreur lors de la synchronisation initiale" - }, "tenPercentIncreased": { - "message": "Augmentation de 10 %" + "message": "Augmentation de 10 %" }, "terms": { "message": "Conditions d’utilisation" @@ -3662,7 +3844,7 @@ "message": "Conditions de service" }, "testFaucet": { - "message": "Faucet Testnet" + "message": "Faucet testnet" }, "testNetworks": { "message": "Réseaux de test" @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "Choisissez votre thème MetaMask préféré." }, + "thingsToKeep": { + "message": "Les choses que vous devez garder à l’esprit :" + }, "thisWillCreate": { "message": "Cela créera un nouveau portefeuille et une nouvelle phrase mnémotechnique" }, @@ -3686,7 +3871,7 @@ "message": "Destinataire" }, "toAddress": { - "message": "Vers : $1", + "message": "Vers : $1", "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" }, "toggleTestNetworks": { @@ -3709,16 +3894,25 @@ "message": "Décimale de jeton requise." }, "tokenDecimalTitle": { - "message": "Décimales du token :" + "message": "Nombre de décimales du token :" }, "tokenDetails": { "message": "Détails du token" }, + "tokenFoundTitle": { + "message": "1 nouveau jeton trouvé" + }, "tokenId": { "message": "ID de token" }, "tokenList": { - "message": "Listes de tokens :" + "message": "Listes de tokens :" + }, + "tokenScamSecurityRisk": { + "message": "les arnaques et les risques de piratage informatique" + }, + "tokenShowUp": { + "message": "Vos tokens n’apparaîtront peut-être pas automatiquement dans votre portefeuille." }, "tokenSymbol": { "message": "Symbole du jeton" @@ -3785,7 +3979,7 @@ "message": "Montant + frais de carburant" }, "transactionDetailLayer2GasHeading": { - "message": "Frais de carburant de couche 2 (L2)" + "message": "Frais de carburant de couche 2 (L2)" }, "transactionDetailMultiLayerTotalSubtitle": { "message": "Montant + frais" @@ -3809,22 +4003,22 @@ "message": "Frais de base (GWEI)" }, "transactionHistoryL1GasLabel": { - "message": "Total des frais de carburant L 1" + "message": "Total des frais de transaction L1" }, "transactionHistoryL2GasLimitLabel": { - "message": "Limite de carburant L2" + "message": "Montant maximal des frais de transaction L2" }, "transactionHistoryL2GasPriceLabel": { - "message": "Prix de carburant L2" + "message": "Prix du gaz L2" }, "transactionHistoryMaxFeePerGas": { - "message": "Frais maximaux par carburant" + "message": "Frais maximaux par unité de gaz" }, "transactionHistoryPriorityFee": { "message": "Frais de priorité (GWEI)" }, "transactionHistoryTotalGasFee": { - "message": "Total des frais de carburant" + "message": "Total des frais de transaction" }, "transactionResubmitted": { "message": "La transaction a été soumise à nouveau avec une augmentation du prix du gaz, désormais de $1 à $2" @@ -3842,7 +4036,7 @@ "message": "Transfert entre mes comptes" }, "transferFrom": { - "message": "Transfert Depuis" + "message": "Transfert depuis" }, "troubleConnectingToWallet": { "message": "Nous avons eu des difficultés à nous connecter à votre $1. Essayez de vérifier votre $2 et réessayez.", @@ -3861,11 +4055,14 @@ "tryAgain": { "message": "Réessayez" }, + "tryOur": { + "message": "Essayez notre" + }, "turnOnTokenDetection": { "message": "Activer la détection améliorée des jetons" }, "twelveHrTitle": { - "message": "12 h :" + "message": "12 h :" }, "txInsightsNotSupported": { "message": "Les aperçus de transaction ne sont pas pris en charge pour ce contrat à l’heure actuelle." @@ -3902,7 +4099,7 @@ "message": "Réseau privé inconnu" }, "unknownQrCode": { - "message": "Erreur : nous n’avons pas pu identifier le code QR" + "message": "Erreur : nous n’avons pas pu identifier le code QR" }, "unlimited": { "message": "Illimité" @@ -3914,9 +4111,13 @@ "message": "Le web décentralisé vous attend" }, "unrecognizedChain": { - "message": "Ce réseau personnalisé n’est pas reconnu. Nous vous recommandons de $1 avant de continuer", + "message": "Ce réseau personnalisé n’est pas reconnu", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (protocole inconnu)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "L’envoi de jetons collectibles (ERC-721) n’est pas pris en charge actuellement", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -3940,10 +4141,10 @@ "message": "Détection automatique des NFT" }, "useCollectibleDetectionDescription": { - "message": "L’affichage des médias et des données des NFT peut exposer votre adresse IP à des serveurs centralisés. Des API tierces (comme OpenSea) sont utilisées pour détecter les NFT dans votre portefeuille. Cela expose donc l’adresse de votre compte à ces services. Désactivez cette option si vous ne souhaitez pas que l’application récupère des données auprès de ces services." + "message": "L’affichage des médias et des données des NFT peut exposer votre adresse IP à des serveurs centralisés. Des API tierces (comme OpenSea) sont utilisées pour détecter les NFT dans votre portefeuille. Cela expose donc l’adresse de votre compte à ces services. Désactivez cette option si vous ne souhaitez pas que l’application récupère des données auprès de ces services." }, "usePhishingDetection": { - "message": "Utiliser la fonction antihameçonnage" + "message": "Utiliser la fonction anti-hameçonnage" }, "usePhishingDetectionDescription": { "message": "Cela permet d’afficher un avertissement pour les domaines d’hameçonnage ciblant les utilisateurs d’Ethereum" @@ -3970,7 +4171,7 @@ "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" }, "viewAccount": { - "message": "Afficher le compte" + "message": "Voir le compte" }, "viewAllDetails": { "message": "Afficher tous les détails" @@ -3999,7 +4200,7 @@ "message": "Afficher sur Opensea" }, "viewinExplorer": { - "message": "Afficher $1 sur Opensea", + "message": "Voir $1 dans l'explorateur", "description": "$1 is the action type. e.g (Account, Transaction, Swap)" }, "visitWebSite": { @@ -4009,7 +4210,7 @@ "message": "notre guide de connexion des portefeuilles matériels" }, "walletCreationSuccessDetail": { - "message": "Votre portefeuille est bien protégé. Conservez votre phrase secrète de récupération en sécurité et en toute discrétion. C’est votre responsabilité !" + "message": "Votre portefeuille est bien protégé. Conservez votre phrase secrète de récupération en sécurité et en toute discrétion. C’est votre responsabilité !" }, "walletCreationSuccessReminder1": { "message": "MetaMask ne peut pas restaurer votre phrase secrète de récupération." @@ -4034,11 +4235,15 @@ "warning": { "message": "Avertissement" }, + "warningTooltipText": { + "message": "$1 L’autre partie au contrat peut dépenser la totalité de votre solde de jetons sans préavis et sans demander votre consentement. Protégez-vous en abaissant le plafond des dépenses.", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "Faible" }, "web3ShimUsageNotification": { - "message": "Nous avons remarqué que ce site Web a essayé d’utiliser l’API window.web3 supprimée. Si le site semble être défectueux, veuillez cliquer sur $1 pour plus d’informations.", + "message": "Nous avons remarqué que ce site Web a essayé d’utiliser l’API window.web3 supprimée. Si le site semble être défectueux, veuillez cliquer sur $1 pour plus d’informations.", "description": "$1 is a clickable link." }, "webhid": { @@ -4049,7 +4254,7 @@ "message": "Bienvenue dans MetaMask" }, "welcomeBack": { - "message": "Bienvenue à nouveau !" + "message": "Nous sommes heureux de vous revoir !" }, "welcomeExploreDescription": { "message": "Stockez, envoyez et dépensez des cryptomonnaies et des actifs." @@ -4058,13 +4263,13 @@ "message": "Explorer des applications décentralisées" }, "welcomeLoginDescription": { - "message": "Utilisez votre MetaMask pour vous connecter à des applications décentralisées. Nul besoin de vous inscrire !" + "message": "Utilisez votre MetaMask pour vous connecter à des applications décentralisées. Nul besoin de vous inscrire !" }, "welcomeLoginTitle": { "message": "Dites bonjour à votre portefeuille" }, "welcomeToMetaMask": { - "message": "C’est parti !" + "message": "C’est parti !" }, "welcomeToMetaMaskIntro": { "message": "MetaMask est un portefeuille sécurisé utilisé par des millions de personnes qui rend l’univers du web3 accessible à toutes et à tous." @@ -4074,7 +4279,7 @@ "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." }, "whatsThis": { - "message": "Qu’est-ce que c’est ?" + "message": "Qu’est-ce que c’est ?" }, "writePhrase": { "message": "Écrivez cette phrase sur une feuille de papier et rangez-la dans un endroit sûr. Si vous recherchez plus de sécurité, notez-la sur plusieurs feuilles de papier et rangez-les dans deux ou trois endroits différents." diff --git a/app/_locales/gu/messages.json b/app/_locales/gu/messages.json index 4dc737d9e018..ec63f90631b5 100644 --- a/app/_locales/gu/messages.json +++ b/app/_locales/gu/messages.json @@ -136,9 +136,6 @@ "settings": { "message": "સેટિંગ્સ" }, - "slow": { - "message": "ધીમું" - }, "tryAgain": { "message": "ફરી પ્રયાસ કરો" }, diff --git a/app/_locales/he/messages.json b/app/_locales/he/messages.json index 9bfd09d99abe..4ea03d383a5d 100644 --- a/app/_locales/he/messages.json +++ b/app/_locales/he/messages.json @@ -8,9 +8,6 @@ "about": { "message": "מידע כללי" }, - "acceleratingATransaction": { - "message": "* האצת עסקה על ידי שימוש במחיר דלק גבוה יותר מגדילה את סיכוייה לעבור עיבוד מהיר יותר ע\"י הרשת, אך זה לא תמיד מובטח." - }, "accessingYourCamera": { "message": "ניגש למצלמה שלך ..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "מתחבר ל-Goerli Test Network" }, - "connectingToKovan": { - "message": "מתחבר ל-Kovan Test Network" - }, "connectingToMainnet": { "message": "מתחבר לרשת אתריום הראשית" }, - "connectingToRinkeby": { - "message": "מתחבר ל- Rinkeby Test Network " - }, - "connectingToRopsten": { - "message": "מתחבר אל רשת בדיקה Ropsten " - }, "continueToWyre": { "message": "המשך ל-Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "מתקדם" }, - "customGas": { - "message": "התאמה אישית של דלק" - }, - "customGasSubTitle": { - "message": "הגדלת התשלום עשויה לצמצם את זמני העיבוד, אבל אין ערובה לכך." - }, "customToken": { "message": "אסימון מותאם אישית" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "יש להזין ססמה כדי להמשיך" }, - "estimatedProcessingTimes": { - "message": "זמני עיבוד משוערים" - }, "ethereumPublicAddress": { "message": "כתובת אתריום ציבורית" }, @@ -503,9 +482,6 @@ "knownAddressRecipient": { "message": "כתובת חוזה ידועה." }, - "kovan": { - "message": "רשת בדיקה Kovan " - }, "learnMore": { "message": "למדו עוד" }, @@ -601,12 +577,6 @@ "newToMetaMask": { "message": "חדש/ה ב- MetaMask?" }, - "newTotal": { - "message": "סכום כולל חדש" - }, - "newTransactionFee": { - "message": "עמלת עסקה חדשה" - }, "next": { "message": "הבא" }, @@ -765,9 +735,6 @@ "revealSeedWordsWarningTitle": { "message": "אין לשתף צירוף מילים זה עם אף אחד!" }, - "rinkeby": { - "message": "רשת בדיקה Rinkeby " - }, "rpcUrl": { "message": "כתובת URL חדשה של RPC" }, @@ -804,9 +771,6 @@ "seedPhraseReq": { "message": "צירופי גרעין מורכבים מ-12 מילים" }, - "selectAHigherGasFee": { - "message": "בחר/י בעמלת דלק גבוהה יותר כדי להאיץ את עיבוד העסקה שלך. *" - }, "selectAnAccount": { "message": "בחר חשבון" }, @@ -825,9 +789,6 @@ "send": { "message": "שלח" }, - "sendAmount": { - "message": "שלח סכום" - }, "sendTokens": { "message": "שלח טוקנים" }, @@ -870,9 +831,6 @@ "signed": { "message": "חתום" }, - "slow": { - "message": "אטי" - }, "somethingWentWrong": { "message": "אופס! משהו השתבש." }, diff --git a/app/_locales/hi/messages.json b/app/_locales/hi/messages.json index 7124213a504c..21bf38605f70 100644 --- a/app/_locales/hi/messages.json +++ b/app/_locales/hi/messages.json @@ -18,7 +18,7 @@ "message": "अपने वॉलेट से साइन करने के बाद, हस्ताक्षर लेने के लिए 'हस्ताक्षर प्राप्त करें' पर क्लिक करें" }, "QRHardwareSignRequestGetSignature": { - "message": "हस्ताक्षर प्राप्त करें" + "message": "हस्ताक्षर पाएं" }, "QRHardwareSignRequestSubtitle": { "message": "अपने वॉलेट से QR कोड को स्कैन करें" @@ -42,14 +42,61 @@ "message": "QR-आधारित HW वॉलेट" }, "QRHardwareWalletSteps2Description": { - "message": "एयरगैप वॉल्ट और Ngrave (जल्द आ रहा है)" + "message": "Ngrave (जल्द आ रहा है)" + }, + "SIWEAddressInvalid": { + "message": "साइन-इन अनुरोध का पता उस अकाउंट के पते से मेल नहीं खाता जिसका उपयोग आप साइन इन करने के लिए कर रहे हैं।" + }, + "SIWEDomainWarningBody": { + "message": "वेबसाइट ($1) आपसे गलत डोमेन में साइन इन करने के लिए कह रही है। यह एक फिशिंग अटैक हो सकता है।", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "चेन ID:" + }, + "SIWELabelExpirationTime": { + "message": "पर समाप्त होगा:" + }, + "SIWELabelIssuedAt": { + "message": "जारी किया गया:" + }, + "SIWELabelMessage": { + "message": "संदेश:" + }, + "SIWELabelNonce": { + "message": "अस्थायी रूप से:" + }, + "SIWELabelNotBefore": { + "message": "इससे पहले नहीं:" + }, + "SIWELabelRequestID": { + "message": "अनुरोध ID:" + }, + "SIWELabelResources": { + "message": "संसाधन: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "संस्करण:" + }, + "SIWESiteRequestSubtitle": { + "message": "ये साइट इसके साथ साइन इन करने के लिए अनुरोध कर रही है" + }, + "SIWESiteRequestTitle": { + "message": "साइन-इन अनुरोध" + }, + "SIWEWarningSubtitle": { + "message": "यह पुष्टि करने के लिए कि आप समझ गए हैं, जाँच करें:" + }, + "SIWEWarningTitle": { + "message": "क्या आपको यकीन है?" }, "about": { "message": "इसके बारे में" }, - "acceleratingATransaction": { - "message": "* गैस की उच्च कीमत का उपयोग करके लेनदेन में तेज़ी लाने से नेटवर्क द्वारा तेज़ी से संसाधित होने की संभावना बढ़ जाती है, लेकिन हमेशा इसकी गारंटी नहीं होती है।" - }, "acceptTermsOfUse": { "message": "मैंने $1 पढ़ लिया है और मैं सहमत हूं", "description": "$1 is the `terms` message" @@ -82,14 +129,14 @@ "message": "अकाउंट आइडेंटिकॉन" }, "accountName": { - "message": "खाते का नाम" + "message": "अकाउंट का नाम" }, "accountNameDuplicate": { "message": "इस अकाउंट का नाम पहले से हीं मौजूद है", "description": "This is an error message shown when the user enters a new account name that matches an existing account name" }, "accountOptions": { - "message": "खाता विकल्प" + "message": "अकाउंट विकल्प" }, "accountSelectionRequired": { "message": "आपको एक खाते का चयन करने की आवश्यकता है!" @@ -121,6 +168,9 @@ "addAlias": { "message": "उपनाम जोड़ें" }, + "addBlockExplorer": { + "message": "ब्लॉक एक्सप्लोरर जोड़ें" + }, "addContact": { "message": "संपर्क जोड़ें" }, @@ -209,9 +259,6 @@ "airgapVault": { "message": "AirGap का वॉल्ट" }, - "airgapVaultTutorial": { - "message": " (ट्यूटोरियल्स)" - }, "alertDisableTooltip": { "message": "इसे \"सेटिंग > अलर्ट\" में बदला जा सकता है" }, @@ -275,7 +322,10 @@ "description": "$1 is the symbol of the token for which the user is granting approval" }, "approveAndInstall": { - "message": "स्वीकृति दें और इंस्टॉल करें" + "message": "स्वीकृत और इंस्टॉल करें" + }, + "approveAndUpdate": { + "message": "स्वीकृत और अपडेट करें" }, "approveButtonText": { "message": "अनुमोदित करें" @@ -293,6 +343,10 @@ "approvedAsset": { "message": "स्वीकृत एसेट" }, + "approvedOn": { + "message": "$1 पर स्वीकृत किया गया", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "क्या आप सुनिश्चित हैं?" }, @@ -305,6 +359,9 @@ "assets": { "message": "परिसंपत्तियां" }, + "attemptSendingAssets": { + "message": "यदि आप ऐसेट्स को सीधे एक नेटवर्क से दूसरे नेटवर्क पर भेजने का प्रयास करते हैं, तो इसके परिणामस्वरूप स्थायी ऐसेट्स का नुकसान हो सकता है। ब्रिज का उपयोग करना सुनिश्चित करें।" + }, "attemptToCancel": { "message": "रद्द करने का प्रयास?" }, @@ -335,6 +392,9 @@ "backToAll": { "message": "सभी पर वापस" }, + "backup": { + "message": "बैकअप" + }, "backupApprovalInfo": { "message": "यदि आप अपना डिवाइस खो देते हैं, अपना पासवर्ड भूल जाते हैं, MetaMask को फिर से स्थापित करना हो या दूसरे डिवाइस पर अपने वॉलेट तक पहुंचना चाहते हों, तो आपके वॉलेट को पुनर्प्राप्त करने के लिए यह गुप्त कोड आवश्यक है।" }, @@ -344,6 +404,12 @@ "backupNow": { "message": "अभी बैकअप लें" }, + "backupUserData": { + "message": "अपने डेटा का बैकअप लें" + }, + "backupUserDataDescription": { + "message": "आप एक JSON फ़ाइल में वरीयताएँ और अकाउंट एड्रेस वाली उपयोगकर्ता सेटिंग्स का बैकअप ले सकते हैं।" + }, "balance": { "message": "शेषराशि" }, @@ -356,6 +422,9 @@ "basic": { "message": "बेसिक" }, + "beCareful": { + "message": "सावधान रहें" + }, "betaMetamaskDescription": { "message": "लाखों लोगों का भरोसेमंद, MetaMask एक सुरक्षित वॉलेट है जो वेब3 की दुनिया को सबके लिए सुलभ बनाता है।" }, @@ -372,6 +441,9 @@ "betaMetamaskVersion": { "message": "MetaMask बीटा संस्करण" }, + "betaPortfolioSite": { + "message": "बीटा पोर्टफोलियो साइट" + }, "betaWelcome": { "message": "MetaMask बीटा में आपका स्वागत है" }, @@ -507,6 +579,9 @@ "message": "अपने लेजर को WebHID के जरिये कनेक्ट करने के लिए यहां क्लिक करें", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "मैन्युअल रूप से टोकन जोड़ने के लिए यहां क्लिक करें" + }, "clickToRevealSeed": { "message": "गुप्त शब्दों को प्रकट करने के लिए यहाँ क्लिक करें" }, @@ -523,6 +598,16 @@ "confirm": { "message": "पुष्टि करें" }, + "confirmPageDialogSetApprovalForAll": { + "message": "आप $1 तक ऐक्सेस प्रदान कर रहे हैं, इसमें वह भी शामिल है जिसे आप भविष्य में प्राप्त कर सकते हैं। दूसरी ओर की पार्टी आपसे पूछे बिना किसी भी समय आपके वॉलेट से NFTs ट्रान्स्फर कर सकती है, जब तक आप इस स्वीकृति को रद्द नहीं करते। $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "इस अनुबंध में सभी NFTs" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "सावधानी के साथ आगे बढ़ें।" + }, "confirmPassword": { "message": "पासवर्ड की पुष्टि करें" }, @@ -616,17 +701,11 @@ "connectingToGoerli": { "message": "Goerli टेस्ट नेटवर्क से कनेक्ट हो रहा है" }, - "connectingToKovan": { - "message": "Kovan टेस्ट नेटवर्क से कनेक्ट हो रहा है" - }, "connectingToMainnet": { "message": "Ethereum Mainnet से कनेक्ट हो रहा है" }, - "connectingToRinkeby": { - "message": "Rinkeby टेस्ट नेटवर्क से कनेक्ट हो रहा है" - }, - "connectingToRopsten": { - "message": "Ropsten टेस्ट नेटवर्क से कनेक्ट हो रहा है" + "connectingToSepolia": { + "message": "सेपोलिया टेस्ट नेटवर्क से कनेक्ट कर रहा है" }, "contactUs": { "message": "हमसे संपर्क करें" @@ -661,9 +740,21 @@ "contractDeployment": { "message": "अनुबंध परिनियोजन" }, + "contractDescription": { + "message": "अपने आप को धोखेबाजों से बचाने के लिए, अनुबंध विवरण की समीक्षा करने के लिए कुछ समय निकालें।" + }, "contractInteraction": { "message": "अनुबंध इंटरैक्शन" }, + "contractRequestingSpendingCap": { + "message": "खर्च की सीमा का अनुरोध करने वाला अनुबंध" + }, + "contractTitle": { + "message": "अनुबंध विवरण" + }, + "contractToken": { + "message": "टोकन अनुबंध" + }, "convertTokenToNFTDescription": { "message": "हमने पाया है कि यह संपत्ति एक एनएफटी है। मेटामास्क के पास अब एनएफटी के लिए पूर्ण देशी समर्थन है। क्या आप इसे अपनी टोकन सूची से हटाना चाहते हैं और इसे एनएफटी के रूप में जोड़ना चाहते हैं?" }, @@ -695,7 +786,7 @@ "message": "एक वॉलेट बनाएं" }, "createAccount": { - "message": "खाता बनाएं" + "message": "अकाउंट बनाएं" }, "createNewWallet": { "message": "एक नया वॉलेट बनाएं" @@ -707,7 +798,7 @@ "message": "मुद्रा रूपांतरण" }, "currencySymbol": { - "message": "मुद्रा प्रतीक" + "message": "मुद्रा चिह्न" }, "currencySymbolDefinition": { "message": "इस नेटवर्क की मुद्रा के लिए प्रदर्शित टिकर प्रतीक।" @@ -742,18 +833,15 @@ "customContentSearch": { "message": "पहले से जुड़े हुए नेटवर्क के लिए खोजें" }, - "customGas": { - "message": "गैस अनुकूलित करें" - }, "customGasSettingToolTipMessage": { "message": "गैस की कीमत को अनुकूलित करने के लिए $1 का उपयोग करें। यदि आप परिचित नहीं हैं तो ये भ्रामक हो सकता है। अपनी ज़िम्मेदारी पर बातचीत करें।", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "शुल्क बढ़ाने से प्रसंस्करण समय में कमी हो सकती है, लेकिन इसकी गारंटी नहीं होती है।" - }, "customSpendLimit": { - "message": "खर्च सीमा कस्टम करें" + "message": "कस्टम खर्च सीमा" + }, + "customSpendingCap": { + "message": "कस्टम खर्च की सीमा" }, "customToken": { "message": "कस्टम टोकन" @@ -764,6 +852,9 @@ "customTokenWarningInTokenDetectionNetwork": { "message": "टोकन को मैन्युअल रूप से इंपोर्ट करने से पहले, सुनिश्चित करें कि आपका उसपर भरोसा हो। $1 के बारे में जानें" }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "सुनिश्चित करें कि आप किसी टोकन को आयात करने से पहले उस पर भरोसा करते हैं। $1 को टालने का तरीका जानें। आप टोकन डिटेक्शन $2 भी सक्षम कर सकते हैं।" + }, "customerSupport": { "message": "ग्राहक सहायता सेवा" }, @@ -787,8 +878,8 @@ "data": { "message": "डेटा" }, - "dataBackupFoundInfo": { - "message": "MetaMask की पिछली स्थापना के दौरान आपके कुछ खाता डेटा का बैकअप लिया गया था। इसमें आपकी सेटिंग, संपर्क और टोकन शामिल हो सकते हैं। क्या आप अब इस डेटा को पुनर्स्थापित करना चाहेंगे?" + "dataBackupSeemsCorrupt": { + "message": "आपका डेटा रीस्टोर नहीं किया जा सकता। लगता है फ़ाइल करप्ट हुई है।" }, "dataHex": { "message": "हेक्स" @@ -823,7 +914,7 @@ "message": "हटाएँ" }, "deleteAccount": { - "message": "खाता हटाएँ" + "message": "अकाउंट हटाएँ" }, "deleteNetwork": { "message": "नेटवर्क हटाएँ?" @@ -835,6 +926,12 @@ "message": "$1 जमा करें", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "अधिक जानें" + }, + "deprecatedTestNetworksMsg": { + "message": "Ethereum प्रोटोकॉल परिवर्तनों के कारण: Rinkeby, Ropsten, और Kovan टेस्ट नेटवर्क मजबूती से काम करने में असमर्थ हो सकते हैं और जल्द ही अप्रचलित हो जाएंगे।" + }, "description": { "message": "विवरण" }, @@ -1034,16 +1131,16 @@ "message": "गैस शुल्क स्पीड अप को एडिट करें" }, "enableAutoDetect": { - "message": " ऑटो डिटेक्ट इनेबल करें" + "message": " ऑटो डिटेक्ट सक्षम करें" }, "enableEIP1559V2": { - "message": "इनहैन्सड गैस शुल्क UI को सक्षम करें" + "message": "उन्नत गैस शुल्क UI सक्षम करें" }, "enableEIP1559V2AlertMessage": { "message": "हमने अपडेट किया है कि गैस शुल्क अनुमान और कस्टमाइज़ेशन कैसे काम करता है।" }, "enableEIP1559V2ButtonText": { - "message": "सेटिंग्स में इनहैन्सड गैस शुल्क यूआइ को चालू करें" + "message": "सेटिंग्स में उन्नत गैस शुल्क UI को चालू करें" }, "enableEIP1559V2Description": { "message": "हमने अपडेट किया है कि गैस शुल्क अनुमान और कस्टमाइज़ेशन कैसे काम करता है। अगर आप नए गैस अनुभव का इस्तेमाल करना चाहते हैं तो चालू करें। $1", @@ -1110,6 +1207,15 @@ "message": "समापन बिंदु ने अलग चेन ID लौटाई है: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "उन्नत टोकन डिटेक्शन" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "उन्नत टोकन डिटेक्शन वर्तमान में $1 पर उपलब्ध है। $2" + }, + "enhancedTokenDetectionDescription": { + "message": "ConsenSys का टोकन एपीआई विभिन्न तृतीय पक्ष टोकन सूचियों से टोकन की एक सूची एकत्र करता है। चालू होने पर, एथेरियम मेननेट, बिनेंस, पॉलीगॉन और एवलांच पर टोकन का स्वचालित रूप से पता लगाया जाएगा और खोजा जा सकेगा। बंद होने पर, स्वचालित पहचान और खोज केवल एथेरियम मेननेट पर ही की जा सकती है।" + }, "ensIllegalCharacter": { "message": "ENS के लिए गैर-कानूनी कैरेक्टर।" }, @@ -1166,14 +1272,11 @@ "message": "स्टैक:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "अनुमानित प्रसंस्करण समय" - }, "ethGasPriceFetchWarning": { "message": "बैकअप गैस की कीमत प्रदान की जाती है क्योंकि मुख्य गैस अनुमान सर्विस अभी उपलब्ध नहीं है।" }, "ethereumPublicAddress": { - "message": "Ethereum सार्वजनिक पता" + "message": "Ethereum सार्वजनिक ऐड्रेस" }, "etherscan": { "message": "Etherscan" @@ -1197,7 +1300,7 @@ "message": "निजी कुंजी निर्यात करें" }, "externalExtension": { - "message": "बाहरी विस्तार" + "message": "बाहरी एक्स्टेन्शन" }, "failed": { "message": "विफल" @@ -1214,9 +1317,6 @@ "fast": { "message": "तेज" }, - "fastest": { - "message": "सबसे तेज" - }, "feeAssociatedRequest": { "message": "इस अनुरोध के साथ एक शुल्क जुड़ा हुआ है।" }, @@ -1293,7 +1393,7 @@ "message": "कार्य: सभी के लिए स्वीकृति सेट करें" }, "functionType": { - "message": "फंक्शन का प्रकार" + "message": "फ़ंक्शन का प्रकार" }, "gas": { "message": "गैस" @@ -1391,7 +1491,7 @@ "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" }, "gdprMessagePrivacyPolicy": { - "message": "गोपनीयता नीतियां यहां", + "message": "गोपनीयता नीति यहां है", "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" }, "general": { @@ -1405,7 +1505,7 @@ "description": "Displays network name for Ether faucet" }, "getStarted": { - "message": "प्रारंभ करें" + "message": "शुरू करें" }, "goBack": { "message": "वापस जाएं" @@ -1497,7 +1597,7 @@ "description": "Button to import an account from a selected file" }, "importAccount": { - "message": "खाता आयात करें" + "message": "अकाउंट आयात करें" }, "importAccountError": { "message": "खाता आयात करने में त्रुटि।" @@ -1526,6 +1626,12 @@ "importNFTs": { "message": "NFT आयात करें" }, + "importSelectedTokens": { + "message": "चयनित टोकन इंपोर्ट करें?" + }, + "importSelectedTokensDescription": { + "message": "आपके द्वारा चुने गए टोकन केवल आपके वॉलेट में दिखाई देंगे। आप बाद में कभी भी छिपे हुए टोकन को खोज कर उन्हें इंपोर्ट कर सकते हैं।" + }, "importTokenQuestion": { "message": "टोकन आयात करें?" }, @@ -1552,6 +1658,9 @@ "message": "आयातित", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "आपके सेटिंग्स में" + }, "infuraBlockedNotification": { "message": "MetaMask ब्लॉकचेन होस्ट से कनेक्ट करने में असमर्थ है। संभावित कारणों की समीक्षा करें $1।", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "नेटवर्क द्वारा आपके प्रारंभिक लेनदेन की पुष्टि की गई थी। वापस जाने के लिए ठीक पर क्लिक करें।" }, + "install": { + "message": "इंस्टॉल" + }, "insufficientBalance": { "message": "अपर्याप्त शेषराशि।" }, @@ -1654,26 +1766,20 @@ "message": "JSON फाइल", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "खातों और नेटवर्क पर अपने टोकन और एनएफटी पर नज़र रखने के लिए।" + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (ट्यूटोरियल)" - }, "knownAddressRecipient": { "message": "ज्ञात अनुबंध पता।" }, "knownTokenWarning": { "message": "यह कार्रवाई उन टोकन को संपादित करेगी, जो पहले से ही आपके वॉलेट में सूचीबद्ध हैं, जिसका उपयोग आपको फ़िश करने के लिए किया जा सकता है। केवल तभी अनुमोदित करें, जब आप इस बात को लेकर सुनिश्चित हों कि आप इन टोकन का प्रतिनिधित्व बदलना चाहते हैं। $1 के बारे में और अधिक जानें" }, - "kovan": { - "message": "Kovan टेस्ट नेटवर्क" - }, "lastConnected": { - "message": "अंतिम बार कनेक्ट किया गया" - }, - "learmMoreAboutGas": { - "message": "गैस के बारे में $1 चाहते हैं?" + "message": "अंतिम बार जुड़ा" }, "learnCancelSpeeedup": { "message": "$1 करने का तरीका जानें", @@ -1682,6 +1788,10 @@ "learnMore": { "message": "अधिक जानें" }, + "learnMoreAboutGas": { + "message": "गैस के बारे में $1 चाहते हैं?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "अधिक जानें" }, @@ -1921,7 +2031,7 @@ "message": "सबमिट किया गया मुद्रा संकेत इस चेन आईडी के लिए हमारी अपेक्षा से मेल नहीं खाता।" }, "mismatchedRpcUrl": { - "message": "हमारे रिकॉर्ड के अनुसार, सबमिट किया गया RPC URL मान इस चेन आईडी के किसी ज्ञात प्रोवाइडर से मेल नहीं खाता।" + "message": "हमारे रिकॉर्ड के अनुसार, सबमिट किया गया RPC-URL मान इस चेन आईडी के लिए किसी ज्ञात प्रदाता से मेल नहीं खाता।" }, "missingNFT": { "message": "अपना NFT नहीं देख रहे हैं?" @@ -1947,6 +2057,10 @@ "name": { "message": "नाम" }, + "nativeToken": { + "message": "इस नेटवर्क पर मूल टोकन $1 है। यह गैस शुल्क के लिए इस्तेमाल किया जाने वाला टोकन है।", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "MetaMask का इस्तेमाल करते हुए विकेंद्रीकृत एप्लिकेशन्स के साथ इंटरैक्ट करने के लिए आपके वॉलेट में $1 होना ज़रूरी है।", "description": "$1 represents the cypto symbol to be purchased" @@ -1956,7 +2070,7 @@ "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" }, "needHelpFeedback": { - "message": "अपना फीडबैक साझा करें" + "message": "अपनी प्रतिक्रिया साझा करें" }, "needHelpLinkText": { "message": "MetaMask सहायता" @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNameGoerli": { + "message": "गोएर्ली" + }, "networkNamePolygon": { "message": "बहुभुज" }, @@ -2033,6 +2150,9 @@ "nevermind": { "message": "कोई बात नहीं" }, + "new": { + "message": "नया!" + }, "newAccount": { "message": "नया खाता" }, @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "टोकन इम्पोर्ट हो गया" }, - "newTotal": { - "message": "नया कुलयोग" - }, - "newTransactionFee": { - "message": "नया लेनदेन शुल्क" - }, "newValues": { "message": "नए मान" }, @@ -2112,7 +2226,7 @@ "message": "नहीं, मेरे पास पहले से ही एक गुप्त रिकवरी फ्रेज है" }, "noConversionDateAvailable": { - "message": "करेंसी के रुपांतरण की कोई तारीख उपलब्ध नहीं है" + "message": "कोई मुद्रा रूपांतरण तारीख उपलब्ध नहीं है" }, "noConversionRateAvailable": { "message": "कोई भी रूपांतरण दर उपलब्ध नहीं है" @@ -2188,7 +2302,7 @@ "message": "डार्क मोड सक्षम करें" }, "notifications12Description": { - "message": "एक्सटेंशन पर डार्क मोड आखिरकार आ गया है! इसे चालू करने के लिए, सेटिंग -> प्रायोगिक पर जाएं और प्रदर्शन विकल्पों में से एक का चयन करें: लाइट, डार्क, सिस्टम।" + "message": "एक्सटेंशन पर डार्क मोड आखिरकार आ गया है! इसे चालू करने के लिए, सेटिंग -> एक्सपेरिमेंटल पर जाएं और प्रदर्शन विकल्पों में से एक का चयन करें: लाइट, डार्क, सिस्टम।" }, "notifications12Title": { "message": "वेन डार्क मोड? अब डार्क मोड! 🕶️🦊" @@ -2197,12 +2311,29 @@ "message": "कस्टम नेटवर्क सूची दिखाएं" }, "notifications13Description": { - "message": "अब आप निम्नलिखित लोकप्रिय कस्टम नेटवर्क्स आसानी से जोड़ सकते हैं: आर्बिट्रम, एवलांश, बिनेंस स्मार्ट चेन, फैंटम, हार्मनी, ऑप्टिमिज़्म, पाम एंड पॉलीगॉन! इस फ़ीचर को एनेबल करने के लिए, सेटिंग्स ->एक्सपेरिमेंटल पर जाएं और \"शो कस्टम नेटवर्क लिस्ट\" ऑन करें!", + "message": "अब आप निम्नलिखित लोकप्रिय कस्टम नेटवर्क्स आसानी से जोड़ सकते हैं: आर्बिट्रम, एवलांश, बिनेंस स्मार्ट चेन, फैंटम, हार्मनी, ऑप्टिमिज़्म, पाम एंड पॉलीगॉन! इस फ़ीचर को सक्षम करने के लिए, सेटिंग्स ->एक्सपेरिमेंटल पर जाएं और \"शो कस्टम नेटवर्क लिस्ट\" ऑन करें!", "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." }, "notifications13Title": { "message": "लोकप्रिय नेटवर्क्स जोड़ें" }, + "notifications14ActionText": { + "message": "बैकअप सेटिंग दिखाएं" + }, + "notifications14Description": { + "message": "हम अक्टूबर की शुरुआत में अपनी 3Box डेटा सुविधा को डेप्रिकेट कर रहे हैं। अपने वॉलेट को मैन्युअल रूप से बैकअप और रीस्टोर करने के लिए, उन्नत सेटिंग्स में \"अभी बैकअप लें\" बटन का उपयोग करें।", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "3Box डेप्रिकेटिंग" + }, + "notifications15Description": { + "message": "आपकी ओर से कुछ भी करने की आवश्यकता नहीं है, इसलिए हमेशा की तरह अपने वॉलेट का उपयोग करते रहें। मर्ज के आसपास संभावित घोटालों से अवगत रहें।", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "इथेरियम मर्ज यहाँ है!" + }, "notifications1Description": { "message": "MetaMask Mobile उपयोगकर्ता अब अपने मोबाइल वॉलेट के अंदर टोकन स्वैप कर सकते हैं। मोबाइल ऐप प्राप्त करने के लिए QR कोड को स्कैन करें और स्वैप करना शुरू करें।", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2252,7 +2383,7 @@ "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." }, "notifications6Title": { - "message": "Chrome उपयोगकर्ताओं के लिए Ledger सहायता अद्यतन", + "message": "Chrome उपयोगकर्ताओं के लिए Ledger सहायता अपडेट", "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" }, "notifications7DescriptionOne": { @@ -2268,7 +2399,7 @@ "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, "notifications8ActionText": { - "message": "एडवांस सेटिंग्स पर जाएं", + "message": "एडवांस्ड सेटिंग्स पर जाएं", "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": { @@ -2276,7 +2407,7 @@ "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": { - "message": "एक आसान और अधिक स्थिर लेजर अनुभव के लिए, सेटिंग्स के एडवांस टैब पर जाएं और 'पसंदीदा लेजर कनेक्शन प्रकार' को 'WebHID' पर स्विच करें।", + "message": "एक आसान और अधिक स्थिर लेजर अनुभव के लिए, सेटिंग्स के एडवांस्ड टैब पर जाएं और 'पसंदीदा लेजर कनेक्शन प्रकार' को 'WebHID' पर स्विच करें।", "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." }, "notifications8Title": { @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "सभी को पढ़ा हुआ चिन्हित करें" }, + "numberOfNewTokensDetectedPlural": { + "message": "इस खाते में $1 के नए टोकन पाए गए", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "इस खाते में 1 नया टोकन पाया गया" + }, "ofTextNofM": { "message": "का" }, @@ -2384,6 +2522,9 @@ "message": "अपने लेजर को WebHID के माध्यम से कनेक्ट करने के लिए MetaMask को पूर्ण स्क्रीन में खोलें।", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "ब्लॉक एक्सप्लोरर में खोलें" + }, "optional": { "message": "वैकल्पिक" }, @@ -2454,7 +2595,13 @@ "message": "अनुमति अनुरोध" }, "permissionRequestCapitalized": { - "message": "अनुमति हेतु अनुरोध" + "message": "अनुमति के लिए अनुरोध" + }, + "permissionRequested": { + "message": "अब अनुरोध किया गया" + }, + "permissionRevoked": { + "message": "इस अपडेट में रद्द किया गया" }, "permission_accessNetwork": { "message": "इंटरनेट एक्सेस करें।", @@ -2476,9 +2623,13 @@ "message": "अनिश्चित काल तक चलाएं।", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "$1($2) के तहत अपने खातों और संपत्तियों को नियंत्रित करें।", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "आपके \"$1\" अकाउंट्स और एसेट्स नियंत्रित करें।", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "उसके डेटा को अपने डिवाइस पर स्टोर करें और प्रबंधित करें।", @@ -2488,10 +2639,18 @@ "message": "नोटीफिकेशंस दिखाएं।", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "ट्रांजैक्शन इनसाइट्स प्राप्त करें और प्रदर्शित करें।", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "अज्ञात अनुमति: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "$1 ($2) के लिए अपनी पब्लिक की देखें।", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "अनुमतियाँ" }, @@ -2508,6 +2667,9 @@ "popularCustomNetworks": { "message": "लोकप्रिय कस्टम नेटवर्क" }, + "portfolioSite": { + "message": "पोर्टफोलियो साइट" + }, "preferredLedgerConnectionType": { "message": "वरीयता वाले लेजर कनेक्शन के प्रकार", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" @@ -2665,7 +2827,7 @@ "message": "रीसेट करें" }, "resetAccount": { - "message": "खाता रीसेट करें" + "message": "अकाउंट रीसेट करें" }, "resetAccountDescription": { "message": "आपके खाते को रीसेट करने से आपका लेनदेन इतिहास साफ हो जाएगा। इससे आपके खातों में शेषराशि नहीं बदलेगी या आपको अपने गुप्त रिकवरी फ्रेज को फिर से दर्ज करने की आवश्यकता नहीं होगी।" @@ -2688,9 +2850,17 @@ "restore": { "message": "पुनर्स्थापित करें" }, - "restoreWalletPreferences": { - "message": "$1 से आपके डेटा का बैकअप मिला है। क्या आप अपनी वॉलेट वरीयताओं को पुनर्स्थापित करना चाहते हैं?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "प्रदान की गई फ़ाइल से आपके डेटा को रीस्टोर नहीं किया जा सकता" + }, + "restoreSuccessful": { + "message": "आपके डेटा को सफलतापूर्वक रीस्टोर किया गया है" + }, + "restoreUserData": { + "message": "यूज़र डेटा रीस्टोर करें" + }, + "restoreUserDataDescription": { + "message": "वरीयताएँ और अकाउंट एड्रेस से युक्त यूजर सेटिंग्स को आप पहले से बैकअप की गई JSON फ़ाइल से रीस्टोर सकते हैं।" }, "retryTransaction": { "message": "लेनदेन का पुनः प्रयास करें" @@ -2721,11 +2891,8 @@ "message": "अनुमति निरस्त करने से, निम्नलिखित $1 अब आपके $2 को एक्सेस नहीं कर सकेगा", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Rinkeby टेस्ट नेटवर्क" - }, - "ropsten": { - "message": "Ropsten टेस्ट नेटवर्क" + "revokeSpendingCapTooltipText": { + "message": "यह अनुबंध आपके वर्तमान या भविष्य के और टोकन पर खर्च करने में असमर्थ है।" }, "rpcUrl": { "message": "नया RPC URL" @@ -2752,7 +2919,7 @@ "message": "खोजें" }, "searchAccounts": { - "message": "खाते खोजें" + "message": "अकाउंट्स खोजें" }, "searchResults": { "message": "खोज परिणाम" @@ -2838,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "अपना सीक्रेट रिकवरी फ्रेज लिखें" }, - "selectAHigherGasFee": { - "message": "अपने लेनदेन की प्रक्रिया में तेजी लाने के लिए उच्च गैस शुल्क का चयन करें। *" - }, "selectAccounts": { "message": "इस साइट पर उपयोग करने के लिए खाते (खातों) का चयन करें" }, @@ -2874,9 +3038,6 @@ "send": { "message": "भेजें" }, - "sendAmount": { - "message": "राशि भेजें" - }, "sendBugReport": { "message": "हमें एक बग रिपोर्ट भेजें।" }, @@ -2901,6 +3062,9 @@ "message": "चेतावनी: आप एक टोकन अनुबंध को भेजने वाले हैं जिसके परिणामस्वरूप धन की हानि हो सकती है। $1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "सेपोलिया टेस्ट नेटवर्क" + }, "setAdvancedPrivacySettings": { "message": "एडवांस गोपनीयता सेटिंग्स निर्धारित करें" }, @@ -2933,12 +3097,6 @@ "showAdvancedGasInlineDescription": { "message": "गैस मूल्य और सीमा नियंत्रण को सीधे भेजने और पुष्टि करने की स्क्रीन पर दिखाने के लिए इसका चयन करें।" }, - "showCustomNetworkList": { - "message": "कस्टम नेटवर्क की सूची दिखाएं" - }, - "showCustomNetworkListDescription": { - "message": "नया नेटवर्क जोड़ते समय पहले से भरे हुए विवरण वाले नेटवर्कों की सूची दिखाने के लिए इसे चुनें।" - }, "showFiatConversionInTestnets": { "message": "टेस्ट नेटवर्क पर रूपांतरण दिखाएं" }, @@ -2967,7 +3125,7 @@ "message": "निजी कुंजियां दिखाएं" }, "showRecommendations": { - "message": "अनुशंसा दिखाएं" + "message": "सिफ़ारिशें दिखाएं" }, "showTestnetNetworks": { "message": "परीक्षण नेटवर्क दिखाएं" @@ -2993,6 +3151,9 @@ "signed": { "message": "हस्ताक्षर किया गया" }, + "signin": { + "message": "साइन-इन करें" + }, "simulationErrorMessageV2": { "message": "हम गैस का अनुमान नहीं लगा पाए। अनुबंध में कोई त्रुटि हो सकती है और यह लेन-देन विफल हो सकता है।" }, @@ -3000,14 +3161,11 @@ "message": "छोड़ें" }, "skipAccountSecurity": { - "message": "खाता सुरक्षा छोड़ें?" + "message": "अकाउंट सुरक्षा छोड़ें?" }, "skipAccountSecurityDetails": { "message": "मैं समझता हूं कि जब तक मैं अपने सीक्रेट रिकवरी फ्रेज का बैकअप नहीं लेता, मैं अपने खाते और उनकी सभी संपत्ति खो सकता हूं।" }, - "slow": { - "message": "धीमा" - }, "smartTransaction": { "message": "स्मार्ट लेनदेन" }, @@ -3019,6 +3177,10 @@ "message": "$2 से $1 जोड़ा गया", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "स्नैप एरर: '$1'. एरर कोड: '$2'", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -3029,12 +3191,32 @@ "snapInstallWarningCheck": { "message": "ये पुष्टि करने के लिए कि आप समझते हैं, सभी पर सही का निशान लगाएं।" }, + "snapInstallWarningCheckPlural": { + "message": "ये पुष्टि करने के लिए कि आप समझते हैं, सभी बॉक्स चेक करें:" + }, + "snapInstallWarningKeyAccess": { + "message": "आप स्नैप \"$1\" के लिए $2 कुंजी पहुंच प्रदान कर रहे हैं। यह अपरिवर्तनीय है और आपके $2 खातों और संपत्तियों पर \"$1\" नियंत्रण प्रदान करता है। आगे बढ़ने से पहले सुनिश्चित करें कि आप \"$1\" पर भरोसा करते हैं।", + "description": "The first parameter is the name of the snap and the second one is the protocol" + }, "snapRequestsPermission": { "message": "ये स्नैप निम्नलिखित अनुमतियों हेतु अनुरोध कर रहा है:" }, + "snapUpdate": { + "message": "स्नैप अपडेट करें" + }, + "snapUpdateExplanation": { + "message": "$1 को आपके स्नैप के नए वर्ज़न की ज़रूरत है।", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "स्नैप्स" }, + "snapsInsightLoading": { + "message": "ट्रांजैक्शन इनसाइट लोड हो रही है..." + }, + "snapsNoInsight": { + "message": "स्नैप ने कोई इनसाइट नहीं लौटाई" + }, "snapsSettingsDescription": { "message": "अपने स्नैप्स प्रबंधित करें" }, @@ -3479,6 +3661,9 @@ "swapReviewSwap": { "message": "स्वैप की समीक्षा करें" }, + "swapSearchNameOrAddress": { + "message": "नाम खोजें या ऐड्रेस पेस्ट करें" + }, "swapSelect": { "message": "चयन करें" }, @@ -3498,6 +3683,9 @@ "message": "$1%", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "यदि आपके ऑर्डर किए जाने और पुष्टि किए जाने के समय के बीच मूल्य में परिवर्तन होता है, तो इसे \"स्लिपेज\" कहा जाता है। यदि स्लिपेज आपकी \"स्लिपेज टॉलरेंस\" सेटिंग से अधिक हो जाता है, तो आपका स्वैप स्वतः रद्द हो जाएगा।" + }, "swapSource": { "message": "चलनिधि का स्रोत" }, @@ -3573,7 +3761,7 @@ "message": "0% स्लिपेज" }, "swapsAdvancedOptions": { - "message": "उन्नत विकल्प" + "message": "एडवांस्ड विकल्प" }, "swapsExcessiveSlippageWarning": { "message": "स्लिपेज राशि बहुत अधिक है और इसके परिणामस्वरूप खराब दर होगी। कृपया अपने स्लिपेज टॉलरेंस को 15% से नीचे के मान तक कम करें।" @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "इस खाते पर स्विच करें" }, + "switchedTo": { + "message": "आपने स्विच कर लिया है" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "नेटवर्क स्विच करने से सभी लंबित पुष्टिकरण रद्द हो जाएंगे" }, @@ -3643,15 +3834,6 @@ "syncWithMobileTitle": { "message": "मोबाइल के साथ सिंक करें" }, - "syncWithThreeBox": { - "message": "3Box के साथ डेटा सिंक करें (प्रयोगात्मक)" - }, - "syncWithThreeBoxDescription": { - "message": "3Box के साथ अपनी सेटिंग का बैकअप लेने के लिए चालू करें। यह सुविधा वर्तमान में प्रयोगात्मक है; अपने जोखिम पर इस्तेमाल करें।" - }, - "syncWithThreeBoxDisabled": { - "message": "प्रारंभिक सिंक के दौरान एक त्रुटि के कारण 3Box को अक्षम कर दिया गया है" - }, "tenPercentIncreased": { "message": "10% बढ़ोत्तरी" }, @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "अपनी पसंदीदा MetaMask थीम चुन लें" }, + "thingsToKeep": { + "message": "ध्यान रखने योग्य बातें" + }, "thisWillCreate": { "message": "यह एक नया वॉलेट और गुप्त रिकवरी फ्रेज बनाएगा" }, @@ -3709,17 +3894,26 @@ "message": "टोकन दशमलव आवश्यक है।" }, "tokenDecimalTitle": { - "message": "टोकन डेसिमल:" + "message": "टोकन दशमलव:" }, "tokenDetails": { "message": "टोकन विवरण" }, + "tokenFoundTitle": { + "message": "1 नया टोकन मिला" + }, "tokenId": { "message": "टोकन आइडी" }, "tokenList": { "message": "टोकन सूचियां:" }, + "tokenScamSecurityRisk": { + "message": "टोकन घोटाले और सुरक्षा जोखिम" + }, + "tokenShowUp": { + "message": "हो सकता है आपके वॉलेट में आपके टोकन स्वतः दिखाई नहीं दें।" + }, "tokenSymbol": { "message": "टोकन का प्रतीक" }, @@ -3861,6 +4055,9 @@ "tryAgain": { "message": "पुनः प्रयास करें" }, + "tryOur": { + "message": "हमारा आजमाएं" + }, "turnOnTokenDetection": { "message": "उन्नत टोकन डिटेक्शन चालू करें" }, @@ -3914,9 +4111,13 @@ "message": "विकेंद्रीकृत वेब प्रतीक्षारत है" }, "unrecognizedChain": { - "message": "यह कस्टम नेटवर्क पहचाना नहीं गया है। हम अनुशंसा करते हैं कि आप आगे बढ़ने से पहले $1", + "message": "यह कस्टम नेटवर्क पहचाना नहीं गया है", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (अपरिचित प्रोटोकॉल)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "वर्तमान में संग्रहणीय (ERC-721) टोकन भेजना समर्थित नहीं है", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -3970,7 +4171,7 @@ "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" }, "viewAccount": { - "message": "खाता देखें" + "message": "अकाउंट देखें" }, "viewAllDetails": { "message": "सभी विवरण देखें" @@ -4034,6 +4235,10 @@ "warning": { "message": "चेतावनी" }, + "warningTooltipText": { + "message": "$1 अनुबंध आगे की सूचना या सहमति के बिना आपकी संपूर्ण टोकन शेष राशि खर्च कर सकता है। कम खर्च करने की सीमा को समायोजित करके अपनी सुरक्षा करें।", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "कमज़ोर" }, diff --git a/app/_locales/hn/messages.json b/app/_locales/hn/messages.json index 0fc0a7c26155..8e42dd052863 100644 --- a/app/_locales/hn/messages.json +++ b/app/_locales/hn/messages.json @@ -72,9 +72,6 @@ "createAccount": { "message": "खाता बनाएं" }, - "customGas": { - "message": "अनुकूलित करें गैस" - }, "decimal": { "message": "दशमलव परिशुद्धता" }, @@ -178,9 +175,6 @@ "message": "JSON फ़ाइल", "description": "format for importing an account" }, - "kovan": { - "message": "कोवान टेस्ट नेटवर्क" - }, "likeToImportTokens": { "message": "क्या आप इन टोकनों को जोड़ना चाहते हैं?" }, @@ -284,12 +278,6 @@ "revealSeedWordsWarning": { "message": "किसी सार्वजनिक स्थान पर अपने बीज के शब्द ठीक नहीं करें! ये शब्द आपके सभी खातों को चोरी करने के लिए उपयोग किए जा सकते हैं।" }, - "rinkeby": { - "message": "रिचीव टेस्ट नेटवर्क" - }, - "ropsten": { - "message": "रॉप्स्टेन टेस्ट नेटवर्क" - }, "save": { "message": "सहेजें" }, diff --git a/app/_locales/hr/messages.json b/app/_locales/hr/messages.json index 551b1f15aa21..253993929851 100644 --- a/app/_locales/hr/messages.json +++ b/app/_locales/hr/messages.json @@ -8,9 +8,6 @@ "about": { "message": "O opcijama" }, - "acceleratingATransaction": { - "message": "* Ubrzavanjem se transakcije pomoću veće cijene goriva povećava šansa za bržu obradu mrežom, ali se uvijek ne jamči." - }, "accessingYourCamera": { "message": "Pristupanje vašoj kameri..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Povezivanje na testnu mrežu Goerli" }, - "connectingToKovan": { - "message": "Povezivanje na testnu mrežu Kovan" - }, "connectingToMainnet": { "message": "Povezivanje na glavnu mrežu Ethereum" }, - "connectingToRinkeby": { - "message": "Povezivanje na testnu mrežu Rinkeby" - }, - "connectingToRopsten": { - "message": "Povezivanje na testnu mrežu Ropsten" - }, "continueToWyre": { "message": "Nastavi na uslugu Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "Napredno" }, - "customGas": { - "message": "Prilagodi gorivo" - }, - "customGasSubTitle": { - "message": "Povećavanjem se naknade može smanjiti vrijeme obrade, ali se ne jamči." - }, "customToken": { "message": "Prilagođeni token" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "Upišite lozinku za nastavak" }, - "estimatedProcessingTimes": { - "message": "Procijenjeno vrijeme obrade" - }, "ethereumPublicAddress": { "message": "Javna adresa Ethereum" }, @@ -499,9 +478,6 @@ "knownAddressRecipient": { "message": "Poznata ugovorna adresa." }, - "kovan": { - "message": "Testna mreža Kovan" - }, "learnMore": { "message": "Saznajte više" }, @@ -597,12 +573,6 @@ "newToMetaMask": { "message": "Novi korisnik usluge MetaMask?" }, - "newTotal": { - "message": "Novi ukupni zbroj" - }, - "newTransactionFee": { - "message": "Nova naknada za transakciju" - }, "next": { "message": "Sljedeće" }, @@ -761,12 +731,6 @@ "revealSeedWordsWarningTitle": { "message": "NE DIJELITE ovu rečenicu ni s kim!" }, - "rinkeby": { - "message": "Testna mreža Rinkeby" - }, - "ropsten": { - "message": "Testna mreža Ropsten" - }, "rpcUrl": { "message": "Novi URL RPC-a" }, @@ -803,9 +767,6 @@ "seedPhraseReq": { "message": "Početne rečenice imaju 12 riječi" }, - "selectAHigherGasFee": { - "message": "Odaberite višu naknadu za gorivo kako biste ubrzali obrađivanje vaše transakcije.*" - }, "selectAnAccount": { "message": "Odaberi račun" }, @@ -824,9 +785,6 @@ "send": { "message": "Pošalji" }, - "sendAmount": { - "message": "Odaberi iznos" - }, "sendTokens": { "message": "Pošalji tokene" }, @@ -869,9 +827,6 @@ "signed": { "message": "Potpisano" }, - "slow": { - "message": "Sporo" - }, "somethingWentWrong": { "message": "Ups! Nešto je pošlo po zlu." }, diff --git a/app/_locales/ht/messages.json b/app/_locales/ht/messages.json index 44409dd4598e..815e89d26a5e 100644 --- a/app/_locales/ht/messages.json +++ b/app/_locales/ht/messages.json @@ -108,18 +108,9 @@ "connectHardwareWallet": { "message": "Konekte Materyèl Wallet" }, - "connectingToKovan": { - "message": "Konekte nan Kovan Tès Rezo a" - }, "connectingToMainnet": { "message": "Konekte ak Prensipal Ethereum Rezo a" }, - "connectingToRinkeby": { - "message": "Konekte nan Rinkeby Tès Rezo a" - }, - "connectingToRopsten": { - "message": "Konekte ak Ropsten Tès Rezo a" - }, "contractDeployment": { "message": "Kontra Deplwaman" }, @@ -144,9 +135,6 @@ "currentLanguage": { "message": "Lang Aktyèl" }, - "customGas": { - "message": "Koutim Gaz" - }, "customToken": { "message": "Koutim Token" }, @@ -295,9 +283,6 @@ "message": "JSON Dosye", "description": "format for importing an account" }, - "kovan": { - "message": "Kovan Tès Rezo" - }, "learnMore": { "message": "Aprann plis" }, @@ -491,12 +476,6 @@ "revealSeedWordsWarningTitle": { "message": "PA pataje fraz sa a avèk nenpòt moun!" }, - "rinkeby": { - "message": "Rinkeby Tès Rezo" - }, - "ropsten": { - "message": "Ropsten Tès Rezo" - }, "save": { "message": "Sove" }, diff --git a/app/_locales/hu/messages.json b/app/_locales/hu/messages.json index 590b77f86e22..dfcec73f3477 100644 --- a/app/_locales/hu/messages.json +++ b/app/_locales/hu/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Névjegy" }, - "acceleratingATransaction": { - "message": "* Ha szeretné felgyorsítani a tranzakciót azzal, hogy magasabb gázárat használ, az növeli a gyorsabb feldolgozás esélyét, de ez nem mindig garantált." - }, "accessingYourCamera": { "message": "Kamerához való hozzáférés..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Csatlakozás a Goerli teszthálózathoz" }, - "connectingToKovan": { - "message": "Csatlakozás a Kovan teszthálózathoz" - }, "connectingToMainnet": { "message": "Csatlakozás a fő Ethereum hálózathoz" }, - "connectingToRinkeby": { - "message": "Kapcsolódás a Rinkeby Teszthálózathoz" - }, - "connectingToRopsten": { - "message": "Csatlakozás a Ropsten teszthálózathoz" - }, "continueToWyre": { "message": "Tovább a Wyre-re" }, @@ -250,12 +238,6 @@ "custom": { "message": "Speciális" }, - "customGas": { - "message": "Gáz testreszabása" - }, - "customGasSubTitle": { - "message": "A díj növelése csökkentheti a feldolgozási időt, de ez nem garantált." - }, "customToken": { "message": "Egyéni token" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "A folytatáshoz adja meg a jelszót" }, - "estimatedProcessingTimes": { - "message": "Becsült feldolgozási idők" - }, "ethereumPublicAddress": { "message": "Ethereum nyilvános címe" }, @@ -499,9 +478,6 @@ "knownAddressRecipient": { "message": "Ismert szerződéses cím." }, - "kovan": { - "message": "Kovan teszthálózat" - }, "learnMore": { "message": "Tudjon meg többet" }, @@ -597,12 +573,6 @@ "newToMetaMask": { "message": "Új a MetaMask-on?" }, - "newTotal": { - "message": "Új végösszeg" - }, - "newTransactionFee": { - "message": "Új tranzakciós költség" - }, "next": { "message": "Következő" }, @@ -761,12 +731,6 @@ "revealSeedWordsWarningTitle": { "message": "NE ossza meg ezt a mondatot senkivel!" }, - "rinkeby": { - "message": "Rinkeby teszthálózat" - }, - "ropsten": { - "message": "Ropsten teszthálózat" - }, "rpcUrl": { "message": "Új RPC URL" }, @@ -803,9 +767,6 @@ "seedPhraseReq": { "message": "A seed mondat 12 szóból áll" }, - "selectAHigherGasFee": { - "message": "Válasszon magasabb gázdíjat az ügylet feldolgozásának gyorsításához.*" - }, "selectAnAccount": { "message": "Válasszon fiókot" }, @@ -824,9 +785,6 @@ "send": { "message": "Küldés" }, - "sendAmount": { - "message": "Összeg küldése" - }, "sendTokens": { "message": "Token küldése" }, @@ -869,9 +827,6 @@ "signed": { "message": "Aláírva" }, - "slow": { - "message": "Lassú" - }, "somethingWentWrong": { "message": "Hoppá! Valami hiba történt..." }, diff --git a/app/_locales/id/messages.json b/app/_locales/id/messages.json index 9c4eafd55a33..b96e385c93b5 100644 --- a/app/_locales/id/messages.json +++ b/app/_locales/id/messages.json @@ -18,13 +18,13 @@ "message": "Setelah masuk dengan dompet Anda, klik 'Dapatkan Tanda Tangan' untuk menerima tanda tangan" }, "QRHardwareSignRequestGetSignature": { - "message": "Dapatkan Tanda Tangan" + "message": "Dapatkan tanda tangan" }, "QRHardwareSignRequestSubtitle": { "message": "Pindai kode QR dengan dompet Anda" }, "QRHardwareSignRequestTitle": { - "message": "Minta Tanda Tangan" + "message": "Minta tanda tangan" }, "QRHardwareUnknownQRCodeTitle": { "message": "Galat" @@ -33,7 +33,7 @@ "message": "Kode QR tidak valid. Harap pindai kode QR sinkronisasi dari dompet perangkat keras." }, "QRHardwareWalletImporterTitle": { - "message": "Pindai Kode QR" + "message": "Pindai kode QR" }, "QRHardwareWalletSteps1Description": { "message": "Hubungkan dompet perangkat keras bercelah udara yang berkomunikasi melalui kode QR. Dompet perangkat keras bercelah udara yang didukung secara resmi meliputi:" @@ -42,14 +42,61 @@ "message": "Dompet HW berbasis QR" }, "QRHardwareWalletSteps2Description": { - "message": "AirGap Vault & Ngrave (Segera Hadir)" + "message": "Ngrave (segera hadir)" + }, + "SIWEAddressInvalid": { + "message": "Alamat pada permintaan masuk tidak sesuai dengan alamat akun yang Anda gunakan untuk masuk." + }, + "SIWEDomainWarningBody": { + "message": "Situs web ($1) meminta Anda untuk masuk ke domain yang salah. Kemungkinan ini merupakan serangan pengelabuan.", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "ID Rantai:" + }, + "SIWELabelExpirationTime": { + "message": "Berakhir Pada:" + }, + "SIWELabelIssuedAt": { + "message": "Diterbitkan Pada:" + }, + "SIWELabelMessage": { + "message": "Pesan:" + }, + "SIWELabelNonce": { + "message": "Nonce:" + }, + "SIWELabelNotBefore": { + "message": "Tidak Sebelum:" + }, + "SIWELabelRequestID": { + "message": "ID Permintaan:" + }, + "SIWELabelResources": { + "message": "Sumber daya: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "Versi:" + }, + "SIWESiteRequestSubtitle": { + "message": "Situs ini meminta untuk masuk dengan" + }, + "SIWESiteRequestTitle": { + "message": "Permintaan masuk" + }, + "SIWEWarningSubtitle": { + "message": "Untuk mengonfirmasikan bahwa Anda memahaminya, centang:" + }, + "SIWEWarningTitle": { + "message": "Anda yakin?" }, "about": { "message": "Tentang" }, - "acceleratingATransaction": { - "message": "* Mempercepat transaksi dengan biaya gas yang lebih tinggi akan meningkatkan peluang untuk diproses oleh jaringan lebih cepat, namun tidak selalu terjamin." - }, "acceptTermsOfUse": { "message": "Saya telah membaca dan menyetujui $1", "description": "$1 is the `terms` message" @@ -79,17 +126,17 @@ "message": "Detail akun" }, "accountIdenticon": { - "message": "Akun Identicon" + "message": "Identicon akun" }, "accountName": { - "message": "Nama Akun" + "message": "Nama akun" }, "accountNameDuplicate": { "message": "Nama akun ini sudah digunakan", "description": "This is an error message shown when the user enters a new account name that matches an existing account name" }, "accountOptions": { - "message": "Opsi Akun" + "message": "Opsi akun" }, "accountSelectionRequired": { "message": "Anda harus memilih satu akun!" @@ -121,11 +168,14 @@ "addAlias": { "message": "Tambahkan alias" }, + "addBlockExplorer": { + "message": "Tambahkan block penjelajah" + }, "addContact": { "message": "Tambah kontak" }, "addCustomToken": { - "message": "Tambahkan Token Kustom" + "message": "Tambahkan token kustom" }, "addCustomTokenByContractAddress": { "message": "Tidak dapat menemukan token? Tambahkan token secara manual dengan menempelkan alamatnya. Alamat kontrak token dapat ditemukan di $1.", @@ -158,20 +208,20 @@ "message": "Tambahkan memo" }, "addMoreNetworks": { - "message": "tambahkan jaringan secara manual" + "message": "tambahkan jaringan lainnya secara manual" }, "addNetwork": { - "message": "Tambahkan Jaringan" + "message": "Tambahkan jaringan" }, "addNetworkTooltipWarning": { "message": "Koneksi jaringan ini mengandalkan pihak ketiga. Koneksi ini mungkin kurang bisa diandalkan atau memungkinkan pihak ketiga melacak aktivitas. $1", "description": "$1 is Learn more link" }, "addSuggestedTokens": { - "message": "Tambahkan Token yang Disarankan" + "message": "Tambahkan token yang disarankan" }, "addToken": { - "message": "Tambahkan Token" + "message": "Tambahkan token" }, "address": { "message": "Alamat" @@ -198,20 +248,17 @@ "message": "Harga gas" }, "advancedOptions": { - "message": "Opsi Lanjutan" + "message": "Opsi lanjutan" }, "advancedPriorityFeeToolTip": { "message": "Biaya prioritas (alias “tip penambang”) langsung masuk ke penambang dan memberi insentif kepada mereka untuk memprioritaskan transaksi Anda." }, "affirmAgree": { - "message": "Saya Setuju" + "message": "Saya setuju" }, "airgapVault": { "message": "Brankas AirGap" }, - "airgapVaultTutorial": { - "message": " (Tutorial)" - }, "alertDisableTooltip": { "message": "Ini dapat diubah dalam \"Pengaturan > Peringatan\"" }, @@ -271,11 +318,14 @@ "message": "Setujui batas penggunaan" }, "approveAllTokensTitle": { - "message": "Berikan izin untuk mengakses seluruh $1 Anda?", + "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" + "message": "Setujui & instal" + }, + "approveAndUpdate": { + "message": "Setujui dan perbarui" }, "approveButtonText": { "message": "Setujui" @@ -293,6 +343,10 @@ "approvedAsset": { "message": "Aset yang disetujui" }, + "approvedOn": { + "message": "Disetujui pada $1", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "Anda yakin?" }, @@ -305,8 +359,11 @@ "assets": { "message": "Aset" }, + "attemptSendingAssets": { + "message": "Jika Anda mencoba untuk mengirim aset secara langsung dari satu jaringan ke jaringan lain, aset Anda berpotensi hilang secara permanen. Pastikan untuk menggunakan penghubung." + }, "attemptToCancel": { - "message": "Coba Membatalkan?" + "message": "Coba membatalkan?" }, "attemptToCancelDescription": { "message": "Mengupayakan hal ini tidak menjamin transaksi asli Anda akan dibatalkan. Jika upaya pembatalan berhasil, Anda akan dikenakan biaya transaksi di atas." @@ -321,7 +378,7 @@ "message": "Anda telah mengotorisasi izin berikut" }, "autoLockTimeLimit": { - "message": "Pewaktu Kunci Otomatis (menit)" + "message": "Timer kunci otomatis (menit)" }, "autoLockTimeLimitDescription": { "message": "Atur waktu siaga dalam menit sebelum MetaMask terkunci." @@ -333,7 +390,10 @@ "message": "Kembali" }, "backToAll": { - "message": "Kembali ke Semua" + "message": "Kembali ke semua" + }, + "backup": { + "message": "Pencadangan" }, "backupApprovalInfo": { "message": "Kode rahasia ini diperlukan untuk memulihkan dompet seandainya perangkat Anda hilang, lupa kata sandi, harus memasang kembali MetaMask, atau ingin mengakses dompet Anda di perangkat lain." @@ -344,6 +404,12 @@ "backupNow": { "message": "Cadangkan sekarang" }, + "backupUserData": { + "message": "Cadangkan data Anda" + }, + "backupUserDataDescription": { + "message": "Anda dapat mencadangkan pengaturan pengguna yang berisi preferensi dan alamat akun ke dalam berkas JSON." + }, "balance": { "message": "Saldo" }, @@ -356,6 +422,9 @@ "basic": { "message": "Dasar" }, + "beCareful": { + "message": "Berhati-hatilah" + }, "betaMetamaskDescription": { "message": "MetaMask merupakan dompet aman yang dipercaya oleh jutaan orang, yang membuat dunia web3 dapat diakses oleh semua orang." }, @@ -372,6 +441,9 @@ "betaMetamaskVersion": { "message": "Versi Beta MetaMask" }, + "betaPortfolioSite": { + "message": "situs portofolio beta" + }, "betaWelcome": { "message": "Selamat datang di MetaMask Beta" }, @@ -388,7 +460,7 @@ "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" }, "blockExplorerUrl": { - "message": "URL Block Explorer" + "message": "URL block explorer" }, "blockExplorerUrlDefinition": { "message": "URL digunakan sebagai block explorer untuk jaringan ini." @@ -452,13 +524,13 @@ "message": "Byte" }, "canToggleInSettings": { - "message": "Anda dapat mengaktifkan kembali pemberitahuan ini di Pengaturan -> Peringatan." + "message": "Anda dapat mengaktifkan kembali pemberitahuan ini di Pengaturan > Peringatan." }, "cancel": { "message": "Batal" }, "cancelEdit": { - "message": "Batalkan Pengeditan" + "message": "Batalkan pengeditan" }, "cancelPopoverTitle": { "message": "Batalkan transaksi" @@ -475,14 +547,14 @@ "description": "$1 is string 'cancel' or 'speed up'" }, "cancelSwapForFee": { - "message": "Batalkan swap untuk ~$1", + "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" }, "cancellationGasFee": { - "message": "Biaya Pembatalan Gas" + "message": "Biaya gas pembatalan" }, "cancelled": { "message": "Dibatalkan" @@ -507,6 +579,9 @@ "message": "Klik di sini untuk menghubungkan Ledger Anda melalui WebHID", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "Klik di sini untuk menambahkan token secara manual." + }, "clickToRevealSeed": { "message": "Klik di sini untuk membuka kata rahasia" }, @@ -523,6 +598,16 @@ "confirm": { "message": "Konfirmasikan" }, + "confirmPageDialogSetApprovalForAll": { + "message": "Anda memberikan akses ke $1, termasuk setiap akses yang Anda miliki di masa mendatang. Pihak lain dapat mentransfer NFT dari dompet Anda kapan saja tanpa meminta izin Anda sampai Anda membatalkan persetujuan ini. $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "semua NFT dalam kontrak ini" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "Lanjutkan dengan hati-hati." + }, "confirmPassword": { "message": "Konfirmasikan kata sandi" }, @@ -554,7 +639,7 @@ "message": "Hubungkan akun atau buat baru" }, "connectHardwareWallet": { - "message": "Hubungkan Dompet Perangkat Keras" + "message": "Hubungkan dompet perangkat keras" }, "connectManually": { "message": "Hubungkan ke situs saat ini secara manual" @@ -580,7 +665,7 @@ "description": "$1 is the number of accounts to which the web3 site/application is asking to connect; this will substitute $1 in connectToMultiple" }, "connectWithMetaMask": { - "message": "Hubungkan Dengan MetaMask" + "message": "Hubungkan dengan MetaMask" }, "connectedAccountsDescriptionPlural": { "message": "Anda memiliki $1 akun yang terhubung ke situs ini.", @@ -614,19 +699,13 @@ "message": "Menghubungkan ke $1" }, "connectingToGoerli": { - "message": "Menghubungkan ke Jaringan Uji Goerli" - }, - "connectingToKovan": { - "message": "Menghubungkan ke Jaringan Uji Kovan" + "message": "Menghubungkan ke jaringan uji Goerli" }, "connectingToMainnet": { "message": "Menghubungkan ke Ethereum Mainnet" }, - "connectingToRinkeby": { - "message": "Menghubungkan ke Jaringan Uji Rinkeby" - }, - "connectingToRopsten": { - "message": "Menghubungkan ke Jaringan Uji Ropsten" + "connectingToSepolia": { + "message": "Menghubungkan ke jaringan uji Sepolia" }, "contactUs": { "message": "Hubungi kami" @@ -659,10 +738,22 @@ "message": "Anda mengirim token ke alamat kontrak token. Token ini berpotensi hilang." }, "contractDeployment": { - "message": "Penyebaran Kontrak" + "message": "Pengalokasian kontrak" + }, + "contractDescription": { + "message": "Untuk melindungi diri Anda dari penipu, luangkan waktu sejenak untuk memverifikasi detail kontrak." }, "contractInteraction": { - "message": "Interaksi Kontrak" + "message": "Interaksi kontrak" + }, + "contractRequestingSpendingCap": { + "message": "Kontrak meminta batas penggunaan" + }, + "contractTitle": { + "message": "Detail kontrak" + }, + "contractToken": { + "message": "Kontrak token" }, "convertTokenToNFTDescription": { "message": "Kami mendeteksi bahwa aset ini merupakan NFT. Kini MetaMask memiliki dukungan asli penuh untuk NFT. Ingin menghapusnya dari daftar token dan menambahkannya sebagai NFT?" @@ -686,28 +777,28 @@ "message": "Salin ke papan klip" }, "copyTransactionId": { - "message": "Salin ID Transaksi" + "message": "Salin ID transaksi" }, "create": { "message": "Buat" }, "createAWallet": { - "message": "Buat Dompet" + "message": "Buat dompet" }, "createAccount": { - "message": "Buat Akun" + "message": "Buat akun" }, "createNewWallet": { "message": "Buat dompet baru" }, "createPassword": { - "message": "Buat Kata Sandi" + "message": "Buat kata sandi" }, "currencyConversion": { - "message": "Konversi Mata Uang" + "message": "Konversi mata uang" }, "currencySymbol": { - "message": "Simbol Mata Uang" + "message": "Simbol mata uang" }, "currencySymbolDefinition": { "message": "Simbol ticker ditampilkan untuk mata uang jaringan ini." @@ -719,7 +810,7 @@ "message": "Halaman ekstensi saat ini" }, "currentLanguage": { - "message": "Bahasa Saat Ini" + "message": "Bahasa saat ini" }, "currentTitle": { "message": "Saat ini:" @@ -742,27 +833,27 @@ "customContentSearch": { "message": "Cari jaringan yang ditambahkan sebelumnya" }, - "customGas": { - "message": "Sesuaikan Gas" - }, "customGasSettingToolTipMessage": { "message": "Gunakan $1 untuk menyesuaikan harga gas. Anda akan bingung jika tidak terbiasa. Berinteraksi dengan risiko Anda sendiri.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "Menaikkan biaya dapat mengurangi waktu pemrosesan, namun tidak ada jaminan." - }, "customSpendLimit": { - "message": "Batas Penggunaan Kustom" + "message": "Batas penggunaan kustom" + }, + "customSpendingCap": { + "message": "Batas penggunaan kustom" }, "customToken": { - "message": "Token Kustom" + "message": "Token kustom" }, "customTokenWarningInNonTokenDetectionNetwork": { "message": "Deteksi token belum tersedia di jaringan ini. Harap impor token secara manual dan pastikan keamanannya. Pelajari seputar $1" }, "customTokenWarningInTokenDetectionNetwork": { - "message": "Sebelum mengimpor token secara manual, pastikan keamanannya. Pelajari seputar $1." + "message": "Sebelum mengimpor token secara manual, pastikan keamanannya. Pelajari seputar $1" + }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "Pastikan keamanan token sebelum mengimpornya. Pelajari cara menghindari $1. Anda juga dapat mengaktifkan deteksi token $2." }, "customerSupport": { "message": "dukungan pelanggan" @@ -787,14 +878,14 @@ "data": { "message": "Data" }, - "dataBackupFoundInfo": { - "message": "Beberapa data akun Anda telah dicadangkan selama pemasangan MetaMask yang lalu. Ini bisa mencakup pengaturan, kontak, dan token Anda. Apakah Anda ingin memulihkan data ini sekarang?" + "dataBackupSeemsCorrupt": { + "message": "Tidak dapat memulihkan data Anda. File tampaknya rusak." }, "dataHex": { "message": "Hex" }, "decimal": { - "message": "Desimal Token" + "message": "Desimal token" }, "decimalsMustZerotoTen": { "message": "Desimal minimal 0, dan tidak lebih dari 36." @@ -823,10 +914,10 @@ "message": "Hapus" }, "deleteAccount": { - "message": "Hapus Akun" + "message": "Hapus akun" }, "deleteNetwork": { - "message": "Hapus Jaringan?" + "message": "Hapus jaringan?" }, "deleteNetworkDescription": { "message": "Anda yakin ingin menghapus jaringan ini?" @@ -835,6 +926,12 @@ "message": "Deposit $1", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "Pelajari selengkapnya" + }, + "deprecatedTestNetworksMsg": { + "message": "Sehubungan dengan perubahan protokol Ethereum: jaringan uji Rinkeby, Ropsten, dan Kovan mungkin tidak dapat beroperasi dengan baik dan akan segera dihentikan." + }, "description": { "message": "Deskripsi" }, @@ -842,7 +939,7 @@ "message": "Detail" }, "directDepositCrypto": { - "message": "Deposit Langsung $1" + "message": "Deposit langsung $1" }, "directDepositCryptoExplainer": { "message": "Jika sudah memiliki $1, cara tercepat mendapatkan $1 di dompet baru Anda adalah dengan deposit langsung." @@ -894,7 +991,7 @@ "message": "Unduh Frasa Pemulihan Rahasia dan biarkan tersimpan secara aman di media penyimpanan atau hard drive eksternal terenkripsi." }, "downloadStateLogs": { - "message": "Unduh Log Status" + "message": "Unduh log status" }, "dropped": { "message": "Terputus" @@ -912,7 +1009,7 @@ "message": "Edit biaya pembatalan gas" }, "editContact": { - "message": "Edit Kontak" + "message": "Edit kontak" }, "editGasEducationButtonText": { "message": "Bagaimana saya harus memilih?" @@ -1022,28 +1119,28 @@ "message": "Ini akan menurunkan biaya maks Anda, tetapi jika lalu lintas jaringan meningkat, transaksi Anda mungkin tertunda atau gagal." }, "editNonceField": { - "message": "Edit Nonce" + "message": "Edit nonce" }, "editNonceMessage": { "message": "Ini merupakan fitur lanjutan, gunakan dengan hati-hati." }, "editPermission": { - "message": "Edit Izin" + "message": "Edit izin" }, "editSpeedUpEditGasFeeModalTitle": { "message": "Edit biaya percepatan gas" }, "enableAutoDetect": { - "message": " Aktifkan Deteksi Otomatis" + "message": " Aktifkan deteksi otomatis" }, "enableEIP1559V2": { - "message": "Aktifkan UI Biaya Gas yang Ditingkatkan" + "message": "Aktifkan UI biaya gas yang ditingkatkan" }, "enableEIP1559V2AlertMessage": { "message": "Kami telah memperbarui cara kerja estimasi dan penyesuaian biaya gas." }, "enableEIP1559V2ButtonText": { - "message": "Aktifkan UI Biaya Gas yang Ditingkatkan di Pengaturan" + "message": "Aktifkan UI biaya gas yang ditingkatkan di Pengaturan" }, "enableEIP1559V2Description": { "message": "Kami telah memperbarui cara kerja estimasi dan penyesuaian gas. Aktifkan jika Anda ingin menggunakan pengalaman gas baru. $1", @@ -1062,7 +1159,7 @@ "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" + "message": "Aktifkan transaksi pintar" }, "enableToken": { "message": "aktifkan $1", @@ -1079,7 +1176,7 @@ "message": "Anda lulus ujian - jaga Frasa Pemulihan Rahasia Anda tetap aman, ini tanggung jawab Anda!" }, "endOfFlowMessage10": { - "message": "Semua Selesai" + "message": "Semua selesai" }, "endOfFlowMessage2": { "message": "Kiat menyimpannya secara aman" @@ -1094,7 +1191,7 @@ "message": "Berhati-hatilah dengan pengelabuan! MetaMask tidak pernah secara spontan meminta Frasa Pemulihan Rahasia Anda." }, "endOfFlowMessage6": { - "message": "Jika Anda perlu mencadangkan Frasa Pemulihan Rahasia lagi, Anda dapat menemukannya di Pengaturan -> Keamanan." + "message": "Jika Anda perlu mencadangkan Frasa Pemulihan Rahasia lagi, Anda dapat menemukannya di Pengaturan > Keamanan." }, "endOfFlowMessage7": { "message": "Jika Anda memiliki pertanyaan atau melihat sesuatu yang mencurigakan, hubungi dukungan $1 kami.", @@ -1110,8 +1207,17 @@ "message": "Titik akhir memberikan hasil ID rantai yang berbeda: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "Deteksi token yang ditingkatkan" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "Saat ini deteksi token yang ditingkatkan tersedia di $1. $2" + }, + "enhancedTokenDetectionDescription": { + "message": "API token ConsenSys mengumpulkan daftar token dari berbagai daftar token pihak ketiga. Saat diaktifkan, token akan secara otomatis terdeteksi, dan dapat dicari, di mainnet Ethereum, Binance, Polygon, dan Avalanche. Saat dinonaktifkan, deteksi dan pencarian otomatis hanya dapat dilakukan di mainnet Ethereum." + }, "ensIllegalCharacter": { - "message": "Karakter Ilegal untuk ENS." + "message": "Karakter tidak sah untuk ENS." }, "ensNotFoundOnCurrentNetwork": { "message": "Nama ENS tidak ditemukan pada jaringan saat ini. Coba untuk beralih ke Ethereum Mainnet." @@ -1126,7 +1232,7 @@ "message": "Pencarian ENS gagal." }, "enterMaxSpendLimit": { - "message": "Masukkan Batas Penggunaan Maksimum" + "message": "Masukkan batas penggunaan maksimum" }, "enterPassword": { "message": "Masukkan kata sandi" @@ -1139,7 +1245,7 @@ "description": "Displayed error code for debugging purposes. $1 is the error code" }, "errorDetails": { - "message": "Detail Galat", + "message": "Detail kesalahan", "description": "Title for collapsible section that displays error details for debugging purposes" }, "errorMessage": { @@ -1166,14 +1272,11 @@ "message": "Tumpukan:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Estimasi Waktu Pemrosesan" - }, "ethGasPriceFetchWarning": { "message": "Biaya gas cadangan diberikan karena layanan estimasi gas utama saat ini tidak tersedia." }, "ethereumPublicAddress": { - "message": "Alamat Publik Ethereum" + "message": "Alamat publik Ethereum" }, "etherscan": { "message": "Etherscan" @@ -1194,10 +1297,10 @@ "message": "Eksperimental" }, "exportPrivateKey": { - "message": "Ekspor Kunci Privat" + "message": "Ekspor kunci privat" }, "externalExtension": { - "message": "Ekstensi Eksternal" + "message": "Ekstensi eksternal" }, "failed": { "message": "Gagal" @@ -1214,9 +1317,6 @@ "fast": { "message": "Cepat" }, - "fastest": { - "message": "Tercepat" - }, "feeAssociatedRequest": { "message": "Biaya dikaitkan dengan permintaan ini." }, @@ -1293,7 +1393,7 @@ "message": "Fungsi: SetApprovalForAll" }, "functionType": { - "message": "Jenis Fungsi" + "message": "Jenis fungsi" }, "gas": { "message": "Gas" @@ -1309,10 +1409,10 @@ "message": "Estimasi rendah, sedang, dan tinggi kami tidak tersedia." }, "gasFee": { - "message": "Biaya Gas" + "message": "Biaya gas" }, "gasLimit": { - "message": "Batas Gas" + "message": "Batas gas" }, "gasLimitInfoTooltipContent": { "message": "Batas gas adalah jumlah unit gas maksimum yang ingin Anda gunakan." @@ -1334,16 +1434,16 @@ "message": "Opsi gas" }, "gasPrice": { - "message": "Biaya Gas (GWEI)" + "message": "Biaya gas (GWEI)" }, "gasPriceExcessive": { "message": "Biaya gas Anda diatur terlalu tinggi. Pertimbangkan untuk menurunkan jumlahnya." }, "gasPriceExcessiveInput": { - "message": "Biaya Gas Terlalu Tinggi" + "message": "Biaya gas terlalu tinggi" }, "gasPriceExtremelyLow": { - "message": "Biaya Gas Sangat Rendah" + "message": "Biaya gas sangat rendah" }, "gasPriceFetchFailed": { "message": "Estimasi biaya gas gagal karena terjadi galat pada jaringan." @@ -1384,14 +1484,14 @@ "description": "$1 represents an amount of time" }, "gasUsed": { - "message": "Gas yang Dipakai" + "message": "Gas yang digunakan" }, "gdprMessage": { "message": "Data ini dikumpulkan dan oleh karenanya bersifat anonim untuk tujuan Peraturan Perlindungan Data Umum (UE) 2016/679. Untuk informasi selengkapnya sehubungan dengan praktik privasi kami, lihat $1 kami.", "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" }, "gdprMessagePrivacyPolicy": { - "message": "Kebijakan Privasi di sini", + "message": "Kebijakan privasi di sini", "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" }, "general": { @@ -1411,7 +1511,7 @@ "message": "Kembali" }, "goerli": { - "message": "Jaringan Uji Goerli" + "message": "Jaringan uji Goerli" }, "gotIt": { "message": "Mengerti!" @@ -1449,7 +1549,7 @@ "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hexData": { - "message": "Data Hex" + "message": "Data hex" }, "hide": { "message": "Sembunyikan" @@ -1464,14 +1564,14 @@ "message": "Sembunyikan token" }, "hideTokenPrompt": { - "message": "Sembunyikan Token?" + "message": "Sembunyikan token?" }, "hideTokenSymbol": { "message": "Sembunyikan $1", "description": "$1 is the symbol for a token (e.g. 'DAI')" }, "hideZeroBalanceTokens": { - "message": "Sembunyikan Token Tanpa Saldo" + "message": "Sembunyikan token tanpa saldo" }, "high": { "message": "Agresif" @@ -1497,7 +1597,7 @@ "description": "Button to import an account from a selected file" }, "importAccount": { - "message": "Impor Akun" + "message": "Impor akun" }, "importAccountError": { "message": "Galat saat mengimpor akun." @@ -1509,7 +1609,7 @@ "message": "Impor dompet dengan Frasa Pemulihan Rahasia" }, "importMyWallet": { - "message": "Impor Dompet Saya" + "message": "Impor dompet saya" }, "importNFT": { "message": "Impor NFT" @@ -1526,6 +1626,12 @@ "importNFTs": { "message": "Impor NFT" }, + "importSelectedTokens": { + "message": "Impor token yang dipilih?" + }, + "importSelectedTokensDescription": { + "message": "Hanya token yang dipilih yang akan muncul di dompet Anda. Anda selalu dapat mengimpor token tersembunyi nanti dengan mencarinya." + }, "importTokenQuestion": { "message": "Impor token?" }, @@ -1536,7 +1642,7 @@ "message": "impor token" }, "importTokensCamelCase": { - "message": "Impor Token" + "message": "Impor token" }, "importWallet": { "message": "Impor dompet" @@ -1552,6 +1658,9 @@ "message": "Diimpor", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "di Pengaturan Anda" + }, "infuraBlockedNotification": { "message": "MetaMask tidak dapat terhubung ke host blockchain. Tinjau alasan yang mungkin $1.", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "Transaksi awal Anda dikonfirmasikan oleh jaringan. Klik Oke untuk kembali." }, + "install": { + "message": "Instal" + }, "insufficientBalance": { "message": "Saldo tidak cukup." }, @@ -1592,7 +1704,7 @@ "message": "Aset ini merupakan NFT dan harus ditambahkan kembali di halaman Impor NFT yang ada di bawah tab NFT" }, "invalidBlockExplorerURL": { - "message": "URL Block Explorer Tidak Valid" + "message": "URL block explorer tidak valid" }, "invalidChainIdTooBig": { "message": "ID rantai tidak valid. ID rantai terlalu besar." @@ -1609,7 +1721,7 @@ "description": "$1 is a link to https://chainid.network" }, "invalidCustomNetworkAlertTitle": { - "message": "Jaringan Kustom Tidak Valid" + "message": "Jaringan kustom tidak valid" }, "invalidHexNumber": { "message": "Bilangan heksadesimal tidak valid." @@ -1654,26 +1766,20 @@ "message": "File JSON", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "untuk mengawasi token dan NFT Anda di seluruh akun dan jaringan." + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Tutorial)" - }, "knownAddressRecipient": { "message": "Alamat kontrak yang diketahui." }, "knownTokenWarning": { "message": "Tindakan ini akan mengedit token yang telah terdaftar dalam dompet Anda, yang dapat digunakan untuk menipu Anda. Setujui hanya jika Anda yakin bahwa Anda ingin mengubah apa yang diwakili token ini. Pelajari selengkapnya seputar $1" }, - "kovan": { - "message": "Jaringan Uji Kovan" - }, "lastConnected": { - "message": "Terakhir Terhubung" - }, - "learmMoreAboutGas": { - "message": "Ingin $1 seputar gas?" + "message": "Terakhir terhubung" }, "learnCancelSpeeedup": { "message": "Pelajari cara $1", @@ -1682,6 +1788,10 @@ "learnMore": { "message": "mempelajari" }, + "learnMoreAboutGas": { + "message": "Ingin $1 seputar gas?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Pelajari selengkapnya" }, @@ -1755,7 +1865,7 @@ "message": "Tautan" }, "loadMore": { - "message": "Muat Lebih Banyak" + "message": "Muat lebih banyak" }, "loading": { "message": "Memuat..." @@ -1764,7 +1874,7 @@ "message": "Memuat NFT..." }, "loadingTokens": { - "message": "Memuat Token..." + "message": "Memuat token..." }, "localhost": { "message": "Localhost 8545" @@ -1942,11 +2052,15 @@ "message": "Harus memilih minimal 1 token." }, "myAccounts": { - "message": "Akun Saya" + "message": "Akun saya" }, "name": { "message": "Nama" }, + "nativeToken": { + "message": "Token asli di jaringan ini adalah $1. Ini merupakan token yang digunakan untuk biaya gas.", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "Untuk berinteraksi dengan aplikasi terdesentralisasi menggunakan MetaMask, Anda memerlukan $1 di dompet.", "description": "$1 represents the cypto symbol to be purchased" @@ -1956,13 +2070,13 @@ "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" }, "needHelpFeedback": { - "message": "Bagikan Masukan Anda" + "message": "Bagikan umpan balik Anda" }, "needHelpLinkText": { "message": "Dukungan MetaMask" }, "needHelpSubmitTicket": { - "message": "Kirimkan Tiket" + "message": "Kirimkan tiket" }, "needImportFile": { "message": "Anda harus memilih file untuk diimpor.", @@ -1978,13 +2092,13 @@ "message": "Jaringan berhasil ditambahkan!" }, "networkDetails": { - "message": "Detail Jaringan" + "message": "Detail jaringan" }, "networkIsBusy": { "message": "Jaringan sibuk. Harga gas tinggi dan estimasinya kurang akurat." }, "networkName": { - "message": "Nama Jaringan" + "message": "Nama jaringan" }, "networkNameAvalanche": { "message": "Avalanche" @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -2033,8 +2150,11 @@ "nevermind": { "message": "Lupakan" }, + "new": { + "message": "Baru!" + }, "newAccount": { - "message": "Akun Baru" + "message": "Akun baru" }, "newAccountDetectedDialogMessage": { "message": "Alamat baru terdeteksi! Klik di sini untuk menambahkan ke buku alamat Anda." @@ -2047,10 +2167,10 @@ "message": "Koleksi berhasil ditambahkan!" }, "newContact": { - "message": "Kontak Baru" + "message": "Kontak baru" }, "newContract": { - "message": "Kontrak Baru" + "message": "Kontrak baru" }, "newNFTDetectedMessage": { "message": "Izinkan MetaMask mendeteksi NFT dari Opensea secara otomatis dan menampilkannya di dompet Anda." @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "Token diimpor" }, - "newTotal": { - "message": "Total Baru" - }, - "newTransactionFee": { - "message": "Biaya Transaksi Baru" - }, "newValues": { "message": "nilai baru" }, @@ -2094,7 +2208,7 @@ "message": "NFT" }, "nftTokenIdPlaceholder": { - "message": "Masukkan ID koleksi" + "message": "Masukkan id token" }, "nfts": { "message": "NFT" @@ -2112,10 +2226,10 @@ "message": "Tidak, saya sudah memiliki Frasa Pemulihan Rahasia" }, "noConversionDateAvailable": { - "message": "Tanggal Konversi Mata Uang Tidak Tersedia" + "message": "Tanggal konversi mata uang tidak tersedia" }, "noConversionRateAvailable": { - "message": "Tidak Ada Nilai Konversi yang Tersedia" + "message": "Nilai konversi tidak tersedia" }, "noNFTs": { "message": "Belum ada NFT" @@ -2124,7 +2238,7 @@ "message": "Belum ada Snap yang diinstal" }, "noThanks": { - "message": "Tidak, Terima Kasih" + "message": "Tidak, terima kasih" }, "noThanksVariant2": { "message": "Tidak, terima kasih." @@ -2148,7 +2262,7 @@ "message": "Aktifkan ini untuk mengubah nonce (nomor transaksi) di layar konfirmasi. Ini merupakan fitur lanjutan, gunakan dengan hati-hati." }, "nonceFieldHeading": { - "message": "Sesuaikan Nonce" + "message": "Nonce kustom" }, "notBusy": { "message": "Tidak sibuk" @@ -2157,13 +2271,13 @@ "message": "Apa ini akun yang benar? Ini berbeda dari akun yang saat ini dipilih di dompet Anda" }, "notEnoughGas": { - "message": "Gas Tidak Cukup" + "message": "Gas tidak cukup" }, "notifications": { "message": "Notifikasi" }, "notifications10ActionText": { - "message": "Lihat di pengaturan", + "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." }, "notifications10DescriptionOne": { @@ -2188,7 +2302,7 @@ "message": "Aktifkan mode gelap" }, "notifications12Description": { - "message": "Mode gelap pada Ekstensi akhirnya hadir! Untuk menyalakannya, buka Pengaturan -> Eksperimental dan pilih salah satu opsi tampilan: Terang, Gelap, Sistem." + "message": "Mode gelap pada Ekstensi akhirnya hadir! Untuk mengaktifkannya, buka Pengaturan > Eksperimental dan pilih salah satu opsi tampilan: Terang, Gelap, Sistem." }, "notifications12Title": { "message": "Kapan mode gelap? Ini saatnya mode gelap! ️🕶️🦊" @@ -2197,12 +2311,29 @@ "message": "Tampilkan daftar jaringan khusus" }, "notifications13Description": { - "message": "Kini Anda dapat menambahkan jaringan khusus populer berikut dengan mudah: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm, dan Polygon! Untuk mengaktifkan fitur ini, buka Pengaturan -> Eksperimental dan aktifkan \"Tampilkan daftar jaringan khusus\"!", + "message": "Kini Anda dapat menambahkan jaringan khusus populer berikut dengan mudah: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm, dan Polygon! Untuk mengaktifkan fitur ini, buka Pengaturan > Eksperimental dan aktifkan \"Tampilkan daftar jaringan khusus\"!", "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." }, "notifications13Title": { "message": "Tambahkan Jaringan Populer" }, + "notifications14ActionText": { + "message": "Tampilkan pengaturan cadangan" + }, + "notifications14Description": { + "message": "Kami menghentikan fitur data 3Box kami pada awal Oktober. Untuk mencadangkan dan memulihkan dompet Anda secara manual, gunakan tombol \"Cadangkan sekarang\" di Pengaturan Lanjutan.", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "Penghentian 3Box" + }, + "notifications15Description": { + "message": "Anda tidak perlu melakukan tindakan apa pun, jadi tetap gunakan dompet Anda seperti biasa. Waspadai potensi penipuan selama Penggabungan.", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "Penggabungan Ethereum telah tiba!" + }, "notifications1Description": { "message": "Pengguna MetaMask Mobile kini bisa menukar token di dalam dompet seluler mereka. Pindai kode QR untuk mendapatkan aplikasi seluler dan mulai menukar.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2252,7 +2383,7 @@ "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." }, "notifications6Title": { - "message": "Pembaruan Dukungan Ledger untuk Pengguna Chrome", + "message": "Pembaruan dukungan ledger untuk pengguna Chrome", "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" }, "notifications7DescriptionOne": { @@ -2268,7 +2399,7 @@ "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, "notifications8ActionText": { - "message": "Buka Pengaturan Lanjutan", + "message": "Buka Pengaturan > Lanjutan", "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": { @@ -2276,7 +2407,7 @@ "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": { - "message": "Untuk pengalaman ledger yang lebih mudah dan stabil, buka tab Pengaturan lanjutan dan alihkan 'Jenis Koneksi Ledger Pilihan' ke 'WebHID'.", + "message": "Untuk pengalaman ledger yang lebih mudah dan stabil, buka tab Pengaturan > Lanjutan dan alihkan 'Jenis Koneksi Ledger Pilihan' ke 'WebHID'.", "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." }, "notifications8Title": { @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "Tandai semua telah dibaca" }, + "numberOfNewTokensDetectedPlural": { + "message": "$1 token baru ditemukan di akun ini", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "1 token baru ditemukan di akun ini" + }, "ofTextNofM": { "message": "dari" }, @@ -2327,7 +2465,7 @@ "message": "Impor dompet yang ada" }, "onboardingPinExtensionBillboardAccess": { - "message": "Akses Penuh" + "message": "Akses penuh" }, "onboardingPinExtensionBillboardDescription": { "message": "Ekstensi ini dapat melihat dan mengubah informasi" @@ -2384,6 +2522,9 @@ "message": "Buka MetaMask dalam layar penuh untuk menghubungkan ledger Anda melalui WebHID.", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "Buka di block explorer" + }, "optional": { "message": "Opsional" }, @@ -2454,10 +2595,16 @@ "message": "Permohonan izin" }, "permissionRequestCapitalized": { - "message": "Permintaan Izin" + "message": "Permintaan izin" + }, + "permissionRequested": { + "message": "Diminta sekarang" + }, + "permissionRevoked": { + "message": "Dicabut dalam pembaruan ini" }, "permission_accessNetwork": { - "message": "Akses Internet.", + "message": "Akses internet.", "description": "The description of the `endowment:network-access` permission." }, "permission_accessSnap": { @@ -2476,9 +2623,13 @@ "message": "Operasikan sepanjang waktu.", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "Kontrol akun dan aset Anda dengan $1 ($2).", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "Kontrol akun dan aset \"$1\" Anda.", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "Simpan dan kelola datanya di perangkat Anda.", @@ -2488,10 +2639,18 @@ "message": "Tampilkan pemberitahuan.", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "Dapatkan dan tampilkan wawasan transaksi.", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "Izin tak dikenal: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "Lihat kunci publik Anda untuk $1 ($2).", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "Izin" }, @@ -2508,8 +2667,11 @@ "popularCustomNetworks": { "message": "Jaringan khusus populer" }, + "portfolioSite": { + "message": "Situs portofolio" + }, "preferredLedgerConnectionType": { - "message": "Jenis Koneksi Ledger Pilihan", + "message": "Jenis koneksi Ledger Pilihan", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" }, "preparingSwap": { @@ -2519,7 +2681,7 @@ "message": "Sebelumnya" }, "primaryCurrencySetting": { - "message": "Mata Uang Primer" + "message": "Mata uang primer" }, "primaryCurrencySettingDescription": { "message": "Pilih asal untuk memprioritaskan nilai yang ditampilkan dalam mata uang asal rantai (contoh, ETH). Pilih Fiat untuk memprioritaskan nilai yang ditampilkan dalam mata uang fiat yang Anda pilih." @@ -2531,7 +2693,7 @@ "message": "Biaya Prioritas" }, "privacyMsg": { - "message": "Kebijakan Privasi" + "message": "Kebijakan privasi" }, "privateKey": { "message": "Kunci Privat", @@ -2541,19 +2703,19 @@ "message": "Peringatan: Jangan ungkapkan kunci ini. Siapa pun yang memiliki kunci privat Anda dapat mencuri aset yang disimpan di akun Anda." }, "privateNetwork": { - "message": "Jaringan Privat" + "message": "Jaringan privat" }, "proceedWithTransaction": { "message": "Saya tetap ingin melanjutkan" }, "proposedApprovalLimit": { - "message": "Batas Persetujuan yang Diajukan" + "message": "Batas persetujuan yang diajukan" }, "provide": { "message": "Berikan" }, "publicAddress": { - "message": "Alamat Publik" + "message": "Alamat publik" }, "queue": { "message": "Antrean" @@ -2613,7 +2775,7 @@ "message": "Tolak" }, "rejectAll": { - "message": "Tolak Semua" + "message": "Tolak semua" }, "rejectTxsDescription": { "message": "Anda akan menolak $1 transaksi secara bertahap." @@ -2665,13 +2827,13 @@ "message": "Atur ulang" }, "resetAccount": { - "message": "Atur Ulang Akun" + "message": "Reset akun" }, "resetAccountDescription": { "message": "Mengatur ulang akun akan mengosongkan riwayat transaksi Anda. Ini tidak akan mengubah saldo di akun atau mengharuskan Anda untuk memasukkan kembali Frasa Pemulihan Rahasia." }, "resetWallet": { - "message": "Reset Dompet" + "message": "Reset dompet" }, "resetWalletSubHeader": { "message": "MetaMask tidak menyimpan salinan kata sandi Anda. Jika terjadi masalah saat membuka akun, reset dompet Anda. Anda dapat melakukannya dengan memberikan Frasa Pemulihan Rahasia yang digunakan saat mengatur dompet." @@ -2688,12 +2850,20 @@ "restore": { "message": "Pulihkan" }, - "restoreWalletPreferences": { - "message": "Cadangan data Anda dari $1 telah ditemukan. Pulihkan preferensi dompet Anda?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "Tidak dapat memulihkan data Anda dari berkas yang disediakan" + }, + "restoreSuccessful": { + "message": "Data Anda telah berhasil dipulihkan" + }, + "restoreUserData": { + "message": "Pulihkan data pengguna" + }, + "restoreUserDataDescription": { + "message": "Anda dapat memulihkan pengaturan pengguna yang berisi preferensi dan alamat akun dari berkas JSON yang dicadangkan sebelumnya." }, "retryTransaction": { - "message": "Coba Lagi Transaksi" + "message": "Coba lagi transaksi" }, "reusedTokenNameWarning": { "message": "Token di sini menggunakan kembali simbol dari token lain yang Anda lihat, ini bisa jadi membingungkan atau menipu." @@ -2721,29 +2891,26 @@ "message": "Dengan mencabut izin, $1 berikut tidak lagi dapat mengakses $2 Anda", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Jaringan Uji Rinkeby" - }, - "ropsten": { - "message": "Jaringan Uji Ropsten" + "revokeSpendingCapTooltipText": { + "message": "Kontrak ini tidak akan dapat mempergunakan token Anda saat ini atau di masa mendatang." }, "rpcUrl": { "message": "URL RPC Baru" }, "safeTransferFrom": { - "message": "Transfer Aman Dari" + "message": "Transfer aman dari" }, "save": { "message": "Simpan" }, "saveAsCsvFile": { - "message": "Simpan sebagai File CSV" + "message": "Simpan sebagai file CSV" }, "scanInstructions": { "message": "Tempatkan kode QR di bagian depan kamera Anda" }, "scanQrCode": { - "message": "Pindai Kode QR" + "message": "Pindai kode QR" }, "scrollDown": { "message": "Gulir ke bawah" @@ -2752,16 +2919,16 @@ "message": "Cari" }, "searchAccounts": { - "message": "Cari Akun" + "message": "Cari akun" }, "searchResults": { - "message": "Cari Hasil" + "message": "Cari hasil" }, "searchSettings": { - "message": "Cari di pengaturan" + "message": "Cari di Pengaturan" }, "searchTokens": { - "message": "Cari Token" + "message": "Cari token" }, "secretBackupPhraseDescription": { "message": "Frasa Pemulihan Rahasia memudahkan Anda untuk mencadangkan dan memulihkan akun." @@ -2776,10 +2943,10 @@ "message": "Frasa Pemulihan Rahasia" }, "secureWallet": { - "message": "Dompet Aman" + "message": "Amankan dompet" }, "securityAndPrivacy": { - "message": "Keamanan & Privasi" + "message": "Keamanan & privasi" }, "seedPhraseConfirm": { "message": "Konfirmasikan Frasa Pemulihan Rahasia" @@ -2838,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "Tuliskan Frasa Pemulihan Rahasia Anda" }, - "selectAHigherGasFee": { - "message": "Pilih biaya gas yang lebih tinggi untuk mempercepat pemrosesan transaksi Anda.*" - }, "selectAccounts": { "message": "Pilih akun" }, @@ -2848,7 +3012,7 @@ "message": "Pilih semua" }, "selectAnAccount": { - "message": "Pilih Akun" + "message": "Pilih akun" }, "selectAnAccountAlreadyConnected": { "message": "Akun ini sudah terhubung ke MetaMask." @@ -2857,7 +3021,7 @@ "message": "Pilih masing-masing frasa untuk memastikan kebenarannya." }, "selectHdPath": { - "message": "Pilih Jalur HD" + "message": "Pilih path HD" }, "selectNFTPrivacyPreference": { "message": "Aktifkan deteksi NFT pada Pengaturan" @@ -2874,9 +3038,6 @@ "send": { "message": "Kirim" }, - "sendAmount": { - "message": "Kirim Jumlah" - }, "sendBugReport": { "message": "Kirimi kami laporan bug." }, @@ -2888,7 +3049,7 @@ "message": "Kirim ke" }, "sendTokens": { - "message": "Kirim Token" + "message": "Kirim token" }, "sendingDisabled": { "message": "Belum mendukung pengiriman aset NFT ERC-1155." @@ -2901,6 +3062,9 @@ "message": "Peringatan: Anda akan mengirim kontrak token yang berpotensi mengakibatkan hilangnya dana. $1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "Jaringan uji Sepolia" + }, "setAdvancedPrivacySettings": { "message": "Atur pengaturan privasi lanjutan" }, @@ -2908,7 +3072,7 @@ "message": "MetaMask menggunakan layanan pihak ketiga tepercaya ini untuk meningkatkan kegunaan dan keamanan produk." }, "setApprovalForAll": { - "message": "Atur Persetujuan untuk Semua" + "message": "Atur persetujuan untuk semua" }, "setApprovalForAllTitle": { "message": "Setujui $1 tanpa batas penggunaan", @@ -2933,20 +3097,14 @@ "showAdvancedGasInlineDescription": { "message": "Pilih ini untuk menampilkan biaya gas dan kontrol batas secara langsung di layar kirim dan konfirmasi." }, - "showCustomNetworkList": { - "message": "Tampilkan Daftar Jaringan Khusus" - }, - "showCustomNetworkListDescription": { - "message": "Pilih ini untuk menampilkan daftar jaringan dengan detail yang telah diisi saat menambahkan jaringan baru." - }, "showFiatConversionInTestnets": { - "message": "Tampilkan Konversi di Testnet" + "message": "Tampilkan konversi di jaringan uji" }, "showFiatConversionInTestnetsDescription": { "message": "Pilih ini untuk menampilkan konversi fiat di Testnet" }, "showHexData": { - "message": "Tampilkan Data Hex" + "message": "Tampilkan data Hex" }, "showHexDataDescription": { "message": "Pilih ini untuk menampilkan bidang data hex di layar kirim" @@ -2955,7 +3113,7 @@ "message": "Tampil/Sembunyi" }, "showIncomingTransactions": { - "message": "Tampilkan Transaksi Masuk" + "message": "Tampilkan transaksi masuk" }, "showIncomingTransactionsDescription": { "message": "Pilih ini untuk menggunakan Etherscan untuk menampilkan transaksi yang masuk di daftar transaksi" @@ -2967,7 +3125,7 @@ "message": "Tampilkan Kunci Privat" }, "showRecommendations": { - "message": "Tampilkan Rekomendasi" + "message": "Tampilkan rekomendasi" }, "showTestnetNetworks": { "message": "Tampilkan jaringan pengujian" @@ -2976,7 +3134,7 @@ "message": "Pilih opsi ini untuk menampilkan jaringan pengujian dalam daftar jaringan" }, "sigRequest": { - "message": "Permintaan Tanda Tangan" + "message": "Permintaan tanda tangan" }, "sign": { "message": "Tanda tangan" @@ -2985,7 +3143,7 @@ "message": "Menandatangani pesan ini bisa berakibat fatal. Tanda tangan ini berpotensi melakukan operasi atas nama akun Anda, termasuk memberikan kendali penuh atas akun Anda dan semua asetnya ke situs yang meminta tindakan ini. Hanya tanda tangani pesan ini jika Anda tahu apa yang Anda lakukan atau sepenuhnya memercayai situs yang meminta." }, "signatureRequest": { - "message": "Permintaan Tanda Tangan" + "message": "Permintaan tanda tangan" }, "signatureRequest1": { "message": "Pesan" @@ -2993,6 +3151,9 @@ "signed": { "message": "Ditandatangani" }, + "signin": { + "message": "Masuk" + }, "simulationErrorMessageV2": { "message": "Kami tidak dapat memperkirakan gas. Tampaknya ada kesalahan dalam kontrak dan transaksi ini berpotensi gagal." }, @@ -3000,16 +3161,13 @@ "message": "Lewati" }, "skipAccountSecurity": { - "message": "Lewati Keamanan Akun?" + "message": "Lewati keamanan akun?" }, "skipAccountSecurityDetails": { "message": "Saya memahami bahwa sampai saya mencadangkan Frasa Pemulihan Rahasia, saya dapat kehilangan akun saya dan semua aset yang ada." }, - "slow": { - "message": "Lambat" - }, "smartTransaction": { - "message": "Transaksi Pintar" + "message": "Transaksi pintar" }, "snapAccess": { "message": "Snap $1 memiliki akses ke:", @@ -3019,6 +3177,10 @@ "message": "Ditambahkan pada $1 dari $2", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "Galat Snap: '$1'. Kode Galat: '$2'", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -3027,14 +3189,34 @@ "message": "Instal Snap" }, "snapInstallWarningCheck": { - "message": "Untuk mengonfirmasikan Anda sudah paham, centang semua." + "message": "Untuk mengonfirmasikan bahwa Anda sudah paham, centang kotaknya." + }, + "snapInstallWarningCheckPlural": { + "message": "Untuk mengonfirmasikan bahwa Anda memahaminya, centang semua kotak." + }, + "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.", + "description": "The first parameter is the name of the snap and the second one is the protocol" }, "snapRequestsPermission": { "message": "Snap ini meminta izin berikut:" }, + "snapUpdate": { + "message": "Perbarui Snap" + }, + "snapUpdateExplanation": { + "message": "$1 memerlukan versi snap yang lebih baru.", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "Snap" }, + "snapsInsightLoading": { + "message": "Memuat wawasan transaksi..." + }, + "snapsNoInsight": { + "message": "Snap tidak mengembalikan wawasan apa pun" + }, "snapsSettingsDescription": { "message": "Kelola Snap Anda" }, @@ -3124,10 +3306,10 @@ "message": "Galat pada log status pengambilan." }, "stateLogFileName": { - "message": "Log Status MetaMask" + "message": "Log status MetaMask" }, "stateLogs": { - "message": "Log Status" + "message": "Log status" }, "stateLogsDescription": { "message": "Log status berisi alamat akun publik Anda dan transaksi terkirim." @@ -3263,7 +3445,7 @@ "message": "Transaksi telah berhasil tetapi kami tidak yakin transaksi yang mana. Hal ini dikarenakan Anda mengirimkan transaksi lain saat pertukaran ini sedang diproses." }, "stxUserCancelled": { - "message": "Pertukaran dibatalkan" + "message": "Swap dibatalkan" }, "stxUserCancelledDescription": { "message": "Transaksi Anda telah dibatalkan dan Anda tidak membayar biaya gas yang tidak perlu." @@ -3281,7 +3463,7 @@ "message": "Dukungan" }, "supportCenter": { - "message": "Kunjungi Pusat Dukungan kami" + "message": "Kunjungi pusat dukungan kami" }, "swap": { "message": "Pertukaran" @@ -3477,7 +3659,10 @@ "message": "Meminta kuotasi" }, "swapReviewSwap": { - "message": "Tinjau Swap" + "message": "Tinjau swap" + }, + "swapSearchNameOrAddress": { + "message": "Cari nama atau tempel alamat" }, "swapSelect": { "message": "Pilih" @@ -3498,6 +3683,9 @@ "message": "$1%", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "Jika harga berubah antara waktu penempatan dan konfirmasi order Anda, ini disebut “slippage”. Swap Anda akan otomatis dibatalkan jika slippage melebihi pengaturan “slippage tolerance”." + }, "swapSource": { "message": "Sumber likuiditas" }, @@ -3573,13 +3761,13 @@ "message": "Slippage 0%" }, "swapsAdvancedOptions": { - "message": "Opsi Lanjutan" + "message": "Opsi lanjutan" }, "swapsExcessiveSlippageWarning": { "message": "Jumlah slippage terlalu tinggi dan akan mengakibatkan tarif yang buruk. Kurangi toleransi slippage Anda ke nilai di bawah 15%." }, "swapsMaxSlippage": { - "message": "Toleransi Slippage" + "message": "Toleransi slippage" }, "swapsNotEnoughForTx": { "message": "$1 tidak cukup untuk menyelesaikan transaksi ini", @@ -3598,7 +3786,7 @@ "message": "Beralih jaringan" }, "switchNetworks": { - "message": "Beralih Jaringan" + "message": "Beralih jaringan" }, "switchToNetwork": { "message": "Beralih ke $1", @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "Beralih ke akun ini" }, + "switchedTo": { + "message": "Anda telah beralih ke" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "Mengalihkan jaringan akan membatalkan semua konfirmasi yang tertunda" }, @@ -3643,26 +3834,17 @@ "syncWithMobileTitle": { "message": "Sinkronkan dengan seluler" }, - "syncWithThreeBox": { - "message": "Sinkronkan data dengan 3Box (eksperimen)" - }, - "syncWithThreeBoxDescription": { - "message": "Aktifkan agar pengaturan Anda dicadangkan dengan 3Box. Fitur ini sekarang sedang dalam masa percobaan; risiko ditanggung sendiri." - }, - "syncWithThreeBoxDisabled": { - "message": "3Box telah dinonaktifkan karena terjadi galat selama sinkronisasi awal" - }, "tenPercentIncreased": { "message": "Meningkat 10%" }, "terms": { - "message": "Persyaratan Penggunaan" + "message": "Persyaratan penggunaan" }, "termsOfService": { - "message": "Persyaratan Layanan" + "message": "Ketentuan layanan" }, "testFaucet": { - "message": "Uji Fungsi" + "message": "Uji fungsi" }, "testNetworks": { "message": "Jaringan pengujian" @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "Pilih tema MetaMask yang Anda sukai." }, + "thingsToKeep": { + "message": "Hal-hal yang perlu diingat:" + }, "thisWillCreate": { "message": "Ini akan membuat Frasa Pemulihan Rahasia dan dompet baru" }, @@ -3703,7 +3888,7 @@ "message": "Token telah ditambahkan." }, "tokenContractAddress": { - "message": "Alamat Kontrak Token" + "message": "Alamat kontrak token" }, "tokenDecimalFetchFailed": { "message": "Desimal token diperlukan." @@ -3714,14 +3899,23 @@ "tokenDetails": { "message": "Detail token" }, + "tokenFoundTitle": { + "message": "1 token baru ditemukan" + }, "tokenId": { "message": "ID token" }, "tokenList": { "message": "Daftar token:" }, + "tokenScamSecurityRisk": { + "message": "penipuan token dan risiko keamanan" + }, + "tokenShowUp": { + "message": "Token Anda mungkin tidak secara otomatis muncul di dompet Anda." + }, "tokenSymbol": { - "message": "Simbol Token" + "message": "Simbol token" }, "tokensFoundTitle": { "message": "$1 token baru ditemukan", @@ -3794,7 +3988,7 @@ "message": "Transaksi terputus pada $2." }, "transactionError": { - "message": "Kesalahan Transaksi. Pengecualian diberikan dalam kode kontrak." + "message": "Kesalahan transaksi. Pengecualian diberikan dalam kode kontrak." }, "transactionErrorNoContract": { "message": "Mencoba memanggil fungsi pada alamat non-kontrak." @@ -3806,25 +4000,25 @@ "message": "Biaya Transaksi" }, "transactionHistoryBaseFee": { - "message": "Biaya Dasar (GWEI)" + "message": "Biaya dasar (GWEI)" }, "transactionHistoryL1GasLabel": { - "message": "Total Biaya Gas L1" + "message": "Total biaya gas L1" }, "transactionHistoryL2GasLimitLabel": { - "message": "Batas Gas L2" + "message": "Batas gas L2" }, "transactionHistoryL2GasPriceLabel": { - "message": "Harga Gas L2" + "message": "Harga gas L2" }, "transactionHistoryMaxFeePerGas": { - "message": "Biaya Maks Per Gas" + "message": "Biaya maks per gas" }, "transactionHistoryPriorityFee": { - "message": "Biaya Prioritas (GWEI)" + "message": "Biaya prioritas (GWEI)" }, "transactionHistoryTotalGasFee": { - "message": "Total Biaya Gas" + "message": "Total biaya gas" }, "transactionResubmitted": { "message": "Transaksi dikirim kembali dengan estimasi biaya gas naik $1 pada $2" @@ -3842,7 +4036,7 @@ "message": "Transfer antar akun saya" }, "transferFrom": { - "message": "Transfer Dari" + "message": "Transfer dari" }, "troubleConnectingToWallet": { "message": "Kami mengalami masalah saat mencoba terhubung ke $1 Anda, tinjau kembali $2 dan coba lagi.", @@ -3861,6 +4055,9 @@ "tryAgain": { "message": "Coba lagi" }, + "tryOur": { + "message": "Cobalah" + }, "turnOnTokenDetection": { "message": "Nyalakan deteksi token yang ditingkatkan" }, @@ -3899,7 +4096,7 @@ "message": "Koleksi tanpa nama" }, "unknownNetwork": { - "message": "Jaringan Privat Tidak Dikenal" + "message": "Jaringan privat tidak dikenal" }, "unknownQrCode": { "message": "Galat: Kami tidak dapat mengidentifikasi kode QR itu" @@ -3914,9 +4111,13 @@ "message": "Web terdesentralisasi menunggu" }, "unrecognizedChain": { - "message": "Jaringan kustom ini tidak dikenali. Kami menyarankan agar Anda $1 sebelum melanjutkan", + "message": "Jaringan kustom ini tidak dikenali", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (Protokol tak dikenal)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "Tidak mendukung pengiriman token koleksi (ERC-721) untuk saat ini", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -3943,7 +4144,7 @@ "message": "Menampilkan media & data NFT dapat mengekspos alamat IP Anda ke server terpusat. API pihak ketiga (seperti OpenSea) digunakan untuk mendeteksi NFT di dompet Anda. API memperlihatkan alamat akun Anda dengan layanan tersebut. Biarkan nonaktif jika Anda tidak ingin aplikasi memakai data dari layanan tersebut." }, "usePhishingDetection": { - "message": "Gunakan Deteksi Pengelabuan" + "message": "Gunakan deteksi pengelabuan" }, "usePhishingDetectionDescription": { "message": "Menampilkan peringatan untuk domain pengelabuan yang menargetkan pengguna Ethereum" @@ -3970,19 +4171,19 @@ "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" }, "viewAccount": { - "message": "Lihat Akun" + "message": "Lihat akun" }, "viewAllDetails": { "message": "Lihat semua detail" }, "viewContact": { - "message": "Lihat Kontak" + "message": "Lihat kontak" }, "viewFullTransactionDetails": { "message": "Lihat detail transaksi lengkap" }, "viewMore": { - "message": "Lihat Selengkapnya" + "message": "Lihat selengkapnya" }, "viewOnBlockExplorer": { "message": "Lihat di block explorer" @@ -3999,7 +4200,7 @@ "message": "Lihat di Opensea" }, "viewinExplorer": { - "message": "Lihat $1 di Explorer", + "message": "Lihat $1 di explorer", "description": "$1 is the action type. e.g (Account, Transaction, Swap)" }, "visitWebSite": { @@ -4034,6 +4235,10 @@ "warning": { "message": "Peringatan" }, + "warningTooltipText": { + "message": "$1 Kontrak dapat mempergunakan seluruh saldo token Anda tanpa pemberitahuan atau persetujuan lebih lanjut. Lindungi diri Anda dengan menyesuaikan batas pengeluaran yang lebih rendah.", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "Lemah" }, @@ -4049,7 +4254,7 @@ "message": "Selamat datang di MetaMask" }, "welcomeBack": { - "message": "Selamat Datang Kembali!" + "message": "Selamat datang kembali!" }, "welcomeExploreDescription": { "message": "Simpan, kirim, serta belanjakan mata uang dan aset kripto." diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index 048ba414eea3..4b5cf3a06d4b 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Informazioni" }, - "acceleratingATransaction": { - "message": "* Accelerare una transazione usando un prezzo del gas maggiore aumenta la probabilità che la rete la elabori più velocemente, ma non è garantito." - }, "acceptTermsOfUse": { "message": "Ho letto e accetto i $1", "description": "$1 is the `terms` message" @@ -295,18 +292,9 @@ "connectingToGoerli": { "message": "Connessione alla Rete di Test Goerli" }, - "connectingToKovan": { - "message": "Connessione alla Rete di test Kovan" - }, "connectingToMainnet": { "message": "Connessione alla Rete Ethereum Principale" }, - "connectingToRinkeby": { - "message": "Connessione alla Rete di test Rinkeby" - }, - "connectingToRopsten": { - "message": "Connessione alla Rete di test Ropsten" - }, "contactUs": { "message": "Contattaci!" }, @@ -367,21 +355,12 @@ "custom": { "message": "Avanzate" }, - "customGas": { - "message": "Personalizza Gas" - }, - "customGasSubTitle": { - "message": "Incrementare il costo potrebbe diminuire il tempo di elaborazione, ma non è garantito." - }, "customSpendLimit": { "message": "Limite Spesa Personalizzato" }, "customToken": { "message": "Token Personalizzato" }, - "dataBackupFoundInfo": { - "message": "Alcuni dati sul tuo account sono state salvate durante una installazione precedente di MetaMask. Questi includono le impostazioni, i contatti, e i token. Vuoi ripristinare questi dati?" - }, "decimal": { "message": "Precisione Decimali" }, @@ -541,9 +520,6 @@ "message": "MetaMask ha riscontrato un errore", "description": "Title of generic error page" }, - "estimatedProcessingTimes": { - "message": "Tempi di Elaborazione Stimati" - }, "ethereumPublicAddress": { "message": "Indirizzo pubblico Ethereum " }, @@ -571,9 +547,6 @@ "fast": { "message": "Veloce" }, - "fastest": { - "message": "Più veloce" - }, "feeAssociatedRequest": { "message": "Una tassa è associata a questa richiesta." }, @@ -789,9 +762,6 @@ "knownTokenWarning": { "message": "Questa azione modificherà i token che sono già nel tuo portafoglio, che possono essere utilizzati per truffarti. Approva solo se sei sicuro di voler cambiare ciò che rappresentano questi token." }, - "kovan": { - "message": "Rete di test Kovan" - }, "lastConnected": { "message": "Ultima Connessione" }, @@ -935,12 +905,6 @@ "newToMetaMask": { "message": "Nuovo su MetaMask?" }, - "newTotal": { - "message": "Nuovo Totale" - }, - "newTransactionFee": { - "message": "Costo in gas per la Transazione" - }, "next": { "message": "Avanti" }, @@ -1133,10 +1097,6 @@ "restore": { "message": "Ripristina" }, - "restoreWalletPreferences": { - "message": "È stato trovato un backup dei tuoi dati da $1. Vuoi ripristinare le preferenze del portafoglio?", - "description": "$1 is the date at which the data was backed up" - }, "reusedTokenNameWarning": { "message": "Un token usa un simbolo già usato da un altro token, ciò può confondere o ingannare." }, @@ -1152,12 +1112,6 @@ "revealSeedWordsWarningTitle": { "message": "NON CONDIVIDERE questa frase con nessuno!" }, - "rinkeby": { - "message": "Rete di test Rinkeby" - }, - "ropsten": { - "message": "Rete di test Ropsten" - }, "rpcUrl": { "message": "Nuovo URL RPC" }, @@ -1200,9 +1154,6 @@ "seedPhraseReq": { "message": "le frasi seed sono lunghe 12 parole" }, - "selectAHigherGasFee": { - "message": "Seleziona un costo in gas maggiore per accelerare l'elaborazione della transazione.*" - }, "selectAccounts": { "message": "Seleziona account" }, @@ -1230,9 +1181,6 @@ "send": { "message": "Invia" }, - "sendAmount": { - "message": "Invia Importo" - }, "sendSpecifiedTokens": { "message": "Invia $1", "description": "Symbol of the specified token" @@ -1288,9 +1236,6 @@ "signed": { "message": "Firmata" }, - "slow": { - "message": "Lenta" - }, "somethingWentWrong": { "message": "Oops! Qualcosa è andato storto." }, @@ -1581,15 +1526,6 @@ "syncWithMobileTitle": { "message": "Sincronizza con dispositivo mobile" }, - "syncWithThreeBox": { - "message": "Sincronizza dati con 3Box (sperimentale)" - }, - "syncWithThreeBoxDescription": { - "message": "Attiva per avere le tue impostazioni salvate su 3Box. Questa funzionalità è attualmente sperimentale; usala a tuo rischio." - }, - "syncWithThreeBoxDisabled": { - "message": "3Box è stato disabilitato a causa di un errore durante la sincronizzazione iniziale" - }, "terms": { "message": "Termini di Uso" }, diff --git a/app/_locales/ja/messages.json b/app/_locales/ja/messages.json index 3bc7420c836a..0cd2ad4318bf 100644 --- a/app/_locales/ja/messages.json +++ b/app/_locales/ja/messages.json @@ -42,14 +42,61 @@ "message": "QRベースのHWウォレット" }, "QRHardwareWalletSteps2Description": { - "message": "AirGap Vault・Ngrave (近日追加予定)" + "message": "Ngrave (近日追加予定)" + }, + "SIWEAddressInvalid": { + "message": "サインインリクエストのアドレスが、サインインに使用しているアカウントのアドレスと一致していません。" + }, + "SIWEDomainWarningBody": { + "message": "Web サイト ($1) が正しくないドメインへのサインインを要求しています。フィッシング攻撃の可能性があります。", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "チェーン ID:" + }, + "SIWELabelExpirationTime": { + "message": "有効期限:" + }, + "SIWELabelIssuedAt": { + "message": "発行日時:" + }, + "SIWELabelMessage": { + "message": "メッセージ:" + }, + "SIWELabelNonce": { + "message": "ナンス:" + }, + "SIWELabelNotBefore": { + "message": "この日時以降:" + }, + "SIWELabelRequestID": { + "message": "リクエスト ID:" + }, + "SIWELabelResources": { + "message": "リソース: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "バージョン:" + }, + "SIWESiteRequestSubtitle": { + "message": "このサイトは次の方法でのサインインを要求しています:" + }, + "SIWESiteRequestTitle": { + "message": "サインインリクエスト" + }, + "SIWEWarningSubtitle": { + "message": "理解したことを確認するために、次の項目にチェックを入れてください:" + }, + "SIWEWarningTitle": { + "message": "よろしいですか?" }, "about": { "message": "バージョン情報" }, - "acceleratingATransaction": { - "message": "*より高いガス代を使用してトランザクションを加速すると、ネットワーク処理の高速化の可能性が増しますが、これは常に保証されるわけではありません。" - }, "acceptTermsOfUse": { "message": "$1を読んで同意しました", "description": "$1 is the `terms` message" @@ -121,6 +168,9 @@ "addAlias": { "message": "別名を追加" }, + "addBlockExplorer": { + "message": "ブロックエクスプローラーを追加" + }, "addContact": { "message": "連絡先を追加" }, @@ -209,9 +259,6 @@ "airgapVault": { "message": "AirGap Vault" }, - "airgapVaultTutorial": { - "message": " (チュートリアル)" - }, "alertDisableTooltip": { "message": "これは、[設定 > 警告] で変更できます" }, @@ -271,12 +318,15 @@ "message": "使用限度額の承認" }, "approveAllTokensTitle": { - "message": "すべての $1 へのアクセスを許可しますか?", + "message": "すべての $1 へのアクセスとその送金を許可しますか?", "description": "$1 is the symbol of the token for which the user is granting approval" }, "approveAndInstall": { "message": "承認してインストール" }, + "approveAndUpdate": { + "message": "承認して更新" + }, "approveButtonText": { "message": "承認" }, @@ -293,6 +343,10 @@ "approvedAsset": { "message": "承認済みのアセット" }, + "approvedOn": { + "message": "$1 に承認", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "よろしいですか?" }, @@ -305,6 +359,9 @@ "assets": { "message": "アセット" }, + "attemptSendingAssets": { + "message": "1 つのネットワークから別のネットワークに直接アセットを送ろうとすると、アセットが永久に失われる可能性があります。必ずブリッジを使用してください。" + }, "attemptToCancel": { "message": "キャンセルを試みますか?" }, @@ -335,6 +392,9 @@ "backToAll": { "message": "一覧に戻る" }, + "backup": { + "message": "バックアップ" + }, "backupApprovalInfo": { "message": "このシークレット コードは、デバイスをなくしたとき、パスワードを忘れたとき、MetaMaskの再インストールが必要なとき、または別のデバイスでウォレットにアクセスするときに必要です。" }, @@ -344,6 +404,12 @@ "backupNow": { "message": "今すぐバックアップ" }, + "backupUserData": { + "message": "データをバックアップ" + }, + "backupUserDataDescription": { + "message": "設定とアカウントアドレスを含むユーザー設定を、JSON ファイルにバックアップできます。" + }, "balance": { "message": "残高" }, @@ -356,6 +422,9 @@ "basic": { "message": "基本" }, + "beCareful": { + "message": "ご注意ください" + }, "betaMetamaskDescription": { "message": "MetaMaskは何百万人もに信頼されている安全なウォレットで、誰もがWeb3の世界にアクセスできるようにしています。" }, @@ -372,6 +441,9 @@ "betaMetamaskVersion": { "message": "MetaMaskベータバージョン" }, + "betaPortfolioSite": { + "message": "ベータポートフォリオサイト" + }, "betaWelcome": { "message": "MetaMaskベータへようこそ" }, @@ -507,6 +579,9 @@ "message": "ここをクリックして、WebHIDでLedgerを接続します", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "トークンを手動で追加するにはこちらをクリックしてください。" + }, "clickToRevealSeed": { "message": "秘密の言葉を表示するには、ここをクリックします" }, @@ -523,6 +598,16 @@ "confirm": { "message": "確認" }, + "confirmPageDialogSetApprovalForAll": { + "message": "今後取得する可能性のあるものも含め、$1 へのアクセスを許可しようとしています。相手はお客様がこの承認を取り消すまで、お客様のウォレットからいつでもお客様の許可なしに NFT を送ることができます。$2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "このコントラクトのすべての NFT" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "慎重に進めてください。" + }, "confirmPassword": { "message": "パスワードの確認" }, @@ -616,17 +701,11 @@ "connectingToGoerli": { "message": "Goerliテストネットワークに接続中" }, - "connectingToKovan": { - "message": "Kovanテストネットワークに接続中" - }, "connectingToMainnet": { "message": "イーサリアムメインネットに接続中" }, - "connectingToRinkeby": { - "message": "Rinkebyテストネットワークに接続中" - }, - "connectingToRopsten": { - "message": "Ropstenテストネットワークに接続中" + "connectingToSepolia": { + "message": "Sepolia テストネットワークに接続中" }, "contactUs": { "message": "お問い合わせ" @@ -661,9 +740,21 @@ "contractDeployment": { "message": "コントラクトの展開" }, + "contractDescription": { + "message": "不正行為から身を守るため、コントラクトの詳細を確認してください。" + }, "contractInteraction": { "message": "コントラクトインタラクション" }, + "contractRequestingSpendingCap": { + "message": "使用上限を求めるコントラクト" + }, + "contractTitle": { + "message": "コントラクトの詳細" + }, + "contractToken": { + "message": "トークンコントラクト" + }, "convertTokenToNFTDescription": { "message": "このアセットは NFT であることが検出されました。Metamask では現在、NFT が完全にネイティブでサポートされています。トークンリストから削除して、NFT として追加しますか?" }, @@ -742,19 +833,16 @@ "customContentSearch": { "message": "以前追加されたネットワークを検索" }, - "customGas": { - "message": "ガスのカスタマイズ" - }, "customGasSettingToolTipMessage": { "message": "ガス代をカスタマイズするには$1を使用します。慣れていない場合はわかりにくい可能性があります。自己責任で操作してください。", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "手数料を増やすと処理時間は短くなる可能性がありますが、必ずそうなるとは限りません。" - }, "customSpendLimit": { "message": "カスタム使用限度額" }, + "customSpendingCap": { + "message": "カスタム使用上限" + }, "customToken": { "message": "カスタムトークン" }, @@ -764,6 +852,9 @@ "customTokenWarningInTokenDetectionNetwork": { "message": "手動でトークンをインポートする前に、信頼できることを確認してください。$1 の詳細をご覧ください。" }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "インポートする前にトークンが信頼できることを確認してください。$1を避ける方法の詳細をご覧ください。また、$2トークンの検出を有効にすることもできます。" + }, "customerSupport": { "message": "カスタマーサポート" }, @@ -787,8 +878,8 @@ "data": { "message": "データ" }, - "dataBackupFoundInfo": { - "message": "一部のアカウントデータはMetaMaskの前回のインストール時にバックアップされました。これには、設定、連絡先、およびトークンが含まれている可能性があります。このデータを今すぐ復元しますか?" + "dataBackupSeemsCorrupt": { + "message": "データを復元できません。ファイルが破損しているようです。" }, "dataHex": { "message": "16進法" @@ -835,6 +926,12 @@ "message": "$1 を入金", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "詳細" + }, + "deprecatedTestNetworksMsg": { + "message": "Ethereum のプロトコル変更のため: Rinkeby、Ropsten、Kovan テストネットワークは動作が安定しない可能性があり、近いうちに非推奨になります。" + }, "description": { "message": "説明" }, @@ -1094,7 +1191,7 @@ "message": "フィッシングにご注意ください! MetaMaskがシークレットリカバリーフレーズをいきなり要求することは絶対にありません。" }, "endOfFlowMessage6": { - "message": "シークレットリカバリーフレーズを再度バックアップする場合は、[設定] -> [セキュリティ] でそれを見つけることができます。" + "message": "シークレットリカバリーフレーズを再度バックアップする場合は、[設定] > [セキュリティ] から確認できます。" }, "endOfFlowMessage7": { "message": "ご質問、または不審な点がある場合は、サポート$1までお問い合わせください。", @@ -1110,6 +1207,15 @@ "message": "エンドポイントが別のチェーン ID を返してきました。$1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "改善されたトークン検出" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "改善されたトークン検出は現在 $1 で利用可能です。$2" + }, + "enhancedTokenDetectionDescription": { + "message": "ConsenSys のトークン API は、さまざまなサードパーティトークンリストからトークンを集約し、リスト化します。有効にすると、トークンが自動的に検出され、Ethereum メインネット、Binance、Polygon、Avalanche で検索可能になります。無効にすると、自動検出と検索は Ethereum メインネットでのみ可能になります。" + }, "ensIllegalCharacter": { "message": "ENSにサポートされていない文字が使用されています。" }, @@ -1166,9 +1272,6 @@ "message": "スタック:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "推定処理時間" - }, "ethGasPriceFetchWarning": { "message": "現在メインのガスの見積もりサービスが利用できないため、バックアップのガス代が提供されています。" }, @@ -1214,9 +1317,6 @@ "fast": { "message": "高速" }, - "fastest": { - "message": "最高速" - }, "feeAssociatedRequest": { "message": "手数料はこのリクエストに関連付けられています。" }, @@ -1312,7 +1412,7 @@ "message": "ガス代" }, "gasLimit": { - "message": "ガス限度額" + "message": "ガスリミット" }, "gasLimitInfoTooltipContent": { "message": "ガス限度額は使用するガスの単位の最大量です。" @@ -1334,16 +1434,16 @@ "message": "ガスのオプション" }, "gasPrice": { - "message": "ガス代 (GWEI)" + "message": "ガス価格 (GWEI)" }, "gasPriceExcessive": { "message": "ガス代が不要に高く設定されています。金額を下げるよう検討してください。" }, "gasPriceExcessiveInput": { - "message": "ガス代が高すぎます" + "message": "ガス価格が高すぎます" }, "gasPriceExtremelyLow": { - "message": "ガス代が非常に安くなっています" + "message": "ガス価格が非常に低く設定されています" }, "gasPriceFetchFailed": { "message": "ネットワークエラーのため、ガス代の見積もりに失敗しました。" @@ -1384,7 +1484,7 @@ "description": "$1 represents an amount of time" }, "gasUsed": { - "message": "ガスが使用されました" + "message": "ガス使用量" }, "gdprMessage": { "message": "このデータは集約されているため、一般データ保護規則 (EU) (規則 2016/679) の目的において匿名とされます。弊社の個人情報の取り扱いに関する詳細については、弊社の$1をご覧ください。", @@ -1471,7 +1571,7 @@ "description": "$1 is the symbol for a token (e.g. 'DAI')" }, "hideZeroBalanceTokens": { - "message": "残高なしトークンを非表示" + "message": "残高のないトークンを非表示" }, "high": { "message": "積極的" @@ -1526,6 +1626,12 @@ "importNFTs": { "message": "NFTをインポート" }, + "importSelectedTokens": { + "message": "選択したトークンをインポートしますか?" + }, + "importSelectedTokensDescription": { + "message": "選択したトークンだけがウォレットに表示されます。非表示のトークンは後でいつでも検索してインポートできます。" + }, "importTokenQuestion": { "message": "トークンをインポートしますか?" }, @@ -1552,6 +1658,9 @@ "message": "インポート済み", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "設定で" + }, "infuraBlockedNotification": { "message": "MetaMaskがブロックチェーンのホストに接続できません。考えられる理由$1を確認してください。", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "最初のトランザクションはネットワークによって確認されました。戻るには [OK] をクリックします。" }, + "install": { + "message": "インストール" + }, "insufficientBalance": { "message": "残高が不十分です。" }, @@ -1592,7 +1704,7 @@ "message": "このアセットは NFT であるため、NFT タブの NFT のインポートページで追加しなおす必要があります" }, "invalidBlockExplorerURL": { - "message": "無効なBlock Explorer URLです" + "message": "ブロックエクスプローラーのURLが無効です" }, "invalidChainIdTooBig": { "message": "無効なチェーンID。チェーンIDが大きすぎます。" @@ -1609,7 +1721,7 @@ "description": "$1 is a link to https://chainid.network" }, "invalidCustomNetworkAlertTitle": { - "message": "無効なカスタムネットワークです" + "message": "カスタムネットワークが無効です" }, "invalidHexNumber": { "message": "無効な16進数です。" @@ -1654,27 +1766,21 @@ "message": "JSONファイル", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "複数のアカウントやネットワークのトークンや NFT を監視するには。" + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": "(チュートリアル)" - }, "knownAddressRecipient": { "message": "既知のコントラクトアドレスです。" }, "knownTokenWarning": { "message": "このアクションは、ウォレットに既に一覧表示されているトークンを編集します。これは、フィッシングに使用される可能性があります。これらのトークンの表す内容を変更する意図が確実な場合にのみ承認します。$1に関する詳細をご覧ください" }, - "kovan": { - "message": "Kovanテストネットワーク" - }, "lastConnected": { "message": "前回の接続" }, - "learmMoreAboutGas": { - "message": "ガスについて$1しますか?" - }, "learnCancelSpeeedup": { "message": "$1の方法を学ぶ", "description": "$1 is link to cancel or speed up transactions" @@ -1682,6 +1788,10 @@ "learnMore": { "message": "詳細" }, + "learnMoreAboutGas": { + "message": "ガスについて$1しますか?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "詳細" }, @@ -1947,6 +2057,10 @@ "name": { "message": "名前" }, + "nativeToken": { + "message": "このネットワークのネイティブトークンは $1 です。ガス代にもこのトークンが使用されます。", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "MetaMask で分散型アプリケーションとやり取りするには、ウォレットに $1 が必要です。", "description": "$1 represents the cypto symbol to be purchased" @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "イーサリアム" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -2033,6 +2150,9 @@ "nevermind": { "message": "取り消し" }, + "new": { + "message": "新登場!" + }, "newAccount": { "message": "新しいアカウント" }, @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "トークンがインポートされました" }, - "newTotal": { - "message": "新しい総額" - }, - "newTransactionFee": { - "message": "新しいトランザクション手数料" - }, "newValues": { "message": "新しい値" }, @@ -2094,7 +2208,7 @@ "message": "NFT" }, "nftTokenIdPlaceholder": { - "message": "コレクティブルIDを入力してください" + "message": "トークンIDを入力してください" }, "nfts": { "message": "NFT" @@ -2115,7 +2229,7 @@ "message": "通貨換算日がありません" }, "noConversionRateAvailable": { - "message": "利用可能な換算率がありません" + "message": "利用可能な換算レートがありません" }, "noNFTs": { "message": "NFTはまだありません" @@ -2188,7 +2302,7 @@ "message": "ダークモードを有効にする" }, "notifications12Description": { - "message": "拡張機能のダークモードがついに追加されました!オンにするには、設定 - 実験的機能の順に移動し、ライト、ダーク、システムの表示オプションから一つを選択してください。" + "message": "拡張機能のダークモードがついに追加されました!オンにするには、設定 > 実験的機能の順に移動し、ライト、ダーク、システムの表示オプションから一つを選択してください。" }, "notifications12Title": { "message": "いつダークモードに?今ダークモードです!🕶️🦊" @@ -2197,12 +2311,29 @@ "message": "カスタムネットワークリストを表示" }, "notifications13Description": { - "message": "人気のカスタムネットワーク(Arbitrum、Avalanche、Binance Smart Chain、Fantom、Harmony、Optimism、Palm、Polygon)が簡単に追加できるようになりました!この機能を有効にするには、設定 -> 実験的機能に移動し、「カスタムネットワークリストを表示」をオンにしてください!", + "message": "人気のカスタムネットワーク(Arbitrum、Avalanche、Binance Smart Chain、Fantom、Harmony、Optimism、Palm、Polygon)が簡単に追加できるようになりました!この機能を有効にするには、設定 > 実験的機能に移動し、「カスタムネットワークリストを表示」をオンにしてください!", "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." }, "notifications13Title": { "message": "人気のネットワークを追加" }, + "notifications14ActionText": { + "message": "バックアップの設定を表示" + }, + "notifications14Description": { + "message": "3Box データ機能は 10 月の初めに非推奨になります。ウォレットを手動でバックアップ・復元するには、詳細設定の「今すぐバックアップ」を使用してください。", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "3Box の非推奨化" + }, + "notifications15Description": { + "message": "ユーザー側での作業は必要ないため、ウォレットは引き続き通常通りご使用いただけます。マージ関連の詐欺にご注意ください。", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "Ethereum のマージ (Merge) が完了しました!" + }, "notifications1Description": { "message": "MetaMask Mobileのユーザーが、モバイルウォレット内でトークンを交換できるようになりました。QRコードをスキャンしてモバイルアプリを取得し、スワップを開始します。", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2268,7 +2399,7 @@ "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, "notifications8ActionText": { - "message": "高度な設定に移動", + "message": "設定 > 詳細設定に移動します", "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": { @@ -2276,7 +2407,7 @@ "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": { - "message": "Ledgerをより簡単かつ安定してご利用いただくには、設定の「高度な設定」タブに移動し、「優先Ledger接続タイプ」を「WebHID」に切り替えてください。", + "message": "Ledgerをより簡単かつ安定してご利用いただくには、設定の「詳細設定」タブに移動し、「優先Ledger接続タイプ」を「WebHID」に切り替えてください。", "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." }, "notifications8Title": { @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "すべて既読にする" }, + "numberOfNewTokensDetectedPlural": { + "message": "$1 種類の新しいトークンがこのアカウントで見つかりました", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "1 つの新しいトークンがこのアカウントで見つかりました" + }, "ofTextNofM": { "message": "中の" }, @@ -2384,6 +2522,9 @@ "message": "WebHIDでLedgerを接続するには、MetaMaskを全画面モードで開いてください。", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "ブロックエクスプローラーで開く" + }, "optional": { "message": "任意" }, @@ -2454,7 +2595,13 @@ "message": "許可のリクエスト" }, "permissionRequestCapitalized": { - "message": "パーミッションのリクエスト" + "message": "アクセス許可のリクエスト" + }, + "permissionRequested": { + "message": "現在リクエスト中" + }, + "permissionRevoked": { + "message": "この更新で取り消し" }, "permission_accessNetwork": { "message": "インターネットにアクセスします。", @@ -2476,9 +2623,13 @@ "message": "無期限で実行。", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "$1 ($2) のアカウントとアセットを管理します。", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "「$1」アカウントとアセットをコントロールします。", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "デバイスにデータを保管し管理します。", @@ -2488,10 +2639,18 @@ "message": "通知を表示します。", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "トランザクションインサイトを取得して表示します。", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "不明なパーミッション: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "$1 ($2) の公開鍵を表示します。", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "許可" }, @@ -2508,6 +2667,9 @@ "popularCustomNetworks": { "message": "人気のカスタムネットワーク" }, + "portfolioSite": { + "message": "ポートフォリオサイト" + }, "preferredLedgerConnectionType": { "message": "優先Ledger接続タイプ", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" @@ -2531,7 +2693,7 @@ "message": "優先手数料" }, "privacyMsg": { - "message": "プライバシー ポリシー" + "message": "プライバシーポリシー" }, "privateKey": { "message": "秘密鍵", @@ -2671,7 +2833,7 @@ "message": "アカウントをリセットすると、トランザクション履歴が消去されます。これによりアカウント内の残高が変更されることはありません。また、シークレットリカバリーフレーズの再入力が求められることもありません。" }, "resetWallet": { - "message": "ウォレットのリセット" + "message": "ウォレットをリセット" }, "resetWalletSubHeader": { "message": "MetaMask はパスワードのコピーを保管しません。アカウントのロックを解除できない場合は、ウォレットをリセットする必要があります。これは、ウォレットのセットアップ時に使用した秘密のリカバリーフレーズを入力することで行えます。" @@ -2688,9 +2850,17 @@ "restore": { "message": "復元" }, - "restoreWalletPreferences": { - "message": "$1のデータのバックアップが見つかりました。ウォレットの基本設定を復元しますか?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "提供されたファイルからデータを復元できません" + }, + "restoreSuccessful": { + "message": "データが復元されました" + }, + "restoreUserData": { + "message": "ユーザーデータの復元" + }, + "restoreUserDataDescription": { + "message": "以前バックアップされた JSON ファイルから、設定とアカウントアドレスを含むユーザー設定を復元できます。" }, "retryTransaction": { "message": "トランザクションを再試行" @@ -2721,17 +2891,14 @@ "message": "アクセス許可を取り消すと、次の $1 が今後 $2 にアクセスできなくなります", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Rinkebyテストネットワーク" - }, - "ropsten": { - "message": "Ropstenテストネットワーク" + "revokeSpendingCapTooltipText": { + "message": "このコントラクトは、現在または今後のトークンをこれ以上使用できなくなります。" }, "rpcUrl": { "message": "新しいRPC URL" }, "safeTransferFrom": { - "message": "安全な転送元" + "message": "安全な送金元:" }, "save": { "message": "保存" @@ -2838,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "シークレットリカバリーフレーズを書き留めてください" }, - "selectAHigherGasFee": { - "message": "トランザクションの処理を加速させるには、より高いガス代を選択します。*" - }, "selectAccounts": { "message": "このサイトに使用するアカウントを選択してください" }, @@ -2874,9 +3038,6 @@ "send": { "message": "送金" }, - "sendAmount": { - "message": "送金額" - }, "sendBugReport": { "message": "バグレポートをお送りください。" }, @@ -2901,6 +3062,9 @@ "message": "警告: 資金の喪失に繋がる可能性のあるトークンコントラクトに送信しようとしています。$1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "Sepolia テストネットワーク" + }, "setAdvancedPrivacySettings": { "message": "高度なプライバシー設定を設定" }, @@ -2933,12 +3097,6 @@ "showAdvancedGasInlineDescription": { "message": "これを選択すると、ガス代と限度額のコントロールが送金画面と確認画面に直接表示されます。" }, - "showCustomNetworkList": { - "message": "カスタムネットワークリストを表示" - }, - "showCustomNetworkListDescription": { - "message": "新規ネットワークの追加時に事前に情報が入力済みのネットワークのリストを表示するには、これを選択します。" - }, "showFiatConversionInTestnets": { "message": "テストネット上に変換を表示" }, @@ -2993,6 +3151,9 @@ "signed": { "message": "署名が完了しました" }, + "signin": { + "message": "サインイン" + }, "simulationErrorMessageV2": { "message": "ガス代を見積もれませんでした。コントラクトにエラーがある可能性があり、このトランザクションは失敗するかもしれません。" }, @@ -3005,9 +3166,6 @@ "skipAccountSecurityDetails": { "message": "私は、シークレットリカバリーフレーズをバックアップするまで、アカウントとそのアセットのすべてを失う可能性があることを理解しています。" }, - "slow": { - "message": "低速" - }, "smartTransaction": { "message": "スマートトランザクション" }, @@ -3019,6 +3177,10 @@ "message": "$1 に $2 から追加", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "スナップエラー:「$1」。エラーコード:「$2」", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -3027,14 +3189,34 @@ "message": "スナップをインストール" }, "snapInstallWarningCheck": { + "message": "理解したことを確認するために、次の項目にチェックを入れてください." + }, + "snapInstallWarningCheckPlural": { "message": "理解したことを確認するために、すべての項目にチェックを入れてください。" }, + "snapInstallWarningKeyAccess": { + "message": "スナップ「$1」に $2 へのキーアクセスを許可しようとしています。この操作は取り消し不能であり、$2 アカウントとアセットのコントロールを「$1」に許可することになります。続行する前に、必ず「$1」が信頼できることを確認してください。", + "description": "The first parameter is the name of the snap and the second one is the protocol" + }, "snapRequestsPermission": { "message": "このスナップが次のパーミッションをリクエストしています:" }, + "snapUpdate": { + "message": "スナップを更新" + }, + "snapUpdateExplanation": { + "message": "$1 に新しいバージョンのスナップが必要です。", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "スナップ" }, + "snapsInsightLoading": { + "message": "トランザクションインサイトを読み込み中..." + }, + "snapsNoInsight": { + "message": "スナップがインサイトを返しませんでした" + }, "snapsSettingsDescription": { "message": "スナップの管理" }, @@ -3266,7 +3448,7 @@ "message": "スワップがキャンセルされました" }, "stxUserCancelledDescription": { - "message": "トランザクションがキャンセルされ、不要なガス代は支払われませんでした。" + "message": "不要なガス代を支払うことなくトランザクションがキャンセルされました。" }, "stxYouCanOptOut": { "message": "詳細設定でいつでもオプトアウトできます。" @@ -3281,7 +3463,7 @@ "message": "サポート" }, "supportCenter": { - "message": "サポートセンターにアクセス" + "message": "サポートセンターをご利用ください" }, "swap": { "message": "スワップ" @@ -3479,6 +3661,9 @@ "swapReviewSwap": { "message": "スワップの確認" }, + "swapSearchNameOrAddress": { + "message": "名前を検索するかアドレスを貼り付けてください" + }, "swapSelect": { "message": "選択" }, @@ -3498,6 +3683,9 @@ "message": "$1%", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "注文から確定までの間に価格が変動することを「スリッページ」といいます。スリッページが「スリッページ許容範囲」の設定を超えた場合、スワップは自動的にキャンセルされます。" + }, "swapSource": { "message": "流動性ソース" }, @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "このアカウントに切り替える" }, + "switchedTo": { + "message": "次に変更しました:" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "ネットワークを切り替えると、保留中の確認がすべてキャンセルされます" }, @@ -3643,15 +3834,6 @@ "syncWithMobileTitle": { "message": "モバイルと同期" }, - "syncWithThreeBox": { - "message": "データを3Boxと同期 (試験的機能)" - }, - "syncWithThreeBoxDescription": { - "message": "これをオンにすると、設定が3Boxでバックアップされます。この機能は現在試験段階にあります。自己責任でご利用ください。" - }, - "syncWithThreeBoxDisabled": { - "message": "3Boxは、最初の同期中のエラーのため、無効化されました" - }, "tenPercentIncreased": { "message": "10% の増加" }, @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "ご希望の MetaMask テーマを選択してください。" }, + "thingsToKeep": { + "message": "留意点:" + }, "thisWillCreate": { "message": "これにより、新しいウォレットとシークレットリカバリーフレーズが作成されます" }, @@ -3714,12 +3899,21 @@ "tokenDetails": { "message": "トークンの詳細" }, + "tokenFoundTitle": { + "message": "1 つの新しいトークンが見つかりました" + }, "tokenId": { "message": "トークン ID" }, "tokenList": { "message": "トークンリスト:" }, + "tokenScamSecurityRisk": { + "message": "トークン関連の詐欺やセキュリティのリスク" + }, + "tokenShowUp": { + "message": "トークンはウォレットに自動的に表示されない可能性があります。" + }, "tokenSymbol": { "message": "トークンシンボル" }, @@ -3812,13 +4006,13 @@ "message": "L1ガス代合計" }, "transactionHistoryL2GasLimitLabel": { - "message": "L2ガス代限度額" + "message": "L2ガスリミット" }, "transactionHistoryL2GasPriceLabel": { - "message": "L2ガス代" + "message": "L2ガス価格" }, "transactionHistoryMaxFeePerGas": { - "message": "ガスあたりの最大手数料" + "message": "ガス1単位あたりの最大手数料" }, "transactionHistoryPriorityFee": { "message": "優先手数料 (GWEI)" @@ -3861,6 +4055,9 @@ "tryAgain": { "message": "再試行" }, + "tryOur": { + "message": "こちらをお試しください:" + }, "turnOnTokenDetection": { "message": "強化されたトークン検出をオンにする" }, @@ -3914,9 +4111,13 @@ "message": "分散型Webが待っています" }, "unrecognizedChain": { - "message": "このカスタムネットワークは認識されません。続行する前に$1をお勧めします", + "message": "このカスタムネットワークは認識されていません", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (不明なプロトコル)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "コレクティブル (ERC-721) トークンの送信は現在サポートされていません", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -4034,6 +4235,10 @@ "warning": { "message": "警告" }, + "warningTooltipText": { + "message": "$1 このコントラクトは今後、通知や承諾なしにトークン残高全額を使用できます。使用限度をより低い金額にカスタマイズして、自分の身を守りましょう。", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "弱" }, @@ -4049,7 +4254,7 @@ "message": "MetaMaskにようこそ" }, "welcomeBack": { - "message": "ようこそ!" + "message": "お帰りなさい!" }, "welcomeExploreDescription": { "message": "暗号通貨やアセットを保管、送金、使用。" diff --git a/app/_locales/kn/messages.json b/app/_locales/kn/messages.json index 762b250c7ff6..4ffb4e464816 100644 --- a/app/_locales/kn/messages.json +++ b/app/_locales/kn/messages.json @@ -8,9 +8,6 @@ "about": { "message": "ಕುರಿತು" }, - "acceleratingATransaction": { - "message": "* ಹೆಚ್ಚಿನ ಗ್ಯಾಸ್ ಬೆಲೆಯನ್ನು ಬಳಸಿಕೊಂಡು ವಹಿವಾಟನ್ನು ವೇಗಗೊಳಿಸುವುದರಿಂದ ನೆಟ್‌ವರ್ಕ್ ವೇಗವಾಗಿ ಪ್ರಕ್ರಿಯೆಗೊಳ್ಳುವ ಸಾಧ್ಯತೆಗಳನ್ನು ಅದು ಹೆಚ್ಚಿಸುತ್ತದೆ, ಆದರೆ ಇದು ಯಾವಾಗಲೂ ಖಚಿತವಾಗಿರುವುದಿಲ್ಲ." - }, "accessingYourCamera": { "message": "ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಪ್ರವೇಶಿಸಲಾಗುತ್ತಿದೆ..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Goerli ಪರೀಕ್ಷಾ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ" }, - "connectingToKovan": { - "message": "Kovan ಪರೀಕ್ಷಾ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ " - }, "connectingToMainnet": { "message": "ಮುಖ್ಯ ಎಥೆರಿಯಮ್ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ" }, - "connectingToRinkeby": { - "message": "Rinkeby ಪರೀಕ್ಷಾ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ" - }, - "connectingToRopsten": { - "message": "Ropsten ಪರೀಕ್ಷಾ ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ" - }, "continueToWyre": { "message": "Wyre ಗೆ ಮುಂದುವರಿಸಿ" }, @@ -250,12 +238,6 @@ "custom": { "message": "ಸುಧಾರಿತ" }, - "customGas": { - "message": "ಗ್ಯಾಸ್ ಕಸ್ಟಮೈಸ್ ಮಾಡಿ" - }, - "customGasSubTitle": { - "message": "ಹೆಚ್ಚುತ್ತಿರುವ ಶುಲ್ಕವು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವ ಸಮಯದಲ್ಲಿ ಕಡಿಮೆಯಾಗುತ್ತದೆ ಆದರೆ ಇದು ಖಚಿತವಾಗಿಲ್ಲ." - }, "customToken": { "message": "ಕಸ್ಟಮ್ ಟೋಕನ್" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "ಮುಂದುವರೆಯಲು ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ" }, - "estimatedProcessingTimes": { - "message": "ಅಂದಾಜು ಪ್ರಕ್ರಿಯೆ ಸಮಯ" - }, "ethereumPublicAddress": { "message": "ಎಥೆರಿಯಮ್ ಸಾರ್ವಜನಿಕ ವಿಳಾಸ" }, @@ -503,9 +482,6 @@ "knownAddressRecipient": { "message": "ತಿಳಿದಿರುವ ಒಪ್ಪಂದದ ವಿಳಾಸ." }, - "kovan": { - "message": "Kovan ಪರೀಕ್ಷೆ ನೆಟ್‌ವರ್ಕ್" - }, "learnMore": { "message": "ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ" }, @@ -604,12 +580,6 @@ "newToMetaMask": { "message": "MetaMask ಗೆ ಹೊಸಬರೇ?" }, - "newTotal": { - "message": "ಹೊಸ ಮೊತ್ತ" - }, - "newTransactionFee": { - "message": "ಹೊಸ ವಹಿವಾಟು ಶುಲ್ಕ" - }, "next": { "message": "ಮುಂದೆ" }, @@ -768,12 +738,6 @@ "revealSeedWordsWarningTitle": { "message": "ಈ ಫ್ರೇಸ್ ಅನ್ನು ಯಾರೊಂದಿಗೂ ಹಂಚಿಕೊಳ್ಳಬೇಡಿ!" }, - "rinkeby": { - "message": "Rinkeby ಪರೀಕ್ಷೆ ನೆಟ್‌ವರ್ಕ್" - }, - "ropsten": { - "message": "Ropsten ಪರೀಕ್ಷೆ ನೆಟ್‌ವರ್ಕ್" - }, "rpcUrl": { "message": "ಹೊಸ RPC URL" }, @@ -810,9 +774,6 @@ "seedPhraseReq": { "message": "ಸೀಡ್ ಫ್ರೇಸ್‌ಗಳು 12 ಪದಗಳಷ್ಟು ದೀರ್ಘವಾಗಿವೆ" }, - "selectAHigherGasFee": { - "message": "ನಿಮ್ಮ ವಹಿವಾಟಿನ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಸುಧಾರಿಸಲು ಅಧಿಕ ಗ್ಯಾಸ್ ಶುಲ್ಕವನ್ನು ಆಯ್ಕೆಮಾಡಿ.*" - }, "selectAnAccount": { "message": "ಖಾತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ" }, @@ -831,9 +792,6 @@ "send": { "message": "ಕಳುಹಿಸು" }, - "sendAmount": { - "message": "ಮೊತ್ತವನ್ನು ಕಳುಹಿಸಿ" - }, "sendTokens": { "message": "ಟೋಕನ್‌ಗಳನ್ನು ಕಳುಹಿಸಿ" }, @@ -876,9 +834,6 @@ "signed": { "message": "ಸಹಿ ಮಾಡಲಾಗಿದೆ" }, - "slow": { - "message": "ನಿಧಾನ" - }, "somethingWentWrong": { "message": "ಓಹ್‌‍! ಏನೋ ತಪ್ಪಾಗಿದೆ." }, diff --git a/app/_locales/ko/messages.json b/app/_locales/ko/messages.json index cabef3736031..ca183dfdce4e 100644 --- a/app/_locales/ko/messages.json +++ b/app/_locales/ko/messages.json @@ -42,14 +42,61 @@ "message": "QR 기반 HW 지갑" }, "QRHardwareWalletSteps2Description": { - "message": "에어갭 금고 및 엔그레이브(Ngrave), (출시 예정)" + "message": "Ngrave(출시 예정)" + }, + "SIWEAddressInvalid": { + "message": "로그인 요청 주소가 현재 로그인 계정의 주소와 일치하지 않습니다." + }, + "SIWEDomainWarningBody": { + "message": "($1) 웹사이트가 잘못된 도메인에 로그인하도록 요청하고 있습니다. 이는 피싱 공격일 수도 있습니다.", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "체인 ID:" + }, + "SIWELabelExpirationTime": { + "message": "만료일:" + }, + "SIWELabelIssuedAt": { + "message": "발행처:" + }, + "SIWELabelMessage": { + "message": "메시지:" + }, + "SIWELabelNonce": { + "message": "논스:" + }, + "SIWELabelNotBefore": { + "message": "다음 이후:" + }, + "SIWELabelRequestID": { + "message": "요청 ID:" + }, + "SIWELabelResources": { + "message": "리소스: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "버전:" + }, + "SIWESiteRequestSubtitle": { + "message": "이 사이트가 다음에 로그인하도록 요청하고 있습니다:" + }, + "SIWESiteRequestTitle": { + "message": "로그인 요청" + }, + "SIWEWarningSubtitle": { + "message": "이해하셨으면 다음을 체크하세요:" + }, + "SIWEWarningTitle": { + "message": "확실한가요?" }, "about": { "message": "정보" }, - "acceleratingATransaction": { - "message": "* 높은 가스 가격을 이용해 거래를 가속화하면 네트워크를 통한 처리 속도가 개선되지만 항상 그렇지는 않습니다." - }, "acceptTermsOfUse": { "message": "$1의 내용을 읽고 이에 동의합니다.", "description": "$1 is the `terms` message" @@ -121,11 +168,14 @@ "addAlias": { "message": "별칭 추가" }, + "addBlockExplorer": { + "message": "블록 익스플로러 추가" + }, "addContact": { "message": "연락처 추가" }, "addCustomToken": { - "message": "맞춤형 토큰 추가" + "message": "커스텀 토큰 추가" }, "addCustomTokenByContractAddress": { "message": "이 토큰을 찾을 수 없으신가요? 토큰 주소를 붙여넣으면 토큰을 직접 추가할 수 있습니다. 토큰의 계약 주소는 $1에서 찾을 수 있습니다.", @@ -209,9 +259,6 @@ "airgapVault": { "message": "에어갭 볼트" }, - "airgapVaultTutorial": { - "message": " (튜토리얼)" - }, "alertDisableTooltip": { "message": "\"설정 > 경고\"에서 변경할 수 있습니다." }, @@ -231,7 +278,7 @@ "message": "경고" }, "allOfYour": { - "message": "내 $1 모두", + "message": "내 모든 $1", "description": "$1 is the symbol or name of the token that the user is approving spending" }, "allowExternalExtensionTo": { @@ -271,12 +318,15 @@ "message": "지출 한도 승인" }, "approveAllTokensTitle": { - "message": "내 모든 $1에 액세스할 수 있는 권한을 부여할까요?", + "message": "내 모든 $1에 액세스 및 전송할 수 있는 권한을 부여할까요?", "description": "$1 is the symbol of the token for which the user is granting approval" }, "approveAndInstall": { "message": "승인 및 설치" }, + "approveAndUpdate": { + "message": "승인 및 업데이트" + }, "approveButtonText": { "message": "승인" }, @@ -293,6 +343,10 @@ "approvedAsset": { "message": "승인된 자산" }, + "approvedOn": { + "message": "$1에 승인", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "확실한가요?" }, @@ -305,6 +359,9 @@ "assets": { "message": "자산" }, + "attemptSendingAssets": { + "message": "한 네트워크에서 다른 네트워크로 자산을 직접 전송하면 자산이 영구적으로 손실될 수 있습니다. 반드시 브릿지를 이용하세요." + }, "attemptToCancel": { "message": "취소할까요?" }, @@ -335,6 +392,9 @@ "backToAll": { "message": "전체 목록으로 돌아가기" }, + "backup": { + "message": "백업" + }, "backupApprovalInfo": { "message": "이 비밀 코드는 장치를 분실하여 지갑을 복구해야 하거나, 비밀번호를 잊은 경우, MetaMask를 다시 설치해야 하거나, 다른 장치에서 지갑에 액세스해야 할 때 필요합니다." }, @@ -344,6 +404,12 @@ "backupNow": { "message": "지금 백업" }, + "backupUserData": { + "message": "데이터를 백업하세요" + }, + "backupUserDataDescription": { + "message": "기본 설정과 계정 주소가 포함된 사용자 설정을 JSON 파일로 백업할 수 있습니다." + }, "balance": { "message": "잔액" }, @@ -356,6 +422,9 @@ "basic": { "message": "기본" }, + "beCareful": { + "message": "주의하세요" + }, "betaMetamaskDescription": { "message": "수백만 명이 신뢰하는 MetaMask(메타마스크)는 모든 사람이 web3의 세계에 접근할 수 있도록 하는 안전한 지갑입니다." }, @@ -372,6 +441,9 @@ "betaMetamaskVersion": { "message": "MetaMask 베타 버전" }, + "betaPortfolioSite": { + "message": "베타 포트폴리오 사이트" + }, "betaWelcome": { "message": "MetaMask 베타 방문을 환영합니다" }, @@ -507,6 +579,9 @@ "message": "WebHID를 통해 Ledger을 연결하려면 여기를 클릭하세요.", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "여기를 클릭하여 토큰을 수동으로 추가하세요." + }, "clickToRevealSeed": { "message": "비밀 단어를 표시하려면 여기를 클릭하세요." }, @@ -523,6 +598,16 @@ "confirm": { "message": "확인" }, + "confirmPageDialogSetApprovalForAll": { + "message": "향후 소유할 수 있는 모든 $1에 대한 액세스를 허용하는 것입니다. 이 허용을 취소하지 않는 한, 상대방이 언제든지 허락 없이 지갑에서 NFT를 전송할 수 있습니다. $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "이 계약의 모든 NFT" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "주의하여 진행하세요." + }, "confirmPassword": { "message": "비밀번호 확인" }, @@ -616,17 +701,11 @@ "connectingToGoerli": { "message": "Goerli 테스트 네트워크에 연결 중" }, - "connectingToKovan": { - "message": "Kovan 테스트 네트워크에 연결 중" - }, "connectingToMainnet": { "message": "이더리움 메인넷에 연결 중" }, - "connectingToRinkeby": { - "message": "Rinkeby 테스트 네트워크에 연결 중" - }, - "connectingToRopsten": { - "message": "Ropsten 테스트 네트워크에 연결 중" + "connectingToSepolia": { + "message": "Sepolia 테스트 네트워크에 연결 중" }, "contactUs": { "message": "문의하기" @@ -661,9 +740,21 @@ "contractDeployment": { "message": "계약 배포" }, + "contractDescription": { + "message": "사기를 방지하려면 잠시 시간을 내어 계약의 세부 사항을 확인하세요." + }, "contractInteraction": { "message": "계약 상호 작용" }, + "contractRequestingSpendingCap": { + "message": "지출 한도 필요 계약" + }, + "contractTitle": { + "message": "계약 세부 사항" + }, + "contractToken": { + "message": "토큰 계약" + }, "convertTokenToNFTDescription": { "message": "이 자산은 NFT입니다. Metamask는 이제 NFT의 본래 기능에 따라 완전히 지원합니다. 이를 토큰 목록에서 제거하고 NFT로 추가할까요?" }, @@ -686,7 +777,7 @@ "message": "클립보드에 복사" }, "copyTransactionId": { - "message": "거래 ID 복사" + "message": "트랜잭션 ID 복사" }, "create": { "message": "생성" @@ -701,7 +792,7 @@ "message": "새 지갑 생성" }, "createPassword": { - "message": "비밀번호 만들기" + "message": "비밀번호 생성" }, "currencyConversion": { "message": "통화 변환" @@ -742,21 +833,18 @@ "customContentSearch": { "message": "이전에 추가된 네트워크 검색" }, - "customGas": { - "message": "가스 맞춤화" - }, "customGasSettingToolTipMessage": { "message": "$1을(를) 사용하여 가스 가격을 맞춤설정하세요. 익숙하지 않은 경우 혼동될 수 있습니다. 자신의 책임하에 상호 작용하세요.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "수수료를 올리면 처리 시간이 단축되기도 하지만 항상 그렇지는 않습니다." - }, "customSpendLimit": { + "message": "커스텀 지출 한도" + }, + "customSpendingCap": { "message": "맞춤형 지출 한도" }, "customToken": { - "message": "맞춤형 토큰" + "message": "커스텀 토큰" }, "customTokenWarningInNonTokenDetectionNetwork": { "message": "이 네트워크에서는 아직 토큰 감지 기능을 사용할 수 없습니다. 토큰을 직접 가져오고 해당 토큰을 신뢰할 수 있는지 반드시 확인하세요. $1에 대해 알아보기" @@ -764,6 +852,9 @@ "customTokenWarningInTokenDetectionNetwork": { "message": "토큰을 직접 가져오기 전에 해당 토큰을 신뢰할 수 있는지 반드시 확인하세요. $1에 대해 알아보세요." }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "불러오기 전에 토큰의 신뢰성을 확인하세요. $1 상황을 피하는 방법을 알아보세요. 또한 $2 토큰 감지 기능을 활성화할 수 있습니다." + }, "customerSupport": { "message": "고객 지원" }, @@ -787,14 +878,14 @@ "data": { "message": "데이터" }, - "dataBackupFoundInfo": { - "message": "일부 계정 데이터가 이전의 MetaMask 설치 도중에 백업되었습니다. 여기에는 설정, 연락처, 토큰이 포함될 수 있습니다. 지금 이 데이터를 복구할까요?" + "dataBackupSeemsCorrupt": { + "message": "사용자 데이터를 복원할 수 없습니다. 파일이 손상된 것 같습니다." }, "dataHex": { "message": "16진수" }, "decimal": { - "message": "토큰 십진수" + "message": "토큰 소수점" }, "decimalsMustZerotoTen": { "message": "소수점 이하 자릿수는 0 이상, 36 이하여야 합니다." @@ -835,6 +926,12 @@ "message": "$1 입금", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "자세히 알아보기" + }, + "deprecatedTestNetworksMsg": { + "message": "이더리움 프로토콜 변경으로 인해 Rinkeby, Ropsten 및 Kovan 테스트 네트워크가 안정적으로 작동하지 않을 수 있습니다. 해당 네트워크는 곧 사용이 중단될 예정입니다." + }, "description": { "message": "설명" }, @@ -1022,7 +1119,7 @@ "message": "이렇게 하면 최대 요금은 낮아지지만 네트워크 트래픽이 증가하여 거래가 지연되거나 실패할 수 있습니다." }, "editNonceField": { - "message": "임시값 편집" + "message": "논스 편집" }, "editNonceMessage": { "message": "이는 고급 기능으로, 주의해서 사용해야 합니다." @@ -1037,13 +1134,13 @@ "message": " 자동 감지 활성화" }, "enableEIP1559V2": { - "message": "향상된 가스비 UI 활성화" + "message": "향상된 가스 수수료 UI 활성화" }, "enableEIP1559V2AlertMessage": { "message": "가스비 견적 산정 방법과 맞춤화 작업을 업데이트했습니다." }, "enableEIP1559V2ButtonText": { - "message": "설정에서 향상된 가스비 UI 켜기" + "message": "설정에서 향상된 가스 수수료 UI를 활성화" }, "enableEIP1559V2Description": { "message": "가스비 견적 산정 방법과 맞춤화 작업을 업데이트했습니다. 새로운 가스 경험을 사용하기 원하시면 이 기능을 켜세요. $1", @@ -1062,7 +1159,7 @@ "message": "OpenSea의 API를 사용하여 NFT 데이터를 가져옵니다. NFT 자동 감지는 OpenSea의 API에 의존하며 이 API가 꺼져 있으면 사용할 수 없습니다." }, "enableSmartTransactions": { - "message": "스마트 거래 활성화" + "message": "스마트 트랜잭션 활성화" }, "enableToken": { "message": "$1 활성화", @@ -1110,6 +1207,15 @@ "message": "엔드포인트에서 다른 체인 ID를 반환했습니다. $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "향상된 토큰 감지" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "$1. $2에서 향상된 토큰 감지를 사용할 수 있습니다." + }, + "enhancedTokenDetectionDescription": { + "message": "ConsenSys 토큰 API는 다양한 타사 토큰 목록을 활용해 토큰 목록을 집계합니다. 이 기능이 켜져 있으면 이더리움 메인넷, Binance, 폴리곤 및 아발란체에서 토큰이 자동으로 감지되며 검색이 가능합니다. 이 기능을 끄면 이더리움 메인넷에서만 자동 탐지 및 검색이 가능합니다." + }, "ensIllegalCharacter": { "message": "ENS에 맞지 않는 문자입니다." }, @@ -1166,9 +1272,6 @@ "message": "스택:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "예상 처리 시간" - }, "ethGasPriceFetchWarning": { "message": "현재 주요 가스 견적 서비스를 사용할 수 없으므로 백업 가스 가격을 제공합니다." }, @@ -1214,9 +1317,6 @@ "fast": { "message": "빠름" }, - "fastest": { - "message": "가장 빠름" - }, "feeAssociatedRequest": { "message": "수수료가 이 요청과 연결되어 있습니다." }, @@ -1290,7 +1390,7 @@ "message": "기능: 승인" }, "functionSetApprovalForAll": { - "message": "기능: 모두승인설정" + "message": "함수: SetApprovalForAll" }, "functionType": { "message": "기능 유형" @@ -1309,7 +1409,7 @@ "message": "낮은, 중간 및 높은 견적을 사용할 수 없습니다." }, "gasFee": { - "message": "가스비" + "message": "가스 수수료" }, "gasLimit": { "message": "가스 한도" @@ -1340,7 +1440,7 @@ "message": "가스 수수료가 불필요하게 높게 설정되었습니다. 가격을 낮추는 것을 고려해 보세요." }, "gasPriceExcessiveInput": { - "message": "가스 가격이 초과하였습니다." + "message": "가스 가격 초과" }, "gasPriceExtremelyLow": { "message": "가스 가격이 너무 낮음" @@ -1384,14 +1484,14 @@ "description": "$1 represents an amount of time" }, "gasUsed": { - "message": "사용한 가스" + "message": "가스 사용됨" }, "gdprMessage": { "message": "이 데이터는 집계 처리된 정보이며 일반 데이터 보호 규정 (EU) 2016/679의 목적에 따라 익명으로 관리됩니다. 당사의 개인정보보호 관행에 관한 자세한 내용은 $1을 참조하세요.", "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" }, "gdprMessagePrivacyPolicy": { - "message": "개인정보 보호정책", + "message": "개인정보처리방침", "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" }, "general": { @@ -1408,7 +1508,7 @@ "message": "시작하기" }, "goBack": { - "message": "되돌아가기" + "message": "뒤로 가기" }, "goerli": { "message": "Goerli 테스트 네트워크" @@ -1526,6 +1626,12 @@ "importNFTs": { "message": "NFT 가져오기" }, + "importSelectedTokens": { + "message": "선택한 토큰을 불러올까요?" + }, + "importSelectedTokensDescription": { + "message": "선택한 토큰만 지갑에 표시됩니다. 숨긴 토큰은 토큰 검색을 통해 나중에 언제든지 불러올 수 있습니다." + }, "importTokenQuestion": { "message": "토큰을 가져올까요?" }, @@ -1552,6 +1658,9 @@ "message": "가져옴", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "설정에서" + }, "infuraBlockedNotification": { "message": "MetaMask이 블록체인 호스트에 연결할 수 없습니다. $1 오류 가능성을 검토하세요.", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "최초 거래를 네트워크에서 확인했습니다. 돌아가려면 확인을 클릭하세요." }, + "install": { + "message": "설치" + }, "insufficientBalance": { "message": "잔액이 부족합니다." }, @@ -1609,7 +1721,7 @@ "description": "$1 is a link to https://chainid.network" }, "invalidCustomNetworkAlertTitle": { - "message": "잘못된 맞춤형 네트워크" + "message": "잘못된 커스텀 네트워크" }, "invalidHexNumber": { "message": "잘못된 16진수입니다." @@ -1633,7 +1745,7 @@ "message": "잘못된 비밀 복구 구문" }, "invalidSeedPhraseCaseSensitive": { - "message": "입력 오류! 비밀 복구 구문은 대소문자를 구분해야 합니다." + "message": "입력 오류: 비밀 복구 구문은 대소문자를 구분해야 합니다." }, "ipfsGateway": { "message": "IPFS 게이트웨이" @@ -1654,26 +1766,20 @@ "message": "JSON 파일", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "계정 및 네트워크 전반의 토큰과 NFT를 관리할 수 있습니다." + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (튜토리얼)" - }, "knownAddressRecipient": { "message": "알려진 계약 주소입니다." }, "knownTokenWarning": { "message": "이 작업은 지갑에 이미 나열되어 있고 피싱에 사용될 수 있는 토큰을 편집합니다. 해당 토큰이 나타내는 내용을 변경하려는 경우에만 작업을 승인하세요. $1에 대해 자세히 알아보기" }, - "kovan": { - "message": "Kovan 테스트 네트워크" - }, "lastConnected": { - "message": "마지막 연결" - }, - "learmMoreAboutGas": { - "message": "가스에 대해 $1하시겠습니까?" + "message": "마지막으로 연결됨" }, "learnCancelSpeeedup": { "message": "$1하는 방법 알아보기", @@ -1682,6 +1788,10 @@ "learnMore": { "message": "자세히 알아보기" }, + "learnMoreAboutGas": { + "message": "가스에 대해 $1하시겠습니까?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "자세히 알아보기" }, @@ -1755,7 +1865,7 @@ "message": "링크" }, "loadMore": { - "message": "추가 로드" + "message": "더 불러오기" }, "loading": { "message": "로드 중..." @@ -1764,7 +1874,7 @@ "message": "NFT 불러오는 중..." }, "loadingTokens": { - "message": "토큰 로드 중..." + "message": "토큰 불러오는 중..." }, "localhost": { "message": "Localhost 8545" @@ -1911,17 +2021,17 @@ "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." }, "mismatchedChainRecommendation": { - "message": "계속 진행하기 전에 $1 확인을 권합니다.", + "message": "계속 진행하기 전에 $1(을)를 확인하시기 바랍니다.", "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key. The link will open to instructions for users to validate custom network details." }, "mismatchedNetworkName": { - "message": "기록에 따르면 네트워크 이름이 이 체인 ID와 일치하지 않는 것 같습니다." + "message": "기록에 따르면 네트워크 이름이 이 체인 ID와 일치하지 않습니다." }, "mismatchedNetworkSymbol": { - "message": "제출하신 환율 기호가 이 체인 ID의 환율과 일치하지 않습니다." + "message": "제출한 화폐 기호가 이 체인 ID의 화폐 기호와 일치하지 않습니다." }, "mismatchedRpcUrl": { - "message": "기록에 따르면 제출하신 RPC URL 값이 이 체인 ID에 대해 알려진 공급업체와 일치하지 않습니다." + "message": "기록에 따르면 제출한 RPC URL 값이 이 체인 ID의 알려진 공급업체와 일치하지 않습니다." }, "missingNFT": { "message": "NFT가 보이지 않나요?" @@ -1947,6 +2057,10 @@ "name": { "message": "이름" }, + "nativeToken": { + "message": "이 네트워크의 네이티브 토큰은 $1입니다. 이는 가스비 지불에 사용하는 토큰입니다.", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "MetaMask로 디앱을 이용하려면 지갑에 $1(이)가 있어야 합니다.", "description": "$1 represents the cypto symbol to be purchased" @@ -1956,7 +2070,7 @@ "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" }, "needHelpFeedback": { - "message": "피드백을 공유하세요." + "message": "피드백 공유" }, "needHelpLinkText": { "message": "MetaMask 지원" @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "이더리움" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -2033,6 +2150,9 @@ "nevermind": { "message": "괜찮습니다" }, + "new": { + "message": "신규!" + }, "newAccount": { "message": "새 계정" }, @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "불러온 토큰" }, - "newTotal": { - "message": "새 합계" - }, - "newTransactionFee": { - "message": "새 거래 수수료" - }, "newValues": { "message": "새로운 가치" }, @@ -2094,7 +2208,7 @@ "message": "NFT\n" }, "nftTokenIdPlaceholder": { - "message": "수집 가능한 ID를 입력하세요." + "message": "토큰 ID 입력" }, "nfts": { "message": "NFT" @@ -2115,7 +2229,7 @@ "message": "사용 가능한 통화 변환 날짜 없음" }, "noConversionRateAvailable": { - "message": "사용 가능한 전환율이 없음" + "message": "사용 가능한 환율 없음" }, "noNFTs": { "message": "아직 NFT가 없음" @@ -2148,7 +2262,7 @@ "message": "이 기능을 켜면 확인 화면에서 임시값(거래 번호)을 변경할 수 있습니다. 이는 고급 기능으로, 주의해서 사용해야 합니다." }, "nonceFieldHeading": { - "message": "맞춤형 임시값" + "message": "커스텀 논스" }, "notBusy": { "message": "바쁘지 않음" @@ -2188,7 +2302,7 @@ "message": "다크모드 활성화" }, "notifications12Description": { - "message": "다크모드가 마침내 활성화되었습니다! 설정(Settings) -> 시험 기능(Experimental)으로 이동하여 라이트, 다크, 시스템 중 선택하세요." + "message": "이제 확장 프로그램에서 다크 모드를 사용할 수 있습니다! 설정 -> 시험 기능으로 이동하여 라이트, 다크, 시스템 중 원하는 옵션을 선택하세요." }, "notifications12Title": { "message": "다크모드를 원하세요? 이제 다크모드를 사용하세요! 🕶️🦊" @@ -2197,12 +2311,29 @@ "message": "사용자 정의 네트워크 목록 보기" }, "notifications13Description": { - "message": "이제 Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm 및 Polygon과 같은 인기 있는 사용자 정의 네트워크를 쉽게 추가할 수 있습니다! 이 기능을 활성화하려면 설정 -> 실험으로 이동하여 \"사용자 지정 네트워크 목록 표시\"를 켜세요!", + "message": "이제 Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm 및 Polygon과 같은 인기 커스텀 네트워크를 쉽게 추가할 수 있습니다! 이 기능을 활성화하려면 설정 -> 실험으로 이동하여 \"커스텀 네트워크 목록 표시\"를 활성화하세요!", "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." }, "notifications13Title": { "message": "인기 네트워크 추가" }, + "notifications14ActionText": { + "message": "백업 설정 표시" + }, + "notifications14Description": { + "message": "10월 초에 3Box 데이터 기능의 지원이 중단됩니다. 사용자 지갑을 수동으로 백업하고 복원하려면 고급 설정에서 \"지금 백업하기(Backup now)\" 버튼을 사용하세요.", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "3Box 지원 중단" + }, + "notifications15Description": { + "message": "사용자가 진행해야 할 작업은 없습니다. 지갑은 원래대로 계속 사용할 수 있습니다. 머지 관련 사기를 주의하세요.", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "이더리움 머지가 완료되었습니다!" + }, "notifications1Description": { "message": "MetaMask 모바일 사용자는 이제 모바일 지갑에서 토큰을 스왑할 수 있습니다. QR 코드를 스캔하여 모바일 앱을 설치하고 스왑을 시작하세요.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2268,7 +2399,7 @@ "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, "notifications8ActionText": { - "message": "고급 설정으로 이동하기", + "message": "설정 > 고급으로 이동", "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": { @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "모두 읽음으로 표시" }, + "numberOfNewTokensDetectedPlural": { + "message": "계정에서 $1개의 새로운 토큰이 발견됨", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "계정에서 1개의 새 토큰을 찾았습니다" + }, "ofTextNofM": { "message": "/" }, @@ -2384,6 +2522,9 @@ "message": "전체 화면에서 MetaMask를 열어 WebHID를 통해 Ledger를 연결합니다.", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "블록 탐색기 열기" + }, "optional": { "message": "옵션" }, @@ -2456,6 +2597,12 @@ "permissionRequestCapitalized": { "message": "권한 요청" }, + "permissionRequested": { + "message": "지금 요청됨" + }, + "permissionRevoked": { + "message": "이 업데이트에서 취소됨" + }, "permission_accessNetwork": { "message": "인터넷에 액세스합니다.", "description": "The description of the `endowment:network-access` permission." @@ -2476,9 +2623,13 @@ "message": "무기한 운용됩니다.", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "'$1'($2) 하에서 계정과 자산을 통제합니다.", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "'$1' 계정과 자산을 통제합니다.", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "기기의 데이터를 저장하고 관리합니다.", @@ -2488,10 +2639,18 @@ "message": "알림을 표시합니다.", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "거래 인사이트를 가져오고 표시하세요.", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "알 수 없는 권한: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "$1 공개 키($2) 보기.", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "권한" }, @@ -2508,6 +2667,9 @@ "popularCustomNetworks": { "message": "인기 사용자 정의 네트워크" }, + "portfolioSite": { + "message": "포트폴리오 사이트" + }, "preferredLedgerConnectionType": { "message": "선호하는 Ledger 연결 유형", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" @@ -2531,7 +2693,7 @@ "message": "우선 요금" }, "privacyMsg": { - "message": "개인정보 보호정책" + "message": "개인정보처리방침" }, "privateKey": { "message": "비공개 키", @@ -2688,12 +2850,20 @@ "restore": { "message": "복구" }, - "restoreWalletPreferences": { - "message": "$1의 데이터 백업이 발견되었습니다. 지갑 환경설정을 복원할까요?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "제공된 파일에서 데이터를 복원할 수 없습니다." + }, + "restoreSuccessful": { + "message": "데이터가 성공적으로 복원되었습니다." + }, + "restoreUserData": { + "message": "사용자 데이터 복원" + }, + "restoreUserDataDescription": { + "message": "이전에 백업한 JSON 파일에서 기본 설정과 계정 주소가 포함된 사용자 설정을 복원할 수 있습니다." }, "retryTransaction": { - "message": "거래 재시도" + "message": "트랜잭션 재시도" }, "reusedTokenNameWarning": { "message": "여기에 있는 토큰은 사용자가 주시 중인 다른 토큰의 기호를 재사용하기 때문에 혼동되거나 속기 쉽습니다." @@ -2714,24 +2884,21 @@ "message": "시드 구문 보기" }, "revokeAllTokensTitle": { - "message": "내 모든 $1에 액세스할 수 있는 권한을 취소할까요?", + "message": "내 모든 $1에 액세스할 수 있는 권한을 철회합니까?", "description": "$1 is the symbol of the token for which the user is revoking approval" }, "revokeApproveForAllDescription": { - "message": "권한을 취소하면 다음 $1의 $2 권한은 더 이상 유효하지 않습니다", + "message": "권한을 철회하면 다음 $1(이)가 더 이상 $2에 액세스할 수 없습니다.", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Rinkeby 테스트 네트워크" - }, - "ropsten": { - "message": "Ropsten 테스트 네트워크" + "revokeSpendingCapTooltipText": { + "message": "이 계약은 현재나 미래의 토큰을 더 이상 사용할 수 없습니다." }, "rpcUrl": { "message": "새 RPC URL" }, "safeTransferFrom": { - "message": "다음에서 안전하게 송금" + "message": "다음에서 안전하게 송금:" }, "save": { "message": "저장" @@ -2779,7 +2946,7 @@ "message": "보안 지갑" }, "securityAndPrivacy": { - "message": "보안 및 개인정보 보호" + "message": "보안 및 프라이버시" }, "seedPhraseConfirm": { "message": "비밀 복구 구문 확인" @@ -2838,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "비밀 복구 구문 기록" }, - "selectAHigherGasFee": { - "message": "높은 가스 수수료를 선택하면 거래 처리 속도를 높일 수 있습니다.*" - }, "selectAccounts": { "message": "계정 선택" }, @@ -2874,9 +3038,6 @@ "send": { "message": "보내기" }, - "sendAmount": { - "message": "송금" - }, "sendBugReport": { "message": "버그 리포트 전송" }, @@ -2898,9 +3059,12 @@ "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, "sendingToTokenContractWarning": { - "message": "경고: 토큰 주소를 전송하면 토큰이 손실될 수 있습니다. $1", + "message": "경고: 자금 손실이 발생할 수 있는 토큰 계약으로 전송하게 됩니다. $1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "Sepolia 테스트 네트워크" + }, "setAdvancedPrivacySettings": { "message": "개인정보 설정 고급 지정" }, @@ -2933,12 +3097,6 @@ "showAdvancedGasInlineDescription": { "message": "이 항목을 선택하면 보내기 및 확인 화면에서 바로 가스 가격과 한도 조절을 확인할 수 있습니다." }, - "showCustomNetworkList": { - "message": "사용자 정의 네트워크 보기" - }, - "showCustomNetworkListDescription": { - "message": "이를 선택하면 새로 네트워크를 추가할 때 네트워크 목록에 상세 설명이 함께 나타납니다." - }, "showFiatConversionInTestnets": { "message": "테스트넷에 전환 표시" }, @@ -2993,6 +3151,9 @@ "signed": { "message": "서명완료" }, + "signin": { + "message": "로그인" + }, "simulationErrorMessageV2": { "message": "가스 요금을 추정할 수 없었습니다. 계약에 오류가 있을 수 있으며 이 거래가 실패할 수 있습니다." }, @@ -3005,11 +3166,8 @@ "skipAccountSecurityDetails": { "message": "본인은 본인의 비밀 복구 구문을 백업하지 않는 한 본인의 계정과 모든 자산을 잃을 수 있다는 사실을 이해합니다." }, - "slow": { - "message": "느림" - }, "smartTransaction": { - "message": "스마트 거래" + "message": "스마트 트랜잭션" }, "snapAccess": { "message": "$1 스냅이 접근할 수 있는 대상:", @@ -3019,6 +3177,10 @@ "message": "$1에 $2에서 추가됨", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "스냅 오류: '$1'. 오류 코드: '$2'", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -3029,12 +3191,32 @@ "snapInstallWarningCheck": { "message": "이해하셨으면 모두 체크해 주세요." }, + "snapInstallWarningCheckPlural": { + "message": "이해하셨으면 모든 란에 체크하세요." + }, + "snapInstallWarningKeyAccess": { + "message": "'$1' 스냅 이용에 필요한 $2 키 액세스 권한을 부여하고 있습니다. 이 작업은 사용자의 $2 계정과 자산에 '$1' 제어 권한을 부여하며 취소가 불가능합니다. '$1의 신뢰성을 확인한 후에 진행하세요.", + "description": "The first parameter is the name of the snap and the second one is the protocol" + }, "snapRequestsPermission": { "message": "이 스냅이 다음 권한을 요청하고 있습니다." }, + "snapUpdate": { + "message": "스냅 업데이트" + }, + "snapUpdateExplanation": { + "message": "$1에는 스냅의 새 버전이 필요합니다", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "스냅" }, + "snapsInsightLoading": { + "message": "거래 인사이트를 가져오는 중..." + }, + "snapsNoInsight": { + "message": "스냅이 인사이트를 가져오지 못했습니다" + }, "snapsSettingsDescription": { "message": "스냅 관리" }, @@ -3124,7 +3306,7 @@ "message": "상태 로그를 가져오는 도중 오류가 발생했습니다." }, "stateLogFileName": { - "message": "MetaMask 스테이트 로그" + "message": "MetaMask 상태 로그" }, "stateLogs": { "message": "상태 로그" @@ -3197,7 +3379,7 @@ "message": "스왑이 실패했을 것입니다" }, "stxCancelledDescription": { - "message": "거래가 실패했을 것이기 때문에 불필요한 가스비 지출이 없도록 거래를 취소했습니다." + "message": "트랜잭션 실패가 예상되었습니다. 불필요한 가스 수수료 지출을 방지하기 위해 트랜잭션이 취소되었습니다." }, "stxCancelledSubDescription": { "message": "스왑을 다시 진행하세요. 다음에도 유사한 위험이 발생한다면 보호해 드리겠습니다." @@ -3266,7 +3448,7 @@ "message": "스왑 취소됨" }, "stxUserCancelledDescription": { - "message": "거래가 취소되어 가스비를 지불하지 않았습니다." + "message": "트랜잭션이 취소되어 가스 수수료를 지불하지 않았습니다." }, "stxYouCanOptOut": { "message": "고급 설정에서 언제든지 옵트아웃할 수 있습니다." @@ -3479,6 +3661,9 @@ "swapReviewSwap": { "message": "스왑 검토" }, + "swapSearchNameOrAddress": { + "message": "이름 검색 또는 주소 붙여넣기" + }, "swapSelect": { "message": "선택" }, @@ -3498,6 +3683,9 @@ "message": "$1%", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "주문 시점과 확인 시점 사이에 가격이 변동되는 현상을 \"슬리패지\"라고 합니다. 슬리패지가 \"최대 슬리패지\" 설정을 초과하면 스왑이 자동으로 취소됩니다." + }, "swapSource": { "message": "유동성 소스" }, @@ -3579,7 +3767,7 @@ "message": "슬리패지 금액이 너무 커서 전환율이 좋지 않습니다. 슬리패지 허용치를 15% 값 이하로 줄이세요." }, "swapsMaxSlippage": { - "message": "슬리패지 허용치" + "message": "슬리피지 허용치" }, "swapsNotEnoughForTx": { "message": "$1이(가) 부족하여 이 거래를 완료할 수 없습니다.", @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "이 계정으로 전환" }, + "switchedTo": { + "message": "다음으로 변경했습니다:" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "네트워크를 전환하면 대기 중인 모든 확인 작업이 취소됩니다." }, @@ -3643,15 +3834,6 @@ "syncWithMobileTitle": { "message": "모바일과 동기화" }, - "syncWithThreeBox": { - "message": "3Box로 데이터 동기화(실험적 기능)" - }, - "syncWithThreeBoxDescription": { - "message": "이 기능을 켜면 3Box를 이용해 설정을 백업합니다. 현재 실험 중인 기능이므로 본인의 책임 하에 사용해야 합니다." - }, - "syncWithThreeBoxDisabled": { - "message": "초기 동기화 도중 오류가 발생하여 3Box가 비활성화되었습니다." - }, "tenPercentIncreased": { "message": "10% 인상" }, @@ -3662,7 +3844,7 @@ "message": "서비스 약관" }, "testFaucet": { - "message": "포시트(수도꼭지) 테스트" + "message": "수도꼭지(faucet) 테스트" }, "testNetworks": { "message": "테스트 네트워크" @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "원하는 MetaMask 테마를 선택하세요." }, + "thingsToKeep": { + "message": "유의 사항:" + }, "thisWillCreate": { "message": "이렇게 하면 새 지갑과 비밀 복구 구문이 만들어집니다" }, @@ -3709,17 +3894,26 @@ "message": "토큰 소수자리 필요" }, "tokenDecimalTitle": { - "message": "토큰 십진수:" + "message": "토큰 소수점:" }, "tokenDetails": { "message": "토큰 상세 정보" }, + "tokenFoundTitle": { + "message": "$1개의 새 토큰을 찾았습니다" + }, "tokenId": { "message": "토큰 ID" }, "tokenList": { "message": "토큰 목록:" }, + "tokenScamSecurityRisk": { + "message": "토큰 사기 및 보안 위험" + }, + "tokenShowUp": { + "message": "토큰이 지갑에서 자동으로 표시되지 않을 수 있습니다." + }, "tokenSymbol": { "message": "토큰 기호" }, @@ -3806,10 +4000,10 @@ "message": "거래 수수료" }, "transactionHistoryBaseFee": { - "message": "기본 요금(GWEI)" + "message": "기본 수수료(GWEI)" }, "transactionHistoryL1GasLabel": { - "message": "총 L1 가스 요금" + "message": "총 L1 가스 수수료" }, "transactionHistoryL2GasLimitLabel": { "message": "L2 가스 한도" @@ -3818,13 +4012,13 @@ "message": "L2 가스 가격" }, "transactionHistoryMaxFeePerGas": { - "message": "가스당 최대 요금" + "message": "가스당 최대 수수료" }, "transactionHistoryPriorityFee": { - "message": "우선 요금(GWEI)" + "message": "우선 수수료(GWEI)" }, "transactionHistoryTotalGasFee": { - "message": "총 가스 요금" + "message": "총 가스 수수료" }, "transactionResubmitted": { "message": "$2에서 가스 수수료가 $1(으)로 증가한 거래가 다시 제출되었습니다." @@ -3861,6 +4055,9 @@ "tryAgain": { "message": "다시 시도" }, + "tryOur": { + "message": "다음을 체험하기:" + }, "turnOnTokenDetection": { "message": "향상된 토큰 감지 켜기" }, @@ -3896,7 +4093,7 @@ "message": "죄송합니다! 문제가 생겼습니다...." }, "unknownCollection": { - "message": "제목 미지정 콜렉션" + "message": "제목 미지정 컬렉션" }, "unknownNetwork": { "message": "알 수 없는 비공개 네트워크" @@ -3914,9 +4111,13 @@ "message": "분산된 웹이 다음을 대기 중" }, "unrecognizedChain": { - "message": "이 맞춤형 네트워크는 인식되지 않습니다. 진행하기 전에 $1을(를) 권장합니다.", + "message": "이 커스텀 네트워크는 인식되지 않았습니다.", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (인식할 수 없는 프로트콜)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "수집 가능한(ERC-721) 토큰 전송은 현재 지원되지 않습니다.", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -4034,6 +4235,10 @@ "warning": { "message": "경고" }, + "warningTooltipText": { + "message": "$1 계약은 추가 통보나 동의 없이도 남은 토큰 전체를 사용할 수 있습니다. 보호를 위해 최소 지출 한도를 설정하세요.", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "약함" }, @@ -4094,7 +4299,7 @@ "message": "예, 시도하겠습니다." }, "youHaveAddedAll": { - "message": "모든 인기 네트워크를 추가했습니다. $1에서 더 많은 네트워크를 확인하거나 $2 할 수 있습니다.", + "message": "모든 인기 네트워크를 추가했습니다. $1에서 더 많은 네트워크를 확인하거나 $2을(를) 할 수 있습니다.", "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" }, "youNeedToAllowCameraAccess": { diff --git a/app/_locales/lt/messages.json b/app/_locales/lt/messages.json index 68dd08edc238..18227752ef2b 100644 --- a/app/_locales/lt/messages.json +++ b/app/_locales/lt/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Apie" }, - "acceleratingATransaction": { - "message": "Operacijos paspartinimas naudojantis didesne dujų kaina padidina galimybes, kad ji bus greičiau apdorota tinkle, tačiau tai ne visada garantuojama. " - }, "accessingYourCamera": { "message": "Kreipiamasi į kamerą..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Jungiamasi prie „Goerli“ bandomojo tinklo" }, - "connectingToKovan": { - "message": "Jungiamasi prie „Kovan“ bandomojo tinklo" - }, "connectingToMainnet": { "message": "Jungiamasi prie pagrindinio „Ethereum“ tinklo" }, - "connectingToRinkeby": { - "message": "Jungiamasi prie „Rinkeby“ bandomojo tinklo" - }, - "connectingToRopsten": { - "message": "Jungiamasi prie „Ropsten“ bandomojo tinklo" - }, "continueToWyre": { "message": "Tęsti su „Wyre“" }, @@ -250,12 +238,6 @@ "custom": { "message": "Išplėstiniai" }, - "customGas": { - "message": "Pritaikyti dujas" - }, - "customGasSubTitle": { - "message": "Didinant mokestį gali mažėti apdorojimo trukmė, bet tai negarantuojama." - }, "customToken": { "message": "Pritaikytas žetonas" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "Norėdami tęsti, įveskite slaptažodį" }, - "estimatedProcessingTimes": { - "message": "Numatomos apdorojimo trukmės" - }, "ethereumPublicAddress": { "message": "„Ethereum“ viešasis adresas" }, @@ -503,9 +482,6 @@ "knownAddressRecipient": { "message": "Žinomas sutarties adresas." }, - "kovan": { - "message": "„Kovan“ bandomasis tinklas" - }, "learnMore": { "message": "Sužinokite daugiau" }, @@ -604,12 +580,6 @@ "newToMetaMask": { "message": "Tik pradedate naudotis „MetaMask“?" }, - "newTotal": { - "message": "Nauja bendra suma" - }, - "newTransactionFee": { - "message": "Naujas operacijos mokestis" - }, "next": { "message": "Toliau" }, @@ -768,12 +738,6 @@ "revealSeedWordsWarningTitle": { "message": "Šia fraze su niekuo NESIDALINKITE!" }, - "rinkeby": { - "message": "„Rinkeby“ bandomasis tinklas" - }, - "ropsten": { - "message": "„Ropsten“ bandomasis tinklas" - }, "rpcUrl": { "message": "Naujas RPC URL" }, @@ -810,9 +774,6 @@ "seedPhraseReq": { "message": "Atkūrimo frazės yra 12 žodžių ilgio" }, - "selectAHigherGasFee": { - "message": "Pasirinkite didesnį dujų mokestį, kad paspartintumėte savo operacijos apdorojimą.*" - }, "selectAnAccount": { "message": "Pasirinkite paskyrą" }, @@ -831,9 +792,6 @@ "send": { "message": "Siųsti" }, - "sendAmount": { - "message": "Siųsti sumą" - }, "sendTokens": { "message": "Siųsti žetonus" }, @@ -876,9 +834,6 @@ "signed": { "message": "Pasirašyta" }, - "slow": { - "message": "Lėtas" - }, "somethingWentWrong": { "message": "Vaje! Kažkas negerai." }, diff --git a/app/_locales/lv/messages.json b/app/_locales/lv/messages.json index 30e65fd68b1e..745aef83680c 100644 --- a/app/_locales/lv/messages.json +++ b/app/_locales/lv/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Par" }, - "acceleratingATransaction": { - "message": "* Darījuma paātrināšana, izmantojot augstāku Gas cenu, palielina iespēju, ka tīkls to apstrādās ātrāk, taču tas nav garantēts." - }, "accessingYourCamera": { "message": "Piekļūst kamerai..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Pieslēdzas Goerli testa tīklam" }, - "connectingToKovan": { - "message": "Savienojas ar Kovan testa tīklu" - }, "connectingToMainnet": { "message": "Savienojas ar galveno Ethereum tīklu" }, - "connectingToRinkeby": { - "message": "Pieslēdzas Rinkeby testa tīklam" - }, - "connectingToRopsten": { - "message": "Pieslēdzas Ropsten testa tīklam" - }, "continueToWyre": { "message": "Pāriet uz Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "Papildu" }, - "customGas": { - "message": "Pielāgot Gas" - }, - "customGasSubTitle": { - "message": "Nodevas palielināšana var saīsināt apstrādes laiku, bet ne garantēti." - }, "customToken": { "message": "Pielāgots marķieris" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "Ievadiet paroli, lai turpinātu" }, - "estimatedProcessingTimes": { - "message": "Aprēķinātais apstrādes laiks" - }, "ethereumPublicAddress": { "message": "Ethereum publiskā adrese" }, @@ -499,9 +478,6 @@ "knownAddressRecipient": { "message": "Zināmā līguma adrese." }, - "kovan": { - "message": "Kovan testa tīkls" - }, "learnMore": { "message": "Uzzināt vairāk" }, @@ -600,12 +576,6 @@ "newToMetaMask": { "message": "Nepazīstat MetaMask?" }, - "newTotal": { - "message": "Jaunā kopsumma" - }, - "newTransactionFee": { - "message": "Jauna darījuma nodeva" - }, "next": { "message": "Nākamais" }, @@ -764,12 +734,6 @@ "revealSeedWordsWarningTitle": { "message": "NEDALIETIES ar šo frāzi!" }, - "rinkeby": { - "message": "Rinkeby testa tīkls" - }, - "ropsten": { - "message": "Ropsten testa tīkls" - }, "rpcUrl": { "message": "Jauns RPC URL" }, @@ -806,9 +770,6 @@ "seedPhraseReq": { "message": "Atkopšanas frāzes ir 12 vārdus garas" }, - "selectAHigherGasFee": { - "message": "Atlasiet lielāku maksu par Gas, lai paātrinātu darījuma apstrādi.*" - }, "selectAnAccount": { "message": "Atlasiet kontu" }, @@ -827,9 +788,6 @@ "send": { "message": "Sūtīt" }, - "sendAmount": { - "message": "Nosūtītā summa" - }, "sendTokens": { "message": "Nosūtīt marķierus" }, @@ -872,9 +830,6 @@ "signed": { "message": "Parakstīts" }, - "slow": { - "message": "Lēns" - }, "somethingWentWrong": { "message": "Ak vai! Radās problēma." }, diff --git a/app/_locales/ml/messages.json b/app/_locales/ml/messages.json index 570fd93c9a0c..b98bd1425198 100644 --- a/app/_locales/ml/messages.json +++ b/app/_locales/ml/messages.json @@ -136,9 +136,6 @@ "settings": { "message": "ക്രമീകരണങ്ങള്‍" }, - "slow": { - "message": "പതുക്കെ" - }, "tryAgain": { "message": "വീണ്ടും ശ്രമിക്കുക" }, diff --git a/app/_locales/mr/messages.json b/app/_locales/mr/messages.json index 2948a9d1268f..0975846feb76 100644 --- a/app/_locales/mr/messages.json +++ b/app/_locales/mr/messages.json @@ -136,9 +136,6 @@ "settings": { "message": "सेटिंग्ज" }, - "slow": { - "message": "धीमी" - }, "tryAgain": { "message": "पुन्हा प्रयत्न करा" }, diff --git a/app/_locales/ms/messages.json b/app/_locales/ms/messages.json index 8923fb8bfcb9..81b001a7131d 100644 --- a/app/_locales/ms/messages.json +++ b/app/_locales/ms/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Mengenai" }, - "acceleratingATransaction": { - "message": "* Mempercepatkan transaksi menggunakan harga gas lebih tinggi akan meningkatkan peluang diproses oleh rangkaian lebih cepat, tetapi ini pun tidak sentiasa dijamin." - }, "accessingYourCamera": { "message": "Mengakses kamera anda..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Menyambung kepada Rangkaian Ujian Goerli" }, - "connectingToKovan": { - "message": "Menyambungkan kepada Rangkaian Ujian Kovan" - }, "connectingToMainnet": { "message": "Menyambung kepada Rangkaian Ethereum Utama" }, - "connectingToRinkeby": { - "message": "Menyambung kepada Rangkaian Ujian Rinkeby" - }, - "connectingToRopsten": { - "message": "Menyambungkan kepada Rangkaian Ujian Ropsten" - }, "continueToWyre": { "message": "Teruskan ke Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "Lanjutan" }, - "customGas": { - "message": "Suaikan Gas" - }, - "customGasSubTitle": { - "message": "Meningkatkan fi mungkin akan mengurangkan masa pemprosesan, tetapi ia tidak dijamin." - }, "customToken": { "message": "Token Tersuai" }, @@ -337,9 +319,6 @@ "enterPasswordContinue": { "message": "Masukkan kata laluan untuk teruskan" }, - "estimatedProcessingTimes": { - "message": "Masa Pemprosesan yang Dijangka" - }, "ethereumPublicAddress": { "message": "Alamat Awam Ethereum" }, @@ -492,9 +471,6 @@ "knownAddressRecipient": { "message": "Alamat kontrak diketahui." }, - "kovan": { - "message": "Rangkaian Ujian Kovan" - }, "learnMore": { "message": "Maklumat lanjut" }, @@ -587,12 +563,6 @@ "newToMetaMask": { "message": "Baru mengenali MetaMask?" }, - "newTotal": { - "message": "Jumlah Keseluruhan Baru" - }, - "newTransactionFee": { - "message": "Fi Transaksi Baru" - }, "next": { "message": "Seterusnya" }, @@ -748,12 +718,6 @@ "revealSeedWordsWarningTitle": { "message": "JANGAN berkongsi ungkapan ini dengan orang lain!" }, - "rinkeby": { - "message": "Rangkaian Ujian Rinkeby" - }, - "ropsten": { - "message": "Rangkaian Ujian Ropsten" - }, "rpcUrl": { "message": "URL RPC baru" }, @@ -790,9 +754,6 @@ "seedPhraseReq": { "message": "Frasa benih panjangnya 12 patah perkataan" }, - "selectAHigherGasFee": { - "message": "Pilih yuran gas yang lebih tinggi untuk mempercepatkan pemprosesan transaksi anda.*" - }, "selectAnAccount": { "message": "Pilih Akaun" }, @@ -811,9 +772,6 @@ "send": { "message": "Hantar" }, - "sendAmount": { - "message": "Hantar Amaun" - }, "sendTokens": { "message": "Hantar Token" }, @@ -856,9 +814,6 @@ "signed": { "message": "Ditandatangani" }, - "slow": { - "message": "Perlahan" - }, "somethingWentWrong": { "message": "Alamak! Ada yang tak kena." }, diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json index 03510df014fb..085ef891db0c 100644 --- a/app/_locales/nl/messages.json +++ b/app/_locales/nl/messages.json @@ -72,9 +72,6 @@ "createAccount": { "message": "Account aanmaken" }, - "customGas": { - "message": "Pas Gas aan" - }, "decimal": { "message": "Decimalen van precisie" }, @@ -175,9 +172,6 @@ "message": "JSON-bestand", "description": "format for importing an account" }, - "kovan": { - "message": "Kovan-testnetwerk" - }, "likeToImportTokens": { "message": "Wil je deze tokens toevoegen?" }, @@ -274,12 +268,6 @@ "revealSeedWordsWarning": { "message": "Zorg dat je back-up woorden niet op een openbare plaats bekijkt! Deze woorden kunnen worden gebruikt om al uw accounts opnieuw te genereren (en dus uw account te stelen)." }, - "rinkeby": { - "message": "Rinkeby testnetwerk" - }, - "ropsten": { - "message": "Ropsten testnetwerk" - }, "save": { "message": "Opslaan" }, diff --git a/app/_locales/no/messages.json b/app/_locales/no/messages.json index 8d1cc1eab29e..06b98d5310e4 100644 --- a/app/_locales/no/messages.json +++ b/app/_locales/no/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Info" }, - "acceleratingATransaction": { - "message": "* Akselerering av en transaksjon ved å bruke en høyere datakraftspris øker sjansene for å bli behandlet av nettverket raskere, men det er ikke alltid garantert." - }, "accessingYourCamera": { "message": "Oppretter tilgang til kameraet ditt..." }, @@ -190,18 +187,9 @@ "connectingToGoerli": { "message": "Oppretter forbindelse med Goerli Test Network" }, - "connectingToKovan": { - "message": "Kobler til Kovan testnettverk" - }, "connectingToMainnet": { "message": "Forbinder med hoved-Ethereumnettverk " }, - "connectingToRinkeby": { - "message": "Kobler til Rinkeby Test Network " - }, - "connectingToRopsten": { - "message": "Kobler til Ropsten testnettverk" - }, "continueToWyre": { "message": "Fortsett til Wyre " }, @@ -247,12 +235,6 @@ "custom": { "message": "Avansert" }, - "customGas": { - "message": "Tilpass Gass" - }, - "customGasSubTitle": { - "message": "Økt gebyr kan redusere behandlingstiden, men det er ikke garantert." - }, "customToken": { "message": "Egendefinert token " }, @@ -337,9 +319,6 @@ "enterPasswordContinue": { "message": "Skriv inn passord for å fortsette" }, - "estimatedProcessingTimes": { - "message": "Anslått behandlingstid" - }, "ethereumPublicAddress": { "message": "Ethereum offentlig adresse" }, @@ -490,9 +469,6 @@ "knownAddressRecipient": { "message": "Kjent kontaktadresse" }, - "kovan": { - "message": "Kovan testnettverk" - }, "learnMore": { "message": "Lær mer" }, @@ -591,12 +567,6 @@ "newToMetaMask": { "message": "Ny på MetaMask? " }, - "newTotal": { - "message": "Ny total" - }, - "newTransactionFee": { - "message": "Ny transaksjonsavgift" - }, "next": { "message": "Neste" }, @@ -755,9 +725,6 @@ "revealSeedWordsWarningTitle": { "message": "IKKE del denne frasen med noen! " }, - "rinkeby": { - "message": "Rinkeby testnettverk" - }, "rpcUrl": { "message": "NY RPC-URL " }, @@ -794,9 +761,6 @@ "seedPhraseReq": { "message": "Mnemoniske gjenopprettingsfraser består av 12 ord " }, - "selectAHigherGasFee": { - "message": "Velg en høyere gassavgift for å fremskynde transaksjonsbehandlingen.*" - }, "selectAnAccount": { "message": "Velg en konto" }, @@ -812,9 +776,6 @@ "selectType": { "message": "Velg type " }, - "sendAmount": { - "message": "Send beløp" - }, "sendTokens": { "message": "Send tokener" }, @@ -857,9 +818,6 @@ "signed": { "message": "Signert" }, - "slow": { - "message": "Lav" - }, "somethingWentWrong": { "message": "Oisann! Noe gikk galt. " }, diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index bb889e26285f..f1a2bc71f5f8 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -2,9 +2,6 @@ "about": { "message": "Tungkol Dito" }, - "acceleratingATransaction": { - "message": "* Kapag in-accelerate ang transaksyon sa pamamagitan ng paggamit ng mas mataas na presyo ng gas, mas magiging malaki ang tsansang mas mabilis na maiproseso ng network, pero hindi ito palaging ginagarantiya." - }, "acceptTermsOfUse": { "message": "Nabasa ko at sumasang-ayon ako sa $1", "description": "$1 is the `terms` message" @@ -355,18 +352,9 @@ "connectingToGoerli": { "message": "Kumokonekta sa Goerli Test Network" }, - "connectingToKovan": { - "message": "Kumokonekta sa Kovan Test Network" - }, "connectingToMainnet": { "message": "Kumokonekta sa Ethereum Mainnet" }, - "connectingToRinkeby": { - "message": "Kumokonekta sa Rinkeby Test Network" - }, - "connectingToRopsten": { - "message": "Kumokonekta sa Ropsten Test Network" - }, "contactUs": { "message": "Makipag-ugnayan sa amin" }, @@ -436,21 +424,12 @@ "currentLanguage": { "message": "Kasalukuyang Wika" }, - "customGas": { - "message": "I-customize ang Gas" - }, - "customGasSubTitle": { - "message": "Kapag dinagdagan ang bayarin, mababawasan ang mga oras ng pagproseso, pero hindi ito garantisado." - }, "customSpendLimit": { "message": "Custom na Limitasyon sa Paggastos" }, "customToken": { "message": "Custom na Token" }, - "dataBackupFoundInfo": { - "message": "Ang ilan sa data ng iyong account ay na-back up sa nakaraang pag-install ng MetaMask. Maaaring kasama rito ang iyong mga setting, contact, at token. Gusto mo na bang i-restore ang data na ito ngayon?" - }, "decimal": { "message": "Decimal ng Token" }, @@ -641,9 +620,6 @@ "message": "Stack:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Mga Tinatantyang Tagal ng Pagproseso" - }, "ethGasPriceFetchWarning": { "message": "Ibinibigay ang backup na presyo ng gas dahil hindi available ang pangunahing serbisyo sa pagtatantya ng gas sa ngayon." }, @@ -677,9 +653,6 @@ "fast": { "message": "Mabilis" }, - "fastest": { - "message": "Pinakamabilis" - }, "feeAssociatedRequest": { "message": "May nauugnay na bayarin para sa request na ito." }, @@ -924,9 +897,6 @@ "knownTokenWarning": { "message": "Mae-edit ng aksyong ito ang mga token na nakalista na sa iyong wallet, na puwedeng gamitin para i-phish ka. Aprubahan lang kung sigurado kang gusto mong baguhin kung ano ang kinakatawan ng mga token na ito." }, - "kovan": { - "message": "Kovan Test Network" - }, "lastConnected": { "message": "Huling Kumonekta" }, @@ -1121,12 +1091,6 @@ "newToMetaMask": { "message": "Bago ka ba sa MetaMask?" }, - "newTotal": { - "message": "Bagong Kabuuan" - }, - "newTransactionFee": { - "message": "Bagong Bayarin sa Transaksyon" - }, "next": { "message": "Susunod" }, @@ -1413,10 +1377,6 @@ "restore": { "message": "I-restore" }, - "restoreWalletPreferences": { - "message": "Nakita ang backup ng iyong data mula sa $1. Gusto mo bang i-restore ang mga kagustuhan mo sa wallet?", - "description": "$1 is the date at which the data was backed up" - }, "retryTransaction": { "message": "Subukan Ulit ang Transaksyon" }, @@ -1435,12 +1395,6 @@ "revealSeedWordsWarningTitle": { "message": "Huwag ibahagi ang phrase na ito sa kahit sino!" }, - "rinkeby": { - "message": "Rinkeby Test Network" - }, - "ropsten": { - "message": "Ropsten Test Network" - }, "rpcUrl": { "message": "Bagong RPC URL" }, @@ -1522,9 +1476,6 @@ "seedPhraseReq": { "message": "Ang mga Secret Recovery Phrase ay naglalaman ng 12, 15, 18, 21, o 24 na salita" }, - "selectAHigherGasFee": { - "message": "Pumili ng mas malaking bayarin sa gas para mapabilis ang pagproseso ng iyong transaksyon.*" - }, "selectAccounts": { "message": "Pumili ng (mga) account" }, @@ -1555,9 +1506,6 @@ "send": { "message": "Magpadala" }, - "sendAmount": { - "message": "Halaga ng Ipapadala" - }, "sendSpecifiedTokens": { "message": "Magpadala ng $1", "description": "Symbol of the specified token" @@ -1616,9 +1564,6 @@ "signed": { "message": "Nilagdaan" }, - "slow": { - "message": "Mabagal" - }, "somethingWentWrong": { "message": "Oops! Nagkaproblema." }, @@ -2000,15 +1945,6 @@ "syncWithMobileTitle": { "message": "I-sync sa mobile" }, - "syncWithThreeBox": { - "message": "I-sync ang data sa 3Box (pinag-eeksperimentuhan)" - }, - "syncWithThreeBoxDescription": { - "message": "I-on para ma-back up ang iyong mga setting sa 3Box. Kasalukuyang pinag-eeksperimentuhan ang feature na ito; gamitin sa sarili mong pagpapasya." - }, - "syncWithThreeBoxDisabled": { - "message": "Na-disable ang 3Box dahil sa isang error sa unang pag-sync" - }, "terms": { "message": "Mga Tuntunin ng Paggamit" }, diff --git a/app/_locales/pl/messages.json b/app/_locales/pl/messages.json index 0025ba5fa3ed..03929a32886f 100644 --- a/app/_locales/pl/messages.json +++ b/app/_locales/pl/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Informacje" }, - "acceleratingATransaction": { - "message": "* Przyspieszenie transakcji poprzez zastosowanie wyższej ceny gazu zwiększa szanse na jej szybsze przetworzenie przez sieć, jednak skuteczność tej operacji nie jest gwarantowana." - }, "accessingYourCamera": { "message": "Uruchamianie kamery..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Łączenie z siecią testową Goerli" }, - "connectingToKovan": { - "message": "Łączenie z siecią testową Kovan" - }, "connectingToMainnet": { "message": "Łączenie z główną siecią Ethereum" }, - "connectingToRinkeby": { - "message": "Łączenie z siecią testową Rinkeby" - }, - "connectingToRopsten": { - "message": "Łączenie z siecią testową Ropsten" - }, "continueToWyre": { "message": "Przejdź do Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "Zaawansowane" }, - "customGas": { - "message": "Ustaw gaz" - }, - "customGasSubTitle": { - "message": "Zwiększenie opłaty może skrócić czas przetwarzania transakcji, ale nie jest to gwarantowane." - }, "customToken": { "message": "Własny token" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "Podaj hasło żeby kontynuować" }, - "estimatedProcessingTimes": { - "message": "Szacunkowy czas przetwarzania" - }, "ethereumPublicAddress": { "message": "Adres publiczny Ethereum" }, @@ -503,9 +482,6 @@ "knownAddressRecipient": { "message": "Znany adres kontraktu." }, - "kovan": { - "message": "Sieć testowa Kovan" - }, "learnMore": { "message": "Dowiedz się więcej" }, @@ -601,12 +577,6 @@ "newToMetaMask": { "message": "Pierwszy raz w MetaMask?" }, - "newTotal": { - "message": "Nowa suma" - }, - "newTransactionFee": { - "message": "Nowa opłata transakcyjna" - }, "next": { "message": "Dalej" }, @@ -762,12 +732,6 @@ "revealSeedWordsWarningTitle": { "message": "NIE pokazuj tej frazy nikomu!" }, - "rinkeby": { - "message": "Sieć testowa Rinkeby" - }, - "ropsten": { - "message": "Sieć testowa Ropsten" - }, "rpcUrl": { "message": "Nowy adres URL RPC" }, @@ -804,9 +768,6 @@ "seedPhraseReq": { "message": "Frazy seed mają 12 słów" }, - "selectAHigherGasFee": { - "message": "Wybierz wyższą opłatę za gaz, aby przyspieszyć przetwarzanie transakcji.*" - }, "selectAnAccount": { "message": "Wybierz konto" }, @@ -825,9 +786,6 @@ "send": { "message": "Wyślij" }, - "sendAmount": { - "message": "Wyślij kwotę" - }, "sendTokens": { "message": "Wyślij tokeny" }, @@ -870,9 +828,6 @@ "signed": { "message": "Podpisane" }, - "slow": { - "message": "Powoli" - }, "somethingWentWrong": { "message": "Ups! Coś poszło nie tak." }, diff --git a/app/_locales/pt/messages.json b/app/_locales/pt/messages.json index 81a04a144095..122d69b45dae 100644 --- a/app/_locales/pt/messages.json +++ b/app/_locales/pt/messages.json @@ -33,23 +33,70 @@ "message": "QR code inválido. Escaneie o QR code de sincronização da carteira de hardware." }, "QRHardwareWalletImporterTitle": { - "message": "Escanear QR code" + "message": "Escanear código QR" }, "QRHardwareWalletSteps1Description": { "message": "Conecte uma carteira de hardware com lacuna de ar que se comunique através de QR codes. As carteiras de hardware com lacuna de ar aceitas oficialmente incluem:" }, "QRHardwareWalletSteps1Title": { - "message": "Carteira de hardware baseada em QR code" + "message": "Carteira de hardware baseada em código QR" }, "QRHardwareWalletSteps2Description": { - "message": "AirGap Vault e Ngrave (em breve)" + "message": "Ngrave (em breve)" + }, + "SIWEAddressInvalid": { + "message": "O endereço na solicitação de entrada não coincide com o endereço da conta que você está usando para entrar." + }, + "SIWEDomainWarningBody": { + "message": "O site ($1) está solicitando que você entre no domínio incorreto. Pode-se tratar de um ataque de phishing.", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "ID da cadeia:" + }, + "SIWELabelExpirationTime": { + "message": "Expira em:" + }, + "SIWELabelIssuedAt": { + "message": "Emitido em:" + }, + "SIWELabelMessage": { + "message": "Mensagem:" + }, + "SIWELabelNonce": { + "message": "Nonce:" + }, + "SIWELabelNotBefore": { + "message": "Não antes de:" + }, + "SIWELabelRequestID": { + "message": "ID da solicitação:" + }, + "SIWELabelResources": { + "message": "Recursos: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "Versão:" + }, + "SIWESiteRequestSubtitle": { + "message": "Este site está solicitando entrada com" + }, + "SIWESiteRequestTitle": { + "message": "Solicitação de entrada" + }, + "SIWEWarningSubtitle": { + "message": "Para confirmar que você entende, marque:" + }, + "SIWEWarningTitle": { + "message": "Tem certeza?" }, "about": { "message": "Sobre" }, - "acceleratingATransaction": { - "message": "* Acelerar uma transação usando um preço de gás mais alto aumenta as chances de agilizar o processamento pela rede, mas isso nem sempre é garantido." - }, "acceptTermsOfUse": { "message": "Eu li e concordo com os $1", "description": "$1 is the `terms` message" @@ -82,7 +129,7 @@ "message": "Identicon da conta" }, "accountName": { - "message": "Nome da Conta" + "message": "Nome da conta" }, "accountNameDuplicate": { "message": "Esse nome de conta já existe", @@ -121,6 +168,9 @@ "addAlias": { "message": "Adicionar pseudônimo" }, + "addBlockExplorer": { + "message": "Adicionar um explorador de blocos" + }, "addContact": { "message": "Adicionar contato" }, @@ -171,7 +221,7 @@ "message": "Adicionar tokens sugeridos" }, "addToken": { - "message": "Adicionar Token" + "message": "Adicionar token" }, "address": { "message": "Endereço" @@ -209,9 +259,6 @@ "airgapVault": { "message": "AirGap Vault" }, - "airgapVaultTutorial": { - "message": " (Tutoriais)" - }, "alertDisableTooltip": { "message": "Isso pode ser alterado em \"Configurações > Alertas\"" }, @@ -271,12 +318,15 @@ "message": "Aprovar" }, "approveAllTokensTitle": { - "message": "Dar permissão para acessar todos os seus $1?", + "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" }, @@ -293,6 +343,10 @@ "approvedAsset": { "message": "Ativo aprovado" }, + "approvedOn": { + "message": "Aprovada em $1", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "Tem certeza?" }, @@ -305,6 +359,9 @@ "assets": { "message": "Ativos" }, + "attemptSendingAssets": { + "message": "Se você tentar enviar ativos diretamente de uma rede para outra, isso poderá resultar na perda permanente deles. Certifique-se de usar uma ponte." + }, "attemptToCancel": { "message": "Tentar cancelar?" }, @@ -335,6 +392,9 @@ "backToAll": { "message": "Voltar para todos" }, + "backup": { + "message": "Backup" + }, "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." }, @@ -344,6 +404,12 @@ "backupNow": { "message": "Fazer backup agora" }, + "backupUserData": { + "message": "Faça backup dos seus dados" + }, + "backupUserDataDescription": { + "message": "Você pode fazer backup das configurações de usuário contendo preferências e endereços de contas para um arquivo JSON." + }, "balance": { "message": "Saldo:" }, @@ -356,6 +422,9 @@ "basic": { "message": "Básico" }, + "beCareful": { + "message": "Tenha cuidado" + }, "betaMetamaskDescription": { "message": "Com a confiança de milhões de usuários, a MetaMask é uma carteira segura que torna o mundo da Web3 acessível a todos." }, @@ -372,6 +441,9 @@ "betaMetamaskVersion": { "message": "Versão Beta da MetaMask" }, + "betaPortfolioSite": { + "message": "site de portfólio beta" + }, "betaWelcome": { "message": "Bem-vindo à MetaMask Beta" }, @@ -507,6 +579,9 @@ "message": "Clique aqui para conectar seu Ledger por meio do WebHID", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "Clique aqui para adicionar os tokens manualmente." + }, "clickToRevealSeed": { "message": "Clique aqui para revelar palavras secretas" }, @@ -523,6 +598,16 @@ "confirm": { "message": "Confirmar" }, + "confirmPageDialogSetApprovalForAll": { + "message": "Você está concedendo acesso a $1, incluindo todos os que vier a adquirir. A parte na outra ponta pode transferir NFTs de sua carteira a qualquer momento, sem consultá-lo, até que você revogue essa aprovação. $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "todos os NFTs neste contrato" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "Prossiga com cautela." + }, "confirmPassword": { "message": "Confirmar Palavra-passe" }, @@ -616,17 +701,11 @@ "connectingToGoerli": { "message": "Conectando à rede de testes Goerli" }, - "connectingToKovan": { - "message": "Conectando à rede de testes Kovan" - }, "connectingToMainnet": { "message": "Conectando à mainnet do Ethereum" }, - "connectingToRinkeby": { - "message": "Conectando à rede de testes Rinkeby" - }, - "connectingToRopsten": { - "message": "Conectando à rede de testes Ropsten" + "connectingToSepolia": { + "message": "Conectando à rede de teste Sepolia" }, "contactUs": { "message": "Fale conosco" @@ -659,10 +738,22 @@ "message": "Você está enviando tokens ao endereço de contrato do token. Isso pode resultar na perda desses tokens." }, "contractDeployment": { - "message": "Distribuição do Contrato" + "message": "Implementação do contrato" + }, + "contractDescription": { + "message": "Para se proteger contra golpistas, reserve um momento para verificar os detalhes do contrato." }, "contractInteraction": { - "message": "Interação com contrato" + "message": "Interação com o contrato" + }, + "contractRequestingSpendingCap": { + "message": "Contrato solicitando limite de gastos" + }, + "contractTitle": { + "message": "Detalhes do contrato" + }, + "contractToken": { + "message": "Contrato do token" }, "convertTokenToNFTDescription": { "message": "Detectamos que esse ativo é um NFT. A MetaMask agora oferece suporte nativo a NFTs. Gostaria de removê-lo de sua lista de tokens e adicioná-lo como NFT?" @@ -695,7 +786,7 @@ "message": "Criar uma carteira" }, "createAccount": { - "message": "Criar Conta" + "message": "Criar conta" }, "createNewWallet": { "message": "Criar uma nova carteira" @@ -742,19 +833,16 @@ "customContentSearch": { "message": "Buscar uma rede previamente adicionada" }, - "customGas": { - "message": "Customizar Gas" - }, "customGasSettingToolTipMessage": { "message": "Use $1 para personalizar o preço do gás. Isso pode parecer confuso se você não estiver familiarizado. Interaja por sua conta e risco.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "Aumentar a taxa pode diminuir o tempo de processamento, mas isso não é garantido." - }, "customSpendLimit": { "message": "Limite de gastos personalizado" }, + "customSpendingCap": { + "message": "Limite de gastos personalizado" + }, "customToken": { "message": "Token personalizado" }, @@ -764,6 +852,9 @@ "customTokenWarningInTokenDetectionNetwork": { "message": "Antes de importar um token manualmente, certifique-se de que ele é confiável. Saiba mais sobre $1." }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "Certifique-se de que confia no token antes de importá-lo. Saiba como evitar $1. Você também pode ativar a detecção de tokens $2." + }, "customerSupport": { "message": "suporte ao cliente" }, @@ -787,14 +878,14 @@ "data": { "message": "Dados" }, - "dataBackupFoundInfo": { - "message": "Foi feito o backup de alguns dos dados da sua conta durante uma instalação anterior da MetaMask. Isso pode incluir configurações, contatos e tokens. Gostaria de restaurar esses dados agora?" + "dataBackupSeemsCorrupt": { + "message": "Não é possível restaurar seus dados. O arquivo parece estar corrompido." }, "dataHex": { "message": "Hex" }, "decimal": { - "message": "Precisão em Decimais" + "message": "Decimal do token" }, "decimalsMustZerotoTen": { "message": "Decimais devem ser no mínimo 0 e não passar de 36." @@ -835,6 +926,12 @@ "message": "Depositar $1", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "Saiba mais" + }, + "deprecatedTestNetworksMsg": { + "message": "Devido às mudanças de protocolo do Ethereum, as redes de teste Rinkeby, Ropsten e Kovan podem não funcionar com a mesma confiança e serão descontinuadas em breve." + }, "description": { "message": "Descrição" }, @@ -894,7 +991,7 @@ "message": "Baixe essa Frase de Recuperação Secreta e mantenha-a guardada em segurança num disco rígido externo ou mídia de armazenamento criptografada." }, "downloadStateLogs": { - "message": "Descarregar Registos de Estado" + "message": "Baixar registros de estado" }, "dropped": { "message": "Abandonada" @@ -1037,13 +1134,13 @@ "message": " Ativar detecção automática" }, "enableEIP1559V2": { - "message": "Ativar IU aprimorada para taxa de gás" + "message": "Ativar UI aprimorada para taxa de gás" }, "enableEIP1559V2AlertMessage": { "message": "Atualizamos o funcionamento da estimativa e personalização da taxa de gás." }, "enableEIP1559V2ButtonText": { - "message": "Ative a IU aprimorada para taxa de gás nas configurações" + "message": "Ative a UI aprimorada para taxa de gás nas configurações" }, "enableEIP1559V2Description": { "message": "Atualizamos o funcionamento da estimativa e personalização de gás. Ative se quiser desfrutar a nova experiência de gás. $1", @@ -1110,6 +1207,15 @@ "message": "O endpoint retornou um ID diferente da chain: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "Detecção aprimorada de tokens" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "A detecção aprimorada de tokens está disponível no momento em $1. $2" + }, + "enhancedTokenDetectionDescription": { + "message": "A API de tokens da ConsenSys agrega uma lista de tokens a partir de diversas listas de terceiros. Quando ativada, os tokens serão automaticamente detectados (e pesquisáveis) na mainnet do Ethereum, Binance, Polygon e Avalanche. Quando desativada, a detecção automática e pesquisa só poderão ser feitas na mainnet do Ethereum." + }, "ensIllegalCharacter": { "message": "Caractere inválido para ENS." }, @@ -1166,9 +1272,6 @@ "message": "Lista:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Tempos de processamento estimados" - }, "ethGasPriceFetchWarning": { "message": "O preço de backup do gás é fornecido porque a estimativa de gás principal está indisponível no momento." }, @@ -1194,7 +1297,7 @@ "message": "Experimental" }, "exportPrivateKey": { - "message": "Exportar Chave Privada" + "message": "Exportar chave privada" }, "externalExtension": { "message": "Extensão externa" @@ -1214,9 +1317,6 @@ "fast": { "message": "Rápido" }, - "fastest": { - "message": "O mais rápido" - }, "feeAssociatedRequest": { "message": "Há uma taxa associada a essa solicitação." }, @@ -1312,7 +1412,7 @@ "message": "Taxa de gás" }, "gasLimit": { - "message": "Limite de Gas" + "message": "Limite de gás" }, "gasLimitInfoTooltipContent": { "message": "O limite de gás é o valor máximo das unidades de gás que você está disposto a gastar." @@ -1334,7 +1434,7 @@ "message": "Opção de gás" }, "gasPrice": { - "message": "Preço Gas (GWEI)" + "message": "Preço do gás (GWEI)" }, "gasPriceExcessive": { "message": "Sua taxa de gás está desnecessariamente alta. Considere reduzir o valor." @@ -1449,7 +1549,7 @@ "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hexData": { - "message": "Dados em hexa" + "message": "Dados em hexadecimais" }, "hide": { "message": "Ocultar" @@ -1464,7 +1564,7 @@ "message": "Ocultar token" }, "hideTokenPrompt": { - "message": "Ocultar Token?" + "message": "Ocultar token?" }, "hideTokenSymbol": { "message": "Ocultar $1", @@ -1497,7 +1597,7 @@ "description": "Button to import an account from a selected file" }, "importAccount": { - "message": "Importar Conta" + "message": "Importar conta" }, "importAccountError": { "message": "Erro de importação de conta." @@ -1526,6 +1626,12 @@ "importNFTs": { "message": "Importar NFTs" }, + "importSelectedTokens": { + "message": "Importar tokens selecionados?" + }, + "importSelectedTokensDescription": { + "message": "Somente os tokens que você selecionou serão exibidos em sua carteira. Você pode importar os tokens ocultos a qualquer momento pesquisando por eles." + }, "importTokenQuestion": { "message": "Importar token?" }, @@ -1552,6 +1658,9 @@ "message": "Importado", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "em suas Configurações" + }, "infuraBlockedNotification": { "message": "Não foi possível conectar a MetaMask com o servidor do blockchain. Revise possíveis motivos $1.", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "Sua transação inicial foi confirmada pela rede. Clique em OK para voltar." }, + "install": { + "message": "Instalar" + }, "insufficientBalance": { "message": "Saldo insuficiente." }, @@ -1592,7 +1704,7 @@ "message": "Esse ativo é um NFT e precisa ser adicionado novamente à página Importar NFT, encontrada na aba NFTs." }, "invalidBlockExplorerURL": { - "message": "Block Explorer URI Inválido" + "message": "URL inválido do explorador de blocos" }, "invalidChainIdTooBig": { "message": "ID de cadeia inválido. O ID de cadeia é muito grande." @@ -1654,26 +1766,20 @@ "message": "Ficheiro JSON", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "para manter o controle dos seus tokens e NFTs em diferentes contas e redes." + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Tutoriais)" - }, "knownAddressRecipient": { "message": "Endereço de contrato conhecido." }, "knownTokenWarning": { "message": "Essa ação editará os tokens já listados na sua carteira, que podem ser usado para praticar phishing contra você. Só aprove se você tiver certeza de que quer alterar o que esses tokens representam." }, - "kovan": { - "message": "Rede de Teste Kovan" - }, "lastConnected": { - "message": "Conectado pela última vez em" - }, - "learmMoreAboutGas": { - "message": "Quer $1 sobre o gás?" + "message": "Última conexão" }, "learnCancelSpeeedup": { "message": "Saiba como $1", @@ -1682,6 +1788,10 @@ "learnMore": { "message": "saiba mais" }, + "learnMoreAboutGas": { + "message": "Quer $1 sobre o gás?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Saiba mais" }, @@ -1764,7 +1874,7 @@ "message": "Carregando NFTs..." }, "loadingTokens": { - "message": "A carregar Tokens..." + "message": "Carregando tokens..." }, "localhost": { "message": "Host local 8545" @@ -1942,11 +2052,15 @@ "message": "Deve escolher no mínimo 1 token." }, "myAccounts": { - "message": "As minhas contas" + "message": "Minhas contas" }, "name": { "message": "Nome" }, + "nativeToken": { + "message": "O token nativo dessa rede é $1. Esse é o token usado para taxas de gás.", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "Para interagir com aplicativos descentralizados usando a MetaMask, você precisará de $1 em sua carteira.", "description": "$1 represents the cypto symbol to be purchased" @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "rede" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -2033,8 +2150,11 @@ "nevermind": { "message": "Desistir" }, + "new": { + "message": "Novo!" + }, "newAccount": { - "message": "Conta Nova" + "message": "Nova conta" }, "newAccountDetectedDialogMessage": { "message": "Novo endereço detectado! Clique aqui para adicionar à sua agenda de endereços." @@ -2050,7 +2170,7 @@ "message": "Novo contato" }, "newContract": { - "message": "Contrato Novo" + "message": "Novo contrato" }, "newNFTDetectedMessage": { "message": "Permita que a MetaMask detecte automaticamente os NFTs do Opensea e mostre-os em sua carteira." @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "Token importado" }, - "newTotal": { - "message": "Novo total" - }, - "newTransactionFee": { - "message": "Nova taxa de transação" - }, "newValues": { "message": "novos valores" }, @@ -2163,7 +2277,7 @@ "message": "Notificações" }, "notifications10ActionText": { - "message": "Veja em configurações", + "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." }, "notifications10DescriptionOne": { @@ -2188,7 +2302,7 @@ "message": "Ativar o modo escuro" }, "notifications12Description": { - "message": "O modo escuro na extensão finalmente chegou! Para ativá-lo, acesse Configurações -> Experimental e selecione uma das opções de exibição: claro, escuro, sistema." + "message": "O modo Escuro na extensão finalmente chegou! Para ativá-lo, acesse Configurações -> Experimentais e selecione uma das opções de exibição: Claro, Escuro, Sistema." }, "notifications12Title": { "message": "Modo escuro quando? Modo escuro agora! 🕶️🦊" @@ -2197,12 +2311,29 @@ "message": "Exibir lista de redes personalizadas" }, "notifications13Description": { - "message": "Agora você pode adicionar facilmente as seguintes redes personalizadas que são populares: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm e Polygon. Para ativar esse recurso, acesse Configurações -> Experimentais e ative \"Exibir lista de redes personalizadas\".", + "message": "Agora você pode adicionar facilmente as seguintes redes personalizadas populares: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm e Polygon. Para ativar esse recurso, acesse Configurações -> Experimentais e ative \"Exibir lista de redes personalizadas\"!", "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." }, "notifications13Title": { "message": "Adicionar redes populares" }, + "notifications14ActionText": { + "message": "Mostrar configurações de backup" + }, + "notifications14Description": { + "message": "Nosso recurso de dados 3Box será descontinuado no início de outubro. Para fazer backup e restaurar sua carteira manualmente, use o botão \"Fazer backup agora\" nas Configurações Avançadas.", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "Descontinuidade do 3Box" + }, + "notifications15Description": { + "message": "Você não precisa realizar nenhuma ação, continue usando sua carteira normalmente. Esteja atento a potenciais golpes envolvendo a fusão (Merge).", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "A fusão do Ethereum chegou!" + }, "notifications1Description": { "message": "Usuários da MetaMask Mobile agora podem trocar tokens dentro de sua carteira mobile. Leia o QR code para obter o aplicativo para dispositivos móveis e comece a trocar.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2268,7 +2399,7 @@ "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, "notifications8ActionText": { - "message": "Ir para Configurações Avançadas", + "message": "Ir para Configurações > Avançadas", "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": { @@ -2276,7 +2407,7 @@ "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": { - "message": "Para uma experiência mais fácil e estável com o ledger, vá até a aba Avançado das configurações e troque o \"Tipo de conexão preferencial com o Ledger\" para \"WebHID\".", + "message": "Para uma experiência mais fácil e estável com o ledger, vá até a aba Configurações > Avançadas e troque o \"Tipo de conexão preferencial com o Ledger\" para \"WebHID\".", "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." }, "notifications8Title": { @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "Marcar todas como lidas" }, + "numberOfNewTokensDetectedPlural": { + "message": "$1 novos tokens encontrados nesta conta", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "1 novo token encontrado nesta conta" + }, "ofTextNofM": { "message": "de" }, @@ -2384,6 +2522,9 @@ "message": "Abra a MetaMask em tela cheia para conectar sua ledger por meio do WebHID.", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "Abrir no explorador de blocos" + }, "optional": { "message": "Opcional" }, @@ -2456,6 +2597,12 @@ "permissionRequestCapitalized": { "message": "Solicitação de permissão" }, + "permissionRequested": { + "message": "Solicitada agora" + }, + "permissionRevoked": { + "message": "Revogada nesta atualização" + }, "permission_accessNetwork": { "message": "Acesse a internet.", "description": "The description of the `endowment:network-access` permission." @@ -2476,9 +2623,13 @@ "message": "Executar indefinidamente.", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "Controle suas contas e ativos em $1 ($2).", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "Controlar suas contas e ativos do \"$1\".", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "Armazenar e gerenciar dados pertinentes em seu dispositivo.", @@ -2488,10 +2639,18 @@ "message": "Mostrar notificações.", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "Busque e exiba insights de transações.", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "Permissão desconhecida: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "Ver sua chave pública para $1 ($2).", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "Permissões" }, @@ -2508,6 +2667,9 @@ "popularCustomNetworks": { "message": "Redes personalizadas populares" }, + "portfolioSite": { + "message": "Site do portfólio" + }, "preferredLedgerConnectionType": { "message": "Tipo de conexão preferencial com o Ledger", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" @@ -2541,7 +2703,7 @@ "message": "Atenção: Nunca revele esta chave. Qualquer pessoa com acesso à sua chave privada pode roubar os bens que esta contém." }, "privateNetwork": { - "message": "Rede Privada" + "message": "Rede privada" }, "proceedWithTransaction": { "message": "Quero prosseguir mesmo assim" @@ -2665,7 +2827,7 @@ "message": "Redefinir" }, "resetAccount": { - "message": "Reinicializar Conta" + "message": "Redefinir conta" }, "resetAccountDescription": { "message": "A redefinição da sua conta limpará o histórico de transações. Isso não alterará os saldos nas suas contas nem exigirá a reintrodução da Frase de Recuperação Secreta." @@ -2688,9 +2850,17 @@ "restore": { "message": "Restaurar" }, - "restoreWalletPreferences": { - "message": "Encontramos um backup dos seus dados de $1. Gostaria de restaurar as preferências da sua carteira?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "Não foi possível restaurar seus dados a partir do arquivo fornecido" + }, + "restoreSuccessful": { + "message": "Seus dados foram restaurados com sucesso" + }, + "restoreUserData": { + "message": "Restaurar dados do usuário" + }, + "restoreUserDataDescription": { + "message": "Você pode restaurar as configurações do usuário contendo preferências e endereços de contas a partir de um arquivo de backup JSON." }, "retryTransaction": { "message": "Tentar transação novamente" @@ -2721,11 +2891,8 @@ "message": "Ao revogar a permissão, o $1 a seguir não terá mais acesso ao seu $2", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Rede de Teste Rinkeby" - }, - "ropsten": { - "message": "Rede de Teste Ropsten" + "revokeSpendingCapTooltipText": { + "message": "Este contrato não poderá gastar mais nenhum de seus tokens atuais ou futuros." }, "rpcUrl": { "message": "Novo URL da RPC" @@ -2743,7 +2910,7 @@ "message": "Posicione o QR code na frente da sua câmera" }, "scanQrCode": { - "message": "Escaneie o QR code" + "message": "Escanear código QR" }, "scrollDown": { "message": "Role para baixo" @@ -2758,10 +2925,10 @@ "message": "Resultados da busca" }, "searchSettings": { - "message": "Pesquisar nas configurações" + "message": "Buscar nas configurações" }, "searchTokens": { - "message": "Pesquisar tokens" + "message": "Buscar tokens" }, "secretBackupPhraseDescription": { "message": "Sua Frase de Recuperação Secreta facilita o backup e a restauração da sua conta." @@ -2838,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "Anote sua Frase Secreta de Recuperação" }, - "selectAHigherGasFee": { - "message": "Selecione uma taxa de gás mais alta para acelerar o processamento da sua transação.*" - }, "selectAccounts": { "message": "Selecione a(s) conta(s) para usar nesse site" }, @@ -2874,9 +3038,6 @@ "send": { "message": "Enviar" }, - "sendAmount": { - "message": "Enviar valor" - }, "sendBugReport": { "message": "Envie-nos um relatório de erros." }, @@ -2888,7 +3049,7 @@ "message": "Enviar para" }, "sendTokens": { - "message": "Enviar Tokens" + "message": "Enviar tokens" }, "sendingDisabled": { "message": "O envio de ativos NFT ERC-1155 ainda não é aceito." @@ -2901,6 +3062,9 @@ "message": "Aviso: você está prestes a enviar a um contrato de token que pode resultar em perda de fundos. $1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "Rede de teste Sepolia" + }, "setAdvancedPrivacySettings": { "message": "Definir configurações avançadas de privacidade" }, @@ -2933,12 +3097,6 @@ "showAdvancedGasInlineDescription": { "message": "Selecione isso para mostrar o preço do gás e limitar os controles diretamente nas telas de envio e de confirmação." }, - "showCustomNetworkList": { - "message": "Exibir lista de redes personalizadas" - }, - "showCustomNetworkListDescription": { - "message": "Selecione esta opção para exibir uma lista de redes com as informações pré-preenchidas ao adicionar uma nova rede." - }, "showFiatConversionInTestnets": { "message": "Mostrar conversão nas redes de teste" }, @@ -2946,7 +3104,7 @@ "message": "Selecione essa opção para mostrar a conversão de moeda fiduciária nas redes de teste" }, "showHexData": { - "message": "Exibir dados em hexa" + "message": "Exibir dados em hexadecimais" }, "showHexDataDescription": { "message": "Selecione essa opção para mostrar o campo de dados hexadecimais na tela de envio" @@ -2976,7 +3134,7 @@ "message": "Selecione essa opção para mostrar redes de teste na lista de redes" }, "sigRequest": { - "message": "Pedido de Assinatura" + "message": "Pedido de assinatura" }, "sign": { "message": "Assinar" @@ -2985,7 +3143,7 @@ "message": "Assinar esta mensagem pode ter \nefeitos laterais perigosos. Apenas assine mensagens de sites que \ntotalmente confia com a sua conta total.\n Este método perigoso será removido numa versão posterior." }, "signatureRequest": { - "message": "Pedido de Assinatura" + "message": "Pedido de assinatura" }, "signatureRequest1": { "message": "Mensagem" @@ -2993,6 +3151,9 @@ "signed": { "message": "Assinado" }, + "signin": { + "message": "Entrar" + }, "simulationErrorMessageV2": { "message": "Não conseguimos estimar o preço do gás. Pode haver um erro no contrato, e essa transação poderá falhar." }, @@ -3005,9 +3166,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." }, - "slow": { - "message": "Lento" - }, "smartTransaction": { "message": "Transação inteligente" }, @@ -3019,6 +3177,10 @@ "message": "Adicionado em $1 a partir de $2", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "Erro no snap: '$1'. Código de erro: '$2'", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -3027,14 +3189,34 @@ "message": "Instalar snap" }, "snapInstallWarningCheck": { - "message": "Para confirmar que você entende, marque todas." + "message": "Para confirmar que você entende, marque a caixa." + }, + "snapInstallWarningCheckPlural": { + "message": "Para confirmar que você entende, marque todas as caixas." + }, + "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.", + "description": "The first parameter is the name of the snap and the second one is the protocol" }, "snapRequestsPermission": { "message": "Esse snap está solicitando as seguintes permissões:" }, + "snapUpdate": { + "message": "Atualizar snap" + }, + "snapUpdateExplanation": { + "message": "$1 precisa de uma versão mais nova do seu snap.", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "Snaps" }, + "snapsInsightLoading": { + "message": "Carregando insight da transação..." + }, + "snapsNoInsight": { + "message": "O snap não retornou nenhum insight" + }, "snapsSettingsDescription": { "message": "Gerencie seus snaps" }, @@ -3127,7 +3309,7 @@ "message": "Registros de estado da MetaMask" }, "stateLogs": { - "message": "Registos de Estado" + "message": "Registros de estado" }, "stateLogsDescription": { "message": "Registo de estado podem conter o seu endereço e transações enviadas da sua conta pública." @@ -3197,7 +3379,7 @@ "message": "A swap teria falhado" }, "stxCancelledDescription": { - "message": "Sua transação teria falhado e foi cancelada para protegê-lo de pagar taxas de gás desnecessárias." + "message": "Sua transação teria falhado e foi cancelada para protegê-lo contra o pagamento de taxas de gás desnecessárias." }, "stxCancelledSubDescription": { "message": "Tente fazer sua swap novamente. Estaremos aqui para te proteger contra riscos semelhantes no futuro." @@ -3281,7 +3463,7 @@ "message": "Suporte" }, "supportCenter": { - "message": "Visitar o nosso Centro de Suporte" + "message": "Visite a nossa central de suporte" }, "swap": { "message": "Swap" @@ -3477,7 +3659,10 @@ "message": "Solicitação de cotação" }, "swapReviewSwap": { - "message": "Revisar troca" + "message": "Revisar swap" + }, + "swapSearchNameOrAddress": { + "message": "Pesquise o nome ou cole o endereço" }, "swapSelect": { "message": "Selecione" @@ -3498,6 +3683,9 @@ "message": "$1%", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "Chamamos de \"slippage\" quando o preço muda entre o momento de realização da ordem e sua confirmação. Seu swap será cancelado automaticamente se o slippage exceder sua configuração de \"tolerância a slippage\"." + }, "swapSource": { "message": "Fonte de liquidez" }, @@ -3598,7 +3786,7 @@ "message": "Trocar de rede" }, "switchNetworks": { - "message": "Trocar redes" + "message": "Trocar de rede" }, "switchToNetwork": { "message": "Trocar para $1", @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "Trocar para esta conta" }, + "switchedTo": { + "message": "Você mudou para" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "A troca de redes cancelará todas as confirmações pendentes" }, @@ -3643,15 +3834,6 @@ "syncWithMobileTitle": { "message": "Sincronizar com dispositivo móvel" }, - "syncWithThreeBox": { - "message": "Sincronizar dados com 3Box (experimental)" - }, - "syncWithThreeBoxDescription": { - "message": "Ative para fazer backup das suas configurações com o 3Box. Esse recurso é experimental; use por sua conta e risco." - }, - "syncWithThreeBoxDisabled": { - "message": "O 3Box foi desabilitado por conta de um erro durante a sincronização inicial" - }, "tenPercentIncreased": { "message": "10% de aumento" }, @@ -3662,7 +3844,7 @@ "message": "Termos de Serviço" }, "testFaucet": { - "message": "Faucet de Teste" + "message": "Faucet de teste" }, "testNetworks": { "message": "Redes de teste" @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "Escolha o seu tema preferido para a MetaMask." }, + "thingsToKeep": { + "message": "Informações importantes:" + }, "thisWillCreate": { "message": "Isso criará uma nova carteira e Frase de Recuperação Secreta" }, @@ -3709,19 +3894,28 @@ "message": "A casa decimal do token é necessária." }, "tokenDecimalTitle": { - "message": "Precisão em Decimais:" + "message": "Decimal do token:" }, "tokenDetails": { "message": "Dados do token" }, + "tokenFoundTitle": { + "message": "1 novo token encontrado" + }, "tokenId": { "message": "ID do token" }, "tokenList": { "message": "Listas de tokens:" }, + "tokenScamSecurityRisk": { + "message": "golpes e riscos de segurança envolvendo tokens" + }, + "tokenShowUp": { + "message": "Seus tokens podem não aparecer automaticamente em sua carteira." + }, "tokenSymbol": { - "message": "Símbolo do Token" + "message": "Símbolo do token" }, "tokensFoundTitle": { "message": "$1 novos tokens encontrados", @@ -3861,6 +4055,9 @@ "tryAgain": { "message": "Tente novamente" }, + "tryOur": { + "message": "Experimente nosso" + }, "turnOnTokenDetection": { "message": "Ativar detecção avançada de token" }, @@ -3899,7 +4096,7 @@ "message": "Coleção sem nome" }, "unknownNetwork": { - "message": "Rede Privada Desconhecida" + "message": "Rede privada desconhecida" }, "unknownQrCode": { "message": "Erro: não conseguimos identificar esse QR code" @@ -3914,9 +4111,13 @@ "message": "A web descentralizada te aguarda" }, "unrecognizedChain": { - "message": "Essa rede personalizada não foi reconhecida. Recomendamos que você $1 antes de continuar", + "message": "Essa rede personalizada não foi reconhecida", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (protocolo não reconhecido)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "O envio de tokens colecionáveis (ERC-721) não é suportado no momento", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -3970,7 +4171,7 @@ "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" }, "viewAccount": { - "message": "Ver Conta" + "message": "Ver conta" }, "viewAllDetails": { "message": "Ver todos os detalhes" @@ -3999,7 +4200,7 @@ "message": "Ver no Opensea" }, "viewinExplorer": { - "message": "Ver $1 no Explorer", + "message": "Ver $1 no explorador", "description": "$1 is the action type. e.g (Account, Transaction, Swap)" }, "visitWebSite": { @@ -4034,6 +4235,10 @@ "warning": { "message": "Atenção" }, + "warningTooltipText": { + "message": "$1 O contrato pode gastar todo o seu saldo de tokens sem aviso ou consentimento. Proteja-se personalizando um limite de gastos menor.", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "Fraca" }, diff --git a/app/_locales/pt_BR/messages.json b/app/_locales/pt_BR/messages.json index 36ab85551023..0f4b63ef33cb 100644 --- a/app/_locales/pt_BR/messages.json +++ b/app/_locales/pt_BR/messages.json @@ -47,9 +47,6 @@ "about": { "message": "Sobre" }, - "acceleratingATransaction": { - "message": "* Acelerar uma transação usando um preço de gás mais alto aumenta as chances de agilizar o processamento pela rede, mas isso nem sempre é garantido." - }, "acceptTermsOfUse": { "message": "Eu li e concordo com os $1", "description": "$1 is the `terms` message" @@ -514,18 +511,9 @@ "connectingToGoerli": { "message": "Conectando à rede de testes Goerli" }, - "connectingToKovan": { - "message": "Conectando à rede de testes Kovan" - }, "connectingToMainnet": { "message": "Conectando à mainnet do Ethereum" }, - "connectingToRinkeby": { - "message": "Conectando à rede de testes Rinkeby" - }, - "connectingToRopsten": { - "message": "Conectando à rede de testes Ropsten" - }, "contactUs": { "message": "Fale conosco" }, @@ -616,12 +604,6 @@ "custom": { "message": "Avançado" }, - "customGas": { - "message": "Personalizar gás" - }, - "customGasSubTitle": { - "message": "Aumentar a taxa pode diminuir o tempo de processamento, mas isso não é garantido." - }, "customSpendLimit": { "message": "Limite de gastos personalizado" }, @@ -645,9 +627,6 @@ "data": { "message": "Dados" }, - "dataBackupFoundInfo": { - "message": "Foi feito o backup de alguns dos dados da sua conta durante uma instalação anterior da MetaMask. Isso pode incluir configurações, contatos e tokens. Gostaria de restaurar esses dados agora?" - }, "dataHex": { "message": "Hex" }, @@ -992,9 +971,6 @@ "message": "Lista:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Tempos de processamento estimados" - }, "ethGasPriceFetchWarning": { "message": "O preço de backup do gás é fornecido porque a estimativa de gás principal está indisponível no momento." }, @@ -1034,9 +1010,6 @@ "fast": { "message": "Rápido" }, - "fastest": { - "message": "O mais rápido" - }, "feeAssociatedRequest": { "message": "Há uma taxa associada a essa solicitação." }, @@ -1400,24 +1373,15 @@ "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Tutoriais)" - }, "knownAddressRecipient": { "message": "Endereço de contrato conhecido." }, "knownTokenWarning": { "message": "Essa ação editará os tokens já listados na sua carteira, que podem ser usado para praticar phishing contra você. Só aprove se você tiver certeza de que quer alterar o que esses tokens representam." }, - "kovan": { - "message": "Rede de testes Kovan" - }, "lastConnected": { "message": "Conectado pela última vez em" }, - "learmMoreAboutGas": { - "message": "Quer $1 sobre o gás?" - }, "learnCancelSpeeedup": { "message": "Saiba como $1", "description": "$1 is link to cancel or speed up transactions" @@ -1425,6 +1389,10 @@ "learnMore": { "message": "mais informações" }, + "learnMoreAboutGas": { + "message": "Quer $1 sobre o gás?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Mais informações" }, @@ -1750,12 +1718,6 @@ "newToMetaMask": { "message": "Acabou de chegar à MetaMask?" }, - "newTotal": { - "message": "Novo total" - }, - "newTransactionFee": { - "message": "Nova taxa de transação" - }, "newValues": { "message": "novos valores" }, @@ -2207,10 +2169,6 @@ "restore": { "message": "Restaurar" }, - "restoreWalletPreferences": { - "message": "Encontramos um backup dos seus dados de $1. Gostaria de restaurar as preferências da sua carteira?", - "description": "$1 is the date at which the data was backed up" - }, "retryTransaction": { "message": "Tentar transação novamente" }, @@ -2229,12 +2187,6 @@ "revealSeedWordsWarningTitle": { "message": "NÃO compartilhe essa frase com ninguém!" }, - "rinkeby": { - "message": "Rede de testes Rinkeby" - }, - "ropsten": { - "message": "Rede de testes Ropsten" - }, "rpcUrl": { "message": "Novo URL da RPC" }, @@ -2340,9 +2292,6 @@ "seedPhraseWriteDownHeader": { "message": "Anote sua Frase de Recuperação Secreta" }, - "selectAHigherGasFee": { - "message": "Selecione uma taxa de gás mais alta para acelerar o processamento da sua transação.*" - }, "selectAccounts": { "message": "Selecione a(s) conta(s) para usar nesse site" }, @@ -2376,9 +2325,6 @@ "send": { "message": "Enviar" }, - "sendAmount": { - "message": "Enviar valor" - }, "sendSpecifiedTokens": { "message": "Enviar $1", "description": "Symbol of the specified token" @@ -2480,9 +2426,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." }, - "slow": { - "message": "Lento" - }, "somethingWentWrong": { "message": "Opa! Ocorreu algum erro." }, @@ -2937,15 +2880,6 @@ "syncWithMobileTitle": { "message": "Sincronizar com dispositivo móvel" }, - "syncWithThreeBox": { - "message": "Sincronizar dados com 3Box (experimental)" - }, - "syncWithThreeBoxDescription": { - "message": "Ative para fazer backup das suas configurações com o 3Box. Esse recurso é experimental; use por sua conta e risco." - }, - "syncWithThreeBoxDisabled": { - "message": "O 3Box foi desabilitado por conta de um erro durante a sincronização inicial" - }, "tenPercentIncreased": { "message": "10% de aumento" }, diff --git a/app/_locales/pt_PT/messages.json b/app/_locales/pt_PT/messages.json index 6de623b52802..f3000444f0ea 100644 --- a/app/_locales/pt_PT/messages.json +++ b/app/_locales/pt_PT/messages.json @@ -149,9 +149,6 @@ "settings": { "message": "Definições" }, - "slow": { - "message": "Lento" - }, "tips": { "message": "Doações" }, diff --git a/app/_locales/ro/messages.json b/app/_locales/ro/messages.json index 002236935c12..cfe91a3529e0 100644 --- a/app/_locales/ro/messages.json +++ b/app/_locales/ro/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Despre" }, - "acceleratingATransaction": { - "message": "* Accelerarea unei tranzacții folosind un preț în gas mai mare îi crește șansele de a fi procesată mai rapid de rețea, însă acest lucru nu este garantat întotdeauna." - }, "accessingYourCamera": { "message": "Se accesează camera dvs..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Se conectează la rețeaua de test Goerli" }, - "connectingToKovan": { - "message": "Se conectează la rețeaua de test Kovan" - }, "connectingToMainnet": { "message": "Se conectează la rețeaua Ethereum principală" }, - "connectingToRinkeby": { - "message": "Se conectează la Rețeaua de test Rinkeby" - }, - "connectingToRopsten": { - "message": "Se conectează la rețeaua de test Ropsten" - }, "continueToWyre": { "message": "Continuați la Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "Avansate" }, - "customGas": { - "message": "Particularizați Gas" - }, - "customGasSubTitle": { - "message": "Creșterea taxei poate reduce timpii de procesare, dar acest lucru nu este garantat." - }, "customToken": { "message": "Token personalizat" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "Introduceți parola pentru a continua" }, - "estimatedProcessingTimes": { - "message": "Timpi estimativi de procesare" - }, "ethereumPublicAddress": { "message": "Adresa publică Ethereum" }, @@ -493,9 +472,6 @@ "knownAddressRecipient": { "message": "Adresa cunoscută din contract." }, - "kovan": { - "message": "Rețea de test Kovan" - }, "learnMore": { "message": "Aflați mai multe" }, @@ -591,12 +567,6 @@ "newToMetaMask": { "message": "Nefamiliarizat cu MetaMask?" }, - "newTotal": { - "message": "Total nou" - }, - "newTransactionFee": { - "message": "Taxă nouă de tranzacție" - }, "next": { "message": "Înainte" }, @@ -755,12 +725,6 @@ "revealSeedWordsWarningTitle": { "message": "NU împărtășiți această expresie nimănui!" }, - "rinkeby": { - "message": "Rețea test Rinkeby" - }, - "ropsten": { - "message": "Rețea de testare Ropsten" - }, "rpcUrl": { "message": "URL RPC nou" }, @@ -797,9 +761,6 @@ "seedPhraseReq": { "message": "Expresiile seed sunt lungi de 12 cuvinte" }, - "selectAHigherGasFee": { - "message": "Selectați o taxă gas mai mare pentru a accelera procesarea tranzacției.*" - }, "selectAnAccount": { "message": "Selectați un cont" }, @@ -818,9 +779,6 @@ "send": { "message": "Trimite" }, - "sendAmount": { - "message": "Suma trimisă" - }, "sendTokens": { "message": "Trimiteți indicative" }, @@ -863,9 +821,6 @@ "signed": { "message": "Semnat" }, - "slow": { - "message": "Lent" - }, "somethingWentWrong": { "message": "Hopa! A apărut o eroare." }, diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index 7066fa236adc..b354c2f9b281 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -44,12 +44,59 @@ "QRHardwareWalletSteps2Description": { "message": "AirGap Vault и Ngrave (скоро появятся)" }, + "SIWEAddressInvalid": { + "message": "Адрес в запросе на вход не соответствует адресу счета, который вы используете для входа." + }, + "SIWEDomainWarningBody": { + "message": "Веб-сайт ($1) просит вас войти в неправильный домен. Это может быть фишинговая атака.", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "Ид. блокчейна:" + }, + "SIWELabelExpirationTime": { + "message": "Истекает в:" + }, + "SIWELabelIssuedAt": { + "message": "Выпущено в:" + }, + "SIWELabelMessage": { + "message": "Сообщение:" + }, + "SIWELabelNonce": { + "message": "Одноразовый код:" + }, + "SIWELabelNotBefore": { + "message": "Не раньше:" + }, + "SIWELabelRequestID": { + "message": "Ид. запроса:" + }, + "SIWELabelResources": { + "message": "Ресурсы: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "Версии:" + }, + "SIWESiteRequestSubtitle": { + "message": "Этот сайт запрашивает вход с помощью" + }, + "SIWESiteRequestTitle": { + "message": "Запрос на вход" + }, + "SIWEWarningSubtitle": { + "message": "Отметьте, чтобы подтвердить понимание:" + }, + "SIWEWarningTitle": { + "message": "Вы уверены?" + }, "about": { "message": "Общие сведения" }, - "acceleratingATransaction": { - "message": "* Ускорение транзакции за счет более высокой цены газа увеличивает шансы транзакции на более быструю обработку в сети, но это не всегда гарантируется." - }, "acceptTermsOfUse": { "message": "Я прочитал(-а) $1 и согласен(-на) с ними", "description": "$1 is the `terms` message" @@ -121,6 +168,9 @@ "addAlias": { "message": "Добавить псевдоним" }, + "addBlockExplorer": { + "message": "Добавить обозреватель блоков" + }, "addContact": { "message": "Добавить контакт" }, @@ -209,9 +259,6 @@ "airgapVault": { "message": "Хранилище AirGap" }, - "airgapVaultTutorial": { - "message": "(Руководства)" - }, "alertDisableTooltip": { "message": "Это можно изменить в разделе «Настройки» > «Предупреждения»" }, @@ -271,12 +318,15 @@ "message": "Одобрить лимит расходов" }, "approveAllTokensTitle": { - "message": "Разрешить доступ к всем вашим $1?", + "message": "Разрешить доступ ко всем вашим $1?", "description": "$1 is the symbol of the token for which the user is granting approval" }, "approveAndInstall": { "message": "Одобрить и установить" }, + "approveAndUpdate": { + "message": "Утвердить и обновить" + }, "approveButtonText": { "message": "Одобрить" }, @@ -293,6 +343,10 @@ "approvedAsset": { "message": "Одобренный актив" }, + "approvedOn": { + "message": "Утверждено $1", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "Вы уверены?" }, @@ -305,6 +359,9 @@ "assets": { "message": "Активы" }, + "attemptSendingAssets": { + "message": "Попытка отправки активов напрямую из одной сети в другую может привести к необратимой потере активов. Следует использовать мост." + }, "attemptToCancel": { "message": "Пытаетесь отменить?" }, @@ -335,6 +392,9 @@ "backToAll": { "message": "Назад ко всем" }, + "backup": { + "message": "Резервное копирование" + }, "backupApprovalInfo": { "message": "Этот секретный код необходим для восстановления вашего кошелька в случае, если вы потеряете свое устройство, забудете пароль, вам придется переустановить MetaMask или захотите получить доступ к своему кошельку на другом устройстве." }, @@ -344,6 +404,12 @@ "backupNow": { "message": "Сделать резервную копию сейчас" }, + "backupUserData": { + "message": "Сделайте резервную копию ваших данных" + }, + "backupUserDataDescription": { + "message": "Вы можете сделать резервную копию пользовательских настроек, содержащих настройки и адреса аккаунтов, в файл JSON." + }, "balance": { "message": "Баланс" }, @@ -356,6 +422,9 @@ "basic": { "message": "Базовый" }, + "beCareful": { + "message": "Будьте осторожны" + }, "betaMetamaskDescription": { "message": "MetaMask, которому доверяют миллионы, — это безопасный кошелек, предоставляющий всем доступ к миру web3." }, @@ -372,6 +441,9 @@ "betaMetamaskVersion": { "message": "Бета-версия MetaMask" }, + "betaPortfolioSite": { + "message": "бета-версия сайта портфолио" + }, "betaWelcome": { "message": "Добро пожаловать в бета-версию MetaMask" }, @@ -507,6 +579,9 @@ "message": "Нажмите здесь, чтобы подключить свой леджер через WebHID", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "Нажмите здесь, чтобы вручную добавить токены." + }, "clickToRevealSeed": { "message": "Нажмите здесь для показа секретных слов" }, @@ -523,6 +598,16 @@ "confirm": { "message": "Подтвердить" }, + "confirmPageDialogSetApprovalForAll": { + "message": "Вы предоставляете доступ к $1, включая все, что может принадлежать вам в будущем. Сторона на другом конце может перевести NFT с вашего кошелька в любое время, не спрашивая вас, пока вы не отзовете это одобрение. $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "все NFT по этому контракту" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "Действуйте с осторожностью." + }, "confirmPassword": { "message": "Подтвердить пароль" }, @@ -616,17 +701,11 @@ "connectingToGoerli": { "message": "Подключение к тестовой сети Goerli..." }, - "connectingToKovan": { - "message": "Подключение к тестовой сети Kovan..." - }, "connectingToMainnet": { "message": "Подключение к сети Ethereum Mainnet..." }, - "connectingToRinkeby": { - "message": "Подключение к тестовой сети Rinkeby..." - }, - "connectingToRopsten": { - "message": "Подключение к тестовой сети Ropsten..." + "connectingToSepolia": { + "message": "Подключение к тестовой сети Sepolia..." }, "contactUs": { "message": "Свяжитесь с нами" @@ -661,9 +740,21 @@ "contractDeployment": { "message": "Развертывание контракта" }, + "contractDescription": { + "message": "Чтобы защитить себя от мошенников, найдите минутку, чтобы внимательно ознакомиться с контрактом." + }, "contractInteraction": { "message": "Взаимодействие по контракту" }, + "contractRequestingSpendingCap": { + "message": "Контракт, требующий ограничения расходов" + }, + "contractTitle": { + "message": "Сведения о контракте" + }, + "contractToken": { + "message": "Контракт на токен" + }, "convertTokenToNFTDescription": { "message": "Мы обнаружили, что этот актив является NFT. MetaMask теперь имеет полную встроенную поддержку NFT. Хотите удалить его из списка токенов и добавить в качестве NFT?" }, @@ -742,19 +833,16 @@ "customContentSearch": { "message": "Поиск ранее добавленной сети" }, - "customGas": { - "message": "Настроить газ" - }, "customGasSettingToolTipMessage": { "message": "Использовать $1, чтобы настроить цену на газ. Это может сбивать с толку, если вы не знакомы с этим. Взаимодействуйте на свой страх и риск.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "Увеличение комиссии может сократить время обработки, но это не гарантируется." - }, "customSpendLimit": { "message": "Пользовательский лимит расходов" }, + "customSpendingCap": { + "message": "Пользовательское ограничение расходов" + }, "customToken": { "message": "Пользовательский токен" }, @@ -764,6 +852,9 @@ "customTokenWarningInTokenDetectionNetwork": { "message": "Прежде чем импортировать токен вручную, убедитесь, что вы ему доверяете. Подробнее о $1" }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "Перед импортом убедитесь, что вы доверяете токену. Узнайте, как избежать $1. Вы также можете включить обнаружение токена $2." + }, "customerSupport": { "message": "поддержка клиентов" }, @@ -787,8 +878,8 @@ "data": { "message": "Данные" }, - "dataBackupFoundInfo": { - "message": "Некоторые данные вашего счета были скопированы во время предыдущей установки MetaMask. Они могли включать ваши настройки, контакты и токены. Хотите восстановить эти данные сейчас?" + "dataBackupSeemsCorrupt": { + "message": "Не удается восстановить ваши данные. Файл, по-видимому, поврежден." }, "dataHex": { "message": "Шестнадцатиричные" @@ -835,6 +926,12 @@ "message": "Внесите $1", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "Подробнее" + }, + "deprecatedTestNetworksMsg": { + "message": "Из-за изменений протокола Ethereum: тестовые сети Rinkeby, Ropsten, Kovan могут работать не очень надежно и скоро будут признаны устаревшими." + }, "description": { "message": "Описание" }, @@ -1110,6 +1207,15 @@ "message": "Конечная точка вернула другой идентификатор цепочки: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "Улучшенное обнаружение токена" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "Улучшенное обнаружение токенов в настоящее время доступно на $1. $2" + }, + "enhancedTokenDetectionDescription": { + "message": "API токенов ConsenSys объединяет список токенов из различных сторонних списков токенов. При включении токены будут автоматически обнаруживаться и станут доступны для поиска в основной сети Ethereum, Binance, Polygon и Avalanche. При выключении автоматическое обнаружение и поиск могут выполняться только в основной сети Ethereum." + }, "ensIllegalCharacter": { "message": "Недопустимый символ для ENS." }, @@ -1166,9 +1272,6 @@ "message": "Стек:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Примерное время обработки" - }, "ethGasPriceFetchWarning": { "message": "Указана резервная цена газа, поскольку основной сервис определения цены газа сейчас недоступен." }, @@ -1214,9 +1317,6 @@ "fast": { "message": "Быстрый" }, - "fastest": { - "message": "Самый быстрый" - }, "feeAssociatedRequest": { "message": "За выполнение этого запроса взимается комиссия." }, @@ -1391,7 +1491,7 @@ "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" }, "gdprMessagePrivacyPolicy": { - "message": "Политике конфиденциальности здесь", + "message": "Политикой конфиденциальности здесь", "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" }, "general": { @@ -1526,6 +1626,12 @@ "importNFTs": { "message": "Импорт NFT" }, + "importSelectedTokens": { + "message": "Импортировать выбранные токены?" + }, + "importSelectedTokensDescription": { + "message": "В вашем кошельке появятся только те токены, которые вы выбрали. Вы всегда можете импортировать скрытые токены позже, выполнив их поиск." + }, "importTokenQuestion": { "message": "Импортировать токен?" }, @@ -1552,6 +1658,9 @@ "message": "Импортирован", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "в ваших Настройках" + }, "infuraBlockedNotification": { "message": "MetaMask не удалось подключиться к хосту блокчейна. Узнать возможные причины можно $1.", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "Ваша первоначальная транзакция подтверждена сетью. Нажмите ОК, чтобы вернуться." }, + "install": { + "message": "Установите," + }, "insufficientBalance": { "message": "Недостаточный баланс." }, @@ -1654,27 +1766,21 @@ "message": "Файл JSON", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "чтобы следить за вашими токенами и NFT на разных счетах и в разных сетях." + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Руководства)" - }, "knownAddressRecipient": { "message": "Известный адрес контракта." }, "knownTokenWarning": { "message": "Это действие изменит токены, уже указанные в вашем кошельке, которые можно использовать для фишинга. Утверждайте, только если вы уверены, что хотите изменить то, что представляют эти токены. Узнайте подробнее о $1" }, - "kovan": { - "message": "Тестовая сеть Kovan" - }, "lastConnected": { "message": "Последнее подключение" }, - "learmMoreAboutGas": { - "message": "Хотите $1 о газе?" - }, "learnCancelSpeeedup": { "message": "Узнайте, как $1", "description": "$1 is link to cancel or speed up transactions" @@ -1682,6 +1788,10 @@ "learnMore": { "message": "подробнее" }, + "learnMoreAboutGas": { + "message": "Хотите $1 о газе?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Подробнее" }, @@ -1947,6 +2057,10 @@ "name": { "message": "Имя" }, + "nativeToken": { + "message": "Нативный токен этой сети — $1. Этот токен используется для оплаты газа.", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "Для взаимодействия с децентрализованными приложениями с помощью MetaMask вам понадобится $1 в вашем кошельке.", "description": "$1 represents the cypto symbol to be purchased" @@ -1959,7 +2073,7 @@ "message": "Оставьте отзыв" }, "needHelpLinkText": { - "message": "службу поддержки MetaMask" + "message": "служба поддержки MetaMask" }, "needHelpSubmitTicket": { "message": "Отправить запрос о поддержке" @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -2033,6 +2150,9 @@ "nevermind": { "message": "Неважно" }, + "new": { + "message": "Новинка!" + }, "newAccount": { "message": "Новый счет" }, @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "Токен импортирован" }, - "newTotal": { - "message": "Новая общая сумма" - }, - "newTransactionFee": { - "message": "Новая комиссия за транзакцию" - }, "newValues": { "message": "новые значения" }, @@ -2203,6 +2317,23 @@ "notifications13Title": { "message": "Добавить популярные сети" }, + "notifications14ActionText": { + "message": "Показать настройки резервного копирования" + }, + "notifications14Description": { + "message": "В начале октября мы закрываем нашу функцию данных 3Box. Чтобы создать резервную копию и восстановить свой кошелек вручную, используйте кнопку «Создать резервную копию сейчас» в Дополнительных настройках.", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "Закрытие 3Box" + }, + "notifications15Description": { + "message": "От вас не требуется никаких действий, поэтому продолжайте пользоваться своим кошельком в обычном режиме. Будьте в курсе разных видов потенциального мошенничества, связанного с Merge.", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "Ethereum Merge уже досутпно!" + }, "notifications1Description": { "message": "Теперь пользователи MetaMask Mobile могут обменивать токены в своем мобильном кошельке. Отсканируйте QR-код, чтобы скачать мобильное приложение и начать обмен.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2268,7 +2399,7 @@ "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, "notifications8ActionText": { - "message": "Перейти в Дополнительные настройки", + "message": "Перейдите в «Настройки»> «Дополнительно».", "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": { @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "Отметить все как прочитанные" }, + "numberOfNewTokensDetectedPlural": { + "message": "$1 новых токена(-ов) найдены в этом счете", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "1 новый токен найден в этом счете" + }, "ofTextNofM": { "message": "из" }, @@ -2384,6 +2522,9 @@ "message": "Откройте MetaMask в полноэкранном режиме, чтобы подключить свой леджер через WebHID.", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "Открыть в проводнике блоков" + }, "optional": { "message": "Необязательно" }, @@ -2456,6 +2597,12 @@ "permissionRequestCapitalized": { "message": "Запрос разрешения" }, + "permissionRequested": { + "message": "Запрошено сейчас" + }, + "permissionRevoked": { + "message": "Отменено в этом обновлении" + }, "permission_accessNetwork": { "message": "Доступ в Интернет.", "description": "The description of the `endowment:network-access` permission." @@ -2476,9 +2623,13 @@ "message": "Выполнять бесконечно.", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "Контролируйте свои счета и активы в $1 ($2).", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "Контролируйте свои счета и активы «$1».", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "Храните и управляйте его данными на вашем устройстве.", @@ -2488,10 +2639,18 @@ "message": "Показать уведомления.", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "Получайте и отображайте подробную информацию о транзакциях.", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "Неизвестное разрешение: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "Просмотрите свой открытый ключ для $1 ($2).", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "Разрешения" }, @@ -2508,6 +2667,9 @@ "popularCustomNetworks": { "message": "Популярные пользовательские сети" }, + "portfolioSite": { + "message": "Сайт портфеля" + }, "preferredLedgerConnectionType": { "message": "Предпочтительный тип подключения к леджеру", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" @@ -2688,9 +2850,17 @@ "restore": { "message": "Восстановить" }, - "restoreWalletPreferences": { - "message": "Найдена резервная копия ваших данных из $1. Хотите восстановить настройки кошелька?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "Не удается восстановить ваши данные из предоставленного файла" + }, + "restoreSuccessful": { + "message": "Ваши данные успешно восстановлены" + }, + "restoreUserData": { + "message": "Восстановить пользовательские данные" + }, + "restoreUserDataDescription": { + "message": "Вы можете восстановить пользовательские настройки, содержащие настройки и адреса аккаунтов, из ранее сохраненного файла JSON." }, "retryTransaction": { "message": "Повторить транзакцию" @@ -2721,11 +2891,8 @@ "message": "При отмене разрешения следующий $1 больше не сможет получить доступ к вашему $2", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Тестовая сеть Rinkeby" - }, - "ropsten": { - "message": "Тестовая сеть Ropsten" + "revokeSpendingCapTooltipText": { + "message": "Этот контракт не позволит вам больше тратить ваши текущие или будущие токены." }, "rpcUrl": { "message": "Новый URL-адрес RPC" @@ -2838,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "Запишите секретную фразу для восстановления" }, - "selectAHigherGasFee": { - "message": "Выберите более высокую плату за газ, чтобы ускорить обработку транзакции.*" - }, "selectAccounts": { "message": "Выберите счета(-а) для использования на этом сайте" }, @@ -2874,9 +3038,6 @@ "send": { "message": "Отправить" }, - "sendAmount": { - "message": "Сумма для отправки" - }, "sendBugReport": { "message": "Отправьте нам сообщение об ошибке." }, @@ -2901,6 +3062,9 @@ "message": "Предупреждение: вы собираетесь отправить токен-контракт, что может привести к потере средств. $1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "Тестовая сеть Sepolia" + }, "setAdvancedPrivacySettings": { "message": "Задать дополнительные настройки конфиденциальности" }, @@ -2933,12 +3097,6 @@ "showAdvancedGasInlineDescription": { "message": "Выберите это, чтобы отображать цену газа и управление лимитами непосредственно на экранах отправки и подтверждения." }, - "showCustomNetworkList": { - "message": "Показать пользовательский список сетей" - }, - "showCustomNetworkListDescription": { - "message": "Выберите это, чтобы отобразить список сетей с предварительно заполненными данными при добавлении новой сети." - }, "showFiatConversionInTestnets": { "message": "Показывать конвертацию в тестовых сетях" }, @@ -2993,6 +3151,9 @@ "signed": { "message": "Подписано" }, + "signin": { + "message": "Войти" + }, "simulationErrorMessageV2": { "message": "Мы не смогли оценить размер платы за газ. В контракте может быть ошибка, и эта транзакция может завершиться неудачно." }, @@ -3005,9 +3166,6 @@ "skipAccountSecurityDetails": { "message": "Я понимаю, что, если я не создам резервную копию своей секретной фразы для восстановления, я могу потерять доступ ко всем своим счетам и всем средствам на них." }, - "slow": { - "message": "Медленный" - }, "smartTransaction": { "message": "Смарт-транзакция" }, @@ -3019,6 +3177,10 @@ "message": "Добавлено на $1 из $2", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "Ошибка снапа: '$1'. Код ошибки: '$2'", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -3029,12 +3191,32 @@ "snapInstallWarningCheck": { "message": "Чтобы подтвердить, что вы понимаете, отметьте все." }, + "snapInstallWarningCheckPlural": { + "message": "Чтобы подтвердить, что вы понимаете, отметьте все ячейки." + }, + "snapInstallWarningKeyAccess": { + "message": "Вы предоставляете ключ доступа $2 к привязке \"$1\". Это действие нельзя отменить, и оно предоставляет \"$1\" управление всеми счетами и активами $2. Перед тем как продолжить, убедитесь, что доверяете \"$1\".", + "description": "The first parameter is the name of the snap and the second one is the protocol" + }, "snapRequestsPermission": { "message": "Этот снап запрашивает следующие разрешения:" }, + "snapUpdate": { + "message": "Обновить привязку" + }, + "snapUpdateExplanation": { + "message": "$1 нужна более новая версия вашей привязки.", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "Снапы" }, + "snapsInsightLoading": { + "message": "Загрузка аналитики по транзакции..." + }, + "snapsNoInsight": { + "message": "Эта привязка не выдала никакой аналитики" + }, "snapsSettingsDescription": { "message": "Управление вашим снапами" }, @@ -3197,7 +3379,7 @@ "message": "Обмен бы не удался" }, "stxCancelledDescription": { - "message": "Ваша транзакция потерпела бы неудачу и была бы отменена, чтобы защитить вас от уплаты ненужной платы за газ." + "message": "Ваша транзакция завершилась неудачно и была бы отменена, чтобы избежать ненужной платы за газ." }, "stxCancelledSubDescription": { "message": "Попробуйте обменять еще раз. Мы готовы защитить вас от подобных рисков в следующий раз." @@ -3479,6 +3661,9 @@ "swapReviewSwap": { "message": "Проверить обмен" }, + "swapSearchNameOrAddress": { + "message": "Выполните поиск по имени или вставьте адрес" + }, "swapSelect": { "message": "Выбрать" }, @@ -3498,6 +3683,9 @@ "message": "$1%", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "Изменение цены в период между размещением заказа и подтверждением называется «проскальзыванием». Обмен будет автоматически отменен, если фактическое проскальзывание превысит установленный «допуск проскальзывания»." + }, "swapSource": { "message": "Источник ликвидности" }, @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "Переключиться на этот счет" }, + "switchedTo": { + "message": "Вы переключились на" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "В случае смены сетей все ожидающие подтверждения будут отменены" }, @@ -3643,15 +3834,6 @@ "syncWithMobileTitle": { "message": "Синхронизировать с мобильным устройством" }, - "syncWithThreeBox": { - "message": "Синхронизировать данные с 3Box (экспериментальная функция)" - }, - "syncWithThreeBoxDescription": { - "message": "Включите, чтобы скопировать ваши настройки с помощью 3Box. Эта функция в настоящее время является экспериментальной. Используйте ее на свой страх и риск." - }, - "syncWithThreeBoxDisabled": { - "message": "3Box отключен из-за ошибки во время первоначальной синхронизации" - }, "tenPercentIncreased": { "message": "Увеличение на 10%" }, @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "Выберите предпочитаемую тему MetaMask." }, + "thingsToKeep": { + "message": "Что нужно помнить:" + }, "thisWillCreate": { "message": "Это создаст новый кошелек и секретную фразу для восстановления" }, @@ -3714,12 +3899,21 @@ "tokenDetails": { "message": "Сведения о токене" }, + "tokenFoundTitle": { + "message": "Найден 1 новый токен" + }, "tokenId": { "message": "Ид. токена" }, "tokenList": { "message": "Списки токенов:" }, + "tokenScamSecurityRisk": { + "message": "мошенничество с токенами и угрозы безопасности" + }, + "tokenShowUp": { + "message": "Ваши токены могут не отображаться автоматически в вашем кошельке." + }, "tokenSymbol": { "message": "Символ токена" }, @@ -3861,6 +4055,9 @@ "tryAgain": { "message": "Попробуйте еще раз" }, + "tryOur": { + "message": "Попробуйте наше" + }, "turnOnTokenDetection": { "message": "Включите расширенное обнаружение токенов" }, @@ -3917,6 +4114,10 @@ "message": "Эта пользовательская сеть не распознана. Мы рекомендуем $1, прежде чем продолжить", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (Нераспознанный протокол)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "Отправка коллекционных активов (ERC-721) сейчас не поддерживается", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -4034,6 +4235,10 @@ "warning": { "message": "Предупреждение" }, + "warningTooltipText": { + "message": "$1 Контракт может потратить весь ваш баланс токенов без дополнительного уведомления или согласия. Защитите себя, установив более низкий лимит расходов.", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "Слабый" }, diff --git a/app/_locales/sk/messages.json b/app/_locales/sk/messages.json index 2bfd7e540dcc..2f4fb2e9a8f6 100644 --- a/app/_locales/sk/messages.json +++ b/app/_locales/sk/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Informácie" }, - "acceleratingATransaction": { - "message": "*Urýchlenie transakcie pomocou vyššej ceny za GAS zvyšuje šance na rýchlejšie spracovanie v sieti, nie je to však vždy zaručené." - }, "accessingYourCamera": { "message": "Prístupuje k fotoaparátu..." }, @@ -187,18 +184,9 @@ "connectingToGoerli": { "message": "Pripája sa k testovacej sieti Goerli" }, - "connectingToKovan": { - "message": "Připojuji se k Kovan Test Network" - }, "connectingToMainnet": { "message": "Připojuji se k Ethereum Mainnet" }, - "connectingToRinkeby": { - "message": "Připojuji se k Rinkeby Test Network" - }, - "connectingToRopsten": { - "message": "Připojuji se k Ropsten Test Network" - }, "continueToWyre": { "message": "Pokračovať na Wyre" }, @@ -244,12 +232,6 @@ "custom": { "message": "Rozšírené" }, - "customGas": { - "message": "Nastavit palivo" - }, - "customGasSubTitle": { - "message": "Zvýšenie poplatku môže skrátiť dobu spracovania, nie je to však zaručené." - }, "customToken": { "message": "Vlastní token" }, @@ -334,9 +316,6 @@ "enterPasswordContinue": { "message": "Pokračujte zadaním hesla" }, - "estimatedProcessingTimes": { - "message": "Odhadovaný čas spracovania" - }, "ethereumPublicAddress": { "message": "Verejná adresa Ethereum" }, @@ -576,12 +555,6 @@ "newToMetaMask": { "message": "Ste noví na MetaMask?" }, - "newTotal": { - "message": "Nový súčet" - }, - "newTransactionFee": { - "message": "Nový poplatok za transakciu" - }, "next": { "message": "Další" }, @@ -773,9 +746,6 @@ "seedPhraseReq": { "message": "klíčové fráze mají 12 slov" }, - "selectAHigherGasFee": { - "message": "Ak chcete urýchliť spracovanie transakcie, vyberte vyšší poplatok GAS.*" - }, "selectAnAccount": { "message": "Vybrať účet" }, @@ -794,9 +764,6 @@ "send": { "message": "Odeslat" }, - "sendAmount": { - "message": "Poslať sumu" - }, "sendTokens": { "message": "Odeslat tokeny" }, @@ -839,9 +806,6 @@ "signed": { "message": "Podepsáno" }, - "slow": { - "message": "Pomalé" - }, "somethingWentWrong": { "message": "Och! Niečo zlyhalo." }, diff --git a/app/_locales/sl/messages.json b/app/_locales/sl/messages.json index c49155135358..f3fd82b8996f 100644 --- a/app/_locales/sl/messages.json +++ b/app/_locales/sl/messages.json @@ -8,9 +8,6 @@ "about": { "message": "O možnostih" }, - "acceleratingATransaction": { - "message": "* Pospešitev transakcije z višjo gas ceno poveča njene možnosti za hitrejšo obdelavo v omrežju, vendar ni vedno zagotovljena." - }, "accessingYourCamera": { "message": "Dostopanje do vaše kamere ..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Povezovanje na testno omrežje Goerli" }, - "connectingToKovan": { - "message": "Povezovanje na testno omrežje Kovan" - }, "connectingToMainnet": { "message": "Povezovanje na glavno omrežje" }, - "connectingToRinkeby": { - "message": "Povezovanje na testno omrežje Rinkeby" - }, - "connectingToRopsten": { - "message": "Povezovanje na testno omrežje Ropsten" - }, "continueToWyre": { "message": "Nadaljuj na Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "Napredno" }, - "customGas": { - "message": "Prilagodi gas" - }, - "customGasSubTitle": { - "message": "Povečanje lahko skrajša čas obdelave, vendar ni zagotovljeno." - }, "customToken": { "message": "Žeton po meri" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "Za nadaljevanje vnesite geslo" }, - "estimatedProcessingTimes": { - "message": "Predviden čas obdelave" - }, "ethereumPublicAddress": { "message": "Javni naslov Ethereum" }, @@ -497,9 +476,6 @@ "knownAddressRecipient": { "message": "Znan naslov pogodbe." }, - "kovan": { - "message": "Testno omrežje Kovan" - }, "learnMore": { "message": "Preberite več" }, @@ -592,12 +568,6 @@ "newToMetaMask": { "message": "Ste novi na MetaMask?" }, - "newTotal": { - "message": "Novo skupno" - }, - "newTransactionFee": { - "message": "Nova provizija za transakcije" - }, "next": { "message": "Naprej" }, @@ -756,12 +726,6 @@ "revealSeedWordsWarningTitle": { "message": "Tega ne delite z nikomer!" }, - "rinkeby": { - "message": "Testno omrežje Rinkeby" - }, - "ropsten": { - "message": "Testno omrežje Ropsten" - }, "rpcUrl": { "message": "Nov URL RPC" }, @@ -798,9 +762,6 @@ "seedPhraseReq": { "message": "Seed phrase mora biti dolg 12 besed" }, - "selectAHigherGasFee": { - "message": "Izberite višji gas fee, da pospešite obdelavo vaše transakcije.*" - }, "selectAnAccount": { "message": "Izberi račun" }, @@ -819,9 +780,6 @@ "send": { "message": "Pošlji" }, - "sendAmount": { - "message": "Pošlji znesek" - }, "sendTokens": { "message": "Pošlji žetone" }, @@ -864,9 +822,6 @@ "signed": { "message": "Podpisano" }, - "slow": { - "message": "Počasen" - }, "somethingWentWrong": { "message": "Oops! Nekaj je šlo narobe." }, diff --git a/app/_locales/sr/messages.json b/app/_locales/sr/messages.json index 5ebbd176e554..c51f8d3a9911 100644 --- a/app/_locales/sr/messages.json +++ b/app/_locales/sr/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Основни подаци" }, - "acceleratingATransaction": { - "message": "* Time što se ubrzava transakcija koristeći veću gas cenu, povećavaju se šanse da se procesuira brže od strane mreže, ali to nije uvek zagarantovano." - }, "accessingYourCamera": { "message": "Pristupa se vašoj kameri..." }, @@ -190,18 +187,9 @@ "connectingToGoerli": { "message": "Povezuje se sa test mrežom Goerli " }, - "connectingToKovan": { - "message": "Povezuje se na test mrežu Kovan" - }, "connectingToMainnet": { "message": "Povezuje se na glavnu Ethereum mrežu" }, - "connectingToRinkeby": { - "message": "Poezivanje na Rinkeby Test mrežu" - }, - "connectingToRopsten": { - "message": "Povezuje se na Ropsten Test mrežu" - }, "continueToWyre": { "message": "Nastavite ka Wyre" }, @@ -247,12 +235,6 @@ "custom": { "message": "Напредне опције" }, - "customGas": { - "message": "Prilagodi gas" - }, - "customGasSubTitle": { - "message": "Povećanje naknade može smanjiti vreme obrade, ali to nije zagarantovano." - }, "customToken": { "message": "Prilagođeni token" }, @@ -337,9 +319,6 @@ "enterPasswordContinue": { "message": "Unesite lozinku kako biste nastavili" }, - "estimatedProcessingTimes": { - "message": "Procenjeno vreme za obradu" - }, "ethereumPublicAddress": { "message": "Ethereum javna adresa" }, @@ -500,9 +479,6 @@ "knownAddressRecipient": { "message": "Poznata adresa ugovora." }, - "kovan": { - "message": "Kovan test mreža" - }, "learnMore": { "message": "Nauči više" }, @@ -595,12 +571,6 @@ "newToMetaMask": { "message": "Novi ste u MetaMask-u?" }, - "newTotal": { - "message": "Novi zbir" - }, - "newTransactionFee": { - "message": "Nova naknada za transakcije" - }, "next": { "message": "Даље" }, @@ -759,12 +729,6 @@ "revealSeedWordsWarningTitle": { "message": "NE delite ovu frazu ni sa kim!" }, - "rinkeby": { - "message": "Rinkeby test mreža" - }, - "ropsten": { - "message": "Test mreža Ropsten" - }, "rpcUrl": { "message": "Novi RPC URL" }, @@ -801,9 +765,6 @@ "seedPhraseReq": { "message": "Šifre za oporavak naloga (seed phrases) imaju 12 reči" }, - "selectAHigherGasFee": { - "message": "Izaberite veću vrednost gas naknade da biste ubrzali procesuiranje vaše transakcije.*" - }, "selectAnAccount": { "message": "Izaberite nalog" }, @@ -822,9 +783,6 @@ "send": { "message": "Пошаљи" }, - "sendAmount": { - "message": "Pošaljite iznos" - }, "sendTokens": { "message": "Pošalji tokene" }, @@ -867,9 +825,6 @@ "signed": { "message": "Potpisan" }, - "slow": { - "message": "Споро" - }, "somethingWentWrong": { "message": "Ups! Nešto nije u redu." }, diff --git a/app/_locales/sv/messages.json b/app/_locales/sv/messages.json index c8d77d1677ed..1612618705fc 100644 --- a/app/_locales/sv/messages.json +++ b/app/_locales/sv/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Om" }, - "acceleratingATransaction": { - "message": "* Att snabba upp en överföring genom att använda ett högre gaspris ökar chanserna för att överföringen ska hanteras snabbare av nätverket, men det är inte en garanti." - }, "accessingYourCamera": { "message": "Begär åtkomst till din kamera..." }, @@ -187,18 +184,9 @@ "connectingToGoerli": { "message": "Ansluter till Goerli Test Network" }, - "connectingToKovan": { - "message": "Ansluter till Kovans testnätverk" - }, "connectingToMainnet": { "message": "Koppla till Ethereums huvudnätverk" }, - "connectingToRinkeby": { - "message": "Ansluter till Rinkeby Test Network" - }, - "connectingToRopsten": { - "message": "Ansluter till Ropsten Test Network" - }, "continueToWyre": { "message": "Fortsätt till Wyre" }, @@ -244,12 +232,6 @@ "custom": { "message": "Avancerat" }, - "customGas": { - "message": "Anpassa gas" - }, - "customGasSubTitle": { - "message": "Att öka avgiften kan minska behandlingstiden, men det är inte garanterat att göra det." - }, "customToken": { "message": "Anpassad token" }, @@ -334,9 +316,6 @@ "enterPasswordContinue": { "message": "Ange lösenord för att fortsätta" }, - "estimatedProcessingTimes": { - "message": "Uppskattade behandlingstider" - }, "ethereumPublicAddress": { "message": "Ethereum offentlig adress" }, @@ -493,9 +472,6 @@ "knownAddressRecipient": { "message": "Känd kontraktadress." }, - "kovan": { - "message": "Kovan testnätverk" - }, "learnMore": { "message": "Läs mer" }, @@ -588,12 +564,6 @@ "newToMetaMask": { "message": "Ny på MetaMask?" }, - "newTotal": { - "message": "Ny totalsumma" - }, - "newTransactionFee": { - "message": "Ingen transaktionsavgift" - }, "next": { "message": "Nästa" }, @@ -752,12 +722,6 @@ "revealSeedWordsWarningTitle": { "message": "DELA INTE frasen med någon!" }, - "rinkeby": { - "message": "Rinkeby testnätverk" - }, - "ropsten": { - "message": "Ropsten testnätverk" - }, "rpcUrl": { "message": "Ny RPC-URL" }, @@ -794,9 +758,6 @@ "seedPhraseReq": { "message": "Nyckelfraser är 12 ord långa." }, - "selectAHigherGasFee": { - "message": "Välj en högre bränsleavgift för att accelerera transaktionsprocessen.*" - }, "selectAnAccount": { "message": "Välj ett konto" }, @@ -815,9 +776,6 @@ "send": { "message": "Skicka" }, - "sendAmount": { - "message": "Skicka belopp" - }, "sendTokens": { "message": "Skicka tokens" }, @@ -860,9 +818,6 @@ "signed": { "message": "Signerat" }, - "slow": { - "message": "Långsamt" - }, "somethingWentWrong": { "message": "Hoppsan! Något gick fel." }, diff --git a/app/_locales/sw/messages.json b/app/_locales/sw/messages.json index 9a060e45ec42..ac48f06de6d6 100644 --- a/app/_locales/sw/messages.json +++ b/app/_locales/sw/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Kuhusu" }, - "acceleratingATransaction": { - "message": "*Kuwezesha muamala kwa kutumia bei ya juu ya gesi huongeza uwezekano wake wa kushughulikiwa na mtandao haraka, lakini hauhakikishiwi siku zote." - }, "accessingYourCamera": { "message": "Kufikia kamera yako..." }, @@ -187,18 +184,9 @@ "connectingToGoerli": { "message": "Inaunganisha kwenye Mtandao wa Majaribio wa Goerli" }, - "connectingToKovan": { - "message": "Inaunganisha kwenye Mtandao wa Majaribio wa Kovan" - }, "connectingToMainnet": { "message": "Inaunganisha kwenye Mtandao Mkuu wa Ethereum" }, - "connectingToRinkeby": { - "message": "Inaunganisha kwenye Mtandao wa Majaribio wa Rinkeby" - }, - "connectingToRopsten": { - "message": "Inaunganisha kwenye Mtandao wa Majaribio wa Ropsten" - }, "continueToWyre": { "message": "Endelea kwenye Wyre" }, @@ -244,12 +232,6 @@ "custom": { "message": "Mipangilio ya kina" }, - "customGas": { - "message": "Weka Mipangilio ya Gesi Upendavyo" - }, - "customGasSubTitle": { - "message": "Ada iliyoongezeka inaweza kupunguza muda wa uchakataji, lakini haihakikishwi." - }, "customToken": { "message": "Kianzio Maalumu" }, @@ -334,9 +316,6 @@ "enterPasswordContinue": { "message": "Ingiza nenosiri ili uendelee" }, - "estimatedProcessingTimes": { - "message": "Muda wa Kuchakata Uliokadiriwa" - }, "ethereumPublicAddress": { "message": "Anwani ya Umma ya Ethereum" }, @@ -490,9 +469,6 @@ "knownAddressRecipient": { "message": "Anwani za mkataba zinazofahamika." }, - "kovan": { - "message": "Mtandao wa Majaribio wa Kovan" - }, "learnMore": { "message": "Jifunze zaidi" }, @@ -582,12 +558,6 @@ "newToMetaMask": { "message": "MetaMask mpya?" }, - "newTotal": { - "message": "Jumla Mpya" - }, - "newTransactionFee": { - "message": "Ada Mpya ya Muamala" - }, "next": { "message": "Inayofuata" }, @@ -746,12 +716,6 @@ "revealSeedWordsWarningTitle": { "message": "USISHIRIKI kirai hiki na mtu yeyote!" }, - "rinkeby": { - "message": "Mtandao wa Majaribio wa Rinkeby" - }, - "ropsten": { - "message": "Mtandao wa Majaribio wa Ropsten" - }, "rpcUrl": { "message": "RPC URL mpya" }, @@ -788,9 +752,6 @@ "seedPhraseReq": { "message": "Virai vianzio vina urefu wa maneno 12" }, - "selectAHigherGasFee": { - "message": "Chagua ada ya juu ya gesi ili kuharakisha uchakataji wa muamala wako.*" - }, "selectAnAccount": { "message": "Chagua Akaunti" }, @@ -809,9 +770,6 @@ "send": { "message": "Tuma" }, - "sendAmount": { - "message": "Tuma Kiasi" - }, "sendTokens": { "message": "Tuma Vianzio" }, @@ -854,9 +812,6 @@ "signed": { "message": "Imesainiwa" }, - "slow": { - "message": "Polepole" - }, "somethingWentWrong": { "message": "Ayaa! Hitilafu fulani imetokea." }, diff --git a/app/_locales/ta/messages.json b/app/_locales/ta/messages.json index 7d003b620d4a..5c4f63430a56 100644 --- a/app/_locales/ta/messages.json +++ b/app/_locales/ta/messages.json @@ -78,18 +78,9 @@ "connect": { "message": "இணை" }, - "connectingToKovan": { - "message": "கோவன் டெஸ்ட் நெட்வொர்க்குடன் இணைத்தல்" - }, "connectingToMainnet": { "message": "முக்கிய எதெரியும் நெட்வொர்க் இணைக்கும்" }, - "connectingToRinkeby": { - "message": "ரிங்கெப்ய டெஸ்ட் நெட்வொர்க்குடன் இணைக்கிறது" - }, - "connectingToRopsten": { - "message": "ரொப்ஸ்டென் டெஸ்ட் நெட்வொர்க்குடன் இணைக்கிறது" - }, "contractDeployment": { "message": "ஒப்பந்த வரிசைப்படுத்தல்" }, @@ -111,9 +102,6 @@ "custom": { "message": "மேம்பட்டவை" }, - "customGas": { - "message": "எரிவாயுவைத் தனிப்பயனாக்குங்கள்" - }, "customToken": { "message": "தனிப்பயன் டோக்கன்" }, @@ -238,9 +226,6 @@ "message": "JSON கோப்பு", "description": "format for importing an account" }, - "kovan": { - "message": "கோவன் டெஸ்ட் நெட்வொர்க்" - }, "learnMore": { "message": "மேலும் அறிக" }, @@ -392,12 +377,6 @@ "revealSeedWordsWarning": { "message": "உங்கள் விதை வார்த்தைகள் ஒரு பொது இடத்தில் மீட்க வேண்டாம்! உங்கள் எல்லா கணக்குகளையும் திருட இந்த வார்த்தைகள் பயன்படுத்தப்படலாம்." }, - "rinkeby": { - "message": "ரிங்கெப்ய டெஸ்ட் நெட்வொர்க்" - }, - "ropsten": { - "message": "ரொப்ஸ்டென் டெஸ்ட் நெட்வொர்க்" - }, "save": { "message": "சேமி" }, @@ -437,9 +416,6 @@ "signed": { "message": "கையொப்பமிடப்பட்ட" }, - "slow": { - "message": "மெதுவான" - }, "stateLogError": { "message": "மாநில பதிவுகளை மீட்டெடுப்பதில் பிழை." }, diff --git a/app/_locales/te/messages.json b/app/_locales/te/messages.json index f1c780d5b831..0ee2a46c7358 100644 --- a/app/_locales/te/messages.json +++ b/app/_locales/te/messages.json @@ -136,9 +136,6 @@ "settings": { "message": "సెట్టింగ్‌లు" }, - "slow": { - "message": "నెమ్మదిగా" - }, "tryAgain": { "message": "మళ్లీ ప్రయత్నించు" }, diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json index 6daf3c05b10b..347176fea8f4 100644 --- a/app/_locales/th/messages.json +++ b/app/_locales/th/messages.json @@ -81,9 +81,6 @@ "connectingToMainnet": { "message": "เชื่อมต่อกับเครือข่าย Ethereum หลัก" }, - "connectingToRopsten": { - "message": "เชื่อมต่อกับเครือข่ายทดสอบ Ropsten" - }, "continueToWyre": { "message": "ไปที่ Wyre" }, @@ -111,12 +108,6 @@ "currencyConversion": { "message": "การแปลงสกุลเงิน" }, - "customGas": { - "message": "กำหนดค่าแก็สเอง" - }, - "customGasSubTitle": { - "message": "การเพิ่มค่าธรรมเนียมอาจลดเวลาดำเนินการ แต่ก็ไม่แน่เสมอไป" - }, "decimal": { "message": "ตำแหน่งของทศนิยม" }, @@ -253,9 +244,6 @@ "message": "ไฟล์ JSON", "description": "format for importing an account" }, - "kovan": { - "message": "เครือข่ายทดสอบ Kovan" - }, "learnMore": { "message": "เรียนรู้เพิ่มเติม" }, @@ -318,9 +306,6 @@ "newToMetaMask": { "message": "เพิ่งเริ่มใช้ MetaMask?" }, - "newTransactionFee": { - "message": "ค่าธรรมเนียมธุรกรรมใหม่" - }, "next": { "message": "ถัดไป" }, @@ -380,12 +365,6 @@ "revealSeedWordsWarning": { "message": "อย่าเปิดเผยคำกลุ่มคำชีดของคุณในที่สาธารณะ! คำเหล่านี้สามารถใช้เพื่อขโมยบัญชีทั้งหมดของคุณ" }, - "rinkeby": { - "message": "เครือข่ายทดสอบ Rinkeby" - }, - "ropsten": { - "message": "เครือข่ายทดสอบ Ropsten" - }, "save": { "message": "บันทึก" }, @@ -407,9 +386,6 @@ "send": { "message": "ส่ง" }, - "sendAmount": { - "message": "ส่งจำนวนเงินนี้" - }, "sendTokens": { "message": "ส่งโทเค็น" }, diff --git a/app/_locales/tl/messages.json b/app/_locales/tl/messages.json index bafd99635bde..a5167c5c98d2 100644 --- a/app/_locales/tl/messages.json +++ b/app/_locales/tl/messages.json @@ -44,12 +44,59 @@ "QRHardwareWalletSteps2Description": { "message": "AirGap Vault at Ngrave (Paparating Na)" }, + "SIWEAddressInvalid": { + "message": "Ang address sa request sa pag-sign in ay hindi tugma sa address ng account na ginagamit mo sa pag-sign in." + }, + "SIWEDomainWarningBody": { + "message": "Hinihiling sa iyo ng website ($1) na mag-sign in sa maling domain. Posibleng phishing na pag-atake ito.", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "Chain ID:" + }, + "SIWELabelExpirationTime": { + "message": "Mag-e-expire sa:" + }, + "SIWELabelIssuedAt": { + "message": "Inisyu Sa:" + }, + "SIWELabelMessage": { + "message": "Mensahe:" + }, + "SIWELabelNonce": { + "message": "Nonce:" + }, + "SIWELabelNotBefore": { + "message": "Hindi Lalampas sa:" + }, + "SIWELabelRequestID": { + "message": "Request ID:" + }, + "SIWELabelResources": { + "message": "Resources: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URl:" + }, + "SIWELabelVersion": { + "message": "Bersyon:" + }, + "SIWESiteRequestSubtitle": { + "message": "Hinihiling ng site na ito na mag-sign in gamit ang" + }, + "SIWESiteRequestTitle": { + "message": "Request sa pag-sign in" + }, + "SIWEWarningSubtitle": { + "message": "Para kumpirmahin na naiintindihan mo, lagyan ng tsek ang:" + }, + "SIWEWarningTitle": { + "message": "Sigurado ka ba?" + }, "about": { "message": "Tungkol Dito" }, - "acceleratingATransaction": { - "message": "* Kapag in-accelerate ang transaksyon sa pamamagitan ng paggamit ng mas mataas na presyo ng gasolina, mas magiging malaki ang tsansang mas mabilis na maproseso ng network, pero hindi ito palaging ginagarantiya." - }, "acceptTermsOfUse": { "message": "Nabasa ko at sumasang-ayon ako sa $1", "description": "$1 is the `terms` message" @@ -121,6 +168,9 @@ "addAlias": { "message": "Magdagdag ng alias" }, + "addBlockExplorer": { + "message": "Magdagdag ng block explorer" + }, "addContact": { "message": "Magdagdag ng contact" }, @@ -209,9 +259,6 @@ "airgapVault": { "message": "AirGap Vault" }, - "airgapVaultTutorial": { - "message": " (Mga Tutorial)" - }, "alertDisableTooltip": { "message": "Puwede itong baguhin sa \"Mga Setting > Mga Alerto\"" }, @@ -271,12 +318,15 @@ "message": "Aprubahan ang limitasyon sa paggastos" }, "approveAllTokensTitle": { - "message": "Magbigay ng pahintulot na i-access ang lahat ng iyong $1?", + "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" }, @@ -293,6 +343,10 @@ "approvedAsset": { "message": "Aprubadong asset" }, + "approvedOn": { + "message": "Inaprubahan noong $1", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "Sigurado ka ba?" }, @@ -305,6 +359,9 @@ "assets": { "message": "Mga Asset" }, + "attemptSendingAssets": { + "message": "Kung tatangkain mong magpadala ng mga asset nang direkta mula sa isang network papunta sa isa pa, maaari itong magresulta sa permanenteng pagkawala ng asset. Siguraduhing gumamit ng tulay." + }, "attemptToCancel": { "message": "Subukang Kanselahin?" }, @@ -335,6 +392,9 @@ "backToAll": { "message": "Bumalik sa Lahat" }, + "backup": { + "message": "I-backup" + }, "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." }, @@ -344,6 +404,12 @@ "backupNow": { "message": "I-back up na" }, + "backupUserData": { + "message": "I-backup ang iyong datos" + }, + "backupUserDataDescription": { + "message": "Maaari mong i-backup ang mga setting ng user na naglalaman ng mga kagustuhan at mga address ng account mula sa isang JSON file." + }, "balance": { "message": "Balanse" }, @@ -356,6 +422,9 @@ "basic": { "message": "Panimula" }, + "beCareful": { + "message": "Mag-ingat" + }, "betaMetamaskDescription": { "message": "Ang Metamask na pinagkakatiwalaan ng milyun-milyon ay isang ligtas na wallet na ginagawang accessible ang mundo ng web3 para sa lahat." }, @@ -372,6 +441,9 @@ "betaMetamaskVersion": { "message": "Bersyon ng MetaMask Beta" }, + "betaPortfolioSite": { + "message": "site ng beta portfolio" + }, "betaWelcome": { "message": "Welcome sa MetaMask Beta" }, @@ -388,7 +460,7 @@ "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" }, "blockExplorerUrl": { - "message": "Block Explorer" + "message": "Block explorer URL" }, "blockExplorerUrlDefinition": { "message": "Ang URL ay ginamit bilang block explorer para sa network na ito." @@ -401,7 +473,7 @@ "message": "Mga Blocky" }, "browserNotSupported": { - "message": "Hindi sinusuportahan ang iyong Browser..." + "message": "Hindi sinusuportahan ang iyong browser..." }, "buildContactList": { "message": "Bumuo ng iyong listahan ng contact" @@ -507,6 +579,9 @@ "message": "Mag-click dito upang ikonekta ang iyong Ledger sa pamamagitan ng WebHID", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "Pindutin ito para manu-manong idagdag ang mga token." + }, "clickToRevealSeed": { "message": "Mag-click dito para ipakita ang mga lihim na salita" }, @@ -523,6 +598,16 @@ "confirm": { "message": "Kumpirmahin" }, + "confirmPageDialogSetApprovalForAll": { + "message": "Nagbibigay ka ng access sa $1, kabilang ang anumang maaaring maging pag-aari mo sa hinaharap. Ang partido sa kabilang panig ay maaaring maglipat ng mga NFT mula sa iyong wallet sa anumang oras nang hindi ka tinatanong hanggang sa bawiin mo ang pag-aprubang ito. $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "lahat na NFT sa kontratang ito" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "Magpatuloy nang may pag-iingat." + }, "confirmPassword": { "message": "Kumpirmahin ang password" }, @@ -554,7 +639,7 @@ "message": "Ikonekta ang account o gumawa ng bago" }, "connectHardwareWallet": { - "message": "Ikonekta ang Hardware Wallet" + "message": "Ikonekta ang hardware wallet" }, "connectManually": { "message": "Manu-manong kumonekta sa kasalukuyang site" @@ -616,17 +701,11 @@ "connectingToGoerli": { "message": "Kumokonekta sa Goerli Test Network" }, - "connectingToKovan": { - "message": "Kumokonekta sa Kovan Test Network" - }, "connectingToMainnet": { "message": "Kumokonekta sa Ethereum Mainnet" }, - "connectingToRinkeby": { - "message": "Kumokonekta sa Rinkeby Test Network" - }, - "connectingToRopsten": { - "message": "Kumokonekta sa Ropsten Test Network" + "connectingToSepolia": { + "message": "Kumokonekta sa Sepolia test network" }, "contactUs": { "message": "Makipag-ugnayan sa amin" @@ -661,8 +740,20 @@ "contractDeployment": { "message": "Deployment ng Kontrata" }, + "contractDescription": { + "message": "Para protektahan ang iyong sarili laban sa mga manloloko, maglaan ng ilang sandali upang i-verify ang mga detalye ng kontrata." + }, "contractInteraction": { - "message": "Interaksyon ng Kontrata" + "message": "Interaksyon ng kontrata" + }, + "contractRequestingSpendingCap": { + "message": "Humihiling ang kontrata ng limitasyon sa paggasta" + }, + "contractTitle": { + "message": "Mga detalye ng kontrata" + }, + "contractToken": { + "message": "Kontrata ng token" }, "convertTokenToNFTDescription": { "message": "Natukoy namin na ang asset na ito ay isang NFT. Ang MetaMask ay mayroon na ngayong ganap na native support para sa mga NFT. Gusto mo bang alisin ito sa iyong listahan ng token at idagdag ito bilang isang NFT?" @@ -686,28 +777,28 @@ "message": "Kopyahin sa clipboard" }, "copyTransactionId": { - "message": "Kopyahin ang ID ng Transaksyon" + "message": "Kopyahin ang ID ng transaksyon" }, "create": { "message": "Gumawa" }, "createAWallet": { - "message": "Gumawa ng Wallet" + "message": "Gumawa ng wallet" }, "createAccount": { - "message": "Gumawa ng Account" + "message": "Gumawa ng account" }, "createNewWallet": { "message": "Gumawa ng bagong wallet" }, "createPassword": { - "message": "Gumawa ng Password" + "message": "Gumawa ng password" }, "currencyConversion": { - "message": "Conversion ng Currency" + "message": "Conversion ng currency" }, "currencySymbol": { - "message": "Symbol ng Currency" + "message": "Symbol ng currency" }, "currencySymbolDefinition": { "message": "Ang symbol ng ticker ay ipinakita para sa pera ng network na ito." @@ -719,7 +810,7 @@ "message": "Kasalukuyang extension page" }, "currentLanguage": { - "message": "Kasalukuyang Wika" + "message": "Kasalukuyang wika" }, "currentTitle": { "message": "Current:" @@ -742,19 +833,16 @@ "customContentSearch": { "message": "Maghanap ng naunang idinagdag na network" }, - "customGas": { - "message": "I-customize ang Gasolina" - }, "customGasSettingToolTipMessage": { "message": "Gamitin ang $1 para i-customize ang presyo ng gas. Ito ay maaaring nakakalito kung hindi ka pamilyar. Harapin ang sarili mong panganib.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "Kapag dinagdagan ang bayarin, mababawasan ang mga oras ng pagproseso, pero hindi ito garantisado." - }, "customSpendLimit": { "message": "Custom na Limitasyon sa Paggastos" }, + "customSpendingCap": { + "message": "Custom na limitasyon sa paggastos" + }, "customToken": { "message": "Custom na Token" }, @@ -764,6 +852,9 @@ "customTokenWarningInTokenDetectionNetwork": { "message": "Bago manu-manong mag-import ng token, tiyaking pinagkakatiwalaan mo ito. Matuto tungkol sa $1." }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "Siguraduhing pinagkakatiwalaan mo ang isang token bago mo ito i-import. Alamin kung paano maiwasan ang $1. Maaari mo ring paganahin ang pagtuklas ng token $2." + }, "customerSupport": { "message": "suporta sa kostumer" }, @@ -787,14 +878,14 @@ "data": { "message": "Datos" }, - "dataBackupFoundInfo": { - "message": "Ang ilan sa data ng iyong account ay na-back up sa nakaraang pag-install ng MetaMask. Maaaring kasama rito ang iyong mga setting, contact, at token. Gusto mo bang i-restore na ang data na ito?" + "dataBackupSeemsCorrupt": { + "message": "Hindi maibalik ang iyong datos. Mukhang sira ang file." }, "dataHex": { "message": "Hex" }, "decimal": { - "message": "Mga Decimal ng Katumpakan" + "message": "Decimal na token" }, "decimalsMustZerotoTen": { "message": "Ang mga decimal ay dapat na hindi bababa sa 0, at hihigit sa 36." @@ -826,7 +917,7 @@ "message": "I-delete ang Account" }, "deleteNetwork": { - "message": "I-delete ang Network?" + "message": "I-delete ang network?" }, "deleteNetworkDescription": { "message": "Sigurado ka bang gusto mong i-delete ang network na ito?" @@ -835,6 +926,12 @@ "message": "Magdeposito ng $1", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "Matuto pa" + }, + "deprecatedTestNetworksMsg": { + "message": "Dahil sa mga pagbabago ng protokol ng Ethereum: ang mga test network na Rinkeby, Ropsten at Kovan ay maaaring hindi gumana tulad ng maaasahan at malapit nang itigil ang paggamit." + }, "description": { "message": "Deskripsyon" }, @@ -894,7 +991,7 @@ "message": "I-download ang Lihim na Parirala sa Pag-back up na ito at panatilihin itong naka-store nang ligtas sa isang external na naka-encrypt na hard drive o storage medium." }, "downloadStateLogs": { - "message": "I-download ang Mga Log ng Estado" + "message": "I-download ang mga log ng estado" }, "dropped": { "message": "Binitawan" @@ -912,7 +1009,7 @@ "message": "I-edit ang pagkansela ng singil sa gas" }, "editContact": { - "message": "I-edit ang Contact" + "message": "I-edit ang contact" }, "editGasEducationButtonText": { "message": "Paano ako pipili?" @@ -1034,7 +1131,7 @@ "message": "I-edit ang pagpapabilis ng singil sa gas" }, "enableAutoDetect": { - "message": " Paganahin ang Autodetect" + "message": " Paganahin ang autodetect" }, "enableEIP1559V2": { "message": "Paganahin ang Pinahusay na UI ng Singil sa Gas" @@ -1043,7 +1140,7 @@ "message": "Na-update na namin kung paano gumagana ang pagtantiya at pag-customize ng singil sa gas." }, "enableEIP1559V2ButtonText": { - "message": "I-on sa Settings ang Pinahusay na UI ng Singil sa Gas" + "message": "I-on sa Settings ang pinahusay na UI ng singil sa gas" }, "enableEIP1559V2Description": { "message": "Na-update na namin kung paano gumagana ang pagtantiya at pag-customize ng gas. I-on kung gusto mong gamitin ang bagong karanasan sa gas. $1", @@ -1062,7 +1159,7 @@ "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" + "message": "Payagan ang mga smart transaction" }, "enableToken": { "message": "paganahin ang $1", @@ -1079,7 +1176,7 @@ "message": "Pumasa ka sa test - panatilihing ligtas ang iyong Secret Recovery Phrase, responsibilidad mo ito!" }, "endOfFlowMessage10": { - "message": "Tapos Na Lahat" + "message": "Tapos na lahat" }, "endOfFlowMessage2": { "message": "Mga tip sa ligtas na pag-store nito" @@ -1110,8 +1207,17 @@ "message": "Nagbalik ang endpoint ng ibang chain ID: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "Pinahusay na pagtuklas ng token" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "Ang pinahusay na pagtuklas ng token ay kasalukuyang magagamit sa $1. $2" + }, + "enhancedTokenDetectionDescription": { + "message": "Pinagsasama-sama ng ConsenSys' token API ang isang listahan ng mga token mula sa iba't ibang listahan ng token ng third party. Kapag naka-on, ang mga token ay awtomatikong matutukoy, at mahahanap, sa Ethereum mainnet, Binance, Polygon at Avalanche. Kapag naka-off, ang awtomatikong pagtuklas at paghahanap ay maaari lamang gawin sa Ethereum mainnet." + }, "ensIllegalCharacter": { - "message": "Mga ilegal na Character para sa ENS." + "message": "Mga ilegal na character para sa ENS." }, "ensNotFoundOnCurrentNetwork": { "message": "Hindi nahanapa ang ENS name sa kasalukuyang network. Subukang lumipat sa Ethereum Mainnet." @@ -1123,10 +1229,10 @@ "message": "Nagka-error sa pag-register ng ENS name" }, "ensUnknownError": { - "message": "Bigong Makita ang ENS." + "message": "Bigong makita ang ENS." }, "enterMaxSpendLimit": { - "message": "Ilagay ang Max na Limitasyon sa Paggastos" + "message": "Ilagay ang max na limitasyon sa paggastos" }, "enterPassword": { "message": "Ilagay ang password" @@ -1166,14 +1272,11 @@ "message": "Stack:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Mga Tinatantyang Tagal ng Pagproseso" - }, "ethGasPriceFetchWarning": { "message": "Ang backup gas price ay inilalaan dahil ang pangunahing pagtantiya ng presyo ng gas ay hindi available sa ngayon." }, "ethereumPublicAddress": { - "message": "Pampublikong Address ng Ethereum" + "message": "Pampublikong address ng ethereum" }, "etherscan": { "message": "Etherscan" @@ -1214,9 +1317,6 @@ "fast": { "message": "Mabilis" }, - "fastest": { - "message": "Pinakamabilis" - }, "feeAssociatedRequest": { "message": "May nauugnay na bayarin para sa request na ito." }, @@ -1526,6 +1626,12 @@ "importNFTs": { "message": "I-import ang mga NFT" }, + "importSelectedTokens": { + "message": "I-import ang mga napiling token?" + }, + "importSelectedTokensDescription": { + "message": "Tanging ang mga token na iyong pinili ang lalabas sa iyong wallet. Maaari kang palaging mag-import ng mga nakatagong token sa ibang pagkakataon sa pamamagitan ng paghahanap sa mga ito." + }, "importTokenQuestion": { "message": "I-import ang token?" }, @@ -1552,6 +1658,9 @@ "message": "Na-import", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "sa iyong Mga Setting" + }, "infuraBlockedNotification": { "message": "Hindi makakonekta ang MetaMask sa blockchain host. I-review ang posibleng mga dahilan $1.", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "Nakumpirma na ng network ang iyong inisyal na transaksyon. I-click ang OK para bumalik." }, + "install": { + "message": "I-install" + }, "insufficientBalance": { "message": "Hindi sapat ang balanse." }, @@ -1654,27 +1766,21 @@ "message": "JSON File", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "upang masubaybayan ang iyong mga token at NFT sa mga account at network." + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Mga Tutorial)" - }, "knownAddressRecipient": { "message": "Kilalang address ng kontrata." }, "knownTokenWarning": { "message": "Mae-edit ng aksyong ito ang mga token na nakalista na sa iyong wallet, na puwedeng gamitin para i-phish ka. Aprubahan lang kung sigurado kang gusto mong baguhin kung ano ang kinakatawan ng mga token na ito. Alamin pa ang tungkol sa $1" }, - "kovan": { - "message": "Kovan Test Network" - }, "lastConnected": { "message": "Huling Kumonekta" }, - "learmMoreAboutGas": { - "message": "Gusto mo bang $1 ang tungkol sa gas?" - }, "learnCancelSpeeedup": { "message": "Alamin kung paano sa $1", "description": "$1 is link to cancel or speed up transactions" @@ -1682,6 +1788,10 @@ "learnMore": { "message": "matuto pa" }, + "learnMoreAboutGas": { + "message": "Gusto mo bang $1 ang tungkol sa gas?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Matuto pa" }, @@ -1947,6 +2057,10 @@ "name": { "message": "Pangalan" }, + "nativeToken": { + "message": "Ang native token sa network na ito ay $1. Ito ang token na ginagamit para sa mga gas fee.", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "Para makipag-ugnayan sa mga desentralisadong applicaiton gamit ang MetaMask, kakailanganin mo ng $1 sa iyong wallet.", "description": "$1 represents the cypto symbol to be purchased" @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -2033,6 +2150,9 @@ "nevermind": { "message": "Huwag na" }, + "new": { + "message": "Bago!" + }, "newAccount": { "message": "Bagong Account" }, @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "Na-import ang token" }, - "newTotal": { - "message": "Bagong Kabuuan" - }, - "newTransactionFee": { - "message": "Bagong Bayarin sa Transaksyon" - }, "newValues": { "message": "bagong value" }, @@ -2094,7 +2208,7 @@ "message": "NFT" }, "nftTokenIdPlaceholder": { - "message": "Ilagay ang collectible ID" + "message": "Ilagay ang token id" }, "nfts": { "message": "Mga NFT" @@ -2112,10 +2226,10 @@ "message": "Hindi, may Secret Recovery Phrase na ako" }, "noConversionDateAvailable": { - "message": "Walang Available na Petsa sa Pag-convert ng Currency" + "message": "Walang available na petsa sa pag-convert ng currency" }, "noConversionRateAvailable": { - "message": "Hindi Available ang Rate ng Conversion" + "message": "Hindi available ang rate ng conversion" }, "noNFTs": { "message": "Wala pang mga NFT" @@ -2148,7 +2262,7 @@ "message": "I-on ito para baguhin ang nonce (numero ng transaksyon) sa mga screen ng kumpirmasyon. Isa itong advanced na feature, gamitin nang may pag-iingat." }, "nonceFieldHeading": { - "message": "Custom na Nonce" + "message": "Custom na nonce" }, "notBusy": { "message": "Hindi busy" @@ -2203,6 +2317,23 @@ "notifications13Title": { "message": "Magdagdag ng mga Sikat na Network" }, + "notifications14ActionText": { + "message": "Ipakita ang mga backup na setting" + }, + "notifications14Description": { + "message": "Inaalis na namin ang aming tampok na 3Box data sa unang bahagi ng Oktubre. Upang i-backup at i-restore nang manu-mano ang iyong wallet, gamitin ang button na \"I-backup ngayon\" sa Mga Advanced na Setting.", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "Pagtutol sa 3Box" + }, + "notifications15Description": { + "message": "Walang kinakailangang aksyon mula sa iyo, kaya patuloy na gamitin ang iyong wallet gaya ng dati. Magkaroon ng kamalayan sa mga potensyal na scam sa paligid ng Merge.", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "Narito na ang Ethereum Merge!" + }, "notifications1Description": { "message": "Ang mga user ng MetaMask Mobile ay maaari na ngayong mag-swap ng mga token sa loob ng kanilang mobile wallet. I-scan ang QR code para makuha ang mobile app at magsimulang mag-swap.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "Markahan ang lahat bilang nabasa na" }, + "numberOfNewTokensDetectedPlural": { + "message": "$1 (na) bagong token ang nakita sa account na ito", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "1 bagong token ang nakita sa account na ito" + }, "ofTextNofM": { "message": "ng" }, @@ -2384,6 +2522,9 @@ "message": "Buksan ang MetaMask sa buong screen para ikonekta ang ledger mo sa pamamagitan ng WebHID.", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "Buksan sa block explorer" + }, "optional": { "message": "Opsyonal" }, @@ -2456,6 +2597,12 @@ "permissionRequestCapitalized": { "message": "Kahilingan sa Pahintulot" }, + "permissionRequested": { + "message": "Ni-request ngayon" + }, + "permissionRevoked": { + "message": "Pinawalang-bisa sa update na ito" + }, "permission_accessNetwork": { "message": "I-access ang Internet.", "description": "The description of the `endowment:network-access` permission." @@ -2476,9 +2623,13 @@ "message": "Patakbuhin ng walang katapusan.", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "Kontrolin ang iyong mga account at asset sa ilalim ng $1 ($2).", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "Kontrolin ang iyong mga account at asset sa \"$1\".", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "Iimbak at pamahalaan ang datos nito sa iyong device.", @@ -2488,10 +2639,18 @@ "message": "Ipakita ang mga notipikasyon.", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "Kunin at ipakita ang mga insight sa transaksyon.", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "Hindi kilalang pahintulot: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "Tingnan ang iyong pampublikong key para sa $1 ($2).", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "Mga Pahintulot" }, @@ -2508,6 +2667,9 @@ "popularCustomNetworks": { "message": "Mga sikat na custom na network" }, + "portfolioSite": { + "message": "Site ng portfolio" + }, "preferredLedgerConnectionType": { "message": "Napiling Uri ng Ledger Connection", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" @@ -2688,9 +2850,17 @@ "restore": { "message": "I-restore" }, - "restoreWalletPreferences": { - "message": "Nakita ang backup ng iyong data mula sa $1. Gusto mo bang i-restore ang mga kagustuhan mo sa wallet?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "Hindi ma-restore ang iyong datos mula sa file na ibinigay" + }, + "restoreSuccessful": { + "message": "Ang iyong datos ay matagumpay na naibalik" + }, + "restoreUserData": { + "message": "Ibalik ang datos ng user" + }, + "restoreUserDataDescription": { + "message": "Maaari mong ibalik ang mga setting ng user na naglalaman ng mga kagustuhan at mga address ng account mula sa isang dating na-back up na JSON file." }, "retryTransaction": { "message": "Subukan Ulit ang Transaksyon" @@ -2721,11 +2891,8 @@ "message": "Sa pamamagitan ng pagbawi ng pahintulot, hindi na maa-access ng sumusunod na $1 ang iyong $2", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Rinkeby Test Network" - }, - "ropsten": { - "message": "Ropsten Test Network" + "revokeSpendingCapTooltipText": { + "message": "Hindi na magagawang gastusin pa ng kontratang ito ang iyong mga pangkasalukuyan o panghinaharap na mga token." }, "rpcUrl": { "message": "Bagong RPC URL" @@ -2838,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "Isulat ang iyong Secret Recovery Phrase" }, - "selectAHigherGasFee": { - "message": "Pumili ng mas malaking bayarin sa gas para mapabilis ang pagproseso ng iyong transaksyon.*" - }, "selectAccounts": { "message": "Pumili ng (mga) account" }, @@ -2874,9 +3038,6 @@ "send": { "message": "Magpadala" }, - "sendAmount": { - "message": "Halaga ng Ipapadala" - }, "sendBugReport": { "message": "Padalhan kami ng ulat ng bug." }, @@ -2901,6 +3062,9 @@ "message": "Babala: magpapadala ka sa isang kontrata ng token na maaaring magresulta sa pagkawala ng mga pondo. $1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "Sepolia test network" + }, "setAdvancedPrivacySettings": { "message": "Magtakda ng advanced privacy settings" }, @@ -2933,12 +3097,6 @@ "showAdvancedGasInlineDescription": { "message": "Piliin ito para direktang maipakita ang presyo ng gas at mga kontrol sa limitasyon sa mga screen ng pagpapadala at pagkumpirma." }, - "showCustomNetworkList": { - "message": "Ipakita ang Listahan ng Custom na Network" - }, - "showCustomNetworkListDescription": { - "message": "Piliin ito para magpakita ng listahan ng mga network na may prefilled na mga detalye kapag nagdaragdag ng bagong network." - }, "showFiatConversionInTestnets": { "message": "Ipakita ang Conversion sa Testnets" }, @@ -2993,6 +3151,9 @@ "signed": { "message": "Nilagdaan" }, + "signin": { + "message": "Mag-sign In" + }, "simulationErrorMessageV2": { "message": "Hindi namin nagawang tantyahin ang gas. Maaaring may error sa kontrata at maaaring mabigo ang transaksyong ito." }, @@ -3005,9 +3166,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." }, - "slow": { - "message": "Mabagal" - }, "smartTransaction": { "message": "Smart Transaction" }, @@ -3019,6 +3177,10 @@ "message": "Idinagdag noong $1 mula sa $2", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "Snap Error: '$1'. Error Code: '$2'", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -3029,12 +3191,32 @@ "snapInstallWarningCheck": { "message": "Para kumpirmahing naunawaan mo, tsekan lahat." }, + "snapInstallWarningCheckPlural": { + "message": "Para kumpirmahin na naiintindihan mo, lagyan ng tsek ang lahat ng kahon." + }, + "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.", + "description": "The first parameter is the name of the snap and the second one is the protocol" + }, "snapRequestsPermission": { "message": "Hinihiling ng snap na ito ang mga sumusunod na pahintulot:" }, + "snapUpdate": { + "message": "I-update ang Snap" + }, + "snapUpdateExplanation": { + "message": "Kailangan ng $1 ng bagong bersyon ng iyong snap.", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "Mga Snap" }, + "snapsInsightLoading": { + "message": "Naglo-load ng insight sa transaksyon..." + }, + "snapsNoInsight": { + "message": "Ang snap ay hindi nagbalik ng anumang insight" + }, "snapsSettingsDescription": { "message": "Pamahalaan ang iyong mga Snap" }, @@ -3479,6 +3661,9 @@ "swapReviewSwap": { "message": "I-review ang Pag-swap" }, + "swapSearchNameOrAddress": { + "message": "Hanapin ang pangalan o i-paste ang address" + }, "swapSelect": { "message": "Piliin" }, @@ -3498,6 +3683,9 @@ "message": "$1%", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "Kung magbabago ang presyo sa pagitan ng oras na nailagay at nakumpirma ang iyong order, tinatawag itong \"slippage\". Awtomatikong makakansela ang iyong swap kung lalampas ang slippage sa iyong setting ng “pagpapahintulot sa slippage”." + }, "swapSource": { "message": "Pinagkunan ng liquidity" }, @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "Lumipat sa account na ito" }, + "switchedTo": { + "message": "Lumipat ka sa" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "Ang paglipat ng mga network ay magkakansela ng lahat ng nakabinbin na mga kumpirmasyon" }, @@ -3643,15 +3834,6 @@ "syncWithMobileTitle": { "message": "I-sync sa mobile" }, - "syncWithThreeBox": { - "message": "I-sync ang data sa 3Box (pinag-eeksperimentuhan)" - }, - "syncWithThreeBoxDescription": { - "message": "I-on para ma-back up ang iyong mga setting sa 3Box. Kasalukuyang pinag-eeksperimentuhan ang feature na ito; gamitin sa sarili mong pagpapasya." - }, - "syncWithThreeBoxDisabled": { - "message": "Na-disable ang 3Box dahil sa isang error sa unang pag-sync" - }, "tenPercentIncreased": { "message": "10% na dagdag" }, @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "Piliin ang mas gusto mong tema ng MetaMask." }, + "thingsToKeep": { + "message": "Mga bagay na dapat tandaan:" + }, "thisWillCreate": { "message": "Gagawa ito ng bagong wallet at Secret Recovery Phrase" }, @@ -3714,12 +3899,21 @@ "tokenDetails": { "message": "Mga detalye ng token" }, + "tokenFoundTitle": { + "message": "1 bagong token ang nakita" + }, "tokenId": { "message": "Token ID" }, "tokenList": { "message": "Mga listahan ng token:" }, + "tokenScamSecurityRisk": { + "message": "mga scam sa token at panganib sa seguridad" + }, + "tokenShowUp": { + "message": "Maaaring hindi awtomatikong lumabas ang iyong mga token sa iyong wallet." + }, "tokenSymbol": { "message": "Simbolo ng Token" }, @@ -3861,6 +4055,9 @@ "tryAgain": { "message": "Subukan ulit" }, + "tryOur": { + "message": "Subukan ang aming" + }, "turnOnTokenDetection": { "message": "I-on ang pinahusay na pag-detect ng token" }, @@ -3917,6 +4114,10 @@ "message": "Hindi nakikilala ang custom network na ito. Nirerekomenda namin na ikaw ay $1 bago magpatuloy", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (Hindi nakikilalang protocol)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "Ang pagpapadala ng collectible (ERC-721) token ay kasalukuyang hindi magagamit", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -4034,6 +4235,10 @@ "warning": { "message": "Babala" }, + "warningTooltipText": { + "message": "$1 Maaaring gastusin ng kontrata ang iyong buong balanse ng token nang walang karagdagang abiso o pahintulot. Protektahan ang iyong sarili sa pamamagitan ng pag-customize ng mas mababang limitasyon sa paggastos.", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "Madali" }, diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index bf08426a3a65..71d8b4c854fa 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -44,12 +44,59 @@ "QRHardwareWalletSteps2Description": { "message": "AirGap Vault & Ngrave (Çok Yakında)" }, + "SIWEAddressInvalid": { + "message": "Giriş talebindeki adres, giriş yapmak için kullandığınız hesapla uyumlu değil." + }, + "SIWEDomainWarningBody": { + "message": "Web sitesi ($1) yanlış alana giriş yapmanızı istiyor. Bu bir dolandırıcılık saldırısı olabilir.", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "Zincir Kimliği:" + }, + "SIWELabelExpirationTime": { + "message": "Son kullanma tarihi:" + }, + "SIWELabelIssuedAt": { + "message": "Düzenlenme tarihi:" + }, + "SIWELabelMessage": { + "message": "Mesaj:" + }, + "SIWELabelNonce": { + "message": "Geçici anahtar:" + }, + "SIWELabelNotBefore": { + "message": "En Erken:" + }, + "SIWELabelRequestID": { + "message": "Talep Kimliği:" + }, + "SIWELabelResources": { + "message": "Kaynaklar: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "Sürüm:" + }, + "SIWESiteRequestSubtitle": { + "message": "Bu site şununla giriş yapmak istiyor:" + }, + "SIWESiteRequestTitle": { + "message": "Giriş talebi" + }, + "SIWEWarningSubtitle": { + "message": "Anladığınızı doğrulamak için şunu işaretleyin:" + }, + "SIWEWarningTitle": { + "message": "Emin misiniz?" + }, "about": { "message": "Hakkında" }, - "acceleratingATransaction": { - "message": "* Daha yüksek bir gaz fiyatı kullanarak bir işlemi hızlandırmak ağ tarafından daha hızlı işlenme şansını artırır ancak her zaman garanti etmez." - }, "acceptTermsOfUse": { "message": "$1 bölümünü okudum ve kabul ediyorum", "description": "$1 is the `terms` message" @@ -121,11 +168,14 @@ "addAlias": { "message": "Diğer adı ekle" }, + "addBlockExplorer": { + "message": "Bir blok gezgini ekle" + }, "addContact": { "message": "Kişi ekle" }, "addCustomToken": { - "message": "Özel Token Ekle" + "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.", @@ -209,9 +259,6 @@ "airgapVault": { "message": "AirGap Kasası" }, - "airgapVaultTutorial": { - "message": "(Öğreticiler)" - }, "alertDisableTooltip": { "message": "\"Ayarlar > Uyarılar\" kısmında değiştirilebilir" }, @@ -271,12 +318,15 @@ "message": "Harcama limitini onayla" }, "approveAllTokensTitle": { - "message": "Sahip olduğunuz tüm $1 için erişim izni verilsin mi?", + "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" }, @@ -293,6 +343,10 @@ "approvedAsset": { "message": "Onaylanan varlık" }, + "approvedOn": { + "message": "$1 üzerinde onaylandı", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "Emin misin?" }, @@ -305,6 +359,9 @@ "assets": { "message": "Varlıklar" }, + "attemptSendingAssets": { + "message": "Varlıkları doğrudan bir ağdan diğerine göndermeye çalışırsanız bu durum kalıcı varlık kaybına neden olabilir. Bir köprü kullandığınızdan emin olun." + }, "attemptToCancel": { "message": "İptal etmeyi Dene?" }, @@ -335,6 +392,9 @@ "backToAll": { "message": "Tümüne Geri Git" }, + "backup": { + "message": "Yedekle" + }, "backupApprovalInfo": { "message": "Bu gizli kod, cihazınızı kaybetmeniz, parolanızı unutmanız, MetaMask'ı yeniden kurmanızın gerektiği ya da cüzdanınıza başka bir cihazdan oturum açmak istemeniz durumunda cüzdanınıza erişim sağlamak için gereklidir." }, @@ -344,6 +404,12 @@ "backupNow": { "message": "Şimdi yedekle" }, + "backupUserData": { + "message": "Verilerini yedekle" + }, + "backupUserDataDescription": { + "message": "Tercihleri ve hesap adreslerini içeren kullanıcı ayarlarını JSON dosyasına yedekleyebilirsiniz." + }, "balance": { "message": "Bakiye" }, @@ -356,6 +422,9 @@ "basic": { "message": "Temel" }, + "beCareful": { + "message": "Dikkatli olun" + }, "betaMetamaskDescription": { "message": "Milyonların güvendiği MetaMask, web3 dünyasını herkes için erişilebilir kılan güvenli bir cüzdandır." }, @@ -372,6 +441,9 @@ "betaMetamaskVersion": { "message": "MetaMask Beta Sürümü" }, + "betaPortfolioSite": { + "message": "portföy sitemizi deneyin" + }, "betaWelcome": { "message": "MetaMask Beta Sürümüne Hoş Geldiniz" }, @@ -507,6 +579,9 @@ "message": "WebHID üzerinden Kayıt Defterinizi bağlamak için tıklayın", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "Tokenleri manuel olarak eklemek için buaraya tıklayın." + }, "clickToRevealSeed": { "message": "Gizli kelimeleri görmek için buraya tıklayın" }, @@ -523,6 +598,16 @@ "confirm": { "message": "Onayla" }, + "confirmPageDialogSetApprovalForAll": { + "message": "Gelecekte sahip olabileceğiniz her şey dahil olmak üzere şuna erişim izni veriyorsunuz: $1. Diğer uçtaki taraf siz bu onayı geri çekene kadar dilediği zaman size sormadan cüzdanınızdan NFT transfer edebilir. $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "bu sözleşmedeki tüm NFT'ler" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "Dikkatli bir şekilde devam edin." + }, "confirmPassword": { "message": "Şifreyi onayla" }, @@ -616,17 +701,11 @@ "connectingToGoerli": { "message": "Goerli Test Ağına Bağlanıyor" }, - "connectingToKovan": { - "message": "Kovan Test Ağına bağlanıyor" - }, "connectingToMainnet": { "message": "Ethereum Mainnet ağına bağlanıyor" }, - "connectingToRinkeby": { - "message": "Rinkeby Test Ağına bağlanıyor" - }, - "connectingToRopsten": { - "message": "Ropsten Test Ağına bağlanıyor" + "connectingToSepolia": { + "message": "Sepolia test ağına bağlanılıyor" }, "contactUs": { "message": "Bize ulaşın" @@ -661,9 +740,21 @@ "contractDeployment": { "message": "Sözleşme kurulumu" }, + "contractDescription": { + "message": "Kendinizi dolandırıcılara karşı korumak için bir dakikanızı ayırarak sözleşme bilgilerini doğrulayın." + }, "contractInteraction": { "message": "Sözleşme Etkileşimi" }, + "contractRequestingSpendingCap": { + "message": "Sözleşmede harcama üst limiti talep ediliyor" + }, + "contractTitle": { + "message": "Sözleşme ayrıntıları" + }, + "contractToken": { + "message": "Token sözleşmesi" + }, "convertTokenToNFTDescription": { "message": "Bu varlığın bir NFT olduğunu tespit ettik. MetaMask artık NFT'ler için tam yerel desteğe sahiptir. Bunu token listenden çıkarmak ve bir NFT olarak eklemek ister misin?" }, @@ -742,19 +833,16 @@ "customContentSearch": { "message": "Önceden eklenmiş bir ağı ara" }, - "customGas": { - "message": "Gazı Özelleştir" - }, "customGasSettingToolTipMessage": { "message": "Gaz fiyatını özelleştirmek için $1 kullanın. Bu, bilgi sahibi değilseniz kafa karıştırıcı olabilir. Riski size ait olmak üzere kullanın.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "Ücretin artırılması işlem süresini kısaltabilir ancak bu garanti edilmez." - }, "customSpendLimit": { "message": "Özel Harcama Limiti" }, + "customSpendingCap": { + "message": "Özel harcama üst limiti" + }, "customToken": { "message": "Özel Token" }, @@ -764,6 +852,9 @@ "customTokenWarningInTokenDetectionNetwork": { "message": "Bir token'ı manuel olarak içe aktarmadan önce, ona güvendiğinden emin ol. $1 hakkında bilgi edin." }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "Bir tokeni içe aktarmadan önce ona güvendiğinizden emin olun. $1 kaçınmayı öğrenin. Ayrıca token algılamayı $2 etkinleştirebilirsiniz." + }, "customerSupport": { "message": "müşteri hizmetleri" }, @@ -787,8 +878,8 @@ "data": { "message": "Veri" }, - "dataBackupFoundInfo": { - "message": "MetaMask'ın önceki bir kurulumu sırasında hesap verilerinizden bazıları yedeklenmiştir. Buna ayarlar, kişiler ve tokenler dahil olabilir. Bu verileri şimdi geri yüklemek ister misiniz?" + "dataBackupSeemsCorrupt": { + "message": "Verileriniz geri yüklenemedi. Dosyanın bozuk olduğu algılandı." }, "dataHex": { "message": "On Altılı" @@ -835,6 +926,12 @@ "message": "$1 yatır", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "Daha fazla bilgi edinin" + }, + "deprecatedTestNetworksMsg": { + "message": "Ethereum'da yaşanan protokol değişikliklerinden dolayı: Rinkeby, Ropsten, Kovan test ağları güvenilir bir şekilde çalışmayabilir ve yakında kullanım dışı olacak." + }, "description": { "message": "Açıklama" }, @@ -1094,7 +1191,7 @@ "message": "Kimlik avına karşı dikkatli olun! MetaMask asla kendiliğinden Gizli Kurtarma İfadenizi istemez." }, "endOfFlowMessage6": { - "message": "Gizli Kurtarma İfadenizi tekrar yedeklemeniz gerekirse Ayarlar -> Güvenlik kısmında bulabilirsiniz." + "message": "Gizli Kurtarma İfadeni yedeklemen gerekirse Ayarlar -> Güvenlik kısmında bulabilirsin." }, "endOfFlowMessage7": { "message": "Sorularınız olursa veya şüpheli bir şeyler görürseniz $1 destek bölümüze ulaşın.", @@ -1110,6 +1207,15 @@ "message": "Bitiş noktası farklı bir zincir kimliğine ulaştı: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "Gelişmiş token algılama" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "Gelişmiş token algılama şu anda $1 üzerinden kullanılabilir. $2" + }, + "enhancedTokenDetectionDescription": { + "message": "ConsenSys token API, çeşitli üçüncü taraf token listelerinden token listesi toplar. Açıldığında, tokenler Ethereum ana ağı, Binance, Polygon ve Avalanche üzerinde otomatik olarak algılanır ve aratılabilir. Kapatıldığında otomatik algılama ve arama sadece Ethereum ana ağı üzerinde yapılabilir." + }, "ensIllegalCharacter": { "message": "ENS için Uygun Olmayan Karakter." }, @@ -1166,9 +1272,6 @@ "message": "Yığın:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Tahmini işleme Alınma Süreleri" - }, "ethGasPriceFetchWarning": { "message": "Ana gaz tahmini hizmeti olarak sunulan yedek gaz fiyatı şu anda kullanılamıyor." }, @@ -1214,9 +1317,6 @@ "fast": { "message": "Hızlı" }, - "fastest": { - "message": "En hızlı" - }, "feeAssociatedRequest": { "message": "Bu talep ile ilişkili bir ücret mevcuttur." }, @@ -1309,7 +1409,7 @@ "message": "Düşük, orta ve yüksek tahminlerimiz mevcut değil." }, "gasFee": { - "message": "Gas Ücreti" + "message": "Gaz Ücreti" }, "gasLimit": { "message": "Gaz Limiti" @@ -1526,6 +1626,12 @@ "importNFTs": { "message": "NFS'leri İçe Aktar" }, + "importSelectedTokens": { + "message": "Seçilen tokenleri içe aktar?" + }, + "importSelectedTokensDescription": { + "message": "Sadece seçtiğiniz tokenler cüzdanınızda gösterilecek. Dilediğiniz zaman onları arayarak gizli tokenleri içe aktarabilirsiniz." + }, "importTokenQuestion": { "message": "Tokeni içe aktar?" }, @@ -1552,6 +1658,9 @@ "message": "İçe Aktarıldı", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "Ayarlar kısmında" + }, "infuraBlockedNotification": { "message": "MetaMask blokzincir ana bilgisayarına bağlanamıyor. $1 olası nedenleri inceleyin.", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "İlk işleminiz ağ tarafından onaylanmıştır. Geri gitmek için Tamam düğmesine tıklayın." }, + "install": { + "message": "Yükleyin" + }, "insufficientBalance": { "message": "Bakiye yetersiz." }, @@ -1654,27 +1766,21 @@ "message": "JSON Dosyası", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "hesaplar ve ağlar arasında tokenlerinizin ve NFT'lerinizin sekmelerini korumak için." + }, "keystone": { "message": "Ana İlke" }, - "keystoneTutorial": { - "message": " (Öğreticiler)" - }, "knownAddressRecipient": { "message": "Bilinen sözleşme adresi." }, "knownTokenWarning": { "message": "Bu eylem kimlik avı için kullanılabilecek şekilde cüzdanınızda zaten listelenmiş olan tokenleri düzenleyecektir. Sadece bu tokenlerin neyi temsil ettiğini değiştirmek istediğinizden eminseniz onaylayın. $1 hakkında daha fazla bilgi edinin" }, - "kovan": { - "message": "Kovan Test Ağı" - }, "lastConnected": { "message": "Son Bağlanma" }, - "learmMoreAboutGas": { - "message": "Gaz hakkında $1 istiyor musunuz?" - }, "learnCancelSpeeedup": { "message": "Nasıl $1 yapacağınızı öğrenin", "description": "$1 is link to cancel or speed up transactions" @@ -1682,6 +1788,10 @@ "learnMore": { "message": "daha fazla bilgi" }, + "learnMoreAboutGas": { + "message": "Gaz hakkında $1 istiyor musunuz?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Daha fazla bilgi" }, @@ -1947,6 +2057,10 @@ "name": { "message": "Adı" }, + "nativeToken": { + "message": "Bu ağdaki yerli token $1. Bu gaz ücretleri için kullanılan tokendir.", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "MetaMask kullanarak merkezi olmayan uygulamalarla etkileşim kurmak için cüzdanında $1 bulunmasına ihtiyacın olacak.", "description": "$1 represents the cypto symbol to be purchased" @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -2033,6 +2150,9 @@ "nevermind": { "message": "Boşver" }, + "new": { + "message": "Yeni!" + }, "newAccount": { "message": "Yeni Hesap" }, @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "Token içe aktarıldı" }, - "newTotal": { - "message": "Yeni Toplam" - }, - "newTransactionFee": { - "message": "Yeni İşlem Ücreti" - }, "newValues": { "message": "yeni değerler" }, @@ -2197,12 +2311,29 @@ "message": "Özel ağ listesini göster" }, "notifications13Description": { - "message": "Artık şu popüler özel ağları kolayca ekleyebilirsiniz: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm ve Polygon! Bu özelliği etkinleştirmek için Ayarlar -> Deneysel kısmına gidip \"Özel ağ listesini göster\" seçeneğini açın!", + "message": "Artık şu popüler özel ağları kolayca ekleyebilirsin: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm ve Polygon! Bu özelliği etkinleştirmek için Ayarlar -> Deneysel kısmına gidip \"Özel ağ listesini göster\" seçeneğini aç!", "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." }, "notifications13Title": { "message": "Popüler Ağları Ekle" }, + "notifications14ActionText": { + "message": "Yedek ayarlarını göster" + }, + "notifications14Description": { + "message": "Ekim aynın başlarında 3Box veri özelliğini devre dışı bırakıyoruz. Cüzdanınızı manuel olarak yedeklemek ve geri yüklemek için Gelişmiş Ayarlar bölümündeki \"Şimdi yedekle\" düğmesini kullanın.", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "3Box Sonlanımı" + }, + "notifications15Description": { + "message": "Sizin tarafınızdan yapılması gereken herhangi bir işlem yoktur bu nedenle cüzdanınızı her zaman olduğu gibi kullanmaya devam edin. Birleşme ile ilgili olası dolandırıcılıklara karşı dikkatli olun.", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "Ethereum Birleşmesi başladı!" + }, "notifications1Description": { "message": "MetaMask Mobil kullanıcıları artık mobil cüzdanları içinde token takas edebilirler. Mobil uygulamayı edinmek ve takas yapmaya başlamak için QR kodunu tarayın.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2276,7 +2407,7 @@ "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": { - "message": "Daha kolay ve daha kararlı kayıt defteri deneyimi için ayarlarda Gelişmiş sekmesine gidin ve \"Tercih Edilen Kayıt Defteri Bağlantı Türünü\" \"WebHID\" olarak değiştirin.", + "message": "Daha kolay ve daha kararlı kayıt defteri deneyimi için ayarlarda Gelişmiş sekmesine git ve \"Tercih Edilen Kayıt Defteri Bağlantı Türünü\" \"WebHID\" olarak değiştir.", "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." }, "notifications8Title": { @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "Tümünü okundu olarak işaretle" }, + "numberOfNewTokensDetectedPlural": { + "message": "Bu hesapta $1 yeni token bulundu", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "Bu hesapta 1 yeni token bulundu" + }, "ofTextNofM": { "message": "/" }, @@ -2384,6 +2522,9 @@ "message": "Kayıt defterinizi WebHID üzerinden bağlamak için MetaMask'i tam ekran açın.", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "Blok gezgininde aç" + }, "optional": { "message": "İsteğe bağlı" }, @@ -2454,7 +2595,13 @@ "message": "İzin talebi" }, "permissionRequestCapitalized": { - "message": "İzin Talebi" + "message": "İzin isteği" + }, + "permissionRequested": { + "message": "Şimdi talep edildi" + }, + "permissionRevoked": { + "message": "Bu güncellemede iptal edildi" }, "permission_accessNetwork": { "message": "İnternete erişim sağla.", @@ -2476,9 +2623,13 @@ "message": "Süresiz çalıştır.", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "$1 ($2) altındaki hesaplarınızı ve varlıklarınızı kontrol edin.", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "\"$1\" hesaplarını ve varlıklarını kontrol et.", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "Verilerini cihazında sakla ve yönet.", @@ -2488,10 +2639,18 @@ "message": "Bildirimleri göster.", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "İşlem ayrıntılarını al ve görüntüle.", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "Bilinmeyen izin: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "$1 ($2) için genel anahtarınızı görüntüleyin.", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "İzinler" }, @@ -2508,6 +2667,9 @@ "popularCustomNetworks": { "message": "Popüler özel ağlar" }, + "portfolioSite": { + "message": "Portföy sitesi" + }, "preferredLedgerConnectionType": { "message": "Tercih Edilen Kayıt Defteri Bağlantı Türü", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" @@ -2688,9 +2850,17 @@ "restore": { "message": "Geri Yükle" }, - "restoreWalletPreferences": { - "message": "Verilerinizin $1 tarihinden bir yedeği bulundu. Cüzdan tercihlerinizi geri yüklemek ister misiniz?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "Sunulan dosyadan verileriniz geri yüklenemiyor" + }, + "restoreSuccessful": { + "message": "Verileriniz başarılı bir şekilde geri yüklendi" + }, + "restoreUserData": { + "message": "Kullanıcı verilerini geri yükle" + }, + "restoreUserDataDescription": { + "message": "Tercihleri ve hesap adreslerini içeren kullanıcı ayarlarını daha önce yedeklenmiş bir JSON dosyasından geri yükleyebilirsiniz." }, "retryTransaction": { "message": "İşlemi Tekrar Dene" @@ -2721,11 +2891,8 @@ "message": "İzni geri çektiğinizde aşağıdaki $1 artık $2 alanınıza erişim sağlayamayacak", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Rinkeby Test Ağı" - }, - "ropsten": { - "message": "Ropsten Test Ağı" + "revokeSpendingCapTooltipText": { + "message": "Bu sözleşme şimdiki ya da gelecekteki tokenlerinizin hiçbirini kullanamayacak." }, "rpcUrl": { "message": "Yeni RPC URL adresi" @@ -2838,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "Gizli Kurtarma İfadenizi not edin" }, - "selectAHigherGasFee": { - "message": "İşleminizin gerçekleşmesini hızlandırmak için daha yüksek bir gaz ücreti seçin.*" - }, "selectAccounts": { "message": "Bu sitede kullanılacak hesap veya hesapları seçin" }, @@ -2874,9 +3038,6 @@ "send": { "message": "Gönder" }, - "sendAmount": { - "message": "Tutarı Gönder" - }, "sendBugReport": { "message": "Bize bir hata raporu gönder." }, @@ -2901,6 +3062,9 @@ "message": "Uyarı: Para kaybı ile sonuçlanabilecek bir token sözleşmesi göndermek üzeresiniz. $1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "Sepolia test ağı" + }, "setAdvancedPrivacySettings": { "message": "Gelişmiş gizlilik ayarlarını yapın" }, @@ -2933,12 +3097,6 @@ "showAdvancedGasInlineDescription": { "message": "Gaz fiyatı ve limit kontrollerini doğrudan gönder ve onayla ekranlarında göstermek için bunu seçin." }, - "showCustomNetworkList": { - "message": "Özel Ağ Listesini Göster" - }, - "showCustomNetworkListDescription": { - "message": "Yeni bir ağ eklerken önceden doldurulan bilgilerle ağ listesini görüntülenmesi için bunu seçin." - }, "showFiatConversionInTestnets": { "message": "Test ağlarında Dönüşümü göster" }, @@ -2993,6 +3151,9 @@ "signed": { "message": "İmzalandı" }, + "signin": { + "message": "Giriş" + }, "simulationErrorMessageV2": { "message": "Gaz tahmini yapamadık. Sözleşmede bir hata olabilir ve bu işlem başarısız olabilir." }, @@ -3005,9 +3166,6 @@ "skipAccountSecurityDetails": { "message": "Gizli Kurtarma İfademi yedekleyene kadar hesaplarımı ve tüm varlıkları kaybedebileceğimi anlıyorum." }, - "slow": { - "message": "Yavaş" - }, "smartTransaction": { "message": "Akıllı İşlem" }, @@ -3019,6 +3177,10 @@ "message": "$1 tarihinde $2 alanından eklendi", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "Snap Hatası: '$1'. Hata Kodu: '$2'", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -3029,12 +3191,32 @@ "snapInstallWarningCheck": { "message": "Anladığını doğrulamak için hepsini kontrol et." }, + "snapInstallWarningCheckPlural": { + "message": "Anladığınızı kontrol etmek için tüm kutuları işaretleyin." + }, + "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.", + "description": "The first parameter is the name of the snap and the second one is the protocol" + }, "snapRequestsPermission": { "message": "Bu ek, aşağıdaki izinleri istiyor:" }, + "snapUpdate": { + "message": "Snap'i Güncelle" + }, + "snapUpdateExplanation": { + "message": "$1 için daha yeni bir snap sürümü gerekli.", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "Snap'ler" }, + "snapsInsightLoading": { + "message": "İşlem ayrıntıları yükleniyor..." + }, + "snapsNoInsight": { + "message": "Snap herhangi bir ayrıntıya ulaşamadı" + }, "snapsSettingsDescription": { "message": "Snap'lerini yönet" }, @@ -3127,7 +3309,7 @@ "message": "MetaMask Durum Günlükleri" }, "stateLogs": { - "message": "Durum Günlükleri" + "message": "Durum günlükleri" }, "stateLogsDescription": { "message": "Durum günlükleri açık hesap adreslerinizi ve gönderilen işlemleri içerir." @@ -3197,7 +3379,7 @@ "message": "Takas başarısız olurdu" }, "stxCancelledDescription": { - "message": "İşlemin başarısız olur ve gereksiz gas ücreti ödemeni önlemek amacıyla iptal edilirdi." + "message": "İşlemin başarısız oldu ve gereksiz gaz ücreti ödemeni önlemek amacıyla iptal edildi." }, "stxCancelledSubDescription": { "message": "Takasını tekrar dene. Bir dahaki sefere seni benzer risklere karşı korumak için burada olacağız." @@ -3266,7 +3448,7 @@ "message": "Takas iptal edildi" }, "stxUserCancelledDescription": { - "message": "İşlemin iptal edildi ve gereksiz gas ücreti ödemedin." + "message": "İşlemin iptal edildi ve gereksiz gaz ücreti ödemedin." }, "stxYouCanOptOut": { "message": "\nDilediğin zaman gelişmiş ayarlarda devre dışı bırakabilirsin." @@ -3281,7 +3463,7 @@ "message": "Destek" }, "supportCenter": { - "message": "Destek Merkezi bölümümüzü ziyaret edin" + "message": "Destek Merkezi bölümümüzü ziyaret et" }, "swap": { "message": "Takas" @@ -3479,6 +3661,9 @@ "swapReviewSwap": { "message": "Takası İncele" }, + "swapSearchNameOrAddress": { + "message": "İsmi arayın veya adresi yapıştırın" + }, "swapSelect": { "message": "Seç" }, @@ -3498,6 +3683,9 @@ "message": "%$1", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "Emrinizin verildiği ve onaylandığı zamanlar arasında fiyat farkı oluşursa buna \"fark\" denir. Fark, \"fark toleransı\" ayarınızı aşarsa takas işleminiz otomatik olarak iptal edilir." + }, "swapSource": { "message": "Likidite kaynağı" }, @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "Bu hesaba geç" }, + "switchedTo": { + "message": "Şuna geçiş yaptınız:" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "Ağ değiştirmek bekleyen tüm onayları iptal eder" }, @@ -3643,15 +3834,6 @@ "syncWithMobileTitle": { "message": "Mobil ile senkronize et" }, - "syncWithThreeBox": { - "message": "Verileri 3Box ile senkronize et (deneysel)" - }, - "syncWithThreeBoxDescription": { - "message": "Ayarlarınızın 3Box ile yedeklenmesini sağlamak için açın. Bu özellik şu anda deney aşamasındadır; kullanım riski size aittir." - }, - "syncWithThreeBoxDisabled": { - "message": "İlk senkronizasyon işlemi sırasındaki bir hata nedeniyle 3Box devre dışı bırakıldı" - }, "tenPercentIncreased": { "message": "%10 artış" }, @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "Tercih ettiğin MetaMask temasını seç." }, + "thingsToKeep": { + "message": "Unutulmaması gerekenler:" + }, "thisWillCreate": { "message": "Bu, yeni bir cüzdan ve Gizli Kurtarma İfadesi oluşturacaktır" }, @@ -3714,12 +3899,21 @@ "tokenDetails": { "message": "Token bilgileri" }, + "tokenFoundTitle": { + "message": "1 yeni token bulundu" + }, "tokenId": { "message": "Token Kimliği" }, "tokenList": { "message": "Token listeleri:" }, + "tokenScamSecurityRisk": { + "message": "token dolandırıcılıkları ve güvenlik riskleri" + }, + "tokenShowUp": { + "message": "Tokenleriniz cüzdanınızda otomatik olarak görünmeyebilir." + }, "tokenSymbol": { "message": "Token Sembolü" }, @@ -3861,6 +4055,9 @@ "tryAgain": { "message": "Tekrar dene" }, + "tryOur": { + "message": "Beta" + }, "turnOnTokenDetection": { "message": "Gelişmiş token algılamayı açın" }, @@ -3914,9 +4111,13 @@ "message": "Merkezi olmayan web sizi bekliyor" }, "unrecognizedChain": { - "message": "Bu özel ağ tanınmadı. Devam etmeden önce $1 öneririz", + "message": "Bu özel ağ tanınmadı", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (Tanınmayan protokol)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "Toplanabilir (ERC-721) tokenlerin gönderilmesi şu anda desteklenmiyor", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -4034,6 +4235,10 @@ "warning": { "message": "Uyarı" }, + "warningTooltipText": { + "message": "$1 Sözleşme, başkaca bildiri ya da rıza olmaksızın tüm token bakiyenizi harcayabilir. Düşük bir harcama limitini özelleştirerek kendinizi koruyun.", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "Zayıf" }, @@ -4049,7 +4254,7 @@ "message": "MetaMask'e Hoşgeldiniz" }, "welcomeBack": { - "message": "Tekrar Hoş Geldiniz!" + "message": "Tekrar Hoş Geldin!" }, "welcomeExploreDescription": { "message": "Kripto paraları ve varlıkları saklayın, gönderin ve harcayın." diff --git a/app/_locales/uk/messages.json b/app/_locales/uk/messages.json index 2b47cd8d45ef..14a340c552ae 100644 --- a/app/_locales/uk/messages.json +++ b/app/_locales/uk/messages.json @@ -8,9 +8,6 @@ "about": { "message": "Про Google Chrome" }, - "acceleratingATransaction": { - "message": "* Прискорення транзакції за допомогою вищих цін на газ підвищує її шанси бути обробленою мережею швидше, але це не завжди гарантовано." - }, "accessingYourCamera": { "message": "Отримуємо доступ до вашої камери..." }, @@ -193,18 +190,9 @@ "connectingToGoerli": { "message": "Підключення до тестової мережі Goerli" }, - "connectingToKovan": { - "message": "Підключення до тестової мережі Kovan" - }, "connectingToMainnet": { "message": "З'єднуємось з Головною мережею Ethereum" }, - "connectingToRinkeby": { - "message": "Під'єднуємось до тестової мережі Rinkeby" - }, - "connectingToRopsten": { - "message": "Під'єднуємось до Тестової мережі Ropsten" - }, "continueToWyre": { "message": "Продовжити у Wyre" }, @@ -250,12 +238,6 @@ "custom": { "message": "Розширені" }, - "customGas": { - "message": "Налаштувати пальне" - }, - "customGasSubTitle": { - "message": "Збільшення комісії може призвести до зменшення часу обробки, але це не гарантується." - }, "customToken": { "message": "Користувацький токен" }, @@ -340,9 +322,6 @@ "enterPasswordContinue": { "message": "Введіть пароль, щоб продовжити" }, - "estimatedProcessingTimes": { - "message": "Приблизні часи обробки" - }, "ethereumPublicAddress": { "message": "Публічна адреса Ethereum" }, @@ -503,9 +482,6 @@ "knownAddressRecipient": { "message": "Відома контрактна адреса." }, - "kovan": { - "message": "Тестова мережа Kovan" - }, "learnMore": { "message": "Дізнатись більше" }, @@ -604,12 +580,6 @@ "newToMetaMask": { "message": "Вперше в MetaMask?" }, - "newTotal": { - "message": "Новий підсумок" - }, - "newTransactionFee": { - "message": "Нова комісія за транзакцію" - }, "next": { "message": "Далі" }, @@ -768,12 +738,6 @@ "revealSeedWordsWarningTitle": { "message": "НЕ передавайте цю фразу нікому!" }, - "rinkeby": { - "message": "Тестова мережа Rinkeby" - }, - "ropsten": { - "message": "Тестова мережа Ropsten" - }, "rpcUrl": { "message": "Новий RPC URL" }, @@ -810,9 +774,6 @@ "seedPhraseReq": { "message": "Початкові фрази мають 12 слів" }, - "selectAHigherGasFee": { - "message": "Оберіть вищу вартість пального, щоб пришвидшити обробку вашої транзакції.*" - }, "selectAnAccount": { "message": "Виберіть обліковий запис" }, @@ -831,9 +792,6 @@ "send": { "message": "Надіслати" }, - "sendAmount": { - "message": "Надіслати суму" - }, "sendTokens": { "message": "Надіслати токени" }, @@ -876,9 +834,6 @@ "signed": { "message": "Підписано" }, - "slow": { - "message": "Повільна" - }, "somethingWentWrong": { "message": "Ой! Щось пішло не так." }, diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index 11a6f8dc94bf..f50799c83d42 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -18,13 +18,13 @@ "message": "Sau khi bạn đã ký bằng ví của mình, nhấn vào 'Lấy Chữ Ký' để nhận chữ ký" }, "QRHardwareSignRequestGetSignature": { - "message": "Lấy Chữ Ký" + "message": "Lấy chữ ký" }, "QRHardwareSignRequestSubtitle": { "message": "Quét mã QR bằng ví của bạn" }, "QRHardwareSignRequestTitle": { - "message": "Yêu Cầu Chữ Ký" + "message": "Yêu cầu chữ ký" }, "QRHardwareUnknownQRCodeTitle": { "message": "Lỗi" @@ -42,14 +42,61 @@ "message": "Ví cứng dựa trên QR" }, "QRHardwareWalletSteps2Description": { - "message": "AirGap Vault & Ngrave (Sắp Ra Mắt)" + "message": "Ngrave (sắp ra mắt)" + }, + "SIWEAddressInvalid": { + "message": "Địa chỉ trong yêu cầu đăng nhập không trùng khớp với địa chỉ của tài khoản bạn đang sử dụng để đăng nhập." + }, + "SIWEDomainWarningBody": { + "message": "Trang web ($1) đang yêu cầu bạn đăng nhập vào một tên miền không đúng. Đây có thể là một cuộc tấn công lừa đảo.", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "Mã chuỗi:" + }, + "SIWELabelExpirationTime": { + "message": "Hết hạn vào:" + }, + "SIWELabelIssuedAt": { + "message": "Phát hành vào:" + }, + "SIWELabelMessage": { + "message": "Thông báo:" + }, + "SIWELabelNonce": { + "message": "Số chỉ dùng một lần:" + }, + "SIWELabelNotBefore": { + "message": "Không trước:" + }, + "SIWELabelRequestID": { + "message": "Mã yêu cầu:" + }, + "SIWELabelResources": { + "message": "Tài nguyên: $1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "Phiên bản:" + }, + "SIWESiteRequestSubtitle": { + "message": "Trang web này đang yêu cầu đăng nhập bằng" + }, + "SIWESiteRequestTitle": { + "message": "Yêu cầu đăng nhập" + }, + "SIWEWarningSubtitle": { + "message": "Để xác nhận rằng bạn hiểu, hãy đánh dấu:" + }, + "SIWEWarningTitle": { + "message": "Bạn có chắc không?" }, "about": { "message": "Giới thiệu" }, - "acceleratingATransaction": { - "message": "* Việc đẩy nhanh giao dịch bằng cách sử dụng giá gas cao hơn sẽ tăng khả năng được mạng xử lý nhanh hơn, nhưng không phải lúc nào điều này cũng được đảm bảo." - }, "acceptTermsOfUse": { "message": "Tôi đã đọc và đồng ý với $1", "description": "$1 is the `terms` message" @@ -121,11 +168,14 @@ "addAlias": { "message": "Thêm biệt danh" }, + "addBlockExplorer": { + "message": "Thêm một trình khám phá khối" + }, "addContact": { "message": "Thêm địa chỉ liên hệ" }, "addCustomToken": { - "message": "Thêm Token Tùy Chỉnh" + "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.", @@ -209,9 +259,6 @@ "airgapVault": { "message": "AirGap Vault" }, - "airgapVaultTutorial": { - "message": " (Hướng dẫn)" - }, "alertDisableTooltip": { "message": "Bạn có thể thay đổi trong phần \"Cài đặt > Cảnh báo\"" }, @@ -271,12 +318,15 @@ "message": "Phê duyệt giới hạn chi tiêu" }, "approveAllTokensTitle": { - "message": "Cấp quyền truy cập vào tất cả $1 của bạn?", + "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" }, @@ -293,6 +343,10 @@ "approvedAsset": { "message": "Tài sản được chấp nhận" }, + "approvedOn": { + "message": "Đã duyệt vào $1", + "description": "$1 is the approval date for a permission" + }, "areYouSure": { "message": "Bạn có chắc chắn không?" }, @@ -305,6 +359,9 @@ "assets": { "message": "Tài sản" }, + "attemptSendingAssets": { + "message": "Nếu bạn cố gắng gửi tài sản trực tiếp từ mạng này sang mạng khác, bạn có thể bị mất tài sản vĩnh viễn. Hãy nhớ sử dụng cầu nối." + }, "attemptToCancel": { "message": "Cố gắng hủy?" }, @@ -335,6 +392,9 @@ "backToAll": { "message": "Quay lại toàn bộ danh sách" }, + "backup": { + "message": "Sao lưu" + }, "backupApprovalInfo": { "message": "Đây là mã bí mật bắt buộc phải dùng để khôi phục ví trong trường hợp bạn bị mất thiết bị, quên mật khẩu, phải cài đặt lại MetaMask hoặc muốn truy cập ví của mình trên một thiết bị khác." }, @@ -344,6 +404,12 @@ "backupNow": { "message": "Sao lưu ngay" }, + "backupUserData": { + "message": "Sao lưu dữ liệu của bạn" + }, + "backupUserDataDescription": { + "message": "Bạn có thể sao lưu cài đặt người dùng có chứa các tùy chọn và địa chỉ tài khoản vào một tập tin JSON." + }, "balance": { "message": "Số dư" }, @@ -356,6 +422,9 @@ "basic": { "message": "Cơ bản" }, + "beCareful": { + "message": "Hãy cẩn thận" + }, "betaMetamaskDescription": { "message": "Được hàng triệu người tin dùng, MetaMask là một ví an toàn cho phép mọi người có thể truy cập vào thế giới web3." }, @@ -372,6 +441,9 @@ "betaMetamaskVersion": { "message": "Phiên Bản MetaMask Beta" }, + "betaPortfolioSite": { + "message": "trang web danh mục đầu tư beta" + }, "betaWelcome": { "message": "Chào mừng đến với MetaMask Beta" }, @@ -452,13 +524,13 @@ "message": "Byte" }, "canToggleInSettings": { - "message": "Bạn có thể bật lại thông báo này trong phần Cài đặt -> Cảnh báo." + "message": "Bạn có thể bật lại thông báo này trong phần Cài đặt > Cảnh báo." }, "cancel": { "message": "Hủy" }, "cancelEdit": { - "message": "Hủy Chỉnh Sửa" + "message": "Hủy chỉnh sửa" }, "cancelPopoverTitle": { "message": "Hủy giao dịch" @@ -507,6 +579,9 @@ "message": "Nhấn vào đây để kết nối với thiết bị Ledger của bạn qua WebHID", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "Nhấp vào đây để thêm token theo cách thủ công." + }, "clickToRevealSeed": { "message": "Nhấn vào đây để hiện các từ bí mật" }, @@ -523,6 +598,16 @@ "confirm": { "message": "Xác nhận" }, + "confirmPageDialogSetApprovalForAll": { + "message": "Bạn đang cấp quyền truy cập vào $1, bao gồm bất cứ tài sản nào mà bạn có thể sở hữu trong tương lai. Bên được cấp quyền có thể chuyển NFT khỏi ví của bạn bất cứ lúc nào mà không cần hỏi bạn cho đến khi bạn thu hồi sự chấp thuận này. $2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "tất cả NFT trên hợp đồng này" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "Hãy tiến hành thận trọng." + }, "confirmPassword": { "message": "Xác nhận mật khẩu" }, @@ -616,17 +701,11 @@ "connectingToGoerli": { "message": "Đang kết nối với mạng thử nghiệm Goerli" }, - "connectingToKovan": { - "message": "Đang kết nối với mạng thử nghiệm Kovan" - }, "connectingToMainnet": { "message": "Đang kết nối với mạng chính thức của Ethereum" }, - "connectingToRinkeby": { - "message": "Đang kết nối với mạng thử nghiệm Rinkeby" - }, - "connectingToRopsten": { - "message": "Đang kết nối với mạng thử nghiệm Ropsten" + "connectingToSepolia": { + "message": "Đang kết nối với mạng thử nghiệm Sepolia" }, "contactUs": { "message": "Liên hệ với chúng tôi" @@ -661,9 +740,21 @@ "contractDeployment": { "message": "Triển khai hợp đồng" }, + "contractDescription": { + "message": "Để bảo vệ chính mình khỏi những kẻ lừa đảo, hãy dành chút thời gian để xác minh chi tiết hợp đồng." + }, "contractInteraction": { "message": "Tương tác với hợp đồng" }, + "contractRequestingSpendingCap": { + "message": "Hợp đồng yêu cầu hạn mức chi tiêu" + }, + "contractTitle": { + "message": "Chi tiết hợp đồng" + }, + "contractToken": { + "message": "Hợp đồng token" + }, "convertTokenToNFTDescription": { "message": "Chúng tôi phát hiện tài sản này là một NFT. MetaMask hiện đã hỗ trợ toàn diện và đầy đủ cho NFT. Bạn có muốn xóa tài sản khỏi danh sách token và thêm tài sản dưới dạng NFT không?" }, @@ -742,19 +833,16 @@ "customContentSearch": { "message": "Tìm kiếm mạng đã thêm trước đây" }, - "customGas": { - "message": "Tùy chỉnh gas" - }, "customGasSettingToolTipMessage": { "message": "Sử dụng $1 để tùy chỉnh giá gas. Việc này có thể gây nhầm lẫn nếu bạn không quen thuộc. Bạn phải tự chịu trách nhiệm nếu thực hiện.", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "Việc tăng phí có thể giúp giảm thời gian xử lý, nhưng điều này không được đảm bảo." - }, "customSpendLimit": { "message": "Giới hạn chi tiêu tùy chỉnh" }, + "customSpendingCap": { + "message": "Hạn mức chi tiêu tùy chỉnh" + }, "customToken": { "message": "Token tùy chỉnh" }, @@ -764,6 +852,9 @@ "customTokenWarningInTokenDetectionNetwork": { "message": "Đảm bảo bạn tin tưởng trước khi nhập token theo cách thủ công. Tìm hiểu về $1." }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "Đảm bảo bạn tin tưởng token trước khi nhập token đó. Tìm hiểu cách phòng tránh $1. Bạn cũng có thể bật tính năng phát hiện token $2." + }, "customerSupport": { "message": "hỗ trợ khách hàng" }, @@ -787,8 +878,8 @@ "data": { "message": "Dữ liệu" }, - "dataBackupFoundInfo": { - "message": "Một số dữ liệu tài khoản của bạn đã được sao lưu trong lần cài đặt MetaMask trước đó. Dữ liệu này có thể bao gồm các tùy chọn cài đặt, danh bạ và token. Bạn có muốn khôi phục dữ liệu này bây giờ không?" + "dataBackupSeemsCorrupt": { + "message": "Không thể khôi phục dữ liệu của bạn. Tập tin có vẻ đã bị hỏng." }, "dataHex": { "message": "Thập lục phân" @@ -835,6 +926,12 @@ "message": "Nạp $1", "description": "$1 represents the crypto symbol to be purchased" }, + "deprecatedTestNetworksLink": { + "message": "Tìm hiểu thêm" + }, + "deprecatedTestNetworksMsg": { + "message": "Do những thay đổi trong giao thức của Ethereum: các mạng thử nghiệm Rinkeby, Ropsten và Kovan có thể không hoạt động đáng tin cậy và sẽ sớm bị ngừng sử dụng." + }, "description": { "message": "Mô tả" }, @@ -1034,7 +1131,7 @@ "message": "Chỉnh sửa phí gas tăng tốc" }, "enableAutoDetect": { - "message": " Bật Tự Động Phát Hiện" + "message": " Bật tự động phát hiện" }, "enableEIP1559V2": { "message": "Bật giao diện phí gas nâng cao" @@ -1043,7 +1140,7 @@ "message": "Chúng tôi đã cập nhật cách thức hoạt động của việc ước tính và tùy chỉnh phí gas." }, "enableEIP1559V2ButtonText": { - "message": "Bật giao diện phí gas nâng cao trong Cài đặt" + "message": "Bật giao diện phí gas nâng cao trong phần Cài đặt" }, "enableEIP1559V2Description": { "message": "Chúng tôi đã cập nhật cách thức hoạt động của việc ước tính và tùy chỉnh phí gas. Bật lên nếu bạn muốn sử dụng trải nghiệm gas mới. $1", @@ -1094,7 +1191,7 @@ "message": "Hãy cẩn thận với hành vi lừa đảo! MetaMask sẽ không bao giờ tự ý hỏi Cụm mật khẩu khôi phục bí mật của bạn." }, "endOfFlowMessage6": { - "message": "Nếu bạn cần sao lưu lại Cụm mật khẩu khôi phục bí mật, bạn có thể tìm thấy chức năng này trong phần Cài đặt -> Bảo mật." + "message": "Nếu bạn cần sao lưu lại Cụm mật khẩu khôi phục bí mật, bạn có thể tìm thấy chức năng này trong phần Cài đặt > Bảo mật." }, "endOfFlowMessage7": { "message": "Nếu bạn có thắc mắc hoặc thấy điều gì đó đáng ngờ, hãy liên hệ với bộ phận hỗ trợ của chúng tôi $1.", @@ -1110,8 +1207,17 @@ "message": "Điểm cuối đã trả về một mã chuỗi khác: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "Phát hiện token nâng cao" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "Tính năng phát hiện token nâng cao hiện có sẵn trên $1. $2" + }, + "enhancedTokenDetectionDescription": { + "message": "API token của ConsenSys sẽ tổng hợp danh sách token từ các danh sách token khác nhau của bên thứ ba. Khi bật, các token sẽ tự động được phát hiện và có thể tìm kiếm được trên mạng chính thức của Ethereum, Binance, Polygon và Avalanche. Khi tắt, tính năng tìm kiếm và tự động phát hiện chỉ có thể được thực hiện trên mạng chính thức của Ethereum." + }, "ensIllegalCharacter": { - "message": "Ký Tự Không Hợp Lệ đối với ENS." + "message": "Ký tự không hợp lệ đối với ENS." }, "ensNotFoundOnCurrentNetwork": { "message": "Không tìm thấy tên ENS trên mạng hiện tại. Đang chuyển sang mạng chính thức của Ethereum." @@ -1123,7 +1229,7 @@ "message": "Lỗi khi đăng ký tên ENS" }, "ensUnknownError": { - "message": "Tra Cứu ENS thất bại." + "message": "Tra cứu ENS thất bại." }, "enterMaxSpendLimit": { "message": "Nhập giới hạn chi tiêu tối đa" @@ -1166,9 +1272,6 @@ "message": "Cụm:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "Thời gian xử lý ước tính" - }, "ethGasPriceFetchWarning": { "message": "Giá gas dự phòng được cung cấp vì dịch vụ ước tính giá gas chính hiện không hoạt động." }, @@ -1214,9 +1317,6 @@ "fast": { "message": "Nhanh" }, - "fastest": { - "message": "Nhanh nhất" - }, "feeAssociatedRequest": { "message": "Yêu cầu này có kèm theo một khoản phí." }, @@ -1509,7 +1609,7 @@ "message": "Nhập một ví bằng Cụm mật khẩu khôi phục bí mật" }, "importMyWallet": { - "message": "Nhập Ví Của Tôi" + "message": "Nhập ví của tôi" }, "importNFT": { "message": "Nhập NFT" @@ -1526,6 +1626,12 @@ "importNFTs": { "message": "Nhập NFT" }, + "importSelectedTokens": { + "message": "Nhập các token đã chọn?" + }, + "importSelectedTokensDescription": { + "message": "Chỉ những token đã chọn mới xuất hiện trong ví của bạn. Sau đó, bạn luôn có thể nhập các token đã ẩn thông qua tìm kiếm." + }, "importTokenQuestion": { "message": "Bạn muốn nhập token?" }, @@ -1536,7 +1642,7 @@ "message": "nhập token" }, "importTokensCamelCase": { - "message": "Nhập Token" + "message": "Nhập token" }, "importWallet": { "message": "Nhập ví" @@ -1552,6 +1658,9 @@ "message": "Đã nhập", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "trong phần Cài đặt" + }, "infuraBlockedNotification": { "message": "MetaMask không thể kết nối với máy chủ chuỗi khối. Hãy xem xét các lý do tiềm ẩn $1.", "description": "$1 is a clickable link with with text defined by the 'here' key" @@ -1559,6 +1668,9 @@ "initialTransactionConfirmed": { "message": "Mạng đã xác nhận giao dịch ban đầu của bạn. Nhấn OK để quay lại." }, + "install": { + "message": "Cài đặt" + }, "insufficientBalance": { "message": "Không đủ số dư." }, @@ -1654,27 +1766,21 @@ "message": "Tập tin JSON", "description": "format for importing an account" }, + "keepTapsOnTokens": { + "message": "để giữ lại thẻ trên token và NFT của bạn trong các tài khoản và mạng." + }, "keystone": { "message": "Keystone" }, - "keystoneTutorial": { - "message": " (Hướng dẫn)" - }, "knownAddressRecipient": { "message": "Địa chỉ hợp đồng đã biết." }, "knownTokenWarning": { "message": "Hành động này sẽ chỉnh sửa các token đã niêm yết trong ví của bạn, kẻ xấu có thể lợi dụng việc này để lừa đảo bạn. Chỉ phê duyệt nếu bạn chắc chắn rằng bạn muốn thay đổi giá trị mà những token này đại diện cho. Tìm hiểu thêm về $1" }, - "kovan": { - "message": "Mạng thử nghiệm Kovan" - }, "lastConnected": { "message": "Đã kết nối lần cuối" }, - "learmMoreAboutGas": { - "message": "Muốn $1 về gas?" - }, "learnCancelSpeeedup": { "message": "Tìm hiểu cách $1", "description": "$1 is link to cancel or speed up transactions" @@ -1682,6 +1788,10 @@ "learnMore": { "message": "tìm hiểu thêm" }, + "learnMoreAboutGas": { + "message": "Muốn $1 về gas?", + "description": "$1 will be replaced by the learnMore translation key" + }, "learnMoreUpperCase": { "message": "Tìm hiểu thêm" }, @@ -1947,6 +2057,10 @@ "name": { "message": "Tên" }, + "nativeToken": { + "message": "Token gốc của mạng này là $1. Token này được dùng làm phí gas.", + "description": "$1 represents the name of the native token on the current network" + }, "needCryptoInWallet": { "message": "Để tương tác với các ứng dụng phi tập trung bằng MetaMask, bạn sẽ cần $1 trong ví.", "description": "$1 represents the cypto symbol to be purchased" @@ -1956,13 +2070,13 @@ "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" }, "needHelpFeedback": { - "message": "Chia sẻ Phản Hồi của bạn" + "message": "Chia sẻ phản hồi của bạn" }, "needHelpLinkText": { "message": "Hỗ trợ về MetaMask" }, "needHelpSubmitTicket": { - "message": "Gửi Phiếu" + "message": "Gửi phiếu" }, "needImportFile": { "message": "Bạn phải chọn tập tin để nhập.", @@ -1998,6 +2112,9 @@ "networkNameEthereum": { "message": "Ethereum" }, + "networkNameGoerli": { + "message": "Goerli" + }, "networkNamePolygon": { "message": "Polygon" }, @@ -2033,6 +2150,9 @@ "nevermind": { "message": "Bỏ qua" }, + "new": { + "message": "Mới!" + }, "newAccount": { "message": "Tài khoản mới" }, @@ -2074,12 +2194,6 @@ "newTokensImportedTitle": { "message": "Đã nhập token" }, - "newTotal": { - "message": "Tổng mới" - }, - "newTransactionFee": { - "message": "Phí giao dịch mới" - }, "newValues": { "message": "giá trị mới" }, @@ -2094,7 +2208,7 @@ "message": "NFT" }, "nftTokenIdPlaceholder": { - "message": "Nhập ID bộ sưu tập" + "message": "Nhập mã token" }, "nfts": { "message": "NFT" @@ -2112,7 +2226,7 @@ "message": "Không, tôi đã có Cụm mật khẩu khôi phục bí mật" }, "noConversionDateAvailable": { - "message": "Hiện Không Có Ngày Chuyển Đổi Tiền Tệ Nào" + "message": "Hiện không có ngày quy đổi tiền tệ nào" }, "noConversionRateAvailable": { "message": "Không có sẵn tỷ lệ quy đổi nào" @@ -2163,7 +2277,7 @@ "message": "Thông báo" }, "notifications10ActionText": { - "message": "Xem trong cài đặt", + "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." }, "notifications10DescriptionOne": { @@ -2188,7 +2302,7 @@ "message": "Bật chế độ tối" }, "notifications12Description": { - "message": "Tiện ích Chế độ tối hiện đã ra mắt! Để bật, hãy vào Cài đặt -> Thử nghiệm và chọn một trong các tùy chọn hiển thị: Sáng, Tối, Hệ thống." + "message": "Tiện ích Chế độ tối hiện đã ra mắt! Để bật, hãy vào Cài đặt > Thử nghiệm và chọn một trong các tùy chọn hiển thị: Sáng, Tối, Hệ thống." }, "notifications12Title": { "message": "Dùng chế độ tối khi nào? Ngay bây giờ! 🕶️🦊" @@ -2197,12 +2311,29 @@ "message": "Hiển thị danh sách mạng tùy chỉnh" }, "notifications13Description": { - "message": "Giờ đây, bạn có thể dễ dàng thêm các mạng tùy chỉnh phổ biến sau: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm và Polygon! Để bật tính năng này, hãy chuyển đến Cài đặt -> Thử nghiệm và bật \"Hiển thị danh sách mạng tùy chỉnh\"!", + "message": "Giờ đây, bạn có thể dễ dàng thêm các mạng tùy chỉnh phổ biến sau: Arbitrum, Avalanche, Binance Smart Chain, Fantom, Harmony, Optimism, Palm và Polygon! Để bật tính năng này, hãy chuyển đến Cài đặt > Thử nghiệm và bật \"Hiển thị danh sách mạng tùy chỉnh\"!", "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." }, "notifications13Title": { "message": "Thêm các mạng phổ biến" }, + "notifications14ActionText": { + "message": "Hiển thị cài đặt sao lưu" + }, + "notifications14Description": { + "message": "Chúng tôi sẽ ngừng sử dụng tính năng dữ liệu 3Box vào đầu tháng 10. Để sao lưu và khôi phục ví của bạn theo cách thủ công, hãy sử dụng nút \"Sao lưu ngay\" trong Cài đặt Nâng cao.", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "Ngừng sử dụng 3Box" + }, + "notifications15Description": { + "message": "Bạn không cần thực hiện bất kỳ hành động nào, vì vậy hãy tiếp tục sử dụng ví của bạn như bình thường. Hãy đề phòng những trò gian lận có thể xảy ra xung quanh quá trình Hợp nhất.", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "Hợp nhất Ethereum đã được triển khai!" + }, "notifications1Description": { "message": "Giờ đây, người dùng MetaMask trên điện thoại di động có thể hoán đổi token trong ví di động của họ. Quét mã QR để tải ứng dụng di động và bắt đầu hoán đổi.", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." @@ -2268,7 +2399,7 @@ "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, "notifications8ActionText": { - "message": "Đến Cài Đặt Nâng Cao", + "message": "Đến Cài đặt > Nâng cao", "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": { @@ -2276,7 +2407,7 @@ "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": { - "message": "Để có trải nghiệm sử dụng thiết bị Ledger dễ dàng và ổn định hơn, hãy đến thẻ Nâng Cao trong phần cài đặt và chuyển 'Dạng Kết Nối Ledger Ưu Tiên' thành 'WebHID'.", + "message": "Để có trải nghiệm sử dụng thiết bị Ledger dễ dàng và ổn định hơn, hãy đến Cài đặt > Nâng cao và chuyển 'Dạng Kết Nối Ledger Ưu Tiên' thành 'WebHID'.", "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." }, "notifications8Title": { @@ -2305,6 +2436,13 @@ "notificationsMarkAllAsRead": { "message": "Đánh dấu đã đọc tất cả" }, + "numberOfNewTokensDetectedPlural": { + "message": "Tìm thấy $1 token mới trong tài khoản này", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "Tìm thấy 1 token mới trong tài khoản này" + }, "ofTextNofM": { "message": "trên" }, @@ -2327,7 +2465,7 @@ "message": "Nhập ví có sẵn" }, "onboardingPinExtensionBillboardAccess": { - "message": "Toàn Quyền Truy Cập" + "message": "Toàn quyền truy cập" }, "onboardingPinExtensionBillboardDescription": { "message": "Các tiện ích này có thể xem và thay đổi thông tin" @@ -2384,6 +2522,9 @@ "message": "Mở MetaMask ở chế độ toàn màn hình để kết nối thiết bị Ledger của bạn qua WebHID.", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "Mở trên trình khám phá khối" + }, "optional": { "message": "Không bắt buộc" }, @@ -2456,6 +2597,12 @@ "permissionRequestCapitalized": { "message": "Yêu cầu cấp quyền" }, + "permissionRequested": { + "message": "Đã yêu cầu ngay" + }, + "permissionRevoked": { + "message": "Đã thu hồi trong bản cập nhật này" + }, "permission_accessNetwork": { "message": "Truy cập Internet.", "description": "The description of the `endowment:network-access` permission." @@ -2476,9 +2623,13 @@ "message": "Chạy không giới hạn.", "description": "The description for the `endowment:long-running` permission" }, + "permission_manageBip32Keys": { + "message": "Kiểm soát các tài khoản và tài sản của bạn ở $1 ($2).", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permission_manageBip44Keys": { "message": "Kiểm soát các tài khoản và tài sản \"$1\" của bạn.", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." }, "permission_manageState": { "message": "Lưu trữ và quản lý dữ liệu trong thiết bị.", @@ -2488,10 +2639,18 @@ "message": "Hiển thị thông báo.", "description": "The description for the `snap_notify` permission" }, + "permission_transactionInsight": { + "message": "Tìm nạp và hiển thị thông tin chi tiết về giao dịch.", + "description": "The description for the `endowment:transaction-insight` permission" + }, "permission_unknown": { "message": "Quyền không xác định: $1", "description": "$1 is the name of a requested permission that is not recognized." }, + "permission_viewBip32PublicKeys": { + "message": "Xem khóa công khai của bạn cho $1 ($2).", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "Quyền" }, @@ -2508,8 +2667,11 @@ "popularCustomNetworks": { "message": "Mạng tùy chỉnh phổ biến" }, + "portfolioSite": { + "message": "Trang web danh mục đầu tư" + }, "preferredLedgerConnectionType": { - "message": "Dạng Kết Nối Ledger Ưu Tiên", + "message": "Dạng kết nối Ledger ưu tiên", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" }, "preparingSwap": { @@ -2688,9 +2850,17 @@ "restore": { "message": "Khôi phục" }, - "restoreWalletPreferences": { - "message": "Đã tìm thấy bản sao lưu dữ liệu của bạn từ $1. Bạn có muốn khôi phục các tùy chọn ưu tiên trong ví của mình không?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "Không thể khôi phục dữ liệu của bạn từ tập tin được cung cấp" + }, + "restoreSuccessful": { + "message": "Dữ liệu của bạn đã được khôi phục thành công" + }, + "restoreUserData": { + "message": "Khôi phục dữ liệu người dùng" + }, + "restoreUserDataDescription": { + "message": "Bạn có thể khôi phục cài đặt người dùng chứa các tùy chọn và địa chỉ tài khoản từ tập tin JSON đã sao lưu trước đó." }, "retryTransaction": { "message": "Thử lại giao dịch" @@ -2721,11 +2891,8 @@ "message": "Bằng cách thu hồi quyền truy cập, $1 sau đây sẽ không thể truy cập vào $2 của bạn nữa", "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" }, - "rinkeby": { - "message": "Mạng thử nghiệm Rinkeby" - }, - "ropsten": { - "message": "Mạng thử nghiệm Ropsten" + "revokeSpendingCapTooltipText": { + "message": "Hợp đồng này sẽ không thể chi tiêu thêm bất kỳ token hiện tại hoặc tương lai nào của bạn." }, "rpcUrl": { "message": "URL RPC mới" @@ -2758,7 +2925,7 @@ "message": "Kết quả tìm kiếm" }, "searchSettings": { - "message": "Tìm kiếm trong cài đặt" + "message": "Tìm kiếm trong phần Cài đặt" }, "searchTokens": { "message": "Tìm kiếm token" @@ -2776,7 +2943,7 @@ "message": "Cụm Mật Khẩu Khôi Phục Bí Mật" }, "secureWallet": { - "message": "Ví An Toàn" + "message": "Ví an toàn" }, "securityAndPrivacy": { "message": "Bảo mật và quyền riêng tư" @@ -2838,9 +3005,6 @@ "seedPhraseWriteDownHeader": { "message": "Viết ra Cụm Mật Khẩu Khôi Phục Bí Mật của bạn" }, - "selectAHigherGasFee": { - "message": "Chọn phí gas cao hơn để tăng tốc quá trình xử lý giao dịch của bạn.*" - }, "selectAccounts": { "message": "Chọn (các) tài khoản để sử dụng trên trang web này" }, @@ -2874,9 +3038,6 @@ "send": { "message": "Gửi" }, - "sendAmount": { - "message": "Gửi khoản tiền" - }, "sendBugReport": { "message": "Gửi báo cáo lỗi." }, @@ -2901,6 +3062,9 @@ "message": "Cảnh báo: bạn sắp gửi đến một hợp đồng token và điều này có thể dẫn đến nguy cơ mất tiền. $1", "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" }, + "sepolia": { + "message": "Mạng thử nghiệm Sepolia" + }, "setAdvancedPrivacySettings": { "message": "Thiết lập cài đặt quyền riêng tư nâng cao" }, @@ -2908,7 +3072,7 @@ "message": "MetaMask sử dụng các dịch vụ của bên thứ ba đáng tin cậy này để nâng cao sự hữu ích và an toàn của sản phẩm." }, "setApprovalForAll": { - "message": "Cài đặt phê duyệt tất cả" + "message": "Thiết lập phê duyệt tất cả" }, "setApprovalForAllTitle": { "message": "Phê duyệt $1 không có giới hạn chi tiêu", @@ -2933,12 +3097,6 @@ "showAdvancedGasInlineDescription": { "message": "Chọn tùy chọn này để hiển thị các quyền kiểm soát giá gas và giới hạn ngay trên màn hình gửi và xác nhận." }, - "showCustomNetworkList": { - "message": "Hiển thị danh sách mạng tùy chỉnh" - }, - "showCustomNetworkListDescription": { - "message": "Chọn tùy chọn này để hiển thị danh sách các mạng có thông tin được điền sẵn khi thêm mạng mới." - }, "showFiatConversionInTestnets": { "message": "Hiển thị tỷ lệ quy đổi trên các mạng thử nghiệm" }, @@ -2967,7 +3125,7 @@ "message": "Hiện khóa riêng tư" }, "showRecommendations": { - "message": "Hiển Thị Đề Xuất" + "message": "Hiển thị các đề xuất" }, "showTestnetNetworks": { "message": "Hiển thị các mạng thử nghiệm" @@ -2993,6 +3151,9 @@ "signed": { "message": "Đã ký" }, + "signin": { + "message": "Đăng nhập" + }, "simulationErrorMessageV2": { "message": "Chúng tôi không thể ước tính gas. Có thể đã xảy ra lỗi trong hợp đồng và giao dịch này có thể thất bại." }, @@ -3000,14 +3161,11 @@ "message": "Bỏ qua" }, "skipAccountSecurity": { - "message": "Bỏ qua Bảo Mật Tài Khoản?" + "message": "Bỏ qua bảo mật tài khoản?" }, "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." }, - "slow": { - "message": "Chậm" - }, "smartTransaction": { "message": "Giao dịch thông minh" }, @@ -3019,6 +3177,10 @@ "message": "Đã thêm vào $1 từ $2", "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." }, + "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." + }, "snapError": { "message": "Lỗi Snap: '$1'. Mã lỗi: '$2'", "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." @@ -3027,14 +3189,34 @@ "message": "Cài đặt Snap" }, "snapInstallWarningCheck": { - "message": "Để xác nhận rằng bạn hiểu, hãy đánh dấu vào tất cả." + "message": "Để xác nhận rằng bạn hiểu, hãy đánh dấu vào ô." + }, + "snapInstallWarningCheckPlural": { + "message": "Để xác nhận rằng bạn hiểu, hãy đánh dấu vào tất cả các ô." + }, + "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.", + "description": "The first parameter is the name of the snap and the second one is the protocol" }, "snapRequestsPermission": { "message": "Snap này đang yêu cầu các quyền sau:" }, + "snapUpdate": { + "message": "Cập nhật Snap" + }, + "snapUpdateExplanation": { + "message": "$1 cần một phiên bản Snap mới hơn.", + "description": "$1 is the dapp that is requesting an update to the snap." + }, "snaps": { "message": "Snap" }, + "snapsInsightLoading": { + "message": "Đang tải thông tin chi tiết về giao dịch..." + }, + "snapsNoInsight": { + "message": "Snap không trả về bất kỳ thông tin chi tiết nào" + }, "snapsSettingsDescription": { "message": "Quản lý Snap" }, @@ -3281,7 +3463,7 @@ "message": "Hỗ trợ" }, "supportCenter": { - "message": "Truy cập Trung tâm hỗ trợ của chúng tôi" + "message": "Truy cập trung tâm hỗ trợ của chúng tôi" }, "swap": { "message": "Hoán đổi" @@ -3479,6 +3661,9 @@ "swapReviewSwap": { "message": "Xem lại giao dịch hoán đổi" }, + "swapSearchNameOrAddress": { + "message": "Tìm kiếm tên hoặc dán địa chỉ" + }, "swapSelect": { "message": "Chọn" }, @@ -3498,6 +3683,9 @@ "message": "$1%", "description": "$1 is the amount of % for slippage" }, + "swapSlippageTooltip": { + "message": "Khi giá giữa thời điểm đặt lệnh và thời điểm xác nhận lệnh thay đổi, hiện tượng này được gọi là \"trượt giá\". Giao dịch hoán đổi của bạn sẽ tự động hủy nếu mức trượt giá vượt quá \"mức trượt giá cho phép\" đã đặt." + }, "swapSource": { "message": "Nguồn thanh khoản" }, @@ -3607,6 +3795,9 @@ "switchToThisAccount": { "message": "Chuyển sang tài khoản này" }, + "switchedTo": { + "message": "Bạn đã chuyển sang" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "Khi bạn chuyển mạng, mọi xác nhận đang chờ xử lý sẽ bị hủy" }, @@ -3643,15 +3834,6 @@ "syncWithMobileTitle": { "message": "Đồng bộ với thiết bị di động" }, - "syncWithThreeBox": { - "message": "Đồng bộ dữ liệu với 3Box (thử nghiệm)" - }, - "syncWithThreeBoxDescription": { - "message": "Bật để sao lưu các tùy chọn cài đặt của bạn với 3Box. Tính năng này hiện đang trong giai đoạn thử nghiệm; bạn tự chịu rủi ro khi sử dụng." - }, - "syncWithThreeBoxDisabled": { - "message": "Đã tắt 3Box do có lỗi xảy ra trong quá trình đồng bộ ban đầu" - }, "tenPercentIncreased": { "message": "Tăng 10%" }, @@ -3673,6 +3855,9 @@ "themeDescription": { "message": "Chọn chủ đề MetaMask yêu thích của bạn." }, + "thingsToKeep": { + "message": "Những điều cần lưu ý:" + }, "thisWillCreate": { "message": "Thao tác này sẽ tạo một ví mới và Cụm mật khẩu khôi phục bí mật" }, @@ -3714,12 +3899,21 @@ "tokenDetails": { "message": "Chi tiết token" }, + "tokenFoundTitle": { + "message": "Đã tìm thấy 1 token mới" + }, "tokenId": { "message": "ID Token" }, "tokenList": { "message": "Danh sách token:" }, + "tokenScamSecurityRisk": { + "message": "rủi ro về bảo mật và lừa đảo token" + }, + "tokenShowUp": { + "message": "Các token có thể không tự động hiển thị trong ví của bạn." + }, "tokenSymbol": { "message": "Ký hiệu token" }, @@ -3806,25 +4000,25 @@ "message": "Phí giao dịch" }, "transactionHistoryBaseFee": { - "message": "Phí Cơ Bản (GWEI)" + "message": "Phí cơ bản (GWEI)" }, "transactionHistoryL1GasLabel": { - "message": "Tổng Phí Gas L1" + "message": "Tổng phí gas L1" }, "transactionHistoryL2GasLimitLabel": { - "message": "Giới Hạn Gas L2" + "message": "Giới hạn gas L2" }, "transactionHistoryL2GasPriceLabel": { - "message": "Giá Gas L2" + "message": "Giá gas L2" }, "transactionHistoryMaxFeePerGas": { - "message": "Phí Tối Đa Mỗi Gas" + "message": "Phí tối đa mỗi gas" }, "transactionHistoryPriorityFee": { - "message": "Phí Ưu Tiên (GWEI)" + "message": "Phí ưu tiên (GWEI)" }, "transactionHistoryTotalGasFee": { - "message": "Tổng Phí Gas" + "message": "Tổng phí gas" }, "transactionResubmitted": { "message": "Đã gửi lại giao dịch với mức phí gas ước tính tăng lên $1 lúc $2" @@ -3861,6 +4055,9 @@ "tryAgain": { "message": "Thử lại" }, + "tryOur": { + "message": "Thử ngay" + }, "turnOnTokenDetection": { "message": "Bật phát hiện token nâng cao" }, @@ -3914,9 +4111,13 @@ "message": "Web phi tập trung đang chờ đón bạn" }, "unrecognizedChain": { - "message": "Không nhận ra mạng tùy chỉnh này. Bạn nên $1 trước khi tiếp tục", + "message": "Không thể nhận diện mạng tùy chỉnh này", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1 (Giao thức chưa được công nhận)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "Hiện không hỗ trợ gửi token sưu tập (ERC-721)", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" @@ -3943,7 +4144,7 @@ "message": "Việc hiển thị nội dung đa phương tiện và dữ liệu NFT có thể làm lộ địa chỉ IP của bạn cho các máy chủ tập trung. API của bên thứ ba (như OpenSea) được dùng để phát hiện NFT trong ví của bạn. Điều này sẽ làm lộ địa chỉ tài khoản của bạn với các dịch vụ đó. Hãy tắt tính năng này nếu bạn không muốn ứng dụng lấy dữ liệu từ các dịch vụ đó." }, "usePhishingDetection": { - "message": "Sử dụng tính năng Phát hiện lừa đảo" + "message": "Sử dụng tính năng phát hiện lừa đảo" }, "usePhishingDetectionDescription": { "message": "Hiển thị cảnh báo đối với các tên miền lừa đảo nhắm đến người dùng Ethereum" @@ -3999,7 +4200,7 @@ "message": "Xem trên Opensea" }, "viewinExplorer": { - "message": "Xem $1 trong Trình khám phá", + "message": "Xem $1 trong trình khám phá", "description": "$1 is the action type. e.g (Account, Transaction, Swap)" }, "visitWebSite": { @@ -4034,6 +4235,10 @@ "warning": { "message": "Cảnh báo" }, + "warningTooltipText": { + "message": "$1 Hợp đồng có thể chi tiêu toàn bộ số dư token của bạn mà không cần thông báo hoặc chấp thuận. Hãy tự bảo vệ chính mình bằng cách chỉnh hạn mức chi tiêu thấp hơn.", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, "weak": { "message": "Yếu" }, diff --git a/app/_locales/zh/messages.json b/app/_locales/zh/messages.json deleted file mode 100644 index 70610a5bceb5..000000000000 --- a/app/_locales/zh/messages.json +++ /dev/null @@ -1,4131 +0,0 @@ -{ - "QRHardwareInvalidTransactionTitle": { - "message": "错误" - }, - "QRHardwareMismatchedSignId": { - "message": "不一致的交易数据。请查看交易详情。" - }, - "QRHardwarePubkeyAccountOutOfRange": { - "message": "暂无更多账户。若想访问下方未列出的其他账户,请重新连接您的硬件钱包并选择它。" - }, - "QRHardwareScanInstructions": { - "message": "将二维码放在摄像头前。屏幕是模糊的,但不影响对二维码的读取。" - }, - "QRHardwareSignRequestCancel": { - "message": "拒绝" - }, - "QRHardwareSignRequestDescription": { - "message": "使用钱包签名后,点击“获取签名”以接收签名" - }, - "QRHardwareSignRequestGetSignature": { - "message": "获取签名" - }, - "QRHardwareSignRequestSubtitle": { - "message": "用您的钱包扫描二维码" - }, - "QRHardwareSignRequestTitle": { - "message": "请求签名" - }, - "QRHardwareUnknownQRCodeTitle": { - "message": "错误" - }, - "QRHardwareUnknownWalletQRCode": { - "message": "非法二维码,请扫描硬件钱包的同步二维码。" - }, - "QRHardwareWalletImporterTitle": { - "message": "扫描二维码" - }, - "QRHardwareWalletSteps1Description": { - "message": "连接通过二维码通信的气隙硬件钱包。官方支持的气隙硬件钱包包括:" - }, - "QRHardwareWalletSteps1Title": { - "message": "基于二维码的硬件钱包" - }, - "QRHardwareWalletSteps2Description": { - "message": "AirGap Vault & Ngrave (即将上线)" - }, - "about": { - "message": "关于" - }, - "acceleratingATransaction": { - "message": "* 通过使用更高的燃料价格来加速交易,会增加其更快地被网络处理的机会,但这并不总是得到保证。" - }, - "acceptTermsOfUse": { - "message": "我已阅读并同意 $1", - "description": "$1 is the `terms` message" - }, - "accessAndSpendNotice": { - "message": "$1 可以访问并使用此最大金额", - "description": "$1 is the url of the site requesting ability to spend" - }, - "accessAndSpendNoticeNFT": { - "message": "$1可以访问并使用此资产", - "description": "$1 is the url of the site requesting ability to spend" - }, - "accessYourWalletWithSRP": { - "message": "使用账户助记词访问钱包" - }, - "accessYourWalletWithSRPDescription": { - "message": "MetaMask无法恢复您的密码。我们将使用您的助记词来验证您的所有权、恢复您的钱包并设置新密码。首先,请输入创建钱包时获得的助记词。$1", - "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" - }, - "accessingYourCamera": { - "message": "正在访问您的相机……" - }, - "account": { - "message": "账户" - }, - "accountDetails": { - "message": "账户详情" - }, - "accountIdenticon": { - "message": "账户哈希头像" - }, - "accountName": { - "message": "账户名称" - }, - "accountNameDuplicate": { - "message": "此账户名称已存在", - "description": "This is an error message shown when the user enters a new account name that matches an existing account name" - }, - "accountOptions": { - "message": "账户选项" - }, - "accountSelectionRequired": { - "message": "您需要选择一个账户!" - }, - "active": { - "message": "活跃" - }, - "activity": { - "message": "活动" - }, - "activityLog": { - "message": "活动日志" - }, - "add": { - "message": "添加" - }, - "addANetwork": { - "message": "添加网络" - }, - "addANetworkManually": { - "message": "手动添加网络" - }, - "addANickname": { - "message": "添加昵称" - }, - "addAcquiredTokens": { - "message": "添加您使用 MetaMask 获得的代币" - }, - "addAlias": { - "message": "添加别名" - }, - "addContact": { - "message": "添加联系信息" - }, - "addCustomToken": { - "message": "添加自定义代币" - }, - "addCustomTokenByContractAddress": { - "message": "找不到代币?您可以通过粘贴其地址手动添加任何代币。代币合约地址可以在 $1 上找到。", - "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" - }, - "addEthereumChainConfirmationDescription": { - "message": "这将允许在 MetaMask 中使用此网络。" - }, - "addEthereumChainConfirmationRisks": { - "message": "MetaMask 不验证自定义网络。" - }, - "addEthereumChainConfirmationRisksLearnMore": { - "message": "了解 $1。", - "description": "$1 is a link with text that is provided by the 'addEthereumChainConfirmationRisksLearnMoreLink' key" - }, - "addEthereumChainConfirmationRisksLearnMoreLink": { - "message": "诈骗和网络安全风险", - "description": "Link text for the 'addEthereumChainConfirmationRisksLearnMore' translation key" - }, - "addEthereumChainConfirmationTitle": { - "message": "允许此网站增加一个网络?" - }, - "addFriendsAndAddresses": { - "message": "添加您信任的朋友和地址" - }, - "addFromAListOfPopularNetworks": { - "message": "从热门网络列表中选择网络来添加,或手动添加网络。仅可与您信任的实体互动。" - }, - "addMemo": { - "message": "添加备忘录" - }, - "addMoreNetworks": { - "message": "手动添加更多网络" - }, - "addNetwork": { - "message": "添加网络" - }, - "addNetworkTooltipWarning": { - "message": "此网络连接依赖于第三方。此连接可能不太可靠,或使第三方可进行活动跟踪。$1", - "description": "$1 is Learn more link" - }, - "addSuggestedTokens": { - "message": "添加推荐代币" - }, - "addToken": { - "message": "添加代币" - }, - "address": { - "message": "地址" - }, - "addressBookIcon": { - "message": "地址簿图标" - }, - "advanced": { - "message": "高级" - }, - "advancedBaseGasFeeToolTip": { - "message": "当您的交易被包含在区块中时,您的最大基本费用与实际基本费用之间的任何差额将被退还。总金额按最大基本费用(以GWEI为单位)*燃料上限计算。" - }, - "advancedGasFeeDefaultOptIn": { - "message": "将这些 $1 保存为“高级”默认值" - }, - "advancedGasFeeDefaultOptOut": { - "message": "始终使用这些值和高级设置作为默认值。" - }, - "advancedGasFeeModalTitle": { - "message": "高级燃料费" - }, - "advancedGasPriceTitle": { - "message": "燃料价格" - }, - "advancedOptions": { - "message": "高级选项" - }, - "advancedPriorityFeeToolTip": { - "message": "优先费(又称“矿工费”)直接向矿工支付,激励他们优先处理您的交易。" - }, - "affirmAgree": { - "message": "我同意" - }, - "airgapVault": { - "message": "AirGap Vault" - }, - "airgapVaultTutorial": { - "message": " (使用教程)" - }, - "alertDisableTooltip": { - "message": "这可以在“设置 > 提醒”中进行更改" - }, - "alertSettingsUnconnectedAccount": { - "message": "浏览网站时选择的账户未连接" - }, - "alertSettingsUnconnectedAccountDescription": { - "message": "当您浏览已连接的 web3 网站时,此警报会显示在弹出窗口中,但当前选择的账户未连接。" - }, - "alertSettingsWeb3ShimUsage": { - "message": "当网站尝试使用已经删除的 window.web3 API 时" - }, - "alertSettingsWeb3ShimUsageDescription": { - "message": "当您浏览尝试使用已删除的 window.web3 API 并因此可能出现故障的网站时,此警报会显示在弹出窗口中。" - }, - "alerts": { - "message": "提醒" - }, - "allOfYour": { - "message": "您的所有$1", - "description": "$1 is the symbol or name of the token that the user is approving spending" - }, - "allowExternalExtensionTo": { - "message": "允许此外部扩展程序:" - }, - "allowSpendToken": { - "message": "授予访问您的 $1 的权限?", - "description": "$1 is the symbol of the token that are requesting to spend" - }, - "allowThisSiteTo": { - "message": "允许此网站:" - }, - "allowWithdrawAndSpend": { - "message": "允许 $1 提取和消费最高以下金额:", - "description": "The url of the site that requested permission to 'withdraw and spend'" - }, - "amount": { - "message": "数额" - }, - "appDescription": { - "message": "浏览器中的以太坊钱包", - "description": "The description of the application" - }, - "appName": { - "message": "MetaMask", - "description": "The name of the application" - }, - "appNameBeta": { - "message": "MetaMask Beta", - "description": "The name of the application (Beta)" - }, - "appNameFlask": { - "message": "MetaMask Flask", - "description": "The name of the application (Flask)" - }, - "approve": { - "message": "批准消费限额" - }, - "approveAllTokensTitle": { - "message": "是否允许访问您的所有$1?", - "description": "$1 is the symbol of the token for which the user is granting approval" - }, - "approveAndInstall": { - "message": "批准并安装" - }, - "approveButtonText": { - "message": "批准" - }, - "approveSpendLimit": { - "message": "批准 $1 消费限额", - "description": "The token symbol that is being approved" - }, - "approved": { - "message": "已批准" - }, - "approvedAmountWithColon": { - "message": "已批准金额:" - }, - "approvedAsset": { - "message": "已获批准的资产" - }, - "areYouDeveloper": { - "message": "您是开发人员吗?" - }, - "areYouSure": { - "message": "您确定吗?" - }, - "asset": { - "message": "资产" - }, - "assetOptions": { - "message": "资产选项" - }, - "assets": { - "message": "资产" - }, - "attemptToCancel": { - "message": "尝试取消吗?" - }, - "attemptToCancelDescription": { - "message": "提交此尝试不能保证将会取消您的初始交易。如果取消尝试成功,将向您收取以上交易费。" - }, - "attemptingConnect": { - "message": "正在尝试连接到区块链。" - }, - "attributions": { - "message": "参与者" - }, - "authorizedPermissions": { - "message": "您已授权以下权限" - }, - "autoLockTimeLimit": { - "message": "自动锁定计时器(分钟)" - }, - "autoLockTimeLimitDescription": { - "message": "设置 MetaMask 将被锁定前的空闲时间(单位:分钟)。" - }, - "average": { - "message": "平均值" - }, - "back": { - "message": "返回" - }, - "backToAll": { - "message": "返回全部" - }, - "backupApprovalInfo": { - "message": "如果不慎丢失个人设备,忘记密码,需要重新安装 MetaMask,或者需在另一台设备上访问钱包,使用此助记词才能恢复您的钱包。" - }, - "backupApprovalNotice": { - "message": "请备份您的账户助记词,保证您的钱包和资金安全。" - }, - "backupNow": { - "message": "立即备份" - }, - "balance": { - "message": "余额" - }, - "balanceOutdated": { - "message": "余额可能已过期" - }, - "baseFee": { - "message": "基本费用" - }, - "basic": { - "message": "基本" - }, - "betaMetamaskDescription": { - "message": "MetaMask 深受数百万人信任,是一款可以让所有人进入 web3 世界的安全钱包。" - }, - "betaMetamaskDescriptionExplanation": { - "message": "使用此版本来测试即将发布的功能。您的使用和反馈有助于我们构建最好的 MetaMask 版本。您对 MetaMask 测试版的使用须遵守我们的标准 $1 以及我们的 $2。作为测试版,出现漏洞的风险可能会增加。继续即表示您接受并承认这些风险,以及我们条款和测试版条款中发现的风险。", - "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" - }, - "betaMetamaskDescriptionExplanationBetaTermsLinkText": { - "message": "补充测试版条款" - }, - "betaMetamaskDescriptionExplanationTermsLinkText": { - "message": "条款" - }, - "betaMetamaskVersion": { - "message": "MetaMask 测试版本" - }, - "betaWelcome": { - "message": "欢迎使用 MetaMask 测试版" - }, - "blockExplorerAccountAction": { - "message": "账户", - "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Account in Explorer" - }, - "blockExplorerAssetAction": { - "message": "资产", - "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" - }, - "blockExplorerSwapAction": { - "message": "交换", - "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" - }, - "blockExplorerUrl": { - "message": "区块浏览器 URL" - }, - "blockExplorerUrlDefinition": { - "message": "用作此网络的区块浏览器的 URL。" - }, - "blockExplorerView": { - "message": "在 $1 查看账户", - "description": "$1 replaced by URL for custom block explorer" - }, - "blockies": { - "message": "Blockies" - }, - "browserNotSupported": { - "message": "您的浏览器不受支持……" - }, - "buildContactList": { - "message": "建立您的联系人列表" - }, - "builtAroundTheWorld": { - "message": "MetaMask 是在世界各地设计和建造的。" - }, - "busy": { - "message": "忙碌中" - }, - "buy": { - "message": "购买" - }, - "buyAsset": { - "message": "购买$1", - "description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase" - }, - "buyCryptoWithCoinbasePay": { - "message": "用Coinbase Pay购买$1", - "description": "$1 represents the crypto symbol to be purchased" - }, - "buyCryptoWithCoinbasePayDescription": { - "message": "您可以使用Coinbase账户轻松购买或转移加密货币。", - "description": "$1 represents the crypto symbol to be purchased" - }, - "buyCryptoWithMoonPay": { - "message": "用MoonPay购买$1", - "description": "$1 represents the cypto symbol to be purchased" - }, - "buyCryptoWithMoonPayDescription": { - "message": "MoonPay支持热门的支付方式,包括Visa、万事达卡、Apple / Google / Samsung Pay,以及超过145个国家/地区的银行转账。代币会被存入您的MetaMask账户。" - }, - "buyCryptoWithTransak": { - "message": "用Transak购买$1", - "description": "$1 represents the cypto symbol to be purchased" - }, - "buyCryptoWithTransakDescription": { - "message": "Transak在超过100个国家/地区支持信用卡和借记卡、Apple Pay、MobiKwik和银行转账(取决于地点)。$1会被直接存入您的MetaMask账户。", - "description": "$1 represents the crypto symbol to be purchased" - }, - "buyWithWyre": { - "message": "使用Wyre购买$1" - }, - "buyWithWyreDescription": { - "message": "购买不超过$1000可以轻松开通。快速交互式上限购买验证。支持借记卡/信用卡、Apple Pay、银行转账。适用于100多个国家。代币存入您的MetaMask账户" - }, - "bytes": { - "message": "字节" - }, - "canToggleInSettings": { - "message": "您可以在“设置 -> 提醒”中重新启用该通知。" - }, - "cancel": { - "message": "取消" - }, - "cancelEdit": { - "message": "取消编辑" - }, - "cancelPopoverTitle": { - "message": "取消交易" - }, - "cancelSpeedUp": { - "message": "取消或加快交易。" - }, - "cancelSpeedUpLabel": { - "message": "这笔燃料费将$1原来的费用。", - "description": "$1 is text 'replace' in bold" - }, - "cancelSpeedUpTransactionTooltip": { - "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": "免费取消兑换" - }, - "cancellationGasFee": { - "message": "取消燃料费用" - }, - "cancelled": { - "message": "已取消" - }, - "chainId": { - "message": "链 ID" - }, - "chainIdDefinition": { - "message": "用于签署此网络的交易的链 ID。" - }, - "chainIdExistsErrorMsg": { - "message": "此链 ID 目前已被 $1 网络使用。" - }, - "chainListReturnedDifferentTickerSymbol": { - "message": "链ID为$1的网络使用的货币代码($2)可能与您输入的不同。请在继续之前进行验证。", - "description": "$1 is the chain id currently entered in the network form and $2 is the return value of nativeCurrency.symbol from chainlist.network" - }, - "chromeRequiredForHardwareWallets": { - "message": "您需要在 Google Chrome 上使用 MetaMask 以连接到您的硬件钱包。" - }, - "clickToConnectLedgerViaWebHID": { - "message": "点击这里以通过 WebHID 连接您的 Ledger", - "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" - }, - "clickToRevealSeed": { - "message": "点击此处以显示助记词" - }, - "close": { - "message": "关闭" - }, - "collectibleAddFailedMessage": { - "message": "由于所有权信息不匹配,无法添加NFT。请确保所输入的信息正确无误。" - }, - "collectibleAddressError": { - "message": "此代币是NFT。另加上$1", - "description": "$1 is a clickable link with text defined by the 'importNFTPage' key" - }, - "confirm": { - "message": "确认" - }, - "confirmPassword": { - "message": "确认密码" - }, - "confirmRecoveryPhrase": { - "message": "确认助记词" - }, - "confirmSecretBackupPhrase": { - "message": "请确认您的账户助记词" - }, - "confirmed": { - "message": "已确认" - }, - "confusableUnicode": { - "message": "'$1' 与 '$2' 相似。" - }, - "confusableZeroWidthUnicode": { - "message": "找到零宽字符。" - }, - "confusingEnsDomain": { - "message": "我们在 ENS 名称中检测到一个可令人混淆的字符。检查 ENS 名称以避免潜在的骗局。" - }, - "congratulations": { - "message": "恭喜" - }, - "connect": { - "message": "连接" - }, - "connectAccountOrCreate": { - "message": "连接账户或创建新账户" - }, - "connectHardwareWallet": { - "message": "连接硬件钱包" - }, - "connectManually": { - "message": "手动连接到当前站点" - }, - "connectTo": { - "message": "连接到 $1", - "description": "$1 is the name/origin of a web3 site/application that the user can connect to metamask" - }, - "connectToAll": { - "message": "连接到您的全部 $1", - "description": "$1 will be replaced by the translation of connectToAllAccounts" - }, - "connectToAllAccounts": { - "message": "账户", - "description": "will replace $1 in connectToAll, completing the sentence 'connect to all of your accounts', will be text that shows list of accounts on hover" - }, - "connectToMultiple": { - "message": "连接到 $1", - "description": "$1 will be replaced by the translation of connectToMultipleNumberOfAccounts" - }, - "connectToMultipleNumberOfAccounts": { - "message": "$1 个账户", - "description": "$1 is the number of accounts to which the web3 site/application is asking to connect; this will substitute $1 in connectToMultiple" - }, - "connectWithMetaMask": { - "message": "与 MetaMask 连接" - }, - "connectedAccountsDescriptionPlural": { - "message": "您有 $1 个账户连接到了该网站。", - "description": "$1 is the number of accounts" - }, - "connectedAccountsDescriptionSingular": { - "message": "您有1个账户连接到了该网站。" - }, - "connectedAccountsEmptyDescription": { - "message": "MetaMask 没有连接到该网站。要连接到 web3 网站,请找到并点击连接按钮。" - }, - "connectedSites": { - "message": "已连接的网站" - }, - "connectedSitesDescription": { - "message": "$1 已连接到这些网站。他们可以查看您的账户地址。", - "description": "$1 is the account name" - }, - "connectedSitesEmptyDescription": { - "message": "$1 还没连接到任何网站。", - "description": "$1 is the account name" - }, - "connectedSnapSites": { - "message": "$1的snap已连接到这些站点。它们有上述的访问权限。", - "description": "$1 represents the name of the snap" - }, - "connecting": { - "message": "连接中……" - }, - "connectingTo": { - "message": "正在连接 $1" - }, - "connectingToGoerli": { - "message": "正在连接 Goerli 测试网络" - }, - "connectingToKovan": { - "message": "正在连接到 Kovan 测试网络" - }, - "connectingToMainnet": { - "message": "正在连接到以太坊主网" - }, - "connectingToRinkeby": { - "message": "正在连接到 Rinkeby 测试网络" - }, - "connectingToRopsten": { - "message": "正在连接到 Ropsten 测试网络" - }, - "contactUs": { - "message": "联系我们" - }, - "contacts": { - "message": "联系信息" - }, - "continue": { - "message": "继续" - }, - "continueToCoinbasePay": { - "message": "继续使用Coinbase Pay" - }, - "continueToMoonPay": { - "message": "继续使用MoonPay" - }, - "continueToTransak": { - "message": "继续前往 Transak" - }, - "continueToWyre": { - "message": "继续前往 Wyre" - }, - "contract": { - "message": "合约" - }, - "contractAddress": { - "message": "合约地址" - }, - "contractAddressError": { - "message": "您正在向代币的合约地址发送代币。这可能导致这些代币丢失。" - }, - "contractDeployment": { - "message": "合约部署" - }, - "contractInteraction": { - "message": "合约交互" - }, - "convertTokenToNFTDescription": { - "message": "我们检测到该资产是NFT。Metamask现在完全原生支持NFT。您想将它从您的代币列表中删除并将它添加为NFT吗?" - }, - "convertTokenToNFTExistDescription": { - "message": "我们检测到该资产已作为NFT添加。是否要将其从代币列表中删除?" - }, - "copiedExclamation": { - "message": "已复制!" - }, - "copyAddress": { - "message": "复制地址到剪贴板" - }, - "copyPrivateKey": { - "message": "这是您的私钥(点击以复制)" - }, - "copyRawTransactionData": { - "message": "复制原始交易数据" - }, - "copyToClipboard": { - "message": "复制到剪贴板" - }, - "copyTransactionId": { - "message": "复制交易 ID" - }, - "create": { - "message": "创建" - }, - "createAWallet": { - "message": "创建钱包" - }, - "createAccount": { - "message": "创建账户" - }, - "createNewWallet": { - "message": "创建新钱包" - }, - "createPassword": { - "message": "创建密码" - }, - "currencyConversion": { - "message": "货币转换" - }, - "currencySymbol": { - "message": "货币符号" - }, - "currencySymbolDefinition": { - "message": "此网络的货币显示的股票代码。" - }, - "currentAccountNotConnected": { - "message": "您的当前账户没有连接" - }, - "currentExtension": { - "message": "当前扩展程序页面" - }, - "currentLanguage": { - "message": "当前语言" - }, - "currentTitle": { - "message": "当前:" - }, - "currentlyUnavailable": { - "message": "在此网络上不可用" - }, - "curveHighGasEstimate": { - "message": "高价燃料估算图" - }, - "curveLowGasEstimate": { - "message": "低价燃料估算图" - }, - "curveMediumGasEstimate": { - "message": "市场价燃料估算图" - }, - "custom": { - "message": "高级" - }, - "customContentSearch": { - "message": "搜索以前添加的网络" - }, - "customGas": { - "message": "自定义燃料" - }, - "customGasSettingToolTipMessage": { - "message": "使用$1来定制燃料价格。如果您不熟悉这可能会引起混淆。操作风险自付。", - "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold fontweight" - }, - "customGasSubTitle": { - "message": "提升费用可能会缩短处理时间,但不能保证。" - }, - "customSpendLimit": { - "message": "自定义消费限额" - }, - "customToken": { - "message": "自定义代币" - }, - "customTokenWarningInNonTokenDetectionNetwork": { - "message": "代币检测在此网络上尚不可用。请手动导入代币并确保您信任它。了解 $1" - }, - "customTokenWarningInTokenDetectionNetwork": { - "message": "手动导入代币前,请确保您信任它。了解 $1。" - }, - "customerSupport": { - "message": "客户支持" - }, - "dappSuggested": { - "message": "建议的网站" - }, - "dappSuggestedGasSettingToolTipMessage": { - "message": "$1 建议了这个价格。", - "description": "$1 is url for the dapp that has suggested gas settings" - }, - "dappSuggestedShortLabel": { - "message": "网站" - }, - "dappSuggestedTooltip": { - "message": "$1 建议了这个价格。", - "description": "$1 represents the Dapp's origin" - }, - "darkTheme": { - "message": "深色" - }, - "data": { - "message": "数据" - }, - "dataBackupFoundInfo": { - "message": "您的部分账户数据已在之前安装 MetaMask 时备份。其中可能包括您的设置、联系人和代币。您现在想恢复这些数据吗?" - }, - "dataHex": { - "message": "十六进制" - }, - "decimal": { - "message": "代币小数" - }, - "decimalsMustZerotoTen": { - "message": "小数位至少为0,且不得超过36。" - }, - "decrypt": { - "message": "解密" - }, - "decryptCopy": { - "message": "复制加密消息" - }, - "decryptInlineError": { - "message": "由于错误:$1,无法解密此消息", - "description": "$1 is error message" - }, - "decryptMessageNotice": { - "message": "$1 希望阅读此消息来完成您的操作", - "description": "$1 is the web3 site name" - }, - "decryptMetamask": { - "message": "解密消息" - }, - "decryptRequest": { - "message": "解密请求" - }, - "delete": { - "message": "删除" - }, - "deleteAccount": { - "message": "删除账户" - }, - "deleteNetwork": { - "message": "删除网络?" - }, - "deleteNetworkDescription": { - "message": "您确定要删除该网络吗?" - }, - "depositCrypto": { - "message": "存入$1", - "description": "$1 represents the cypto symbol to be purchased" - }, - "description": { - "message": "描述" - }, - "details": { - "message": "详细信息" - }, - "directDepositCrypto": { - "message": "直接存入$1" - }, - "directDepositCryptoExplainer": { - "message": "如果您已经有了一些$1,那么在您的新钱包里获得$1的最快方式是直接存入。" - }, - "disabledGasOptionToolTipMessage": { - "message": "“$1”已被禁用,因为它不满足在原来的燃料费用基础上至少增加10%的要求。", - "description": "$1 is gas estimate type which can be market or aggressive" - }, - "disconnect": { - "message": "断开连接" - }, - "disconnectAllAccounts": { - "message": "断开所有账户的连接" - }, - "disconnectAllAccountsConfirmationDescription": { - "message": "您确定要断开连接吗?您可能会失去网站功能。" - }, - "disconnectPrompt": { - "message": "断开连接 $1" - }, - "disconnectThisAccount": { - "message": "断开此账户的连接" - }, - "dismiss": { - "message": "关闭" - }, - "dismissReminderDescriptionField": { - "message": "开启此选项以关闭账户助记词备份提醒消息。我们强烈建议您备份您的账户助记词,以避免资金损失" - }, - "dismissReminderField": { - "message": "关闭账户助记词备份提醒" - }, - "domain": { - "message": "域" - }, - "done": { - "message": "完成" - }, - "dontShowThisAgain": { - "message": "不再显示此内容" - }, - "downArrow": { - "message": "向下箭头" - }, - "downloadGoogleChrome": { - "message": "下载 Google Chrome 浏览器" - }, - "downloadSecretBackup": { - "message": "下载此账户助记词,并将其安全保存在外部加密硬盘或存储介质上。" - }, - "downloadStateLogs": { - "message": "下载状态日志" - }, - "dropped": { - "message": "已放弃" - }, - "edit": { - "message": "编辑" - }, - "editANickname": { - "message": "编辑昵称" - }, - "editAddressNickname": { - "message": "编辑地址昵称" - }, - "editCancellationGasFeeModalTitle": { - "message": "编辑取消燃料费用" - }, - "editContact": { - "message": "编辑联系信息" - }, - "editGasEducationButtonText": { - "message": "我应该如何选择?" - }, - "editGasEducationHighExplanation": { - "message": "这最适合对时间敏感的交易(如交换),因为它能增加交易成功的可能性。如果交换需要太长的时间来处理,它可能会失败,并导致您损失一些燃料费。" - }, - "editGasEducationLowExplanation": { - "message": "只有在处理时间不太重要时才能使用较低的燃料费用。较低的费用使我们难以预测您的交易何时(或会否)成功。" - }, - "editGasEducationMediumExplanation": { - "message": "中燃料费用适合用于发送、提取或其他非时间敏感交易。此设置最常导致交易成功。" - }, - "editGasEducationModalIntro": { - "message": "选择合适的燃料费取决于交易的类型和它对您的重要性。" - }, - "editGasEducationModalTitle": { - "message": "如何选择?" - }, - "editGasFeeModalTitle": { - "message": "编辑网络费" - }, - "editGasHigh": { - "message": "高" - }, - "editGasLimitOutOfBounds": { - "message": "燃料上限至少为 $1" - }, - "editGasLimitOutOfBoundsV2": { - "message": "燃料上限必须大于 $1 且小于 $2", - "description": "$1 is the minimum limit for gas and $2 is the maximum limit" - }, - "editGasLimitTooltip": { - "message": "燃料上限是您愿意使用的最大燃料单位。燃料单位是“最大优先费”和“最大费用”的乘数。" - }, - "editGasLow": { - "message": "低" - }, - "editGasMaxBaseFeeGWEIImbalance": { - "message": "最大基本费用不能低于优先费用" - }, - "editGasMaxBaseFeeHigh": { - "message": "最大基本费用高于必要水平" - }, - "editGasMaxBaseFeeLow": { - "message": "对于当前网络条件而言,最大基本费用较低" - }, - "editGasMaxFeeHigh": { - "message": "最大费用高于必要水平" - }, - "editGasMaxFeeLow": { - "message": "对于网络条件而言,最大费用过低" - }, - "editGasMaxFeePriorityImbalance": { - "message": "最大费用不能低于最大优先费用" - }, - "editGasMaxFeeTooltip": { - "message": "最大费用是您将支付的最大费用(基本费用+优先费用)。" - }, - "editGasMaxPriorityFeeBelowMinimum": { - "message": "最大优先费用必须大于0 GWEI。" - }, - "editGasMaxPriorityFeeBelowMinimumV2": { - "message": "优先费用必须大于0。" - }, - "editGasMaxPriorityFeeHigh": { - "message": "最大优先费用高于必要水平。您可以支付超过所需的费用。" - }, - "editGasMaxPriorityFeeHighV2": { - "message": "优先费用高于必要水平。您可以支付超过所需的费用" - }, - "editGasMaxPriorityFeeLow": { - "message": "对于当前网络条件而言,最大优先费用较低" - }, - "editGasMaxPriorityFeeLowV2": { - "message": "对于当前网络条件而言,优先费用较低" - }, - "editGasMaxPriorityFeeTooltip": { - "message": "最大优先费(又称“矿工费”)直接向矿工支付,激励他们优先处理您的交易。您通常会支付您的最大设置" - }, - "editGasMedium": { - "message": "中" - }, - "editGasPriceTooLow": { - "message": "燃料价格必须大于0" - }, - "editGasPriceTooltip": { - "message": "此网络在提交交易时需要一个“燃料价格”字段。燃料价格是您支付的每单位燃料金额。" - }, - "editGasSubTextAmountLabel": { - "message": "最大金额:", - "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" - }, - "editGasSubTextFeeLabel": { - "message": "最大费用:" - }, - "editGasTitle": { - "message": "编辑优先级" - }, - "editGasTooLow": { - "message": "处理时间未知" - }, - "editGasTooLowTooltip": { - "message": "对于当前的市场条件而言,您的最大费用或最大优先费用可能较低。我们不知道您的交易将在何时(或会否)处理。" - }, - "editGasTooLowWarningTooltip": { - "message": "这降低了您的最大费用,但如果网络流量增加,您的交易可能会被延迟或失败。" - }, - "editNonceField": { - "message": "编辑 Nonce" - }, - "editNonceMessage": { - "message": "这是高级功能,请谨慎使用。" - }, - "editPermission": { - "message": "编辑权限" - }, - "editSpeedUpEditGasFeeModalTitle": { - "message": "编辑加速燃料费用" - }, - "enableAutoDetect": { - "message": " 启用自动检测" - }, - "enableEIP1559V2": { - "message": "启用增强型燃料费用户界面" - }, - "enableEIP1559V2AlertMessage": { - "message": "我们已经更新了燃料费用估算和定制的方式。" - }, - "enableEIP1559V2ButtonText": { - "message": "在设置中开启增强型燃料费用户界面" - }, - "enableEIP1559V2Description": { - "message": "我们已经更新了燃料估算和定制的方式。如果您想使用新的燃料体验,请开启。$1", - "description": "$1 here is Learn More link" - }, - "enableEIP1559V2Header": { - "message": "新燃料体验" - }, - "enableFromSettings": { - "message": " 从设置中启用它。" - }, - "enableOpenSeaAPI": { - "message": "启用 OpenSea API" - }, - "enableOpenSeaAPIDescription": { - "message": "使用 OpenSea 的 API 获取 NFT 数据。NFT 自动检测依赖于 OpenSea 的 API,在后者关闭时自动检测将不可用。" - }, - "enableSmartTransactions": { - "message": "启用智能交易" - }, - "enableToken": { - "message": "启用 $1", - "description": "$1 is a token symbol, e.g. ETH" - }, - "encryptionPublicKeyNotice": { - "message": "$1 想要您的加密公钥。同意后,该网站将可以向您发送加密消息。", - "description": "$1 is the web3 site name" - }, - "encryptionPublicKeyRequest": { - "message": "申请加密公钥" - }, - "endOfFlowMessage1": { - "message": "您通过了测试——保管好您的账户助记词,这是您的责任!" - }, - "endOfFlowMessage10": { - "message": "全部完成" - }, - "endOfFlowMessage2": { - "message": "安全保存技巧" - }, - "endOfFlowMessage3": { - "message": "在多处保存备份。" - }, - "endOfFlowMessage4": { - "message": "绝不向任何人分享该账户助记词。" - }, - "endOfFlowMessage5": { - "message": "谨防网络钓鱼!MetaMask 绝不会主动要求您提供个人账户助记词。" - }, - "endOfFlowMessage6": { - "message": "如果您需要再次备份账户助记词,请通过“设置 -> 安全”选项完成该操作。" - }, - "endOfFlowMessage7": { - "message": "如果您有任何疑问或发现可疑之处,请联系我们的支持部门 $1。", - "description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." - }, - "endOfFlowMessage8": { - "message": "MetaMask 无法恢复您的账户助记词。" - }, - "endOfFlowMessage9": { - "message": "了解更多。" - }, - "endpointReturnedDifferentChainId": { - "message": "RPC 端点使用链不同的链 ID: $1", - "description": "$1 is the return value of eth_chainId from an RPC endpoint" - }, - "ensIllegalCharacter": { - "message": "ENS 的非法字符。" - }, - "ensNotFoundOnCurrentNetwork": { - "message": "未在当前网络找到 ENS 名称。请尝试切换至以太坊主网。" - }, - "ensNotSupportedOnNetwork": { - "message": "网络不支持 ENS" - }, - "ensRegistrationError": { - "message": "ENS 名称注册错误" - }, - "ensUnknownError": { - "message": "ENS 查找失败。" - }, - "enterMaxSpendLimit": { - "message": "输入最大消费限额" - }, - "enterPassword": { - "message": "输入密码" - }, - "enterPasswordContinue": { - "message": "输入密码继续" - }, - "errorCode": { - "message": "代码:$1", - "description": "Displayed error code for debugging purposes. $1 is the error code" - }, - "errorDetails": { - "message": "错误详情", - "description": "Title for collapsible section that displays error details for debugging purposes" - }, - "errorMessage": { - "message": "信息:$1", - "description": "Displayed error message for debugging purposes. $1 is the error message" - }, - "errorName": { - "message": "代码:$1", - "description": "Displayed error name for debugging purposes. $1 is the error name" - }, - "errorPageMessage": { - "message": "通过重新加载页面再试一次,或联系支持部门 $1。", - "description": "Message displayed on generic error page in the fullscreen or notification UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." - }, - "errorPagePopupMessage": { - "message": "通过关闭并重新打开弹出窗口再试一次,或联系支持部门 $1。", - "description": "Message displayed on generic error page in the popup UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." - }, - "errorPageTitle": { - "message": "MetaMask 遇到了一个错误", - "description": "Title of generic error page" - }, - "errorStack": { - "message": "栈:", - "description": "Title for error stack, which is displayed for debugging purposes" - }, - "estimatedProcessingTimes": { - "message": "预计处理时间" - }, - "ethGasPriceFetchWarning": { - "message": "由于目前主要的燃料估算服务不可用,因此提供了备用燃料价格。" - }, - "ethereumPublicAddress": { - "message": "以太坊公共地址" - }, - "etherscan": { - "message": "Etherscan" - }, - "etherscanView": { - "message": "在 Etherscan 上查看账户" - }, - "etherscanViewOn": { - "message": "在 Etherscan 上查看" - }, - "expandExperience": { - "message": "扩展您的web3体验" - }, - "expandView": { - "message": "展开视图" - }, - "experimental": { - "message": "试验" - }, - "exportPrivateKey": { - "message": "导出私钥" - }, - "externalExtension": { - "message": "外部扩展程序" - }, - "failed": { - "message": "失败" - }, - "failedToFetchChainId": { - "message": "无法获取链 ID。您的 RPC URL 正确吗?" - }, - "failedToFetchTickerSymbolData": { - "message": "股票代码验证数据当前未能提供,请确保您输入的代码正确无误。这会影响您在此网络看到的兑换率" - }, - "failureMessage": { - "message": "出了点问题,我们无法完成此操作" - }, - "fast": { - "message": "快" - }, - "fastest": { - "message": "最快" - }, - "feeAssociatedRequest": { - "message": "此请求需要支付一定的费用。" - }, - "fiat": { - "message": "法币", - "description": "Exchange type" - }, - "fileImportFail": { - "message": "文件导入失败?点击这里!", - "description": "Helps user import their account from a JSON file" - }, - "flaskSnapSettingsCardButtonCta": { - "message": "查看详细信息", - "description": "Call to action a user can take to see more information about the Snap that is installed" - }, - "flaskSnapSettingsCardDateAddedOn": { - "message": "添加于", - "description": "Start of the sentence describing when and where snap was added" - }, - "flaskSnapSettingsCardFrom": { - "message": "自", - "description": "Part of the sentence describing when and where snap was added" - }, - "flaskWelcomeUninstall": { - "message": "您应该卸载此扩展程序", - "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." - }, - "flaskWelcomeWarning1": { - "message": "Flask供开发人员试验不稳定的新API。除非您是开发人员或Beta测试人员,否则请$1。", - "description": "This is a warning shown on the Flask Welcome screen, intended to encourage non-developers not to proceed any further. $1 is the bolded message 'flaskWelcomeUninstall'" - }, - "flaskWelcomeWarning2": { - "message": "我们不保证此扩展程序的安全性或稳定性。Flask提供的新API并未针对网络钓鱼攻击进行强化,这意味着任何需要Flask的站点或快取都可能是窃取您资产的恶意企图。", - "description": "This explains the risks of using MetaMask Flask" - }, - "flaskWelcomeWarning3": { - "message": "所有Flask API都是实验性的。它们可能会在未事先通知的情况下被更改或删除,它们也可能会无限期地留在Flask上而不会迁移到稳定的MetaMask。您需要自行承担使用它们的风险。", - "description": "This message warns developers about unstable Flask APIs" - }, - "flaskWelcomeWarning4": { - "message": "确保在使用Flask时禁用常规MetaMask扩展程序。", - "description": "This message calls to pay attention about multiple versions of MetaMask running on the same site (Flask + Prod)" - }, - "flaskWelcomeWarningAcceptButton": { - "message": "我接受风险", - "description": "this text is shown on a button, which the user presses to confirm they understand the risks of using Flask" - }, - "followUsOnTwitter": { - "message": "在 Twitter 上关注我们" - }, - "forbiddenIpfsGateway": { - "message": "禁用的 IPFS 网关:请指定一个 CID 网关" - }, - "forgetDevice": { - "message": "忽略此设备" - }, - "forgotPassword": { - "message": "忘记密码了?" - }, - "from": { - "message": "自" - }, - "fromAddress": { - "message": "从:$1", - "description": "$1 is the address to include in the From label. It is typically shortened first using shortenAddress" - }, - "fromTokenLists": { - "message": "从代币列表:$1" - }, - "functionApprove": { - "message": "功能:批准" - }, - "functionSetApprovalForAll": { - "message": "功能:SetApprovalForAll" - }, - "functionType": { - "message": "功能类型" - }, - "gas": { - "message": "燃料" - }, - "gasDisplayAcknowledgeDappButtonText": { - "message": "编辑建议的燃料费" - }, - "gasDisplayDappWarning": { - "message": "这笔燃料费是由 $1 建议的。忽略它可能会导致您的交易出现问题。如果您有疑问,请联系 $1。", - "description": "$1 represents the Dapp's origin" - }, - "gasEstimatesUnavailableWarning": { - "message": "无法获取我们的低、中、高估计值。" - }, - "gasFee": { - "message": "燃料费" - }, - "gasLimit": { - "message": "燃料上限" - }, - "gasLimitInfoTooltipContent": { - "message": "燃料上限是指您愿意花费的最大燃料单位量。" - }, - "gasLimitRecommended": { - "message": "建议的燃料上限是$1。如果燃料上限低于此值,则可能会失败。" - }, - "gasLimitTooLow": { - "message": "燃料上限至少为21000" - }, - "gasLimitTooLowWithDynamicFee": { - "message": "燃料上限至少为 $1", - "description": "$1 is the custom gas limit, in decimal." - }, - "gasLimitV2": { - "message": "燃料限制" - }, - "gasOption": { - "message": "燃料选项" - }, - "gasPrice": { - "message": "Gas 价格 (GWEI)" - }, - "gasPriceExcessive": { - "message": "您的燃料费设置得过高。请考虑降低金额。" - }, - "gasPriceExcessiveInput": { - "message": "燃料价格过高" - }, - "gasPriceExtremelyLow": { - "message": "燃料价格极低" - }, - "gasPriceFetchFailed": { - "message": "由于网络错误,燃料价格估算失败。" - }, - "gasPriceInfoTooltipContent": { - "message": "燃料价格指明了您愿意为每单位燃料支付的以太币数量。" - }, - "gasTimingHoursShort": { - "message": "$1 小时", - "description": "$1 represents a number of hours" - }, - "gasTimingMinutes": { - "message": "$1 分钟", - "description": "$1 represents a number of minutes" - }, - "gasTimingMinutesShort": { - "message": "$1 分钟", - "description": "$1 represents a number of minutes" - }, - "gasTimingNegative": { - "message": "可能在 $1 内", - "description": "$1 represents an amount of time" - }, - "gasTimingPositive": { - "message": "有可能在 $1 以内", - "description": "$1 represents an amount of time" - }, - "gasTimingSeconds": { - "message": "$1 秒", - "description": "$1 represents a number of seconds" - }, - "gasTimingSecondsShort": { - "message": "$1 秒", - "description": "$1 represents a number of seconds" - }, - "gasTimingVeryPositive": { - "message": "很可能在 $1 以内", - "description": "$1 represents an amount of time" - }, - "gasUsed": { - "message": "使用的燃料" - }, - "gdprMessage": { - "message": "这些数据是汇总的,因此,根据《通用数据保护条例》(欧盟)2016/679,这些数据是匿名的。有关我们隐私惯例的更多信息,请参见我们的 $1。", - "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" - }, - "gdprMessagePrivacyPolicy": { - "message": "隐私政策", - "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" - }, - "general": { - "message": "常规" - }, - "getEther": { - "message": "获取以太币" - }, - "getEtherFromFaucet": { - "message": "从 $1 的水龙头获取以太币", - "description": "Displays network name for Ether faucet" - }, - "getStarted": { - "message": "开始使用" - }, - "goBack": { - "message": "返回" - }, - "goerli": { - "message": "Goerli 测试网络" - }, - "gotIt": { - "message": "知道了!" - }, - "grantedToWithColon": { - "message": "授予:" - }, - "gwei": { - "message": "GWEI" - }, - "happyToSeeYou": { - "message": "我们很高兴见到您。" - }, - "hardware": { - "message": "硬件" - }, - "hardwareWalletConnected": { - "message": "已连接的硬件钱包" - }, - "hardwareWalletLegacyDescription": { - "message": "(旧)", - "description": "Text representing the MEW path" - }, - "hardwareWalletSupportLinkConversion": { - "message": "点击这里" - }, - "hardwareWallets": { - "message": "连接硬件钱包" - }, - "hardwareWalletsMsg": { - "message": "选择希望用于 MetaMask 的硬件钱包。" - }, - "here": { - "message": "此处", - "description": "as in -click here- for more information (goes with troubleTokenBalances)" - }, - "hexData": { - "message": "十六进制数据" - }, - "hide": { - "message": "隐藏" - }, - "hideFullTransactionDetails": { - "message": "隐藏完整的交易细节" - }, - "hideSeedPhrase": { - "message": "隐藏助记词" - }, - "hideToken": { - "message": "隐藏代币" - }, - "hideTokenPrompt": { - "message": "隐藏代币?" - }, - "hideTokenSymbol": { - "message": "隐藏 $1", - "description": "$1 is the symbol for a token (e.g. 'DAI')" - }, - "hideZeroBalanceTokens": { - "message": "隐藏没有余额的代币" - }, - "high": { - "message": "过高" - }, - "highGasSettingToolTipMessage": { - "message": "使用$1来覆盖网络流量因像流行的 NFT 丢弃而出现的剧增。", - "description": "$1 is key 'high' (text: 'Aggressive') separated here so that it can be passed in with bold fontweight" - }, - "highLowercase": { - "message": "高" - }, - "history": { - "message": "历史记录" - }, - "ignoreAll": { - "message": "忽略所有" - }, - "ignoreTokenWarning": { - "message": "如果您隐藏代币,它们将不会在您的钱包中显示。但您仍然可以通过搜索代币来添加它们。" - }, - "import": { - "message": "导入", - "description": "Button to import an account from a selected file" - }, - "importAccount": { - "message": "导入账户" - }, - "importAccountError": { - "message": "导入账户时出错。" - }, - "importAccountMsg": { - "message": "导入的账户将不会与最初创建的 MetaMask 账户助记词相关联。了解更多有关导入账户的信息" - }, - "importAccountSeedPhrase": { - "message": "使用账户助记词导入钱包" - }, - "importMyWallet": { - "message": "导入我的钱包" - }, - "importNFT": { - "message": "导入 NFT" - }, - "importNFTAddressToolTip": { - "message": "例如,在OpenSea中,NFT页面的详情下,有一个蓝色的超链接值,标记为“合约地址”。如果您点击它,它将带您前往该合约在Etherscan上的地址;在该页面的左上角,应该有一个标记为“合约”的图标,在右侧,有一长串字母和数字。这是创建您的NFT的合约地址。点击地址右侧的“复制”图标,就可以将它复制到剪贴板上。" - }, - "importNFTPage": { - "message": "导入NFT页面" - }, - "importNFTTokenIdToolTip": { - "message": "收藏品的ID是唯一标识符,因为所有NFT都是独一无二的。同样,在OpenSea上,此数字位于“详情”下方。记下它,或将它复制到剪贴板上。" - }, - "importNFTs": { - "message": "添加收藏品" - }, - "importTokenQuestion": { - "message": "导入代币?" - }, - "importTokenWarning": { - "message": "任何人都可以用任何名称创建代币,包括现有代币的虚假版本。添加和交易风险自负!" - }, - "importTokens": { - "message": "添加资产" - }, - "importTokensCamelCase": { - "message": "添加代币" - }, - "importWallet": { - "message": "导入钱包" - }, - "importWithCount": { - "message": "导入$1", - "description": "$1 will the number of detected tokens that are selected for importing, if all of them are selected then $1 will be all" - }, - "importYourExisting": { - "message": "使用账户助记词导入您的现有钱包" - }, - "imported": { - "message": "已导入", - "description": "status showing that an account has been fully loaded into the keyring" - }, - "infuraBlockedNotification": { - "message": "MetaMask 无法连接到区块链主机。请检查可能的原因 $1。", - "description": "$1 is a clickable link with with text defined by the 'here' key" - }, - "initialTransactionConfirmed": { - "message": "您的初始交易已被网络确认。请点击“确定”返回。" - }, - "insufficientBalance": { - "message": "余额不足。" - }, - "insufficientCurrencyBuyOrDeposit": { - "message": "您的账户中没有足够的$1可以支付$2网络上的交易费用。$3或从另一个账户存入。", - "description": "$1 is the native currency of the network, $2 is the name of the current network, $3 is the key 'buy' + the ticker symbol of the native currency of the chain wrapped in a button" - }, - "insufficientCurrencyDeposit": { - "message": "您的账户中没有足够的$1可以支付$2网络上的交易费用。请从另一个账户存入$1。", - "description": "$1 is the native currency of the network, $2 is the name of the current network" - }, - "insufficientFunds": { - "message": "资金不足." - }, - "insufficientFundsForGas": { - "message": "燃料资金不足" - }, - "insufficientTokens": { - "message": "代币不足。" - }, - "invalidAddress": { - "message": "地址无效" - }, - "invalidAddressRecipient": { - "message": "接收方地址无效" - }, - "invalidAddressRecipientNotEthNetwork": { - "message": "非 ETH 网络,请使用小写" - }, - "invalidAssetType": { - "message": "该资产是NFT,需要在NFT选项卡下的“导入NFT”页面上重新添加" - }, - "invalidBlockExplorerURL": { - "message": "无效的区块浏览器 URL" - }, - "invalidChainIdTooBig": { - "message": "无效的链 ID,链 ID 过大。" - }, - "invalidCustomNetworkAlertContent1": { - "message": "需要重新输入自定义网络 '$1' 的链 ID。", - "description": "$1 is the name/identifier of the network." - }, - "invalidCustomNetworkAlertContent2": { - "message": "为了保护您免受恶意或有问题的网络供应商的影响,现在所有的自定义网络都需要有链 ID。" - }, - "invalidCustomNetworkAlertContent3": { - "message": "进入设置 > 网络并输入链 ID。您可以通过 $1 查找最热门网络的链 ID。", - "description": "$1 is a link to https://chainid.network" - }, - "invalidCustomNetworkAlertTitle": { - "message": "无效的自定义网络" - }, - "invalidHexNumber": { - "message": "无效的十六进制数字。" - }, - "invalidHexNumberLeadingZeros": { - "message": "无效的十六进制数字。删除所有前导零。" - }, - "invalidIpfsGateway": { - "message": "无效的 IPFS 网关。该值必须是一个有效的 URL" - }, - "invalidNumber": { - "message": "无效数字。输入一个十进制或带有“0x”前缀的十六进制数字。" - }, - "invalidNumberLeadingZeros": { - "message": "无效数字。删除所有前导零。" - }, - "invalidRPC": { - "message": "RPC URL 无效" - }, - "invalidSeedPhrase": { - "message": "助记词无效" - }, - "invalidSeedPhraseCaseSensitive": { - "message": "输入无效!助记词须区分大小写。" - }, - "ipfsGateway": { - "message": "IPFS 网关" - }, - "ipfsGatewayDescription": { - "message": "输入用于 ENS 内容解析的 IPFS CID 网关的 URL。" - }, - "jazzAndBlockies": { - "message": "哈希头像是帮助您一眼识别账户的独特图标,有 Jazzicons 和 Blockies 两种不同风格。" - }, - "jazzicons": { - "message": "Jazzicons" - }, - "jsDeliver": { - "message": "jsDeliver" - }, - "jsonFile": { - "message": "JSON 文件", - "description": "format for importing an account" - }, - "keystone": { - "message": "Keystone" - }, - "keystoneTutorial": { - "message": " (使用教程)" - }, - "knownAddressRecipient": { - "message": "已知合约地址。" - }, - "knownTokenWarning": { - "message": "此操作将编辑已经在您的钱包中列出的代币,有肯能被用来欺骗您。只有确定要更改这些代币的内容时,才通过此操作。了解更多关于 $1" - }, - "kovan": { - "message": "Kovan 测试网络" - }, - "lastConnected": { - "message": "最后连接" - }, - "learmMoreAboutGas": { - "message": "想要 $1 有关燃料的相关信息吗?" - }, - "learnCancelSpeeedup": { - "message": "学习如何 $1", - "description": "$1 is link to cancel or speed up transactions" - }, - "learnMore": { - "message": "了解更多" - }, - "learnMoreUpperCase": { - "message": "了解更多" - }, - "learnScamRisk": { - "message": "诈骗和安全风险的信息。" - }, - "ledgerAccountRestriction": { - "message": "您需要先使用最后一个账户,然后才能添加新账户。" - }, - "ledgerConnectionInstructionCloseOtherApps": { - "message": "关闭任何连接到您设备的其他软件,然后点击这里刷新。" - }, - "ledgerConnectionInstructionHeader": { - "message": "点击确认前:" - }, - "ledgerConnectionInstructionStepFour": { - "message": "在您的 Ledger 设备上启用“智能合约数据”或“盲签”" - }, - "ledgerConnectionInstructionStepOne": { - "message": "在“设置 > 高级”下启用使用 Ledger Live" - }, - "ledgerConnectionInstructionStepThree": { - "message": "在您的 Ledger 设备中插入并选择 Ethereum 应用程序" - }, - "ledgerConnectionInstructionStepTwo": { - "message": "打开和解锁 Ledger Live 应用程序" - }, - "ledgerConnectionPreferenceDescription": { - "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": { - "message": "Ledger 设备打开失败。您的 Ledger 可能已连接到其他软件。请关闭 Ledger Live 或其他连接到您的 Ledger 设备的应用程序,并尝试再次连接。" - }, - "ledgerLive": { - "message": "Ledger Live", - "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." - }, - "ledgerLiveApp": { - "message": "Ledger Live 应用程序" - }, - "ledgerLocked": { - "message": "无法连接到 Ledger 设备。请确保您的设备已解锁并打开 Etherum 应用程序。" - }, - "ledgerTimeout": { - "message": "Ledger Live 响应时间过长或连接超时。请确保 Ledger Live 应用程序已打开且您的设备已解锁。" - }, - "ledgerTransportChangeWarning": { - "message": "如果您的 Ledger Live 应用程序已打开,请断开任何打开的 Ledger Live 的连接并关闭 Ledger Live 应用程序。" - }, - "ledgerWebHIDNotConnectedErrorMessage": { - "message": "Ledger 设备未连接。如果您想要连接您的 Ledger,请再次点击“继续”并批准 HID 连接", - "description": "An error message shown to the user during the hardware connect flow." - }, - "letsGoSetUp": { - "message": "是的,让我们开始吧!" - }, - "levelArrow": { - "message": "水平箭头" - }, - "lightTheme": { - "message": "浅色" - }, - "likeToImportTokens": { - "message": "您想导入这些代币吗?" - }, - "link": { - "message": "链接" - }, - "links": { - "message": "链接" - }, - "loadMore": { - "message": "加载更多" - }, - "loading": { - "message": "正在加载..." - }, - "loadingNFTs": { - "message": "正在加载NFT......" - }, - "loadingTokens": { - "message": "加载代币中……" - }, - "localhost": { - "message": "Localhost 8545" - }, - "lock": { - "message": "注销" - }, - "lockTimeTooGreat": { - "message": "锁定时间过长" - }, - "logo": { - "message": "$1标志", - "description": "$1 is the name of the ticker" - }, - "low": { - "message": "低" - }, - "lowGasSettingToolTipMessage": { - "message": "使用$1等待较便宜的价格。时间估计远不准确,因为价格有些难以预测。", - "description": "$1 is key 'low' separated here so that it can be passed in with bold fontweight" - }, - "lowLowercase": { - "message": "低" - }, - "lowPriorityMessage": { - "message": "以后的交易将在这个时候之后排队。最后一次看到的价格是在一段时间之前。" - }, - "mainnet": { - "message": "以太坊主网" - }, - "mainnetToken": { - "message": "该地址与已知的以太坊主网代币地址匹配。重新检查您尝试添加的代币的合约地址和网络。" - }, - "makeAnotherSwap": { - "message": "创建新的交换" - }, - "makeSureNoOneWatching": { - "message": "请确保没有人在观看您的屏幕", - "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" - }, - "malformedData": { - "message": "格式错误的数据" - }, - "manageSnaps": { - "message": "管理已安装的Snap" - }, - "max": { - "message": "最大" - }, - "maxBaseFee": { - "message": "最大基本费用" - }, - "maxFee": { - "message": "最大费用" - }, - "maxPriorityFee": { - "message": "最大优先费用" - }, - "medium": { - "message": "市场" - }, - "mediumGasSettingToolTipMessage": { - "message": "使用 $1 按当前市场价格快速处理。", - "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold fontweight" - }, - "memo": { - "message": "备注" - }, - "memorizePhrase": { - "message": "记住该账户助记词。" - }, - "message": { - "message": "消息" - }, - "metaMaskConnectStatusParagraphOne": { - "message": "现在您可以更好地控制 MetaMask 中的账户连接。" - }, - "metaMaskConnectStatusParagraphThree": { - "message": "点击它以管理您的连接账户。" - }, - "metaMaskConnectStatusParagraphTwo": { - "message": "连接状态按钮显示所访问的网站是否与您当前选择的账户连接。" - }, - "metamaskDescription": { - "message": "将您连接到以太坊和去中心化网络。" - }, - "metamaskSwapsOfflineDescription": { - "message": "MetaMask Swaps 正在进行维护。请稍后再查看。" - }, - "metamaskVersion": { - "message": "MetaMask 版本" - }, - "metametricsCommitmentsAllowOptOut": { - "message": "始终允许您通过“设置”选择退出" - }, - "metametricsCommitmentsAllowOptOut2": { - "message": "始终可通过设置选择退出" - }, - "metametricsCommitmentsBoldNever": { - "message": "永不", - "description": "This string is localized separately from some of the commitments so that we can bold it" - }, - "metametricsCommitmentsIntro": { - "message": "MetaMask.." - }, - "metametricsCommitmentsNeverCollect": { - "message": "决不收集密钥、地址、交易、余额、哈希或任何个人信息" - }, - "metametricsCommitmentsNeverCollectIP": { - "message": "$1 收集您的完整 IP 地址", - "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" - }, - "metametricsCommitmentsNeverCollectKeysEtc": { - "message": "$1 收集密钥、地址、交易记录、余额、哈希或任何个人信息", - "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" - }, - "metametricsCommitmentsNeverIP": { - "message": "永不收集您的完整 IP 地址" - }, - "metametricsCommitmentsNeverSell": { - "message": "决不出售数据牟利。绝对不会!" - }, - "metametricsCommitmentsNeverSellDataForProfit": { - "message": "$1 为利益而出售您的数据,永远不会!", - "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" - }, - "metametricsCommitmentsSendAnonymizedEvents": { - "message": "发送匿名化点击和页面浏览事件" - }, - "metametricsHelpImproveMetaMask": { - "message": "帮助我们改进 MetaMask" - }, - "metametricsOptInDescription": { - "message": "MetaMask 希望收集使用数据,以更好地了解我们的用户如何与扩展程序交互。这些数据将被用于持续改进我们产品和以太坊生态系统的可用性和用户体验。" - }, - "metametricsOptInDescription2": { - "message": "我们想要收集基本使用数据以提高我们产品的可用性。这些数据将......" - }, - "metametricsTitle": { - "message": "和600多万用户一起改进 MetaMask" - }, - "mismatchedChainLinkText": { - "message": "验证网络信息", - "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." - }, - "mismatchedChainRecommendation": { - "message": "我们建议您在继续之前$1。", - "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key. The link will open to instructions for users to validate custom network details." - }, - "mismatchedNetworkName": { - "message": "根据我们的记录,该网络名称可能与此链ID不匹配。" - }, - "mismatchedNetworkSymbol": { - "message": "所提交的货币符号与我们对此链ID的预期不匹配。" - }, - "mismatchedRpcUrl": { - "message": "根据我们的记录,所提交的RPC URL值与此链ID的已知提供者不匹配。" - }, - "missingNFT": { - "message": "找不到您的 NFT?" - }, - "missingSetting": { - "message": "找不到设置吗?" - }, - "missingSettingRequest": { - "message": "在这里请求" - }, - "missingToken": { - "message": "没有看到您的代币?" - }, - "mobileSyncWarning": { - "message": "“与扩展程序同步”功能暂时被禁用。如果您想要在 MetaMask 移动设备上使用您的扩展程序钱包,那么在您的移动应用程序上:返回钱包设置选项并选择“使用账户助记词导入”选项。使用您的扩展程序钱包的助记词来将您的钱包导入移动设备。" - }, - "mustSelectOne": { - "message": "至少选择1种代币。" - }, - "myAccounts": { - "message": "我的账户" - }, - "name": { - "message": "名称" - }, - "needCryptoInWallet": { - "message": "要使用MetaMask与去中心化应用程序互动,您的钱包中需要有$1。", - "description": "$1 represents the cypto symbol to be purchased" - }, - "needHelp": { - "message": "需要帮助?请联系 $1", - "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" - }, - "needHelpFeedback": { - "message": "分享您的反馈" - }, - "needHelpLinkText": { - "message": "MetaMask 支持" - }, - "needHelpSubmitTicket": { - "message": "提交工单" - }, - "needImportFile": { - "message": "您必须选择一个文件来导入。", - "description": "User is important an account and needs to add a file to continue" - }, - "negativeETH": { - "message": "不能发负值的 ETH。" - }, - "network": { - "message": "网络: " - }, - "networkAddedSuccessfully": { - "message": "网络添加成功!" - }, - "networkDetails": { - "message": "网络详情" - }, - "networkIsBusy": { - "message": "网络繁忙。燃料价格较高,估值较不准确。" - }, - "networkName": { - "message": "网络名称" - }, - "networkNameAvalanche": { - "message": "Avalanche" - }, - "networkNameBSC": { - "message": "BSC" - }, - "networkNameDefinition": { - "message": "与此网络关联的名称。" - }, - "networkNameEthereum": { - "message": "以太坊" - }, - "networkNamePolygon": { - "message": "Polygon" - }, - "networkNameTestnet": { - "message": "Testnet" - }, - "networkSettingsChainIdDescription": { - "message": "链 ID 用于签署交易。它必须与网络返回的链 ID 相匹配。您可以输入十进制或以'0x'开头的十六进制数字,但我们将以十进制显示该数字。" - }, - "networkStatus": { - "message": "网络状态" - }, - "networkStatusBaseFeeTooltip": { - "message": "基本费用由网络设定,每13-14秒更改一次。我们的 $1 和 $2 选项用于剧增。", - "description": "$1 and $2 are bold text for Medium and Aggressive respectively." - }, - "networkStatusPriorityFeeTooltip": { - "message": "优先费用(又称“矿工费”)。这笔费用直接向矿工支付,激励他们优先处理您的交易。" - }, - "networkStatusStabilityFeeTooltip": { - "message": "相对过去72小时,燃料费用为 $1。", - "description": "$1 is networks stability value - stable, low, high" - }, - "networkURL": { - "message": "网络 URL" - }, - "networkURLDefinition": { - "message": "用于访问此网络的 URL。" - }, - "networks": { - "message": "网络" - }, - "nevermind": { - "message": "没关系" - }, - "newAccount": { - "message": "新账户" - }, - "newAccountDetectedDialogMessage": { - "message": "检测到新地址!点击这里以添加到您的地址簿。" - }, - "newAccountNumberName": { - "message": "账户 $1", - "description": "Default name of next account to be created on create account screen" - }, - "newCollectibleAddedMessage": { - "message": "收藏品已成功添加!" - }, - "newContact": { - "message": "新联系人" - }, - "newContract": { - "message": "新合约" - }, - "newNFTDetectedMessage": { - "message": "允许 MetaMask 自动检测 Opensea 的 NFT 并在您的钱包中显示。" - }, - "newNFTsDetected": { - "message": "新功能!NFT 检测" - }, - "newNetworkAdded": { - "message": "成功添加了 “$1”!" - }, - "newPassword": { - "message": "新密码(至少 8 个字符)" - }, - "newToMetaMask": { - "message": "MetaMask 的新用户?" - }, - "newTokensImportedMessage": { - "message": "您已成功导入$1。", - "description": "$1 is the string of symbols of all the tokens imported" - }, - "newTokensImportedTitle": { - "message": "已导入代币" - }, - "newTotal": { - "message": "新总额" - }, - "newTransactionFee": { - "message": "新交易费用" - }, - "newValues": { - "message": "新的值" - }, - "next": { - "message": "下一步" - }, - "nextNonceWarning": { - "message": "Nonce 高于建议的 nouce 值 $1", - "description": "The next nonce according to MetaMask's internal logic" - }, - "nft": { - "message": "非同质化代币(NFT)" - }, - "nftTokenIdPlaceholder": { - "message": "输入代币ID" - }, - "nfts": { - "message": "收藏品" - }, - "nickname": { - "message": "昵称" - }, - "noAccountsFound": { - "message": "未找到符合给定查询条件的账户" - }, - "noAddressForName": { - "message": "此名称尚未设置地址。" - }, - "noAlreadyHaveSeed": { - "message": "不,我已经有一个账户助记词" - }, - "noConversionDateAvailable": { - "message": "没有可用的货币转换日期" - }, - "noConversionRateAvailable": { - "message": "无可用汇率" - }, - "noNFTs": { - "message": "尚无 NFT" - }, - "noSnaps": { - "message": "没有安装Snap" - }, - "noThanks": { - "message": "不,谢谢" - }, - "noThanksVariant2": { - "message": "不,谢谢." - }, - "noTransactions": { - "message": "您没有任何交易" - }, - "noWebcamFound": { - "message": "未找到您电脑的网络摄像头。请重试。" - }, - "noWebcamFoundTitle": { - "message": "未找到网络摄像头" - }, - "nonce": { - "message": "nonce" - }, - "nonceField": { - "message": "自定义交易 nonce" - }, - "nonceFieldDescription": { - "message": "打开这个功能可以改变确认屏幕上的 nonce(交易号码)。这是一个高级功能,请谨慎使用。" - }, - "nonceFieldHeading": { - "message": "自定义 Nonce" - }, - "notBusy": { - "message": "非忙碌中" - }, - "notCurrentAccount": { - "message": "这是正确的账户吗?这与您钱包中当前选择的账户不同" - }, - "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." - }, - "notifications10DescriptionOne": { - "message": "Ethereum Mainnet、Polygon、BSC 和 Avalanche 网络目前提供经改进的代币检测。 即将推出更多!" - }, - "notifications10DescriptionThree": { - "message": "代币检测功能默认开启。但是您可从设置中禁用它。" - }, - "notifications10DescriptionTwo": { - "message": "我们从第三方代币列表中获取代币。将自动检测在两个以上代币列表中列出的代币。" - }, - "notifications10Title": { - "message": "经改进的代币检测现已推出" - }, - "notifications11Description": { - "message": "代币可由任何人创建,而且名称可以重复。如您看到一个您不信任或未与之交互的代币出现——那么,不信任它会更安全。" - }, - "notifications11Title": { - "message": "欺诈和安全风险" - }, - "notifications12ActionText": { - "message": "启用黑暗模式" - }, - "notifications12Description": { - "message": "扩展程序的深色模式终于来了!若要开启,请前往“设置 -> 实验项”,然后选择一个显示选项:浅色、深色、系统。" - }, - "notifications12Title": { - "message": "何时启用黑暗模式?现在启用黑暗模式! 🕶️🦊" - }, - "notifications13ActionText": { - "message": "显示自定义网络列表" - }, - "notifications13Description": { - "message": "您现在可以轻松添加以下热门自定义网络:Arbitrum、Avalanche、Binance Smart Chain、Fantom、Harmony、Optimism、Palm和Polygon!如需启用此功能,请转到“设置” -> “实验”,然后打开“显示自定义网络列表”!", - "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." - }, - "notifications13Title": { - "message": "添加热门网络" - }, - "notifications1Description": { - "message": "MetaMask Mobile 用户现在可以在他们的移动钱包中交换代币。扫描二维码以获取移动应用程序并开始交换。", - "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." - }, - "notifications1Title": { - "message": "可以在移动设备上交换了!", - "description": "Title for a notification in the 'See What's New' popup. Tells users that they can now use MetaMask Swaps on Mobile." - }, - "notifications3ActionText": { - "message": "了解更多", - "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": "及时了解 MetaMask 安全最佳实践,并从 MetaMask 官方支持部门获取最新的安全提示。", - "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": { - "message": "保持安全", - "description": "Title for a notification in the 'See What's New' popup. Encourages users to consider security." - }, - "notifications4ActionText": { - "message": "开始交换", - "description": "The 'call to action' on the button, or link, of the 'Swap on Binance Smart Chain!' notification. Upon clicking, users will be taken to a page where then can swap tokens on Binance Smart Chain." - }, - "notifications4Description": { - "message": "在您的钱包内获取最优惠的代币交换价格。MetaMask 现在将您连接到币安智能链上的多个去中心化交易所聚合器和专业做市商。", - "description": "Description of a notification in the 'See What's New' popup." - }, - "notifications4Title": { - "message": "在币安智能链上交换", - "description": "Title for a notification in the 'See What's New' popup. Encourages users to do swaps on Binance Smart Chain." - }, - "notifications5Description": { - "message": "您的“Seed Phrase”现在被称为“账户助记词”(Secret Recovery Phrase)。", - "description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update." - }, - "notifications6DescriptionOne": { - "message": "从 Chrome 版本91开始,启用我们的 Ledger 支持 (U2F) 的 API 不再支持硬件钱包。MetaMask 实施了新的 Ledger Live 支持,允许您继续通过 Ledger Live 桌面应用程序连接到您的 Ledger 设备。", - "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 账户。就是这样!", - "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." - }, - "notifications6DescriptionTwo": { - "message": "您可以通过点击“设置 > 高级> 使用 Ledger Live”来启用 Ledger Live 支持。", - "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." - }, - "notifications6Title": { - "message": "Chrome 用户的 Ledger 支持更新", - "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" - }, - "notifications7DescriptionOne": { - "message": "MetaMask v10.1.0 包括使用 Ledger 设备时对 EIP-1559 交易的新支持。", - "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" - }, - "notifications7DescriptionTwo": { - "message": "要在以太坊主网上完成交易,请确保您的 Ledger 设备拥有最新的固件。", - "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." - }, - "notifications7Title": { - "message": "Ledger 固件更新", - "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." - }, - "notifications8ActionText": { - "message": "转到高级设置", - "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 v10.4.0 开始,您不再需要 Ledger Live 即可将您的 Ledger 设备连接到 Metamask。", - "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": { - "message": "为了更轻松和更稳定的 ledger 体验,请转到设置中的“高级”选项卡,将“首选 Ledger 连接类型”切换为“WebHID”。", - "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." - }, - "notifications8Title": { - "message": "Ledger 连接改进", - "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." - }, - "notifications9DescriptionOne": { - "message": "当确认智能合约交易时,我们现在为您提供更多关于“数据”选项卡的见解。" - }, - "notifications9DescriptionTwo": { - "message": "您现在可以在确认之前更好地了解您的交易详情,并且可以更轻松地添加交易地址到您的地址簿,帮助您做出安全和知情的决定。" - }, - "notifications9Title": { - "message": "👓 我们正在使交易更容易阅读。" - }, - "notificationsEmptyText": { - "message": "此处无内容。" - }, - "notificationsHeader": { - "message": "通知" - }, - "notificationsInfos": { - "message": "$1,来自$2", - "description": "$1 is the date at which the notification has been dispatched and $2 is the link to the snap that dispatched the notification." - }, - "notificationsMarkAllAsRead": { - "message": "将所有标记为已读" - }, - "numberOfNewTokensDetected": { - "message": "在此账户中发现 $1 新代币", - "description": "$1 is the number of new tokens detected" - }, - "ofTextNofM": { - "message": "/" - }, - "off": { - "message": "关" - }, - "offlineForMaintenance": { - "message": "离线维护" - }, - "ok": { - "message": "确定" - }, - "on": { - "message": "开" - }, - "onboardingCreateWallet": { - "message": "创建新钱包" - }, - "onboardingImportWallet": { - "message": "导入现有钱包" - }, - "onboardingPinExtensionBillboardAccess": { - "message": "完全访问权限" - }, - "onboardingPinExtensionBillboardDescription": { - "message": "这些扩展程序可以查看和更改信息" - }, - "onboardingPinExtensionBillboardDescription2": { - "message": "在此网站上。" - }, - "onboardingPinExtensionBillboardTitle": { - "message": "扩展程序" - }, - "onboardingPinExtensionChrome": { - "message": "点击浏览器扩展程序图标" - }, - "onboardingPinExtensionDescription": { - "message": "在您的浏览器上固定 MetaMask,以便访问并轻松查看交易确认。" - }, - "onboardingPinExtensionDescription2": { - "message": "您可以通过点击扩展程序打开 MetaMask,并一键访问您的钱包。" - }, - "onboardingPinExtensionDescription3": { - "message": "点击浏览器扩展程序图标即可即时访问它" - }, - "onboardingPinExtensionLabel": { - "message": "固定 MetaMask" - }, - "onboardingPinExtensionStep1": { - "message": "1" - }, - "onboardingPinExtensionStep2": { - "message": "2" - }, - "onboardingPinExtensionTitle": { - "message": "您的 MetaMask 安装完成!" - }, - "onboardingReturnNotice": { - "message": "“$1”将关闭此选项卡,并直接返回到 $2", - "description": "Return the user to the site that initiated onboarding" - }, - "onboardingShowIncomingTransactionsDescription": { - "message": "在您的钱包中显示传入的交易依赖于与 $1 的通信。Etherscan 将有权访问您的以太坊地址和 IP 地址。查看 $2。", - "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." - }, - "onboardingUsePhishingDetectionDescription": { - "message": "网络钓鱼检测警报依赖于与 $1 的通信。jsDeliver 将有权访问您的 IP 地址。查看 $2。", - "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" - }, - "onlyAddTrustedNetworks": { - "message": "恶意网络提供商可能会谎报区块链的状态并记录您的网络活动。只添加您信任的自定义网络。" - }, - "onlyConnectTrust": { - "message": "只连接您信任的网站。" - }, - "openFullScreenForLedgerWebHid": { - "message": "全屏打开 MetaMask 以通过 WebHID 连接您的 ledger。", - "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." - }, - "openSourceCode": { - "message": "检查源代码" - }, - "optional": { - "message": "可选" - }, - "optionalWithParanthesis": { - "message": "(可选)" - }, - "or": { - "message": "或" - }, - "origin": { - "message": "来源" - }, - "osTheme": { - "message": "系统" - }, - "padlock": { - "message": "挂锁" - }, - "parameters": { - "message": "参数" - }, - "participateInMetaMetrics": { - "message": "参加 MetaMetrics" - }, - "participateInMetaMetricsDescription": { - "message": "加入 MetaMetrics ,帮助我们改进 MetaMask" - }, - "password": { - "message": "密码" - }, - "passwordNotLongEnough": { - "message": "密码长度不足" - }, - "passwordSetupDetails": { - "message": "此密码只会在此设备上解锁您的 MetaMask 钱包。MetaMask 无法恢复此密码。" - }, - "passwordStrength": { - "message": "密码强度:$1", - "description": "Return password strength to the user when user wants to create password." - }, - "passwordStrengthDescription": { - "message": "强密码可以提高钱包的安全性,以防设备被盗或被入侵。" - }, - "passwordTermsWarning": { - "message": "我明白 MetaMask 无法为我恢复此密码。$1" - }, - "passwordsDontMatch": { - "message": "密码不匹配" - }, - "pastePrivateKey": { - "message": "请粘贴您的私钥:", - "description": "For importing an account from a private key" - }, - "pending": { - "message": "待处理" - }, - "pendingTransactionInfo": { - "message": "在那笔交易完成之前,这笔交易不会被处理。" - }, - "pendingTransactionMultiple": { - "message": "您有 ($1) 笔待处理的交易" - }, - "pendingTransactionSingle": { - "message": "您有 (1) 笔待处理的交易。", - "description": "$1 is count of pending transactions" - }, - "permissionRequest": { - "message": "权限请求" - }, - "permissionRequestCapitalized": { - "message": "权限请求" - }, - "permission_accessNetwork": { - "message": "访问互联网。", - "description": "The description of the `endowment:network-access` permission." - }, - "permission_accessSnap": { - "message": "连接$1的Snap。", - "description": "The description for the `wallet_snap_*` permission. $1 is the name of the Snap." - }, - "permission_customConfirmation": { - "message": "在MetaMask中显示确认。", - "description": "The description for the `snap_confirm` permission" - }, - "permission_ethereumAccounts": { - "message": "查看您允许的账户的地址(必填)", - "description": "The description for the `eth_accounts` permission" - }, - "permission_longRunning": { - "message": "无限期运行。", - "description": "The description for the `endowment:long-running` permission" - }, - "permission_manageBip44Keys": { - "message": "控制您的“$1”账户和资产。", - "description": "The description for the `snap_getBip44Entropy_*` permission. $1 is the name of a protocol, e.g. 'Filecoin'." - }, - "permission_manageState": { - "message": "在您的设备上存储和管理其数据。", - "description": "The description for the `snap_manageState` permission" - }, - "permission_notifications": { - "message": "显示通知。", - "description": "The description for the `snap_notify` permission" - }, - "permission_unknown": { - "message": "未知权限:$1", - "description": "$1 is the name of a requested permission that is not recognized." - }, - "permissions": { - "message": "权限" - }, - "personalAddressDetected": { - "message": "检测到个人地址。请输入代币合约地址。" - }, - "pleaseConfirm": { - "message": "请确认" - }, - "plusXMore": { - "message": "另外 $1 项", - "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" - }, - "popularCustomNetworks": { - "message": "流行自定义网络" - }, - "preferredLedgerConnectionType": { - "message": "首选 Ledger 连接类型", - "description": "A header for a dropdown in the advanced section of settings. Appears above the ledgerConnectionPreferenceDescription message" - }, - "preparingSwap": { - "message": "正在准备交换......" - }, - "prev": { - "message": "上一个" - }, - "primaryCurrencySetting": { - "message": "主要货币" - }, - "primaryCurrencySettingDescription": { - "message": "选择原生以优先显示链的原生货币(例如 ETH)的值。选择法定货币以优先显示以您所选法定货币显示的值。" - }, - "priorityFee": { - "message": "优先费用" - }, - "priorityFeeProperCase": { - "message": "优先费用" - }, - "privacyMsg": { - "message": "隐私政策" - }, - "privateKey": { - "message": "私钥", - "description": "select this type of file to use to import an account" - }, - "privateKeyWarning": { - "message": "警告:切勿泄露此密钥。任何拥有您私钥的人都可以窃取您账户中持有的任何资产。" - }, - "privateNetwork": { - "message": "私有网络" - }, - "proceedWithTransaction": { - "message": "我仍然想继续" - }, - "proposedApprovalLimit": { - "message": "拟议的审批上限" - }, - "provide": { - "message": "提供" - }, - "publicAddress": { - "message": "公共地址" - }, - "queue": { - "message": "队列" - }, - "queued": { - "message": "队列中" - }, - "reAddAccounts": { - "message": "重新添加任何其他账户" - }, - "reAdded": { - "message": "重新添加" - }, - "readdToken": { - "message": "将来您还可以通过账户选项菜单中的“导入代币”来添加此代币。" - }, - "receive": { - "message": "接收" - }, - "recents": { - "message": "最近" - }, - "recipientAddressPlaceholder": { - "message": "搜索、公共地址 (0x) 或 ENS" - }, - "recommendedGasLabel": { - "message": "建议" - }, - "recoveryPhraseReminderBackupStart": { - "message": "从这里开始" - }, - "recoveryPhraseReminderConfirm": { - "message": "明白了" - }, - "recoveryPhraseReminderHasBackedUp": { - "message": "始终将您的账户助记词保存在安全和秘密的地方" - }, - "recoveryPhraseReminderHasNotBackedUp": { - "message": "需要再次备份您的账户助记词?" - }, - "recoveryPhraseReminderItemOne": { - "message": "切勿与任何人分享您的账户助记词" - }, - "recoveryPhraseReminderItemTwo": { - "message": "MetaMask 团队绝对不会索要您的账户助记词" - }, - "recoveryPhraseReminderSubText": { - "message": "您的账户助记词控制您的所有账户。" - }, - "recoveryPhraseReminderTitle": { - "message": "保护您的资金" - }, - "refreshList": { - "message": "刷新列表" - }, - "reject": { - "message": "拒绝" - }, - "rejectAll": { - "message": "拒绝全部" - }, - "rejectTxsDescription": { - "message": "您将批量拒绝 $1 笔交易。" - }, - "rejectTxsN": { - "message": "拒绝 $1 笔交易" - }, - "rejected": { - "message": "已拒绝" - }, - "remember": { - "message": "记住:" - }, - "remindMeLater": { - "message": "稍后提醒我" - }, - "remove": { - "message": "删除" - }, - "removeAccount": { - "message": "删除账户" - }, - "removeAccountDescription": { - "message": "该账户将从您的钱包中删除。在继续操作前,确认您已拥有该导入账户的原始账户助记词或私钥。您可以通过账户下拉菜单再次导入或创建账户。" - }, - "removeNFT": { - "message": "删除 NFT" - }, - "removeSnap": { - "message": "移除Snap" - }, - "removeSnapConfirmation": { - "message": "您确定要移除$1吗?", - "description": "$1 represents the name of the snap" - }, - "removeSnapDescription": { - "message": "此操作将会删除snap及其数据,并撤销您获授予的权限。" - }, - "replace": { - "message": "替换" - }, - "requestsAwaitingAcknowledgement": { - "message": "待确认的请求" - }, - "required": { - "message": "必需" - }, - "reset": { - "message": "重置" - }, - "resetAccount": { - "message": "重置账户" - }, - "resetAccountDescription": { - "message": "重置账户将清除您的交易历史记录。这不会改变您账户中的余额,也不会要求您重新输入账户助记词。" - }, - "resetWallet": { - "message": "重置钱包" - }, - "resetWalletSubHeader": { - "message": "MetaMask不会保留密码的副本。如果您在解锁账户时遇到问题,需要重置您的钱包。您可以提供设置钱包时使用的助记词,以进行重置。" - }, - "resetWalletUsingSRP": { - "message": "此操作将从此设备中删除您当前的钱包和助记词,以及您编制的账户列表。使用助记词进行重置后,您将会看到一个账户列表(基于用于重置的助记词)。这个新列表将自动包括有余额的账户。您还可以使用之前创建的$1。您导入的自定义账户需要是$2,添加到账户中的任何自定义代币也需要是$3。" - }, - "resetWalletWarning": { - "message": "在继续之前,请确保您所使用的助记词正确无误。您将无法撤消此操作。" - }, - "restartMetamask": { - "message": "重新启动MetaMask" - }, - "restore": { - "message": "恢复" - }, - "restoreWalletPreferences": { - "message": "已找到 $1 的数据备份。您想恢复您的钱包偏好设置吗?", - "description": "$1 is the date at which the data was backed up" - }, - "retryTransaction": { - "message": "重试交易" - }, - "reusedTokenNameWarning": { - "message": "此处的代币使用了与您关注的另一种代币相同的符号,这可能会让人感到困惑或具有欺骗性。" - }, - "revealSeedWords": { - "message": "显示助记词" - }, - "revealSeedWordsDescription": { - "message": "如果更改浏览器或移动计算机,您将需要此助记词才能访问账户。将它们保存在安全、秘密的地方。" - }, - "revealSeedWordsWarning": { - "message": "这些账户助记词可以用来窃取您的所有账户。" - }, - "revealSeedWordsWarningTitle": { - "message": "切勿与任何人分享此账户助记词!" - }, - "revealTheSeedPhrase": { - "message": "显示助记词" - }, - "revokeAllTokensTitle": { - "message": "撤销访问您的所有$1的权限?", - "description": "$1 is the symbol of the token for which the user is revoking approval" - }, - "revokeApproveForAllDescription": { - "message": "通过撤销权限,以下$1将无法再访问您的$2", - "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" - }, - "rinkeby": { - "message": "Rinkeby 测试网络" - }, - "ropsten": { - "message": "Ropsten 测试网络" - }, - "rpcUrl": { - "message": "新的 RPC URL" - }, - "safeTransferFrom": { - "message": "安全转账来自" - }, - "save": { - "message": "保存" - }, - "saveAsCsvFile": { - "message": "保存为 CSV 文件" - }, - "scanInstructions": { - "message": "将二维码放在摄像头前" - }, - "scanQrCode": { - "message": "扫描二维码" - }, - "scrollDown": { - "message": "向下滚动" - }, - "search": { - "message": "搜索" - }, - "searchAccounts": { - "message": "搜索账户" - }, - "searchResults": { - "message": "搜索结果" - }, - "searchSettings": { - "message": "在设置中搜索" - }, - "searchTokens": { - "message": "搜索代币" - }, - "secretBackupPhraseDescription": { - "message": "您的账户助记词可以帮助您轻松备份和恢复个人账户。" - }, - "secretBackupPhraseWarning": { - "message": "警告:切勿向他人透露您的账户助记词。任何拥有该账户助记词的人都可以永远拿走您的以太币。" - }, - "secretPhrase": { - "message": "只有这个钱包上的第一个账户将自动加载。完成此流程后,若要添加额外的账户,点击下拉菜单,然后选择“创建账户”。" - }, - "secretRecoveryPhrase": { - "message": "助记词" - }, - "secureWallet": { - "message": "安全钱包" - }, - "securityAndPrivacy": { - "message": "安全和隐私" - }, - "seedPhraseConfirm": { - "message": "确认助记词" - }, - "seedPhraseEnterMissingWords": { - "message": "确认助记词" - }, - "seedPhraseIntroNotRecommendedButtonCopy": { - "message": "稍后提醒我(不推荐)" - }, - "seedPhraseIntroRecommendedButtonCopy": { - "message": "保护我的钱包(推荐)" - }, - "seedPhraseIntroSidebarBulletFour": { - "message": "写下并存储在多个秘密位置。" - }, - "seedPhraseIntroSidebarBulletOne": { - "message": "保存到密码管理器" - }, - "seedPhraseIntroSidebarBulletThree": { - "message": "存放在保险箱内。" - }, - "seedPhraseIntroSidebarBulletTwo": { - "message": "储存在银行保险库。" - }, - "seedPhraseIntroSidebarCopyOne": { - "message": "您的账户助记词是由12个单词组成的短语,它是您的钱包和资金的“主密钥”" - }, - "seedPhraseIntroSidebarCopyThree": { - "message": "如果有人要求您的恢复短语,他们可能会试图欺骗您并偷窃您的钱包资金" - }, - "seedPhraseIntroSidebarCopyTwo": { - "message": "切勿分享您的账户助记词,包括也不能与 MetaMask 分享!" - }, - "seedPhraseIntroSidebarTitleOne": { - "message": "什么是账户助记词?" - }, - "seedPhraseIntroSidebarTitleThree": { - "message": "我是否应该分享我的账户助记词?" - }, - "seedPhraseIntroSidebarTitleTwo": { - "message": "如何保存我的账户助记词?" - }, - "seedPhraseIntroTitle": { - "message": "保护您的钱包安全" - }, - "seedPhraseIntroTitleCopy": { - "message": "在开始之前,观看这个简短的视频来了解您的账户助记词以及如何保护您的钱包安全。" - }, - "seedPhraseReq": { - "message": "助记词包含 12、15、18、21 或 24 个字词" - }, - "seedPhraseWriteDownDetails": { - "message": "请写下这个由12个单词组成的账户助记词,然后将其保存到您信任并且只有您可以访问的地方。" - }, - "seedPhraseWriteDownHeader": { - "message": "写下您的助记词" - }, - "selectAHigherGasFee": { - "message": "选择更高的燃料费用,加快交易处理速度。*" - }, - "selectAccounts": { - "message": "选择要在此网站上使用的账户" - }, - "selectAll": { - "message": "全部选择" - }, - "selectAnAccount": { - "message": "选择一个账户" - }, - "selectAnAccountAlreadyConnected": { - "message": "此账户已连接到 MetaMask" - }, - "selectEachPhrase": { - "message": "请选择每个单词,以确保其正确性。" - }, - "selectHdPath": { - "message": "选择 HD 路径" - }, - "selectNFTPrivacyPreference": { - "message": "在设置中打开 NFT 检测" - }, - "selectPathHelp": { - "message": "如果您没有看到您期望的账户,请尝试切换 HD 路径。" - }, - "selectType": { - "message": "选择类型" - }, - "selectingAllWillAllow": { - "message": "选择全部将允许本网站查看您当前的所有账户。确保您信任这个网站。" - }, - "send": { - "message": "发送" - }, - "sendAmount": { - "message": "发送金额" - }, - "sendBugReport": { - "message": "向我们发送错误报告。" - }, - "sendSpecifiedTokens": { - "message": "发送 $1", - "description": "Symbol of the specified token" - }, - "sendTo": { - "message": "发送到" - }, - "sendTokens": { - "message": "发送代币" - }, - "sendingDisabled": { - "message": "尚不支持发送ERC-1155 NFT资产。" - }, - "sendingNativeAsset": { - "message": "正在发送 $1", - "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" - }, - "sendingToTokenContractWarning": { - "message": "警告:您将要发送到代币合约,这可能会导致资金损失。$1", - "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" - }, - "setAdvancedPrivacySettings": { - "message": "设置高级隐私设置" - }, - "setAdvancedPrivacySettingsDetails": { - "message": "MetaMask 使用这些可信的第三方服务来提高产品可用性和安全性。" - }, - "setApprovalForAll": { - "message": "设置批准所有" - }, - "setApprovalForAllTitle": { - "message": "批准$1,且无消费限制", - "description": "The token symbol that is being approved" - }, - "settings": { - "message": "设置" - }, - "settingsSearchMatchingNotFound": { - "message": "没有找到匹配的结果." - }, - "shorthandVersion": { - "message": "v$1", - "description": "$1 is replaced by a version string (e.g. 1.2.3)" - }, - "show": { - "message": "显示" - }, - "showAdvancedGasInline": { - "message": "高级燃料控制" - }, - "showAdvancedGasInlineDescription": { - "message": "选择此项可直接在发送和确认界面显示燃料价格和上限控制。" - }, - "showCustomNetworkList": { - "message": "显示自定义网络列表" - }, - "showCustomNetworkListDescription": { - "message": "选择此项,在添加新网络时就会显示附有预填详细信息的网络列表。" - }, - "showFiatConversionInTestnets": { - "message": "在测试网络上显示转换" - }, - "showFiatConversionInTestnetsDescription": { - "message": "选择此项以在测试网络上显示法定货币转换" - }, - "showHexData": { - "message": "显示十六进制数据" - }, - "showHexDataDescription": { - "message": "选择此项以在发送屏幕上显示十六进制数据字段" - }, - "showHide": { - "message": "显示/隐藏" - }, - "showIncomingTransactions": { - "message": "显示传入的交易" - }, - "showIncomingTransactionsDescription": { - "message": "选择此项以使用 Etherscan 在交易列表中显示传入的交易" - }, - "showPermissions": { - "message": "显示权限" - }, - "showPrivateKeys": { - "message": "显示私钥" - }, - "showRecommendations": { - "message": "显示建议" - }, - "showTestnetNetworks": { - "message": "显示测试网络" - }, - "showTestnetNetworksDescription": { - "message": "选择此项以在网络列表中显示测试网络" - }, - "sigRequest": { - "message": "签名请求" - }, - "sign": { - "message": "签名" - }, - "signNotice": { - "message": "谨慎行事。此操作有可能用来从您的账户提取资产。确保您信任此站点。" - }, - "signatureRequest": { - "message": "签名请求" - }, - "signatureRequest1": { - "message": "消息" - }, - "signed": { - "message": "已签名" - }, - "simulationErrorMessageV2": { - "message": "我们无法估算燃料。合约中可能存在错误,这笔交易可能会失败。" - }, - "skip": { - "message": "跳过" - }, - "skipAccountSecurity": { - "message": "跳过账户安全?" - }, - "skipAccountSecurityDetails": { - "message": "我明白,在我备份我的账户助记词之前,我可能会丢失我的账户及其所有资产。" - }, - "slow": { - "message": "慢" - }, - "smartTransaction": { - "message": "智能交易" - }, - "snapAccess": { - "message": "$1的snap可以访问:", - "description": "$1 represents the name of the snap" - }, - "snapAdded": { - "message": "从 $2 添加到 $1", - "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." - }, - "snapError": { - "message": "Snap错误:'$1'。错误代码:'$2'", - "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." - }, - "snapInstall": { - "message": "安装Snap" - }, - "snapInstallWarningCheck": { - "message": "请勾选全部以确认您理解。" - }, - "snapRequestsPermission": { - "message": "此Snap正在请求以下权限:" - }, - "snaps": { - "message": "Snap" - }, - "snapsSettingsDescription": { - "message": "管理您的Snap" - }, - "snapsStatus": { - "message": "Snap状态取决于活动。" - }, - "snapsToggle": { - "message": "Snap仅在启用后才会运行" - }, - "someNetworksMayPoseSecurity": { - "message": "某些网络可能会带来安全和/或隐私风险。在添加和使用网络之前,请先了解风险。" - }, - "somethingWentWrong": { - "message": "哎呀!出了点问题。" - }, - "source": { - "message": "来源" - }, - "speedUp": { - "message": "加速" - }, - "speedUpCancellation": { - "message": "加速该取消操作" - }, - "speedUpExplanation": { - "message": "我们根据当前网络条件更新了燃料费用,将其提高了至少10%(网络要求)。" - }, - "speedUpPopoverTitle": { - "message": "加快交易速度" - }, - "speedUpTooltipText": { - "message": "新燃料费" - }, - "speedUpTransaction": { - "message": "加速该交易" - }, - "spendLimitAmount": { - "message": "消费限额" - }, - "spendLimitInsufficient": { - "message": "消费限额不足" - }, - "spendLimitInvalid": { - "message": "消费限额无效;必须是正数" - }, - "spendLimitPermission": { - "message": "支付限额权限" - }, - "spendLimitRequestedBy": { - "message": "$1 请求的消费限额", - "description": "Origin of the site requesting the spend limit" - }, - "spendLimitTooLarge": { - "message": "消费限额过大" - }, - "srpInputNumberOfWords": { - "message": "我有一个包含$1个单词的助记词", - "description": "This is the text for each option in the dropdown where a user selects how many words their secret recovery phrase has during import. The $1 is the number of words (either 12, 15, 18, 21, or 24)." - }, - "srpPasteFailedTooManyWords": { - "message": "粘贴失败,因为它包含超过24个单词。一个助记词最多可包含24个单词。", - "description": "Description of SRP paste erorr when the pasted content has too many words" - }, - "srpPasteTip": { - "message": "您可以将整个助记词粘贴到任何字段中", - "description": "Our secret recovery phrase input is split into one field per word. This message explains to users that they can paste their entire secrete recovery phrase into any field, and we will handle it correctly." - }, - "srpToggleShow": { - "message": "显示/隐藏助记词中的这个单词", - "description": "Describes a toggle that is used to show or hide a single word of the secret recovery phrase" - }, - "srpWordHidden": { - "message": "这个单词已隐藏", - "description": "Explains that a word in the secret recovery phrase is hidden" - }, - "srpWordShown": { - "message": "这个单词处于显示状态", - "description": "Explains that a word in the secret recovery phrase is being shown" - }, - "stable": { - "message": "稳定" - }, - "stableLowercase": { - "message": "稳定" - }, - "stateLogError": { - "message": "检索状态日志时出错。" - }, - "stateLogFileName": { - "message": "MetaMask 状态日志" - }, - "stateLogs": { - "message": "状态日志" - }, - "stateLogsDescription": { - "message": "状态日志包含您的公共账户地址和已发送的交易。" - }, - "status": { - "message": "状态" - }, - "statusConnected": { - "message": "已连接" - }, - "statusNotConnected": { - "message": "未连接" - }, - "step1LatticeWallet": { - "message": "请确保您的 Lattice1 已准备好连接" - }, - "step1LatticeWalletMsg": { - "message": "当您的 Lattice1 设备设置好并在线时,您可以将 MetaMask 与它连接。解锁您的设备并准备好您的设备 ID。若要了解有关使用硬件钱包的更多信息,$1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, - "step1LedgerWallet": { - "message": "下载 Ledger 应用程序" - }, - "step1LedgerWalletMsg": { - "message": "下载、设置并输入您的密码以解锁 $1。", - "description": "$1 represents the `ledgerLiveApp` localization value" - }, - "step1TrezorWallet": { - "message": "插入 Trezor 钱包" - }, - "step1TrezorWalletMsg": { - "message": "将您的钱包直接连接到电脑。若要了解有关使用硬件钱包设备的更多信息,$1", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, - "step2LedgerWallet": { - "message": "插入 Ledger 钱包" - }, - "step2LedgerWalletMsg": { - "message": "将您的钱包直接连接到电脑。解锁 Ledger 并打开 Ethereum 应用程序。若要了解有关使用您的硬件钱包设备的更多信息,$1。", - "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" - }, - "stillGettingMessage": { - "message": "仍然收到此消息?" - }, - "storePhrase": { - "message": "通过如 1Password 等密码管理工具保存该账户助记词。" - }, - "strong": { - "message": "强" - }, - "stxAreHere": { - "message": "智能交易已推出!" - }, - "stxBenefit1": { - "message": "将交易成本减至最低" - }, - "stxBenefit2": { - "message": "减少交易失败" - }, - "stxBenefit3": { - "message": "消除卡住的交易" - }, - "stxBenefit4": { - "message": "防止抢先交易" - }, - "stxCancelled": { - "message": "交换就会失败" - }, - "stxCancelledDescription": { - "message": "您的交易就会失败,并被取消,以保护您免于支付不必要的燃料费。" - }, - "stxCancelledSubDescription": { - "message": "再次尝试进行交换。下次我们会在这里保护您免受类似风险。 " - }, - "stxDescription": { - "message": "MetaMask Swap变得更加智能!启用智能交易将允许MetaMask从编程上优化您的交换,以帮助:" - }, - "stxErrorNotEnoughFunds": { - "message": "没有足够的资金进行智能交易。" - }, - "stxErrorUnavailable": { - "message": "智能交易暂时不可用。" - }, - "stxFailure": { - "message": "交换失败" - }, - "stxFailureDescription": { - "message": "突然的市场变化可能导致失败。如果问题仍然存在,请联系$1。", - "description": "This message is shown to a user if their swap fails. The $1 will be replaced by support.metamask.io" - }, - "stxFallbackPendingTx": { - "message": "智能交易暂时不可用,因为您有一笔待处理的交易。" - }, - "stxFallbackUnavailable": { - "message": "即使智能交易不可用,您仍然可以交换代币。" - }, - "stxPendingPrivatelySubmittingSwap": { - "message": "正在秘密提交您的Swap..." - }, - "stxPendingPubliclySubmittingSwap": { - "message": "正在公开提交您的Swap..." - }, - "stxSubDescription": { - "message": "*智能交易将尝试多次隐秘提交您的交易。如果所有尝试都失败,交易将会公开广播,以确保您的交换能成功进行。" - }, - "stxSuccess": { - "message": "交换完成!" - }, - "stxSuccessDescription": { - "message": "您的$1现在可用。", - "description": "$1 is a token symbol, e.g. ETH" - }, - "stxSwapCompleteIn": { - "message": "Swap距离完成尚有<", - "description": "'<' means 'less than', e.g. Swap will complete in < 2:59" - }, - "stxTooltip": { - "message": "在提交前模拟交易,以降低交易成本并减少失败。" - }, - "stxTryRegular": { - "message": "尝试定期交换。" - }, - "stxTryingToCancel": { - "message": "正在尝试取消您的交易......" - }, - "stxUnavailable": { - "message": "智能交易被禁用" - }, - "stxUnknown": { - "message": "状态未知" - }, - "stxUnknownDescription": { - "message": "有一笔交易已经成功,但我们不确定是哪一笔。这可能是由于在处理此交换时提交了另一笔交易。" - }, - "stxUserCancelled": { - "message": "交换已取消" - }, - "stxUserCancelledDescription": { - "message": "您的交易已被取消,您并未支付任何不必要的燃料费。" - }, - "stxYouCanOptOut": { - "message": "您可以随时选择退出高级设置。" - }, - "submit": { - "message": "提交" - }, - "submitted": { - "message": "已提交" - }, - "support": { - "message": "获取帮助" - }, - "supportCenter": { - "message": "访问我们的支持中心" - }, - "swap": { - "message": "交换" - }, - "swapAggregator": { - "message": "聚合器" - }, - "swapAllowSwappingOf": { - "message": "允许交换 $1", - "description": "Shows a user that they need to allow a token for swapping on their hardware wallet" - }, - "swapAmountReceived": { - "message": "保证金额" - }, - "swapAmountReceivedInfo": { - "message": "这是您将收到的最低金额。根据滑点值,您可能会收到更多。" - }, - "swapApproval": { - "message": "批准 $1 进行交换", - "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." - }, - "swapApproveNeedMoreTokens": { - "message": "您还需要 $1 的 $2 来完成这笔交换", - "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." - }, - "swapApproveNeedMoreTokensSmartTransactions": { - "message": "您还需要更多$1才能使用智能交易完成此交换。", - "description": "Tells the user that they need more of a certain token ($1) before they can complete the swap via smart transactions." - }, - "swapBestOfNQuotes": { - "message": "$1 报价中最棒的。", - "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" - }, - "swapBuildQuotePlaceHolderText": { - "message": "没有与 $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" - }, - "swapConfirmWithHwWallet": { - "message": "使用您的硬件钱包确认" - }, - "swapContractDataDisabledErrorDescription": { - "message": "在您的 Ledger 的 Etherum 应用程序中,转到“设置”并允许合约数据。然后再次尝试交换。" - }, - "swapContractDataDisabledErrorTitle": { - "message": "您的 Ledger 上未启用合约数据" - }, - "swapCustom": { - "message": "自定义" - }, - "swapDecentralizedExchange": { - "message": "去中心化交易所" - }, - "swapDirectContract": { - "message": "直接合约" - }, - "swapEditLimit": { - "message": "编辑限制" - }, - "swapEnableDescription": { - "message": "这是必须的,并授予 MetaMask 权限交换您的 $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." - }, - "swapEnableTokenForSwapping": { - "message": "这将 $1 进行交换", - "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" - }, - "swapEstimatedNetworkFees": { - "message": "预估网络费用" - }, - "swapEstimatedNetworkFeesInfo": { - "message": "这是预估的网络费用,将用于完成您的交换。实际金额可能会根据网络条件而变化。" - }, - "swapFailedErrorDescriptionWithSupportLink": { - "message": "交易有时会失败,我们随时为您提供帮助。如果此问题仍然存在,您可以在 $1 联系我们的客服,以获得进一步的帮助。", - "description": "This message is shown to a user if their swap fails. The $1 will be replaced by support.metamask.io" - }, - "swapFailedErrorTitle": { - "message": "交换失败" - }, - "swapFetchingQuoteNofN": { - "message": "获取$2的$1报价", - "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." - }, - "swapFetchingQuotes": { - "message": "取得报价中" - }, - "swapFetchingQuotesErrorDescription": { - "message": "呃……出错了。再试一次,如果错误仍存在,请联系客服。" - }, - "swapFetchingQuotesErrorTitle": { - "message": "获取报价出错" - }, - "swapFetchingTokens": { - "message": "获取代币中……" - }, - "swapFromTo": { - "message": "$1 到 $2 的交换", - "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" - }, - "swapGasFeesDetails": { - "message": "燃料费用是估算的,并将根据网络流量和交易复杂性而波动。" - }, - "swapGasFeesLearnMore": { - "message": "了解更多关于燃料费的信息" - }, - "swapGasFeesSplit": { - "message": "上一个屏幕上的燃料费用在这两笔交易之间分摊。" - }, - "swapGasFeesSummary": { - "message": "燃料费用支付给在 $1 网络上处理交易的加密矿工。MetaMask 不会从燃料费用中获利。", - "description": "$1 is the selected network, e.g. Ethereum or BSC" - }, - "swapHighSlippageWarning": { - "message": "滑点金额非常高。" - }, - "swapIncludesMMFee": { - "message": "包括 $1% 的 MetaMask 费用。", - "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." - }, - "swapLowSlippageError": { - "message": "交易可能会失败,最大滑点过低。" - }, - "swapMaxSlippage": { - "message": "最大滑点" - }, - "swapMetaMaskFee": { - "message": "MetaMask 费用" - }, - "swapMetaMaskFeeDescription": { - "message": "我们每次都能从顶级流动性资源中找到最优惠的价格。$1% 的费用会自动计入此报价。", - "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." - }, - "swapNQuotesWithDot": { - "message": "$1 报价。", - "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" - }, - "swapNewQuoteIn": { - "message": "$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" - }, - "swapOnceTransactionHasProcess": { - "message": "处理完此交易后,您的 $1 将被添加到您的账户中。", - "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." - }, - "swapPriceDifference": { - "message": "您将用 $1 $2 (~$3) 交换 $4 $5 (~$6)。", - "description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts." - }, - "swapPriceDifferenceTitle": { - "message": "~$1% 的价差", - "description": "$1 is a number (ex: 1.23) that represents the price difference." - }, - "swapPriceImpactTooltip": { - "message": "价格影响是当前市场价格与交易执行期间收到的金额之间的差异。价格影响是您的交易规模相对于流动资金池规模的一个函数。" - }, - "swapPriceUnavailableDescription": { - "message": "由于缺乏市场价格数据,无法确定价格影响。在交换之前,请确认您对即将收到的代币数量感到满意。" - }, - "swapPriceUnavailableTitle": { - "message": "在继续之前,请检查您的费率" - }, - "swapProcessing": { - "message": "处理中" - }, - "swapQuoteDetails": { - "message": "报价详情" - }, - "swapQuoteSource": { - "message": "报价来源" - }, - "swapQuotesExpiredErrorDescription": { - "message": "请请求新的报价,以获得最新的价格。" - }, - "swapQuotesExpiredErrorTitle": { - "message": "报价超时" - }, - "swapQuotesNotAvailableErrorDescription": { - "message": "尝试调整金额或滑点设置,然后重试。" - }, - "swapQuotesNotAvailableErrorTitle": { - "message": "无可用报价" - }, - "swapRate": { - "message": "费率" - }, - "swapReceiving": { - "message": "正在接收" - }, - "swapReceivingInfoTooltip": { - "message": "这是一个预估额。确切的金额取决于滑点。" - }, - "swapRequestForQuotation": { - "message": "请求报价" - }, - "swapReviewSwap": { - "message": "审查交换" - }, - "swapSelect": { - "message": "选择" - }, - "swapSelectAQuote": { - "message": "选择一个报价" - }, - "swapSelectAToken": { - "message": "选择代币" - }, - "swapSelectQuotePopoverDescription": { - "message": "以下是从多个流动性来源收集到的所有报价。" - }, - "swapSlippageNegative": { - "message": "滑点必须大于或等于0" - }, - "swapSlippagePercent": { - "message": "$1%", - "description": "$1 is the amount of % for slippage" - }, - "swapSource": { - "message": "流动性来源" - }, - "swapSourceInfo": { - "message": "我们搜索多个流动性来源(交易所、聚合器和专业做市商),以找到最优惠的价格和最低的网络费用。" - }, - "swapSuggested": { - "message": "建议的交换" - }, - "swapSuggestedGasSettingToolTipMessage": { - "message": "交换是复杂和时间敏感的交易。我们建议使用此燃料费用,以便在成本和成功交换的信心之间保持良好的平衡。" - }, - "swapSwapFrom": { - "message": "交换自" - }, - "swapSwapSwitch": { - "message": "在代币之间切换" - }, - "swapSwapTo": { - "message": "交换为" - }, - "swapToConfirmWithHwWallet": { - "message": "使用您的硬件钱包确认" - }, - "swapTokenAvailable": { - "message": "您的 $1 已添加到您的账户。", - "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." - }, - "swapTokenBalanceUnavailable": { - "message": "我们无法检索您的 $1 余额", - "description": "This message communicates to the user that their balance of a given token is currently unavailable. $1 will be replaced by a token symbol" - }, - "swapTokenToToken": { - "message": "用 $1 交换 $2", - "description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap." - }, - "swapTokenVerificationAddedManually": { - "message": "此代币已手动添加。" - }, - "swapTokenVerificationMessage": { - "message": "始终在 $1 上确认代币地址。", - "description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover." - }, - "swapTokenVerificationOnlyOneSource": { - "message": "仅在1个来源上进行了验证。" - }, - "swapTokenVerificationSources": { - "message": "在 $1 个来源上进行了验证。", - "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." - }, - "swapTooManyDecimalsError": { - "message": "$1 允许最多 $2 个小数位", - "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" - }, - "swapTransactionComplete": { - "message": "交易完成" - }, - "swapTwoTransactions": { - "message": "2笔交易" - }, - "swapUnknown": { - "message": "未知" - }, - "swapVerifyTokenExplanation": { - "message": "多个代币可以使用相同的名称和符号。检查 $1 以确认这是您正在寻找的代币。", - "description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network." - }, - "swapYourTokenBalance": { - "message": "$1 $2 可用于交换", - "description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol" - }, - "swapZeroSlippage": { - "message": "0%滑点" - }, - "swapsAdvancedOptions": { - "message": "高级选项" - }, - "swapsExcessiveSlippageWarning": { - "message": "滑点金额太高,会导致不良率。请将最大滑点降低到低于15%的值。" - }, - "swapsMaxSlippage": { - "message": "最大滑点" - }, - "swapsNotEnoughForTx": { - "message": "没有足够的 $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": "在活动中查看" - }, - "switchEthereumChainConfirmationDescription": { - "message": "这将切换 MetaMask 中选定的网络到以前添加的网络:" - }, - "switchEthereumChainConfirmationTitle": { - "message": "允许此网站切换网络?" - }, - "switchNetwork": { - "message": "切换网络" - }, - "switchNetworks": { - "message": "切换网络" - }, - "switchToNetwork": { - "message": "切换至$1", - "description": "$1 represents the custom network that has previously been added" - }, - "switchToThisAccount": { - "message": "切换到该账户" - }, - "switchingNetworksCancelsPendingConfirmations": { - "message": "切换网络将取消所有待处理的确认" - }, - "symbol": { - "message": "符号" - }, - "symbolBetweenZeroTwelve": { - "message": "符号不得超过11个字符。" - }, - "syncFailed": { - "message": "同步失败" - }, - "syncInProgress": { - "message": "同步进行中" - }, - "syncWithMobile": { - "message": "与移动设备同步" - }, - "syncWithMobileBeCareful": { - "message": "扫描此代码时,请确保附近没有其他人在看您的屏幕" - }, - "syncWithMobileComplete": { - "message": "您的数据已同步成功。尽情体验 MetaMask 移动应用程序吧!" - }, - "syncWithMobileDesc": { - "message": "您可以将您的账户和信息与您的移动设备同步。打开 MetaMask 移动应用程序,进入“设置”,点击“从浏览器扩展程序同步”" - }, - "syncWithMobileDescNewUsers": { - "message": "如果您是首次启用 MetaMask 移动应用程序,请通过个人手机完成如下操作。" - }, - "syncWithMobileScanThisCode": { - "message": "使用 MetaMask 移动应用程序扫描此代码" - }, - "syncWithMobileTitle": { - "message": "与移动设备同步" - }, - "syncWithThreeBox": { - "message": "与 3Box 同步数据(实验功能)" - }, - "syncWithThreeBoxDescription": { - "message": "开启以使用 3Box 备份您的设置。此功能目前是实验功能,使用时风险自负。" - }, - "syncWithThreeBoxDisabled": { - "message": "由于初始同步过程中出现错误,3Box 已被禁用" - }, - "tenPercentIncreased": { - "message": "增加10%" - }, - "terms": { - "message": "使用条款" - }, - "termsOfService": { - "message": "服务条款" - }, - "testFaucet": { - "message": "测试水龙头" - }, - "testNetworks": { - "message": "测试网络" - }, - "theme": { - "message": "主题" - }, - "themeDescription": { - "message": "选择您喜欢的MetaMask主题。" - }, - "thisWillCreate": { - "message": "这将创建新的钱包和账户助记词" - }, - "time": { - "message": "时间" - }, - "tips": { - "message": "小贴士" - }, - "to": { - "message": "至" - }, - "toAddress": { - "message": "至:$1", - "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" - }, - "toggleTestNetworks": { - "message": "$1 测试网络", - "description": "$1 is a clickable link with text defined by the 'showHide' key. The link will open to the advanced settings where users can enable the display of test networks in the network dropdown." - }, - "token": { - "message": "代币" - }, - "tokenAddress": { - "message": "代币地址" - }, - "tokenAlreadyAdded": { - "message": "代币已添加。" - }, - "tokenContractAddress": { - "message": "代币合约地址" - }, - "tokenDecimalFetchFailed": { - "message": "需要代币小数。" - }, - "tokenDecimalTitle": { - "message": "代币小数:" - }, - "tokenDetails": { - "message": "代币详情" - }, - "tokenDetection": { - "message": "代币检测" - }, - "tokenDetectionAlertMessage": { - "message": "代币检测目前适用于 $1. $2" - }, - "tokenDetectionToggleDescription": { - "message": "ConsenSys的代币API使用来自各种第三方的代币列表,汇总成一个代币列表。关闭它将会停止检测添加到您钱包中的新代币,但会保留搜索代币以导入的选项。" - }, - "tokenId": { - "message": "代币 ID" - }, - "tokenList": { - "message": "代币列表:" - }, - "tokenSymbol": { - "message": "代币符号" - }, - "tokensFoundTitle": { - "message": "发现$1新代币", - "description": "$1 is the number of new tokens detected" - }, - "tooltipApproveButton": { - "message": "我理解" - }, - "total": { - "message": "共计" - }, - "transaction": { - "message": "交易" - }, - "transactionCancelAttempted": { - "message": "已在 $2 尝试取消交易 ,燃料费用预计为 $1" - }, - "transactionCancelSuccess": { - "message": "交易已在 $2 成功取消。" - }, - "transactionConfirmed": { - "message": "交易已在 $2 确认。" - }, - "transactionCreated": { - "message": "在 $2 创建了值为 $1 的交易。" - }, - "transactionData": { - "message": "交易数据" - }, - "transactionDecodingAccreditationDecoded": { - "message": "由 Truffle 解码" - }, - "transactionDecodingAccreditationVerified": { - "message": "已在 $1 验证的合约" - }, - "transactionDecodingUnsupportedNetworkError": { - "message": "链 ID $1 不可使用交易解码" - }, - "transactionDetailDappGasMoreInfo": { - "message": "建议的网站" - }, - "transactionDetailDappGasTooltip": { - "message": "编辑以使用 MetaMask 建议的基于最新区块的燃料费用。" - }, - "transactionDetailGasHeading": { - "message": "估算的燃料费" - }, - "transactionDetailGasInfoV2": { - "message": "估算" - }, - "transactionDetailGasTooltipConversion": { - "message": "了解更多关于燃料费的信息" - }, - "transactionDetailGasTooltipExplanation": { - "message": "燃料费由网络设定,并根据网络流量和交易的复杂性而波动。" - }, - "transactionDetailGasTooltipIntro": { - "message": "燃料费用支付给在 $1 网络上处理交易的加密矿工。MetaMask 不会从燃料费用中获利。" - }, - "transactionDetailGasTotalSubtitle": { - "message": "金额 + 燃料费" - }, - "transactionDetailLayer2GasHeading": { - "message": "2层燃料费用" - }, - "transactionDetailMultiLayerTotalSubtitle": { - "message": "金额 + 费用" - }, - "transactionDropped": { - "message": "交易已在 $2 放弃。" - }, - "transactionError": { - "message": "交易出错。合约代码中抛出异常。" - }, - "transactionErrorNoContract": { - "message": "试图在非合约地址上调用函数。" - }, - "transactionErrored": { - "message": "交易出现错误。" - }, - "transactionFee": { - "message": "交易费" - }, - "transactionHistoryBaseFee": { - "message": "基本费用 (GWEI)" - }, - "transactionHistoryL1GasLabel": { - "message": "1层燃料费总计" - }, - "transactionHistoryL2GasLimitLabel": { - "message": "2层燃料上限" - }, - "transactionHistoryL2GasPriceLabel": { - "message": "2层燃料价格" - }, - "transactionHistoryMaxFeePerGas": { - "message": "每单位燃料的最大费用" - }, - "transactionHistoryPriorityFee": { - "message": "优先费用 (GWEI)" - }, - "transactionHistoryTotalGasFee": { - "message": "燃料费总额" - }, - "transactionResubmitted": { - "message": "已在 $2 重新提交交易,燃料费预计升至 $1" - }, - "transactionSubmitted": { - "message": "已在 $2 提交交易,燃料费预计为 $1。" - }, - "transactionUpdated": { - "message": "交易于 $2 更新。" - }, - "transfer": { - "message": "转移" - }, - "transferBetweenAccounts": { - "message": "在我的账户之间转移" - }, - "transferFrom": { - "message": "转移自" - }, - "troubleConnectingToWallet": { - "message": "我们在连接您的 $1 时遇到问题,尝试检查 $2 并重试。", - "description": "$1 is the wallet device name; $2 is a link to wallet connection guide" - }, - "troubleStarting": { - "message": "MetaMask无法启动。可能发生间歇性错误,因此请尝试重新启动扩展程序。" - }, - "troubleTokenBalances": { - "message": "我们在加载您的代币余额时遇到问题。您可以查看它们 ", - "description": "Followed by a link (here) to view token balances" - }, - "trustSiteApprovePermission": { - "message": "通过授予权限,您允许以下 $1 访问您的资金" - }, - "tryAgain": { - "message": "重试" - }, - "turnOnTokenDetection": { - "message": "开启增强型代币检测" - }, - "twelveHrTitle": { - "message": "12小时:" - }, - "txInsightsNotSupported": { - "message": "此合约目前不支持交易见解。" - }, - "typePassword": { - "message": "输入您的 MetaMask 密码" - }, - "typeYourSRP": { - "message": "输入助记词" - }, - "u2f": { - "message": "U2F", - "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." - }, - "unapproved": { - "message": "未批准" - }, - "units": { - "message": "单位" - }, - "unknown": { - "message": "未知" - }, - "unknownCameraError": { - "message": "尝试访问您的相机时出错。请重试……" - }, - "unknownCameraErrorTitle": { - "message": "糟糕!出问题了...." - }, - "unknownCollection": { - "message": "未命名的收藏" - }, - "unknownNetwork": { - "message": "未知的私有网络" - }, - "unknownQrCode": { - "message": "错误:我们无法识别该二维码" - }, - "unlimited": { - "message": "无限制" - }, - "unlock": { - "message": "登录" - }, - "unlockMessage": { - "message": "即将进入去中心化网络" - }, - "unrecognizedChain": { - "message": "这个自定义网络无法识别。我们建议您在继续操作之前 $1", - "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." - }, - "unsendableAsset": { - "message": "当前不支持发送可收藏的 (ERC-721) 代币", - "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" - }, - "unverifiedContractAddressMessage": { - "message": "我们无法验证此合约。请确保此地址是可靠的。" - }, - "upArrow": { - "message": "向上箭头" - }, - "updatedWithDate": { - "message": "已于 $1 更新" - }, - "urlErrorMsg": { - "message": "URL 需要相应的 HTTP/HTTPS 前缀。" - }, - "urlExistsErrorMsg": { - "message": "此 URL 目前已被 $1 网络使用。" - }, - "useCollectibleDetection": { - "message": "自动检测 NFT" - }, - "useCollectibleDetectionDescription": { - "message": "显示 NFT 媒体和数据可能会将您的 IP 地址暴露给集中式服务器。第三方 API(例如 OpenSea)用于在您的钱包中检测 NFT。这会通过这些服务暴露您的账户地址。如果您不希望该应用程序从这些服务中提取数据,请禁用此功能。" - }, - "usePhishingDetection": { - "message": "使用网络钓鱼检测" - }, - "usePhishingDetectionDescription": { - "message": "显示针对 Ethereum 用户的网络钓鱼域名警告" - }, - "useTokenDetectionPrivacyDesc": { - "message": "要自动显示发送到您账户的代币,需要与第三方服务器通信以获取代币的图像。这些服务器将拥有您的IP地址的访问权限。" - }, - "usedByClients": { - "message": "被各种不同的客户使用" - }, - "userName": { - "message": "用户名" - }, - "verifyThisTokenDecimalOn": { - "message": "代币小数可以在 $1 上找到", - "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" - }, - "verifyThisTokenOn": { - "message": "在 $1 上验证此代币", - "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" - }, - "verifyThisUnconfirmedTokenOn": { - "message": "在 $1 上验证此代币,并确保这是您想要交易的代币。", - "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" - }, - "viewAccount": { - "message": "查看账户" - }, - "viewAllDetails": { - "message": "查看所有详情" - }, - "viewContact": { - "message": "查看联系人" - }, - "viewFullTransactionDetails": { - "message": "查看全部交易详情" - }, - "viewMore": { - "message": "查看更多" - }, - "viewOnBlockExplorer": { - "message": "在区块浏览器上查看" - }, - "viewOnCustomBlockExplorer": { - "message": "在 $2 上查看 $1", - "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" - }, - "viewOnEtherscan": { - "message": "在 Etherscan 上查看 $1", - "description": "$1 is the action type. e.g (Account, Transaction, Swap)" - }, - "viewOnOpensea": { - "message": "在 Opensea 上查看" - }, - "viewinExplorer": { - "message": "在 Explorer 中查看 $1", - "description": "$1 is the action type. e.g (Account, Transaction, Swap)" - }, - "visitWebSite": { - "message": "访问我们的网站" - }, - "walletConnectionGuide": { - "message": "我们的硬件钱包连接指南" - }, - "walletCreationSuccessDetail": { - "message": "您已经成功地保护了您的钱包。请确保您的账户助记词安全和秘密——这是您的责任!" - }, - "walletCreationSuccessReminder1": { - "message": "MetaMask 无法恢复您的账户助记词。" - }, - "walletCreationSuccessReminder2": { - "message": "MetaMask 绝对不会索要您的账户助记词。" - }, - "walletCreationSuccessReminder3": { - "message": "对任何人 $1,否则您的资金有被盗风险", - "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" - }, - "walletCreationSuccessReminder3BoldSection": { - "message": "切勿分享您的账户助记词", - "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" - }, - "walletCreationSuccessTitle": { - "message": "钱包创建成功" - }, - "wantToAddThisNetwork": { - "message": "想要添加此网络吗?" - }, - "warning": { - "message": "警告" - }, - "weak": { - "message": "弱" - }, - "web3ShimUsageNotification": { - "message": "我们发现当前的网站尝试使用已经删除的 window.web3 API。如果这个网站出现故障,请点击 $1 以获取更多信息。", - "description": "$1 is a clickable link." - }, - "webhid": { - "message": "WebHID", - "description": "Refers to a interface for connecting external devices to the browser. Used for connecting ledger to the browser. Read more here https://developer.mozilla.org/en-US/docs/Web/API/WebHID_API" - }, - "welcome": { - "message": "欢迎使用 MetaMask" - }, - "welcomeBack": { - "message": "欢迎回来!" - }, - "welcomeExploreDescription": { - "message": "存储、发送和使用加密货币和资产。" - }, - "welcomeExploreTitle": { - "message": "探索去中心化应用" - }, - "welcomeLoginDescription": { - "message": "使用您的 MetaMask 登录去中心化应用 - 无需注册。" - }, - "welcomeLoginTitle": { - "message": "迎接您的钱包" - }, - "welcomeToMetaMask": { - "message": "让我们开始吧" - }, - "welcomeToMetaMaskIntro": { - "message": "MetaMask 深受数百万人信任,是一款可以让所有人进入 web3 世界的安全钱包。" - }, - "whatsNew": { - "message": "最新动态", - "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." - }, - "whatsThis": { - "message": "这是什么?" - }, - "writePhrase": { - "message": "请将该账户助记词记录在纸上,并保存在安全的地方。如果希望提升安全性,请将它记录在多张纸上,并分别保存在2 - 3个不同的地方。" - }, - "xOfY": { - "message": "$1 / $2", - "description": "$1 and $2 are intended to be two numbers, where $2 is a total, and $1 is a count towards that total" - }, - "xOfYPending": { - "message": "$1 / $2 待处理", - "description": "$1 and $2 are intended to be two numbers, where $2 is a total number of pending confirmations, and $1 is a count towards that total" - }, - "yes": { - "message": "是" - }, - "yesLetsTry": { - "message": "是的,我们试一下" - }, - "youHaveAddedAll": { - "message": "您已经添加了所有热门网络。您可以探索更多网络$1,或者您可以$2", - "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" - }, - "youNeedToAllowCameraAccess": { - "message": "需要开启相机访问权限,才能使用该功能。" - }, - "youSign": { - "message": "您正在签名" - }, - "yourPrivateSeedPhrase": { - "message": "您的个人账户助记词" - }, - "zeroGasPriceOnSpeedUpError": { - "message": "加速时零燃料价格" - } -} diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 4058548aa57f..d517d3b2e645 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -1,65 +1,123 @@ { "QRHardwareInvalidTransactionTitle": { - "message": "非法交易" + "message": "错误" }, "QRHardwareMismatchedSignId": { - "message": "扫描的签名二维码不属于当前交易,请检查交易详情后重试。" + "message": "不一致的交易数据。请查看交易详情。" }, "QRHardwarePubkeyAccountOutOfRange": { - "message": "暂无更多账户,若想切换到其他账户,请在硬件钱包中选择想要的账户重新同步。" + "message": "暂无更多账户。若想访问下方未列出的其他账户,请重新连接您的硬件钱包并选择它。" }, "QRHardwareScanInstructions": { - "message": "为了保护您的隐私,屏幕是模糊的,但不影响对二维码的读取。" + "message": "将二维码放在摄像头前。屏幕是模糊的,但不影响对二维码的读取。" }, "QRHardwareSignRequestCancel": { - "message": "拒绝该交易" + "message": "拒绝" }, "QRHardwareSignRequestDescription": { - "message": "硬件钱包扫描上方二维码完成签名后,点击“获取签名”按钮扫描已签名的二维码" + "message": "使用钱包签名后,点击“获取签名”以接收签名" }, "QRHardwareSignRequestGetSignature": { "message": "获取签名" }, "QRHardwareSignRequestSubtitle": { - "message": "用硬件钱包扫描二维码" + "message": "用您的钱包扫描二维码" }, "QRHardwareSignRequestTitle": { - "message": "获取签名" + "message": "请求签名" }, "QRHardwareUnknownQRCodeTitle": { - "message": "非法二维码" + "message": "错误" }, "QRHardwareUnknownWalletQRCode": { - "message": "请扫描硬件钱包的同步二维码。" + "message": "非法二维码,请扫描硬件钱包的同步二维码。" }, "QRHardwareWalletImporterTitle": { "message": "扫描二维码" }, "QRHardwareWalletSteps1Description": { - "message": "该类硬件钱包通过二维码实现通讯交互,做到完全脱网。官方支持的钱包有:" + "message": "连接通过二维码通信的气隙硬件钱包。官方支持的气隙硬件钱包包括:" }, "QRHardwareWalletSteps1Title": { - "message": "基于 QR 的硬件钱包" + "message": "基于二维码的硬件钱包" }, "QRHardwareWalletSteps2Description": { - "message": "AirGap Vault & Ngrave (即将上线)" + "message": "Ngrave (即将上线)" + }, + "SIWEAddressInvalid": { + "message": "登录请求中的地址与您用于登录的账户地址不匹配。" + }, + "SIWEDomainWarningBody": { + "message": "网站($1)要求您登录到错误的域名。这可能是网络钓鱼攻击。", + "description": "$1 represents the website domain" + }, + "SIWELabelChainID": { + "message": "链ID:" + }, + "SIWELabelExpirationTime": { + "message": "到期时间:" + }, + "SIWELabelIssuedAt": { + "message": "发行于:" + }, + "SIWELabelMessage": { + "message": "消息:" + }, + "SIWELabelNonce": { + "message": "Nonce:" + }, + "SIWELabelNotBefore": { + "message": "不早于:" + }, + "SIWELabelRequestID": { + "message": "请求ID:" + }, + "SIWELabelResources": { + "message": "资源:$1", + "description": "$1 represents the number of resources" + }, + "SIWELabelURI": { + "message": "URI:" + }, + "SIWELabelVersion": { + "message": "版本:" + }, + "SIWESiteRequestSubtitle": { + "message": "此网站正在请求使用以下登录方式:" + }, + "SIWESiteRequestTitle": { + "message": "登录请求" + }, + "SIWEWarningSubtitle": { + "message": "为表明您确认理解,请勾选:" + }, + "SIWEWarningTitle": { + "message": "您确定吗?" }, "about": { "message": "关于" }, - "acceleratingATransaction": { - "message": "* 设定更高燃料价格,可以加快交易完成进度,提高网络快速处理机率,但无法保证每次均能够实现提速。" - }, "acceptTermsOfUse": { "message": "我已阅读并同意 $1", "description": "$1 is the `terms` message" }, "accessAndSpendNotice": { - "message": "$1 可以访问并使用此最大数额", + "message": "$1 可以访问并使用此最大金额", "description": "$1 is the url of the site requesting ability to spend" }, + "accessAndSpendNoticeNFT": { + "message": "$1可以访问并使用此资产", + "description": "$1 is the url of the site requesting ability to spend" + }, + "accessYourWalletWithSRP": { + "message": "使用账户助记词访问钱包" + }, + "accessYourWalletWithSRPDescription": { + "message": "MetaMask无法恢复您的密码。我们将使用您的助记词来验证您的所有权、恢复您的钱包并设置新密码。首先,请输入创建钱包时获得的助记词。$1", + "description": "$1 is the words 'Learn More' from key 'learnMore', separated here so that it can be added as a link" + }, "accessingYourCamera": { - "message": "正在获取您的相机……" + "message": "正在访问您的相机……" }, "account": { "message": "账户" @@ -67,21 +125,24 @@ "accountDetails": { "message": "账户详情" }, + "accountIdenticon": { + "message": "账户哈希头像" + }, "accountName": { "message": "账户名称" }, "accountNameDuplicate": { - "message": "此帐户名称已存在", + "message": "此账户名称已存在", "description": "This is an error message shown when the user enters a new account name that matches an existing account name" }, "accountOptions": { "message": "账户选项" }, "accountSelectionRequired": { - "message": "您需要选择一个账户 !" + "message": "您需要选择一个账户!" }, "active": { - "message": "当前" + "message": "活跃" }, "activity": { "message": "活动" @@ -95,51 +156,67 @@ "addANetwork": { "message": "添加网络" }, + "addANetworkManually": { + "message": "手动添加网络" + }, "addANickname": { "message": "添加昵称" }, "addAcquiredTokens": { - "message": "在 MetaMask 上添加获得的代币" + "message": "添加您使用 MetaMask 获得的代币" }, "addAlias": { "message": "添加别名" }, + "addBlockExplorer": { + "message": "添加区块浏览器" + }, "addContact": { - "message": "添加联系人" + "message": "添加联系信息" }, "addCustomToken": { "message": "添加自定义代币" }, "addCustomTokenByContractAddress": { - "message": "找不到代币?您可以通过粘贴地址手动添加任何代币。代币合同地址可以在$1上找到。", + "message": "找不到代币?您可以通过粘贴其地址手动添加任何代币。代币合约地址可以在 $1 上找到。", "description": "$1 is a blockchain explorer for a specific network, e.g. Etherscan for Ethereum" }, "addEthereumChainConfirmationDescription": { - "message": "这将允许在MetaMask中使用此网络。" + "message": "这将允许在 MetaMask 中使用此网络。" }, "addEthereumChainConfirmationRisks": { - "message": "MetaMask不验证自定义网络。" + "message": "MetaMask 不验证自定义网络。" }, "addEthereumChainConfirmationRisksLearnMore": { - "message": "了解$1。", + "message": "了解 $1。", "description": "$1 is a link with text that is provided by the 'addEthereumChainConfirmationRisksLearnMoreLink' key" }, "addEthereumChainConfirmationRisksLearnMoreLink": { - "message": "欺诈和网络安全风险", + "message": "诈骗和网络安全风险", "description": "Link text for the 'addEthereumChainConfirmationRisksLearnMore' translation key" }, "addEthereumChainConfirmationTitle": { - "message": "允许此站点添加一个网络?" + "message": "允许此网站增加一个网络?" }, "addFriendsAndAddresses": { "message": "添加您信任的朋友和地址" }, + "addFromAListOfPopularNetworks": { + "message": "从热门网络列表中选择网络来添加,或手动添加网络。仅可与您信任的实体互动。" + }, "addMemo": { "message": "添加备忘录" }, + "addMoreNetworks": { + "message": "手动添加更多网络" + }, "addNetwork": { "message": "添加网络" }, + "addNetworkTooltipWarning": { + "message": "此网络连接依赖于第三方。此连接可能不太可靠,或使第三方可进行活动跟踪。$1", + "description": "$1 is Learn more link" + }, "addSuggestedTokens": { "message": "添加推荐代币" }, @@ -156,13 +233,13 @@ "message": "高级" }, "advancedBaseGasFeeToolTip": { - "message": "当您的交易被包含在区块中,您的最大基础费用与实际基本费用之间的任何差额将被退还。 总金额按最大基费计算(GWEI) *燃料限额。" + "message": "当您的交易被包含在区块中时,您的最大基本费用与实际基本费用之间的任何差额将被退还。总金额按最大基本费用(以GWEI为单位)*燃料上限计算。" }, "advancedGasFeeDefaultOptIn": { - "message": "保存$1为“高级”默认值" + "message": "将这些 $1 保存为“高级”默认值" }, "advancedGasFeeDefaultOptOut": { - "message": "总是使用这些值和高级设置为默认值。" + "message": "始终使用这些值和高级设置作为默认值。" }, "advancedGasFeeModalTitle": { "message": "高级燃料费" @@ -174,48 +251,55 @@ "message": "高级选项" }, "advancedPriorityFeeToolTip": { - "message": "优先收费(又称“矿工费”)直接向矿工支付,并鼓励他们确定您的交易的优先次序。" + "message": "优先费(又称“矿工费”)直接向矿工支付,激励他们优先处理您的交易。" }, "affirmAgree": { "message": "我同意" }, + "airgapVault": { + "message": "AirGap Vault" + }, "alertDisableTooltip": { - "message": "这个可以在“设置 > 提醒”中进行更改" + "message": "这可以在“设置 > 提醒”中进行更改" }, "alertSettingsUnconnectedAccount": { - "message": "选择了未连接的账户时浏览网站" + "message": "浏览网站时选择的账户未连接" }, "alertSettingsUnconnectedAccountDescription": { - "message": "当您在浏览已连接的 Web3 网站,但当前选择的账户没有连接时,该提醒会在弹出的窗口中显示。" + "message": "当您浏览已连接的 web3 网站时,此警报会显示在弹出窗口中,但当前选择的账户未连接。" }, "alertSettingsWeb3ShimUsage": { - "message": "当网站尝试使用已经删除的 window.web3 API" + "message": "当网站尝试使用已经删除的 window.web3 API 时" }, "alertSettingsWeb3ShimUsageDescription": { - "message": "当您在浏览的网站尝试使用已经删除的 window.web3 API 时,该提醒会在弹出的窗口中显示。" + "message": "当您浏览尝试使用已删除的 window.web3 API 并因此可能出现故障的网站时,此警报会显示在弹出窗口中。" }, "alerts": { "message": "提醒" }, + "allOfYour": { + "message": "您的所有$1", + "description": "$1 is the symbol or name of the token that the user is approving spending" + }, "allowExternalExtensionTo": { - "message": "允许这个外部扩展到:" + "message": "允许此外部扩展程序:" }, "allowSpendToken": { - "message": "授予访问您的$1的权限?", + "message": "授予访问您的 $1 的权限?", "description": "$1 is the symbol of the token that are requesting to spend" }, "allowThisSiteTo": { - "message": "允许本网站:" + "message": "允许此网站:" }, "allowWithdrawAndSpend": { - "message": "允许 $1 提取和最多消费以下数额:", + "message": "允许 $1 提取和消费最高以下金额:", "description": "The url of the site that requested permission to 'withdraw and spend'" }, "amount": { "message": "数额" }, "appDescription": { - "message": "以太坊浏览器插件", + "message": "浏览器中的以太坊钱包", "description": "The description of the application" }, "appName": { @@ -233,6 +317,16 @@ "approve": { "message": "批准消费限额" }, + "approveAllTokensTitle": { + "message": "是否允许访问您的所有$1?", + "description": "$1 is the symbol of the token for which the user is granting approval" + }, + "approveAndInstall": { + "message": "批准并安装" + }, + "approveAndUpdate": { + "message": "批准并更新" + }, "approveButtonText": { "message": "批准" }, @@ -246,35 +340,48 @@ "approvedAmountWithColon": { "message": "已批准金额:" }, + "approvedAsset": { + "message": "已获批准的资产" + }, + "approvedOn": { + "message": "于$1获得批准", + "description": "$1 is the approval date for a permission" + }, + "areYouSure": { + "message": "您确定吗?" + }, "asset": { "message": "资产" }, "assetOptions": { - "message": "资源选项" + "message": "资产选项" }, "assets": { "message": "资产" }, + "attemptSendingAssets": { + "message": "如果您试图将资产从一个网络直接发送到另一个网络,这可能会导致永久的资产损失。必须使用桥来进行。" + }, "attemptToCancel": { - "message": "想要取消吗?" + "message": "尝试取消吗?" }, "attemptToCancelDescription": { - "message": "确认提交该操作无法保证能够成功取消您的原始交易。如取消成功,您将被收取上述交易费。" + "message": "提交此尝试不能保证将会取消您的初始交易。如果取消尝试成功,将向您收取以上交易费。" }, "attemptingConnect": { "message": "正在尝试连接到区块链。" }, "attributions": { - "message": "来源" + "message": "参与者" }, "authorizedPermissions": { "message": "您已授权以下权限" }, "autoLockTimeLimit": { - "message": "自动锁定定时(分钟)" + "message": "自动锁定计时器(分钟)" }, "autoLockTimeLimitDescription": { - "message": "请设置 MetaMask 自动锁定前的空闲时间(单位:分钟)" + "message": "设置 MetaMask 将被锁定前的空闲时间(单位:分钟)。" }, "average": { "message": "平均值" @@ -285,8 +392,11 @@ "backToAll": { "message": "返回全部" }, + "backup": { + "message": "备份" + }, "backupApprovalInfo": { - "message": "如果不慎丢失个人设备,忘记密码,或者需要重新安装 MetaMask,亦或是需在另一台设备上打开钱包,请使用该保密码恢复个人钱包数据。" + "message": "如果不慎丢失个人设备,忘记密码,需要重新安装 MetaMask,或者需在另一台设备上访问钱包,使用此助记词才能恢复您的钱包。" }, "backupApprovalNotice": { "message": "请备份您的账户助记词,保证您的钱包和资金安全。" @@ -294,36 +404,48 @@ "backupNow": { "message": "立即备份" }, + "backupUserData": { + "message": "将您的数据备份" + }, + "backupUserDataDescription": { + "message": "您可以将包含首选项和账户地址的用户设置备份到JSON文件中。" + }, "balance": { - "message": "余额 " + "message": "余额" }, "balanceOutdated": { "message": "余额可能已过期" }, "baseFee": { - "message": "基础费用" + "message": "基本费用" }, "basic": { "message": "基本" }, + "beCareful": { + "message": "请小心" + }, "betaMetamaskDescription": { - "message": "MetaMask受数百万人信任,是一个安全的钱包,使所有人都能访问网络3。" + "message": "MetaMask 深受数百万人信任,是一款可以让所有人进入 web3 世界的安全钱包。" }, "betaMetamaskDescriptionExplanation": { - "message": "使用此版本来测试即将发布的功能。您的使用和反馈有助于我们构建最好可能版本MetaMask。 您对MetaMaskBeta的使用须遵守我们$1以及我们$2的标准。作为一种测试,出现错误的风险可能会增加。通过继续,您接受并承认这些风险,以及我们条款和测试版条款 (Terms and Beta Terms) 中发现的风险。", + "message": "使用此版本来测试即将发布的功能。您的使用和反馈有助于我们构建最好的 MetaMask 版本。您对 MetaMask 测试版的使用须遵守我们的标准 $1 以及我们的 $2。作为测试版,出现漏洞的风险可能会增加。继续即表示您接受并承认这些风险,以及我们条款和测试版条款中发现的风险。", "description": "$1 represents localization item betaMetamaskDescriptionExplanationTermsLinkText. $2 represents localization item betaMetamaskDescriptionExplanationBetaTermsLinkText" }, "betaMetamaskDescriptionExplanationBetaTermsLinkText": { - "message": "补充测试条款 (Supplemental Beta Terms)" + "message": "补充测试版条款" }, "betaMetamaskDescriptionExplanationTermsLinkText": { "message": "条款" }, "betaMetamaskVersion": { - "message": "MetaMask测试版本" + "message": "MetaMask 测试版本" + }, + "betaPortfolioSite": { + "message": "投资组合网站测试版" }, "betaWelcome": { - "message": "欢迎使用 MetaMask测试版" + "message": "欢迎使用 MetaMask 测试版" }, "blockExplorerAccountAction": { "message": "账户", @@ -334,27 +456,30 @@ "description": "This is used with viewOnEtherscan and viewInExplorer e.g View Asset in Explorer" }, "blockExplorerSwapAction": { - "message": "兑换 Swap", + "message": "交换", "description": "This is used with viewOnEtherscan e.g View Swap on Etherscan" }, "blockExplorerUrl": { - "message": "区块浏览器" + "message": "区块浏览器 URL" }, "blockExplorerUrlDefinition": { - "message": "此网络使用区块浏览器的 URL。" + "message": "用作此网络的区块浏览器的 URL。" }, "blockExplorerView": { - "message": "通过 $1 查看账户", + "message": "在 $1 查看账户", "description": "$1 replaced by URL for custom block explorer" }, + "blockies": { + "message": "Blockies" + }, "browserNotSupported": { - "message": "您的浏览器不支持该功能……" + "message": "您的浏览器不受支持……" }, "buildContactList": { "message": "建立您的联系人列表" }, "builtAroundTheWorld": { - "message": "MetaMask是在世界各地设计和建造的。" + "message": "MetaMask 是在世界各地设计和建造的。" }, "busy": { "message": "忙碌中" @@ -362,17 +487,44 @@ "buy": { "message": "购买" }, + "buyAsset": { + "message": "购买$1", + "description": "$1 is the ticker symbol of a an asset the user is being prompted to purchase" + }, + "buyCryptoWithCoinbasePay": { + "message": "用Coinbase Pay购买$1", + "description": "$1 represents the crypto symbol to be purchased" + }, + "buyCryptoWithCoinbasePayDescription": { + "message": "您可以使用Coinbase账户轻松购买或转移加密货币。", + "description": "$1 represents the crypto symbol to be purchased" + }, + "buyCryptoWithMoonPay": { + "message": "用MoonPay购买$1", + "description": "$1 represents the cypto symbol to be purchased" + }, + "buyCryptoWithMoonPayDescription": { + "message": "MoonPay支持热门的支付方式,包括Visa、万事达卡、Apple / Google / Samsung Pay,以及超过145个国家/地区的银行转账。代币会被存入您的MetaMask账户。" + }, + "buyCryptoWithTransak": { + "message": "用Transak购买$1", + "description": "$1 represents the cypto symbol to be purchased" + }, + "buyCryptoWithTransakDescription": { + "message": "Transak在超过100个国家/地区支持信用卡和借记卡、Apple Pay、MobiKwik和银行转账(取决于地点)。$1会被直接存入您的MetaMask账户。", + "description": "$1 represents the crypto symbol to be purchased" + }, "buyWithWyre": { - "message": "使用 Wyre 购买 $1" + "message": "使用Wyre购买$1" }, "buyWithWyreDescription": { - "message": "您可以通过 Wyre 使用信用卡将 $1 存入您的 MetaMask 账户。" + "message": "购买不超过$1000可以轻松开通。快速交互式上限购买验证。支持借记卡/信用卡、Apple Pay、银行转账。适用于100多个国家。代币存入您的MetaMask账户" }, "bytes": { "message": "字节" }, "canToggleInSettings": { - "message": "您可以在 设置 -> 提醒 中重新启用该提醒通知。" + "message": "您可以在“设置 -> 提醒”中重新启用该通知。" }, "cancel": { "message": "取消" @@ -386,8 +538,23 @@ "cancelSpeedUp": { "message": "取消或加快交易。" }, + "cancelSpeedUpLabel": { + "message": "这笔燃料费将$1原来的费用。", + "description": "$1 is text 'replace' in bold" + }, + "cancelSpeedUpTransactionTooltip": { + "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": "免费取消兑换" + }, "cancellationGasFee": { - "message": "取消交易燃料费用" + "message": "取消燃料费" }, "cancelled": { "message": "已取消" @@ -396,38 +563,62 @@ "message": "链 ID" }, "chainIdDefinition": { - "message": "用于签署此网络交易的链路ID。" + "message": "用于签署此网络的交易的链 ID。" }, "chainIdExistsErrorMsg": { - "message": "链路ID已经存在于现有的网络列表中。" + "message": "此链 ID 目前已被 $1 网络使用。" + }, + "chainListReturnedDifferentTickerSymbol": { + "message": "链ID为$1的网络使用的货币代码($2)可能与您输入的不同。请在继续之前进行验证。", + "description": "$1 is the chain id currently entered in the network form and $2 is the return value of nativeCurrency.symbol from chainlist.network" }, "chromeRequiredForHardwareWallets": { - "message": "您需要在谷歌浏览器(Google Chrome)上使用 MetaMask 才能连接到您的硬件钱包。" + "message": "您需要在 Google Chrome 上使用 MetaMask 以连接到您的硬件钱包。" }, "clickToConnectLedgerViaWebHID": { - "message": "点击这里通过WebHID连接到您的Ledger", + "message": "点击这里以通过 WebHID 连接您的 Ledger", "description": "Text that can be clicked to open a browser popup for connecting the ledger device via webhid" }, + "clickToManuallyAdd": { + "message": "请点击这里,以手动添加代币。" + }, "clickToRevealSeed": { - "message": "点击此处显示密语" + "message": "点击此处以显示助记词" }, "close": { "message": "关闭" }, + "collectibleAddFailedMessage": { + "message": "由于所有权信息不匹配,无法添加NFT。请确保所输入的信息正确无误。" + }, + "collectibleAddressError": { + "message": "此代币是NFT。另加上$1", + "description": "$1 is a clickable link with text defined by the 'importNFTPage' key" + }, "confirm": { "message": "确认" }, + "confirmPageDialogSetApprovalForAll": { + "message": "您正在向$1授予访问权限,包括对您将来可能拥有的任何资产的访问权限。另一端的一方可以随时从您的钱包中转移NFT,无需询问您,直到您撤销此项批准。$2", + "description": "$1 and $2 are bolded translations 'confirmPageDialogSetApprovalForAllPlaceholder1' and 'confirmPageDialogSetApprovalForAllPlaceholder2'" + }, + "confirmPageDialogSetApprovalForAllPlaceholder1": { + "message": "此合约中的所有NFT" + }, + "confirmPageDialogSetApprovalForAllPlaceholder2": { + "message": "请谨慎行事。" + }, "confirmPassword": { "message": "确认密码" }, "confirmRecoveryPhrase": { - "message": "请确认账户助记词" + "message": "确认助记词" }, "confirmSecretBackupPhrase": { "message": "请确认您的账户助记词" }, "confirmed": { - "message": "确认" + "message": "已确认" }, "confusableUnicode": { "message": "'$1' 与 '$2' 相似。" @@ -436,7 +627,7 @@ "message": "找到零宽字符。" }, "confusingEnsDomain": { - "message": "我们在ENS名称中检测到一个令人混淆的字符。请检查ENS名称以避免潜在骗案的可能。" + "message": "我们在 ENS 名称中检测到一个可令人混淆的字符。检查 ENS 名称以避免潜在的骗局。" }, "congratulations": { "message": "恭喜" @@ -458,7 +649,7 @@ "description": "$1 is the name/origin of a web3 site/application that the user can connect to metamask" }, "connectToAll": { - "message": "连接到您的全部$1", + "message": "连接到您的全部 $1", "description": "$1 will be replaced by the translation of connectToAllAccounts" }, "connectToAllAccounts": { @@ -466,7 +657,7 @@ "description": "will replace $1 in connectToAll, completing the sentence 'connect to all of your accounts', will be text that shows list of accounts on hover" }, "connectToMultiple": { - "message": "连接到 $1", + "message": "连接到 $1", "description": "$1 will be replaced by the translation of connectToMultipleNumberOfAccounts" }, "connectToMultipleNumberOfAccounts": { @@ -474,17 +665,17 @@ "description": "$1 is the number of accounts to which the web3 site/application is asking to connect; this will substitute $1 in connectToMultiple" }, "connectWithMetaMask": { - "message": "使用 MetaMask 连接" + "message": "与 MetaMask 连接" }, "connectedAccountsDescriptionPlural": { "message": "您有 $1 个账户连接到了该网站。", "description": "$1 is the number of accounts" }, "connectedAccountsDescriptionSingular": { - "message": "您有 1 个账户连接到了该网站。" + "message": "您有1个账户连接到了该网站。" }, "connectedAccountsEmptyDescription": { - "message": "MetaMask 没有连接这个网站。要连接到 web3 网站,请在他们的网站上找到连接按钮。" + "message": "MetaMask 没有连接到该网站。要连接到 web3 网站,请找到并点击连接按钮。" }, "connectedSites": { "message": "已连接的网站" @@ -494,9 +685,13 @@ "description": "$1 is the account name" }, "connectedSitesEmptyDescription": { - "message": "$1 还没连接任何网站。", + "message": "$1 还没连接到任何网站。", "description": "$1 is the account name" }, + "connectedSnapSites": { + "message": "$1的snap已连接到这些站点。它们有上述的访问权限。", + "description": "$1 represents the name of the snap" + }, "connecting": { "message": "连接中……" }, @@ -506,56 +701,74 @@ "connectingToGoerli": { "message": "正在连接 Goerli 测试网络" }, - "connectingToKovan": { - "message": "正在连接到 Kovan 测试网络" - }, "connectingToMainnet": { - "message": "正在连接到以太坊 Ethereum 主网" + "message": "正在连接到以太坊主网" }, - "connectingToRinkeby": { - "message": "正在连接到 Rinkeby 测试网络" - }, - "connectingToRopsten": { - "message": "正在连接到 Ropsten 测试网络" + "connectingToSepolia": { + "message": "正在连接Sepolia测试网络" }, "contactUs": { "message": "联系我们" }, "contacts": { - "message": "联系人" + "message": "联系信息" }, "continue": { "message": "继续" }, + "continueToCoinbasePay": { + "message": "继续使用Coinbase Pay" + }, + "continueToMoonPay": { + "message": "继续使用MoonPay" + }, "continueToTransak": { - "message": "继续到Transak" + "message": "继续前往 Transak" }, "continueToWyre": { "message": "继续前往 Wyre" }, "contract": { - "message": "合同" + "message": "合约" }, "contractAddress": { - "message": "合同地址" + "message": "合约地址" }, "contractAddressError": { - "message": "您正在向代币合同地址发送代币。这可能导致丢失这些代币。" + "message": "您正在向代币的合约地址发送代币。这可能导致这些代币丢失。" }, "contractDeployment": { "message": "合约部署" }, + "contractDescription": { + "message": "为了保护自己免受骗子欺诈,请花点时间核查合约细节。" + }, "contractInteraction": { "message": "合约交互" }, + "contractRequestingSpendingCap": { + "message": "合约请求支出上限" + }, + "contractTitle": { + "message": "合约细节" + }, + "contractToken": { + "message": "代币合约" + }, + "convertTokenToNFTDescription": { + "message": "我们检测到该资产是NFT。Metamask现在完全原生支持NFT。您想将它从您的代币列表中删除并将它添加为NFT吗?" + }, + "convertTokenToNFTExistDescription": { + "message": "我们检测到该资产已作为NFT添加。是否要将其从代币列表中删除?" + }, "copiedExclamation": { - "message": "已复制" + "message": "已复制!" }, "copyAddress": { "message": "复制地址到剪贴板" }, "copyPrivateKey": { - "message": "这是您的私钥(点击复制)" + "message": "这是您的私钥(点击以复制)" }, "copyRawTransactionData": { "message": "复制原始交易数据" @@ -576,7 +789,7 @@ "message": "创建账户" }, "createNewWallet": { - "message": "创建新的钱包" + "message": "创建新钱包" }, "createPassword": { "message": "创建密码" @@ -588,13 +801,13 @@ "message": "货币符号" }, "currencySymbolDefinition": { - "message": "此网络货币显示的牌照符号。" + "message": "此网络的货币显示的股票代码。" }, "currentAccountNotConnected": { "message": "您的当前账户没有连接" }, "currentExtension": { - "message": "当前扩展页" + "message": "当前扩展程序页面" }, "currentLanguage": { "message": "当前语言" @@ -605,70 +818,94 @@ "currentlyUnavailable": { "message": "在此网络上不可用" }, + "curveHighGasEstimate": { + "message": "高价燃料估算图" + }, + "curveLowGasEstimate": { + "message": "低价燃料估算图" + }, + "curveMediumGasEstimate": { + "message": "市场价燃料估算图" + }, "custom": { "message": "高级" }, - "customGas": { - "message": "自定义燃料" + "customContentSearch": { + "message": "搜索以前添加的网络" }, "customGasSettingToolTipMessage": { "message": "使用$1来定制燃料价格。如果您不熟悉这可能会引起混淆。操作风险自付。", "description": "$1 is key 'advanced' (text: 'Advanced') separated here so that it can be passed in with bold font-weight" }, - "customGasSubTitle": { - "message": "提升费用可能会缩短处理时间,但不保证绝对有效。" - }, "customSpendLimit": { "message": "自定义消费限额" }, + "customSpendingCap": { + "message": "自定义支出上限" + }, "customToken": { "message": "自定义代币" }, + "customTokenWarningInNonTokenDetectionNetwork": { + "message": "代币检测在此网络上尚不可用。请手动导入代币并确保您信任它。了解 $1" + }, + "customTokenWarningInTokenDetectionNetwork": { + "message": "手动导入代币前,请确保您信任它。了解 $1" + }, + "customTokenWarningInTokenDetectionNetworkWithTDOFF": { + "message": "在导入代币之前,请确保该代币是您所信任的。了解如何避免$1。您还可以启用代币检测$2。" + }, + "customerSupport": { + "message": "客户支持" + }, "dappSuggested": { - "message": "推荐站点" + "message": "建议的网站" }, "dappSuggestedGasSettingToolTipMessage": { - "message": "$1建议了这个价格。", + "message": "$1 建议了这个价格。", "description": "$1 is url for the dapp that has suggested gas settings" }, "dappSuggestedShortLabel": { - "message": "站点" + "message": "网站" }, "dappSuggestedTooltip": { - "message": "$1推荐了这个价格。", + "message": "$1 建议了这个价格。", "description": "$1 represents the Dapp's origin" }, + "darkTheme": { + "message": "深色" + }, "data": { "message": "数据" }, - "dataBackupFoundInfo": { - "message": "您的部分账户数据已在之前安装的 MetaMask 时备份。其中可能包括您的设置、联系人和代币。您现在想恢复这些数据吗?" + "dataBackupSeemsCorrupt": { + "message": "无法还原数据。文件似乎已损坏。" }, "dataHex": { - "message": "十六进制文件" + "message": "十六进制" }, "decimal": { - "message": "小数精度" + "message": "代币小数" }, "decimalsMustZerotoTen": { - "message": "小数位最小为0并且不超过36位." + "message": "小数位至少为0,且不得超过36。" }, "decrypt": { "message": "解密" }, "decryptCopy": { - "message": "复制加密信息" + "message": "复制加密消息" }, "decryptInlineError": { - "message": "无法解密此消息,错误:$1", + "message": "由于错误:$1,无法解密此消息", "description": "$1 is error message" }, "decryptMessageNotice": { - "message": "$1 希望阅读此信息来完成您的操作。", + "message": "$1 希望阅读此消息来完成您的操作", "description": "$1 is the web3 site name" }, "decryptMetamask": { - "message": "解密信息" + "message": "解密消息" }, "decryptRequest": { "message": "解密请求" @@ -683,25 +920,45 @@ "message": "删除网络?" }, "deleteNetworkDescription": { - "message": "是否确认要删除该网络?" + "message": "您确定要删除该网络吗?" + }, + "depositCrypto": { + "message": "存入$1", + "description": "$1 represents the crypto symbol to be purchased" + }, + "deprecatedTestNetworksLink": { + "message": "了解详情" + }, + "deprecatedTestNetworksMsg": { + "message": "由于以太坊的协议有变化:Rinkeby、Ropsten和Kovan测试网络可能无法可靠地工作,很快就会被弃用。" }, "description": { "message": "描述" }, "details": { - "message": "详情" + "message": "详细信息" + }, + "directDepositCrypto": { + "message": "直接存入$1" + }, + "directDepositCryptoExplainer": { + "message": "如果您已经有了一些$1,那么在您的新钱包里获得$1的最快方式是直接存入。" + }, + "disabledGasOptionToolTipMessage": { + "message": "“$1”已被禁用,因为它不满足在原来的燃料费用基础上至少增加10%的要求。", + "description": "$1 is gas estimate type which can be market or aggressive" }, "disconnect": { - "message": "断开" + "message": "断开连接" }, "disconnectAllAccounts": { - "message": "断开所有账户" + "message": "断开所有账户的连接" }, "disconnectAllAccountsConfirmationDescription": { "message": "您确定要断开连接吗?您可能会失去网站功能。" }, "disconnectPrompt": { - "message": "断开 $1" + "message": "断开连接 $1" }, "disconnectThisAccount": { "message": "断开此账户的连接" @@ -710,31 +967,34 @@ "message": "关闭" }, "dismissReminderDescriptionField": { - "message": "开启此选项以关闭账户助记词备份提醒消息。 我们强烈建议您备份您的账户助记词,以避免资金损失" + "message": "开启此选项以关闭账户助记词备份提醒消息。我们强烈建议您备份您的账户助记词,以避免资金损失" }, "dismissReminderField": { - "message": "消除账户助记词备份提醒" + "message": "关闭账户助记词备份提醒" }, "domain": { - "message": "网域" + "message": "域" }, "done": { "message": "完成" }, "dontShowThisAgain": { - "message": "不再显示" + "message": "不再显示此内容" + }, + "downArrow": { + "message": "向下箭头" }, "downloadGoogleChrome": { "message": "下载 Google Chrome 浏览器" }, "downloadSecretBackup": { - "message": "下载账户助记词,并将其安全保存在外部加密硬盘或存储介质上。" + "message": "下载此账户助记词,并将其安全保存在外部加密硬盘或存储介质上。" }, "downloadStateLogs": { "message": "下载状态日志" }, "dropped": { - "message": "丢弃" + "message": "已放弃" }, "edit": { "message": "编辑" @@ -745,42 +1005,45 @@ "editAddressNickname": { "message": "编辑地址昵称" }, + "editCancellationGasFeeModalTitle": { + "message": "编辑取消燃料费用" + }, "editContact": { - "message": "编辑联系人" + "message": "编辑联系信息" }, "editGasEducationButtonText": { "message": "我应该如何选择?" }, "editGasEducationHighExplanation": { - "message": "这对时间敏感的交易(例如兑换 Swap)最好,因为它增加了交易成功的可能性。 如果兑换处理时间过长,它可能会失败并导致丢失您的一些燃料费用。" + "message": "这最适合对时间敏感的交易(如交换),因为它能增加交易成功的可能性。如果交换需要太长的时间来处理,它可能会失败,并导致您损失一些燃料费。" }, "editGasEducationLowExplanation": { - "message": "只有在加工时间不太重要时才能使用较低的燃料费用。 较低的费用使我们难以预测您的交易何时(或会否)成功。" + "message": "只有在处理时间不太重要时才能使用较低的燃料费用。较低的费用使我们难以预测您的交易何时(或会否)成功。" }, "editGasEducationMediumExplanation": { - "message": "中型燃料费用费用对于发送、取出或其他非时间敏感交易很好。此设置通常会导致交易成功。" + "message": "中燃料费用适合用于发送、提取或其他非时间敏感交易。此设置最常导致交易成功。" }, "editGasEducationModalIntro": { - "message": "取决于交易类型和它对您的重要性,选择正确的燃料费用。" + "message": "选择合适的燃料费取决于交易的类型和它对您的重要性。" }, "editGasEducationModalTitle": { "message": "如何选择?" }, "editGasFeeModalTitle": { - "message": "编辑燃料费用" + "message": "编辑网络费" }, "editGasHigh": { "message": "高" }, "editGasLimitOutOfBounds": { - "message": "燃料限制至少要 $1" + "message": "燃料上限至少为 $1" }, "editGasLimitOutOfBoundsV2": { - "message": "燃料限制必须大于$1且小于 $2", + "message": "燃料上限必须大于 $1 且小于 $2", "description": "$1 is the minimum limit for gas and $2 is the maximum limit" }, "editGasLimitTooltip": { - "message": "燃料限制是您愿意使用的最大燃料单位。 燃料单位是达到“最高优先收费”和“最高收费”的乘数。" + "message": "燃料上限是您愿意使用的最大燃料单位。燃料单位是“最大优先费”和“最大费用”的乘数。" }, "editGasLow": { "message": "低" @@ -789,22 +1052,22 @@ "message": "最大基本费用不能低于优先费用" }, "editGasMaxBaseFeeHigh": { - "message": "最大基本费用高于必须" + "message": "最大基本费用高于必要水平" }, "editGasMaxBaseFeeLow": { - "message": "当前网络条件的最高基本费用很低" + "message": "对于当前网络条件而言,最大基本费用较低" }, "editGasMaxFeeHigh": { - "message": "最大费用高于必须" + "message": "最大费用高于必要水平" }, "editGasMaxFeeLow": { - "message": "对于网络条件来说,最高费用太低" + "message": "对于网络条件而言,最大费用过低" }, "editGasMaxFeePriorityImbalance": { "message": "最大费用不能低于最大优先费用" }, "editGasMaxFeeTooltip": { - "message": "最大费用是您将支付的最多(基本费用+优先费用)。" + "message": "最大费用是您将支付的最大费用(基本费用+优先费用)。" }, "editGasMaxPriorityFeeBelowMinimum": { "message": "最大优先费用必须大于0 GWEI。" @@ -813,60 +1076,79 @@ "message": "优先费用必须大于0。" }, "editGasMaxPriorityFeeHigh": { - "message": "最高优先收费高于必要的。您可以支付超过需要的费用。" + "message": "最大优先费用高于必要水平。您可以支付超过所需的费用。" }, "editGasMaxPriorityFeeHighV2": { - "message": "优先收费高于必要的。您可以支付超过需要的费用" + "message": "优先费用高于必要水平。您可以支付超过所需的费用" }, "editGasMaxPriorityFeeLow": { - "message": "当前网络条件的最高优先费用很低" + "message": "对于当前网络条件而言,最大优先费用较低" }, "editGasMaxPriorityFeeLowV2": { - "message": "当前网络条件的优先收费很低" + "message": "对于当前网络条件而言,优先费用较低" }, "editGasMaxPriorityFeeTooltip": { - "message": "最高优先收费(又称“矿工费”)直接向矿工支付,并鼓励他们确定您的交易的优先次序。您最常支付的是您的最大设置" + "message": "最大优先费(又称“矿工费”)直接向矿工支付,激励他们优先处理您的交易。您通常会支付您的最大设置" }, "editGasMedium": { - "message": "中度" + "message": "中" }, "editGasPriceTooLow": { - "message": "燃料价格必须大于 0" + "message": "燃料价格必须大于0" }, "editGasPriceTooltip": { - "message": "此网络在提交交易时需要一个“燃料价格”栏。燃料价格是您将按单位支付的金额。" + "message": "此网络在提交交易时需要一个“燃料价格”字段。燃料价格是您支付的每单位燃料金额。" }, "editGasSubTextAmountLabel": { - "message": "最大金额:", + "message": "最大金额:", "description": "This is meant to be used as the $1 substitution editGasSubTextAmount" }, "editGasSubTextFeeLabel": { - "message": "最高收费:" + "message": "最大费用:" }, "editGasTitle": { "message": "编辑优先级" }, "editGasTooLow": { - "message": "未知处理时间" + "message": "处理时间未知" }, "editGasTooLowTooltip": { - "message": "在当前市场条件下,您的最大费用或最大优先费用可能很低。我们不知道您的交易将在何时(或会否)处理。" + "message": "对于当前的市场条件而言,您的最大费用或最大优先费用可能较低。我们不知道您的交易将在何时(或会否)处理。" }, "editGasTooLowWarningTooltip": { - "message": "这会降低您的最大费用,但如果网络流量增加,您的交易可能会被延迟或失败。" + "message": "这降低了您的最大费用,但如果网络流量增加,您的交易可能会被延迟或失败。" }, "editNonceField": { - "message": "编辑空格" + "message": "编辑 Nonce" }, "editNonceMessage": { - "message": "这是一个高级功能,请谨慎使用。" + "message": "这是高级功能,请谨慎使用。" }, "editPermission": { "message": "编辑权限" }, + "editSpeedUpEditGasFeeModalTitle": { + "message": "编辑加速燃料费用" + }, "enableAutoDetect": { "message": " 启用自动检测" }, + "enableEIP1559V2": { + "message": "启用增强型燃料费用户界面" + }, + "enableEIP1559V2AlertMessage": { + "message": "我们已经更新了燃料费用估算和定制的方式。" + }, + "enableEIP1559V2ButtonText": { + "message": "在设置中开启增强型燃料费用户界面" + }, + "enableEIP1559V2Description": { + "message": "我们已经更新了燃料估算和定制的方式。如果您想使用新的燃料体验,请开启。$1", + "description": "$1 here is Learn More link" + }, + "enableEIP1559V2Header": { + "message": "新燃料体验" + }, "enableFromSettings": { "message": " 从设置中启用它。" }, @@ -874,21 +1156,24 @@ "message": "启用 OpenSea API" }, "enableOpenSeaAPIDescription": { - "message": "使用 OpenSea's API 获取NFT 数据。NFT 自动检测依赖于 OpenSea 的 API,在此关闭时将不可用。" + "message": "使用 OpenSea 的 API 获取 NFT 数据。NFT 自动检测依赖于 OpenSea 的 API,在后者关闭时自动检测将不可用。" + }, + "enableSmartTransactions": { + "message": "启用智能交易" }, "enableToken": { "message": "启用 $1", "description": "$1 is a token symbol, e.g. ETH" }, "encryptionPublicKeyNotice": { - "message": "$1 希望得到您的加密公钥。同意后该网站将可以向您发送加密信息。", + "message": "$1 想要您的加密公钥。同意后,该网站将可以向您发送加密消息。", "description": "$1 is the web3 site name" }, "encryptionPublicKeyRequest": { "message": "申请加密公钥" }, "endOfFlowMessage1": { - "message": "您通过了测试—— 保管好您的账户助记词,这是您的责任!" + "message": "您通过了测试——保管好您的账户助记词,这是您的责任!" }, "endOfFlowMessage10": { "message": "全部完成" @@ -897,54 +1182,63 @@ "message": "安全保存技巧" }, "endOfFlowMessage3": { - "message": "在多处保存备份数据。" + "message": "在多处保存备份。" }, "endOfFlowMessage4": { - "message": "不向任何任何人分享该账户助记词。" + "message": "绝不向任何人分享该账户助记词。" }, "endOfFlowMessage5": { "message": "谨防网络钓鱼!MetaMask 绝不会主动要求您提供个人账户助记词。" }, "endOfFlowMessage6": { - "message": "如果您需要再次备份账户助记词,请通过设置 -> 安全选项完成该操作。" + "message": "如果您需要再次备份账户助记词,请通过“设置 -> 安全”选项完成该操作。" }, "endOfFlowMessage7": { - "message": "如果您有问题或看到一些可疑情況,请联系我们的$1支持。", + "message": "如果您有任何疑问或发现可疑之处,请联系我们的支持部门 $1。", "description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." }, "endOfFlowMessage8": { "message": "MetaMask 无法恢复您的账户助记词。" }, "endOfFlowMessage9": { - "message": "了解详情。" + "message": "了解更多。" }, "endpointReturnedDifferentChainId": { "message": "RPC 端点使用链不同的链 ID: $1", "description": "$1 is the return value of eth_chainId from an RPC endpoint" }, + "enhancedTokenDetection": { + "message": "增强型代币检测" + }, + "enhancedTokenDetectionAlertMessage": { + "message": "$1. $2目前提供增强型代币检测" + }, + "enhancedTokenDetectionDescription": { + "message": "ConsenSys的代币API汇集了来自各种第三方代币列表的一系列代币。启用后,代币即可在以太坊主网、Binance、Polygon和Avalanche上被自动检测,并可搜索。关闭后,自动检测和搜索仅可在以太坊主网上进行。" + }, "ensIllegalCharacter": { - "message": "ENS的非法字符。" + "message": "ENS 的非法字符。" }, "ensNotFoundOnCurrentNetwork": { - "message": "未在当前网络找到 ENS 名称。请尝试切换至主以太坊网络。" + "message": "未在当前网络找到 ENS 名称。请尝试切换至以太坊主网。" }, "ensNotSupportedOnNetwork": { "message": "网络不支持 ENS" }, "ensRegistrationError": { - "message": "ENS 名称登记错误" + "message": "ENS 名称注册错误" }, "ensUnknownError": { "message": "ENS 查找失败。" }, "enterMaxSpendLimit": { - "message": "输入最高消费额度" + "message": "输入最大消费限额" }, "enterPassword": { "message": "输入密码" }, "enterPasswordContinue": { - "message": "输入密码以继续" + "message": "输入密码继续" }, "errorCode": { "message": "代码:$1", @@ -963,11 +1257,11 @@ "description": "Displayed error name for debugging purposes. $1 is the error name" }, "errorPageMessage": { - "message": "重新加载页面或联系$1支持。", + "message": "通过重新加载页面再试一次,或联系支持部门 $1。", "description": "Message displayed on generic error page in the fullscreen or notification UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." }, "errorPagePopupMessage": { - "message": "关闭并重新打开弹出窗口,或联系$1支持。", + "message": "通过关闭并重新打开弹出窗口再试一次,或联系支持部门 $1。", "description": "Message displayed on generic error page in the popup UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." }, "errorPageTitle": { @@ -978,60 +1272,60 @@ "message": "栈:", "description": "Title for error stack, which is displayed for debugging purposes" }, - "estimatedProcessingTimes": { - "message": "预计处理时间" - }, "ethGasPriceFetchWarning": { "message": "由于目前主要的燃料估算服务不可用,因此提供了备用燃料价格。" }, "ethereumPublicAddress": { - "message": "以太坊 Ethereum 公开地址" + "message": "以太坊公共地址" }, "etherscan": { - "message": "Etherscan(以太坊浏览器)" + "message": "Etherscan" }, "etherscanView": { - "message": "在 Etherscan(以太坊浏览器)上查看账户" + "message": "在 Etherscan 上查看账户" }, "etherscanViewOn": { - "message": "在Etherscan上查看" + "message": "在 Etherscan 上查看" + }, + "expandExperience": { + "message": "扩展您的web3体验" }, "expandView": { "message": "展开视图" }, "experimental": { - "message": "实验性" + "message": "试验" }, "exportPrivateKey": { "message": "导出私钥" }, "externalExtension": { - "message": "外部扩展" + "message": "外部扩展程序" }, "failed": { "message": "失败" }, "failedToFetchChainId": { - "message": "无法获取链 IC,您的 RPC URL 地址是正确的么?" + "message": "无法获取链 ID。您的 RPC URL 正确吗?" + }, + "failedToFetchTickerSymbolData": { + "message": "股票代码验证数据当前未能提供,请确保您输入的代码正确无误。这会影响您在此网络看到的兑换率" }, "failureMessage": { - "message": "出了点问题,我们无法完成这个操作。" + "message": "出了点问题,我们无法完成此操作" }, "fast": { "message": "快" }, - "fastest": { - "message": "最快" - }, "feeAssociatedRequest": { "message": "此请求需要支付一定的费用。" }, "fiat": { - "message": "FIAT", + "message": "法币", "description": "Exchange type" }, "fileImportFail": { - "message": "文件导入失败? 点击这里!", + "message": "文件导入失败?点击这里!", "description": "Helps user import their account from a JSON file" }, "flaskSnapSettingsCardButtonCta": { @@ -1043,27 +1337,60 @@ "description": "Start of the sentence describing when and where snap was added" }, "flaskSnapSettingsCardFrom": { - "message": "从", + "message": "自", "description": "Part of the sentence describing when and where snap was added" }, + "flaskWelcomeUninstall": { + "message": "您应该卸载此扩展程序", + "description": "This request is shown on the Flask Welcome screen. It is intended for non-developers, and will be bolded." + }, + "flaskWelcomeWarning1": { + "message": "Flask供开发人员试验不稳定的新API。除非您是开发人员或Beta测试人员,否则请$1。", + "description": "This is a warning shown on the Flask Welcome screen, intended to encourage non-developers not to proceed any further. $1 is the bolded message 'flaskWelcomeUninstall'" + }, + "flaskWelcomeWarning2": { + "message": "我们不保证此扩展程序的安全性或稳定性。Flask提供的新API并未针对网络钓鱼攻击进行强化,这意味着任何需要Flask的站点或快取都可能是窃取您资产的恶意企图。", + "description": "This explains the risks of using MetaMask Flask" + }, + "flaskWelcomeWarning3": { + "message": "所有Flask API都是实验性的。它们可能会在未事先通知的情况下被更改或删除,它们也可能会无限期地留在Flask上而不会迁移到稳定的MetaMask。您需要自行承担使用它们的风险。", + "description": "This message warns developers about unstable Flask APIs" + }, + "flaskWelcomeWarning4": { + "message": "确保在使用Flask时禁用常规MetaMask扩展程序。", + "description": "This message calls to pay attention about multiple versions of MetaMask running on the same site (Flask + Prod)" + }, + "flaskWelcomeWarningAcceptButton": { + "message": "我接受风险", + "description": "this text is shown on a button, which the user presses to confirm they understand the risks of using Flask" + }, "followUsOnTwitter": { - "message": "在Twitter上关注我们" + "message": "在 Twitter 上关注我们" }, "forbiddenIpfsGateway": { "message": "禁用的 IPFS 网关:请指定一个 CID 网关" }, "forgetDevice": { - "message": "忘记此设备" + "message": "忽略此设备" + }, + "forgotPassword": { + "message": "忘记密码了?" }, "from": { - "message": "从" + "message": "自" }, "fromAddress": { "message": "从:$1", "description": "$1 is the address to include in the From label. It is typically shortened first using shortenAddress" }, + "fromTokenLists": { + "message": "从代币列表:$1" + }, "functionApprove": { - "message": "功能:同意" + "message": "功能:批准" + }, + "functionSetApprovalForAll": { + "message": "功能:SetApprovalForAll" }, "functionType": { "message": "功能类型" @@ -1075,23 +1402,29 @@ "message": "编辑建议的燃料费" }, "gasDisplayDappWarning": { - "message": "这笔燃料气费是由$1建议的,覆盖这可能会导致您的交易出现问题。 如果您有问题,请联系$1。", + "message": "这笔燃料费是由 $1 建议的。忽略它可能会导致您的交易出现问题。如果您有疑问,请联系 $1。", "description": "$1 represents the Dapp's origin" }, "gasEstimatesUnavailableWarning": { - "message": "我们的低、中、高估计数字无法获得。" + "message": "无法获取我们的低、中、高估计值。" + }, + "gasFee": { + "message": "燃料费" }, "gasLimit": { - "message": "燃料限制" + "message": "燃料上限" }, "gasLimitInfoTooltipContent": { - "message": "燃料限制是指您愿意花费的最燃料量单位。" + "message": "燃料上限是指您愿意花费的最大燃料单位量。" + }, + "gasLimitRecommended": { + "message": "建议的燃料上限是$1。如果燃料上限低于此值,则可能会失败。" }, "gasLimitTooLow": { - "message": "燃料限制至少要 21000" + "message": "燃料上限至少为21000" }, "gasLimitTooLowWithDynamicFee": { - "message": "燃料限制至少要 $1", + "message": "燃料上限至少为 $1", "description": "$1 is the custom gas limit, in decimal." }, "gasLimitV2": { @@ -1101,10 +1434,10 @@ "message": "燃料选项" }, "gasPrice": { - "message": "燃料价格(GWEI)" + "message": "Gas 价格(GWEI)" }, "gasPriceExcessive": { - "message": "您的燃料费设置得不必要地高。请考虑降低金额。" + "message": "您的燃料费设置得过高。请考虑降低金额。" }, "gasPriceExcessiveInput": { "message": "燃料价格过高" @@ -1116,14 +1449,14 @@ "message": "由于网络错误,燃料价格估算失败。" }, "gasPriceInfoTooltipContent": { - "message": "燃料价格规定了您愿意为每单位燃料支付的 Ether 数量。" + "message": "燃料价格指明了您愿意为每单位燃料支付的以太币数量。" }, "gasTimingHoursShort": { "message": "$1 小时", "description": "$1 represents a number of hours" }, "gasTimingMinutes": { - "message": "$1分钟", + "message": "$1 分钟", "description": "$1 represents a number of minutes" }, "gasTimingMinutesShort": { @@ -1131,11 +1464,11 @@ "description": "$1 represents a number of minutes" }, "gasTimingNegative": { - "message": "可能在$1内", + "message": "可能在 $1 内", "description": "$1 represents an amount of time" }, "gasTimingPositive": { - "message": "有可能在 < $1", + "message": "有可能在 $1 以内", "description": "$1 represents an amount of time" }, "gasTimingSeconds": { @@ -1147,14 +1480,14 @@ "description": "$1 represents a number of seconds" }, "gasTimingVeryPositive": { - "message": "非常可能在 < $1", + "message": "很可能在 $1 以内", "description": "$1 represents an amount of time" }, "gasUsed": { - "message": "燃料使用" + "message": "使用的燃料" }, "gdprMessage": { - "message": "这些数据是汇总的,因此,根据《GDPR 通用数据保护条例》(EU) 2016/679,这些数据是匿名的。有关我们隐私惯例的更多信息,请参见我们的 $1。", + "message": "这些数据是汇总的,因此,根据《通用数据保护条例》(欧盟)2016/679,这些数据是匿名的。有关我们隐私惯例的更多信息,请参见我们的 $1。", "description": "$1 refers to the gdprMessagePrivacyPolicy message, the translation of which is meant to be used exclusively in the context of gdprMessage" }, "gdprMessagePrivacyPolicy": { @@ -1162,10 +1495,10 @@ "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" }, "general": { - "message": "通用" + "message": "常规" }, "getEther": { - "message": "获取 Ether" + "message": "获取以太币" }, "getEtherFromFaucet": { "message": "从水管获取 $1 网络的 Ether", @@ -1180,9 +1513,15 @@ "goerli": { "message": "Goerli 测试网络" }, + "gotIt": { + "message": "知道了!" + }, "grantedToWithColon": { "message": "授予:" }, + "gwei": { + "message": "GWEI" + }, "happyToSeeYou": { "message": "我们很高兴见到您。" }, @@ -1203,10 +1542,10 @@ "message": "连接硬件钱包" }, "hardwareWalletsMsg": { - "message": "选择希望用于 MetaMask 的硬件钱包" + "message": "选择希望用于 MetaMask 的硬件钱包。" }, "here": { - "message": "这里", + "message": "此处", "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hexData": { @@ -1215,6 +1554,15 @@ "hide": { "message": "隐藏" }, + "hideFullTransactionDetails": { + "message": "隐藏完整的交易细节" + }, + "hideSeedPhrase": { + "message": "隐藏助记词" + }, + "hideToken": { + "message": "隐藏代币" + }, "hideTokenPrompt": { "message": "隐藏代币?" }, @@ -1226,7 +1574,7 @@ "message": "隐藏没有余额的代币" }, "high": { - "message": "进取" + "message": "过高" }, "highGasSettingToolTipMessage": { "message": "使用$1来覆盖网络流量因像流行的 NFT 丢弃而出现的剧增。", @@ -1238,6 +1586,12 @@ "history": { "message": "历史记录" }, + "ignoreAll": { + "message": "忽略所有" + }, + "ignoreTokenWarning": { + "message": "如果您隐藏代币,它们将不会在您的钱包中显示。但您仍然可以通过搜索代币来添加它们。" + }, "import": { "message": "导入", "description": "Button to import an account from a selected file" @@ -1246,35 +1600,57 @@ "message": "导入账户" }, "importAccountError": { - "message": "导入帐户时出错。" + "message": "导入账户时出错。" }, "importAccountMsg": { - "message": "导入的账户将不会与最初创建的 MetaMask 账户助记词相关联。了解更多有关导入账户的信息 。" + "message": "导入的账户将不会与最初创建的 MetaMask 账户助记词相关联。了解更多有关导入账户的信息" }, "importAccountSeedPhrase": { - "message": "使用账户助记词导入账户" + "message": "使用账户助记词导入钱包" }, "importMyWallet": { "message": "导入我的钱包" }, + "importNFT": { + "message": "导入 NFT" + }, + "importNFTAddressToolTip": { + "message": "例如,在OpenSea中,NFT页面的详情下,有一个蓝色的超链接值,标记为“合约地址”。如果您点击它,它将带您前往该合约在Etherscan上的地址;在该页面的左上角,应该有一个标记为“合约”的图标,在右侧,有一长串字母和数字。这是创建您的NFT的合约地址。点击地址右侧的“复制”图标,就可以将它复制到剪贴板上。" + }, + "importNFTPage": { + "message": "导入NFT页面" + }, + "importNFTTokenIdToolTip": { + "message": "收藏品的ID是唯一标识符,因为所有NFT都是独一无二的。同样,在OpenSea上,此数字位于“详情”下方。记下它,或将它复制到剪贴板上。" + }, "importNFTs": { - "message": "导入NFT" + "message": "添加收藏品" + }, + "importSelectedTokens": { + "message": "要导入所选代币吗?" + }, + "importSelectedTokensDescription": { + "message": "只有您选择的代币才会出现在您的钱包中。您可以随时通过搜索隐藏的代币来导入它们。" }, "importTokenQuestion": { "message": "导入代币?" }, "importTokenWarning": { - "message": "任何人都可以用任何名称创建代币,包括现有代币的假版本。添加和交易风险自付!" + "message": "任何人都可以用任何名称创建代币,包括现有代币的虚假版本。添加和交易风险自负!" }, "importTokens": { - "message": "导入代币" + "message": "添加资产" }, "importTokensCamelCase": { - "message": "导入代币" + "message": "添加代币" }, "importWallet": { "message": "导入钱包" }, + "importWithCount": { + "message": "导入$1", + "description": "$1 will the number of detected tokens that are selected for importing, if all of them are selected then $1 will be all" + }, "importYourExisting": { "message": "使用账户助记词导入您的现有钱包" }, @@ -1282,27 +1658,41 @@ "message": "已导入", "description": "status showing that an account has been fully loaded into the keyring" }, + "inYourSettings": { + "message": "在设置中" + }, "infuraBlockedNotification": { - "message": "MetaMask无法连接到区块链主机。请检查可能的原因 $1。", + "message": "MetaMask 无法连接到区块链主机。请检查可能的原因 $1。", "description": "$1 is a clickable link with with text defined by the 'here' key" }, "initialTransactionConfirmed": { - "message": "您的初始交易已通过网络确认。请点击“确定”返回。" + "message": "您的初始交易已被网络确认。请点击“确定”返回。" + }, + "install": { + "message": "安装" }, "insufficientBalance": { "message": "余额不足。" }, + "insufficientCurrencyBuyOrDeposit": { + "message": "您的账户中没有足够的$1可以支付$2网络上的交易费用。$3或从另一个账户存入。", + "description": "$1 is the native currency of the network, $2 is the name of the current network, $3 is the key 'buy' + the ticker symbol of the native currency of the chain wrapped in a button" + }, + "insufficientCurrencyDeposit": { + "message": "您的账户中没有足够的$1可以支付$2网络上的交易费用。请从另一个账户存入$1。", + "description": "$1 is the native currency of the network, $2 is the name of the current network" + }, "insufficientFunds": { - "message": "余额不足。" + "message": "资金不足." }, "insufficientFundsForGas": { "message": "燃料资金不足" }, "insufficientTokens": { - "message": "代币余额不足。" + "message": "代币不足。" }, "invalidAddress": { - "message": "无效地址" + "message": "地址无效" }, "invalidAddressRecipient": { "message": "接收方地址无效" @@ -1310,46 +1700,52 @@ "invalidAddressRecipientNotEthNetwork": { "message": "非 ETH 网络,请使用小写" }, + "invalidAssetType": { + "message": "该资产是NFT,需要在NFT选项卡下的“导入NFT”页面上重新添加" + }, "invalidBlockExplorerURL": { "message": "无效的区块浏览器 URL" }, "invalidChainIdTooBig": { - "message": "无效的链 ID,该链 ID 数字过大。" + "message": "无效的链 ID,链 ID 过大。" }, "invalidCustomNetworkAlertContent1": { - "message": "需要重新输入自定义网络'$1'的链 ID。", + "message": "需要重新输入自定义网络 '$1' 的链 ID。", "description": "$1 is the name/identifier of the network." }, "invalidCustomNetworkAlertContent2": { - "message": "为了保护您免受恶意或有问题的网络提供商的侵害,现在所有的自定义网络都需要提供链 ID。" + "message": "为了保护您免受恶意或有问题的网络供应商的影响,现在所有的自定义网络都需要有链 ID。" }, "invalidCustomNetworkAlertContent3": { - "message": "进入设置 > 网络并输入链 ID。您可以通过 $1 查找常用的链 ID。", + "message": "进入设置 > 网络并输入链 ID。您可以通过 $1 查找最热门网络的链 ID。", "description": "$1 is a link to https://chainid.network" }, "invalidCustomNetworkAlertTitle": { "message": "无效的自定义网络" }, "invalidHexNumber": { - "message": "无效的十六进制数。" + "message": "无效的十六进制数字。" }, "invalidHexNumberLeadingZeros": { - "message": "无效的十六进制数。去除任何开头的零。" + "message": "无效的十六进制数字。删除所有前导零。" }, "invalidIpfsGateway": { "message": "无效的 IPFS 网关。该值必须是一个有效的 URL" }, "invalidNumber": { - "message": "无效的数字。输入一个数字或‘0x’开头的十六进制数。" + "message": "无效数字。输入一个十进制或带有“0x”前缀的十六进制数字。" }, "invalidNumberLeadingZeros": { - "message": "无效的数字。去除任何开头的零。" + "message": "无效数字。删除所有前导零。" }, "invalidRPC": { - "message": "无效 RPC URL" + "message": "RPC URL 无效" }, "invalidSeedPhrase": { - "message": "无效的账户助记词" + "message": "助记词无效" + }, + "invalidSeedPhraseCaseSensitive": { + "message": "输入无效!助记词须区分大小写。" }, "ipfsGateway": { "message": "IPFS 网关" @@ -1357,6 +1753,12 @@ "ipfsGatewayDescription": { "message": "输入用于 ENS 内容解析的 IPFS CID 网关的 URL。" }, + "jazzAndBlockies": { + "message": "哈希头像是帮助您一眼识别账户的独特图标,有 Jazzicons 和 Blockies 两种不同风格。" + }, + "jazzicons": { + "message": "Jazzicons" + }, "jsDeliver": { "message": "jsDeliver" }, @@ -1364,42 +1766,40 @@ "message": "JSON 文件", "description": "format for importing an account" }, - "keystone": { - "message": "铠石钱包" + "keepTapsOnTokens": { + "message": "以记录您在各账户和各网络中的代币和NFT。" }, - "keystoneTutorial": { - "message": " (使用教程)" + "keystone": { + "message": "Keystone" }, "knownAddressRecipient": { - "message": "已知接收方地址。" + "message": "已知合约地址。" }, "knownTokenWarning": { - "message": "此操作将编辑已经在您的钱包中列出的代币,有可能被用来欺骗您。只有确定要更改这些代币的内容时,才通过此操作。了解更多关于 $1" - }, - "kovan": { - "message": "Kovan 测试网络" + "message": "此操作将编辑已经在您的钱包中列出的代币,有肯能被用来欺骗您。只有确定要更改这些代币的内容时,才通过此操作。了解更多关于 $1" }, "lastConnected": { "message": "最后连接" }, - "learmMoreAboutGas": { - "message": "想要有关燃料$1?" - }, "learnCancelSpeeedup": { - "message": "学习如何$1", + "message": "学习如何 $1", "description": "$1 is link to cancel or speed up transactions" }, "learnMore": { - "message": "查看更多" + "message": "了解更多" + }, + "learnMoreAboutGas": { + "message": "想要有关燃料$1?", + "description": "$1 will be replaced by the learnMore translation key" }, "learnMoreUpperCase": { - "message": "查看更多" + "message": "了解更多" }, "learnScamRisk": { - "message": "欺诈和安全风险." + "message": "诈骗和安全风险的信息。" }, "ledgerAccountRestriction": { - "message": "在添加新的账户之前,需要使用您的最后一个账户。" + "message": "您需要先使用最后一个账户,然后才能添加新账户。" }, "ledgerConnectionInstructionCloseOtherApps": { "message": "关闭任何连接到您设备的其他软件,然后点击这里刷新。" @@ -1408,49 +1808,55 @@ "message": "点击确认前:" }, "ledgerConnectionInstructionStepFour": { - "message": "在您的Ledger设备上启用\"智能合同数据\"或\"盲目签名\"" + "message": "在您的 Ledger 设备上启用“智能合约数据”或“盲签”" }, "ledgerConnectionInstructionStepOne": { - "message": "启用在“设置 > 高级”下使用Ledger Live" + "message": "在“设置 > 高级”下启用使用 Ledger Live" }, "ledgerConnectionInstructionStepThree": { - "message": "在您的Ledger设备中插入并选择Ethereum应用" + "message": "在您的 Ledger 设备中插入并选择 Ethereum 应用程序" }, "ledgerConnectionInstructionStepTwo": { - "message": "打开和解锁Ledger Live应用程序" + "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": { - "message": "Ledger设备打开失败。您的Ledger可能已连接到其他软件。 请关闭Ledger Live或其他连接到您Ledger设备的应用程序,并尝试再次连接。" + "message": "Ledger 设备打开失败。您的 Ledger 可能已连接到其他软件。请关闭 Ledger Live 或其他连接到您的 Ledger 设备的应用程序,并尝试再次连接。" }, "ledgerLive": { "message": "Ledger Live", "description": "The name of a desktop app that can be used with your ledger device. We can also use it to connect a users Ledger device to MetaMask." }, "ledgerLiveApp": { - "message": "Ledger Live应用程序" + "message": "Ledger Live 应用程序" }, "ledgerLocked": { - "message": "无法连接到Ledger设备。请确保您的设备已解锁并打开Etherum应用程序。" + "message": "无法连接到 Ledger 设备。请确保您的设备已解锁并打开 Etherum 应用程序。" }, "ledgerTimeout": { - "message": "Ledger Live需要太长时间才能响应或连接超时。请确保Ledger Live应用已打开,您的设备已解锁。" + "message": "Ledger Live 响应时间过长或连接超时。请确保 Ledger Live 应用程序已打开且您的设备已解锁。" }, "ledgerTransportChangeWarning": { - "message": "如果您的Ledger Live应用程序已打开,请断开任何打开的Ledger Live连接并关闭 Ledger Live应用程序。" + "message": "如果您的 Ledger Live 应用程序已打开,请断开任何打开的 Ledger Live 的连接并关闭 Ledger Live 应用程序。" }, "ledgerWebHIDNotConnectedErrorMessage": { - "message": "Ledger设备未连接。如果您想要连接您的Ledger,请再次点击“继续”并批准HID连接", + "message": "Ledger 设备未连接。如果您想要连接您的 Ledger,请再次点击“继续”并批准 HID 连接", "description": "An error message shown to the user during the hardware connect flow." }, "letsGoSetUp": { - "message": "第一次,立即开始设置!" + "message": "是的,让我们开始吧!" + }, + "levelArrow": { + "message": "水平箭头" + }, + "lightTheme": { + "message": "浅色" }, "likeToImportTokens": { - "message": "您想添加这些代币吗?" + "message": "您想导入这些代币吗?" }, "link": { "message": "链接" @@ -1462,7 +1868,10 @@ "message": "加载更多" }, "loading": { - "message": "加载中……" + "message": "正在加载..." + }, + "loadingNFTs": { + "message": "正在加载NFT......" }, "loadingTokens": { "message": "加载代币中……" @@ -1471,11 +1880,15 @@ "message": "Localhost 8545" }, "lock": { - "message": "锁定" + "message": "注销" }, "lockTimeTooGreat": { "message": "锁定时间过长" }, + "logo": { + "message": "$1标志", + "description": "$1 is the name of the ticker" + }, "low": { "message": "低" }, @@ -1490,15 +1903,24 @@ "message": "以后的交易将在这个时候之后排队。最后一次看到的价格是在一段时间之前。" }, "mainnet": { - "message": "以太坊 Ethereum 主网络" + "message": "以太坊主网" + }, + "mainnetToken": { + "message": "该地址与已知的以太坊主网代币地址匹配。重新检查您尝试添加的代币的合约地址和网络。" }, "makeAnotherSwap": { - "message": "创建一个新的交换" + "message": "创建新的交换" }, "makeSureNoOneWatching": { "message": "请确保没有人在观看您的屏幕", "description": "Warning to users to be care while creating and saving their new Secret Recovery Phrase" }, + "malformedData": { + "message": "格式错误的数据" + }, + "manageSnaps": { + "message": "管理已安装的Snap" + }, "max": { "message": "最大" }, @@ -1506,20 +1928,20 @@ "message": "最大基本费用" }, "maxFee": { - "message": "最高收费" + "message": "最大费用" }, "maxPriorityFee": { - "message": "最高优先费用" + "message": "最大优先费用" }, "medium": { "message": "市场" }, "mediumGasSettingToolTipMessage": { - "message": "使用$1按当前市场价格快速处理。", + "message": "使用 $1 按当前市场价格快速处理。", "description": "$1 is key 'medium' (text: 'Market') separated here so that it can be passed in with bold font-weight" }, "memo": { - "message": "备忘" + "message": "备注" }, "memorizePhrase": { "message": "记住该账户助记词。" @@ -1528,87 +1950,106 @@ "message": "消息" }, "metaMaskConnectStatusParagraphOne": { - "message": "现在您可在 MetaMask 中对账户连接进行更多的控制。" + "message": "现在您可以更好地控制 MetaMask 中的账户连接。" }, "metaMaskConnectStatusParagraphThree": { - "message": "点击管理连接的账户。" + "message": "点击它以管理您的连接账户。" }, "metaMaskConnectStatusParagraphTwo": { "message": "连接状态按钮显示所访问的网站是否与您当前选择的账户连接。" }, "metamaskDescription": { - "message": "将您与 Ethereum 和去中心化网络连接起来。" + "message": "将您连接到以太坊和去中心化网络。" }, "metamaskSwapsOfflineDescription": { - "message": "MetaMask Swaps 正在进行维护。请稍后访问。" + "message": "MetaMask Swaps 正在进行维护。请稍后再查看。" }, "metamaskVersion": { "message": "MetaMask 版本" }, "metametricsCommitmentsAllowOptOut": { - "message": "始终允许您通过设置选择退出" + "message": "始终允许您通过“设置”选择退出" }, "metametricsCommitmentsAllowOptOut2": { "message": "始终可通过设置选择退出" }, "metametricsCommitmentsBoldNever": { - "message": "从不", + "message": "永不", "description": "This string is localized separately from some of the commitments so that we can bold it" }, "metametricsCommitmentsIntro": { - "message": "MetaMask……" + "message": "MetaMask.." }, "metametricsCommitmentsNeverCollect": { - "message": "永不收集密钥、地址、交易记录、余额、哈希或任何个人信息" + "message": "决不收集密钥、地址、交易、余额、哈希或任何个人信息" }, "metametricsCommitmentsNeverCollectIP": { - "message": "$1收集您的完整IP地址", + "message": "$1 收集您的完整 IP 地址", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, "metametricsCommitmentsNeverCollectKeysEtc": { - "message": "$1收集密钥、地址、交易记录、余额、哈希或任何个人信息", + "message": "$1 收集密钥、地址、交易记录、余额、哈希或任何个人信息", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, "metametricsCommitmentsNeverIP": { - "message": "永不收集您的完整IP地址" + "message": "永不收集您的完整 IP 地址" }, "metametricsCommitmentsNeverSell": { - "message": "永不为利益而出售您的数据,永远不会!" + "message": "决不出售数据牟利。绝对不会!" }, "metametricsCommitmentsNeverSellDataForProfit": { - "message": "$1为利益而出售您的数据,永远不会!", + "message": "$1 为利益而出售您的数据,永远不会!", "description": "The $1 is the bolded word 'Never', from 'metametricsCommitmentsBoldNever'" }, "metametricsCommitmentsSendAnonymizedEvents": { - "message": "发送匿名的点击和页面浏览事件信息" + "message": "发送匿名化点击和页面浏览事件" }, "metametricsHelpImproveMetaMask": { - "message": "帮助我们让 MetaMask 变得更好" + "message": "帮助我们改进 MetaMask" }, "metametricsOptInDescription": { - "message": "MetaMask 希望收集使用数据,以更好地了解我们的用户如何与扩展进行互动。这些数据将被用于持续改进我们产品和 Ethereum 生态系统的可用性和用户体验。" + "message": "MetaMask 希望收集使用数据,以更好地了解我们的用户如何与扩展程序交互。这些数据将被用于持续改进我们产品和以太坊生态系统的可用性和用户体验。" }, "metametricsOptInDescription2": { - "message": "我们想要收集基本使用数据以提高我们产品的可用性。这些数据将..." + "message": "我们想要收集基本使用数据以提高我们产品的可用性。这些数据将......" }, "metametricsTitle": { - "message": "加入 6M+ 用户来改进MetaMask" + "message": "和600多万用户一起改进 MetaMask" }, "mismatchedChainLinkText": { - "message": "验证网络详细信息", + "message": "验证网络信息", "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." }, + "mismatchedChainRecommendation": { + "message": "我们建议您在继续之前$1。", + "description": "$1 is a clickable link with text defined by the 'mismatchedChainLinkText' key. The link will open to instructions for users to validate custom network details." + }, + "mismatchedNetworkName": { + "message": "根据我们的记录,该网络名称可能与此链ID不匹配。" + }, + "mismatchedNetworkSymbol": { + "message": "所提交的货币符号与我们对此链ID的预期不匹配。" + }, + "mismatchedRpcUrl": { + "message": "根据我们的记录,所提交的RPC URL值与此链ID的已知提供者不匹配。" + }, "missingNFT": { - "message": "找不到您的NFT?" + "message": "找不到您的 NFT?" + }, + "missingSetting": { + "message": "找不到设置吗?" + }, + "missingSettingRequest": { + "message": "在这里请求" }, "missingToken": { - "message": "找不到您的代币?" + "message": "没有看到您的代币?" }, "mobileSyncWarning": { - "message": "“同步扩展”功能暂时被禁用。 如果您想要在MetaMask手机上使用您的扩展钱包,在您的手机应用上:返回钱包设置选项并选择“使用账户助记词导入”选项。 使用您的扩展钱包的助记词来导入您的钱包。" + "message": "“与扩展程序同步”功能暂时被禁用。如果您想要在 MetaMask 移动设备上使用您的扩展程序钱包,那么在您的移动应用程序上:返回钱包设置选项并选择“使用账户助记词导入”选项。使用您的扩展程序钱包的助记词来将您的钱包导入移动设备。" }, "mustSelectOne": { - "message": "至少选择 1 种代币。" + "message": "至少选择1种代币。" }, "myAccounts": { "message": "我的账户" @@ -1616,6 +2057,14 @@ "name": { "message": "名称" }, + "nativeToken": { + "message": "此网络上的原生代币为$1。它是用于燃料费的代币。", + "description": "$1 represents the name of the native token on the current network" + }, + "needCryptoInWallet": { + "message": "要使用MetaMask与去中心化应用程序互动,您的钱包中需要有$1。", + "description": "$1 represents the cypto symbol to be purchased" + }, "needHelp": { "message": "需要帮助?请联系 $1", "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" @@ -1624,24 +2073,36 @@ "message": "分享您的反馈" }, "needHelpLinkText": { - "message": "MetaMask支持" + "message": "MetaMask 支持" }, "needHelpSubmitTicket": { - "message": "提交问题" + "message": "提交工单" }, "needImportFile": { - "message": "必须选择一个文件来导入。", + "message": "您必须选择一个文件来导入。", "description": "User is important an account and needs to add a file to continue" }, "negativeETH": { "message": "不能发负值的 ETH。" }, + "network": { + "message": "网络: " + }, + "networkAddedSuccessfully": { + "message": "网络添加成功!" + }, "networkDetails": { - "message": "网络详细信息" + "message": "网络详情" + }, + "networkIsBusy": { + "message": "网络繁忙。燃料价格较高,估值较不准确。" }, "networkName": { "message": "网络名称" }, + "networkNameAvalanche": { + "message": "Avalanche" + }, "networkNameBSC": { "message": "BSC" }, @@ -1649,7 +2110,10 @@ "message": "与此网络关联的名称。" }, "networkNameEthereum": { - "message": "Ethereum" + "message": "以太坊" + }, + "networkNameGoerli": { + "message": "Goerli" }, "networkNamePolygon": { "message": "Polygon" @@ -1658,46 +2122,49 @@ "message": "Testnet" }, "networkSettingsChainIdDescription": { - "message": "链 ID 用于签署交易。它必须与网络返回的链 ID 相匹配。您可以输入十进制或'0x'前缀的十六进制数字,但我们将以十进制显示。" + "message": "链 ID 用于签署交易。它必须与网络返回的链 ID 相匹配。您可以输入十进制或以'0x'开头的十六进制数字,但我们将以十进制显示该数字。" }, "networkStatus": { "message": "网络状态" }, "networkStatusBaseFeeTooltip": { - "message": "基本费用由网络设定,每13-14秒更改一次。我们的$1 和 $2 选项用于突然增加。", + "message": "基本费用由网络设定,每13-14秒更改一次。我们的 $1 和 $2 选项用于剧增。", "description": "$1 and $2 are bold text for Medium and Aggressive respectively." }, "networkStatusPriorityFeeTooltip": { - "message": "优先收费范围(又称“矿工费”)直接向矿工支付,并鼓励他们确定您的交易的优先次序。" + "message": "优先费用(又称“矿工费”)。这笔费用直接向矿工支付,激励他们优先处理您的交易。" }, "networkStatusStabilityFeeTooltip": { - "message": "燃料费用相对过去72小时的$1。", + "message": "相对过去72小时,燃料费用为 $1。", "description": "$1 is networks stability value - stable, low, high" }, "networkURL": { - "message": "网络网址" + "message": "网络 URL" }, "networkURLDefinition": { - "message": "用于访问此网络的URL。" + "message": "用于访问此网络的 URL。" }, "networks": { "message": "网络" }, "nevermind": { - "message": "无所谓" + "message": "没关系" + }, + "new": { + "message": "新推出!" }, "newAccount": { "message": "新账户" }, "newAccountDetectedDialogMessage": { - "message": "检测到新地址!点击添加至地址簿。" + "message": "检测到新地址!点击这里以添加到您的地址簿。" }, "newAccountNumberName": { "message": "账户 $1", "description": "Default name of next account to be created on create account screen" }, "newCollectibleAddedMessage": { - "message": "收藏已成功添加!" + "message": "收藏品已成功添加!" }, "newContact": { "message": "新联系人" @@ -1705,23 +2172,27 @@ "newContract": { "message": "新合约" }, + "newNFTDetectedMessage": { + "message": "允许 MetaMask 自动检测 Opensea 的 NFT 并在您的钱包中显示。" + }, "newNFTsDetected": { "message": "新功能!NFT 检测" }, "newNetworkAdded": { - "message": "成功添加了“$1”!" + "message": "成功添加了 “$1”!" }, "newPassword": { "message": "新密码(至少 8 个字符)" }, "newToMetaMask": { - "message": "第一次使用 MetaMask?" + "message": "MetaMask 的新用户?" }, - "newTotal": { - "message": "新总额" + "newTokensImportedMessage": { + "message": "您已成功导入$1。", + "description": "$1 is the string of symbols of all the tokens imported" }, - "newTransactionFee": { - "message": "新交易费用" + "newTokensImportedTitle": { + "message": "已导入代币" }, "newValues": { "message": "新的值" @@ -1733,53 +2204,62 @@ "message": "Nonce 高于建议的 nouce 值 $1", "description": "The next nonce according to MetaMask's internal logic" }, + "nft": { + "message": "非同质化代币(NFT)" + }, "nftTokenIdPlaceholder": { - "message": "输入收藏ID" + "message": "输入代币ID" }, "nfts": { - "message": "NFT" + "message": "收藏品" }, "nickname": { "message": "昵称" }, "noAccountsFound": { - "message": "没找到查询的账户" + "message": "未找到符合给定查询条件的账户" }, "noAddressForName": { - "message": "这个名字还没有设置地址。" + "message": "此名称尚未设置地址。" }, "noAlreadyHaveSeed": { - "message": "不,我已经有一个账户助记词了。" + "message": "不,我已经有一个账户助记词" }, "noConversionDateAvailable": { "message": "没有可用的货币转换日期" }, "noConversionRateAvailable": { - "message": "无可用转换率" + "message": "无可用汇率" }, "noNFTs": { - "message": "尚无NFT" + "message": "尚无 NFT" + }, + "noSnaps": { + "message": "没有安装Snap" }, "noThanks": { "message": "不,谢谢" }, + "noThanksVariant2": { + "message": "不,谢谢." + }, "noTransactions": { - "message": "没有交易" + "message": "您没有任何交易" }, "noWebcamFound": { - "message": "未找到您的电脑摄像头。请重试。" + "message": "未找到您电脑的网络摄像头。请重试。" }, "noWebcamFoundTitle": { - "message": "未找到摄像头" + "message": "未找到网络摄像头" }, "nonce": { - "message": "Nonce" + "message": "nonce" }, "nonceField": { "message": "自定义交易 nonce" }, "nonceFieldDescription": { - "message": "开启此功能可以改变确认屏幕上的 nonce(交易号)。此为高级功能,请谨慎使用。" + "message": "打开这个功能可以改变确认屏幕上的 nonce(交易号码)。这是一个高级功能,请谨慎使用。" }, "nonceFieldHeading": { "message": "自定义 Nonce" @@ -1788,25 +2268,86 @@ "message": "非忙碌中" }, "notCurrentAccount": { - "message": "这是正确的账户吗?这与您钱包中当前选择的账户不同。" + "message": "这是正确的账户吗?这与您钱包中当前选择的账户不同" }, "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." + }, + "notifications10DescriptionOne": { + "message": "Ethereum Mainnet、Polygon、BSC 和 Avalanche 网络目前提供经改进的代币检测。 即将推出更多!" + }, + "notifications10DescriptionThree": { + "message": "代币检测功能默认开启。但是您可从设置中禁用它。" + }, + "notifications10DescriptionTwo": { + "message": "我们从第三方代币列表中获取代币。将自动检测在两个以上代币列表中列出的代币。" + }, + "notifications10Title": { + "message": "经改进的代币检测现已推出" + }, + "notifications11Description": { + "message": "代币可由任何人创建,而且名称可以重复。如您看到一个您不信任或未与之交互的代币出现——那么,不信任它会更安全。" + }, + "notifications11Title": { + "message": "欺诈和安全风险" + }, + "notifications12ActionText": { + "message": "启用黑暗模式" + }, + "notifications12Description": { + "message": "扩展程序的深色模式终于来了!若要开启,请前往“设置 -> 实验项”,然后选择一个显示选项:浅色、深色、系统。" + }, + "notifications12Title": { + "message": "何时启用黑暗模式?现在启用黑暗模式! 🕶️🦊" + }, + "notifications13ActionText": { + "message": "显示自定义网络列表" + }, + "notifications13Description": { + "message": "您现在可以轻松添加以下热门自定义网络:Arbitrum、Avalanche、Binance Smart Chain、Fantom、Harmony、Optimism、Palm和Polygon!如需启用此功能,请转到“设置 -> 实验项”,然后打开“显示自定义网络列表”!", + "description": "Description of a notification in the 'See What's New' popup. Describes popular network feature." + }, + "notifications13Title": { + "message": "添加热门网络" + }, + "notifications14ActionText": { + "message": "显示备份设置" + }, + "notifications14Description": { + "message": "我们将在10月初弃用3Box数据功能。要手动备份和恢复您的钱包,请使用高级设置中的“立即备份”按钮。", + "description": "Description of a notification in the 'See What's New' popup. Describes 3box deprecation." + }, + "notifications14Title": { + "message": "弃用3Box" + }, + "notifications15Description": { + "message": "您无需采取任何行动,请如常地使用您的钱包。请提防可能藉由合并进行的诈骗。", + "description": "Description of a notification in the 'See What's New' popup. Advises users about the ethereum merge (https://ethereum.org/en/upgrades/merge/#main-content) and potential scams." + }, + "notifications15Title": { + "message": "以太坊合并来了!" + }, "notifications1Description": { - "message": "MetaMask移动用户现在可以在他们的移动钱包中交换令牌。扫描二维码以获取移动应用并开始交换。", + "message": "MetaMask Mobile 用户现在可以在他们的移动钱包中交换代币。扫描二维码以获取移动应用程序并开始交换。", "description": "Description of a notification in the 'See What's New' popup. Describes the swapping on mobile feature." }, "notifications1Title": { - "message": "在移动设备上交换!", + "message": "可以在移动设备上交换了!", "description": "Title for a notification in the 'See What's New' popup. Tells users that they can now use MetaMask Swaps on Mobile." }, "notifications3ActionText": { - "message": "阅读更多", + "message": "了解更多", "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": "随时更新MetaMask安全最佳做法,并从官方MetaMask支持中获得最新的安全提示。", + "message": "及时了解 MetaMask 安全最佳实践,并从 MetaMask 官方支持部门获取最新的安全提示。", "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": { @@ -1818,69 +2359,89 @@ "description": "The 'call to action' on the button, or link, of the 'Swap on Binance Smart Chain!' notification. Upon clicking, users will be taken to a page where then can swap tokens on Binance Smart Chain." }, "notifications4Description": { - "message": "在您的钱包内立即获取代币交换的最佳价格。 MetaMask现在将您连接到Binance Smart Chain上的多个分散化交易聚合器和专业市场制造商。", + "message": "在您的钱包内获取最优惠的代币交换价格。MetaMask 现在将您连接到币安智能链上的多个去中心化交易所聚合器和专业做市商。", "description": "Description of a notification in the 'See What's New' popup." }, "notifications4Title": { - "message": "交换Binance Smart Chain", + "message": "在币安智能链上交换", "description": "Title for a notification in the 'See What's New' popup. Encourages users to do swaps on Binance Smart Chain." }, "notifications5Description": { - "message": "您的“Seed Phrase”现在叫做“保密恢复短语”。", + "message": "您的“Seed Phrase”现在被称为“账户助记词”(Secret Recovery Phrase)。", "description": "Description of a notification in the 'See What's New' popup. Describes the seed phrase wording update." }, "notifications6DescriptionOne": { - "message": "到Chrome版本91,启用我们Ledger支持 (U2F) 的API不再支持硬件钱包。 MetaMask实现了新的Ledger Live支持,允许您继续通过Ledger Live 桌面应用程序连接到您的Ledger设备。", + "message": "从 Chrome 版本91开始,启用我们的 Ledger 支持 (U2F) 的 API 不再支持硬件钱包。MetaMask 实施了新的 Ledger Live 支持,允许您继续通过 Ledger Live 桌面应用程序连接到您的 Ledger 设备。", "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": { - "message": "您可以通过单击设置 > 高级> 使用Ledger Live来启用Ledger Live支持。", + "message": "您可以通过点击“设置 > 高级> 使用 Ledger Live”来启用 Ledger Live 支持。", "description": "Description of a notification in the 'See What's New' popup. Describes the Ledger support update." }, "notifications6Title": { - "message": "Chrome用户的Ledger支持更新", + "message": "Chrome 用户的 Ledger 支持更新", "description": "Title for a notification in the 'See What's New' popup. Lets users know about the Ledger support update" }, "notifications7DescriptionOne": { - "message": "MetaMaskv10.1.0包括使用Ledger设备时对EIP-1559交易的新支持。", + "message": "MetaMask v10.1.0 包括使用 Ledger 设备时对 EIP-1559 交易的新支持。", "description": "Description of a notification in the 'See What's New' popup. Describes changes for ledger and EIP1559 in v10.1.0" }, "notifications7DescriptionTwo": { - "message": "要完成Ethereum Mainnet上的交易,请确保您的Ledger设备有最新的固件。", + "message": "要在以太坊主网上完成交易,请确保您的 Ledger 设备拥有最新的固件。", "description": "Description of a notification in the 'See What's New' popup. Describes the need to update ledger firmware." }, "notifications7Title": { - "message": "Ledger固件更新", + "message": "Ledger 固件更新", "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users of the need to update firmware." }, "notifications8ActionText": { - "message": "转到高级设置", + "message": "转到“设置 > 高级”", "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": "从MetaMaskv10.4.0开始,您不再需要Ledger Live连接您的Ledger设备到Metamask。", + "message": "从 MetaMask v10.4.0 开始,您不再需要 Ledger Live 即可将您的 Ledger 设备连接到 Metamask。", "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": { - "message": "为了更容易和更稳定的ledger体验,转到高级设置选项卡,然后切换“首选Ledger连接类型”到“WebHID”。", + "message": "为了更轻松和更稳定的 ledger 体验,请转到设置中的“高级”选项卡,将“首选 Ledger 连接类型”切换为“WebHID”。", "description": "Description of a notification in the 'See What's New' popup. Describes how the user can turn off the Ledger Live setting." }, "notifications8Title": { - "message": "Ledger连接改进", + "message": "Ledger 连接改进", "description": "Title for a notification in the 'See What's New' popup. Notifies ledger users that there is an improvement in how they can connect their device." }, "notifications9DescriptionOne": { - "message": "我们现在让您在确认智能合同交易时对“数据”选项卡有更多的了解。" + "message": "当确认智能合约交易时,我们现在为您提供更多关于“数据”选项卡的见解。" }, "notifications9DescriptionTwo": { - "message": "您现在可以在确认之前更好地了解您的交易详情, 并且更容易添加交易地址到您的地址簿,帮助您做出安全和知情的决定。" + "message": "您现在可以在确认之前更好地了解您的交易详情,并且可以更轻松地添加交易地址到您的地址簿,帮助您做出安全和知情的决定。" }, "notifications9Title": { - "message": "👓 我们正在使交易更易明。" + "message": "👓 我们正在使交易更容易阅读。" + }, + "notificationsEmptyText": { + "message": "此处无内容。" + }, + "notificationsHeader": { + "message": "通知" + }, + "notificationsInfos": { + "message": "$1,来自$2", + "description": "$1 is the date at which the notification has been dispatched and $2 is the link to the snap that dispatched the notification." + }, + "notificationsMarkAllAsRead": { + "message": "将所有标记为已读" + }, + "numberOfNewTokensDetectedPlural": { + "message": "在此账户中找到$1枚新代币", + "description": "$1 is the number of new tokens detected" + }, + "numberOfNewTokensDetectedSingular": { + "message": "在此账户中找到1枚新代币" }, "ofTextNofM": { "message": "/" @@ -1889,46 +2450,46 @@ "message": "关" }, "offlineForMaintenance": { - "message": "脱机维护" + "message": "离线维护" }, "ok": { "message": "确定" }, "on": { - "message": "启用" + "message": "开" }, "onboardingCreateWallet": { - "message": "创建新的钱包" + "message": "创建新钱包" }, "onboardingImportWallet": { "message": "导入现有钱包" }, "onboardingPinExtensionBillboardAccess": { - "message": "完全访问" + "message": "完全访问权限" }, "onboardingPinExtensionBillboardDescription": { - "message": "这些扩展可以" + "message": "这些扩展程序可以查看和更改信息" }, "onboardingPinExtensionBillboardDescription2": { - "message": "在此站点看到和更改信息。" + "message": "在此网站上。" }, "onboardingPinExtensionBillboardTitle": { - "message": "扩展" + "message": "扩展程序" }, "onboardingPinExtensionChrome": { - "message": "点击浏览器扩展图标" + "message": "点击浏览器扩展程序图标" }, "onboardingPinExtensionDescription": { - "message": "在您的浏览器上固定MetaMask,所以可以轻松查看交易确认。" + "message": "在您的浏览器上固定 MetaMask,以便访问并轻松查看交易确认。" }, "onboardingPinExtensionDescription2": { - "message": "您可以点击扩展并通过单击打开MetaMask以打开您的钱包。" + "message": "您可以通过点击扩展程序打开 MetaMask,并一键访问您的钱包。" }, "onboardingPinExtensionDescription3": { - "message": "点击浏览器扩展图标即时访问" + "message": "点击浏览器扩展程序图标即可即时访问它" }, "onboardingPinExtensionLabel": { - "message": "固定MetaMask" + "message": "固定 MetaMask" }, "onboardingPinExtensionStep1": { "message": "1" @@ -1937,35 +2498,38 @@ "message": "2" }, "onboardingPinExtensionTitle": { - "message": "您的 MetaMask安装完成!" + "message": "您的 MetaMask 安装完成!" }, "onboardingReturnNotice": { - "message": "“$1”会关闭此标签,直接回到 $2", + "message": "“$1”将关闭此选项卡,并直接返回到 $2", "description": "Return the user to the site that initiated onboarding" }, "onboardingShowIncomingTransactionsDescription": { - "message": "显示您钱包中依赖于与$1通信的交易。Etherscan 将能访问您的Etherum地址和您的 IP 地址。查看 $2。", + "message": "在您的钱包中显示传入的交易依赖于与 $1 的通信。Etherscan 将有权访问您的以太坊地址和 IP 地址。查看 $2。", "description": "$1 is a clickable link with text defined by the 'etherscan' key. $2 is a clickable link with text defined by the 'privacyMsg' key." }, "onboardingUsePhishingDetectionDescription": { - "message": "钓鱼侦测警报依赖于与 $1的通信。jsDeliver 将能访问您的 IP 地址。查看 $2。", + "message": "网络钓鱼检测警报依赖于与 $1 的通信。jsDeliver 将有权访问您的 IP 地址。查看 $2。", "description": "The $1 is the word 'jsDeliver', from key 'jsDeliver' and $2 is the words Privacy Policy from key 'privacyMsg', both separated here so that it can be wrapped as a link" }, "onlyAddTrustedNetworks": { - "message": "恶意网络提供商可能会显示区块链的状态并记录您的网络活动。只添加您信任的自定义网络。" + "message": "恶意网络提供商可能会谎报区块链的状态并记录您的网络活动。只添加您信任的自定义网络。" }, "onlyConnectTrust": { "message": "只连接您信任的网站。" }, "openFullScreenForLedgerWebHid": { - "message": "全屏打开MetaMask以通过WebHID连接您的ledger。", + "message": "全屏打开 MetaMask 以通过 WebHID 连接您的 ledger。", "description": "Shown to the user on the confirm screen when they are viewing MetaMask in a popup window but need to connect their ledger via webhid." }, + "openInBlockExplorer": { + "message": "在区块浏览器上打开" + }, "optional": { "message": "可选" }, "optionalWithParanthesis": { - "message": "(可选)" + "message": "(可选)" }, "or": { "message": "或" @@ -1973,14 +2537,20 @@ "origin": { "message": "来源" }, + "osTheme": { + "message": "系统" + }, + "padlock": { + "message": "挂锁" + }, "parameters": { "message": "参数" }, "participateInMetaMetrics": { - "message": "加入 MetaMetrics" + "message": "参加 MetaMetrics" }, "participateInMetaMetricsDescription": { - "message": "加入 MetaMetrics ,帮助我们改善 MetaMask 服务" + "message": "加入 MetaMetrics ,帮助我们改进 MetaMask" }, "password": { "message": "密码" @@ -1989,10 +2559,17 @@ "message": "密码长度不足" }, "passwordSetupDetails": { - "message": "此密码只会在此设备上解锁您的 MetaMask钱包。MetaMask无法恢复此密码。" + "message": "此密码只会在此设备上解锁您的 MetaMask 钱包。MetaMask 无法恢复此密码。" + }, + "passwordStrength": { + "message": "密码强度:$1", + "description": "Return password strength to the user when user wants to create password." + }, + "passwordStrengthDescription": { + "message": "强密码可以提高钱包的安全性,以防设备被盗或被入侵。" }, "passwordTermsWarning": { - "message": "我了解MetaMask无法为我恢复此密码。$1" + "message": "我明白 MetaMask 无法为我恢复此密码。$1" }, "passwordsDontMatch": { "message": "密码不匹配" @@ -2005,36 +2582,101 @@ "message": "待处理" }, "pendingTransactionInfo": { - "message": "这笔交易在完成之前不会被处理。" + "message": "在那笔交易完成之前,这笔交易不会被处理。" }, "pendingTransactionMultiple": { - "message": "您有 ($1) 待处理的交易" + "message": "您有 ($1) 笔待处理的交易" }, "pendingTransactionSingle": { - "message": "您有 (1) 个待处理的交易。", + "message": "您有 (1) 笔待处理的交易。", "description": "$1 is count of pending transactions" }, "permissionRequest": { "message": "权限请求" }, + "permissionRequestCapitalized": { + "message": "权限请求" + }, + "permissionRequested": { + "message": "立即请求" + }, + "permissionRevoked": { + "message": "在此更新中已撤销" + }, + "permission_accessNetwork": { + "message": "访问互联网。", + "description": "The description of the `endowment:network-access` permission." + }, + "permission_accessSnap": { + "message": "连接$1的Snap。", + "description": "The description for the `wallet_snap_*` permission. $1 is the name of the Snap." + }, + "permission_customConfirmation": { + "message": "在MetaMask中显示确认。", + "description": "The description for the `snap_confirm` permission" + }, "permission_ethereumAccounts": { "message": "查看您允许的账户的地址(必填)", "description": "The description for the `eth_accounts` permission" }, + "permission_longRunning": { + "message": "无限期运行。", + "description": "The description for the `endowment:long-running` permission" + }, + "permission_manageBip32Keys": { + "message": "在$1($2)下控制您的账户和资产。", + "description": "The description for the `snap_getBip32Entropy` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, + "permission_manageBip44Keys": { + "message": "控制您的“$1”账户和资产。", + "description": "The description for the `snap_getBip44Entropy` permission. $1 is the name of a protocol, e.g. 'Filecoin'." + }, + "permission_manageState": { + "message": "在您的设备上存储和管理其数据。", + "description": "The description for the `snap_manageState` permission" + }, + "permission_notifications": { + "message": "显示通知。", + "description": "The description for the `snap_notify` permission" + }, + "permission_transactionInsight": { + "message": "获取并显示交易洞察。", + "description": "The description for the `endowment:transaction-insight` permission" + }, + "permission_unknown": { + "message": "未知权限:$1", + "description": "$1 is the name of a requested permission that is not recognized." + }, + "permission_viewBip32PublicKeys": { + "message": "查看您的$1 ($2)公钥。", + "description": "The description for the `snap_getBip32PublicKey` permission. $1 is a derivation path, e.g. 'm/44'/0'/0''. $2 is the elliptic curve name, e.g. 'secp256k1'." + }, "permissions": { "message": "权限" }, "personalAddressDetected": { "message": "检测到个人地址。请输入代币合约地址。" }, + "pleaseConfirm": { + "message": "请确认" + }, "plusXMore": { - "message": "+ $1", + "message": "另外 $1 项", "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" }, + "popularCustomNetworks": { + "message": "流行自定义网络" + }, + "portfolioSite": { + "message": "投资组合网站" + }, "preferredLedgerConnectionType": { - "message": "首选Ledger连接类型", + "message": "首选 Ledger 连接类型", "description": "A header for a dropdown in Settings > Advanced. Appears above the ledgerConnectionPreferenceDescription message" }, + "preparingSwap": { + "message": "正在准备交换......" + }, "prev": { "message": "上一个" }, @@ -2042,7 +2684,7 @@ "message": "主要货币" }, "primaryCurrencySettingDescription": { - "message": "请选择“本地”,优先显示当地货币链价值(如 ETH )。选择“货币”则优先以所选货币作为价值显示单位。" + "message": "选择原生以优先显示链的原生货币(例如 ETH)的值。选择法定货币以优先显示以您所选法定货币显示的值。" }, "priorityFee": { "message": "优先费用" @@ -2058,13 +2700,13 @@ "description": "select this type of file to use to import an account" }, "privateKeyWarning": { - "message": "注意:永远不要公开这个私钥。任何拥有您的私钥的人都可以窃取您帐户中的任何资产。" + "message": "警告:切勿泄露此密钥。任何拥有您私钥的人都可以窃取您账户中持有的任何资产。" }, "privateNetwork": { "message": "私有网络" }, "proceedWithTransaction": { - "message": "我仍然想继续操作" + "message": "我仍然想继续" }, "proposedApprovalLimit": { "message": "拟议的审批上限" @@ -2073,7 +2715,7 @@ "message": "提供" }, "publicAddress": { - "message": "公开地址" + "message": "公共地址" }, "queue": { "message": "队列" @@ -2081,17 +2723,23 @@ "queued": { "message": "队列中" }, + "reAddAccounts": { + "message": "重新添加任何其他账户" + }, + "reAdded": { + "message": "重新添加" + }, "readdToken": { - "message": "之后您还可以通过帐户选项菜单中的“添加代币”来添加此代币。" + "message": "将来您还可以通过账户选项菜单中的“导入代币”来添加此代币。" }, "receive": { "message": "接收" }, "recents": { - "message": "最近记录" + "message": "最近" }, "recipientAddressPlaceholder": { - "message": "查找、公用地址 (0x) 或 ENS" + "message": "搜索、公共地址 (0x) 或 ENS" }, "recommendedGasLabel": { "message": "建议" @@ -2103,19 +2751,19 @@ "message": "明白了" }, "recoveryPhraseReminderHasBackedUp": { - "message": "总是在一个安全和保密的地方保存您的账户助记词" + "message": "始终将您的账户助记词保存在安全和秘密的地方" }, "recoveryPhraseReminderHasNotBackedUp": { "message": "需要再次备份您的账户助记词?" }, "recoveryPhraseReminderItemOne": { - "message": "永远不要与任何人分享您的账户助记词" + "message": "切勿与任何人分享您的账户助记词" }, "recoveryPhraseReminderItemTwo": { - "message": "MetaMask团队将永远不会询问您的账户助记词" + "message": "MetaMask 团队绝对不会索要您的账户助记词" }, "recoveryPhraseReminderSubText": { - "message": "您的账户助记词控制了您所有的帐户。" + "message": "您的账户助记词控制您的所有账户。" }, "recoveryPhraseReminderTitle": { "message": "保护您的资金" @@ -2136,13 +2784,13 @@ "message": "拒绝 $1 笔交易" }, "rejected": { - "message": "拒绝" + "message": "已拒绝" }, "remember": { "message": "记住:" }, "remindMeLater": { - "message": "稍后提醒" + "message": "稍后提醒我" }, "remove": { "message": "删除" @@ -2151,59 +2799,106 @@ "message": "删除账户" }, "removeAccountDescription": { - "message": "该账户已从您的钱包中删除。请在继续后续操作前,确认您是否已拥有该导入账户的原始账户助记词或账户密钥。您可以通过账户下拉菜单再次导入或创建账户。" + "message": "该账户将从您的钱包中删除。在继续操作前,确认您已拥有该导入账户的原始账户助记词或私钥。您可以通过账户下拉菜单再次导入或创建账户。" }, "removeNFT": { "message": "删除 NFT" }, + "removeSnap": { + "message": "移除Snap" + }, + "removeSnapConfirmation": { + "message": "您确定要移除$1吗?", + "description": "$1 represents the name of the snap" + }, + "removeSnapDescription": { + "message": "此操作将会删除snap及其数据,并撤销您获授予的权限。" + }, + "replace": { + "message": "替换" + }, "requestsAwaitingAcknowledgement": { "message": "待确认的请求" }, "required": { - "message": "必填" + "message": "必需" }, "reset": { "message": "重置" }, "resetAccount": { - "message": "重设账户" + "message": "重置账户" }, "resetAccountDescription": { "message": "重置账户将清除您的交易历史记录。这不会改变您账户中的余额,也不会要求您重新输入账户助记词。" }, + "resetWallet": { + "message": "重置钱包" + }, + "resetWalletSubHeader": { + "message": "MetaMask不会保留密码的副本。如果您在解锁账户时遇到问题,需要重置您的钱包。您可以提供设置钱包时使用的助记词,以进行重置。" + }, + "resetWalletUsingSRP": { + "message": "此操作将从此设备中删除您当前的钱包和助记词,以及您编制的账户列表。使用助记词进行重置后,您将会看到一个账户列表(基于用于重置的助记词)。这个新列表将自动包括有余额的账户。您还可以使用之前创建的$1。您导入的自定义账户需要是$2,添加到账户中的任何自定义代币也需要是$3。" + }, + "resetWalletWarning": { + "message": "在继续之前,请确保您所使用的助记词正确无误。您将无法撤消此操作。" + }, + "restartMetamask": { + "message": "重新启动MetaMask" + }, "restore": { "message": "恢复" }, - "restoreWalletPreferences": { - "message": "已找到于 $1 的数据备份。您想恢复您的钱包设置吗?", - "description": "$1 is the date at which the data was backed up" + "restoreFailed": { + "message": "无法使用所提供的文件恢复数据" + }, + "restoreSuccessful": { + "message": "您的数据已成功恢复" + }, + "restoreUserData": { + "message": "恢复用户数据" + }, + "restoreUserDataDescription": { + "message": "您可以使用以前备份的JSON文件来恢复包含首选项和账户地址的用户设置。" }, "retryTransaction": { "message": "重试交易" }, "reusedTokenNameWarning": { - "message": "此处的一个代币使用了与您关注的另一个代币的相同符号,这可能会让人感到困惑或欺骗。" + "message": "此处的代币使用了与您关注的另一种代币相同的符号,这可能会让人感到困惑或具有欺骗性。" }, "revealSeedWords": { - "message": "显示账户助记词" + "message": "显示助记词" }, "revealSeedWordsDescription": { - "message": "如果您更换浏览器或计算机,则需要使用此账户助记词访问您的帐户。请将它们保存在安全秘密的地方。" + "message": "如果更改浏览器或移动计算机,您将需要此助记词才能访问账户。将它们保存在安全、秘密的地方。" }, "revealSeedWordsWarning": { - "message": "该账户助记词可以用来窃取您的所有帐户" + "message": "这些账户助记词可以用来窃取您的所有账户。" }, "revealSeedWordsWarningTitle": { - "message": "不要对任何人展示此账户助记词!" + "message": "切勿与任何人分享此账户助记词!" }, - "rinkeby": { - "message": "Rinkeby 测试网络" + "revealTheSeedPhrase": { + "message": "显示助记词" }, - "ropsten": { - "message": "Ropsten 测试网络" + "revokeAllTokensTitle": { + "message": "撤销访问您的所有$1的权限?", + "description": "$1 is the symbol of the token for which the user is revoking approval" + }, + "revokeApproveForAllDescription": { + "message": "通过撤销权限,以下$1将无法再访问您的$2", + "description": "$1 is either key 'account' or 'contract', and $2 is either a string or link of a given token symbol or name" + }, + "revokeSpendingCapTooltipText": { + "message": "本合约将无法再使用您当前或未来的任何代币。" }, "rpcUrl": { - "message": "新增 RPC URL" + "message": "新的 RPC URL" + }, + "safeTransferFrom": { + "message": "安全转账来自" }, "save": { "message": "保存" @@ -2212,7 +2907,7 @@ "message": "保存为 CSV 文件" }, "scanInstructions": { - "message": "将二维码放在相机前" + "message": "将二维码放在摄像头前" }, "scanQrCode": { "message": "扫描二维码" @@ -2229,6 +2924,9 @@ "searchResults": { "message": "搜索结果" }, + "searchSettings": { + "message": "在设置中搜索" + }, "searchTokens": { "message": "搜索代币" }, @@ -2236,31 +2934,31 @@ "message": "您的账户助记词可以帮助您轻松备份和恢复个人账户。" }, "secretBackupPhraseWarning": { - "message": "警告:切勿向他人透露您的账户助记词。任何人一旦持有该账户助记词,即可控制您的 Ether。" + "message": "警告:切勿向他人透露您的账户助记词。任何拥有该账户助记词的人都可以永远拿走您的以太币。" }, "secretPhrase": { - "message": "只有这个钱包上的第一个帐户将自动加载。 完成此流程后,点击下拉菜单,然后选择创建账户。" + "message": "只有这个钱包上的第一个账户将自动加载。完成此流程后,若要添加额外的账户,点击下拉菜单,然后选择“创建账户”。" }, "secretRecoveryPhrase": { - "message": "账户助记词" + "message": "助记词" }, "secureWallet": { - "message": "保密钱包" + "message": "安全钱包" }, "securityAndPrivacy": { - "message": "安全与隐私" + "message": "安全和隐私" }, "seedPhraseConfirm": { - "message": "请确认账户助记词" + "message": "确认助记词" }, "seedPhraseEnterMissingWords": { - "message": "请确认账户助记词" + "message": "确认助记词" }, "seedPhraseIntroNotRecommendedButtonCopy": { - "message": "稍后提醒我(不推荐)" + "message": "稍后提醒我(不推荐)" }, "seedPhraseIntroRecommendedButtonCopy": { - "message": "保护我的钱包 (推荐)" + "message": "保护我的钱包(推荐)" }, "seedPhraseIntroSidebarBulletFour": { "message": "写下并存储在多个秘密位置。" @@ -2275,13 +2973,13 @@ "message": "储存在银行保险库。" }, "seedPhraseIntroSidebarCopyOne": { - "message": "您的秘密恢复短语是一个12个词,它是您钱包和资金的“主密钥”" + "message": "您的账户助记词是由12个单词组成的短语,它是您的钱包和资金的“主密钥”" }, "seedPhraseIntroSidebarCopyThree": { "message": "如果有人要求您的恢复短语,他们可能会试图欺骗您并偷窃您的钱包资金" }, "seedPhraseIntroSidebarCopyTwo": { - "message": "永远不要分享您的账户助记词,甚至不和MetaMask分享!" + "message": "切勿分享您的账户助记词,包括也不能与 MetaMask 分享!" }, "seedPhraseIntroSidebarTitleOne": { "message": "什么是账户助记词?" @@ -2293,25 +2991,22 @@ "message": "如何保存我的账户助记词?" }, "seedPhraseIntroTitle": { - "message": "保护您的钱包" + "message": "保护您的钱包安全" }, "seedPhraseIntroTitleCopy": { "message": "在开始之前,观看这个简短的视频来了解您的账户助记词以及如何保护您的钱包安全。" }, "seedPhraseReq": { - "message": "账户助记词由 12、15、18、21 或 24 个单词组成" + "message": "助记词包含 12、15、18、21 或 24 个字词" }, "seedPhraseWriteDownDetails": { - "message": "请写下这个12个字的账户助记词,然后将其保存到您信任并且只有您可以访问的地方。" + "message": "请写下这个由12个单词组成的账户助记词,然后将其保存到您信任并且只有您可以访问的地方。" }, "seedPhraseWriteDownHeader": { - "message": "请写下您的账户助记词" - }, - "selectAHigherGasFee": { - "message": "选择更高的燃料费用,提高交易处理速度。*" + "message": "写下您的助记词" }, "selectAccounts": { - "message": "选择账户" + "message": "选择要在此网站上使用的账户" }, "selectAll": { "message": "全部选择" @@ -2320,7 +3015,7 @@ "message": "选择一个账户" }, "selectAnAccountAlreadyConnected": { - "message": "此帐户已连接到MetaMask" + "message": "此账户已连接到 MetaMask" }, "selectEachPhrase": { "message": "请选择每个单词,以确保其正确性。" @@ -2329,10 +3024,10 @@ "message": "选择 HD 路径" }, "selectNFTPrivacyPreference": { - "message": "在设置中打开NFT检测" + "message": "在设置中打开 NFT 检测" }, "selectPathHelp": { - "message": "如果下列账户中没有您当前所持有的 Ledger 账户,请将路径切换至“Legacy (MEW / MyCrypto)”" + "message": "如果您没有看到您期望的账户,请尝试切换 HD 路径。" }, "selectType": { "message": "选择类型" @@ -2343,32 +3038,56 @@ "send": { "message": "发送" }, - "sendAmount": { - "message": "发送数额" + "sendBugReport": { + "message": "向我们发送错误报告。" }, "sendSpecifiedTokens": { "message": "发送 $1", "description": "Symbol of the specified token" }, "sendTo": { - "message": "发送至" + "message": "发送到" }, "sendTokens": { "message": "发送代币" }, + "sendingDisabled": { + "message": "尚不支持发送ERC-1155 NFT资产。" + }, "sendingNativeAsset": { - "message": "正在发送$1", + "message": "正在发送 $1", "description": "$1 represents the native currency symbol for the current network (e.g. ETH or BNB)" }, + "sendingToTokenContractWarning": { + "message": "警告:您将要发送到代币合约,这可能会导致资金损失。$1", + "description": "$1 is a clickable link with text defined by the 'learnMoreUpperCase' key. The link will open to a support article regarding the known contract address warning" + }, + "sepolia": { + "message": "Sepolia测试网络" + }, "setAdvancedPrivacySettings": { "message": "设置高级隐私设置" }, "setAdvancedPrivacySettingsDetails": { - "message": "MetaMask使用这些可信的第三方服务来提高产品可用性和安全性。" + "message": "MetaMask 使用这些可信的第三方服务来提高产品可用性和安全性。" + }, + "setApprovalForAll": { + "message": "设置批准所有" + }, + "setApprovalForAllTitle": { + "message": "批准$1,且无消费限制", + "description": "The token symbol that is being approved" }, "settings": { "message": "设置" }, + "settingsSearchMatchingNotFound": { + "message": "没有找到匹配的结果." + }, + "shorthandVersion": { + "message": "v$1", + "description": "$1 is replaced by a version string (e.g. 1.2.3)" + }, "show": { "message": "显示" }, @@ -2376,28 +3095,28 @@ "message": "高级燃料控制" }, "showAdvancedGasInlineDescription": { - "message": "在发送和确认界面显示燃料价格和燃料限制设置选项。" + "message": "选择此项可直接在发送和确认界面显示燃料价格和上限控制。" }, "showFiatConversionInTestnets": { - "message": "在 Testnets 上显示兑换率" + "message": "在测试网络上显示转换" }, "showFiatConversionInTestnetsDescription": { - "message": "请选择该选项,在 Testnets 上显示法定兑换率" + "message": "选择此项以在测试网络上显示法定货币转换" }, "showHexData": { "message": "显示十六进制数据" }, "showHexDataDescription": { - "message": "请选择该选项,在发送页面显示十六进制数据字域" + "message": "选择此项以在发送屏幕上显示十六进制数据字段" }, "showHide": { "message": "显示/隐藏" }, "showIncomingTransactions": { - "message": "显示收到的交易" + "message": "显示传入的交易" }, "showIncomingTransactionsDescription": { - "message": "选择该选项可使用 Etherscan(以太坊浏览器)(以太坊浏览器)在交易列表中显示收到的交易。" + "message": "选择此项以使用 Etherscan 在交易列表中显示传入的交易" }, "showPermissions": { "message": "显示权限" @@ -2415,40 +3134,103 @@ "message": "选择此项以在网络列表中显示测试网络" }, "sigRequest": { - "message": "请求签名" + "message": "签名请求" }, "sign": { "message": "签名" }, "signNotice": { - "message": "签署此消息可能会产生危险的副作用。 \n只从您完全信任的网站上签名。 未来的版本将移除这种危险的方法。" + "message": "谨慎行事。此操作有可能用来从您的账户提取资产。确保您信任此站点。" }, "signatureRequest": { - "message": "请求签名" + "message": "签名请求" }, "signatureRequest1": { - "message": "信息" + "message": "消息" }, "signed": { "message": "已签名" }, + "signin": { + "message": "登录" + }, "simulationErrorMessageV2": { - "message": "我们无法估计燃料。合同中可能有一个错误,这笔交易可能失败。" + "message": "我们无法估算燃料。合约中可能存在错误,这笔交易可能会失败。" }, "skip": { "message": "跳过" }, "skipAccountSecurity": { - "message": "跳过帐户安全?" + "message": "跳过账户安全?" }, "skipAccountSecurityDetails": { - "message": "我了解,在我备份我的账户助记词之前,我可能会失去我的帐户和他们的所有资产。" + "message": "我明白,在我备份我的账户助记词之前,我可能会丢失我的账户及其所有资产。" + }, + "smartTransaction": { + "message": "智能交易" + }, + "snapAccess": { + "message": "$1的snap可以访问:", + "description": "$1 represents the name of the snap" + }, + "snapAdded": { + "message": "从 $2 添加到 $1", + "description": "$1 represents the date the snap was installed, $2 represents which origin installed the snap." + }, + "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." + }, + "snapError": { + "message": "Snap错误:'$1'。错误代码:'$2'", + "description": "This is shown when a snap encounters an error. $1 is the error message from the snap, and $2 is the error code." + }, + "snapInstall": { + "message": "安装Snap" + }, + "snapInstallWarningCheck": { + "message": "请勾选选项框以确认您理解。" + }, + "snapInstallWarningCheckPlural": { + "message": "请勾选所有方框以确认您理解。" + }, + "snapInstallWarningKeyAccess": { + "message": "您正在向snap \"$1\"授予$2的密钥访问权限。此操作不可撤销,并会向\"$1\"授予对您的$2账户和资产的控制权。在继续之前,请确保您信任\"$1\"。", + "description": "The first parameter is the name of the snap and the second one is the protocol" + }, + "snapRequestsPermission": { + "message": "此Snap正在请求以下权限:" }, - "slow": { - "message": "慢" + "snapUpdate": { + "message": "更新Snap" + }, + "snapUpdateExplanation": { + "message": "$1需要更新版本的snap。", + "description": "$1 is the dapp that is requesting an update to the snap." + }, + "snaps": { + "message": "Snap" + }, + "snapsInsightLoading": { + "message": "正在加载交易洞察……" + }, + "snapsNoInsight": { + "message": "Snap没有返回任何洞察" + }, + "snapsSettingsDescription": { + "message": "管理您的Snap" + }, + "snapsStatus": { + "message": "Snap状态取决于活动。" + }, + "snapsToggle": { + "message": "Snap仅在启用后才会运行" + }, + "someNetworksMayPoseSecurity": { + "message": "某些网络可能会带来安全和/或隐私风险。在添加和使用网络之前,请先了解风险。" }, "somethingWentWrong": { - "message": "糟糕!出问题了。" + "message": "哎呀!出了点问题。" }, "source": { "message": "来源" @@ -2460,41 +3242,65 @@ "message": "加速该取消操作" }, "speedUpExplanation": { - "message": "我们根据当前网络条件更新了燃料费用,并且至少增加了10% (网络要求)。" + "message": "我们根据当前网络条件更新了燃料费用,将其提高了至少10%(网络要求)。" }, "speedUpPopoverTitle": { - "message": "加速该交易操作" + "message": "加快交易速度" }, "speedUpTooltipText": { - "message": "新增燃料费用" + "message": "新燃料费" }, "speedUpTransaction": { - "message": "加速该交易操作" + "message": "加速该交易" }, "spendLimitAmount": { - "message": "消费限额数量" + "message": "消费限额" }, "spendLimitInsufficient": { "message": "消费限额不足" }, "spendLimitInvalid": { - "message": "消费限制无效,必须是正数。" + "message": "消费限额无效;必须是正数" }, "spendLimitPermission": { - "message": "消费限制权限" + "message": "支付限额权限" }, "spendLimitRequestedBy": { - "message": "消费限制申请来自 $1", + "message": "$1 请求的消费限额", "description": "Origin of the site requesting the spend limit" }, "spendLimitTooLarge": { - "message": "消费限制过大" + "message": "消费限额过大" + }, + "srpInputNumberOfWords": { + "message": "我有一个包含$1个单词的助记词", + "description": "This is the text for each option in the dropdown where a user selects how many words their secret recovery phrase has during import. The $1 is the number of words (either 12, 15, 18, 21, or 24)." + }, + "srpPasteFailedTooManyWords": { + "message": "粘贴失败,因为它包含超过24个单词。一个助记词最多可包含24个单词。", + "description": "Description of SRP paste erorr when the pasted content has too many words" + }, + "srpPasteTip": { + "message": "您可以将整个助记词粘贴到任何字段中", + "description": "Our secret recovery phrase input is split into one field per word. This message explains to users that they can paste their entire secrete recovery phrase into any field, and we will handle it correctly." + }, + "srpToggleShow": { + "message": "显示/隐藏助记词中的这个单词", + "description": "Describes a toggle that is used to show or hide a single word of the secret recovery phrase" + }, + "srpWordHidden": { + "message": "这个单词已隐藏", + "description": "Explains that a word in the secret recovery phrase is hidden" + }, + "srpWordShown": { + "message": "这个单词处于显示状态", + "description": "Explains that a word in the secret recovery phrase is being shown" }, "stable": { - "message": "稳定的" + "message": "稳定" }, "stableLowercase": { - "message": "稳定的" + "message": "稳定" }, "stateLogError": { "message": "检索状态日志时出错。" @@ -2506,7 +3312,10 @@ "message": "状态日志" }, "stateLogsDescription": { - "message": "状态日志包含您的账户地址和已发送的交易。" + "message": "状态日志包含您的公共账户地址和已发送的交易。" + }, + "status": { + "message": "状态" }, "statusConnected": { "message": "已连接" @@ -2518,33 +3327,132 @@ "message": "请确保您的 Lattice1 已准备好连接" }, "step1LatticeWalletMsg": { - "message": "您可以在设置后在线连接MetaMask到您的 Lattice1 设备。 解锁您的设备并准备好您的设备ID。若要更多地使用硬件钱包,$1", + "message": "当您的 Lattice1 设备设置好并在线时,您可以将 MetaMask 与它连接。解锁您的设备并准备好您的设备 ID。若要了解有关使用硬件钱包的更多信息,$1", "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" }, "step1LedgerWallet": { - "message": "下载Ledger应用" + "message": "下载 Ledger 应用程序" }, "step1LedgerWalletMsg": { - "message": "下载、设置和输入您的密码以解锁 $1。", + "message": "下载、设置并输入您的密码以解锁 $1。", "description": "$1 represents the `ledgerLiveApp` localization value" }, "step1TrezorWallet": { - "message": "插入Trezor钱包" + "message": "插入 Trezor 钱包" }, "step1TrezorWalletMsg": { - "message": "将您的钱包直接连接到电脑。如果使用硬件钱包设备,關於使用您的钱包更多詳情,$1", + "message": "将您的钱包直接连接到电脑。若要了解有关使用硬件钱包设备的更多信息,$1", "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" }, "step2LedgerWallet": { - "message": "插入Ledger钱包" + "message": "插入 Ledger 钱包" }, "step2LedgerWalletMsg": { - "message": "将您的钱包直接连接到电脑。解锁Ledger并打开Ethereum应用程序。关于使用您的硬件钱包设备的更多,$1。", + "message": "将您的钱包直接连接到电脑。解锁 Ledger 并打开 Ethereum 应用程序。若要了解有关使用您的硬件钱包设备的更多信息,$1。", "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" }, + "stillGettingMessage": { + "message": "仍然收到此消息?" + }, "storePhrase": { "message": "通过如 1Password 等密码管理工具保存该账户助记词。" }, + "strong": { + "message": "强" + }, + "stxAreHere": { + "message": "智能交易已推出!" + }, + "stxBenefit1": { + "message": "将交易成本减至最低" + }, + "stxBenefit2": { + "message": "减少交易失败" + }, + "stxBenefit3": { + "message": "消除卡住的交易" + }, + "stxBenefit4": { + "message": "防止抢先交易" + }, + "stxCancelled": { + "message": "交换就会失败" + }, + "stxCancelledDescription": { + "message": "您的交易可能失败并被取消,以保护您免于支付不必要的燃料费。" + }, + "stxCancelledSubDescription": { + "message": "再次尝试进行交换。下次我们会在这里保护您免受类似风险。 " + }, + "stxDescription": { + "message": "MetaMask Swap变得更加智能!启用智能交易将允许MetaMask从编程上优化您的交换,以帮助:" + }, + "stxErrorNotEnoughFunds": { + "message": "没有足够的资金进行智能交易。" + }, + "stxErrorUnavailable": { + "message": "智能交易暂时不可用。" + }, + "stxFailure": { + "message": "交换失败" + }, + "stxFailureDescription": { + "message": "突然的市场变化可能导致失败。如果问题仍然存在,请联系$1。", + "description": "This message is shown to a user if their swap fails. The $1 will be replaced by support.metamask.io" + }, + "stxFallbackPendingTx": { + "message": "智能交易暂时不可用,因为您有一笔待处理的交易。" + }, + "stxFallbackUnavailable": { + "message": "即使智能交易不可用,您仍然可以交换代币。" + }, + "stxPendingPrivatelySubmittingSwap": { + "message": "正在秘密提交您的Swap..." + }, + "stxPendingPubliclySubmittingSwap": { + "message": "正在公开提交您的Swap..." + }, + "stxSubDescription": { + "message": "*智能交易将尝试多次隐秘提交您的交易。如果所有尝试都失败,交易将会公开广播,以确保您的交换能成功进行。" + }, + "stxSuccess": { + "message": "交换完成!" + }, + "stxSuccessDescription": { + "message": "您的$1现在可用。", + "description": "$1 is a token symbol, e.g. ETH" + }, + "stxSwapCompleteIn": { + "message": "Swap距离完成尚有<", + "description": "'<' means 'less than', e.g. Swap will complete in < 2:59" + }, + "stxTooltip": { + "message": "在提交前模拟交易,以降低交易成本并减少失败。" + }, + "stxTryRegular": { + "message": "尝试定期交换。" + }, + "stxTryingToCancel": { + "message": "正在尝试取消您的交易......" + }, + "stxUnavailable": { + "message": "智能交易被禁用" + }, + "stxUnknown": { + "message": "状态未知" + }, + "stxUnknownDescription": { + "message": "有一笔交易已经成功,但我们不确定是哪一笔。这可能是由于在处理此交换时提交了另一笔交易。" + }, + "stxUserCancelled": { + "message": "交换已取消" + }, + "stxUserCancelledDescription": { + "message": "您的交易已被取消,您并未支付任何不必要的燃料费。" + }, + "stxYouCanOptOut": { + "message": "您可以随时选择退出高级设置。" + }, "submit": { "message": "提交" }, @@ -2552,51 +3460,55 @@ "message": "已提交" }, "support": { - "message": "支持" + "message": "获取帮助" }, "supportCenter": { "message": "访问我们的支持中心" }, "swap": { - "message": "兑换 Swap" + "message": "交换" }, "swapAggregator": { - "message": "聚合商" + "message": "聚合器" }, "swapAllowSwappingOf": { - "message": "允许交换$1", + "message": "允许交换 $1", "description": "Shows a user that they need to allow a token for swapping on their hardware wallet" }, "swapAmountReceived": { - "message": "保证数额" + "message": "保证金额" }, "swapAmountReceivedInfo": { - "message": "这是您将收到的最低数额。根据滑点值, 您可能会收到更多。" + "message": "这是您将收到的最低金额。根据滑点值,您可能会收到更多。" }, "swapApproval": { - "message": "批准 $1 的兑换 ", + "message": "批准 $1 进行交换", "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." }, "swapApproveNeedMoreTokens": { - "message": "您还需 $1 $2 来完成这笔兑换", + "message": "您还需要 $1 的 $2 来完成这笔交换", "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." }, + "swapApproveNeedMoreTokensSmartTransactions": { + "message": "您还需要更多$1才能使用智能交易完成此交换。", + "description": "Tells the user that they need more of a certain token ($1) before they can complete the swap via smart transactions." + }, "swapBestOfNQuotes": { - "message": "最好的$1报价。", + "message": "$1 报价中最棒的。", "description": "$1 is the number of quotes that the user can select from when opening the list of quotes on the 'view quote' screen" }, "swapBuildQuotePlaceHolderText": { - "message": "没有匹配的代币符合 $1", + "message": "没有与 $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" }, "swapConfirmWithHwWallet": { "message": "使用您的硬件钱包确认" }, "swapContractDataDisabledErrorDescription": { - "message": "在您的Ledger的Etherum应用中,转到“设置”并允许合同数据。然后再次尝试交换。" + "message": "在您的 Ledger 的 Etherum 应用程序中,转到“设置”并允许合约数据。然后再次尝试交换。" }, "swapContractDataDisabledErrorTitle": { - "message": "合同数据未在您的Ledger上启用" + "message": "您的 Ledger 上未启用合约数据" }, "swapCustom": { "message": "自定义" @@ -2605,37 +3517,41 @@ "message": "去中心化交易所" }, "swapDirectContract": { - "message": "直接合同" + "message": "直接合约" }, "swapEditLimit": { - "message": "修改限制" + "message": "编辑限制" }, "swapEnableDescription": { - "message": "这是必须的,并且允许 MetaMask 兑换您的 $1。", + "message": "这是必须的,并授予 MetaMask 权限交换您的 $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." }, "swapEnableTokenForSwapping": { - "message": "这需要$1进行交换。", + "message": "这将 $1 进行交换", "description": "$1 is for the 'enableToken' key, e.g. 'enable ETH'" }, "swapEstimatedNetworkFees": { - "message": "预计网络手续费" + "message": "预估网络费用" }, "swapEstimatedNetworkFeesInfo": { - "message": "这是预估的用于完成您的兑换所使用的网络手续费。实际数额可能会根据网络条件而变化。" + "message": "这是预估的网络费用,将用于完成您的交换。实际金额可能会根据网络条件而变化。" }, "swapFailedErrorDescriptionWithSupportLink": { - "message": "交易有时会失败,我们会提供帮助。如果这个问题仍然存在,您可以通过$1来获得我们的客户支持来获得进一步的帮助。", + "message": "交易有时会失败,我们随时为您提供帮助。如果此问题仍然存在,您可以在 $1 联系我们的客服,以获得进一步的帮助。", "description": "This message is shown to a user if their swap fails. The $1 will be replaced by support.metamask.io" }, "swapFailedErrorTitle": { - "message": "兑换失败" + "message": "交换失败" + }, + "swapFetchingQuoteNofN": { + "message": "获取$2的$1报价", + "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." }, "swapFetchingQuotes": { - "message": "正在获取报价" + "message": "取得报价中" }, "swapFetchingQuotesErrorDescription": { - "message": "呃……出错了。再试一次,如果错误仍存在,请联系客户支持。" + "message": "呃……出错了。再试一次,如果错误仍存在,请联系客服。" }, "swapFetchingQuotesErrorTitle": { "message": "获取报价出错" @@ -2648,36 +3564,36 @@ "description": "Tells a user that they need to confirm on their hardware wallet a swap of 2 tokens. $1 is a source token and $2 is a destination token" }, "swapGasFeesDetails": { - "message": "燃料费用是根据网络流量和交易复杂性估算,并会波动。" + "message": "燃料费用是估算的,并将根据网络流量和交易复杂性而波动。" }, "swapGasFeesLearnMore": { - "message": "了解更多关于燃料费用的信息" + "message": "了解更多关于燃料费的信息" }, "swapGasFeesSplit": { - "message": "上一个屏幕上的燃料费用在这两笔交易之间进行分配。" + "message": "上一个屏幕上的燃料费用在这两笔交易之间分摊。" }, "swapGasFeesSummary": { - "message": "燃料费用支付给在$1网络上处理交易的加密矿工。MetaMask不会从燃料费用中获利。", + "message": "燃料费用支付给在 $1 网络上处理交易的加密矿工。MetaMask 不会从燃料费用中获利。", "description": "$1 is the selected network, e.g. Ethereum or BSC" }, "swapHighSlippageWarning": { - "message": "翻转数量非常高。" + "message": "滑点金额非常高。" }, "swapIncludesMMFee": { - "message": "包括1%的MetaMask收费。", + "message": "包括 $1% 的 MetaMask 费用。", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, "swapLowSlippageError": { - "message": "交易可能失败,最大滑点过低。" + "message": "交易可能会失败,最大滑点过低。" }, "swapMaxSlippage": { "message": "最大滑点" }, "swapMetaMaskFee": { - "message": "MetaMask 手续费" + "message": "MetaMask 费用" }, "swapMetaMaskFeeDescription": { - "message": "我们每次都能从顶级流动性资源中找到最好的价格。每次报价都会自动收取1%的手续费用,以支持 MetaMask 的持续发展,使其更加完善。", + "message": "我们每次都能从顶级流动性资源中找到最优惠的价格。$1% 的费用会自动计入此报价。", "description": "Provides information about the fee that metamask takes for swaps. $1 is a decimal number." }, "swapNQuotesWithDot": { @@ -2689,25 +3605,25 @@ "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" }, "swapOnceTransactionHasProcess": { - "message": "一旦交易完成,您的 $1 将被添加到您的账户中。", + "message": "处理完此交易后,您的 $1 将被添加到您的账户中。", "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." }, "swapPriceDifference": { - "message": "您将兑换 $1 $2(~$3)为 $4 $5(~$6)。", + "message": "您将用 $1 $2 (~$3) 交换 $4 $5 (~$6)。", "description": "This message represents the price slippage for the swap. $1 and $4 are a number (ex: 2.89), $2 and $5 are symbols (ex: ETH), and $3 and $6 are fiat currency amounts." }, "swapPriceDifferenceTitle": { - "message": "价格差异 ~$1%", + "message": "~$1% 的价差", "description": "$1 is a number (ex: 1.23) that represents the price difference." }, "swapPriceImpactTooltip": { - "message": "价格影响是当前市场价格与执行交易期间收到的金额之间的差额。 价格影响是您的交易规模与流动资金池规模之间的一个函数。" + "message": "价格影响是当前市场价格与交易执行期间收到的金额之间的差异。价格影响是您的交易规模相对于流动资金池规模的一个函数。" }, "swapPriceUnavailableDescription": { - "message": "由于缺乏市场价格数据,无法确定价格的影响。 请确认您同意即将收到的代币数量。" + "message": "由于缺乏市场价格数据,无法确定价格影响。在交换之前,请确认您对即将收到的代币数量感到满意。" }, "swapPriceUnavailableTitle": { - "message": "在继续之前检查您的价格" + "message": "在继续之前,请检查您的费率" }, "swapProcessing": { "message": "处理中" @@ -2725,7 +3641,7 @@ "message": "报价超时" }, "swapQuotesNotAvailableErrorDescription": { - "message": "尝试调整滑点数量设置,并再试一次。" + "message": "尝试调整金额或滑点设置,然后重试。" }, "swapQuotesNotAvailableErrorTitle": { "message": "无可用报价" @@ -2734,10 +3650,10 @@ "message": "费率" }, "swapReceiving": { - "message": "接收" + "message": "正在接收" }, "swapReceivingInfoTooltip": { - "message": "这是一个预估数额。确切的数额取决于滑点。" + "message": "这是一个预估额。确切的金额取决于滑点。" }, "swapRequestForQuotation": { "message": "请求报价" @@ -2745,6 +3661,9 @@ "swapReviewSwap": { "message": "审查交换" }, + "swapSearchNameOrAddress": { + "message": "搜索名称或粘贴地址" + }, "swapSelect": { "message": "选择" }, @@ -2752,34 +3671,41 @@ "message": "选择一个报价" }, "swapSelectAToken": { - "message": "选择一个代币" + "message": "选择代币" }, "swapSelectQuotePopoverDescription": { - "message": "以下是从多个流动资金来源收集到的所有报价。" + "message": "以下是从多个流动性来源收集到的所有报价。" }, "swapSlippageNegative": { - "message": "翻转必须大于或等于 0" + "message": "滑点必须大于或等于0" + }, + "swapSlippagePercent": { + "message": "$1%", + "description": "$1 is the amount of % for slippage" + }, + "swapSlippageTooltip": { + "message": "如果价格于下单到订单确认期间发生变化,这被称为“滑点”。如果滑点超过“最大滑点”设置,您的兑换将会自动取消。" }, "swapSource": { - "message": "流动资金来源" + "message": "流动性来源" }, "swapSourceInfo": { - "message": "我们搜索多个流动性来源(交易所、聚合商和专业做市商),以找到最好的利率和最低的网络手续费。" + "message": "我们搜索多个流动性来源(交易所、聚合器和专业做市商),以找到最优惠的价格和最低的网络费用。" }, "swapSuggested": { - "message": "交换建议" + "message": "建议的交换" }, "swapSuggestedGasSettingToolTipMessage": { - "message": "交换是复杂和时间敏感的交易。我们推荐此燃料费用,以便在成功交换的成本和信心之间保持良好的平衡。" + "message": "交换是复杂和时间敏感的交易。我们建议使用此燃料费用,以便在成本和成功交换的信心之间保持良好的平衡。" }, "swapSwapFrom": { - "message": "兑换自" + "message": "交换自" }, "swapSwapSwitch": { - "message": "切换兑换代币方向" + "message": "在代币之间切换" }, "swapSwapTo": { - "message": "兑换到" + "message": "交换为" }, "swapToConfirmWithHwWallet": { "message": "使用您的硬件钱包确认" @@ -2789,56 +3715,56 @@ "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." }, "swapTokenBalanceUnavailable": { - "message": "我们无法获取您的$1余额", + "message": "我们无法检索您的 $1 余额", "description": "This message communicates to the user that their balance of a given token is currently unavailable. $1 will be replaced by a token symbol" }, "swapTokenToToken": { - "message": "兑换 $1 到 $2", + "message": "用 $1 交换 $2", "description": "Used in the transaction display list to describe a swap. $1 and $2 are the symbols of tokens in involved in a swap." }, "swapTokenVerificationAddedManually": { - "message": "已手动添加此代币。" + "message": "此代币已手动添加。" }, "swapTokenVerificationMessage": { - "message": "总是在$1上确认代币地址。", + "message": "始终在 $1 上确认代币地址。", "description": "Points the user to Etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"Etherscan\" followed by an info icon that shows more info on hover." }, "swapTokenVerificationOnlyOneSource": { - "message": "仅在 1 个源上验证。" + "message": "仅在1个来源上进行了验证。" }, "swapTokenVerificationSources": { - "message": "在$1资源上验证。", + "message": "在 $1 个来源上进行了验证。", "description": "Indicates the number of token information sources that recognize the symbol + address. $1 is a decimal number." }, "swapTooManyDecimalsError": { - "message": "$1 最多允许$2小数", + "message": "$1 允许最多 $2 个小数位", "description": "$1 is a token symbol and $2 is the max. number of decimals allowed for the token" }, "swapTransactionComplete": { "message": "交易完成" }, "swapTwoTransactions": { - "message": "2 交易" + "message": "2笔交易" }, "swapUnknown": { - "message": "未知的" + "message": "未知" }, "swapVerifyTokenExplanation": { - "message": "多个代币可以使用相同的名称和符号。检查 $1(以太坊浏览器)以确认这是您正在寻找的代币。", + "message": "多个代币可以使用相同的名称和符号。检查 $1 以确认这是您正在寻找的代币。", "description": "This appears in a tooltip next to the verifyThisTokenOn message. It gives the user more information about why they should check the token on a block explorer. $1 will be the name or url of the block explorer, which will be the translation of 'etherscan' or a block explorer url specified for a custom network." }, "swapYourTokenBalance": { - "message": "$1 $2 可用", + "message": "$1 $2 可用于交换", "description": "Tells the user how much of a token they have in their balance. $1 is a decimal number amount of tokens, and $2 is a token symbol" }, "swapZeroSlippage": { - "message": "0% 滑点" + "message": "0%滑点" }, "swapsAdvancedOptions": { "message": "高级选项" }, "swapsExcessiveSlippageWarning": { - "message": "滑点数额太高,会导致不良率。请将滑点设置降低到 15% 以下。" + "message": "滑点金额太高,会导致不良率。请将最大滑点降低到低于15%的值。" }, "swapsMaxSlippage": { "message": "最大滑点" @@ -2851,10 +3777,10 @@ "message": "在活动中查看" }, "switchEthereumChainConfirmationDescription": { - "message": "这将切换MetaMask中选定的网络到以前添加的网络:" + "message": "这将切换 MetaMask 中选定的网络到以前添加的网络:" }, "switchEthereumChainConfirmationTitle": { - "message": "允许此站点切换网络?" + "message": "允许此网站切换网络?" }, "switchNetwork": { "message": "切换网络" @@ -2862,9 +3788,16 @@ "switchNetworks": { "message": "切换网络" }, + "switchToNetwork": { + "message": "切换至$1", + "description": "$1 represents the custom network that has previously been added" + }, "switchToThisAccount": { "message": "切换到该账户" }, + "switchedTo": { + "message": "您已切换到" + }, "switchingNetworksCancelsPendingConfirmations": { "message": "切换网络将取消所有待处理的确认" }, @@ -2872,7 +3805,7 @@ "message": "符号" }, "symbolBetweenZeroTwelve": { - "message": "符号不得超过 11 个字符。" + "message": "符号不得超过11个字符。" }, "syncFailed": { "message": "同步失败" @@ -2881,34 +3814,28 @@ "message": "同步进行中" }, "syncWithMobile": { - "message": "使用移动设备同步" + "message": "与移动设备同步" }, "syncWithMobileBeCareful": { - "message": "扫描这个代码时,请确保附近没有其他人在看您的屏幕。" + "message": "扫描此代码时,请确保附近没有其他人在看您的屏幕" }, "syncWithMobileComplete": { - "message": "您的数据已同步成功。尽情体验 MetaMask 应用程序!" + "message": "您的数据已同步成功。尽情体验 MetaMask 移动应用程序吧!" }, "syncWithMobileDesc": { - "message": "您可以使用个人移动设备同步个人账户与信息。打开 MetaMask 移动应用程序,进入“设置”选项,点击“通过浏览器扩展程序同步”" + "message": "您可以将您的账户和信息与您的移动设备同步。打开 MetaMask 移动应用程序,进入“设置”,点击“从浏览器扩展程序同步”" }, "syncWithMobileDescNewUsers": { "message": "如果您是首次启用 MetaMask 移动应用程序,请通过个人手机完成如下操作。" }, "syncWithMobileScanThisCode": { - "message": "使用 MetaMask 应用程序扫描代码" + "message": "使用 MetaMask 移动应用程序扫描此代码" }, "syncWithMobileTitle": { - "message": "使用移动设备进行同步" - }, - "syncWithThreeBox": { - "message": "使用 3Box 同步数据(实验功能)" + "message": "与移动设备同步" }, - "syncWithThreeBoxDescription": { - "message": "开启后可以用 3Box 备份您的设置。此功能目前是实验功能,使用时风险自负。" - }, - "syncWithThreeBoxDisabled": { - "message": "由于初始同步过程中出现错误,3Box 已被禁用。" + "tenPercentIncreased": { + "message": "增加10%" }, "terms": { "message": "使用条款" @@ -2917,10 +3844,22 @@ "message": "服务条款" }, "testFaucet": { - "message": "测试水管" + "message": "测试水龙头" + }, + "testNetworks": { + "message": "测试网络" + }, + "theme": { + "message": "主题" + }, + "themeDescription": { + "message": "选择您喜欢的MetaMask主题。" + }, + "thingsToKeep": { + "message": "注意事项:" }, "thisWillCreate": { - "message": "将为您创建新的钱包账户和账户助记词" + "message": "这将创建新的钱包和账户助记词" }, "time": { "message": "时间" @@ -2942,6 +3881,9 @@ "token": { "message": "代币" }, + "tokenAddress": { + "message": "代币地址" + }, "tokenAlreadyAdded": { "message": "代币已添加。" }, @@ -2949,64 +3891,89 @@ "message": "代币合约地址" }, "tokenDecimalFetchFailed": { - "message": "需要代币十进制。" + "message": "需要代币小数。" + }, + "tokenDecimalTitle": { + "message": "代币小数:" + }, + "tokenDetails": { + "message": "代币详情" + }, + "tokenFoundTitle": { + "message": "找到1枚新代币" + }, + "tokenId": { + "message": "代币 ID" + }, + "tokenList": { + "message": "代币列表:" + }, + "tokenScamSecurityRisk": { + "message": "代币欺诈和安全风险。" + }, + "tokenShowUp": { + "message": "您的代币可能不会自动显示在您的钱包中。" }, "tokenSymbol": { "message": "代币符号" }, + "tokensFoundTitle": { + "message": "发现$1新代币", + "description": "$1 is the number of new tokens detected" + }, "tooltipApproveButton": { - "message": "我了解" + "message": "我理解" }, "total": { - "message": "总额" + "message": "共计" }, "transaction": { "message": "交易" }, "transactionCancelAttempted": { - "message": "尝试取消交易 $2,燃料费用:$1。" + "message": "已在 $2 尝试取消交易 ,燃料费用预计为 $1" }, "transactionCancelSuccess": { - "message": "取消交易成功 $2。" + "message": "交易已在 $2 成功取消。" }, "transactionConfirmed": { - "message": "交易已确认 $2。" + "message": "交易已在 $2 确认。" }, "transactionCreated": { - "message": "交易已创建 $2,交易数额:$1。" + "message": "在 $2 创建了值为 $1 的交易。" }, "transactionData": { "message": "交易数据" }, "transactionDecodingAccreditationDecoded": { - "message": "由Truffle解码" + "message": "由 Truffle 解码" }, "transactionDecodingAccreditationVerified": { - "message": "已在$1验证的合同" + "message": "已在 $1 验证的合约" }, "transactionDecodingUnsupportedNetworkError": { - "message": "交易解码对链ID $1不可用" + "message": "链 ID $1 不可使用交易解码" }, "transactionDetailDappGasMoreInfo": { - "message": "推荐站点" + "message": "建议的网站" }, "transactionDetailDappGasTooltip": { - "message": "编辑以使用MetaMask基于最新区块的推荐燃料费。" + "message": "编辑以使用 MetaMask 建议的基于最新区块的燃料费用。" }, "transactionDetailGasHeading": { - "message": "估计燃料费用" + "message": "估算的燃料费" }, "transactionDetailGasInfoV2": { - "message": "估计" + "message": "估算" }, "transactionDetailGasTooltipConversion": { - "message": "了解更多关于燃料费用的信息" + "message": "了解更多关于燃料费的信息" }, "transactionDetailGasTooltipExplanation": { - "message": "燃料费用由网络设定,并根据网络流量和交易复杂性产生波动。" + "message": "燃料费由网络设定,并根据网络流量和交易的复杂性而波动。" }, "transactionDetailGasTooltipIntro": { - "message": "燃料费用支付给在$1网络上处理交易的加密矿工。MetaMask不会从燃料费用中获利。" + "message": "燃料费用支付给在 $1 网络上处理交易的加密矿工。MetaMask 不会从燃料费用中获利。" }, "transactionDetailGasTotalSubtitle": { "message": "金额 + 燃料费" @@ -3018,13 +3985,13 @@ "message": "金额 + 费用" }, "transactionDropped": { - "message": "交易终止 $2。" + "message": "交易已在 $2 放弃。" }, "transactionError": { - "message": "交易出错。合约代码执行异常。" + "message": "交易出错。合约代码中抛出异常。" }, "transactionErrorNoContract": { - "message": "试图在一个非合约地址上调用一个函数。" + "message": "试图在非合约地址上调用函数。" }, "transactionErrored": { "message": "交易出现错误。" @@ -3033,70 +4000,79 @@ "message": "交易费" }, "transactionHistoryBaseFee": { - "message": "基本费用 (GWEI)" + "message": "基本费用(GWEI)" }, "transactionHistoryL1GasLabel": { - "message": "总共L1煤气费" + "message": "1层燃料费总计" }, "transactionHistoryL2GasLimitLabel": { - "message": "L2 燃料限制" + "message": "2层燃料上限" }, "transactionHistoryL2GasPriceLabel": { - "message": "L2 燃料价格" + "message": "2层燃料价格" }, "transactionHistoryMaxFeePerGas": { - "message": "每燃料的最大费用" + "message": "每单位燃料的最大费用" }, "transactionHistoryPriorityFee": { - "message": "优先费用(GWEI)" + "message": "优先费用(GWEI)" }, "transactionHistoryTotalGasFee": { - "message": "总共煤气费" + "message": "燃料费总额" }, "transactionResubmitted": { - "message": "重新提交交易 $2,交易费升至:$1。" + "message": "已在 $2 重新提交交易,燃料费预计升至 $1" }, "transactionSubmitted": { - "message": "交易已提交 $2,交易费:$1。" + "message": "已在 $2 提交交易,燃料费预计为 $1。" }, "transactionUpdated": { - "message": "交易更新时间 $2。" + "message": "交易于 $2 更新。" }, "transfer": { - "message": "转账" + "message": "转移" }, "transferBetweenAccounts": { - "message": "在我的账户间转账" + "message": "在我的账户之间转移" }, "transferFrom": { - "message": "转自" + "message": "转移自" }, "troubleConnectingToWallet": { - "message": "我们在连接您的 $1 遇到问题,尝试检查 $2 并重试。", + "message": "我们在连接您的 $1 时遇到问题,尝试检查 $2 并重试。", "description": "$1 is the wallet device name; $2 is a link to wallet connection guide" }, + "troubleStarting": { + "message": "MetaMask无法启动。可能发生间歇性错误,因此请尝试重新启动扩展程序。" + }, "troubleTokenBalances": { - "message": "我们无法加载您的代币余额。您可以查看它们", + "message": "我们在加载您的代币余额时遇到问题。您可以查看它们 ", "description": "Followed by a link (here) to view token balances" }, "trustSiteApprovePermission": { - "message": "通过授予许可,您正在允许以下$1访问您的资金" + "message": "通过授予权限,您允许以下 $1 访问您的资金" }, "tryAgain": { "message": "重试" }, + "tryOur": { + "message": "试试我们的" + }, "turnOnTokenDetection": { - "message": "打开增强代币检测" + "message": "开启增强型代币检测" }, "twelveHrTitle": { "message": "12小时:" }, "txInsightsNotSupported": { - "message": "此时此合同不支持交易见解。" + "message": "此合约目前不支持交易见解。" }, "typePassword": { "message": "输入您的 MetaMask 密码" }, + "typeYourSRP": { + "message": "输入助记词" + }, "u2f": { "message": "U2F", "description": "A name on an API for the browser to interact with devices that support the U2F protocol. On some browsers we use it to connect MetaMask to Ledger devices." @@ -3105,69 +4081,85 @@ "message": "未批准" }, "units": { - "message": "数量" + "message": "单位" }, "unknown": { "message": "未知" }, "unknownCameraError": { - "message": "尝试获取相机使用权限时报错。请重试……" + "message": "尝试访问您的相机时出错。请重试……" }, "unknownCameraErrorTitle": { - "message": "哎呀!出问题了……" + "message": "糟糕!出问题了...." + }, + "unknownCollection": { + "message": "未命名的收藏" }, "unknownNetwork": { "message": "未知的私有网络" }, "unknownQrCode": { - "message": "错误:无法识别该二维码" + "message": "错误:我们无法识别该二维码" }, "unlimited": { "message": "无限制" }, "unlock": { - "message": "解锁" + "message": "登录" }, "unlockMessage": { "message": "即将进入去中心化网络" }, "unrecognizedChain": { - "message": "这个自定义网络无法识别。我们建议您在继续操作之前$1", + "message": "该自定义网络无法识别", "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." }, + "unrecognizedProtocol": { + "message": "$1(未识别的协议)", + "description": "Shown when the protocol is unknown by the extension. $1 is the protocol code." + }, "unsendableAsset": { "message": "当前不支持发送可收藏的 (ERC-721) 代币", "description": "This is an error message we show the user if they attempt to send a collectible asset type, for which currently don't support sending" }, + "unverifiedContractAddressMessage": { + "message": "我们无法验证此合约。请确保此地址是可靠的。" + }, + "upArrow": { + "message": "向上箭头" + }, "updatedWithDate": { - "message": "已更新 $1" + "message": "已于 $1 更新" }, "urlErrorMsg": { "message": "URL 需要相应的 HTTP/HTTPS 前缀。" }, "urlExistsErrorMsg": { - "message": "URL 已经存在于现有的网络列表中" + "message": "此 URL 目前已被 $1 网络使用。" }, "useCollectibleDetection": { "message": "自动检测 NFT" }, "useCollectibleDetectionDescription": { - "message": "显示 NFTs 媒体和数据可能会将您的 IP 地址暴露于中央服务器。第三方API(例如OpenSea)用于在您的钱包中检测NFT。 这将显示您的账户地址与这些服务。如果您不想让应用程序从这些服务中拉取数据,请将其禁用。" + "message": "显示 NFT 媒体和数据可能会将您的 IP 地址暴露给集中式服务器。第三方 API(例如 OpenSea)用于在您的钱包中检测 NFT。这会通过这些服务暴露您的账户地址。如果您不希望该应用程序从这些服务中提取数据,请禁用此功能。" }, "usePhishingDetection": { "message": "使用网络钓鱼检测" }, "usePhishingDetectionDescription": { - "message": "显示针对 Ethereum 用户钓鱼域名的警告。" + "message": "显示针对 Ethereum 用户的网络钓鱼域名警告" + }, + "useTokenDetectionPrivacyDesc": { + "message": "要自动显示发送到您账户的代币,需要与第三方服务器通信以获取代币的图像。这些服务器将拥有您的IP地址的访问权限。" }, "usedByClients": { - "message": "可用于各种不同的客户端" + "message": "被各种不同的客户使用" }, "userName": { - "message": "名称" + "message": "用户名" }, "verifyThisTokenDecimalOn": { - "message": "代币小数在$1上找到", + "message": "代币小数可以在 $1 上找到", "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" }, "verifyThisTokenOn": { @@ -3175,14 +4167,14 @@ "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" }, "verifyThisUnconfirmedTokenOn": { - "message": "在$1上验证此代币,并确保这是您想要交易的代币。", + "message": "在 $1 上验证此代币,并确保这是您想要交易的代币。", "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" }, "viewAccount": { "message": "查看账户" }, "viewAllDetails": { - "message": "查看所有详细信息" + "message": "查看所有详情" }, "viewContact": { "message": "查看联系人" @@ -3197,18 +4189,18 @@ "message": "在区块浏览器上查看" }, "viewOnCustomBlockExplorer": { - "message": "在 $2 查看 $1", + "message": "在 $2 上查看 $1", "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" }, "viewOnEtherscan": { - "message": "在Etherscan上查看$1", + "message": "在 Etherscan 上查看 $1", "description": "$1 is the action type. e.g (Account, Transaction, Swap)" }, "viewOnOpensea": { - "message": "在Opensea上查看" + "message": "在 Opensea 上查看" }, "viewinExplorer": { - "message": "在资源管理器中查看 $1", + "message": "在 Explorer 中查看 $1", "description": "$1 is the action type. e.g (Account, Transaction, Swap)" }, "visitWebSite": { @@ -3221,24 +4213,37 @@ "message": "您已经成功地保护了您的钱包。请确保您的账户助记词安全和秘密——这是您的责任!" }, "walletCreationSuccessReminder1": { - "message": "MetaMask无法恢复您的账户助记词。" + "message": "MetaMask 无法恢复您的账户助记词。" }, "walletCreationSuccessReminder2": { - "message": "MetaMask团队将永远不会询问您账户助记词." + "message": "MetaMask 绝对不会索要您的账户助记词。" }, "walletCreationSuccessReminder3": { - "message": "对任何人$1或有可能被盗用您的资金", + "message": "对任何人 $1,否则您的资金有被盗风险", "description": "$1 is separated as walletCreationSuccessReminder3BoldSection so that we can bold it" }, "walletCreationSuccessReminder3BoldSection": { - "message": "永远不要与任何人分享您的账户助记词", + "message": "切勿分享您的账户助记词", "description": "This string is localized separately from walletCreationSuccessReminder3 so that we can bold it" }, "walletCreationSuccessTitle": { "message": "钱包创建成功" }, + "wantToAddThisNetwork": { + "message": "想要添加此网络吗?" + }, + "warning": { + "message": "警告" + }, + "warningTooltipText": { + "message": "$1 合约可能会花费您的全部代币余额,无需进一步通知或同意。请自定义较低的支出上限以保护自己。", + "description": "$1 is a fa-exclamation-circle icon with text 'Be careful' in 'warning' colour" + }, + "weak": { + "message": "弱" + }, "web3ShimUsageNotification": { - "message": "我们发现当前的网站尝试使用已经删除的 window.web3 API。如果这个网站网站已经无法正常使用,请点击 $1 获取更多信息。", + "message": "我们发现当前的网站尝试使用已经删除的 window.web3 API。如果这个网站出现故障,请点击 $1 以获取更多信息。", "description": "$1 is a clickable link." }, "webhid": { @@ -3258,48 +4263,55 @@ "message": "探索去中心化应用" }, "welcomeLoginDescription": { - "message": "使用您的 MetaMask登录到去中心化的应用 - 无需注册。" + "message": "使用您的 MetaMask 登录去中心化应用 - 无需注册。" }, "welcomeLoginTitle": { - "message": "对您的钱包说您好吧" + "message": "迎接您的钱包" }, "welcomeToMetaMask": { "message": "让我们开始吧" }, "welcomeToMetaMaskIntro": { - "message": "MetaMask受数百万人信任,是一个安全的钱包,使所有人都能访问web3。" + "message": "MetaMask 深受数百万人信任,是一款可以让所有人进入 web3 世界的安全钱包。" }, "whatsNew": { - "message": "新功能", + "message": "最新动态", "description": "This is the title of a popup that gives users notifications about new features and updates to MetaMask." }, "whatsThis": { "message": "这是什么?" }, "writePhrase": { - "message": "请将该账户助记词记录在纸上,并保存在安全的地方。如果希望提升信息安全性,请将信息记录在多张纸上,并分别保存在 2 - 3 个不同的地方。" + "message": "请将该账户助记词记录在纸上,并保存在安全的地方。如果希望提升安全性,请将它记录在多张纸上,并分别保存在2 - 3个不同的地方。" }, "xOfY": { "message": "$1 / $2", "description": "$1 and $2 are intended to be two numbers, where $2 is a total, and $1 is a count towards that total" }, "xOfYPending": { - "message": "$1 / $2待处理", + "message": "$1 / $2 待处理", "description": "$1 and $2 are intended to be two numbers, where $2 is a total number of pending confirmations, and $1 is a count towards that total" }, + "yes": { + "message": "是" + }, "yesLetsTry": { - "message": "是的,尝试下" + "message": "是的,我们试一下" + }, + "youHaveAddedAll": { + "message": "您已经添加了所有热门网络。您可以探索更多网络$1,或者您可以$2", + "description": "$1 is a link with the text 'here' and $2 is a button with the text 'add more networks manually'" }, "youNeedToAllowCameraAccess": { "message": "需要开启相机访问权限,才能使用该功能。" }, "youSign": { - "message": "正在签名" + "message": "您正在签名" }, "yourPrivateSeedPhrase": { - "message": "您的账户助记词" + "message": "您的个人账户助记词" }, "zeroGasPriceOnSpeedUpError": { - "message": "加速时无燃料价格" + "message": "加速时零燃料价格" } } diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json index 4bed5f928ef6..19e8a579bcf5 100644 --- a/app/_locales/zh_TW/messages.json +++ b/app/_locales/zh_TW/messages.json @@ -2,8 +2,13 @@ "about": { "message": "關於" }, - "acceleratingATransaction": { - "message": "* 提高交易費 Gas 價格將可加速處理時間,但不保證會有顯著效果" + "acceptTermsOfUse": { + "message": "我已閱讀並同意$1", + "description": "$1 is the `terms` message" + }, + "accessAndSpendNotice": { + "message": "$1 可能會存取並最多花費以下額度", + "description": "$1 is the url of the site requesting ability to spend" }, "accessingYourCamera": { "message": "正在存取您的攝影鏡頭..." @@ -21,7 +26,10 @@ "message": "帳戶" }, "accountSelectionRequired": { - "message": "必須先選擇一個帳戶!" + "message": "您必須先選擇一個帳戶!" + }, + "active": { + "message": "啟用" }, "activity": { "message": "交易紀錄" @@ -35,6 +43,32 @@ "addAlias": { "message": "新增化名" }, + "addContact": { + "message": "新增合約" + }, + "addCustomToken": { + "message": "Add Custom Token" + }, + "addEthereumChainConfirmationDescription": { + "message": "這會允許在 MetaMask 內使用這個網路。" + }, + "addEthereumChainConfirmationRisks": { + "message": "MetaMask 不會對自訂的網路做驗證。" + }, + "addEthereumChainConfirmationRisksLearnMore": { + "message": "了解更多關於$1的事。", + "description": "$1 is a link with text that is provided by the 'addEthereumChainConfirmationRisksLearnMoreLink' key" + }, + "addEthereumChainConfirmationRisksLearnMoreLink": { + "message": "詐騙與網路安全風險", + "description": "Link text for the 'addEthereumChainConfirmationRisksLearnMore' translation key" + }, + "addEthereumChainConfirmationTitle": { + "message": "允許這個網站新增一個網路?" + }, + "addFriendsAndAddresses": { + "message": "新增朋友和您信任的位址" + }, "addNetwork": { "message": "新增網路" }, @@ -50,6 +84,37 @@ "advancedOptions": { "message": "進階選項" }, + "affirmAgree": { + "message": "我同意" + }, + "alertDisableTooltip": { + "message": "這可以在「設定 > 提醒」裡變更" + }, + "alertSettingsUnconnectedAccount": { + "message": "選擇尚未連結的帳戶瀏覽一個網站時" + }, + "alertSettingsUnconnectedAccountDescription": { + "message": "當您瀏覽一個使用 web3 的網站,但目前選擇的帳戶沒有連結時,這個提醒會顯示在一個彈跳視窗。" + }, + "alertSettingsWeb3ShimUsage": { + "message": "當一個網站試著使用已經移除的 window.web3 API" + }, + "alertSettingsWeb3ShimUsageDescription": { + "message": "當您瀏覽一個嘗試使用已經移除的 window.web3 API 的網站,可能會因此故障時,這個提醒會顯示在一個彈跳視窗。" + }, + "alerts": { + "message": "提醒" + }, + "allowExternalExtensionTo": { + "message": "允許這個外部擴充功能:" + }, + "allowThisSiteTo": { + "message": "允許這個網站:" + }, + "allowWithdrawAndSpend": { + "message": "允許 $1 提款或最多花費以下額度:", + "description": "The url of the site that requested permission to 'withdraw and spend'" + }, "amount": { "message": "數量" }, @@ -57,42 +122,43 @@ "message": "以太坊瀏覽器擴充插件", "description": "The description of the application" }, - "appName": { - "message": "MetaMask", - "description": "The name of the application" - }, - "appNameBeta": { - "message": "MetaMask Beta", - "description": "The name of the application (Beta)" - }, - "appNameFlask": { - "message": "MetaMask Flask", - "description": "The name of the application (Flask)" - }, "approve": { + "message": "批准花費上限" + }, + "approveButtonText": { "message": "批准" }, + "approveSpendLimit": { + "message": "批准 $1 花費限額", + "description": "The token symbol that is being approved" + }, "approved": { - "message": "已批准" + "message": "已許可" }, "asset": { "message": "資產" }, + "assetOptions": { + "message": "資產選項" + }, "assets": { "message": "資產" }, "attemptToCancel": { - "message": "嘗試取消?" + "message": "嘗試取消?" }, "attemptToCancelDescription": { - "message": "送出取消並不保證您的交易一定會被取消。若取消成功,將會收取上方顯示交易費用" + "message": "送出取消請求並不保證您原本的交易一定會被取消。若取消成功,將會收取上方顯示交易費用。" }, "attemptingConnect": { - "message": "正在嘗試連接區塊鏈。" + "message": "正在嘗試連結區塊鏈。" }, "attributions": { "message": "來源" }, + "authorizedPermissions": { + "message": "您已經授予以下權限" + }, "autoLockTimeLimit": { "message": "自動登出計時器(分)" }, @@ -106,13 +172,13 @@ "message": "上一頁" }, "backToAll": { - "message": "回到所有" + "message": "回到全部" }, "backupApprovalInfo": { "message": "在裝置遺失、忘記密碼、需要重新安裝 MetaMask、或是想在另一裝置開啟錢包的情形下,你需要此秘密代碼來復原錢包。" }, "backupApprovalNotice": { - "message": "備份你的秘密還原代碼,安全防護錢包與資金。" + "message": "備份你的助憶詞,保護你的錢包與資金。" }, "backupNow": { "message": "現在備份" @@ -129,8 +195,11 @@ "blockExplorerUrl": { "message": "區塊鏈瀏覽器" }, + "blockExplorerUrlDefinition": { + "message": "這個網路的區塊鏈瀏覽器網址。" + }, "blockExplorerView": { - "message": "在 $1 觀看帳號 ", + "message": "在 $1 檢視帳戶", "description": "$1 replaced by URL for custom block explorer" }, "browserNotSupported": { @@ -143,14 +212,23 @@ "message": "用 Wyre 購買 $1" }, "buyWithWyreDescription": { - "message": "Wyre 讓你使用信用卡在 MetaMask 帳號中直接存入 $1 。" + "message": "Wyre 讓你使用信用卡在 MetaMask 帳戶中直接存入 $1 。" }, "bytes": { "message": "位元組" }, + "canToggleInSettings": { + "message": "您可以在「設定 -> 提醒」中重新啟用這個通知。" + }, "cancel": { "message": "取消" }, + "cancelEdit": { + "message": "Cancel Edit" + }, + "cancelSpeedUp": { + "message": "cancel or speed up a tranaction." + }, "cancellationGasFee": { "message": "需要的手續費" }, @@ -160,8 +238,11 @@ "chainId": { "message": "鏈 ID" }, + "chainIdDefinition": { + "message": "鏈 ID 用來簽署這個網路上的交易。" + }, "chromeRequiredForHardwareWallets": { - "message": "您需要在 Google Chrome 瀏覽器使用 MetaMask 連結您的硬體錢包" + "message": "您需要在 Google Chrome 瀏覽器使用 MetaMask 連結您的硬體錢包。" }, "clickToRevealSeed": { "message": "點選顯示助憶詞" @@ -181,35 +262,103 @@ "confirmed": { "message": "已確認" }, + "confusableUnicode": { + "message": "'$1' 和 '$2' 相像。" + }, + "confusableZeroWidthUnicode": { + "message": "發現零寬度字元。" + }, + "confusingEnsDomain": { + "message": "我們在 ENS 名稱中偵測到一些容易混淆的字元。請再次確認 ENS 名稱來避免被詐騙的可能。" + }, "congratulations": { "message": "恭喜" }, "connect": { "message": "連線" }, + "connectAccountOrCreate": { + "message": "連結帳戶或建立新的" + }, "connectHardwareWallet": { "message": "連線硬體錢包" }, + "connectManually": { + "message": "手動連結到目前的網站" + }, + "connectTo": { + "message": "連結到 $1", + "description": "$1 is the name/origin of a web3 site/application that the user can connect to metamask" + }, + "connectToAll": { + "message": "連結到您的全部$1", + "description": "$1 will be replaced by the translation of connectToAllAccounts" + }, + "connectToAllAccounts": { + "message": "帳戶", + "description": "will replace $1 in connectToAll, completing the sentence 'connect to all of your accounts', will be text that shows list of accounts on hover" + }, + "connectToMultiple": { + "message": "連結到 $1", + "description": "$1 will be replaced by the translation of connectToMultipleNumberOfAccounts" + }, + "connectToMultipleNumberOfAccounts": { + "message": "$1 個帳戶", + "description": "$1 is the number of accounts to which the web3 site/application is asking to connect; this will substitute $1 in connectToMultiple" + }, + "connectWithMetaMask": { + "message": "連結到 MetaMask" + }, + "connectedAccountsDescriptionPlural": { + "message": "您有 $1 個帳戶已連結到這個網站。", + "description": "$1 is the number of accounts" + }, + "connectedAccountsDescriptionSingular": { + "message": "您有 1 個帳戶已連結到這個網站。" + }, + "connectedAccountsEmptyDescription": { + "message": "MetaMask 尚未連結到這個網站。要連結到一個 web3 的網站,在該網站上尋找「連線」的按鈕。" + }, + "connectedSites": { + "message": "已連結的網站" + }, + "connectedSitesDescription": { + "message": "$1 已經連結到這些網站。他們可以檢視您的帳戶位址。", + "description": "$1 is the account name" + }, + "connectedSitesEmptyDescription": { + "message": "$1 尚未連結到任何網站。", + "description": "$1 is the account name" + }, + "connecting": { + "message": "連線中..." + }, "connectingTo": { - "message": "連線到$1" + "message": "連線到 $1" }, "connectingToGoerli": { - "message": "連接至 Goerli 測試網路" - }, - "connectingToKovan": { - "message": "連線到 Kovan 測試網路" + "message": "連線到 Goerli 測試網路" }, "connectingToMainnet": { - "message": "連線到主 Ethereum 網路" + "message": "連線到 Ethereum 主網路" + }, + "connectingToSepolia": { + "message": "連線到 Sepolia 測試網路" }, - "connectingToRinkeby": { - "message": "連線到 Rinkeby 測試網路" + "contactUs": { + "message": "聯絡我們" }, - "connectingToRopsten": { - "message": "連線到 Ropsten 測試網路" + "contacts": { + "message": "聯絡人" + }, + "continue": { + "message": "繼續" }, "continueToWyre": { - "message": "繼續至 Wyre" + "message": "繼續前往 Wyre" + }, + "contractAddressError": { + "message": "您正在將代幣傳送到代幣合約的位址。這可能會導致這些代幣遺失。" }, "contractDeployment": { "message": "部署合約" @@ -247,29 +396,61 @@ "currencyConversion": { "message": "轉換匯率" }, + "currencySymbol": { + "message": "貨幣代碼" + }, + "currencySymbolDefinition": { + "message": "用來代表這個網路的貨幣的代碼。" + }, + "currentAccountNotConnected": { + "message": "您目前的帳戶並未連結" + }, + "currentExtension": { + "message": "目前擴充功能頁面" + }, "currentLanguage": { - "message": "當前語言" + "message": "目前語言" }, - "customGas": { - "message": "自訂 Gas" + "customSpendLimit": { + "message": "自訂花費限制" }, - "customGasSubTitle": { - "message": "提升費用可能會加快處理時間,但不保證" + "customSpendingCap": { + "message": "自訂花費上限" }, "customToken": { "message": "自訂代幣" }, "decimal": { - "message": "小數點精度" + "message": "小數點位數" }, "decimalsMustZerotoTen": { - "message": "小數點後位數至少為0, 最多為36." + "message": "小數點位數至少為 0,至多為 36。" + }, + "decrypt": { + "message": "解密" + }, + "decryptCopy": { + "message": "複製已加密的訊息" + }, + "decryptInlineError": { + "message": "這個訊息無法被解密,因為以下錯誤:$1", + "description": "$1 is error message" + }, + "decryptMessageNotice": { + "message": "$1 想要讀取這個訊息來完成您的動作", + "description": "$1 is the web3 site name" + }, + "decryptMetamask": { + "message": "解密訊息" + }, + "decryptRequest": { + "message": "解密請求" }, "delete": { "message": "刪除" }, "deleteAccount": { - "message": "刪除帳號" + "message": "刪除帳戶" }, "deleteNetwork": { "message": "刪除網路?" @@ -277,12 +458,52 @@ "deleteNetworkDescription": { "message": "你確定要刪除網路嗎?" }, + "depositCrypto": { + "message": "存入 $1", + "description": "$1 represents the crypto symbol to be purchased" + }, "details": { "message": "詳情" }, + "directDepositCrypto": { + "message": "直接存入 $1" + }, + "directDepositCryptoExplainer": { + "message": "如果您已經擁有一些 $1,直接存入功能是讓新錢包最快取得的方式。" + }, + "disconnect": { + "message": "中斷連結" + }, + "disconnectAllAccounts": { + "message": "中斷所有帳戶的連結" + }, + "disconnectAllAccountsConfirmationDescription": { + "message": "您確定要中斷連結?您可能會失去網站的一些功能。" + }, + "disconnectPrompt": { + "message": "中斷 $1" + }, + "disconnectThisAccount": { + "message": "中斷這個帳戶的連結" + }, + "dismiss": { + "message": "忽略" + }, + "dismissReminderDescriptionField": { + "message": "把這個選項打開來忽略備份助憶詞的提醒。我們強烈建議您備份助憶詞,避免資金遺失" + }, + "dismissReminderField": { + "message": "忽略備份助憶詞的提醒" + }, + "domain": { + "message": "網域" + }, "done": { "message": "完成" }, + "dontShowThisAgain": { + "message": "不要再顯示" + }, "downloadGoogleChrome": { "message": "下載 Google Chrome 瀏覽器" }, @@ -301,8 +522,27 @@ "editContact": { "message": "編輯聯絡資訊" }, + "editNonceField": { + "message": "編輯 nonce" + }, + "editNonceMessage": { + "message": "這是一個進階功能,請小心使用。" + }, + "editPermission": { + "message": "編輯權限" + }, + "enableAutoDetect": { + "message": " Enable Autodetect" + }, + "encryptionPublicKeyNotice": { + "message": "$1 想要取得您的加密公鑰。同意之後,這個網站就可以向您發送加密訊息。", + "description": "$1 is the web3 site name" + }, + "encryptionPublicKeyRequest": { + "message": "請求加密公鑰" + }, "endOfFlowMessage1": { - "message": "你通過測試了—安全存放助記詞,這是你的責任!" + "message": "您通過測試了—安全存放助憶詞,這是您的責任!" }, "endOfFlowMessage10": { "message": "都完成了" @@ -314,34 +554,83 @@ "message": "在多處儲存備份。" }, "endOfFlowMessage4": { - "message": "不要分享此助記祠給任何人" + "message": "不要分享此助憶詞給任何人。" }, "endOfFlowMessage5": { - "message": "小心網路釣魚!MetaMask 永遠不會主動詢問你的助記詞。" + "message": "小心網路釣魚!MetaMask 永遠不會主動詢問你的助憶詞。" }, "endOfFlowMessage6": { - "message": "如你需要再次備份助記詞,可至設定 -> 安全。" + "message": "如你需要再次備份助憶詞,可至「設定 -> 安全」。" + }, + "endOfFlowMessage7": { + "message": "如果您有任何疑問或看到哪裡怪怪的,從$1聯絡我們尋求支援。", + "description": "$1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." }, "endOfFlowMessage8": { - "message": "MetaMask 無法還原你的助記詞。暸解更多" + "message": "MetaMask 無法還原你的助憶詞。" }, "endOfFlowMessage9": { "message": "深入瞭解。" }, + "endpointReturnedDifferentChainId": { + "message": "這個 RPC 端點回傳了一個不同的鏈 ID:$1", + "description": "$1 is the return value of eth_chainId from an RPC endpoint" + }, + "ensIllegalCharacter": { + "message": "Illegal Character for ENS." + }, "ensNotFoundOnCurrentNetwork": { "message": "現有網路中找不到 ENS 名稱。嘗試轉換到主要以太坊網路。" }, "ensRegistrationError": { "message": "ENS 名稱註冊錯誤" }, + "ensUnknownError": { + "message": "ENS Lookup failed." + }, + "enterMaxSpendLimit": { + "message": "輸入最大花費限制" + }, "enterPassword": { "message": "請輸入密碼" }, "enterPasswordContinue": { "message": "請輸入密碼" }, - "estimatedProcessingTimes": { - "message": "預估處理時間" + "errorCode": { + "message": "代碼:$1", + "description": "Displayed error code for debugging purposes. $1 is the error code" + }, + "errorDetails": { + "message": "錯誤詳細資訊", + "description": "Title for collapsible section that displays error details for debugging purposes" + }, + "errorMessage": { + "message": "訊息:$1", + "description": "Displayed error message for debugging purposes. $1 is the error message" + }, + "errorName": { + "message": "代碼:$1", + "description": "Displayed error name for debugging purposes. $1 is the error name" + }, + "errorPageMessage": { + "message": "重新整理頁面然後再試一次,或從$1聯絡我們尋求支援。", + "description": "Message displayed on generic error page in the fullscreen or notification UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, + "errorPagePopupMessage": { + "message": "重新開啟彈跳視窗然後再試一次,或從$1聯絡我們尋求支援。", + "description": "Message displayed on generic error page in the popup UI, $1 is a clickable link with text defined by the 'here' key. The link will open to a form where users can file support tickets." + }, + "errorPageTitle": { + "message": "MetaMask 遭遇錯誤", + "description": "Title of generic error page" + }, + "errorStack": { + "message": "堆疊資訊:", + "description": "Title for error stack, which is displayed for debugging purposes" + }, + "ethGasPriceFetchWarning": { + "message": "顯示備用 gas 價格,因為目前主要的 gas 估計服務無法使用。" }, "ethereumPublicAddress": { "message": "以太坊公開位址" @@ -353,14 +642,26 @@ "message": "展開畫面" }, "exportPrivateKey": { - "message": "導出私鑰" + "message": "匯出私鑰" + }, + "externalExtension": { + "message": "外部擴充功能" }, "failed": { - "message": "交易失败" + "message": "交易失敗" + }, + "failedToFetchChainId": { + "message": "無法取得鏈 ID。您的 RPC URL 正確嗎?" + }, + "failureMessage": { + "message": "有東西出錯了,所以無法完成這個動作" }, "fast": { "message": "快" }, + "feeAssociatedRequest": { + "message": "這個請求會附帶一筆手續費。" + }, "fiat": { "message": "法定貨幣", "description": "Exchange type" @@ -369,14 +670,24 @@ "message": "檔案匯入失敗?點擊這裡!", "description": "Helps user import their account from a JSON file" }, + "forbiddenIpfsGateway": { + "message": "禁止使用的 IPFS Gateway:請指定一個 CID gateway" + }, "forgetDevice": { - "message": "移除此裝置" + "message": "忘記此裝置" }, "from": { "message": "來源帳戶" }, + "fromAddress": { + "message": "來自:$1", + "description": "$1 is the address to include in the From label. It is typically shortened first using shortenAddress" + }, + "functionApprove": { + "message": "函式:Approve" + }, "functionType": { - "message": "功能類型" + "message": "函式型別" }, "gasLimit": { "message": "Gas 上限" @@ -387,18 +698,35 @@ "gasLimitTooLow": { "message": "Gas 上限至少為 21000" }, + "gasLimitTooLowWithDynamicFee": { + "message": "Gas 上限至少為 $1", + "description": "$1 is the custom gas limit, in decimal." + }, "gasPrice": { "message": "Gas 價格 (GWEI)" }, + "gasPriceExcessive": { + "message": "您的 gas 費用設定得太高了。考慮降低一些。" + }, + "gasPriceExcessiveInput": { + "message": "Gas 價格極高" + }, "gasPriceExtremelyLow": { "message": "Gas 價格極低" }, + "gasPriceFetchFailed": { + "message": "由於網路錯誤,gas 價格估計失敗。" + }, "gasPriceInfoTooltipContent": { - "message": "Gas 價格代表願意為交易手續費付出的單位價格,價格越高交易處理速度越快" + "message": "Gas 價格代表願意為交易手續費付出的單位價格,價格越高交易處理速度越快。" }, "gasUsed": { "message": "Gas 用量" }, + "gdprMessagePrivacyPolicy": { + "message": "Privacy Policy here", + "description": "this translation is intended to be exclusively used as the replacement for the $1 in the gdprMessage translation" + }, "general": { "message": "一般" }, @@ -406,12 +734,15 @@ "message": "取得以太幣" }, "getEtherFromFaucet": { - "message": "從水管取得 $1 以太幣。", + "message": "從水龍頭取得 $1 上的以太幣", "description": "Displays network name for Ether faucet" }, "getStarted": { "message": "開始使用" }, + "goBack": { + "message": "Go Back" + }, "goerli": { "message": "Goerli 測試網路" }, @@ -424,6 +755,13 @@ "hardwareWalletConnected": { "message": "硬體錢包已連線" }, + "hardwareWalletLegacyDescription": { + "message": "(舊版)", + "description": "Text representing the MEW path" + }, + "hardwareWalletSupportLinkConversion": { + "message": "點選這裡" + }, "hardwareWallets": { "message": "連線硬體錢包" }, @@ -435,7 +773,7 @@ "description": "as in -click here- for more information (goes with troubleTokenBalances)" }, "hexData": { - "message": "16進位資料" + "message": "十六進位資料" }, "hide": { "message": "隱藏" @@ -443,6 +781,13 @@ "hideTokenPrompt": { "message": "隱藏代幣?" }, + "hideTokenSymbol": { + "message": "隱藏 $1", + "description": "$1 is the symbol for a token (e.g. 'DAI')" + }, + "hideZeroBalanceTokens": { + "message": "隱藏零餘額的代幣" + }, "history": { "message": "紀錄" }, @@ -454,29 +799,42 @@ "message": "匯入帳戶" }, "importAccountMsg": { - "message": " 匯入的帳戶與您原有 MetaMask 帳戶的助憶詞並無關聯。請查看與匯入帳戶相關的資料 " + "message": " 匯入的帳戶並不會與您原有 MetaMask 帳戶助憶詞建立關聯。請用以下連結瞭解匯入帳戶相關的資料: " }, "importAccountSeedPhrase": { "message": "利用助憶詞還原" }, + "importMyWallet": { + "message": "Import My Wallet" + }, + "importTokensCamelCase": { + "message": "Import Tokens" + }, "importWallet": { "message": "匯入錢包" }, + "importYourExisting": { + "message": "使用助憶詞匯入您既有的錢包" + }, "imported": { "message": "已匯入私鑰", "description": "status showing that an account has been fully loaded into the keyring" }, + "infuraBlockedNotification": { + "message": "MetaMask 無法連線到區塊鏈主機。在$1查看可能的原因。", + "description": "$1 is a clickable link with with text defined by the 'here' key" + }, "initialTransactionConfirmed": { "message": "交易已確認" }, "insufficientBalance": { - "message": "餘額不足" + "message": "餘額不足。" }, "insufficientFunds": { - "message": "資金不足" + "message": "資金不足。" }, "insufficientTokens": { - "message": "代幣不足" + "message": "代幣不足。" }, "invalidAddress": { "message": "錯誤的位址" @@ -485,17 +843,52 @@ "message": "接收位址錯誤" }, "invalidAddressRecipientNotEthNetwork": { - "message": "非 ETH 網路,設定至小寫" + "message": "非 ETH 網路,請設定至小寫" }, "invalidBlockExplorerURL": { "message": "無效的區塊鏈瀏覽器 URL" }, + "invalidChainIdTooBig": { + "message": "無效的鏈 ID。鏈 ID 數值過大。" + }, + "invalidCustomNetworkAlertContent1": { + "message": "必須重新輸入自訂網路 '$1' 的鏈 ID。", + "description": "$1 is the name/identifier of the network." + }, + "invalidCustomNetworkAlertContent2": { + "message": "為了避免您被惡意或錯誤設定的網路提供者侵害,自訂網路現在一律需要提供鏈 ID。" + }, + "invalidCustomNetworkAlertContent3": { + "message": "前往「設定 > 網路」然後輸入鏈 ID。您可以在 $1 找到大部分熱門網路的鏈 ID。", + "description": "$1 is a link to https://chainid.network" + }, + "invalidCustomNetworkAlertTitle": { + "message": "無效的自訂網路" + }, + "invalidHexNumber": { + "message": "無效的十六進位數值。" + }, + "invalidHexNumberLeadingZeros": { + "message": "無效的十六進位數值。請去掉開頭的零。" + }, + "invalidIpfsGateway": { + "message": "無效的 IPFS Gateway:值必須要是一個合法的 URL" + }, + "invalidNumber": { + "message": "無效的數值。輸入一個小數或 0x開頭的十六進位數值。" + }, + "invalidNumberLeadingZeros": { + "message": "無效的數值。請去掉開頭的零。" + }, "invalidRPC": { - "message": "無效的 RPC URI" + "message": "無效的 RPC URL" }, "invalidSeedPhrase": { "message": "無效的助憶詞" }, + "ipfsGatewayDescription": { + "message": "輸入用於解析 ENS 內容的 IPFS CID gateway URL。" + }, "jsonFile": { "message": "JSON 格式檔案", "description": "format for importing an account" @@ -503,14 +896,23 @@ "knownAddressRecipient": { "message": "已知合約位址" }, - "kovan": { - "message": "Kovan 測試網路" + "knownTokenWarning": { + "message": "This action will edit tokens that are already listed in your wallet, which can be used to phish you. Only approve if you are certain that you mean to change what these tokens represent." + }, + "lastConnected": { + "message": "最近連結" }, "learnMore": { "message": "了解更多" }, "ledgerAccountRestriction": { - "message": "您必須使用最後的帳戶才能產生新帳戶" + "message": "您必須使用最後一個的帳戶才能產生新帳戶" + }, + "ledgerLocked": { + "message": "無法連上 Ledger 裝置。請確定您的裝置已解鎖,而且已開啟 Ethereum 應用程式。" + }, + "ledgerTimeout": { + "message": "Ledger Live 花了太多時間回應,或連線逾時。請確定您的 Ledger Live 應用程式已開啟而且裝置已解鎖。" }, "letsGoSetUp": { "message": "好,我們開始吧!" @@ -533,9 +935,15 @@ "lock": { "message": "鎖定" }, + "lockTimeTooGreat": { + "message": "鎖定時間過長" + }, "mainnet": { "message": "以太坊 主網路" }, + "makeAnotherSwap": { + "message": "建立新的 swap" + }, "max": { "message": "最大值" }, @@ -548,28 +956,76 @@ "message": { "message": "訊息" }, + "metaMaskConnectStatusParagraphOne": { + "message": "您現在能夠在 MetaMask 裡更仔細地控制您帳戶的連結。" + }, + "metaMaskConnectStatusParagraphThree": { + "message": "按這裡管理您已連結的帳戶。" + }, + "metaMaskConnectStatusParagraphTwo": { + "message": "連線狀態按鈕會顯示您正在造訪的網站是否已經連結到您目前選擇的帳戶。" + }, "metamaskDescription": { "message": "MetaMask 是以太坊安全身份識別金庫" }, + "metamaskSwapsOfflineDescription": { + "message": "MetaMask Swaps 正在維護。請晚點再來看看。" + }, "metamaskVersion": { "message": "MetaMask 版本" }, + "mismatchedChainLinkText": { + "message": "驗證網路的詳細資料", + "description": "Serves as link text for the 'mismatchedChain' key. This text will be embedded inside the translation for that key." + }, "mustSelectOne": { - "message": "必須選擇至少 1 代幣" + "message": "必須選擇至少 1 代幣。" }, "myAccounts": { "message": "我的帳戶" }, + "name": { + "message": "名稱" + }, + "needCryptoInWallet": { + "message": "要使用 MetaMask 存取去中心化應用程式時,您的錢包中需要有 $1。", + "description": "$1 represents the cypto symbol to be purchased" + }, + "needHelp": { + "message": "需要幫助?聯繫$1", + "description": "$1 represents `needHelpLinkText`, the text which goes in the help link" + }, + "needHelpLinkText": { + "message": "MetaMask 支援" + }, "needImportFile": { - "message": "您必須選擇一個檔案來匯入", + "message": "您必須選擇一個檔案來匯入。", "description": "User is important an account and needs to add a file to continue" }, "negativeETH": { - "message": "不能送出負值的以太幣" + "message": "不能送出負值的以太幣。" + }, + "networkDetails": { + "message": "網路詳細資料" }, "networkName": { "message": "網路名稱" }, + "networkNameDefinition": { + "message": "對應這個網路的名稱。" + }, + "networkNameTestnet": { + "message": "測試網路" + }, + "networkSettingsChainIdDescription": { + "message": "鏈 ID 用來簽署交易。它必須和該網路回傳的鏈 ID 一致。您可以輸入一個十進位數值或 0x 開頭的十六進位數值,但我們會顯示成十進位。" + }, + "networkURL": { + "message": "網路 URL" + }, + "networkURLDefinition": { + "message": "用來存取這個網路的 URL。" + }, "networks": { "message": "網路" }, @@ -598,24 +1054,31 @@ "newToMetaMask": { "message": "新來到 MetaMask?" }, - "newTotal": { - "message": "總費用" - }, - "newTransactionFee": { - "message": "自訂交易費" - }, "next": { "message": "下一頁" }, + "nextNonceWarning": { + "message": "Nonce 比建議的 $1 高", + "description": "The next nonce according to MetaMask's internal logic" + }, + "nftTokenIdPlaceholder": { + "message": "Enter the collectible ID" + }, + "noAccountsFound": { + "message": "指定的搜尋條件找不到帳戶" + }, "noAddressForName": { "message": "此 ENS 尚未指定位址。" }, "noAlreadyHaveSeed": { - "message": "不,我已經有助記詞" + "message": "不,我已經有助憶詞" }, "noConversionRateAvailable": { "message": "尚未有匯率比較值" }, + "noThanks": { + "message": "不了" + }, "noTransactions": { "message": "尚未有交易" }, @@ -625,15 +1088,49 @@ "noWebcamFoundTitle": { "message": "找不到攝影鏡頭" }, + "nonceField": { + "message": "自訂交易 nonce" + }, + "nonceFieldDescription": { + "message": "打開此選項來在交易確認視窗中更改 nonce (交易編號)。這是一個進階功能,請小心使用。" + }, + "nonceFieldHeading": { + "message": "自訂 nonce" + }, + "notCurrentAccount": { + "message": "這是正確的帳戶嗎?它與您的錢包目前所選擇的帳戶不同" + }, "notEnoughGas": { "message": "Gas 不夠" }, + "ofTextNofM": { + "message": "之" + }, "off": { - "message": "關" + "message": "關閉" + }, + "offlineForMaintenance": { + "message": "離線維護中" + }, + "ok": { + "message": "確認" }, "on": { "message": "開啟" }, + "onboardingPinExtensionBillboardAccess": { + "message": "Full Access" + }, + "onboardingReturnNotice": { + "message": "\"$1\" 將會關閉這個分頁並且導回到 $2", + "description": "Return the user to the site that initiated onboarding" + }, + "onlyAddTrustedNetworks": { + "message": "惡意的網路提供者可以欺騙您區塊鏈上的狀態或記錄您的網路活動。請只新增您信任的自訂網路。" + }, + "onlyConnectTrust": { + "message": "記住,只連線到您信任的網站。" + }, "origin": { "message": "來源" }, @@ -656,20 +1153,30 @@ "message": "您所輸入的密碼不一致" }, "pastePrivateKey": { - "message": "請貼上您的私鑰字串:", + "message": "請貼上您的私鑰字串:", "description": "For importing an account from a private key" }, "pending": { "message": "等待處理" }, + "permissions": { + "message": "權限" + }, "personalAddressDetected": { - "message": "偵測為個人位址,請輸入代幣合約位址" + "message": "偵測到這是個人位址,請輸入代幣合約位址" + }, + "plusXMore": { + "message": "+ $1 更多", + "description": "$1 is a number of additional but unshown items in a list- this message will be shown in place of those items" + }, + "prev": { + "message": "前一頁" }, "primaryCurrencySetting": { - "message": "主要顯示" + "message": "主要貨幣" }, "primaryCurrencySettingDescription": { - "message": "選擇使用以太幣(ETH)或是法定貨幣(例如:美金)為主要錢幣顯示單位" + "message": "選擇原生來優先使用鏈上原生貨幣 (例如 ETH) 顯示金額。選擇法定貨幣來優先使用您選擇的法定貨幣顯示金額。" }, "privacyMsg": { "message": "隱私政策" @@ -679,22 +1186,37 @@ "description": "select this type of file to use to import an account" }, "privateKeyWarning": { - "message": "注意:永遠不要公開這個私鑰。任何取得這把私鑰的人都可以竊取這個帳戶中的所有資產。" + "message": "警告:永遠不要公開這個私鑰。任何取得這把私鑰的人都可以竊取這個帳戶中的所有資產。" }, "privateNetwork": { "message": "私有網路" }, + "proposedApprovalLimit": { + "message": "提議的允許量限制" + }, + "provide": { + "message": "提供" + }, + "publicAddress": { + "message": "公開位址" + }, "queue": { "message": "佇列" }, + "queued": { + "message": "已排入佇列" + }, "readdToken": { - "message": "未來可以隨時重新加入此代幣" + "message": "您未來可以在帳戶選項中的「新增代幣」重新加入此代幣。" + }, + "receive": { + "message": "接收" }, "recents": { "message": "最近" }, "recipientAddressPlaceholder": { - "message": "搜尋,公開地址 (0x),或 ENS" + "message": "搜尋、公開位址 (0x)、或 ENS" }, "reject": { "message": "拒絕" @@ -703,7 +1225,7 @@ "message": "全部拒絕" }, "rejectTxsDescription": { - "message": "您將批次拒絕 $1 筆交易." + "message": "您將批次拒絕 $1 筆交易。" }, "rejectTxsN": { "message": "拒絕 $1 筆交易" @@ -721,7 +1243,7 @@ "message": "移除帳戶" }, "removeAccountDescription": { - "message": "此帳戶將由錢包中移除。在繼續進行之前請確認您已經匯出並妥善備份助憶詞或私鑰。" + "message": "此帳戶將由錢包中移除。在繼續進行之前請確認您已經匯出並妥善備份助憶詞或私鑰。您可以從帳戶下拉選單中匯入或再次建立帳戶。" }, "requestsAwaitingAcknowledgement": { "message": "請求正在等待確認" @@ -736,7 +1258,16 @@ "message": "重置帳戶" }, "resetAccountDescription": { - "message": "重置帳戶將清除您的交易紀錄" + "message": "重置帳戶將清除您的交易紀錄。這將不會改變您的帳戶餘額或要求您重新輸入助憶詞。" + }, + "restore": { + "message": "還原" + }, + "retryTransaction": { + "message": "重試交易" + }, + "reusedTokenNameWarning": { + "message": "這裡的其中一個代幣重複使用了您關注的另一個代幣的符號,這可能會造成混淆甚至讓您被誤導。" }, "revealSeedWords": { "message": "顯示助憶詞" @@ -748,13 +1279,7 @@ "message": "絕對不要在公共場合輸入助憶詞!這可被用來竊取您的帳戶。" }, "revealSeedWordsWarningTitle": { - "message": "請勿將助憶詞洩漏予他人" - }, - "rinkeby": { - "message": "Rinkeby 測試網路" - }, - "ropsten": { - "message": "Ropsten 測試網路" + "message": "請勿將助憶詞洩漏予他人!" }, "rpcUrl": { "message": "新的 RPC URL" @@ -763,7 +1288,7 @@ "message": "儲存" }, "saveAsCsvFile": { - "message": "儲存為CSV格式檔案" + "message": "儲存為 CSV 格式檔案" }, "scanInstructions": { "message": "請將 QR code 放在攝影鏡頭前面" @@ -771,9 +1296,15 @@ "scanQrCode": { "message": "掃描 QR Code" }, + "scrollDown": { + "message": "向下捲動" + }, "search": { "message": "搜尋" }, + "searchAccounts": { + "message": "搜尋帳戶" + }, "searchResults": { "message": "搜尋結果" }, @@ -784,34 +1315,89 @@ "message": "助憶詞將可協助您用更簡單的方式備份帳戶資訊。" }, "secretBackupPhraseWarning": { - "message": "警告: 絕對不要洩漏您的助憶詞。任何人只要得知助憶詞代表他可以竊取您所有的以太幣和代幣。" + "message": "警告:絕對不要洩漏您的助憶詞。任何人只要得知助憶詞就能竊取您所有的以太幣和代幣。" + }, + "secretPhrase": { + "message": "在輸入您的助憶詞來還原您的金庫。" + }, + "secureWallet": { + "message": "Secure Wallet" }, "securityAndPrivacy": { "message": "安全&隱私" }, + "seedPhraseIntroSidebarBulletFour": { + "message": "寫下來並且存放在不同的秘密地點。" + }, + "seedPhraseIntroSidebarBulletOne": { + "message": "儲存在密碼管理器裡" + }, + "seedPhraseIntroSidebarBulletThree": { + "message": "存在安全保管箱裡。" + }, + "seedPhraseIntroSidebarBulletTwo": { + "message": "存在銀行保險箱。" + }, + "seedPhraseIntroSidebarCopyOne": { + "message": "您的助憶詞就是您的錢包與資金的「總鑰匙」。" + }, + "seedPhraseIntroSidebarCopyThree": { + "message": "如果有人向您詢問您的助憶詞,他們十之八九是在詐騙您。" + }, + "seedPhraseIntroSidebarCopyTwo": { + "message": "永遠永遠不要洩漏您的助憶詞,即使是 MetaMask 官方也一樣!" + }, + "seedPhraseIntroSidebarTitleOne": { + "message": "什麼是助憶詞?" + }, + "seedPhraseIntroSidebarTitleThree": { + "message": "我應該分享我的助憶詞嗎?" + }, + "seedPhraseIntroSidebarTitleTwo": { + "message": "我該如何存放我的助憶詞?" + }, + "seedPhraseIntroTitle": { + "message": "保護您的錢包" + }, + "seedPhraseIntroTitleCopy": { + "message": "在開始之前,觀賞這段短片來了解何謂助憶詞,以及如何保持您錢包的安全。" + }, "seedPhraseReq": { - "message": "助憶詞為 12 個詞語" + "message": "助憶詞為 12, 15, 18, 21 或 24 個單字" + }, + "selectAccounts": { + "message": "選擇一個或多個帳戶" }, - "selectAHigherGasFee": { - "message": "選擇更高的交易費可加速您的交易處理時間 *" + "selectAll": { + "message": "選擇全部" }, "selectAnAccount": { "message": "選擇帳戶" }, + "selectAnAccountAlreadyConnected": { + "message": "這個帳戶已經連結到 MetaMask 了" + }, "selectEachPhrase": { "message": "請依照正確順序點選助憶詞" }, + "selectHdPath": { + "message": "選擇 HD Path" + }, "selectPathHelp": { "message": "若看不到您已經擁有的 Ledger 帳戶,請嘗試切換路徑為 \"Legacy (MEW / MyCrypto)\"" }, "selectType": { "message": "選擇類型" }, + "selectingAllWillAllow": { + "message": "選擇全部會讓這個網站能瀏覽您目前的全部帳戶。請再次確認您信任這個網站。" + }, "send": { "message": "發送" }, - "sendAmount": { - "message": "發送數量" + "sendSpecifiedTokens": { + "message": "發送 $1", + "description": "Symbol of the specified token" }, "sendTokens": { "message": "發送代幣" @@ -820,10 +1406,10 @@ "message": "設定" }, "showAdvancedGasInline": { - "message": "顯示進階 Gas 控制選項" + "message": "顯示進階 gas 控制選項" }, "showAdvancedGasInlineDescription": { - "message": "在交易時顯示可微調 Gas 價格以及 Gas 上限的功能" + "message": "選擇此項會在傳送或確認畫面顯示可微調 gas 價格以及 gas 上限的功能" }, "showFiatConversionInTestnets": { "message": "在測試網上顯示匯率" @@ -832,10 +1418,19 @@ "message": "選擇此來在測試網上顯示法定貨幣匯率" }, "showHexData": { - "message": "顯示16進位資料" + "message": "顯示十六進位資料" }, "showHexDataDescription": { - "message": "在交易時顯示16進位資料" + "message": "在交易時顯示十六進位資料" + }, + "showIncomingTransactions": { + "message": "顯示傳入的交易" + }, + "showIncomingTransactionsDescription": { + "message": "選擇此項來利用 Etherscan 在交易列表裡顯示傳入的交易" + }, + "showPermissions": { + "message": "顯示權限" }, "showPrivateKeys": { "message": "顯示私鑰" @@ -847,16 +1442,19 @@ "message": "簽署" }, "signNotice": { - "message": "簽署此訊息可能會產生危險地副作用。 \n只從您完全信任的網站上簽署。這種危險的方法,將在未來的版本中被移除。" + "message": "簽署此訊息可能會產生危險的副作用。\n請只從您完全信任的網站上簽署。\n這種危險的方法將在未來的版本中被移除。" }, "signatureRequest": { "message": "請求簽署" }, + "signatureRequest1": { + "message": "訊息" + }, "signed": { "message": "已簽署" }, - "slow": { - "message": "慢" + "skipAccountSecurity": { + "message": "Skip Account Security?" }, "somethingWentWrong": { "message": "糟糕!出了點問題。" @@ -865,13 +1463,35 @@ "message": "加速" }, "speedUpCancellation": { - "message": "加速取消" + "message": "加速這個取消請求" }, "speedUpTransaction": { "message": "加速這筆交易" }, + "spendLimitAmount": { + "message": "花費額度上限" + }, + "spendLimitInsufficient": { + "message": "花費額度上限不足" + }, + "spendLimitInvalid": { + "message": "花費額度上限無效;必須是正值" + }, + "spendLimitPermission": { + "message": "花費額度上限的權限" + }, + "spendLimitRequestedBy": { + "message": "$1 請求的花費額度上限", + "description": "Origin of the site requesting the spend limit" + }, + "spendLimitTooLarge": { + "message": "花費額度上限太大" + }, "stateLogError": { - "message": "在取得狀態紀錄時發生錯誤." + "message": "在取得狀態紀錄時發生錯誤。" + }, + "stateLogFileName": { + "message": "MetaMask 狀態紀錄" }, "stateLogs": { "message": "狀態紀錄" @@ -879,53 +1499,103 @@ "stateLogsDescription": { "message": "狀態紀錄包含您的公開帳戶位址和已傳送的交易資訊" }, + "statusConnected": { + "message": "已連結" + }, + "statusNotConnected": { + "message": "未連結" + }, + "step1LedgerWallet": { + "message": "下載 Ledger 應用程式" + }, + "step1LedgerWalletMsg": { + "message": "下載、安裝、然後輸入密碼來解鎖 $1。", + "description": "$1 represents the `ledgerLiveApp` localization value" + }, + "step1TrezorWallet": { + "message": "插入 Trezor 錢包" + }, + "step1TrezorWalletMsg": { + "message": "直接將錢包連接到電腦上。關於更多使用您的硬體錢包的詳細資訊,$1", + "description": "$1 represents the `hardwareWalletSupportLinkConversion` localization key" + }, + "step2LedgerWallet": { + "message": "插入 Ledger 錢包" + }, "storePhrase": { "message": "您可以用密碼管理系統例如 1Password 等軟體儲存助憶詞。" }, + "submit": { + "message": "傳送" + }, "submitted": { - "message": "已送出" + "message": "已傳送" + }, + "support": { + "message": "支援" }, "supportCenter": { "message": "造訪我們的協助中心" }, + "swapSearchNameOrAddress": { + "message": "用名稱搜尋或貼上地址" + }, + "switchEthereumChainConfirmationDescription": { + "message": "這將在 MetaMask 中將目前選擇的網路切換到剛才新增的網路:" + }, + "switchEthereumChainConfirmationTitle": { + "message": "允許這個網站切換網路?" + }, + "switchNetwork": { + "message": "切換網路" + }, "switchNetworks": { "message": "切換網路" }, + "switchToThisAccount": { + "message": "切換到這個帳戶" + }, + "switchingNetworksCancelsPendingConfirmations": { + "message": "切換網路將會取消所有等待確認的請求" + }, "symbol": { "message": "符號" }, "symbolBetweenZeroTwelve": { - "message": "符號不得超過11個字符。" + "message": "符號不得超過 11 個字元。" }, "syncWithMobile": { - "message": "和移動裝置同步" + "message": "和行動裝置同步" }, "syncWithMobileBeCareful": { "message": "掃描代碼時確保沒有其他人在看你的螢幕" }, "syncWithMobileComplete": { - "message": "你的資料已成功同步。開始活用 MetaMask 移動 app!" + "message": "你的資料已成功同步。開始活用 MetaMask 行動應用程式!" }, "syncWithMobileDesc": { - "message": "你可以用移動裝置同步帳號與資訊。開啟 MetaMask 移動 app,至「設定」並點擊「自瀏覽器擴充功能同步」" + "message": "你可以用行動裝置同步帳戶與資訊。開啟 MetaMask 行動應用程式,至「設定」並點擊「自瀏覽器擴充功能同步」" }, "syncWithMobileDescNewUsers": { - "message": "如你是第一次開啟 MetaMask 移動 app,只要跟著手機上的指示操作即可。" + "message": "如果您是第一次開啟 MetaMask 行動應用程式,只要跟著手機上的指示操作即可。" }, "syncWithMobileScanThisCode": { - "message": "用你的 MetaMask 移動 app 掃描此代碼" + "message": "用您的 MetaMask 行動應用程式 掃描此條碼" }, "syncWithMobileTitle": { - "message": "和移動裝置同步" + "message": "和行動裝置同步" }, "terms": { "message": "使用條款" }, + "termsOfService": { + "message": "服務條款" + }, "testFaucet": { - "message": "測試水管" + "message": "測試水龍頭" }, "thisWillCreate": { - "message": "這將創建新的錢包與助記詞" + "message": "這將創建新的錢包與助憶詞" }, "tips": { "message": "提示" @@ -933,6 +1603,10 @@ "to": { "message": "目的帳戶" }, + "toAddress": { + "message": "傳送到:$1", + "description": "$1 is the address to include in the To label. It is typically shortened first using shortenAddress" + }, "token": { "message": "代碼" }, @@ -940,11 +1614,17 @@ "message": "已加入過此代幣。" }, "tokenContractAddress": { - "message": "代幣合同位址" + "message": "代幣合約位址" + }, + "tokenDecimalFetchFailed": { + "message": "需要填入代幣的小數位數。" }, "tokenSymbol": { "message": "代幣代號" }, + "tooltipApproveButton": { + "message": "我了解了" + }, "total": { "message": "總量" }, @@ -952,54 +1632,61 @@ "message": "交易" }, "transactionCancelAttempted": { - "message": "交易取消請求 手續費 $1 時間 $2" + "message": "交易取消請求,手續費 $1 @ $2" }, "transactionCancelSuccess": { - "message": "交易取消成功 $2" + "message": "交易成功取消 @ $2" }, "transactionConfirmed": { - "message": "交易確認 時間 $2." + "message": "交易確認 @ $2。" }, "transactionCreated": { - "message": "交易產生 數量 $1 時間 $2" + "message": "交易建立,數量 $1 @ $2。" }, "transactionDropped": { - "message": "交易廢除 時間 $2" + "message": "交易被捨棄 @ $2。" }, "transactionError": { - "message": "交易失敗。合約代碼拋出錯誤資訊" + "message": "交易失敗。合約程式碼拋出錯誤。" }, "transactionErrorNoContract": { - "message": "合約位址錯誤" + "message": "嘗試在非合約位址呼叫合約函式。" }, "transactionErrored": { - "message": "交易錯誤" + "message": "交易遇到錯誤。" }, "transactionFee": { - "message": "交易費" + "message": "交易手續費" }, "transactionResubmitted": { - "message": "交易重新送出 手續費提高至 $1 時間 $2" + "message": "交易重新送出,手續費提高至 $1 @ $2" }, "transactionSubmitted": { - "message": "交易送出 手續費 $1 時間 $2" + "message": "交易送出,手續費 $1 @ $2。" }, "transactionUpdated": { - "message": "交易狀態更新 時間 $2" + "message": "交易狀態更新於 $2。" }, "transfer": { "message": "交易" }, "transferBetweenAccounts": { - "message": "在我的帳號間轉帳" + "message": "在我的帳戶間轉帳" }, "transferFrom": { "message": "交易來源" }, + "troubleConnectingToWallet": { + "message": "我們在連線到您的 $1 的時候遇到問題,試著檢查 $2 然後再試一次。", + "description": "$1 is the wallet device name; $2 is a link to wallet connection guide" + }, "troubleTokenBalances": { - "message": "無法取得代幣餘額。您k可以到這裡查看 ", + "message": "無法取得代幣餘額。您可以到這裡查看 ", "description": "Followed by a link (here) to view token balances" }, + "trustSiteApprovePermission": { + "message": "您信任這個網站嗎?當您授予這個權限,$1 就能提領您的 $2 並且代替您自動發送交易。" + }, "tryAgain": { "message": "再試一次" }, @@ -1027,17 +1714,33 @@ "unknownQrCode": { "message": "錯誤:無法辨識 QR code" }, + "unlimited": { + "message": "無限" + }, "unlock": { "message": "解鎖" }, "unlockMessage": { "message": "去中心化網路世界等待著您" }, + "unrecognizedChain": { + "message": "無法辨識這個自訂網路。我們建議您先$1再繼續。", + "description": "$1 is a clickable link with text defined by the 'unrecognizedChanLinkText' key. The link will open to instructions for users to validate custom network details." + }, "updatedWithDate": { "message": "更新時間 $1" }, "urlErrorMsg": { - "message": "URIs 需要加入適當的 HTTP/HTTPS 前綴字" + "message": "URL 需要以適當的 HTTP/HTTPS 作為開頭" + }, + "urlExistsErrorMsg": { + "message": "URL 已經在既有的網路列表裡了" + }, + "usePhishingDetection": { + "message": "使用網路釣魚偵測" + }, + "usePhishingDetectionDescription": { + "message": "遇到針對以太坊使用者的釣魚網域名稱的時候顯示警告" }, "usedByClients": { "message": "可用於各種不同的客戶端" @@ -1045,24 +1748,68 @@ "userName": { "message": "使用者名稱" }, + "verifyThisTokenDecimalOn": { + "message": "代幣的小數位數可以在 $1 找到", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, + "verifyThisTokenOn": { + "message": "在 $1 驗證這個代幣的資訊", + "description": "Points the user to etherscan as a place they can verify information about a token. $1 is replaced with the translation for \"etherscan\"" + }, "viewAccount": { "message": "查看帳戶" }, + "viewAllDetails": { + "message": "查看所有詳情" + }, "viewContact": { "message": "觀看聯絡資訊" }, + "viewMore": { + "message": "檢視更多" + }, + "viewOnCustomBlockExplorer": { + "message": "在 $1 瀏覽", + "description": "$1 is the action type. e.g (Account, Transaction, Swap) and $2 is the Custom Block Exporer URL" + }, + "viewOnEtherscan": { + "message": "在 Etherscan 上瀏覽", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, + "viewinExplorer": { + "message": "在 Explorer 上瀏覽", + "description": "$1 is the action type. e.g (Account, Transaction, Swap)" + }, "visitWebSite": { "message": "造訪我們的網站" }, + "walletConnectionGuide": { + "message": "我們的硬體錢包連線指南" + }, + "web3ShimUsageNotification": { + "message": "我們注意到目前的網站試著要使用已經移除的 window.web3 API。如果網站看起來壞了,請$1了解更多資訊。", + "description": "$1 is a clickable link." + }, "welcome": { "message": "歡迎來到 MetaMask" }, "welcomeBack": { "message": "歡迎回來!" }, + "whatsThis": { + "message": "這是什麼?" + }, "writePhrase": { "message": "將助憶詞寫在紙上,並保存在安全的場所。若想要更安全,將助憶詞分別寫在不同紙張上並存放在不同的地方。" }, + "xOfY": { + "message": "$1 之 $2", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total, and $1 is a count towards that total" + }, + "xOfYPending": { + "message": "$1 之 $2 等待中", + "description": "$1 and $2 are intended to be two numbers, where $2 is a total number of pending confirmations, and $1 is a count towards that total" + }, "yesLetsTry": { "message": "了解,試試看" }, diff --git a/app/build-types/beta/images/beta-mascot.json b/app/build-types/beta/images/beta-mascot.json deleted file mode 100644 index 4db57f543c6b..000000000000 --- a/app/build-types/beta/images/beta-mascot.json +++ /dev/null @@ -1,830 +0,0 @@ -{ - "chunks": [ - { - "faces": [ - [0, 1, 2], - [2, 3, 0], - [4, 5, 2], - [6, 3, 2], - [2, 5, 6], - [7, 8, 9], - [10, 3, 6], - [10, 50, 7], - [7, 3, 10], - [7, 9, 3], - [49, 0, 9], - [3, 9, 0], - [2, 1, 4] - ], - "name": "left ear", - "gradient": "left-ear-gradient" - }, - { - "faces": [ - [53, 54, 55], - [55, 56, 53], - [57, 56, 55], - [58, 59, 55], - [55, 54, 58], - [60, 61, 62], - [63, 58, 54], - [63, 60, 89], - [60, 63, 54], - [60, 54, 61], - [88, 61, 53], - [54, 53, 61], - [55, 59, 57] - ], - "name": "right ear", - "gradient": "right-ear-gradient" - }, - { - "color": [22, 22, 22], - "faces": [[11, 12, 13]], - "name": "left eye" - }, - { - "color": [22, 22, 22], - "faces": [[64, 65, 66]], - "name": "right eye" - }, - { - "faces": [ - [14, 15, 11], - [11, 16, 14] - ], - "name": "left inner eye", - "gradient": "left-inner-eye-gradient" - }, - { - "faces": [[17, 12, 18]], - "name": "left outer eye", - "gradient": "left-outer-eye-gradient" - }, - { - "faces": [[41, 64, 37]], - "name": "right lower inner eye", - "gradient": "right-inner-eye-gradient" - }, - { - "faces": [[67, 68, 66]], - "name": "right outer eye", - "gradient": "right-outer-eye-gradient" - }, - { - "color": [192, 173, 158], - "faces": [ - [19, 20, 21], - [21, 22, 19], - [20, 19, 23], - [23, 24, 20], - [23, 25, 24], - [19, 22, 26], - [26, 27, 19], - [23, 28, 29], - [23, 29, 30], - [25, 23, 30], - [29, 51, 52], - [52, 30, 29], - [27, 26, 69], - [69, 70, 27], - [70, 71, 72], - [72, 27, 70], - [72, 71, 73], - [51, 74, 72], - [52, 51, 72], - [73, 52, 72], - [19, 27, 74], - [74, 28, 19], - [51, 29, 28], - [28, 74, 51], - [74, 27, 72], - [28, 23, 19] - ], - "name": "lower chin" - }, - { - "color": [215, 193, 179], - "faces": [ - [21, 20, 24], - [24, 31, 21] - ], - "name": "left lower snout" - }, - { - "color": [215, 193, 179], - "faces": [ - [69, 71, 70], - [71, 69, 75] - ], - "name": "right lower snout" - }, - { - "faces": [[31, 24, 18]], - "name": "left upper snout", - "gradient": "left-upper-snout-gradient" - }, - { - "faces": [ - [6, 5, 16], - [16, 17, 6] - ], - "name": "left forehead", - "gradient": "left-forehead-gradient" - }, - { - "faces": [ - [24, 32, 33], - [33, 34, 24] - ], - "name": "left lower cheek", - "gradient": "left-lower-cheek-gradient" - }, - { - "faces": [[5, 4, 35]], - "name": "left top ear", - "gradient": "left-top-ear-gradient" - }, - { - "faces": [[75, 68, 71]], - "name": "right upper snout", - "gradient": "right-upper-snout-gradient" - }, - { - "faces": [ - [58, 67, 40], - [40, 59, 58] - ], - "name": "right forhead", - "gradient": "right-forehead-gradient" - }, - { - "faces": [ - [71, 76, 77], - [77, 78, 71] - ], - "name": "right lower cheek", - "gradient": "right-lower-cheek-gradient" - }, - { - "faces": [[24, 34, 18]], - "name": "left middle cheek", - "gradient": "left-middle-cheek-gradient" - }, - { - "color": [35, 151, 119], - "faces": [ - [16, 13, 12], - [12, 17, 16], - [13, 16, 11] - ], - "name": "left above eye" - }, - { - "faces": [[71, 68, 76]], - "name": "right middle cheek", - "gradient": "right-middle-cheek-gradient" - }, - { - "color": [35, 151, 119], - "faces": [ - [40, 67, 66], - [66, 65, 40], - [65, 64, 40] - ], - "name": "right above eye" - }, - { - "color": [22, 22, 22], - "faces": [ - [36, 15, 37], - [37, 38, 36], - [31, 39, 22], - [22, 21, 31], - [31, 15, 36], - [36, 39, 31], - [75, 69, 26], - [26, 80, 75], - [75, 80, 38], - [38, 37, 75], - [38, 80, 39], - [39, 36, 38], - [39, 80, 26], - [26, 22, 39] - ], - "name": "nose" - }, - { - "faces": [ - [17, 33, 10], - [17, 18, 34], - [34, 33, 17], - [10, 6, 17] - ], - "name": "left upper cheek", - "gradient": "left-upper-cheek-gradient" - }, - { - "faces": [ - [11, 15, 31], - [31, 18, 11], - [18, 12, 11] - ], - "name": "left below eye", - "gradient": "left-below-eye-gradient" - }, - { - "faces": [ - [14, 16, 40], - [40, 41, 14], - [59, 5, 35], - [35, 79, 59], - [14, 41, 37], - [37, 15, 14], - [5, 59, 40], - [40, 16, 5] - ], - "name": "forehead", - "gradient": "forehead-gradient" - }, - { - "faces": [ - [67, 63, 77], - [67, 77, 76], - [76, 68, 67], - [63, 67, 58] - ], - "name": "right upper cheek", - "gradient": "right-upper-cheek-gradient" - }, - { - "faces": [ - [64, 68, 75], - [75, 37, 64], - [68, 64, 66] - ], - "name": "right below eye", - "gradient": "right-below-eye-gradient" - }, - { - "faces": [ - [35, 4, 42], - [4, 1, 42], - [42, 43, 44], - [44, 35, 42], - [45, 43, 42], - [42, 10, 45], - [30, 32, 24], - [24, 25, 30], - [30, 33, 32], - [33, 30, 10], - [44, 43, 46], - [43, 45, 47], - [47, 46, 43], - [48, 47, 45], - [45, 30, 48], - [30, 45, 10], - [49, 42, 0], - [8, 7, 42], - [50, 42, 7], - [50, 10, 42], - [1, 0, 42], - [42, 9, 8], - [42, 49, 9], - [79, 81, 57], - [57, 81, 56], - [82, 79, 35], - [35, 44, 82], - [81, 79, 82], - [82, 83, 81], - [84, 63, 81], - [81, 83, 84], - [44, 46, 85], - [85, 82, 44], - [52, 73, 71], - [71, 78, 52], - [52, 78, 77], - [77, 63, 52], - [82, 85, 83], - [83, 85, 86], - [86, 84, 83], - [87, 52, 84], - [84, 86, 87], - [52, 63, 84], - [88, 53, 81], - [62, 81, 60], - [89, 60, 81], - [89, 81, 63], - [56, 81, 53], - [81, 62, 61], - [81, 61, 88], - [48, 87, 86], - [86, 47, 48], - [47, 86, 85], - [85, 46, 47], - [48, 30, 52], - [52, 87, 48] - ], - "name": "back", - "gradient": "back-gradient" - }, - { - "faces": [[57, 59, 79]], - "name": "right top ear", - "gradient": "right-top-ear-gradient" - }, - { - "faces": [[64, 41, 40]], - "name": "right inner upper eye", - "gradient": "right-inner-eye-gradient" - } - ], - "gradients": { - "forehead-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#23FE4A" - }, - { - "offset": 1, - "stop-color": "#BAD8EF" - } - ], - "x1": "50%", - "y1": "20.232164948453608%", - "x2": "50%", - "y2": "74.87123711340206%", - "gradientUnits": "userSpaceOnUse" - }, - "right-upper-cheek-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#20B475" - }, - { - "offset": 1, - "stop-color": "#70BDCE" - } - ], - "x1": "77.19501199040768%", - "y1": "44.68123711340206%", - "x2": "77.19501199040768%", - "y2": "68.2861855670103%", - "gradientUnits": "userSpaceOnUse" - }, - "left-upper-cheek-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#20B475" - }, - { - "offset": 1, - "stop-color": "#70BDCE" - } - ], - "x1": "22.820719424460435%", - "y1": "44.68123711340206%", - "x2": "22.820719424460435%", - "y2": "68.2861855670103%", - "gradientUnits": "userSpaceOnUse" - }, - "right-below-eye-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#85BBE1" - }, - { - "offset": 1, - "stop-color": "#7CCACA" - } - ], - "x1": "54.34676258992806%", - "y1": "68.26917525773197%", - "x2": "65.3001438848921%", - "y2": "68.26917525773197%", - "gradientUnits": "userSpaceOnUse" - }, - "left-below-eye-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#7CCACA" - }, - { - "offset": 1, - "stop-color": "#85BBE1" - } - ], - "x1": "34.731223021582736%", - "y1": "68.26917525773197%", - "x2": "45.65323741007194%", - "y2": "68.26917525773197%", - "gradientUnits": "userSpaceOnUse" - }, - "right-ear-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#074F1E" - }, - { - "offset": 0.4286, - "stop-color": "#05541C" - }, - { - "offset": 0.62, - "stop-color": "#006A13" - }, - { - "offset": 1, - "stop-color": "#007514" - } - ], - "x1": "61.443549160671466%", - "y1": "44.51773195876289%", - "x2": "93.802206235012%", - "y2": "24.439072164948456%", - "gradientUnits": "userSpaceOnUse" - }, - "left-ear-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#074F1E" - }, - { - "offset": 0.4286, - "stop-color": "#05541C" - }, - { - "offset": 0.62, - "stop-color": "#006A13" - }, - { - "offset": 1, - "stop-color": "#007514" - } - ], - "x1": "32.7432134292566%", - "y1": "44.33329896907217%", - "x2": "4.853390887290168%", - "y2": "19.18181443298969%", - "gradientUnits": "userSpaceOnUse" - }, - "left-outer-eye-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#43C3A2" - }, - { - "offset": 1, - "stop-color": "#4FAFC0" - }, - { - "offset": 1, - "stop-color": "#4FAFC0" - } - ], - "x1": "27.575539568345324%", - "y1": "60.519278350515464%", - "x2": "34.982350119904076%", - "y2": "60.519278350515464%", - "gradientUnits": "userSpaceOnUse" - }, - "right-outer-eye-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#4FAFC0" - }, - { - "offset": 1, - "stop-color": "#43C3A2" - } - ], - "x1": "65.01764988009592%", - "y1": "60.519278350515464%", - "x2": "72.42446043165468%", - "y2": "60.519278350515464%", - "gradientUnits": "userSpaceOnUse" - }, - "right-lower-cheek-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#59ADCB" - }, - { - "offset": 1, - "stop-color": "#436CC8" - } - ], - "x1": "77.93247002398083%", - "y1": "68.15113402061857%", - "x2": "77.93247002398083%", - "y2": "86.82577319587631%", - "gradientUnits": "userSpaceOnUse" - }, - "left-lower-cheek-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#59ADCB" - }, - { - "offset": 1, - "stop-color": "#436CC8" - } - ], - "x1": "22.083165467625896%", - "y1": "68.15113402061857%", - "x2": "22.083165467625896%", - "y2": "86.82577319587631%", - "gradientUnits": "userSpaceOnUse" - }, - "left-top-ear-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#0ED54A" - }, - { - "offset": 1, - "stop-color": "#0ED54A" - } - ], - "x1": "13.954513189448441%", - "y1": "22.055670103092787%", - "x2": "44.146762589928066%", - "y2": "22.055670103092787%", - "gradientUnits": "userSpaceOnUse" - }, - "right-top-ear-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#0ED54A" - }, - { - "offset": 1, - "stop-color": "#11EB36" - } - ], - "x1": "55.85333333333334%", - "y1": "22.055670103092787%", - "x2": "86.04556354916068%", - "y2": "22.055670103092787%", - "gradientUnits": "userSpaceOnUse" - }, - "left-forehead-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#15DC5D" - }, - { - "offset": 1, - "stop-color": "#48CA9F" - } - ], - "x1": "36.3947242206235%", - "y1": "34.11144329896908%", - "x2": "36.3947242206235%", - "y2": "53.59649484536083%", - "gradientUnits": "userSpaceOnUse" - }, - "right-forehead-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#15DC5D" - }, - { - "offset": 1, - "stop-color": "#48CA9F" - } - ], - "x1": "63.6052757793765%", - "y1": "34.11144329896908%", - "x2": "63.6052757793765%", - "y2": "53.59649484536083%", - "gradientUnits": "userSpaceOnUse" - }, - "left-upper-snout-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#54A8CF" - }, - { - "offset": 1, - "stop-color": "#5393E3" - } - ], - "x1": "38.829736211031175%", - "y1": "68.28865979381443%", - "x2": "38.829736211031175%", - "y2": "81.55670103092784%", - "gradientUnits": "userSpaceOnUse" - }, - "right-upper-snout-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#54A8CF" - }, - { - "offset": 1, - "stop-color": "#5393E3" - } - ], - "x1": "61.17026378896883%", - "y1": "68.28865979381443%", - "x2": "61.17026378896883%", - "y2": "81.55670103092784%", - "gradientUnits": "userSpaceOnUse" - }, - "right-middle-cheek-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#32819D" - }, - { - "offset": 0.3363, - "stop-color": "#447DCD" - } - ], - "x1": "69.9137649880096%", - "y1": "51.063505154639174%", - "x2": "69.9137649880096%", - "y2": "85.81041237113402%", - "gradientUnits": "userSpaceOnUse" - }, - "left-middle-cheek-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#32819D" - }, - { - "offset": 0.3363, - "stop-color": "#447DCD" - } - ], - "x1": "30.086330935251798%", - "y1": "68.15092783505153%", - "x2": "30.086330935251798%", - "y2": "81.55752577319588%", - "gradientUnits": "userSpaceOnUse" - }, - "right-inner-eye-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#53A9CB" - }, - { - "offset": 1, - "stop-color": "#44C0A6" - } - ], - "x1": "55.38244604316547%", - "y1": "74.87123711340206%", - "x2": "55.38244604316547%", - "y2": "53.59659793814433%", - "gradientUnits": "userSpaceOnUse" - }, - "left-inner-eye-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#53A9CB" - }, - { - "offset": 1, - "stop-color": "#44C0A6" - } - ], - "x1": "43.58177458033573%", - "y1": "64.2339175257732%", - "x2": "45.65323741007194%", - "y2": "64.2339175257732%", - "gradientUnits": "userSpaceOnUse" - }, - "back-gradient": { - "type": "linear", - "stops": [ - { - "stop-color": "#27FC4E" - }, - { - "offset": 1, - "stop-color": "#446FC9" - } - ], - "x1": "50%", - "y1": "0%", - "x2": "50%", - "y2": "100%", - "gradientUnits": "userSpaceOnUse" - } - }, - "positions": [ - [111.024597, 52.604599, 46.225899], - [114.025002, 87.673302, 58.9818], - [66.192001, 80.898003, 55.394299], - [72.113297, 35.491798, 30.871401], - [97.804497, 116.560997, 73.978798], - [16.7623, 58.010899, 58.078201], - [52.608898, 30.3641, 42.556099], - [106.881401, 31.945499, 46.9133], - [113.484596, 38.6049, 49.121498], - [108.6633, 43.2332, 46.315399], - [101.216599, 15.9822, 46.308201], - [16.6605, -16.2883, 93.618698], - [40.775002, -10.2288, 85.276398], - [23.926901, -2.5103, 86.736504], - [11.1691, -7.0037, 99.377602], - [9.5692, -34.393902, 141.671997], - [12.596, 7.1655, 88.740997], - [61.180901, 8.8142, 76.996803], - [39.719501, -28.927099, 88.963799], - [13.7962, -68.575699, 132.057007], - [15.2674, -62.32, 129.688004], - [14.8446, -52.6096, 140.113007], - [12.8917, -49.771599, 144.740997], - [35.604198, -71.758003, 81.063904], - [47.462502, -68.606102, 63.369701], - [38.2486, -64.730202, 38.909901], - [-12.8917, -49.771599, 144.740997], - [-13.7962, -68.575699, 132.057007], - [17.802099, -71.758003, 81.063904], - [19.1243, -69.0168, 49.420101], - [38.2486, -66.275597, 17.776199], - [12.8928, -36.703499, 141.671997], - [109.283997, -93.589897, 27.824301], - [122.117996, -36.8894, 35.025002], - [67.7668, -30.197001, 78.417801], - [33.180698, 101.851997, 25.3186], - [9.4063, -35.589802, 150.722], - [-9.5692, -34.393902, 141.671997], - [-9.4063, -35.589802, 150.722], - [11.4565, -37.899399, 150.722], - [-12.596, 7.1655, 88.740997], - [-11.1691, -7.0037, 99.377602], - [70.236504, 62.836201, -3.9475], - [47.263401, 54.293999, -27.414801], - [28.7302, 91.731102, -24.972601], - [69.167603, 6.5862, -12.7757], - [28.7302, 49.1003, -48.3596], - [31.903, 5.692, -47.821999], - [35.075802, -34.432899, -16.280899], - [115.284103, 48.681499, 48.684101], - [110.842796, 28.4821, 49.176201], - [-19.1243, -69.0168, 49.420101], - [-38.2486, -66.275597, 17.776199], - [-111.024597, 52.604599, 46.225899], - [-72.113297, 35.491798, 30.871401], - [-66.192001, 80.898003, 55.394299], - [-114.025002, 87.673302, 58.9818], - [-97.804497, 116.560997, 73.978798], - [-52.608898, 30.3641, 42.556099], - [-16.7623, 58.010899, 58.078201], - [-106.881401, 31.945499, 46.9133], - [-108.6633, 43.2332, 46.315399], - [-113.484596, 38.6049, 49.121498], - [-101.216599, 15.9822, 46.308201], - [-16.6605, -16.2883, 93.618698], - [-23.926901, -2.5103, 86.736504], - [-40.775002, -10.2288, 85.276398], - [-61.180901, 8.8142, 76.996803], - [-39.719501, -28.927099, 88.963799], - [-14.8446, -52.6096, 140.113007], - [-15.2674, -62.32, 129.688004], - [-47.462502, -68.606102, 63.369701], - [-35.604198, -71.758003, 81.063904], - [-38.2486, -64.730202, 38.909901], - [-17.802099, -71.758003, 81.063904], - [-12.8928, -36.703499, 141.671997], - [-67.7668, -30.197001, 78.417801], - [-122.117996, -36.8894, 35.025002], - [-109.283997, -93.589897, 27.824301], - [-33.180698, 101.851997, 25.3186], - [-11.4565, -37.899399, 150.722], - [-70.236504, 62.836201, -3.9475], - [-28.7302, 91.731102, -24.972601], - [-47.263401, 54.293999, -27.414801], - [-69.167603, 6.5862, -12.7757], - [-28.7302, 49.1003, -48.3596], - [-31.903, 5.692, -47.821999], - [-35.075802, -34.432899, -16.280899], - [-115.284103, 48.681499, 48.684101], - [-110.842796, 28.4821, 49.176201] - ] -} diff --git a/app/build-types/beta/images/icon-128.png b/app/build-types/beta/images/icon-128.png index 97762ff9988a..95b2ec2c773e 100644 Binary files a/app/build-types/beta/images/icon-128.png and b/app/build-types/beta/images/icon-128.png differ diff --git a/app/build-types/beta/images/icon-16.png b/app/build-types/beta/images/icon-16.png index 216b4ad06ec9..e1c32722f144 100644 Binary files a/app/build-types/beta/images/icon-16.png and b/app/build-types/beta/images/icon-16.png differ diff --git a/app/build-types/beta/images/icon-19.png b/app/build-types/beta/images/icon-19.png index f7da09c5ea9a..5073efb79648 100644 Binary files a/app/build-types/beta/images/icon-19.png and b/app/build-types/beta/images/icon-19.png differ diff --git a/app/build-types/beta/images/icon-32.png b/app/build-types/beta/images/icon-32.png index fb2a55a5712c..f0ac3fb28bdc 100644 Binary files a/app/build-types/beta/images/icon-32.png and b/app/build-types/beta/images/icon-32.png differ diff --git a/app/build-types/beta/images/icon-34.png b/app/build-types/beta/images/icon-34.png new file mode 100644 index 000000000000..bd70156f3f19 Binary files /dev/null and b/app/build-types/beta/images/icon-34.png differ diff --git a/app/build-types/beta/images/icon-38.png b/app/build-types/beta/images/icon-38.png index e9449d4d064f..ae868f268dcf 100644 Binary files a/app/build-types/beta/images/icon-38.png and b/app/build-types/beta/images/icon-38.png differ diff --git a/app/build-types/beta/images/icon-48.png b/app/build-types/beta/images/icon-48.png index 0fdfeb25cca3..306a7bce07c9 100644 Binary files a/app/build-types/beta/images/icon-48.png and b/app/build-types/beta/images/icon-48.png differ diff --git a/app/build-types/beta/images/icon-512.png b/app/build-types/beta/images/icon-512.png index 09690ab1b866..0b9ccdc08832 100644 Binary files a/app/build-types/beta/images/icon-512.png and b/app/build-types/beta/images/icon-512.png differ diff --git a/app/build-types/beta/images/icon-64.png b/app/build-types/beta/images/icon-64.png index b60b7d5d5e9c..2bcda034c529 100644 Binary files a/app/build-types/beta/images/icon-64.png and b/app/build-types/beta/images/icon-64.png differ diff --git a/app/build-types/beta/images/info-logo.png b/app/build-types/beta/images/info-logo.png index 97762ff9988a..a855a15b150b 100644 Binary files a/app/build-types/beta/images/info-logo.png and b/app/build-types/beta/images/info-logo.png differ diff --git a/app/build-types/beta/images/logo/metamask-fox.svg b/app/build-types/beta/images/logo/metamask-fox.svg index 53698aefd1ac..b6516605d1d8 100644 --- a/app/build-types/beta/images/logo/metamask-fox.svg +++ b/app/build-types/beta/images/logo/metamask-fox.svg @@ -1,130 +1,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/build-types/beta/manifest/chrome.json b/app/build-types/beta/manifest/chrome.json index 2892a4785d69..4604c4c08d9c 100644 --- a/app/build-types/beta/manifest/chrome.json +++ b/app/build-types/beta/manifest/chrome.json @@ -1,4 +1,4 @@ { "description": "THIS IS THE METAMASK EXTENSION BETA, INTENDED FOR BETA TESTING", - "name": "MetaMask BETA" + "name": "MetaMask Beta" } diff --git a/app/images/aurora.png b/app/images/aurora.png new file mode 100644 index 000000000000..5c59ca5eb91b Binary files /dev/null and b/app/images/aurora.png differ diff --git a/app/images/icons/icon-minus-outine.svg b/app/images/icons/icon-minus-outline.svg similarity index 100% rename from app/images/icons/icon-minus-outine.svg rename to app/images/icons/icon-minus-outline.svg diff --git a/app/images/icons/icon-search-filled.svg b/app/images/icons/icon-search-filled.svg index 88b36fc089da..267caca92714 100644 --- a/app/images/icons/icon-search-filled.svg +++ b/app/images/icons/icon-search-filled.svg @@ -1,3 +1,3 @@ - + diff --git a/app/images/icons/icon-user-cirlce-add-filled.svg b/app/images/icons/icon-user-cirlce-add-filled.svg deleted file mode 100644 index 01ffc6c9cefe..000000000000 --- a/app/images/icons/icon-user-cirlce-add-filled.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/app/images/unsLogo.svg b/app/images/unsLogo.svg new file mode 100644 index 000000000000..f6f53a7180e1 --- /dev/null +++ b/app/images/unsLogo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/manifest/v2/_base.json b/app/manifest/v2/_base.json index d10900224f27..90038b668af4 100644 --- a/app/manifest/v2/_base.json +++ b/app/manifest/v2/_base.json @@ -71,6 +71,16 @@ "activeTab", "webRequest", "*://*.eth/", + "*://*.crypto/", + "*://*.x/", + "*://*.nft/", + "*://*.dao/", + "*://*.bitcoin/", + "*://*.coin/", + "*://*.wallet/", + "*://*.blockchain/", + "*://*.888/", + "*://*.zil/", "notifications" ], "short_name": "__MSG_appName__" diff --git a/app/manifest/v3/_base.json b/app/manifest/v3/_base.json index 696a4d62e551..728ce120be8d 100644 --- a/app/manifest/v3/_base.json +++ b/app/manifest/v3/_base.json @@ -67,12 +67,24 @@ "name": "__MSG_appName__", "permissions": [ "activeTab", + "alarms", "clipboardWrite", "notifications", "scripting", "storage", "unlimitedStorage", - "webRequest" + "webRequest", + "*://*.eth/", + "*://*.crypto/", + "*://*.x/", + "*://*.nft/", + "*://*.dao/", + "*://*.bitcoin/", + "*://*.coin/", + "*://*.wallet/", + "*://*.blockchain/", + "*://*.888/", + "*://*.zil/" ], "short_name": "__MSG_appName__" } diff --git a/app/scripts/account-import-strategies/account-import-strategies.test.js b/app/scripts/account-import-strategies/account-import-strategies.test.js index 7886f1717256..0c2c6fc3aa31 100644 --- a/app/scripts/account-import-strategies/account-import-strategies.test.js +++ b/app/scripts/account-import-strategies/account-import-strategies.test.js @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { stripHexPrefix } from 'ethereumjs-util'; +import { stripHexPrefix } from '../../../shared/modules/hexstring-utils'; import accountImporter from '.'; describe('Account Import Strategies', function () { diff --git a/app/scripts/account-import-strategies/index.js b/app/scripts/account-import-strategies/index.js index ce52132aab3e..e4f13a0d0277 100644 --- a/app/scripts/account-import-strategies/index.js +++ b/app/scripts/account-import-strategies/index.js @@ -1,13 +1,9 @@ import log from 'loglevel'; import Wallet from 'ethereumjs-wallet'; import importers from 'ethereumjs-wallet/thirdparty'; -import { - toBuffer, - isValidPrivate, - bufferToHex, - stripHexPrefix, -} from 'ethereumjs-util'; +import { toBuffer, isValidPrivate, bufferToHex } from 'ethereumjs-util'; import { addHexPrefix } from '../lib/util'; +import { stripHexPrefix } from '../../../shared/modules/hexstring-utils'; const accountImporter = { importAccount(strategy, args) { diff --git a/app/scripts/app-init.js b/app/scripts/app-init.js index 4ae247c5ba3a..450c5959737e 100644 --- a/app/scripts/app-init.js +++ b/app/scripts/app-init.js @@ -132,12 +132,27 @@ chrome.runtime.onMessage.addListener(() => { * MAIN world injection does not work properly via manifest * https://bugs.chromium.org/p/chromium/issues/detail?id=634381 */ -chrome.scripting.registerContentScripts([ - { - id: 'inpage', - matches: ['file://*/*', 'http://*/*', 'https://*/*'], - js: ['inpage.js'], - runAt: 'document_start', - world: 'MAIN', - }, -]); +const registerInPageContentScript = async () => { + try { + await chrome.scripting.registerContentScripts([ + { + id: 'inpage', + matches: ['file://*/*', 'http://*/*', 'https://*/*'], + js: ['inpage.js'], + runAt: 'document_start', + world: 'MAIN', + }, + ]); + } catch (err) { + /** + * An error occurs when app-init.js is reloaded. Attempts to avoid the duplicate script error: + * 1. registeringContentScripts inside runtime.onInstalled - This caused a race condition + * in which the provider might not be loaded in time. + * 2. await chrome.scripting.getRegisteredContentScripts() to check for an existing + * inpage script before registering - The provider is not loaded on time. + */ + console.warn(`Dropped attempt to register inpage content script. ${err}`); + } +}; + +registerInPageContentScript(); diff --git a/app/scripts/background.js b/app/scripts/background.js index 084a0f0e696f..486831e5fbbc 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -7,15 +7,15 @@ import pump from 'pump'; import debounce from 'debounce-stream'; import log from 'loglevel'; import browser from 'webextension-polyfill'; -import { storeAsStream, storeTransformStream } from '@metamask/obs-store'; +import { storeAsStream } from '@metamask/obs-store'; import PortStream from 'extension-port-stream'; -import { captureException } from '@sentry/browser'; import { ethErrors } from 'eth-rpc-errors'; import { ENVIRONMENT_TYPE_POPUP, ENVIRONMENT_TYPE_NOTIFICATION, ENVIRONMENT_TYPE_FULLSCREEN, + EXTENSION_MESSAGES, PLATFORM_FIREFOX, } from '../../shared/constants/app'; import { SECOND } from '../../shared/constants/time'; @@ -26,6 +26,7 @@ import { EVENT_NAMES, TRAITS, } from '../../shared/constants/metametrics'; +import { checkForLastErrorAndLog } from '../../shared/modules/browser-runtime.utils'; import { isManifestV3 } from '../../shared/modules/mv3.utils'; import { maskObject } from '../../shared/modules/object.utils'; import migrations from './migrations'; @@ -46,6 +47,7 @@ import rawFirstTimeState from './first-time-state'; import getFirstPreferredLangCode from './lib/get-first-preferred-lang-code'; import getObjStructure from './lib/getObjStructure'; import setupEnsIpfsResolver from './lib/ens-ipfs/setup'; +import setupUnsIpfsResolver from './lib/uns-ipfs/setup'; import { getPlatform } from './lib/util'; /* eslint-enable import/first */ @@ -80,7 +82,7 @@ const localStore = inTest ? new ReadOnlyNetworkStore() : new LocalStore(); let versionedData; if (inTest || process.env.METAMASK_DEBUG) { - global.metamaskGetState = localStore.get.bind(localStore); + global.stateHooks.metamaskGetState = localStore.get.bind(localStore); } const phishingPageUrl = new URL(process.env.PHISHING_WARNING_PAGE_URL); @@ -89,19 +91,73 @@ const ONE_SECOND_IN_MILLISECONDS = 1_000; // Timeout for initializing phishing warning page. const PHISHING_WARNING_PAGE_TIMEOUT = ONE_SECOND_IN_MILLISECONDS; +const ACK_KEEP_ALIVE_MESSAGE = 'ACK_KEEP_ALIVE_MESSAGE'; +const WORKER_KEEP_ALIVE_MESSAGE = 'WORKER_KEEP_ALIVE_MESSAGE'; + /** * In case of MV3 we attach a "onConnect" event listener as soon as the application is initialised. * Reason is that in case of MV3 a delay in doing this was resulting in missing first connect event after service worker is re-activated. + * + * @param remotePort */ - const initApp = async (remotePort) => { browser.runtime.onConnect.removeListener(initApp); await initialize(remotePort); log.info('MetaMask initialization complete.'); }; +/** + * Sends a message to the dapp(s) content script to signal it can connect to MetaMask background as + * the backend is not active. It is required to re-connect dapps after service worker re-activates. + * For non-dapp pages, the message will be sent and ignored. + */ +const sendReadyMessageToTabs = async () => { + const tabs = await browser.tabs + .query({ + /** + * Only query tabs that our extension can run in. To do this, we query for all URLs that our + * extension can inject scripts in, which is by using the "" value and __without__ + * the "tabs" manifest permission. If we included the "tabs" permission, this would also fetch + * URLs that we'd not be able to inject in, e.g. chrome://pages, chrome://extension, which + * is not what we'd want. + * + * You might be wondering, how does the "url" param work without the "tabs" permission? + * + * @see {@link https://bugs.chromium.org/p/chromium/issues/detail?id=661311#c1} + * "If the extension has access to inject scripts into Tab, then we can return the url + * of Tab (because the extension could just inject a script to message the location.href)." + */ + url: '', + windowType: 'normal', + }) + .then((result) => { + checkForLastErrorAndLog(); + return result; + }) + .catch(() => { + checkForLastErrorAndLog(); + }); + + /** @todo we should only sendMessage to dapp tabs, not all tabs. */ + for (const tab of tabs) { + browser.tabs + .sendMessage(tab.id, { + name: EXTENSION_MESSAGES.READY, + }) + .then(() => { + checkForLastErrorAndLog(); + }) + .catch(() => { + // An error may happen if the contentscript is blocked from loading, + // and thus there is no runtime.onMessage handler to listen to the message. + checkForLastErrorAndLog(); + }); + } +}; + if (isManifestV3) { browser.runtime.onConnect.addListener(initApp); + sendReadyMessageToTabs(); } else { // initialization flow initialize().catch(log.error); @@ -171,8 +227,10 @@ if (isManifestV3) { async function initialize(remotePort) { const initState = await loadStateFromPersistence(); const initLangCode = await getFirstPreferredLangCode(); - await setupController(initState, initLangCode, remotePort); - await loadPhishingWarningPage(); + setupController(initState, initLangCode, remotePort); + if (!isManifestV3) { + await loadPhishingWarningPage(); + } log.info('MetaMask initialization complete.'); } @@ -287,16 +345,11 @@ async function loadStateFromPersistence() { if (!versionedData) { throw new Error('MetaMask - migrator returned undefined'); } + // this initializes the meta/version data as a class variable to be used for future writes + localStore.setMetadata(versionedData.meta); // write to disk - if (localStore.isSupported) { - localStore.set(versionedData); - } else { - // throw in setTimeout so as to not block boot - setTimeout(() => { - throw new Error('MetaMask - Localstore not supported'); - }); - } + localStore.set(versionedData.data); // return just the data return versionedData.data; @@ -311,7 +364,6 @@ async function loadStateFromPersistence() { * @param {object} initState - The initial state to start the controller with, matches the state that is emitted from the controller. * @param {string} initLangCode - The region code for the language preferred by the current user. * @param {string} remoteSourcePort - remote application port connecting to extension. - * @returns {Promise} After setup is complete. */ function setupController(initState, initLangCode, remoteSourcePort) { // @@ -337,6 +389,7 @@ function setupController(initState, initLangCode, remoteSourcePort) { getOpenMetamaskTabsIds: () => { return openMetamaskTabsIDs; }, + localStore, }); setupEnsIpfsResolver({ @@ -348,13 +401,17 @@ function setupController(initState, initLangCode, remoteSourcePort) { ), provider: controller.provider, }); + setupUnsIpfsResolver({ + getIpfsGateway: controller.preferencesController.getIpfsGateway.bind( + controller.preferencesController, + ), + }); // setup state persistence pump( storeAsStream(controller.store), debounce(1000), - storeTransformStream(versionifyData), - createStreamSink(persistData), + createStreamSink((state) => localStore.set(state)), (error) => { log.error('MetaMask - Persistence pipeline failed', error); }, @@ -362,43 +419,6 @@ function setupController(initState, initLangCode, remoteSourcePort) { setupSentryGetStateGlobal(controller); - /** - * Assigns the given state to the versioned object (with metadata), and returns that. - * - * @param {object} state - The state object as emitted by the MetaMaskController. - * @returns {VersionedData} The state object wrapped in an object that includes a metadata key. - */ - function versionifyData(state) { - versionedData.data = state; - return versionedData; - } - - let dataPersistenceFailing = false; - - async function persistData(state) { - if (!state) { - throw new Error('MetaMask - updated state is missing'); - } - if (!state.data) { - throw new Error('MetaMask - updated state does not have data'); - } - if (localStore.isSupported) { - try { - await localStore.set(state); - if (dataPersistenceFailing) { - dataPersistenceFailing = false; - } - } catch (err) { - // log error so we dont break the pipeline - if (!dataPersistenceFailing) { - dataPersistenceFailing = true; - captureException(err); - } - log.error('error setting state in local store:', err); - } - } - } - // // connect to other contexts // @@ -480,7 +500,15 @@ function setupController(initState, initLangCode, remoteSourcePort) { // Message below if captured by UI code in app/scripts/ui.js which will trigger UI initialisation // This ensures that UI is initialised only after background is ready // It fixes the issue of blank screen coming when extension is loaded, the issue is very frequent in MV3 - remotePort.postMessage({ name: 'CONNECTION_READY' }); + remotePort.postMessage({ name: EXTENSION_MESSAGES.CONNECTION_READY }); + + // If we get a WORKER_KEEP_ALIVE message, we respond with an ACK + remotePort.onMessage.addListener((message) => { + if (message.name === WORKER_KEEP_ALIVE_MESSAGE) { + // To test un-comment this line and wait for 1 minute. An error should be shown on MetaMask UI. + remotePort.postMessage({ name: ACK_KEEP_ALIVE_MESSAGE }); + } + }); } if (processName === ENVIRONMENT_TYPE_POPUP) { @@ -703,8 +731,6 @@ function setupController(initState, initLangCode, remoteSourcePort) { updateBadge(); } - - return Promise.resolve(); } // @@ -786,7 +812,7 @@ browser.runtime.onInstalled.addListener(({ reason }) => { }); function setupSentryGetStateGlobal(store) { - global.sentryHooks.getSentryState = function () { + global.stateHooks.getSentryState = function () { const fullState = store.getState(); const debugState = maskObject({ metamask: fullState }, SENTRY_STATE); return { diff --git a/app/scripts/constants/contracts.js b/app/scripts/constants/contracts.js index 7afbba1f0ef3..19ed411ec57f 100644 --- a/app/scripts/constants/contracts.js +++ b/app/scripts/constants/contracts.js @@ -1,11 +1,5 @@ export const SINGLE_CALL_BALANCES_ADDRESS = '0xb1f8e55c7f64d203c1400b9d8555d050f94adf39'; -export const SINGLE_CALL_BALANCES_ADDRESS_RINKEBY = - '0x9f510b19f1ad66f0dcf6e45559fab0d6752c1db7'; -export const SINGLE_CALL_BALANCES_ADDRESS_ROPSTEN = - '0xb8e671734ce5c8d7dfbbea5574fa4cf39f7a54a4'; -export const SINGLE_CALL_BALANCES_ADDRESS_KOVAN = - '0xb1d3fbb2f83aecd196f474c16ca5d9cffa0d0ffc'; export const SINGLE_CALL_BALANCES_ADDRESS_GOERLI = '0x9788C4E93f9002a7ad8e72633b11E8d1ecd51f9b'; // TODO(SEPOLIA) There is currently no balance call address for Sepolia diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 1ae4167b326c..91ec8f6334b7 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -5,6 +5,8 @@ import browser from 'webextension-polyfill'; import PortStream from 'extension-port-stream'; import { obj as createThoughStream } from 'through2'; +import { EXTENSION_MESSAGES, MESSAGE_TYPE } from '../../shared/constants/app'; +import { checkForLastError } from '../../shared/modules/browser-runtime.utils'; import { isManifestV3 } from '../../shared/modules/mv3.utils'; import shouldInjectProvider from '../../shared/modules/provider-injection'; @@ -44,9 +46,6 @@ let legacyExtMux, legacyPagePublicConfigChannel, notificationTransformStream; -const WORKER_KEEP_ALIVE_INTERVAL = 1000; -const WORKER_KEEP_ALIVE_MESSAGE = 'WORKER_KEEP_ALIVE_MESSAGE'; - const phishingPageUrl = new URL(process.env.PHISHING_WARNING_PAGE_URL); let phishingExtChannel, @@ -82,6 +81,51 @@ function injectScript(content) { } } +/** + * SERVICE WORKER LOGIC + */ + +const WORKER_KEEP_ALIVE_INTERVAL = 1000; +const WORKER_KEEP_ALIVE_MESSAGE = 'WORKER_KEEP_ALIVE_MESSAGE'; +const TIME_45_MIN_IN_MS = 45 * 60 * 1000; + +/** + * Don't run the keep-worker-alive logic for JSON-RPC methods called on initial load. + * This is to prevent the service worker from being kept alive when accounts are not + * connected to the dapp or when the user is not interacting with the extension. + * The keep-alive logic should not work for non-dapp pages. + */ +const IGNORE_INIT_METHODS_FOR_KEEP_ALIVE = [ + MESSAGE_TYPE.GET_PROVIDER_STATE, + MESSAGE_TYPE.SEND_METADATA, +]; + +let keepAliveInterval; +let keepAliveTimer; + +/** + * Running this method will ensure the service worker is kept alive for 45 minutes. + * The first message is sent immediately and subsequent messages are sent at an + * interval of WORKER_KEEP_ALIVE_INTERVAL. + */ +const runWorkerKeepAliveInterval = () => { + clearTimeout(keepAliveTimer); + + keepAliveTimer = setTimeout(() => { + clearInterval(keepAliveInterval); + }, TIME_45_MIN_IN_MS); + + clearInterval(keepAliveInterval); + + browser.runtime.sendMessage({ name: WORKER_KEEP_ALIVE_MESSAGE }); + + keepAliveInterval = setInterval(() => { + if (browser.runtime.id) { + browser.runtime.sendMessage({ name: WORKER_KEEP_ALIVE_MESSAGE }); + } + }, WORKER_KEEP_ALIVE_INTERVAL); +}; + /** * PHISHING STREAM LOGIC */ @@ -93,6 +137,10 @@ function setupPhishingPageStreams() { target: PHISHING_WARNING_PAGE, }); + if (isManifestV3) { + runWorkerKeepAliveInterval(); + } + // create and connect channel muxers // so we can handle the channels individually phishingPageMux = new ObjectMultiplex(); @@ -142,6 +190,9 @@ const setupPhishingExtStreams = () => { error, ), ); + + // eslint-disable-next-line no-use-before-define + phishingExtPort.onDisconnect.addListener(onDisconnectDestroyPhishingStreams); }; /** Destroys all of the phishing extension streams */ @@ -153,19 +204,54 @@ const destroyPhishingExtStreams = () => { phishingExtChannel.removeAllListeners(); phishingExtChannel.destroy(); + + phishingExtStream = null; }; /** - * Resets the extension stream with new streams to channel with the phishing page streams, - * and creates a new event listener to the reestablished extension port. + * This listener destroys the phishing extension streams when the extension port is disconnected, + * so that streams may be re-established later the phishing extension port is reconnected. */ -const resetPhishingStreamAndListeners = () => { - phishingExtPort.onDisconnect.removeListener(resetPhishingStreamAndListeners); +const onDisconnectDestroyPhishingStreams = () => { + const err = checkForLastError(); + + phishingExtPort.onDisconnect.removeListener( + onDisconnectDestroyPhishingStreams, + ); destroyPhishingExtStreams(); - setupPhishingExtStreams(); - phishingExtPort.onDisconnect.addListener(resetPhishingStreamAndListeners); + /** + * If an error is found, reset the streams. When running two or more dapps, resetting the service + * worker may cause the error, "Error: Could not establish connection. Receiving end does not + * exist.", due to a race-condition. The disconnect event may be called by runtime.connect which + * may cause issues. We suspect that this is a chromium bug as this event should only be called + * once the port and connections are ready. Delay time is arbitrary. + */ + if (err) { + console.warn(`${err} Resetting the phishing streams.`); + setTimeout(setupPhishingExtStreams, 1000); + } +}; + +/** + * When the extension background is loaded it sends the EXTENSION_MESSAGES.READY message to the browser tabs. + * This listener/callback receives the message to set up the streams after service worker in-activity. + * + * @param {object} msg + * @param {string} msg.name - custom property and name to identify the message received + * @returns {Promise|undefined} + */ +const onMessageSetUpPhishingStreams = (msg) => { + if (msg.name === EXTENSION_MESSAGES.READY) { + if (!phishingExtStream) { + setupPhishingExtStreams(); + } + return Promise.resolve( + `MetaMask: handled "${EXTENSION_MESSAGES.READY}" for phishing streams`, + ); + } + return undefined; }; /** @@ -177,7 +263,7 @@ const initPhishingStreams = () => { setupPhishingPageStreams(); setupPhishingExtStreams(); - phishingExtPort.onDisconnect.addListener(resetPhishingStreamAndListeners); + browser.runtime.onMessage.addListener(onMessageSetUpPhishingStreams); }; /** @@ -191,6 +277,14 @@ const setupPageStreams = () => { target: INPAGE, }); + if (isManifestV3) { + pageStream.on('data', ({ data: { method } }) => { + if (!IGNORE_INIT_METHODS_FOR_KEEP_ALIVE.includes(method)) { + runWorkerKeepAliveInterval(); + } + }); + } + // create and connect channel muxers // so we can handle the channels individually pageMux = new ObjectMultiplex(); @@ -230,6 +324,9 @@ const setupExtensionStreams = () => { // connect "phishing" channel to warning system extensionPhishingStream = extensionMux.createStream('phishing'); extensionPhishingStream.once('data', redirectToPhishingWarning); + + // eslint-disable-next-line no-use-before-define + extensionPort.onDisconnect.addListener(onDisconnectDestroyStreams); }; /** Destroys all of the extension streams */ @@ -241,10 +338,13 @@ const destroyExtensionStreams = () => { extensionChannel.removeAllListeners(); extensionChannel.destroy(); + + extensionStream = null; }; /** * LEGACY STREAM LOGIC + * TODO:LegacyProvider: Delete */ // TODO:LegacyProvider: Delete @@ -254,6 +354,14 @@ const setupLegacyPageStreams = () => { target: LEGACY_INPAGE, }); + if (isManifestV3) { + legacyPageStream.on('data', ({ data: { method } }) => { + if (!IGNORE_INIT_METHODS_FOR_KEEP_ALIVE.includes(method)) { + runWorkerKeepAliveInterval(); + } + }); + } + legacyPageMux = new ObjectMultiplex(); legacyPageMux.setMaxListeners(25); @@ -329,19 +437,47 @@ const destroyLegacyExtensionStreams = () => { }; /** - * Resets the extension stream with new streams to channel with the in page streams, - * and creates a new event listener to the reestablished extension port. + * When the extension background is loaded it sends the EXTENSION_MESSAGES.READY message to the browser tabs. + * This listener/callback receives the message to set up the streams after service worker in-activity. + * + * @param {object} msg + * @param {string} msg.name - custom property and name to identify the message received + * @returns {Promise|undefined} */ -const resetStreamAndListeners = () => { - extensionPort.onDisconnect.removeListener(resetStreamAndListeners); +const onMessageSetUpExtensionStreams = (msg) => { + if (msg.name === EXTENSION_MESSAGES.READY) { + if (!extensionStream) { + setupExtensionStreams(); + setupLegacyExtensionStreams(); + } + return Promise.resolve(`MetaMask: handled ${EXTENSION_MESSAGES.READY}`); + } + return undefined; +}; - destroyExtensionStreams(); - setupExtensionStreams(); +/** + * This listener destroys the extension streams when the extension port is disconnected, + * so that streams may be re-established later when the extension port is reconnected. + */ +const onDisconnectDestroyStreams = () => { + const err = checkForLastError(); + + extensionPort.onDisconnect.removeListener(onDisconnectDestroyStreams); + destroyExtensionStreams(); destroyLegacyExtensionStreams(); - setupLegacyExtensionStreams(); - extensionPort.onDisconnect.addListener(resetStreamAndListeners); + /** + * If an error is found, reset the streams. When running two or more dapps, resetting the service + * worker may cause the error, "Error: Could not establish connection. Receiving end does not + * exist.", due to a race-condition. The disconnect event may be called by runtime.connect which + * may cause issues. We suspect that this is a chromium bug as this event should only be called + * once the port and connections are ready. Delay time is arbitrary. + */ + if (err) { + console.warn(`${err} Resetting the streams.`); + setTimeout(setupExtensionStreams, 1000); + } }; /** @@ -351,13 +487,12 @@ const resetStreamAndListeners = () => { */ const initStreams = () => { setupPageStreams(); - setupExtensionStreams(); - - // TODO:LegacyProvider: Delete setupLegacyPageStreams(); + + setupExtensionStreams(); setupLegacyExtensionStreams(); - extensionPort.onDisconnect.addListener(resetStreamAndListeners); + browser.runtime.onMessage.addListener(onMessageSetUpExtensionStreams); }; // TODO:LegacyProvider: Delete @@ -424,12 +559,6 @@ function redirectToPhishingWarning(data = {}) { window.location.href = `${baseUrl}#${querystring}`; } -const initKeepWorkerAlive = () => { - setInterval(() => { - browser.runtime.sendMessage({ name: WORKER_KEEP_ALIVE_MESSAGE }); - }, WORKER_KEEP_ALIVE_INTERVAL); -}; - const start = () => { const isDetectedPhishingSite = window.location.origin === phishingPageUrl.origin && @@ -441,9 +570,7 @@ const start = () => { } if (shouldInjectProvider()) { - if (isManifestV3) { - initKeepWorkerAlive(); - } else { + if (!isManifestV3) { injectScript(inpageBundle); } initStreams(); diff --git a/app/scripts/controllers/app-state.js b/app/scripts/controllers/app-state.js index 5dfdc2f70dcc..9b62cf3e2d6e 100644 --- a/app/scripts/controllers/app-state.js +++ b/app/scripts/controllers/app-state.js @@ -2,6 +2,9 @@ import EventEmitter from 'events'; import { ObservableStore } from '@metamask/obs-store'; import { METAMASK_CONTROLLER_EVENTS } from '../metamask-controller'; import { MINUTE } from '../../../shared/constants/time'; +import { AUTO_LOCK_TIMEOUT_ALARM } from '../../../shared/constants/alarms'; +import { isManifestV3 } from '../../../shared/modules/mv3.utils'; +import { isBeta } from '../../../ui/helpers/utils/build-types'; export default class AppStateController extends EventEmitter { /** @@ -34,15 +37,13 @@ export default class AppStateController extends EventEmitter { enableEIP1559V2NoticeDismissed: false, showTestnetMessageInDropdown: true, showPortfolioTooltip: true, + showBetaHeader: isBeta(), trezorModel: null, ...initState, qrHardware: {}, collectiblesDropdownState: {}, usedNetworks: { '0x1': true, - '0x2a': true, - '0x3': true, - '0x4': true, '0x5': true, '0x539': true, }, @@ -187,21 +188,37 @@ export default class AppStateController extends EventEmitter { * * @private */ + /* eslint-disable no-undef */ _resetTimer() { const { timeoutMinutes } = this.store.getState(); if (this.timer) { clearTimeout(this.timer); + } else if (isManifestV3) { + chrome.alarms.clear(AUTO_LOCK_TIMEOUT_ALARM); } if (!timeoutMinutes) { return; } - this.timer = setTimeout( - () => this.onInactiveTimeout(), - timeoutMinutes * MINUTE, - ); + if (isManifestV3) { + chrome.alarms.create(AUTO_LOCK_TIMEOUT_ALARM, { + delayInMinutes: timeoutMinutes, + periodInMinutes: timeoutMinutes, + }); + chrome.alarms.onAlarm.addListener((alarmInfo) => { + if (alarmInfo.name === AUTO_LOCK_TIMEOUT_ALARM) { + this.onInactiveTimeout(); + chrome.alarms.clear(AUTO_LOCK_TIMEOUT_ALARM); + } + }); + } else { + this.timer = setTimeout( + () => this.onInactiveTimeout(), + timeoutMinutes * MINUTE, + ); + } } /** @@ -269,6 +286,15 @@ export default class AppStateController extends EventEmitter { this.store.updateState({ showPortfolioTooltip }); } + /** + * Sets whether the beta notification heading on the home page + * + * @param showBetaHeader + */ + setShowBetaHeader(showBetaHeader) { + this.store.updateState({ showBetaHeader }); + } + /** * Sets a property indicating the model of the user's Trezor hardware wallet * diff --git a/app/scripts/controllers/backup.js b/app/scripts/controllers/backup.js index 4d7b5c3711e3..1277dfe62712 100644 --- a/app/scripts/controllers/backup.js +++ b/app/scripts/controllers/backup.js @@ -1,4 +1,3 @@ -import { exportAsFile } from '../../../shared/modules/export-utils'; import { prependZero } from '../../../shared/modules/string-utils'; export default class BackupController { @@ -65,13 +64,6 @@ export default class BackupController { date.getMinutes(), )}_${prefixZero(date.getDay())}.json`; - exportAsFile(userDataFileName, result); - - this._trackMetaMetricsEvent({ - event: 'User Data Exported', - category: 'Backup', - }); - - return result; + return { fileName: userDataFileName, data: result }; } } diff --git a/app/scripts/controllers/cached-balances.test.js b/app/scripts/controllers/cached-balances.test.js index 5f507f076dc6..b5618cf3bed6 100644 --- a/app/scripts/controllers/cached-balances.test.js +++ b/app/scripts/controllers/cached-balances.test.js @@ -7,7 +7,7 @@ describe('CachedBalancesController', function () { describe('updateCachedBalances', function () { it('should update the cached balances', async function () { const controller = new CachedBalancesController({ - getCurrentChainId: () => CHAIN_IDS.KOVAN, + getCurrentChainId: () => CHAIN_IDS.GOERLI, accountTracker: { store: { subscribe: () => undefined, @@ -27,7 +27,7 @@ describe('CachedBalancesController', function () { assert.equal(controller._generateBalancesToCache.callCount, 1); assert.deepEqual(controller._generateBalancesToCache.args[0], [ 'mockAccounts', - CHAIN_IDS.KOVAN, + CHAIN_IDS.GOERLI, ]); assert.equal( controller.store.getState().cachedBalances, @@ -46,7 +46,7 @@ describe('CachedBalancesController', function () { }, initState: { cachedBalances: { - [CHAIN_IDS.KOVAN]: { + [CHAIN_IDS.GOERLI]: { a: '0x1', b: '0x2', c: '0x3', @@ -66,11 +66,11 @@ describe('CachedBalancesController', function () { b: { balance: null }, c: { balance: '0x5' }, }, - CHAIN_IDS.KOVAN, + CHAIN_IDS.GOERLI, ); assert.deepEqual(result, { - [CHAIN_IDS.KOVAN]: { + [CHAIN_IDS.GOERLI]: { a: '0x4', b: '0x2', c: '0x5', @@ -92,7 +92,7 @@ describe('CachedBalancesController', function () { }, initState: { cachedBalances: { - [CHAIN_IDS.KOVAN]: { + [CHAIN_IDS.GOERLI]: { a: '0x1', b: '0x2', c: '0x3', @@ -111,7 +111,7 @@ describe('CachedBalancesController', function () { ); assert.deepEqual(result, { - [CHAIN_IDS.KOVAN]: { + [CHAIN_IDS.GOERLI]: { a: '0x1', b: '0x2', c: '0x3', @@ -128,7 +128,7 @@ describe('CachedBalancesController', function () { it('should subscribe to the account tracker with the updateCachedBalances method', async function () { const subscribeSpy = sinon.spy(); const controller = new CachedBalancesController({ - getCurrentChainId: () => CHAIN_IDS.KOVAN, + getCurrentChainId: () => CHAIN_IDS.GOERLI, accountTracker: { store: { subscribe: subscribeSpy, diff --git a/app/scripts/controllers/detect-tokens.test.js b/app/scripts/controllers/detect-tokens.test.js index 2f06b4088e70..f0f189ae7691 100644 --- a/app/scripts/controllers/detect-tokens.test.js +++ b/app/scripts/controllers/detect-tokens.test.js @@ -195,15 +195,15 @@ describe('DetectTokensController', function () { it('should not check and add tokens while on unsupported networks', async function () { sandbox.useFakeTimers(); - network.setProviderType(NETWORK_TYPES.ROPSTEN); - const tokenListMessengerRopsten = new ControllerMessenger().getRestricted({ + network.setProviderType(NETWORK_TYPES.SEPOLIA); + const tokenListMessengerSepolia = new ControllerMessenger().getRestricted({ name: 'TokenListController', }); tokenListController = new TokenListController({ - chainId: '3', + chainId: '11155111', onNetworkStateChange: sinon.spy(), onPreferencesStateChange: sinon.spy(), - messenger: tokenListMessengerRopsten, + messenger: tokenListMessengerSepolia, }); await tokenListController.start(); const controller = new DetectTokensController({ diff --git a/app/scripts/controllers/ens/index.test.js b/app/scripts/controllers/ens/index.test.js index d325e2885084..aa7ed8c04a98 100644 --- a/app/scripts/controllers/ens/index.test.js +++ b/app/scripts/controllers/ens/index.test.js @@ -10,7 +10,7 @@ describe('EnsController', function () { let getCurrentChainId; let onNetworkDidChange; beforeEach(function () { - currentChainId = '0x3'; + currentChainId = '0x5'; getCurrentChainId = () => currentChainId; onNetworkDidChange = sinon.spy(); }); diff --git a/app/scripts/controllers/incoming-transactions.js b/app/scripts/controllers/incoming-transactions.js index a110c3c07468..bb47cdac35dc 100644 --- a/app/scripts/controllers/incoming-transactions.js +++ b/app/scripts/controllers/incoming-transactions.js @@ -50,10 +50,7 @@ const fetchWithTimeout = getFetchWithTimeout(); */ const etherscanSupportedNetworks = [ CHAIN_IDS.GOERLI, - CHAIN_IDS.KOVAN, CHAIN_IDS.MAINNET, - CHAIN_IDS.RINKEBY, - CHAIN_IDS.ROPSTEN, CHAIN_IDS.SEPOLIA, ]; @@ -79,10 +76,7 @@ export default class IncomingTransactionsController { incomingTransactions: {}, incomingTxLastFetchedBlockByChainId: { [CHAIN_IDS.GOERLI]: null, - [CHAIN_IDS.KOVAN]: null, [CHAIN_IDS.MAINNET]: null, - [CHAIN_IDS.RINKEBY]: null, - [CHAIN_IDS.ROPSTEN]: null, [CHAIN_IDS.SEPOLIA]: null, }, ...opts.initState, diff --git a/app/scripts/controllers/incoming-transactions.test.js b/app/scripts/controllers/incoming-transactions.test.js index 100696ae6e0d..fd11163ff904 100644 --- a/app/scripts/controllers/incoming-transactions.test.js +++ b/app/scripts/controllers/incoming-transactions.test.js @@ -31,18 +31,12 @@ const PREPOPULATED_INCOMING_TXS_BY_HASH = { }; const PREPOPULATED_BLOCKS_BY_NETWORK = { [CHAIN_IDS.GOERLI]: 1, - [CHAIN_IDS.KOVAN]: 2, [CHAIN_IDS.MAINNET]: 3, - [CHAIN_IDS.RINKEBY]: 5, - [CHAIN_IDS.ROPSTEN]: 4, [CHAIN_IDS.SEPOLIA]: 6, }; const EMPTY_BLOCKS_BY_NETWORK = { [CHAIN_IDS.GOERLI]: null, - [CHAIN_IDS.KOVAN]: null, [CHAIN_IDS.MAINNET]: null, - [CHAIN_IDS.RINKEBY]: null, - [CHAIN_IDS.ROPSTEN]: null, [CHAIN_IDS.SEPOLIA]: null, }; @@ -147,10 +141,7 @@ const getFakeEtherscanTransaction = ({ function nockEtherscanApiForAllChains(mockResponse) { for (const chainId of [ CHAIN_IDS.GOERLI, - CHAIN_IDS.KOVAN, CHAIN_IDS.MAINNET, - CHAIN_IDS.RINKEBY, - CHAIN_IDS.ROPSTEN, CHAIN_IDS.SEPOLIA, 'undefined', ]) { @@ -246,16 +237,16 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, ); const startBlock = getNonEmptyInitState().incomingTxLastFetchedBlockByChainId[ - CHAIN_IDS.ROPSTEN + CHAIN_IDS.GOERLI ]; - nock('https://api-ropsten.etherscan.io') + nock('https://api-goerli.etherscan.io') .get( `/api?module=account&action=txlist&address=${MOCK_SELECTED_ADDRESS}&tag=latest&page=1&startBlock=${startBlock}`, ) @@ -305,8 +296,8 @@ describe('IncomingTransactionsController', function () { '0xfake': { blockNumber: '10', hash: '0xfake', - metamaskNetworkId: NETWORK_IDS.ROPSTEN, - chainId: CHAIN_IDS.ROPSTEN, + metamaskNetworkId: NETWORK_IDS.GOERLI, + chainId: CHAIN_IDS.GOERLI, status: TRANSACTION_STATUSES.CONFIRMED, time: 16000000000000000, type: TRANSACTION_TYPES.INCOMING, @@ -322,8 +313,8 @@ describe('IncomingTransactionsController', function () { '0xfakeeip1559': { blockNumber: '10', hash: '0xfakeeip1559', - metamaskNetworkId: NETWORK_IDS.ROPSTEN, - chainId: CHAIN_IDS.ROPSTEN, + metamaskNetworkId: NETWORK_IDS.GOERLI, + chainId: CHAIN_IDS.GOERLI, status: TRANSACTION_STATUSES.CONFIRMED, time: 16000000000000000, type: TRANSACTION_TYPES.INCOMING, @@ -340,7 +331,7 @@ describe('IncomingTransactionsController', function () { }, incomingTxLastFetchedBlockByChainId: { ...getNonEmptyInitState().incomingTxLastFetchedBlockByChainId, - [CHAIN_IDS.ROPSTEN]: 11, + [CHAIN_IDS.GOERLI]: 11, }, }, 'State should have been updated after first block was received', @@ -448,7 +439,7 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, @@ -493,7 +484,7 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, @@ -540,7 +531,7 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, @@ -548,9 +539,9 @@ describe('IncomingTransactionsController', function () { const NEW_MOCK_SELECTED_ADDRESS = `${MOCK_SELECTED_ADDRESS}9`; const startBlock = getNonEmptyInitState().incomingTxLastFetchedBlockByChainId[ - CHAIN_IDS.ROPSTEN + CHAIN_IDS.GOERLI ]; - nock('https://api-ropsten.etherscan.io') + nock('https://api-goerli.etherscan.io') .get( `/api?module=account&action=txlist&address=${NEW_MOCK_SELECTED_ADDRESS}&tag=latest&page=1&startBlock=${startBlock}`, ) @@ -603,8 +594,8 @@ describe('IncomingTransactionsController', function () { '0xfake': { blockNumber: '10', hash: '0xfake', - metamaskNetworkId: NETWORK_IDS.ROPSTEN, - chainId: CHAIN_IDS.ROPSTEN, + metamaskNetworkId: NETWORK_IDS.GOERLI, + chainId: CHAIN_IDS.GOERLI, status: TRANSACTION_STATUSES.CONFIRMED, time: 16000000000000000, type: TRANSACTION_TYPES.INCOMING, @@ -620,7 +611,7 @@ describe('IncomingTransactionsController', function () { }, incomingTxLastFetchedBlockByChainId: { ...getNonEmptyInitState().incomingTxLastFetchedBlockByChainId, - [CHAIN_IDS.ROPSTEN]: 11, + [CHAIN_IDS.GOERLI]: 11, }, }, 'State should have been updated after first block was received', @@ -687,7 +678,7 @@ describe('IncomingTransactionsController', function () { it('should update when switching to a supported network', async function () { const mockedNetworkMethods = getMockNetworkControllerMethods( - CHAIN_IDS.ROPSTEN, + CHAIN_IDS.GOERLI, ); const incomingTransactionsController = new IncomingTransactionsController( { @@ -699,9 +690,9 @@ describe('IncomingTransactionsController', function () { ); const startBlock = getNonEmptyInitState().incomingTxLastFetchedBlockByChainId[ - CHAIN_IDS.ROPSTEN + CHAIN_IDS.GOERLI ]; - nock('https://api-ropsten.etherscan.io') + nock('https://api-goerli.etherscan.io') .get( `/api?module=account&action=txlist&address=${MOCK_SELECTED_ADDRESS}&tag=latest&page=1&startBlock=${startBlock}`, ) @@ -723,7 +714,7 @@ describe('IncomingTransactionsController', function () { const subscription = mockedNetworkMethods.onNetworkDidChange.getCall(0).args[0]; - await subscription(CHAIN_IDS.ROPSTEN); + await subscription(CHAIN_IDS.GOERLI); await updateStateCalled(); const actualState = incomingTransactionsController.store.getState(); @@ -744,8 +735,8 @@ describe('IncomingTransactionsController', function () { '0xfake': { blockNumber: '10', hash: '0xfake', - metamaskNetworkId: NETWORK_IDS.ROPSTEN, - chainId: CHAIN_IDS.ROPSTEN, + metamaskNetworkId: NETWORK_IDS.GOERLI, + chainId: CHAIN_IDS.GOERLI, status: TRANSACTION_STATUSES.CONFIRMED, time: 16000000000000000, type: TRANSACTION_TYPES.INCOMING, @@ -761,7 +752,7 @@ describe('IncomingTransactionsController', function () { }, incomingTxLastFetchedBlockByChainId: { ...getNonEmptyInitState().incomingTxLastFetchedBlockByChainId, - [CHAIN_IDS.ROPSTEN]: 11, + [CHAIN_IDS.GOERLI]: 11, }, }, 'State should have been updated after first block was received', @@ -770,7 +761,7 @@ describe('IncomingTransactionsController', function () { it('should not update when switching to an unsupported network', async function () { const mockedNetworkMethods = getMockNetworkControllerMethods( - CHAIN_IDS.ROPSTEN, + CHAIN_IDS.GOERLI, ); const incomingTransactionsController = new IncomingTransactionsController( { @@ -829,10 +820,10 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController({ blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getEmptyInitState(), - getCurrentChainId: () => CHAIN_IDS.ROPSTEN, + getCurrentChainId: () => CHAIN_IDS.GOERLI, }); sinon.spy(incomingTransactionsController.store, 'updateState'); @@ -847,14 +838,14 @@ describe('IncomingTransactionsController', function () { assert.deepStrictEqual( incomingTransactionsController._getNewIncomingTransactions.getCall(0) .args, - ['fakeAddress', 999, CHAIN_IDS.ROPSTEN], + ['fakeAddress', 999, CHAIN_IDS.GOERLI], ); assert.deepStrictEqual( incomingTransactionsController.store.updateState.getCall(0).args[0], { incomingTxLastFetchedBlockByChainId: { ...EMPTY_BLOCKS_BY_NETWORK, - [CHAIN_IDS.ROPSTEN]: 1000, + [CHAIN_IDS.GOERLI]: 1000, }, incomingTransactions: {}, }, @@ -865,10 +856,10 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController({ blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getEmptyInitState(), - getCurrentChainId: () => CHAIN_IDS.ROPSTEN, + getCurrentChainId: () => CHAIN_IDS.GOERLI, }); const NEW_TRANSACTION_ONE = { @@ -894,7 +885,7 @@ describe('IncomingTransactionsController', function () { assert.deepStrictEqual( incomingTransactionsController._getNewIncomingTransactions.getCall(0) .args, - ['fakeAddress', 10, CHAIN_IDS.ROPSTEN], + ['fakeAddress', 10, CHAIN_IDS.GOERLI], ); assert.deepStrictEqual( @@ -902,7 +893,7 @@ describe('IncomingTransactionsController', function () { { incomingTxLastFetchedBlockByChainId: { ...EMPTY_BLOCKS_BY_NETWORK, - [CHAIN_IDS.ROPSTEN]: 445, + [CHAIN_IDS.GOERLI]: 445, }, incomingTransactions: { [NEW_TRANSACTION_ONE.hash]: NEW_TRANSACTION_ONE, @@ -918,10 +909,10 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController({ blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), - getCurrentChainId: () => CHAIN_IDS.ROPSTEN, + getCurrentChainId: () => CHAIN_IDS.GOERLI, }); sinon.spy(incomingTransactionsController.store, 'updateState'); incomingTransactionsController._getNewIncomingTransactions = sinon @@ -937,7 +928,7 @@ describe('IncomingTransactionsController', function () { assert.deepStrictEqual( incomingTransactionsController._getNewIncomingTransactions.getCall(0) .args, - ['fakeAddress', 4, CHAIN_IDS.ROPSTEN], + ['fakeAddress', 1, CHAIN_IDS.GOERLI], ); assert.deepStrictEqual( @@ -945,8 +936,8 @@ describe('IncomingTransactionsController', function () { { incomingTxLastFetchedBlockByChainId: { ...PREPOPULATED_BLOCKS_BY_NETWORK, - [CHAIN_IDS.ROPSTEN]: - PREPOPULATED_BLOCKS_BY_NETWORK[CHAIN_IDS.ROPSTEN] + 1, + [CHAIN_IDS.GOERLI]: + PREPOPULATED_BLOCKS_BY_NETWORK[CHAIN_IDS.GOERLI] + 1, }, incomingTransactions: PREPOPULATED_INCOMING_TXS_BY_HASH, }, @@ -958,10 +949,10 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), - getCurrentChainId: () => CHAIN_IDS.ROPSTEN, + getCurrentChainId: () => CHAIN_IDS.GOERLI, }, ); @@ -988,7 +979,7 @@ describe('IncomingTransactionsController', function () { assert.deepStrictEqual( incomingTransactionsController._getNewIncomingTransactions.getCall(0) .args, - ['fakeAddress', 4, CHAIN_IDS.ROPSTEN], + ['fakeAddress', 1, CHAIN_IDS.GOERLI], ); assert.deepStrictEqual( @@ -996,7 +987,7 @@ describe('IncomingTransactionsController', function () { { incomingTxLastFetchedBlockByChainId: { ...PREPOPULATED_BLOCKS_BY_NETWORK, - [CHAIN_IDS.ROPSTEN]: 445, + [CHAIN_IDS.GOERLI]: 445, }, incomingTransactions: { ...PREPOPULATED_INCOMING_TXS_BY_HASH, @@ -1033,7 +1024,7 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, @@ -1042,13 +1033,13 @@ describe('IncomingTransactionsController', function () { await incomingTransactionsController._getNewIncomingTransactions( ADDRESS_TO_FETCH_FOR, '789', - CHAIN_IDS.ROPSTEN, + CHAIN_IDS.GOERLI, ); assert(mockFetch.calledOnce); assert.strictEqual( mockFetch.getCall(0).args[0], - `https://api-${NETWORK_TYPES.ROPSTEN}.etherscan.io/api?module=account&action=txlist&address=0xfakeaddress&tag=latest&page=1&startBlock=789`, + `https://api-${NETWORK_TYPES.GOERLI}.etherscan.io/api?module=account&action=txlist&address=0xfakeaddress&tag=latest&page=1&startBlock=789`, ); }); @@ -1079,7 +1070,7 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, @@ -1088,13 +1079,13 @@ describe('IncomingTransactionsController', function () { await incomingTransactionsController._getNewIncomingTransactions( ADDRESS_TO_FETCH_FOR, null, - CHAIN_IDS.ROPSTEN, + CHAIN_IDS.GOERLI, ); assert(mockFetch.calledOnce); assert.strictEqual( mockFetch.getCall(0).args[0], - `https://api-${NETWORK_TYPES.ROPSTEN}.etherscan.io/api?module=account&action=txlist&address=0xfakeaddress&tag=latest&page=1`, + `https://api-${NETWORK_TYPES.GOERLI}.etherscan.io/api?module=account&action=txlist&address=0xfakeaddress&tag=latest&page=1`, ); }); @@ -1102,7 +1093,7 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, @@ -1112,14 +1103,14 @@ describe('IncomingTransactionsController', function () { await incomingTransactionsController._getNewIncomingTransactions( ADDRESS_TO_FETCH_FOR, '789', - CHAIN_IDS.ROPSTEN, + CHAIN_IDS.GOERLI, ); assert(mockFetch.calledOnce); assert.deepStrictEqual(result, [ incomingTransactionsController._normalizeTxFromEtherscan( FETCHED_TX, - CHAIN_IDS.ROPSTEN, + CHAIN_IDS.GOERLI, ), ]); }); @@ -1135,7 +1126,7 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, @@ -1145,7 +1136,7 @@ describe('IncomingTransactionsController', function () { await incomingTransactionsController._getNewIncomingTransactions( ADDRESS_TO_FETCH_FOR, '789', - CHAIN_IDS.ROPSTEN, + CHAIN_IDS.GOERLI, ); assert.deepStrictEqual(result, []); window.fetch = tempFetchStatusZero; @@ -1163,7 +1154,7 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, @@ -1173,7 +1164,7 @@ describe('IncomingTransactionsController', function () { await incomingTransactionsController._getNewIncomingTransactions( ADDRESS_TO_FETCH_FOR, '789', - CHAIN_IDS.ROPSTEN, + CHAIN_IDS.GOERLI, ); assert.deepStrictEqual(result, []); window.fetch = tempFetchEmptyResult; @@ -1186,7 +1177,7 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, @@ -1205,14 +1196,14 @@ describe('IncomingTransactionsController', function () { value: '15', hash: '0xg', }, - CHAIN_IDS.ROPSTEN, + CHAIN_IDS.GOERLI, ); assert.deepStrictEqual(result, { blockNumber: 333, id: 54321, - metamaskNetworkId: NETWORK_IDS.ROPSTEN, - chainId: CHAIN_IDS.ROPSTEN, + metamaskNetworkId: NETWORK_IDS.GOERLI, + chainId: CHAIN_IDS.GOERLI, status: TRANSACTION_STATUSES.FAILED, time: 4444000, txParams: { @@ -1232,7 +1223,7 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, @@ -1251,14 +1242,14 @@ describe('IncomingTransactionsController', function () { value: '15', hash: '0xg', }, - CHAIN_IDS.ROPSTEN, + CHAIN_IDS.GOERLI, ); assert.deepStrictEqual(result, { blockNumber: 333, id: 54321, - metamaskNetworkId: NETWORK_IDS.ROPSTEN, - chainId: CHAIN_IDS.ROPSTEN, + metamaskNetworkId: NETWORK_IDS.GOERLI, + chainId: CHAIN_IDS.GOERLI, status: TRANSACTION_STATUSES.CONFIRMED, time: 4444000, txParams: { @@ -1278,7 +1269,7 @@ describe('IncomingTransactionsController', function () { const incomingTransactionsController = new IncomingTransactionsController( { blockTracker: getMockBlockTracker(), - ...getMockNetworkControllerMethods(CHAIN_IDS.ROPSTEN), + ...getMockNetworkControllerMethods(CHAIN_IDS.GOERLI), preferencesController: getMockPreferencesController(), initState: getNonEmptyInitState(), }, @@ -1298,14 +1289,14 @@ describe('IncomingTransactionsController', function () { value: '15', hash: '0xg', }, - CHAIN_IDS.ROPSTEN, + CHAIN_IDS.GOERLI, ); assert.deepStrictEqual(result, { blockNumber: 333, id: 54321, - metamaskNetworkId: NETWORK_IDS.ROPSTEN, - chainId: CHAIN_IDS.ROPSTEN, + metamaskNetworkId: NETWORK_IDS.GOERLI, + chainId: CHAIN_IDS.GOERLI, status: TRANSACTION_STATUSES.CONFIRMED, time: 4444000, txParams: { diff --git a/app/scripts/controllers/metametrics.js b/app/scripts/controllers/metametrics.js index d771c531983a..1c87c6181ba5 100644 --- a/app/scripts/controllers/metametrics.js +++ b/app/scripts/controllers/metametrics.js @@ -18,6 +18,9 @@ import { TRAITS, } from '../../../shared/constants/metametrics'; import { SECOND } from '../../../shared/constants/time'; +import { isManifestV3 } from '../../../shared/modules/mv3.utils'; +import { METAMETRICS_FINALIZE_EVENT_FRAGMENT_ALARM } from '../../../shared/constants/alarms'; +import { checkAlarmExists, generateRandomId, isValidDate } from '../lib/util'; const EXTENSION_UNINSTALL_URL = 'https://metamask.io/uninstalled'; @@ -29,6 +32,22 @@ const defaultCaptureException = (err) => { }); }; +// The function is used to build a unique messageId for segment messages +// It uses actionId and uniqueIdentifier from event if present +const buildUniqueMessageId = (args) => { + let messageId = ''; + if (args.uniqueIdentifier) { + messageId += `${args.uniqueIdentifier}-`; + } + if (args.actionId) { + messageId += args.actionId; + } + if (messageId.length) { + return messageId; + } + return generateRandomId(); +}; + const exceptionsToFilter = { [`You must pass either an "anonymousId" or a "userId".`]: true, }; @@ -57,12 +76,14 @@ const exceptionsToFilter = { * @property {Array} [eventsBeforeMetricsOptIn] - Array of queued events added before * a user opts into metrics. * @property {object} [traits] - Traits that are not derived from other state keys. + * @property {Record} [previousUserTraits] - The user traits the last + * time they were computed. */ export default class MetaMetricsController { /** * @param {object} options - * @param {object} options.segment - an instance of analytics-node for tracking + * @param {object} options.segment - an instance of analytics for tracking * events that conform to the new MetaMetrics tracking plan. * @param {object} options.preferencesStore - The preferences controller store, used * to access and subscribe to preferences that will be attached to events @@ -107,6 +128,7 @@ export default class MetaMetricsController { this.environment = environment; const abandonedFragments = omitBy(initState?.fragments, 'persist'); + const segmentApiCalls = initState?.segmentApiCalls || {}; this.store = new ObservableStore({ participateInMetaMetrics: null, @@ -117,6 +139,9 @@ export default class MetaMetricsController { fragments: { ...initState?.fragments, }, + segmentApiCalls: { + ...segmentApiCalls, + }, }); preferencesStore.subscribe(({ currentLocale }) => { @@ -139,21 +164,56 @@ export default class MetaMetricsController { this.finalizeEventFragment(fragment.id, { abandoned: true }); }); + // Code below submits any pending segmentApiCalls to Segment if/when the controller is re-instantiated + if (isManifestV3) { + Object.values(segmentApiCalls).forEach( + ({ eventType, payload, callback }) => { + this._submitSegmentAPICall(eventType, payload, callback); + }, + ); + } + // Close out event fragments that were created but not progressed. An // interval is used to routinely check if a fragment has not been updated // within the fragment's timeout window. When creating a new event fragment // a timeout can be specified that will cause an abandoned event to be // tracked if the event isn't progressed within that amount of time. - setInterval(() => { - Object.values(this.store.getState().fragments).forEach((fragment) => { - if ( - fragment.timeout && - Date.now() - fragment.lastUpdated / 1000 > fragment.timeout - ) { - this.finalizeEventFragment(fragment.id, { abandoned: true }); + if (isManifestV3) { + /* eslint-disable no-undef */ + chrome.alarms.getAll((alarms) => { + const hasAlarm = checkAlarmExists( + alarms, + METAMETRICS_FINALIZE_EVENT_FRAGMENT_ALARM, + ); + + if (!hasAlarm) { + chrome.alarms.create(METAMETRICS_FINALIZE_EVENT_FRAGMENT_ALARM, { + delayInMinutes: 1, + periodInMinutes: 1, + }); } }); - }, SECOND * 30); + chrome.alarms.onAlarm.addListener((alarmInfo) => { + if (alarmInfo.name === METAMETRICS_FINALIZE_EVENT_FRAGMENT_ALARM) { + this.finalizeAbandonedFragments(); + } + }); + } else { + setInterval(() => { + this.finalizeAbandonedFragments(); + }, SECOND * 30); + } + } + + finalizeAbandonedFragments() { + Object.values(this.store.getState().fragments).forEach((fragment) => { + if ( + fragment.timeout && + Date.now() - fragment.lastUpdated / 1000 > fragment.timeout + ) { + this.finalizeEventFragment(fragment.id, { abandoned: true }); + } + }); } generateMetaMetricsId() { @@ -189,14 +249,6 @@ export default class MetaMetricsController { ); } - const existingFragment = this.getExistingEventFragment( - options.actionId, - options.uniqueIdentifier, - ); - if (existingFragment) { - return existingFragment; - } - const { fragments } = this.store.getState(); const id = options.uniqueIdentifier ?? uuidv4(); @@ -224,6 +276,8 @@ export default class MetaMetricsController { value: fragment.value, currency: fragment.currency, environmentType: fragment.environmentType, + actionId: options.actionId, + uniqueIdentifier: options.uniqueIdentifier, }); } @@ -245,26 +299,6 @@ export default class MetaMetricsController { return fragment; } - /** - * Returns the fragment stored in memory with provided id or undefined if it - * does not exist. - * - * @param {string} actionId - actionId passed from UI - * @param {string} uniqueIdentifier - uniqueIdentifier of the event - * @returns {[MetaMetricsEventFragment]} - */ - getExistingEventFragment(actionId, uniqueIdentifier) { - const { fragments } = this.store.getState(); - - const existingFragment = Object.values(fragments).find( - (fragment) => - fragment.actionId === actionId && - fragment.uniqueIdentifier === uniqueIdentifier, - ); - - return existingFragment; - } - /** * Updates an event fragment in state * @@ -325,6 +359,8 @@ export default class MetaMetricsController { value: fragment.value, currency: fragment.currency, environmentType: fragment.environmentType, + actionId: fragment.actionId, + uniqueIdentifier: fragment.uniqueIdentifier, }); const { fragments } = this.store.getState(); delete fragments[id]; @@ -411,7 +447,10 @@ export default class MetaMetricsController { * @param {MetaMetricsPageOptions} [options] - options for handling the page * view */ - trackPage({ name, params, environmentType, page, referrer }, options) { + trackPage( + { name, params, environmentType, page, referrer, actionId }, + options, + ) { try { if (this.state.participateInMetaMetrics === false) { return; @@ -426,7 +465,8 @@ export default class MetaMetricsController { const { metaMetricsId } = this.state; const idTrait = metaMetricsId ? 'userId' : 'anonymousId'; const idValue = metaMetricsId ?? METAMETRICS_ANONYMOUS_ID; - this.segment.page({ + this._submitSegmentAPICall('page', { + messageId: buildUniqueMessageId({ actionId }), [idTrait]: idValue, name, properties: { @@ -617,6 +657,7 @@ export default class MetaMetricsController { } = rawPayload; return { event, + messageId: buildUniqueMessageId(rawPayload), properties: { // These values are omitted from properties because they have special meaning // in segment. https://segment.com/docs/connections/spec/track/#properties. @@ -646,7 +687,7 @@ export default class MetaMetricsController { * @returns {MetaMetricsTraits | null} traits that have changed since last update */ _buildUserTraitsObject(metamaskState) { - const { traits } = this.store.getState(); + const { traits, previousUserTraits } = this.store.getState(); /** @type {MetaMetricsTraits} */ const currentTraits = { [TRAITS.ADDRESS_BOOK_ENTRIES]: sum( @@ -667,33 +708,32 @@ export default class MetaMetricsController { }, [], ), - [TRAITS.NFT_AUTODETECTION_ENABLED]: metamaskState.useCollectibleDetection, + [TRAITS.NFT_AUTODETECTION_ENABLED]: metamaskState.useNftDetection, [TRAITS.NUMBER_OF_ACCOUNTS]: Object.values(metamaskState.identities) .length, [TRAITS.NUMBER_OF_NFT_COLLECTIONS]: this._getAllUniqueNFTAddressesLength( - metamaskState.allCollectibles, + metamaskState.allNfts, ), - [TRAITS.NUMBER_OF_NFTS]: this._getAllNFTsFlattened( - metamaskState.allCollectibles, - ).length, + [TRAITS.NUMBER_OF_NFTS]: this._getAllNFTsFlattened(metamaskState.allNfts) + .length, [TRAITS.NUMBER_OF_TOKENS]: this._getNumberOfTokens(metamaskState), [TRAITS.OPENSEA_API_ENABLED]: metamaskState.openSeaEnabled, - [TRAITS.THREE_BOX_ENABLED]: metamaskState.threeBoxSyncingAllowed, + [TRAITS.THREE_BOX_ENABLED]: false, // deprecated, hard-coded as false [TRAITS.THEME]: metamaskState.theme || 'default', [TRAITS.TOKEN_DETECTION_ENABLED]: metamaskState.useTokenDetection, }; - if (!this.previousTraits) { - this.previousTraits = currentTraits; + if (!previousUserTraits) { + this.store.updateState({ previousUserTraits: currentTraits }); return currentTraits; } - if (this.previousTraits && !isEqual(this.previousTraits, currentTraits)) { + if (previousUserTraits && !isEqual(previousUserTraits, currentTraits)) { const updates = pickBy( currentTraits, - (v, k) => !isEqual(this.previousTraits[k], v), + (v, k) => !isEqual(previousUserTraits[k], v), ); - this.previousTraits = currentTraits; + this.store.updateState({ previousUserTraits: currentTraits }); return updates; } @@ -726,11 +766,11 @@ export default class MetaMetricsController { * Returns an array of all of the collectibles/NFTs the user * possesses across all networks and accounts. * - * @param {object} allCollectibles + * @param {object} allNfts * @returns {[]} */ - _getAllNFTsFlattened = memoize((allCollectibles = {}) => { - return Object.values(allCollectibles).reduce((result, chainNFTs) => { + _getAllNFTsFlattened = memoize((allNfts = {}) => { + return Object.values(allNfts).reduce((result, chainNFTs) => { return result.concat(...Object.values(chainNFTs)); }, []); }); @@ -739,11 +779,11 @@ export default class MetaMetricsController { * Returns the number of unique collectible/NFT addresses the user * possesses across all networks and accounts. * - * @param {object} allCollectibles + * @param {object} allNfts * @returns {number} */ - _getAllUniqueNFTAddressesLength(allCollectibles = {}) { - const allNFTAddresses = this._getAllNFTsFlattened(allCollectibles).map( + _getAllUniqueNFTAddressesLength(allNfts = {}) { + const allNFTAddresses = this._getAllNFTsFlattened(allNfts).map( (nft) => nft.address, ); const uniqueAddresses = new Set(allNFTAddresses); @@ -779,7 +819,7 @@ export default class MetaMetricsController { } try { - this.segment.identify({ + this._submitSegmentAPICall('identify', { userId: metaMetricsId, traits: userTraits, }); @@ -908,10 +948,49 @@ export default class MetaMetricsController { return resolve(); }; - this.segment.track(payload, callback); + this._submitSegmentAPICall('track', payload, callback); if (flushImmediately) { this.segment.flush(); } }); } + + // Method below submits the request to analytics SDK. + // It will also add event to controller store + // and pass a callback to remove it from store once request is submitted to segment + // Saving segmentApiCalls in controller store in MV3 ensures that events are tracked + // even if service worker terminates before events are submiteed to segment. + _submitSegmentAPICall(eventType, payload, callback) { + const messageId = payload.messageId || generateRandomId(); + let timestamp = new Date(); + if (payload.timestamp) { + const payloadDate = new Date(payload.timestamp); + if (isValidDate(payloadDate)) { + timestamp = payloadDate; + } + } + const modifiedPayload = { ...payload, messageId, timestamp }; + this.store.updateState({ + segmentApiCalls: { + ...this.store.getState().segmentApiCalls, + [messageId]: { + eventType, + payload: { + ...modifiedPayload, + timestamp: modifiedPayload.timestamp.toString(), + }, + callback, + }, + }, + }); + const modifiedCallback = (result) => { + const { segmentApiCalls } = this.store.getState(); + delete segmentApiCalls[messageId]; + this.store.updateState({ + segmentApiCalls, + }); + return callback?.(result); + }; + this.segment[eventType](modifiedPayload, modifiedCallback); + } } diff --git a/app/scripts/controllers/metametrics.test.js b/app/scripts/controllers/metametrics.test.js index 1ad4e18d6bec..297a219123ed 100644 --- a/app/scripts/controllers/metametrics.test.js +++ b/app/scripts/controllers/metametrics.test.js @@ -9,6 +9,7 @@ import { } from '../../../shared/constants/metametrics'; import waitUntilCalled from '../../../test/lib/wait-until-called'; import { CHAIN_IDS, CURRENCY_SYMBOLS } from '../../../shared/constants/network'; +import * as Utils from '../lib/util'; import MetaMetricsController from './metametrics'; import { NETWORK_EVENTS } from './network'; @@ -19,6 +20,7 @@ const NETWORK = 'Mainnet'; const FAKE_CHAIN_ID = '0x1338'; const LOCALE = 'en_US'; const TEST_META_METRICS_ID = '0xabc'; +const DUMMY_ACTION_ID = 'DUMMY_ACTION_ID'; const MOCK_TRAITS = { test_boolean: true, @@ -124,9 +126,10 @@ function getMetaMetricsController({ metaMetricsId = TEST_META_METRICS_ID, preferencesStore = getMockPreferencesStore(), networkController = getMockNetworkController(), + segmentInstance, } = {}) { return new MetaMetricsController({ - segment, + segment: segmentInstance || segment, getNetworkIdentifier: networkController.getNetworkIdentifier.bind(networkController), getCurrentChainId: @@ -145,10 +148,17 @@ function getMetaMetricsController({ testid: SAMPLE_PERSISTED_EVENT, testid2: SAMPLE_NON_PERSISTED_EVENT, }, + events: {}, }, }); } describe('MetaMetricsController', function () { + const now = new Date(); + let clock; + beforeEach(function () { + clock = sinon.useFakeTimers(now.getTime()); + sinon.stub(Utils, 'generateRandomId').returns('DUMMY_RANDOM_ID'); + }); describe('constructor', function () { it('should properly initialize', function () { const mock = sinon.mock(segment); @@ -163,6 +173,8 @@ describe('MetaMetricsController', function () { ...DEFAULT_EVENT_PROPERTIES, test: true, }, + messageId: Utils.generateRandomId(), + timestamp: new Date(), }); const metaMetricsController = getMetaMetricsController(); assert.strictEqual(metaMetricsController.version, VERSION); @@ -233,15 +245,18 @@ describe('MetaMetricsController', function () { }); const mock = sinon.mock(segment); - mock - .expects('identify') - .once() - .withArgs({ userId: TEST_META_METRICS_ID, traits: MOCK_TRAITS }); + mock.expects('identify').once().withArgs({ + userId: TEST_META_METRICS_ID, + traits: MOCK_TRAITS, + messageId: Utils.generateRandomId(), + timestamp: new Date(), + }); metaMetricsController.identify({ ...MOCK_TRAITS, ...MOCK_INVALID_TRAITS, }); + mock.verify(); }); @@ -263,6 +278,8 @@ describe('MetaMetricsController', function () { traits: { test_date: mockDateISOString, }, + messageId: Utils.generateRandomId(), + timestamp: new Date(), }); metaMetricsController.identify({ @@ -358,6 +375,8 @@ describe('MetaMetricsController', function () { test: 1, ...DEFAULT_EVENT_PROPERTIES, }, + messageId: Utils.generateRandomId(), + timestamp: new Date(), }); metaMetricsController.submitEvent( { @@ -388,6 +407,8 @@ describe('MetaMetricsController', function () { test: 1, ...DEFAULT_EVENT_PROPERTIES, }, + messageId: Utils.generateRandomId(), + timestamp: new Date(), }); metaMetricsController.submitEvent( { @@ -417,6 +438,8 @@ describe('MetaMetricsController', function () { legacy_event: true, ...DEFAULT_EVENT_PROPERTIES, }, + messageId: Utils.generateRandomId(), + timestamp: new Date(), }); metaMetricsController.submitEvent( { @@ -439,12 +462,14 @@ describe('MetaMetricsController', function () { .once() .withArgs({ event: 'Fake Event', - userId: TEST_META_METRICS_ID, - context: DEFAULT_TEST_CONTEXT, properties: { test: 1, ...DEFAULT_EVENT_PROPERTIES, }, + context: DEFAULT_TEST_CONTEXT, + userId: TEST_META_METRICS_ID, + messageId: Utils.generateRandomId(), + timestamp: new Date(), }); metaMetricsController.submitEvent({ event: 'Fake Event', @@ -519,6 +544,8 @@ describe('MetaMetricsController', function () { foo: 'bar', ...DEFAULT_EVENT_PROPERTIES, }, + messageId: Utils.generateRandomId(), + timestamp: new Date(), }), ); assert.ok( @@ -527,6 +554,8 @@ describe('MetaMetricsController', function () { userId: TEST_META_METRICS_ID, context: DEFAULT_TEST_CONTEXT, properties: DEFAULT_EVENT_PROPERTIES, + messageId: Utils.generateRandomId(), + timestamp: new Date(), }), ); }); @@ -547,6 +576,8 @@ describe('MetaMetricsController', function () { params: null, ...DEFAULT_PAGE_PROPERTIES, }, + messageId: Utils.generateRandomId(), + timestamp: new Date(), }); metaMetricsController.trackPage({ name: 'home', @@ -590,6 +621,8 @@ describe('MetaMetricsController', function () { params: null, ...DEFAULT_PAGE_PROPERTIES, }, + messageId: Utils.generateRandomId(), + timestamp: new Date(), }); metaMetricsController.trackPage( { @@ -602,6 +635,50 @@ describe('MetaMetricsController', function () { ); mock.verify(); }); + + it('multiple trackPage call with same actionId should result in same messageId being sent to segment', function () { + const mock = sinon.mock(segment); + const metaMetricsController = getMetaMetricsController({ + preferencesStore: getMockPreferencesStore({ + participateInMetaMetrics: null, + }), + }); + mock + .expects('page') + .twice() + .withArgs({ + name: 'home', + userId: TEST_META_METRICS_ID, + context: DEFAULT_TEST_CONTEXT, + properties: { + params: null, + ...DEFAULT_PAGE_PROPERTIES, + }, + messageId: DUMMY_ACTION_ID, + timestamp: new Date(), + }); + metaMetricsController.trackPage( + { + name: 'home', + params: null, + actionId: DUMMY_ACTION_ID, + environmentType: ENVIRONMENT_TYPE_BACKGROUND, + page: METAMETRICS_BACKGROUND_PAGE_OBJECT, + }, + { isOptInPath: true }, + ); + metaMetricsController.trackPage( + { + name: 'home', + params: null, + actionId: DUMMY_ACTION_ID, + environmentType: ENVIRONMENT_TYPE_BACKGROUND, + page: METAMETRICS_BACKGROUND_PAGE_OBJECT, + }, + { isOptInPath: true }, + ); + mock.verify(); + }); }); describe('_buildUserTraitsObject', function () { @@ -638,9 +715,9 @@ describe('MetaMetricsController', function () { const traits = metaMetricsController._buildUserTraitsObject({ addressBook: { [CHAIN_IDS.MAINNET]: [{ address: '0x' }], - [CHAIN_IDS.ROPSTEN]: [{ address: '0x' }, { address: '0x0' }], + [CHAIN_IDS.GOERLI]: [{ address: '0x' }, { address: '0x0' }], }, - allCollectibles: { + allNfts: { '0xac706cE8A9BF27Afecf080fB298d0ee13cfb978A': { 56: [ { @@ -669,14 +746,13 @@ describe('MetaMetricsController', function () { allTokens: MOCK_ALL_TOKENS, frequentRpcListDetail: [ { chainId: CHAIN_IDS.MAINNET, ticker: CURRENCY_SYMBOLS.ETH }, - { chainId: CHAIN_IDS.ROPSTEN, ticker: CURRENCY_SYMBOLS.TEST_ETH }, + { chainId: CHAIN_IDS.GOERLI, ticker: CURRENCY_SYMBOLS.TEST_ETH }, { chainId: '0xaf' }, ], identities: [{}, {}], ledgerTransportType: 'web-hid', openSeaEnabled: true, - threeBoxSyncingAllowed: false, - useCollectibleDetection: false, + useNftDetection: false, theme: 'default', useTokenDetection: true, }); @@ -685,7 +761,7 @@ describe('MetaMetricsController', function () { [TRAITS.ADDRESS_BOOK_ENTRIES]: 3, [TRAITS.INSTALL_DATE_EXT]: '', [TRAITS.LEDGER_CONNECTION_TYPE]: 'web-hid', - [TRAITS.NETWORKS_ADDED]: [CHAIN_IDS.MAINNET, CHAIN_IDS.ROPSTEN, '0xaf'], + [TRAITS.NETWORKS_ADDED]: [CHAIN_IDS.MAINNET, CHAIN_IDS.GOERLI, '0xaf'], [TRAITS.NETWORKS_WITHOUT_TICKER]: ['0xaf'], [TRAITS.NFT_AUTODETECTION_ENABLED]: false, [TRAITS.NUMBER_OF_ACCOUNTS]: 2, @@ -704,18 +780,17 @@ describe('MetaMetricsController', function () { metaMetricsController._buildUserTraitsObject({ addressBook: { [CHAIN_IDS.MAINNET]: [{ address: '0x' }], - [CHAIN_IDS.ROPSTEN]: [{ address: '0x' }, { address: '0x0' }], + [CHAIN_IDS.GOERLI]: [{ address: '0x' }, { address: '0x0' }], }, allTokens: {}, frequentRpcListDetail: [ { chainId: CHAIN_IDS.MAINNET }, - { chainId: CHAIN_IDS.ROPSTEN }, + { chainId: CHAIN_IDS.GOERLI }, ], ledgerTransportType: 'web-hid', openSeaEnabled: true, identities: [{}, {}], - threeBoxSyncingAllowed: false, - useCollectibleDetection: false, + useNftDetection: false, theme: 'default', useTokenDetection: true, }); @@ -723,20 +798,19 @@ describe('MetaMetricsController', function () { const updatedTraits = metaMetricsController._buildUserTraitsObject({ addressBook: { [CHAIN_IDS.MAINNET]: [{ address: '0x' }, { address: '0x1' }], - [CHAIN_IDS.ROPSTEN]: [{ address: '0x' }, { address: '0x0' }], + [CHAIN_IDS.GOERLI]: [{ address: '0x' }, { address: '0x0' }], }, allTokens: { '0x1': { '0xabcde': [{ '0x12345': { address: '0xtestAddress' } }] }, }, frequentRpcListDetail: [ { chainId: CHAIN_IDS.MAINNET }, - { chainId: CHAIN_IDS.ROPSTEN }, + { chainId: CHAIN_IDS.GOERLI }, ], ledgerTransportType: 'web-hid', openSeaEnabled: false, identities: [{}, {}, {}], - threeBoxSyncingAllowed: false, - useCollectibleDetection: false, + useNftDetection: false, theme: 'default', useTokenDetection: true, }); @@ -754,18 +828,17 @@ describe('MetaMetricsController', function () { metaMetricsController._buildUserTraitsObject({ addressBook: { [CHAIN_IDS.MAINNET]: [{ address: '0x' }], - [CHAIN_IDS.ROPSTEN]: [{ address: '0x' }, { address: '0x0' }], + [CHAIN_IDS.GOERLI]: [{ address: '0x' }, { address: '0x0' }], }, allTokens: {}, frequentRpcListDetail: [ { chainId: CHAIN_IDS.MAINNET }, - { chainId: CHAIN_IDS.ROPSTEN }, + { chainId: CHAIN_IDS.GOERLI }, ], ledgerTransportType: 'web-hid', openSeaEnabled: true, identities: [{}, {}], - threeBoxSyncingAllowed: false, - useCollectibleDetection: true, + useNftDetection: true, theme: 'default', useTokenDetection: true, }); @@ -773,18 +846,17 @@ describe('MetaMetricsController', function () { const updatedTraits = metaMetricsController._buildUserTraitsObject({ addressBook: { [CHAIN_IDS.MAINNET]: [{ address: '0x' }], - [CHAIN_IDS.ROPSTEN]: [{ address: '0x' }, { address: '0x0' }], + [CHAIN_IDS.GOERLI]: [{ address: '0x' }, { address: '0x0' }], }, allTokens: {}, frequentRpcListDetail: [ { chainId: CHAIN_IDS.MAINNET }, - { chainId: CHAIN_IDS.ROPSTEN }, + { chainId: CHAIN_IDS.GOERLI }, ], ledgerTransportType: 'web-hid', openSeaEnabled: true, identities: [{}, {}], - threeBoxSyncingAllowed: false, - useCollectibleDetection: true, + useNftDetection: true, theme: 'default', useTokenDetection: true, }); @@ -793,9 +865,35 @@ describe('MetaMetricsController', function () { }); }); + describe('submitting segmentApiCalls to segment SDK', function () { + it('should add event to store when submitting to SDK', function () { + const metaMetricsController = getMetaMetricsController({}); + metaMetricsController.trackPage({}, { isOptIn: true }); + const { segmentApiCalls } = metaMetricsController.store.getState(); + assert(Object.keys(segmentApiCalls).length > 0); + }); + + it('should remove event from store when callback is invoked', function () { + const segmentInstance = createSegmentMock(2, 10000); + const stubFn = (_, cb) => { + cb(); + }; + sinon.stub(segmentInstance, 'track').callsFake(stubFn); + sinon.stub(segmentInstance, 'page').callsFake(stubFn); + + const metaMetricsController = getMetaMetricsController({ + segmentInstance, + }); + metaMetricsController.trackPage({}, { isOptIn: true }); + const { segmentApiCalls } = metaMetricsController.store.getState(); + assert(Object.keys(segmentApiCalls).length === 0); + }); + }); + afterEach(function () { // flush the queues manually after each test segment.flush(); + clock.restore(); sinon.restore(); }); }); diff --git a/app/scripts/controllers/network/createInfuraClient.test.js b/app/scripts/controllers/network/createInfuraClient.test.js index 0d7ac9557177..404489ece544 100644 --- a/app/scripts/controllers/network/createInfuraClient.test.js +++ b/app/scripts/controllers/network/createInfuraClient.test.js @@ -2,7 +2,10 @@ * @jest-environment node */ -import { withInfuraClient } from './provider-api-tests/helpers'; +import { + withMockedInfuraCommunications, + withInfuraClient, +} from './provider-api-tests/helpers'; import { testsForRpcMethodNotHandledByMiddleware, testsForRpcMethodAssumingNoBlockParam, @@ -34,7 +37,7 @@ describe('createInfuraClient', () => { describe('eth_chainId', () => { it('does not hit Infura, instead returning the chain id that maps to the Infura network, as a hex string', async () => { const chainId = await withInfuraClient( - { network: 'ropsten' }, + { network: 'goerli' }, ({ makeRpcCall }) => { return makeRpcCall({ method: 'eth_chainId', @@ -42,7 +45,7 @@ describe('createInfuraClient', () => { }, ); - expect(chainId).toStrictEqual('0x3'); + expect(chainId).toStrictEqual('0x5'); }); }); @@ -141,9 +144,36 @@ describe('createInfuraClient', () => { }); describe('eth_getTransactionByHash', () => { - testsForRpcMethodsThatCheckForBlockHashInResponse( - 'eth_getTransactionByHash', - ); + const method = 'eth_getTransactionByHash'; + + testsForRpcMethodsThatCheckForBlockHashInResponse(method); + + it("refreshes the block tracker's current block if it is less than the block number that comes back in the response", async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the latest + // block number is retrieved through the block tracker first. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + // This is our request. + comms.mockInfuraRpcCall({ + request, + response: { + result: { + blockNumber: '0x200', + }, + }, + }); + // The block-tracker-inspector middleware will request the latest + // block through the block tracker again. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x300' }); + + await withInfuraClient(async ({ makeRpcCall, blockTracker }) => { + await makeRpcCall(request); + expect(blockTracker.getCurrentBlock()).toStrictEqual('0x300'); + }); + }); + }); }); describe('eth_getTransactionCount', () => { @@ -153,9 +183,36 @@ describe('createInfuraClient', () => { }); describe('eth_getTransactionReceipt', () => { - testsForRpcMethodsThatCheckForBlockHashInResponse( - 'eth_getTransactionReceipt', - ); + const method = 'eth_getTransactionReceipt'; + + testsForRpcMethodsThatCheckForBlockHashInResponse(method); + + it("refreshes the block tracker's current block if it is less than the block number that comes back in the response", async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the latest + // block number is retrieved through the block tracker first. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + // This is our request. + comms.mockInfuraRpcCall({ + request, + response: { + result: { + blockNumber: '0x200', + }, + }, + }); + // The block-tracker-inspector middleware will request the latest + // block through the block tracker again. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x300' }); + + await withInfuraClient(async ({ makeRpcCall, blockTracker }) => { + await makeRpcCall(request); + expect(blockTracker.getCurrentBlock()).toStrictEqual('0x300'); + }); + }); + }); }); describe('eth_getUncleByBlockHashAndIndex', () => { @@ -286,7 +343,7 @@ describe('createInfuraClient', () => { describe('net_version', () => { it('does not hit Infura, instead returning the chain id that maps to the Infura network, as a decimal string', async () => { const chainId = await withInfuraClient( - { network: 'ropsten' }, + { network: 'goerli' }, ({ makeRpcCall }) => { return makeRpcCall({ method: 'net_version', @@ -294,7 +351,7 @@ describe('createInfuraClient', () => { }, ); - expect(chainId).toStrictEqual('3'); + expect(chainId).toStrictEqual('5'); }); }); diff --git a/app/scripts/controllers/network/network-controller.test.js b/app/scripts/controllers/network/network-controller.test.js index ec47eefdca62..64afce45a8f8 100644 --- a/app/scripts/controllers/network/network-controller.test.js +++ b/app/scripts/controllers/network/network-controller.test.js @@ -133,42 +133,6 @@ describe('NetworkController', () => { describe('utils', () => { it('getNetworkDisplayName should return the correct network name', () => { const tests = [ - { - input: '3', - expected: 'Ropsten', - }, - { - input: '4', - expected: 'Rinkeby', - }, - { - input: '42', - expected: 'Kovan', - }, - { - input: '0x3', - expected: 'Ropsten', - }, - { - input: '0x4', - expected: 'Rinkeby', - }, - { - input: '0x2a', - expected: 'Kovan', - }, - { - input: 'ropsten', - expected: 'Ropsten', - }, - { - input: 'rinkeby', - expected: 'Rinkeby', - }, - { - input: 'kovan', - expected: 'Kovan', - }, { input: 'mainnet', expected: 'Ethereum Mainnet', diff --git a/app/scripts/controllers/network/network.js b/app/scripts/controllers/network/network.js index 8214da8948b6..d0f6bdd65c2a 100644 --- a/app/scripts/controllers/network/network.js +++ b/app/scripts/controllers/network/network.js @@ -39,9 +39,9 @@ if (process.env.IN_TEST) { }; } else if (process.env.METAMASK_DEBUG || env === 'test') { defaultProviderConfigOpts = { - type: NETWORK_TYPES.RINKEBY, - chainId: CHAIN_IDS.RINKEBY, - ticker: TEST_NETWORK_TICKER_MAP.rinkeby, + type: NETWORK_TYPES.GOERLI, + chainId: CHAIN_IDS.GOERLI, + ticker: TEST_NETWORK_TICKER_MAP.GOERLI, }; } else { defaultProviderConfigOpts = { diff --git a/app/scripts/controllers/network/pending-middleware.test.js b/app/scripts/controllers/network/pending-middleware.test.js index 9544dc7920f9..5b34a48c3cc2 100644 --- a/app/scripts/controllers/network/pending-middleware.test.js +++ b/app/scripts/controllers/network/pending-middleware.test.js @@ -70,7 +70,7 @@ describe('PendingNonceMiddleware', () => { gasPrice: '0x1e8480', hash: '0x2cc5a25744486f7383edebbf32003e5a66e18135799593d6b5cdd2bb43674f09', input: '0x', - nonce: '0x4', + nonce: '0x5', type: TRANSACTION_ENVELOPE_TYPES.LEGACY, to: '0xf231d46dd78806e1dd93442cf33c7671f8538748', transactionIndex: null, diff --git a/app/scripts/controllers/network/provider-api-tests/helpers.js b/app/scripts/controllers/network/provider-api-tests/helpers.js index 9b4c22460777..d49cdb7c2072 100644 --- a/app/scripts/controllers/network/provider-api-tests/helpers.js +++ b/app/scripts/controllers/network/provider-api-tests/helpers.js @@ -38,37 +38,37 @@ import createInfuraClient from '../createInfuraClient'; */ /** - * @typedef {{ nockScope: NockScope, blockNumber: string }} MockNextBlockTrackerRequestOptions + * @typedef {{ nockScope: NockScope, blockNumber: string }} MockBlockTrackerRequestOptions * - * The options to `mockNextBlockTrackerRequest`. + * The options to `mockNextBlockTrackerRequest` and `mockAllBlockTrackerRequests`. */ /** - * @typedef {{ nockScope: NockScope, request: object, response: object, delay?: number }} MockSuccessfulInfuraRpcCallOptions + * @typedef {{ nockScope: NockScope, request: object, response: object, delay?: number }} MockInfuraRpcCallOptions * - * The options to `mockSuccessfulInfuraRpcCall`. + * The options to `mockInfuraRpcCall`. */ /** - * @typedef {{mockNextBlockTrackerRequest: (options: Omit) => void, mockSuccessfulInfuraRpcCall: (options: Omit) => NockScope}} InfuraCommunications + * @typedef {{mockNextBlockTrackerRequest: (options: Omit) => void, mockAllBlockTrackerRequests: (options: Omit) => void, mockInfuraRpcCall: (options: Omit) => NockScope}} InfuraCommunications * * Provides methods to mock different kinds of requests to Infura. */ /** - * @typedef {{network: string}} MockingInfuraCommunicationsOptions + * @typedef {{network: string}} WithMockedInfuraCommunicationsOptions * * The options bag that `mockingInfuraCommunications` takes. */ /** - * @typedef {(comms: InfuraCommunications) => Promise} MockingInfuraCommunicationsCallback + * @typedef {(comms: InfuraCommunications) => Promise} WithMockedInfuraCommunicationsCallback * * The callback that `mockingInfuraCommunications` takes. */ /** - * @typedef {[MockingInfuraCommunicationsOptions, MockingInfuraCommunicationsCallback] | [MockingInfuraCommunicationsCallback]} MockingInfuraCommunicationsArgs + * @typedef {[WithMockedInfuraCommunicationsOptions, WithMockedInfuraCommunicationsCallback] | [WithMockedInfuraCommunicationsCallback]} WithMockedInfuraCommunicationsArgs * * The arguments to `mockingInfuraCommunications`. */ @@ -111,7 +111,7 @@ function buildScopeForMockingInfuraRequests({ network = 'mainnet' } = {}) { /** * Mocks the next request for the latest block that the block tracker will make. * - * @param {MockNextBlockTrackerRequestOptions} args - The arguments. + * @param {MockBlockTrackerRequestOptions} args - The arguments. * @param {NockScope} args.nockScope - A nock scope (a set of mocked requests * scoped to a certain base URL). * @param {string} args.blockNumber - The block number that the block tracker @@ -121,35 +121,80 @@ async function mockNextBlockTrackerRequest({ nockScope, blockNumber = DEFAULT_LATEST_BLOCK_NUMBER, }) { - await mockSuccessfulInfuraRpcCall({ + await mockInfuraRpcCall({ nockScope, request: { method: 'eth_blockNumber', params: [] }, response: { result: blockNumber }, }); } +/** + * Mocks all requests for the latest block that the block tracker will make. + * + * @param {MockBlockTrackerRequestOptions} args - The arguments. + * @param {NockScope} args.nockScope - A nock scope (a set of mocked requests + * scoped to a certain base URL). + * @param {string} args.blockNumber - The block number that the block tracker + * should report, as a 0x-prefixed hex string. + */ +async function mockAllBlockTrackerRequests({ + nockScope, + blockNumber = DEFAULT_LATEST_BLOCK_NUMBER, +}) { + await mockInfuraRpcCall({ + nockScope, + request: { method: 'eth_blockNumber', params: [] }, + response: { result: blockNumber }, + }).persist(); +} + /** * Mocks a JSON-RPC request sent to Infura with the given response. * - * @param {MockSuccessfulInfuraRpcCallOptions} args - The arguments. + * @param {MockInfuraRpcCallOptions} args - The arguments. * @param {NockScope} args.nockScope - A nock scope (a set of mocked requests * scoped to a certain base URL). * @param {object} args.request - The request data. - * @param {object} args.response - The response that the request should have. - * @param {number} args.delay - The amount of time that should pass before the + * @param {{body: string} | {httpStatus?: number; id?: number; method?: string; params?: string[]}} [args.response] - Information + * concerning the response that the request should have. If a `body` property is + * present, this is taken as the complete response body. If an `httpStatus` + * property is present, then it is taken as the HTTP status code to respond + * with. Properties other than these two are used to build a complete response + * body (including `id` and `jsonrpc` properties). + * @param {Error | string} [args.error] - An error to throw while making the + * request. Takes precedence over `response`. + * @param {number} [args.delay] - The amount of time that should pass before the * request resolves with the response. + * @param {number} [args.times] - The number of times that the request is + * expected to be made. * @returns {NockScope} The nock scope. */ -function mockSuccessfulInfuraRpcCall({ nockScope, request, response, delay }) { - // eth-query always passes `params`, so even if we don't supply this property +function mockInfuraRpcCall({ + nockScope, + request, + response, + error, + delay, + times, +}) { + // eth-query always passes `params`, so even if we don't supply this property, // for consistency with makeRpcCall, assume that the `body` contains it const { method, params = [], ...rest } = request; - const completeResponse = { - id: 1, - jsonrpc: '2.0', - ...response, - }; - const nockRequest = nockScope.post(`/v3/${INFURA_PROJECT_ID}`, { + const httpStatus = response?.httpStatus ?? 200; + let completeResponse; + if (response !== undefined) { + if (response.body === undefined) { + completeResponse = { id: 1, jsonrpc: '2.0' }; + ['id', 'jsonrpc', 'result', 'error'].forEach((prop) => { + if (response[prop] !== undefined) { + completeResponse[prop] = response[prop]; + } + }); + } else { + completeResponse = response.body; + } + } + let nockRequest = nockScope.post(`/v3/${INFURA_PROJECT_ID}`, { jsonrpc: '2.0', method, params, @@ -157,10 +202,19 @@ function mockSuccessfulInfuraRpcCall({ nockScope, request, response, delay }) { }); if (delay !== undefined) { - nockRequest.delay(delay); + nockRequest = nockRequest.delay(delay); + } + + if (times !== undefined) { + nockRequest = nockRequest.times(times); } - return nockRequest.reply(200, completeResponse); + if (error !== undefined) { + return nockRequest.replyWithError(error); + } else if (completeResponse !== undefined) { + return nockRequest.reply(httpStatus, completeResponse); + } + return nockRequest; } /** @@ -189,7 +243,7 @@ function makeRpcCall(ethQuery, request) { /** * Sets up request mocks for requests to Infura. * - * @param {MockingInfuraCommunicationsArgs} args - Either an options bag + a + * @param {WithMockedInfuraCommunicationsArgs} args - Either an options bag + a * function, or just a function. The options bag, at the moment, may contain * `network` (that is, the Infura network; defaults to "mainnet"). The function * is called with an object that allows you to mock different kinds of requests. @@ -202,11 +256,14 @@ export async function withMockedInfuraCommunications(...args) { const nockScope = buildScopeForMockingInfuraRequests({ network }); const curriedMockNextBlockTrackerRequest = (localOptions) => mockNextBlockTrackerRequest({ nockScope, ...localOptions }); - const curriedMockSuccessfulInfuraRpcCall = (localOptions) => - mockSuccessfulInfuraRpcCall({ nockScope, ...localOptions }); + const curriedMockAllBlockTrackerRequests = (localOptions) => + mockAllBlockTrackerRequests({ nockScope, ...localOptions }); + const curriedMockInfuraRpcCall = (localOptions) => + mockInfuraRpcCall({ nockScope, ...localOptions }); const comms = { mockNextBlockTrackerRequest: curriedMockNextBlockTrackerRequest, - mockSuccessfulInfuraRpcCall: curriedMockSuccessfulInfuraRpcCall, + mockAllBlockTrackerRequests: curriedMockAllBlockTrackerRequests, + mockInfuraRpcCall: curriedMockInfuraRpcCall, }; try { @@ -258,9 +315,10 @@ export async function withInfuraClient(...args) { // depends on `setTimeout`) const clock = sinon.useFakeTimers(); const client = { + blockTracker, + clock, makeRpcCall: curriedMakeRpcCall, makeRpcCallsInSeries, - clock, }; try { diff --git a/app/scripts/controllers/network/provider-api-tests/shared-tests.js b/app/scripts/controllers/network/provider-api-tests/shared-tests.js index aafa2155a9b1..30d02170c0e4 100644 --- a/app/scripts/controllers/network/provider-api-tests/shared-tests.js +++ b/app/scripts/controllers/network/provider-api-tests/shared-tests.js @@ -9,6 +9,57 @@ import { buildRequestWithReplacedBlockParam, } from './helpers'; +const originalSetTimeout = setTimeout; + +/** + * Some middleware contain logic which retries the request if some condition + * applies. This retrying always happens out of band via `setTimeout`, and + * because we are stubbing time via Jest's fake timers, we have to manually + * advance the clock so that the `setTimeout` handlers get fired. We don't know + * when these timers will get created, however, so we have to keep advancing + * timers until the request has been made an appropriate number of times. + * Unfortunately we don't have a good way to know how many times a request has + * been retried, but the good news is that the middleware won't end, and thus + * the promise which the RPC call returns won't get fulfilled, until all retries + * have been made. + * + * @param promise - The promise which is returned by the RPC call. + * @param clock - A Sinon clock object which can be used to advance to the next + * `setTimeout` handler. + */ +async function waitForPromiseToBeFulfilledAfterRunningAllTimers( + promise, + clock, +) { + let hasPromiseBeenFulfilled = false; + let numTimesClockHasBeenAdvanced = 0; + + promise + .catch(() => { + // This is used to silence Node.js warnings about the rejection + // being handled asynchronously. The error is handled later when + // `promise` is awaited. + }) + .finally(() => { + hasPromiseBeenFulfilled = true; + }); + + // `isPromiseFulfilled` is modified asynchronously. + /* eslint-disable-next-line no-unmodified-loop-condition */ + while (!hasPromiseBeenFulfilled && numTimesClockHasBeenAdvanced < 15) { + clock.runAll(); + await new Promise((resolve) => originalSetTimeout(resolve, 10)); + numTimesClockHasBeenAdvanced += 1; + } + + return promise; +} + +/** + * Defines tests which exercise the behavior exhibited by an RPC method that + * does not support params (which affects how the method is cached). + */ +/* eslint-disable-next-line jest/no-export */ export function testsForRpcMethodNotHandledByMiddleware( method, { numberOfParameters }, @@ -25,7 +76,7 @@ export function testsForRpcMethodNotHandledByMiddleware( // number is retrieved through the block tracker first. It doesn't // matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request, response: { result: expectedResult }, }); @@ -55,7 +106,7 @@ export function testsForRpcMethodAssumingNoBlockParam(method) { // number is retrieved through the block tracker first. It doesn't // matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); @@ -78,12 +129,12 @@ export function testsForRpcMethodAssumingNoBlockParam(method) { // the second RPC request, but rather because we call `clock.runAll()` // below. comms.mockNextBlockTrackerRequest({ blockNumber: '0x1' }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); comms.mockNextBlockTrackerRequest({ blockNumber: '0x2' }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[1], response: { result: mockResults[1] }, }); @@ -112,11 +163,11 @@ export function testsForRpcMethodAssumingNoBlockParam(method) { // number is retrieved through the block tracker first. It doesn't // matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[1], response: { result: mockResults[1] }, }); @@ -129,6 +180,265 @@ export function testsForRpcMethodAssumingNoBlockParam(method) { }); }, ); + + it('queues requests while a previous identical call is still pending, then runs the queue when it finishes, reusing the result from the first request', async () => { + const requests = [{ method }, { method }, { method }]; + const mockResults = ['first result', 'second result', 'third result']; + + await withMockedInfuraCommunications(async (comms) => { + // The first time a block-cacheable request is made, the latest block + // number is retrieved through the block tracker first. It doesn't + // matter what this is — it's just used as a cache key. + comms.mockNextBlockTrackerRequest(); + comms.mockInfuraRpcCall({ + request: requests[0], + response: { result: mockResults[0] }, + delay: 100, + }); + comms.mockInfuraRpcCall({ + request: requests[1], + response: { result: mockResults[1] }, + }); + comms.mockInfuraRpcCall({ + request: requests[2], + response: { result: mockResults[2] }, + }); + + const results = await withInfuraClient(async (client) => { + const resultPromises = [ + client.makeRpcCall(requests[0]), + client.makeRpcCall(requests[1]), + client.makeRpcCall(requests[2]), + ]; + const firstResult = await resultPromises[0]; + // The inflight cache middleware uses setTimeout to run the handlers, + // so run them now + client.clock.runAll(); + const remainingResults = await Promise.all(resultPromises.slice(1)); + return [firstResult, ...remainingResults]; + }); + + expect(results).toStrictEqual([ + mockResults[0], + mockResults[0], + mockResults[0], + ]); + }); + }); + + it('throws a custom error if the request to Infura returns a 405 response', async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the latest block + // number is retrieved through the block tracker first. It doesn't + // matter what this is — it's just used as a cache key. + comms.mockNextBlockTrackerRequest(); + comms.mockInfuraRpcCall({ + request, + response: { + httpStatus: 405, + }, + }); + const promiseForResult = withInfuraClient(async ({ makeRpcCall }) => + makeRpcCall(request), + ); + + await expect(promiseForResult).rejects.toThrow( + 'The method does not exist / is not available', + ); + }); + }); + + it('throws a custom error if the request to Infura returns a 429 response', async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the latest block + // number is retrieved through the block tracker first. It doesn't + // matter what this is — it's just used as a cache key. + comms.mockNextBlockTrackerRequest(); + comms.mockInfuraRpcCall({ + request, + response: { + httpStatus: 429, + }, + }); + const promiseForResult = withInfuraClient(async ({ makeRpcCall }) => + makeRpcCall(request), + ); + + await expect(promiseForResult).rejects.toThrow( + 'Request is being rate limited', + ); + }); + }); + + it('throws a custom error if the request to Infura returns a response that is not 405, 429, 503, or 504', async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the latest block + // number is retrieved through the block tracker first. It doesn't + // matter what this is — it's just used as a cache key. + comms.mockNextBlockTrackerRequest(); + comms.mockInfuraRpcCall({ + request, + response: { + id: 12345, + jsonrpc: '2.0', + error: 'some error', + httpStatus: 420, + }, + }); + const promiseForResult = withInfuraClient(async ({ makeRpcCall }) => + makeRpcCall(request), + ); + + await expect(promiseForResult).rejects.toThrow( + '{"id":12345,"jsonrpc":"2.0","error":"some error"}', + ); + }); + }); + + [503, 504].forEach((httpStatus) => { + it(`retries the request to Infura up to 5 times if it returns a ${httpStatus} response, returning the successful result if there is one on the 5th try`, async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the latest block + // number is retrieved through the block tracker first. It doesn't + // matter what this is — it's just used as a cache key. + comms.mockNextBlockTrackerRequest(); + // Here we have the request fail for the first 4 tries, then succeed + // on the 5th try. + comms.mockInfuraRpcCall({ + request, + response: { + error: 'Some error', + httpStatus, + }, + times: 4, + }); + comms.mockInfuraRpcCall({ + request, + response: { + result: 'the result', + httpStatus: 200, + }, + }); + const result = await withInfuraClient( + async ({ makeRpcCall, clock }) => { + return await waitForPromiseToBeFulfilledAfterRunningAllTimers( + makeRpcCall(request), + clock, + ); + }, + ); + + expect(result).toStrictEqual('the result'); + }); + }); + + it(`causes a request to fail with a custom error if the request to Infura returns a ${httpStatus} response 5 times in a row`, async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the latest block + // number is retrieved through the block tracker first. It doesn't + // matter what this is — it's just used as a cache key. + comms.mockNextBlockTrackerRequest(); + comms.mockInfuraRpcCall({ + request, + response: { + error: 'Some error', + httpStatus, + }, + times: 5, + }); + const promiseForResult = withInfuraClient( + async ({ makeRpcCall, clock }) => { + return await waitForPromiseToBeFulfilledAfterRunningAllTimers( + makeRpcCall(request), + clock, + ); + }, + ); + + await expect(promiseForResult).rejects.toThrow( + /^InfuraProvider - cannot complete request\. All retries exhausted\..+Gateway timeout/su, + ); + }); + }); + }); + + ['ETIMEDOUT', 'ECONNRESET', 'SyntaxError'].forEach((errorMessagePrefix) => { + it(`retries the request to Infura up to 5 times if an "${errorMessagePrefix}" error is thrown while making the request, returning the successful result if there is one on the 5th try`, async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the latest block + // number is retrieved through the block tracker first. It doesn't + // matter what this is — it's just used as a cache key. + comms.mockNextBlockTrackerRequest(); + // Here we have the request fail for the first 4 tries, then succeed + // on the 5th try. + comms.mockInfuraRpcCall({ + request, + error: `${errorMessagePrefix}: Some message`, + times: 4, + }); + comms.mockInfuraRpcCall({ + request, + response: { + result: 'the result', + httpStatus: 200, + }, + }); + const result = await withInfuraClient( + async ({ makeRpcCall, clock }) => { + return await waitForPromiseToBeFulfilledAfterRunningAllTimers( + makeRpcCall(request), + clock, + ); + }, + ); + + expect(result).toStrictEqual('the result'); + }); + }); + + it(`causes a request to fail with a custom error if an "${errorMessagePrefix}" error is thrown while making the request to Infura 5 times in a row`, async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the latest block + // number is retrieved through the block tracker first. It doesn't + // matter what this is — it's just used as a cache key. + comms.mockNextBlockTrackerRequest(); + comms.mockInfuraRpcCall({ + request, + error: `${errorMessagePrefix}: Some message`, + times: 5, + }); + const promiseForResult = withInfuraClient( + async ({ makeRpcCall, clock }) => { + return await waitForPromiseToBeFulfilledAfterRunningAllTimers( + makeRpcCall(request), + clock, + ); + }, + ); + + await expect(promiseForResult).rejects.toThrow( + new RegExp( + `^InfuraProvider - cannot complete request\\. All retries exhausted\\..+${errorMessagePrefix}: Some message`, + 'su', + ), + ); + }); + }); + }); } /** @@ -148,7 +458,7 @@ export function testsForRpcMethodsThatCheckForBlockHashInResponse(method) { // number is retrieved through the block tracker first. It doesn't // matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); @@ -172,12 +482,12 @@ export function testsForRpcMethodsThatCheckForBlockHashInResponse(method) { // because of the second RPC request, but rather because we call // `clock.runAll()` below. comms.mockNextBlockTrackerRequest({ blockNumber: '0x1' }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); comms.mockNextBlockTrackerRequest({ blockNumber: '0x2' }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[1], response: { result: mockResults[1] }, }); @@ -206,11 +516,11 @@ export function testsForRpcMethodsThatCheckForBlockHashInResponse(method) { // number is retrieved through the block tracker first. It doesn't // matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[1], response: { result: mockResults[1] }, }); @@ -219,6 +529,7 @@ export function testsForRpcMethodsThatCheckForBlockHashInResponse(method) { makeRpcCallsInSeries(requests), ); + // TODO: Does this work? expect(results).toStrictEqual(mockResults); }); }, @@ -236,11 +547,11 @@ export function testsForRpcMethodsThatCheckForBlockHashInResponse(method) { // number is retrieved through the block tracker first. It doesn't // matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[1], response: { result: mockResults[1] }, }); @@ -265,11 +576,11 @@ export function testsForRpcMethodsThatCheckForBlockHashInResponse(method) { // number is retrieved through the block tracker first. It doesn't // matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[1], response: { result: mockResults[1] }, }); @@ -298,11 +609,11 @@ export function testsForRpcMethodsThatCheckForBlockHashInResponse(method) { // number is retrieved through the block tracker first. It doesn't // matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[1], response: { result: mockResults[1] }, }); @@ -354,7 +665,7 @@ export function testsForRpcMethodSupportingBlockParam( // The block-ref middleware will make the request as specified // except that the block param is replaced with the latest block // number. - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: buildRequestWithReplacedBlockParam( requests[0], blockParamIndex, @@ -362,12 +673,6 @@ export function testsForRpcMethodSupportingBlockParam( ), response: { result: mockResults[0] }, }); - // Note that the block-ref middleware will still allow the original - // request to go through. - comms.mockSuccessfulInfuraRpcCall({ - request: requests[0], - response: { result: mockResults[0] }, - }); const results = await withInfuraClient(({ makeRpcCallsInSeries }) => makeRpcCallsInSeries(requests), @@ -394,7 +699,7 @@ export function testsForRpcMethodSupportingBlockParam( // The block-ref middleware will make the request as specified // except that the block param is replaced with the latest block // number. - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: buildRequestWithReplacedBlockParam( requests[0], blockParamIndex, @@ -402,31 +707,15 @@ export function testsForRpcMethodSupportingBlockParam( ), response: { result: mockResults[0] }, }); - // Note that the block-ref middleware will still allow the original - // request to go through. - comms.mockSuccessfulInfuraRpcCall({ - request: requests[0], - response: { result: mockResults[0] }, - }); comms.mockNextBlockTrackerRequest({ blockNumber: '0x200' }); - comms.mockSuccessfulInfuraRpcCall({ - request: requests[1], - response: { result: mockResults[1] }, - }); - // The previous two requests will happen again, with a different block - // number, in the same order. - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: buildRequestWithReplacedBlockParam( - requests[0], + requests[1], blockParamIndex, '0x200', ), response: { result: mockResults[1] }, }); - comms.mockSuccessfulInfuraRpcCall({ - request: requests[0], - response: { result: mockResults[1] }, - }); const results = await withInfuraClient(async (client) => { const firstResult = await client.makeRpcCall(requests[0]); @@ -461,7 +750,7 @@ export function testsForRpcMethodSupportingBlockParam( // The block-ref middleware will make the request as specified // except that the block param is replaced with the latest block // number. - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: buildRequestWithReplacedBlockParam( requests[0], blockParamIndex, @@ -469,25 +758,14 @@ export function testsForRpcMethodSupportingBlockParam( ), response: { result: mockResults[0] }, }); - // Note that the block-ref middleware will still allow the original - // request to go through. - comms.mockSuccessfulInfuraRpcCall({ - request: requests[0], - response: { result: mockResults[0] }, - }); - // The previous two requests will happen again, in the same order. - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: buildRequestWithReplacedBlockParam( - requests[0], + requests[1], blockParamIndex, '0x100', ), response: { result: mockResults[1] }, }); - comms.mockSuccessfulInfuraRpcCall({ - request: requests[0], - response: { result: mockResults[1] }, - }); const results = await withInfuraClient(({ makeRpcCallsInSeries }) => makeRpcCallsInSeries(requests), @@ -497,6 +775,368 @@ export function testsForRpcMethodSupportingBlockParam( }); }, ); + + it('queues requests while a previous identical call is still pending, then runs the queue when it finishes, reusing the result from the first request', async () => { + const requests = [{ method }, { method }, { method }]; + const mockResults = ['first result', 'second result', 'third result']; + + await withMockedInfuraCommunications(async (comms) => { + // The first time a block-cacheable request is made, the + // block-cache middleware will request the latest block number + // through the block tracker to determine the cache key. Later, + // the block-ref middleware will request the latest block number + // again to resolve the value of "latest", but the block number is + // cached once made, so we only need to mock the request once. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + // The block-ref middleware will make the request as specified + // except that the block param is replaced with the latest block + // number, and we delay it. + comms.mockInfuraRpcCall({ + delay: 100, + request: buildRequestWithReplacedBlockParam( + requests[0], + blockParamIndex, + '0x100', + ), + response: { result: mockResults[0] }, + }); + // The previous two requests will happen again, in the same order. + comms.mockInfuraRpcCall({ + request: buildRequestWithReplacedBlockParam( + requests[1], + blockParamIndex, + '0x100', + ), + response: { result: mockResults[1] }, + }); + comms.mockInfuraRpcCall({ + request: buildRequestWithReplacedBlockParam( + requests[2], + blockParamIndex, + '0x100', + ), + response: { result: mockResults[2] }, + }); + + const results = await withInfuraClient(async (client) => { + const resultPromises = [ + client.makeRpcCall(requests[0]), + client.makeRpcCall(requests[1]), + client.makeRpcCall(requests[2]), + ]; + const firstResult = await resultPromises[0]; + // The inflight cache middleware uses setTimeout to run the + // handlers, so run them now + client.clock.runAll(); + const remainingResults = await Promise.all(resultPromises.slice(1)); + return [firstResult, ...remainingResults]; + }); + + expect(results).toStrictEqual([ + mockResults[0], + mockResults[0], + mockResults[0], + ]); + }); + }); + + if (blockParamType === 'none') { + it('throws a custom error if the request to Infura returns a 405 response', async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the + // block-cache middleware will request the latest block number + // through the block tracker to determine the cache key. Later, + // the block-ref middleware will request the latest block number + // again to resolve the value of "latest", but the block number is + // cached once made, so we only need to mock the request once. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + // The block-ref middleware will make the request as specified + // except that the block param is replaced with the latest block + // number. + comms.mockInfuraRpcCall({ + request: buildRequestWithReplacedBlockParam( + request, + blockParamIndex, + '0x100', + ), + response: { + httpStatus: 405, + }, + }); + const promiseForResult = withInfuraClient(async ({ makeRpcCall }) => + makeRpcCall(request), + ); + + await expect(promiseForResult).rejects.toThrow( + 'The method does not exist / is not available', + ); + }); + }); + + it('throws a custom error if the request to Infura returns a 429 response', async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the + // block-cache middleware will request the latest block number + // through the block tracker to determine the cache key. Later, + // the block-ref middleware will request the latest block number + // again to resolve the value of "latest", but the block number is + // cached once made, so we only need to mock the request once. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + // The block-ref middleware will make the request as specified + // except that the block param is replaced with the latest block + // number. + comms.mockInfuraRpcCall({ + request: buildRequestWithReplacedBlockParam( + request, + blockParamIndex, + '0x100', + ), + response: { + httpStatus: 429, + }, + }); + const promiseForResult = withInfuraClient(async ({ makeRpcCall }) => + makeRpcCall(request), + ); + + await expect(promiseForResult).rejects.toThrow( + 'Request is being rate limited', + ); + }); + }); + + it('throws a custom error if the request to Infura returns a response that is not 405, 429, 503, or 504', async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the + // block-cache middleware will request the latest block number + // through the block tracker to determine the cache key. Later, + // the block-ref middleware will request the latest block number + // again to resolve the value of "latest", but the block number is + // cached once made, so we only need to mock the request once. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + // The block-ref middleware will make the request as specified + // except that the block param is replaced with the latest block + // number. + comms.mockInfuraRpcCall({ + request: buildRequestWithReplacedBlockParam( + request, + blockParamIndex, + '0x100', + ), + response: { + id: 12345, + jsonrpc: '2.0', + error: 'some error', + httpStatus: 420, + }, + }); + const promiseForResult = withInfuraClient(async ({ makeRpcCall }) => + makeRpcCall(request), + ); + + await expect(promiseForResult).rejects.toThrow( + '{"id":12345,"jsonrpc":"2.0","error":"some error"}', + ); + }); + }); + + [503, 504].forEach((httpStatus) => { + it(`retries the request to Infura up to 5 times if it returns a ${httpStatus} response, returning the successful result if there is one on the 5th try`, async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the + // block-cache middleware will request the latest block number + // through the block tracker to determine the cache key. Later, + // the block-ref middleware will request the latest block number + // again to resolve the value of "latest", but the block number is + // cached once made, so we only need to mock the request once. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + // The block-ref middleware will make the request as specified + // except that the block param is replaced with the latest block + // number. + // + // Here we have the request fail for the first 4 tries, then succeed + // on the 5th try. + comms.mockInfuraRpcCall({ + request: buildRequestWithReplacedBlockParam( + request, + blockParamIndex, + '0x100', + ), + response: { + error: 'some error', + httpStatus, + }, + times: 4, + }); + comms.mockInfuraRpcCall({ + request: buildRequestWithReplacedBlockParam( + request, + blockParamIndex, + '0x100', + ), + response: { + result: 'the result', + httpStatus: 200, + }, + }); + const result = await withInfuraClient( + async ({ makeRpcCall, clock }) => { + return await waitForPromiseToBeFulfilledAfterRunningAllTimers( + makeRpcCall(request), + clock, + ); + }, + ); + + expect(result).toStrictEqual('the result'); + }); + }); + + it(`causes a request to fail with a custom error if the request to Infura returns a ${httpStatus} response 5 times in a row`, async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the + // block-cache middleware will request the latest block number + // through the block tracker to determine the cache key. Later, + // the block-ref middleware will request the latest block number + // again to resolve the value of "latest", but the block number is + // cached once made, so we only need to mock the request once. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + // The block-ref middleware will make the request as specified + // except that the block param is replaced with the latest block + // number. + comms.mockInfuraRpcCall({ + request: buildRequestWithReplacedBlockParam( + request, + blockParamIndex, + '0x100', + ), + response: { + error: 'Some error', + httpStatus, + }, + times: 5, + }); + const promiseForResult = withInfuraClient( + async ({ makeRpcCall, clock }) => { + return await waitForPromiseToBeFulfilledAfterRunningAllTimers( + makeRpcCall(request), + clock, + ); + }, + ); + + await expect(promiseForResult).rejects.toThrow( + /^InfuraProvider - cannot complete request\. All retries exhausted\..+Gateway timeout/su, + ); + }); + }); + }); + + ['ETIMEDOUT', 'ECONNRESET', 'SyntaxError'].forEach( + (errorMessagePrefix) => { + it(`retries the request to Infura up to 5 times if an "${errorMessagePrefix}" error is thrown while making the request, returning the successful result if there is one on the 5th try`, async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the + // block-cache middleware will request the latest block number + // through the block tracker to determine the cache key. Later, + // the block-ref middleware will request the latest block number + // again to resolve the value of "latest", but the block number is + // cached once made, so we only need to mock the request once. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + // The block-ref middleware will make the request as specified + // except that the block param is replaced with the latest block + // number. + // + // Here we have the request fail for the first 4 tries, then + // succeed on the 5th try. + comms.mockInfuraRpcCall({ + request: buildRequestWithReplacedBlockParam( + request, + blockParamIndex, + '0x100', + ), + error: `${errorMessagePrefix}: Some message`, + times: 4, + }); + comms.mockInfuraRpcCall({ + request: buildRequestWithReplacedBlockParam( + request, + blockParamIndex, + '0x100', + ), + response: { + result: 'the result', + httpStatus: 200, + }, + }); + const result = await withInfuraClient( + async ({ makeRpcCall, clock }) => { + return await waitForPromiseToBeFulfilledAfterRunningAllTimers( + makeRpcCall(request), + clock, + ); + }, + ); + + expect(result).toStrictEqual('the result'); + }); + }); + + it(`causes a request to fail with a custom error if an "${errorMessagePrefix}" error is thrown while making the request to Infura 5 times in a row`, async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { method }; + + // The first time a block-cacheable request is made, the + // block-cache middleware will request the latest block number + // through the block tracker to determine the cache key. Later, + // the block-ref middleware will request the latest block number + // again to resolve the value of "latest", but the block number is + // cached once made, so we only need to mock the request once. + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + // The block-ref middleware will make the request as specified + // except that the block param is replaced with the latest block + // number. + comms.mockInfuraRpcCall({ + request: buildRequestWithReplacedBlockParam( + request, + blockParamIndex, + '0x100', + ), + error: `${errorMessagePrefix}: Some message`, + times: 5, + }); + const promiseForResult = withInfuraClient( + async ({ makeRpcCall, clock }) => { + return await waitForPromiseToBeFulfilledAfterRunningAllTimers( + makeRpcCall(request), + clock, + ); + }, + ); + + await expect(promiseForResult).rejects.toThrow( + new RegExp( + `^InfuraProvider - cannot complete request\\. All retries exhausted\\..+${errorMessagePrefix}: Some message`, + 'su', + ), + ); + }); + }); + }, + ); + } }); describe.each([ @@ -518,7 +1158,7 @@ export function testsForRpcMethodSupportingBlockParam( // tracker to determine the cache key. This block number doesn't // matter. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); @@ -545,12 +1185,12 @@ export function testsForRpcMethodSupportingBlockParam( // occur because of the second RPC request, but rather because we // call `clock.runAll()` below. comms.mockNextBlockTrackerRequest({ blockNumber: '0x1' }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); comms.mockNextBlockTrackerRequest({ blockNumber: '0x2' }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[1], response: { result: mockResults[1] }, }); @@ -582,11 +1222,11 @@ export function testsForRpcMethodSupportingBlockParam( // number is retrieved through the block tracker first. It doesn't // matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[1], response: { result: mockResults[1] }, }); @@ -622,7 +1262,7 @@ export function testsForRpcMethodSupportingBlockParam( // block number is retrieved through the block tracker first. It // doesn't matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); @@ -654,11 +1294,11 @@ export function testsForRpcMethodSupportingBlockParam( // number is retrieved through the block tracker first. It doesn't // matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: 'first result' }, }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[1], response: { result: 'second result' }, }); @@ -670,6 +1310,56 @@ export function testsForRpcMethodSupportingBlockParam( expect(results).toStrictEqual(['first result', 'second result']); }); }); + + it('makes an additional request to Infura if the given block number matches the latest block number', async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { + method, + params: buildMockParamsWithBlockParamAt(blockParamIndex, '0x100'), + }; + + // The first time a block-cacheable request is made, the latest + // block number is retrieved through the block tracker first. This + // also happens within the retry-on-empty middleware (although the + // latest block is cached by now). + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + comms.mockInfuraRpcCall({ + request, + response: { result: 'the result' }, + }); + + const result = await withInfuraClient(({ makeRpcCall }) => + makeRpcCall(request), + ); + + expect(result).toStrictEqual('the result'); + }); + }); + + it('makes an additional request to Infura if the given block number is less than the latest block number', async () => { + await withMockedInfuraCommunications(async (comms) => { + const request = { + method, + params: buildMockParamsWithBlockParamAt(blockParamIndex, '0x50'), + }; + + // The first time a block-cacheable request is made, the latest + // block number is retrieved through the block tracker first. This + // also happens within the retry-on-empty middleware (although the + // latest block is cached by now). + comms.mockNextBlockTrackerRequest({ blockNumber: '0x100' }); + comms.mockInfuraRpcCall({ + request, + response: { result: 'the result' }, + }); + + const result = await withInfuraClient(({ makeRpcCall }) => + makeRpcCall(request), + ); + + expect(result).toStrictEqual('the result'); + }); + }); } }); @@ -688,11 +1378,11 @@ export function testsForRpcMethodSupportingBlockParam( // block number is retrieved through the block tracker first. It // doesn't matter what this is — it's just used as a cache key. comms.mockNextBlockTrackerRequest(); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[0], response: { result: mockResults[0] }, }); - comms.mockSuccessfulInfuraRpcCall({ + comms.mockInfuraRpcCall({ request: requests[1], response: { result: mockResults[1] }, }); diff --git a/app/scripts/controllers/network/util.test.js b/app/scripts/controllers/network/util.test.js index 4ca1768cb2a0..49fda6ef8215 100644 --- a/app/scripts/controllers/network/util.test.js +++ b/app/scripts/controllers/network/util.test.js @@ -22,9 +22,9 @@ describe('network utils', () => { }, type: TRANSACTION_TYPES.SIMPLE_SEND, origin: 'other', - chainId: '0x3', + chainId: '0x5', time: 1624408066355, - metamaskNetworkId: '3', + metamaskNetworkId: '5', hash: '0x4bcb6cd6b182209585f8ad140260ddb35c81a575dd40f508d9767e652a9f60e7', r: '0x4c3111e42ed5eec3dcecba1e234700f387e8693c373c61c3e54a762a26f1570e', s: '0x18bfc4eeb7ebcfacc3bd59ea100a6834ea3265e65945dbec69aa2a06564fafff', @@ -67,9 +67,9 @@ describe('network utils', () => { }, type: TRANSACTION_TYPES.SIMPLE_SEND, origin: 'other', - chainId: '0x3', + chainId: '0x5', time: 1624408066355, - metamaskNetworkId: '3', + metamaskNetworkId: '5', hash: '0x4bcb6cd6b182209585f8ad140260ddb35c81a575dd40f508d9767e652a9f60e7', r: '0x4c3111e42ed5eec3dcecba1e234700f387e8693c373c61c3e54a762a26f1570e', s: '0x18bfc4eeb7ebcfacc3bd59ea100a6834ea3265e65945dbec69aa2a06564fafff', diff --git a/app/scripts/controllers/permissions/flask/snap-permissions.js b/app/scripts/controllers/permissions/flask/snap-permissions.js index 07024c9ae19f..1a1d78c5d2d3 100644 --- a/app/scripts/controllers/permissions/flask/snap-permissions.js +++ b/app/scripts/controllers/permissions/flask/snap-permissions.js @@ -3,7 +3,10 @@ import { restrictedMethodPermissionBuilders, selectHooks, } from '@metamask/rpc-methods'; -import { ExcludedSnapPermissions } from '../../../../../shared/constants/permissions'; +import { + ExcludedSnapEndowments, + ExcludedSnapPermissions, +} from '../../../../../shared/constants/permissions'; /** * @returns {Record>} All endowment permission @@ -12,7 +15,9 @@ import { ExcludedSnapPermissions } from '../../../../../shared/constants/permiss export const buildSnapEndowmentSpecifications = () => Object.values(endowmentPermissionBuilders).reduce( (allSpecifications, { targetKey, specificationBuilder }) => { - allSpecifications[targetKey] = specificationBuilder(); + if (!ExcludedSnapEndowments.has(targetKey)) { + allSpecifications[targetKey] = specificationBuilder(); + } return allSpecifications; }, {}, diff --git a/app/scripts/controllers/permissions/specifications.js b/app/scripts/controllers/permissions/specifications.js index de6b1bdad89d..1e3fad4a4829 100644 --- a/app/scripts/controllers/permissions/specifications.js +++ b/app/scripts/controllers/permissions/specifications.js @@ -1,5 +1,6 @@ import { constructPermission, PermissionType } from '@metamask/controllers'; ///: BEGIN:ONLY_INCLUDE_IN(flask) +import { endowmentCaveatSpecifications as snapsEndowmentCaveatSpecifications } from '@metamask/snap-controllers'; import { caveatSpecifications as snapsCaveatsSpecifications } from '@metamask/rpc-methods'; ///: END:ONLY_INCLUDE_IN import { @@ -69,6 +70,7 @@ export const getCaveatSpecifications = ({ getIdentities }) => { ///: BEGIN:ONLY_INCLUDE_IN(flask) ...snapsCaveatsSpecifications, + ...snapsEndowmentCaveatSpecifications, ///: END:ONLY_INCLUDE_IN }; }; diff --git a/app/scripts/controllers/permissions/specifications.test.js b/app/scripts/controllers/permissions/specifications.test.js index e874d3aa6107..f199e9122215 100644 --- a/app/scripts/controllers/permissions/specifications.test.js +++ b/app/scripts/controllers/permissions/specifications.test.js @@ -16,7 +16,7 @@ describe('PermissionController specifications', () => { describe('caveat specifications', () => { it('getCaveatSpecifications returns the expected specifications object', () => { const caveatSpecifications = getCaveatSpecifications({}); - expect(Object.keys(caveatSpecifications)).toHaveLength(3); + expect(Object.keys(caveatSpecifications)).toHaveLength(5); expect( caveatSpecifications[CaveatTypes.restrictReturnedAccounts].type, ).toStrictEqual(CaveatTypes.restrictReturnedAccounts); @@ -27,6 +27,12 @@ describe('PermissionController specifications', () => { expect(caveatSpecifications.permittedCoinTypes.type).toStrictEqual( SnapCaveatType.PermittedCoinTypes, ); + expect(caveatSpecifications.snapKeyring.type).toStrictEqual( + SnapCaveatType.SnapKeyring, + ); + expect(caveatSpecifications.snapCronjob.type).toStrictEqual( + SnapCaveatType.SnapCronjob, + ); }); describe('restrictReturnedAccounts', () => { diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 949c8de8d164..b99d304ee43f 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -39,7 +39,7 @@ export default class PreferencesController { // set to true means the dynamic list from the API is being used // set to false will be using the static list from contract-metadata useTokenDetection: false, - useCollectibleDetection: false, + useNftDetection: false, openSeaEnabled: false, advancedGasFee: null, @@ -69,7 +69,8 @@ export default class PreferencesController { ? LEDGER_TRANSPORT_TYPES.WEBHID : LEDGER_TRANSPORT_TYPES.U2F, theme: 'light', - customNetworkListEnabled: false, + improvedTokenAllowanceEnabled: false, + transactionSecurityCheckEnabled: false, ...opts.initState, }; @@ -142,12 +143,12 @@ export default class PreferencesController { } /** - * Setter for the `useCollectibleDetection` property + * Setter for the `useNftDetection` property * - * @param {boolean} useCollectibleDetection - Whether or not the user prefers to autodetect collectibles. + * @param {boolean} useNftDetection - Whether or not the user prefers to autodetect collectibles. */ - setUseCollectibleDetection(useCollectibleDetection) { - this.store.updateState({ useCollectibleDetection }); + setUseNftDetection(useNftDetection) { + this.store.updateState({ useNftDetection }); } /** @@ -189,13 +190,24 @@ export default class PreferencesController { } /** - * Setter for the `customNetworkListEnabled` property + * Setter for the `improvedTokenAllowanceEnabled` property * - * @param customNetworkListEnabled + * @param improvedTokenAllowanceEnabled */ - setCustomNetworkListEnabled(customNetworkListEnabled) { + setImprovedTokenAllowanceEnabled(improvedTokenAllowanceEnabled) { this.store.updateState({ - customNetworkListEnabled, + improvedTokenAllowanceEnabled, + }); + } + + /** + * Setter for the `transactionSecurityCheckEnabled` property + * + * @param transactionSecurityCheckEnabled + */ + setTransactionSecurityCheckEnabled(transactionSecurityCheckEnabled) { + this.store.updateState({ + transactionSecurityCheckEnabled, }); } @@ -263,7 +275,7 @@ export default class PreferencesController { // If the selected account is no longer valid, // select an arbitrary other account: if (address === this.getSelectedAddress()) { - const selected = Object.keys(identities)[0]; + const [selected] = Object.keys(identities); this.setSelectedAddress(selected); } return address; @@ -326,7 +338,7 @@ export default class PreferencesController { // select an arbitrary other account: let selected = this.getSelectedAddress(); if (!addresses.includes(selected)) { - selected = addresses[0]; + [selected] = addresses; this.setSelectedAddress(selected); } diff --git a/app/scripts/controllers/preferences.test.js b/app/scripts/controllers/preferences.test.js index ee19e216fbf0..488e03010f98 100644 --- a/app/scripts/controllers/preferences.test.js +++ b/app/scripts/controllers/preferences.test.js @@ -308,21 +308,21 @@ describe('preferences controller', function () { }); }); - describe('setUseCollectibleDetection', function () { + describe('setUseNftDetection', function () { it('should default to false', function () { const state = preferencesController.store.getState(); - assert.equal(state.useCollectibleDetection, false); + assert.equal(state.useNftDetection, false); }); - it('should set the useCollectibleDetection property in state', function () { + it('should set the useNftDetection property in state', function () { assert.equal( - preferencesController.store.getState().useCollectibleDetection, + preferencesController.store.getState().useNftDetection, false, ); preferencesController.setOpenSeaEnabled(true); - preferencesController.setUseCollectibleDetection(true); + preferencesController.setUseNftDetection(true); assert.equal( - preferencesController.store.getState().useCollectibleDetection, + preferencesController.store.getState().useNftDetection, true, ); }); diff --git a/app/scripts/controllers/swaps.js b/app/scripts/controllers/swaps.js index e1baff4e14c7..8c7e2c2148d6 100644 --- a/app/scripts/controllers/swaps.js +++ b/app/scripts/controllers/swaps.js @@ -691,15 +691,15 @@ export default class SwapsController { destinationAmount = 0, destinationToken, destinationTokenInfo, - gasEstimate, + gasEstimateWithRefund, sourceAmount, sourceToken, trade, fee: metaMaskFee, } = quote; - const tradeGasLimitForCalculation = gasEstimate - ? new BigNumber(gasEstimate, 16) + const tradeGasLimitForCalculation = gasEstimateWithRefund + ? new BigNumber(gasEstimateWithRefund, 16) : new BigNumber(averageGas || MAX_GAS_LIMIT, 10); const totalGasLimitForCalculation = tradeGasLimitForCalculation diff --git a/app/scripts/controllers/swaps.test.js b/app/scripts/controllers/swaps.test.js index ea3be085a548..0768b9791570 100644 --- a/app/scripts/controllers/swaps.test.js +++ b/app/scripts/controllers/swaps.test.js @@ -100,7 +100,7 @@ function getMockNetworkController() { store: { getState: () => { return { - network: NETWORK_IDS.ROPSTEN, + network: NETWORK_IDS.GOERLI, }; }, }, @@ -269,7 +269,7 @@ describe('SwapsController', function () { const currentEthersInstance = swapsController.ethersProvider; const onNetworkDidChange = networkController.on.getCall(0).args[1]; - onNetworkDidChange(NETWORK_IDS.ROPSTEN); + onNetworkDidChange(NETWORK_IDS.GOERLI); const newEthersInstance = swapsController.ethersProvider; assert.strictEqual( @@ -426,9 +426,9 @@ describe('SwapsController', function () { const expectedResultQuotes = getTopQuoteAndSavingsBaseExpectedResults(); delete expectedResultQuotes[TEST_AGG_ID_6]; expectedResultQuotes[TEST_AGG_ID_1].savings = { - total: '0.0292', + total: '0.0092', performance: '0.0297', - fee: '0.02', + fee: '0', metaMaskFee: '0.0205', medianMetaMaskFee: '0.0202', }; @@ -450,27 +450,27 @@ describe('SwapsController', function () { const expectedResultQuotes = { [TEST_AGG_ID_1]: { ...testInput[TEST_AGG_ID_1], - ethFee: '0.01', + ethFee: '0.25', }, [TEST_AGG_ID_2]: { ...testInput[TEST_AGG_ID_2], - ethFee: '0.02', + ethFee: '0.25', }, [TEST_AGG_ID_3]: { ...testInput[TEST_AGG_ID_3], - ethFee: '0.03', + ethFee: '0.25', }, [TEST_AGG_ID_4]: { ...testInput[TEST_AGG_ID_4], - ethFee: '0.04', + ethFee: '0.25', }, [TEST_AGG_ID_5]: { ...testInput[TEST_AGG_ID_5], - ethFee: '0.05', + ethFee: '0.25', }, [TEST_AGG_ID_6]: { ...testInput[TEST_AGG_ID_6], - ethFee: '0.06', + ethFee: '0.25', }, }; @@ -498,42 +498,42 @@ describe('SwapsController', function () { sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8ac7230489e80000' }, - overallValueOfQuote: '2.0195', + overallValueOfQuote: '1.7795', }, [TEST_AGG_ID_2]: { ...baseExpectedResultQuotes[TEST_AGG_ID_2], sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8ac7230489e80000' }, - overallValueOfQuote: '1.9996', + overallValueOfQuote: '1.7696', }, [TEST_AGG_ID_3]: { ...baseExpectedResultQuotes[TEST_AGG_ID_3], sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8ac7230489e80000' }, - overallValueOfQuote: '1.9698', + overallValueOfQuote: '1.7498', }, [TEST_AGG_ID_4]: { ...baseExpectedResultQuotes[TEST_AGG_ID_4], sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8ac7230489e80000' }, - overallValueOfQuote: '1.94', + overallValueOfQuote: '1.73', }, [TEST_AGG_ID_5]: { ...baseExpectedResultQuotes[TEST_AGG_ID_5], sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8ac7230489e80000' }, - overallValueOfQuote: '1.9102', + overallValueOfQuote: '1.7102', }, [TEST_AGG_ID_6]: { ...baseExpectedResultQuotes[TEST_AGG_ID_6], sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8ac7230489e80000' }, - overallValueOfQuote: '1.8705', + overallValueOfQuote: '1.6805', }, }; @@ -563,22 +563,22 @@ describe('SwapsController', function () { sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8b553ece48ec0000' }, - overallValueOfQuote: '1.9795', - ethFee: '0.05', + overallValueOfQuote: '1.7395', + ethFee: '0.29', }, [TEST_AGG_ID_2]: { ...baseExpectedResultQuotes[TEST_AGG_ID_2], sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8ac7230489e80000' }, - overallValueOfQuote: '1.9996', + overallValueOfQuote: '1.7696', isBestQuote: true, savings: { - total: '0.0243', - performance: '0.0297', - fee: '0.015', + total: '0.01445', + performance: '0.01485', + fee: '0.02', metaMaskFee: '0.0204', - medianMetaMaskFee: '0.0201', + medianMetaMaskFee: '0.02025', }, }, [TEST_AGG_ID_3]: { @@ -586,28 +586,28 @@ describe('SwapsController', function () { sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8ac7230489e80000' }, - overallValueOfQuote: '1.9698', + overallValueOfQuote: '1.7498', }, [TEST_AGG_ID_4]: { ...baseExpectedResultQuotes[TEST_AGG_ID_4], sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8ac7230489e80000' }, - overallValueOfQuote: '1.94', + overallValueOfQuote: '1.73', }, [TEST_AGG_ID_5]: { ...baseExpectedResultQuotes[TEST_AGG_ID_5], sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8ac7230489e80000' }, - overallValueOfQuote: '1.9102', + overallValueOfQuote: '1.7102', }, [TEST_AGG_ID_6]: { ...baseExpectedResultQuotes[TEST_AGG_ID_6], sourceToken: ETH_SWAPS_TOKEN_OBJECT.address, destinationToken: '0x1111111111111111111111111111111111111111', trade: { value: '0x8ac7230489e80000' }, - overallValueOfQuote: '1.8705', + overallValueOfQuote: '1.6805', }, }; delete expectedResultQuotes[TEST_AGG_ID_1].isBestQuote; @@ -630,18 +630,18 @@ describe('SwapsController', function () { [TEST_AGG_ID_1]: { ...baseExpectedResultQuotes[TEST_AGG_ID_1], trade: { value: '0x8e1bc9bf040000' }, - overallValueOfQuote: '1.9795', - ethFee: '0.05', + overallValueOfQuote: '1.7395', + ethFee: '0.29', }, [TEST_AGG_ID_2]: { ...baseExpectedResultQuotes[TEST_AGG_ID_2], isBestQuote: true, savings: { - total: '0.0243', - performance: '0.0297', - fee: '0.015', + total: '0.01445', + performance: '0.01485', + fee: '0.02', metaMaskFee: '0.0204', - medianMetaMaskFee: '0.0201', + medianMetaMaskFee: '0.02025', }, }, }; @@ -686,14 +686,14 @@ describe('SwapsController', function () { gasEstimate: 2000000, gasEstimateWithRefund: '0xb8cae', savings: { - fee: '0', + fee: '-0.061067', metaMaskFee: '0.5050505050505050505', performance: '6', - total: '5.4949494949494949495', + total: '5.4338824949494949495', medianMetaMaskFee: '0.44444444444444444444', }, - ethFee: '5.033165', - overallValueOfQuote: '44.966835', + ethFee: '0.113536', + overallValueOfQuote: '49.886464', metaMaskFeeInEth: '0.5050505050505050505', ethValueOfTokens: '50', }); @@ -1337,50 +1337,50 @@ function getTopQuoteAndSavingsBaseExpectedResults() { [TEST_AGG_ID_1]: { ...baseTestInput[TEST_AGG_ID_1], isBestQuote: true, - ethFee: '0.01', - overallValueOfQuote: '2.0195', + ethFee: '0.25', + overallValueOfQuote: '1.7795', metaMaskFeeInEth: '0.0205', ethValueOfTokens: '2.0295', savings: { - total: '0.0441', + total: '0.0191', performance: '0.0396', - fee: '0.025', + fee: '0', metaMaskFee: '0.0205', medianMetaMaskFee: '0.0201', }, }, [TEST_AGG_ID_2]: { ...baseTestInput[TEST_AGG_ID_2], - ethFee: '0.02', - overallValueOfQuote: '1.9996', + ethFee: '0.25', + overallValueOfQuote: '1.7696', metaMaskFeeInEth: '0.0204', ethValueOfTokens: '2.0196', }, [TEST_AGG_ID_3]: { ...baseTestInput[TEST_AGG_ID_3], - ethFee: '0.03', - overallValueOfQuote: '1.9698', + ethFee: '0.25', + overallValueOfQuote: '1.7498', metaMaskFeeInEth: '0.0202', ethValueOfTokens: '1.9998', }, [TEST_AGG_ID_4]: { ...baseTestInput[TEST_AGG_ID_4], - ethFee: '0.04', - overallValueOfQuote: '1.94', + ethFee: '0.25', + overallValueOfQuote: '1.73', metaMaskFeeInEth: '0.02', ethValueOfTokens: '1.98', }, [TEST_AGG_ID_5]: { ...baseTestInput[TEST_AGG_ID_5], - ethFee: '0.05', - overallValueOfQuote: '1.9102', + ethFee: '0.25', + overallValueOfQuote: '1.7102', metaMaskFeeInEth: '0.0198', ethValueOfTokens: '1.9602', }, [TEST_AGG_ID_6]: { ...baseTestInput[TEST_AGG_ID_6], - ethFee: '0.06', - overallValueOfQuote: '1.8705', + ethFee: '0.25', + overallValueOfQuote: '1.6805', metaMaskFeeInEth: '0.0195', ethValueOfTokens: '1.9305', }, diff --git a/app/scripts/controllers/threebox.js b/app/scripts/controllers/threebox.js deleted file mode 100644 index 6af4b9711196..000000000000 --- a/app/scripts/controllers/threebox.js +++ /dev/null @@ -1,305 +0,0 @@ -import { ObservableStore } from '@metamask/obs-store'; - -/* eslint-disable import/first,import/order */ -const Box = process.env.IN_TEST - ? require('../../../development/mock-3box') - : require('3box'); -/* eslint-enable import/order */ - -import log from 'loglevel'; -import { JsonRpcEngine } from 'json-rpc-engine'; -import { providerFromEngine } from 'eth-json-rpc-middleware'; -import Migrator from '../lib/migrator'; -import migrations from '../migrations'; -import createOriginMiddleware from '../lib/createOriginMiddleware'; -import createMetamaskMiddleware from './network/createMetamaskMiddleware'; -/* eslint-enable import/first */ - -const SYNC_TIMEOUT = 60 * 1000; // one minute - -export default class ThreeBoxController { - constructor(opts = {}) { - const { - preferencesController, - keyringController, - addressBookController, - version, - getKeyringControllerState, - trackMetaMetricsEvent, - } = opts; - - this.preferencesController = preferencesController; - this.addressBookController = addressBookController; - this.keyringController = keyringController; - this.provider = this._createProvider({ - version, - getAccounts: async ({ origin }) => { - if (origin !== '3Box') { - return []; - } - const { isUnlocked } = getKeyringControllerState(); - - const accounts = await this.keyringController.getAccounts(); - - if (isUnlocked && accounts[0]) { - const appKeyAddress = await this.keyringController.getAppKeyAddress( - accounts[0], - 'wallet://3box.metamask.io', - ); - return [appKeyAddress]; - } - return []; - }, - processPersonalMessage: async (msgParams) => { - const accounts = await this.keyringController.getAccounts(); - return keyringController.signPersonalMessage( - { ...msgParams, from: accounts[0] }, - { - withAppKeyOrigin: 'wallet://3box.metamask.io', - }, - ); - }, - }); - this._trackMetaMetricsEvent = trackMetaMetricsEvent; - - const initState = { - threeBoxSyncingAllowed: false, - showRestorePrompt: true, - threeBoxLastUpdated: 0, - ...opts.initState, - threeBoxAddress: null, - threeBoxSynced: false, - threeBoxDisabled: false, - }; - this.store = new ObservableStore(initState); - this.registeringUpdates = false; - this.lastMigration = migrations - .sort((a, b) => a.version - b.version) - .slice(-1)[0]; - - if (initState.threeBoxSyncingAllowed) { - this.init(); - } - } - - async init() { - const accounts = await this.keyringController.getAccounts(); - this.address = accounts[0]; - - this._trackMetaMetricsEvent({ - event: '3Box Initiated', - category: '3Box', - }); - - if (this.address && !(this.box && this.store.getState().threeBoxSynced)) { - await this.new3Box(); - } - } - - async _update3Box() { - try { - const { threeBoxSyncingAllowed, threeBoxSynced } = this.store.getState(); - if (threeBoxSyncingAllowed && threeBoxSynced) { - const newState = { - preferences: this.preferencesController.store.getState(), - addressBook: this.addressBookController.state, - lastUpdated: Date.now(), - lastMigration: this.lastMigration, - }; - - await this.space.private.set( - 'metamaskBackup', - JSON.stringify(newState), - ); - await this.setShowRestorePromptToFalse(); - } - } catch (error) { - console.error(error); - } - } - - _createProvider(providerOpts) { - const metamaskMiddleware = createMetamaskMiddleware(providerOpts); - const engine = new JsonRpcEngine(); - engine.push(createOriginMiddleware({ origin: '3Box' })); - engine.push(metamaskMiddleware); - const provider = providerFromEngine(engine); - return provider; - } - - _waitForOnSyncDone() { - return new Promise((resolve) => { - this.box.onSyncDone(() => { - log.debug('3Box box sync done'); - return resolve(); - }); - }); - } - - async new3Box() { - const accounts = await this.keyringController.getAccounts(); - this.address = await this.keyringController.getAppKeyAddress( - accounts[0], - 'wallet://3box.metamask.io', - ); - let backupExists; - try { - const threeBoxConfig = await Box.getConfig(this.address); - backupExists = threeBoxConfig.spaces && threeBoxConfig.spaces.metamask; - } catch (e) { - if (e.message.match(/^Error: Invalid response \(404\)/u)) { - this._trackMetaMetricsEvent({ - event: '3Box Backup does not exist', - category: '3Box', - }); - - backupExists = false; - } else { - this._trackMetaMetricsEvent({ - event: '3Box Config Error', - category: '3Box', - }); - - throw e; - } - } - if (this.getThreeBoxSyncingState() || backupExists) { - this.store.updateState({ threeBoxSynced: false }); - - let timedOut = false; - const syncTimeout = setTimeout(() => { - log.error(`3Box sync timed out after ${SYNC_TIMEOUT} ms`); - timedOut = true; - this.store.updateState({ - threeBoxDisabled: true, - threeBoxSyncingAllowed: false, - }); - }, SYNC_TIMEOUT); - try { - this.box = await Box.openBox(this.address, this.provider); - await this._waitForOnSyncDone(); - this.space = await this.box.openSpace('metamask', { - onSyncDone: async () => { - const stateUpdate = { - threeBoxSynced: true, - threeBoxAddress: this.address, - }; - if (timedOut) { - log.info(`3Box sync completed after timeout; no longer disabled`); - stateUpdate.threeBoxDisabled = false; - } - - clearTimeout(syncTimeout); - this.store.updateState(stateUpdate); - - log.debug('3Box space sync done'); - - this._trackMetaMetricsEvent({ - event: '3Box Synced', - category: '3Box', - }); - }, - }); - } catch (e) { - this._trackMetaMetricsEvent({ - event: '3Box Initiation Error', - category: '3Box', - }); - - console.error(e); - throw e; - } - } - } - - async getLastUpdated() { - const res = await this.space.private.get('metamaskBackup'); - const parsedRes = JSON.parse(res || '{}'); - return parsedRes.lastUpdated; - } - - async migrateBackedUpState(backedUpState) { - const migrator = new Migrator({ migrations }); - const { preferences, addressBook } = JSON.parse(backedUpState); - const formattedStateBackup = { - PreferencesController: preferences, - AddressBookController: addressBook, - }; - const initialMigrationState = - migrator.generateInitialState(formattedStateBackup); - const migratedState = await migrator.migrateData(initialMigrationState); - return { - preferences: migratedState.data.PreferencesController, - addressBook: migratedState.data.AddressBookController, - }; - } - - async restoreFromThreeBox() { - const backedUpState = await this.space.private.get('metamaskBackup'); - const { preferences, addressBook } = await this.migrateBackedUpState( - backedUpState, - ); - this.store.updateState({ threeBoxLastUpdated: backedUpState.lastUpdated }); - preferences && this.preferencesController.store.updateState(preferences); - addressBook && this.addressBookController.update(addressBook, true); - this.setShowRestorePromptToFalse(); - - this._trackMetaMetricsEvent({ - event: '3Box Restored Data', - category: '3Box', - }); - } - - turnThreeBoxSyncingOn() { - this._trackMetaMetricsEvent({ - event: '3Box Sync Turned On', - category: '3Box', - }); - - this._registerUpdates(); - } - - turnThreeBoxSyncingOff() { - this._trackMetaMetricsEvent({ - event: '3Box Sync Turned Off', - category: '3Box', - }); - - this.box.logout(); - } - - setShowRestorePromptToFalse() { - this.store.updateState({ showRestorePrompt: false }); - } - - setThreeBoxSyncingPermission(newThreeboxSyncingState) { - if (this.store.getState().threeBoxDisabled) { - return; - } - this.store.updateState({ - threeBoxSyncingAllowed: newThreeboxSyncingState, - }); - - if (newThreeboxSyncingState && this.box) { - this.turnThreeBoxSyncingOn(); - } - - if (!newThreeboxSyncingState && this.box) { - this.turnThreeBoxSyncingOff(); - } - } - - getThreeBoxSyncingState() { - return this.store.getState().threeBoxSyncingAllowed; - } - - _registerUpdates() { - if (!this.registeringUpdates) { - const updatePreferences = this._update3Box.bind(this); - this.preferencesController.store.subscribe(updatePreferences); - const updateAddressBook = this._update3Box.bind(this); - this.addressBookController.subscribe(updateAddressBook); - this.registeringUpdates = true; - } - } -} diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js index c34b5816d94c..5becce48b40c 100644 --- a/app/scripts/controllers/transactions/index.js +++ b/app/scripts/controllers/transactions/index.js @@ -161,7 +161,6 @@ export default class TransactionController extends EventEmitter { getNetwork: this.getNetwork.bind(this), getCurrentChainId: opts.getCurrentChainId, }); - this._onBootCleanUp(); this.store = this.txStateManager.store; this.nonceTracker = new NonceTracker({ @@ -208,6 +207,7 @@ export default class TransactionController extends EventEmitter { // request state update to finalize initialization this._updatePendingTxsAfterFirstBlock(); + this._onBootCleanUp(); } /** @@ -1082,6 +1082,7 @@ export default class TransactionController extends EventEmitter { blockGasLimit, customNetworkGasBuffer, ); + return { gasLimit, simulationFails }; } @@ -1843,7 +1844,7 @@ export default class TransactionController extends EventEmitter { .forEach((txMeta) => { // Line below will try to publish transaction which is in // APPROVED state at the time of controller bootup - this.approveTransaction(txMeta); + this.approveTransaction(txMeta.id); }); } @@ -2116,7 +2117,6 @@ export default class TransactionController extends EventEmitter { async _buildEventFragmentProperties(txMeta, extraParams) { const { - id, type, time, status, @@ -2134,8 +2134,14 @@ export default class TransactionController extends EventEmitter { originalType, replacedById, metamaskNetworkId: network, + customTokenAmount, + dappProposedTokenAmount, + currentTokenBalance, + originalApprovalAmount, + finalApprovalAmount, + contractMethodName, } = txMeta; - const { transactions } = this.store.getState(); + const source = referrer === ORIGIN_METAMASK ? 'user' : 'dapp'; const { assetType, tokenStandard } = await determineTransactionAssetType( @@ -2227,11 +2233,6 @@ export default class TransactionController extends EventEmitter { APPROVE: 'Approve', }; - const customTokenAmount = transactions[id]?.customTokenAmount; - const dappProposedTokenAmount = transactions[id]?.dappProposedTokenAmount; - const currentTokenBalance = transactions[id]?.currentTokenBalance; - const originalApprovalAmount = transactions[id]?.originalApprovalAmount; - const finalApprovalAmount = transactions[id]?.finalApprovalAmount; let transactionApprovalAmountType; let transactionContractMethod; let transactionApprovalAmountVsProposedRatio; @@ -2245,7 +2246,7 @@ export default class TransactionController extends EventEmitter { transactionType = TRANSACTION_TYPES.DEPLOY_CONTRACT; } else if (contractInteractionTypes) { transactionType = TRANSACTION_TYPES.CONTRACT_INTERACTION; - transactionContractMethod = transactions[id]?.contractMethodName; + transactionContractMethod = contractMethodName; if ( transactionContractMethod === contractMethodNames.APPROVE && tokenStandard === TOKEN_STANDARDS.ERC20 diff --git a/app/scripts/controllers/transactions/index.test.js b/app/scripts/controllers/transactions/index.test.js index 4bd5da250a8c..660b8e191ecb 100644 --- a/app/scripts/controllers/transactions/index.test.js +++ b/app/scripts/controllers/transactions/index.test.js @@ -31,10 +31,10 @@ import { TRANSACTION_ENVELOPE_TYPE_NAMES } from '../../../../shared/lib/transact import TransactionController from '.'; const noop = () => true; -const currentNetworkId = '42'; -const currentChainId = '0x2a'; +const currentNetworkId = '5'; +const currentChainId = '0x5'; const providerConfig = { - type: 'kovan', + type: 'goerli', }; const actionId = 'DUMMY_ACTION_ID'; const VALID_ADDRESS = '0x0000000000000000000000000000000000000000'; @@ -1039,7 +1039,7 @@ describe('Transaction Controller', function () { ); const rawTx = await txController.signTransaction('1'); const ethTx = TransactionFactory.fromSerializedData(toBuffer(rawTx)); - assert.equal(ethTx.common.chainIdBN().toNumber(), 42); + assert.equal(ethTx.common.chainIdBN().toNumber(), 5); }); }); @@ -1699,11 +1699,11 @@ describe('Transaction Controller', function () { category: EVENT.CATEGORIES.TRANSACTIONS, persist: true, properties: { - chain_id: '0x2a', + chain_id: '0x5', eip_1559_version: '0', gas_edit_attempted: 'none', gas_edit_type: 'none', - network: '42', + network: '5', referrer: ORIGIN_METAMASK, source: EVENT.SOURCE.TRANSACTION.USER, transaction_type: TRANSACTION_TYPES.SIMPLE_SEND, @@ -1785,11 +1785,11 @@ describe('Transaction Controller', function () { category: EVENT.CATEGORIES.TRANSACTIONS, persist: true, properties: { - chain_id: '0x2a', + chain_id: '0x5', eip_1559_version: '0', gas_edit_attempted: 'none', gas_edit_type: 'none', - network: '42', + network: '5', referrer: ORIGIN_METAMASK, source: EVENT.SOURCE.TRANSACTION.USER, transaction_type: TRANSACTION_TYPES.SIMPLE_SEND, @@ -1880,11 +1880,11 @@ describe('Transaction Controller', function () { category: EVENT.CATEGORIES.TRANSACTIONS, persist: true, properties: { - chain_id: '0x2a', + chain_id: '0x5', eip_1559_version: '0', gas_edit_attempted: 'none', gas_edit_type: 'none', - network: '42', + network: '5', referrer: 'other', source: EVENT.SOURCE.TRANSACTION.DAPP, transaction_type: TRANSACTION_TYPES.SIMPLE_SEND, @@ -1968,11 +1968,11 @@ describe('Transaction Controller', function () { category: EVENT.CATEGORIES.TRANSACTIONS, persist: true, properties: { - chain_id: '0x2a', + chain_id: '0x5', eip_1559_version: '0', gas_edit_attempted: 'none', gas_edit_type: 'none', - network: '42', + network: '5', referrer: 'other', source: EVENT.SOURCE.TRANSACTION.DAPP, transaction_type: TRANSACTION_TYPES.SIMPLE_SEND, @@ -2055,11 +2055,11 @@ describe('Transaction Controller', function () { category: EVENT.CATEGORIES.TRANSACTIONS, persist: true, properties: { - chain_id: '0x2a', + chain_id: '0x5', eip_1559_version: '0', gas_edit_attempted: 'none', gas_edit_type: 'none', - network: '42', + network: '5', referrer: 'other', source: EVENT.SOURCE.TRANSACTION.DAPP, transaction_type: TRANSACTION_TYPES.SIMPLE_SEND, @@ -2123,11 +2123,11 @@ describe('Transaction Controller', function () { persist: true, category: EVENT.CATEGORIES.TRANSACTIONS, properties: { - network: '42', + network: '5', referrer: 'other', source: EVENT.SOURCE.TRANSACTION.DAPP, transaction_type: TRANSACTION_TYPES.SIMPLE_SEND, - chain_id: '0x2a', + chain_id: '0x5', eip_1559_version: '0', gas_edit_attempted: 'none', gas_edit_type: 'none', @@ -2201,11 +2201,11 @@ describe('Transaction Controller', function () { persist: true, category: EVENT.CATEGORIES.TRANSACTIONS, properties: { - chain_id: '0x2a', + chain_id: '0x5', eip_1559_version: '1', gas_edit_attempted: 'none', gas_edit_type: 'none', - network: '42', + network: '5', referrer: 'other', source: EVENT.SOURCE.TRANSACTION.DAPP, transaction_type: TRANSACTION_TYPES.SIMPLE_SEND, diff --git a/app/scripts/controllers/transactions/tx-gas-utils.js b/app/scripts/controllers/transactions/tx-gas-utils.js index cddcfc946d85..35648e710fa0 100644 --- a/app/scripts/controllers/transactions/tx-gas-utils.js +++ b/app/scripts/controllers/transactions/tx-gas-utils.js @@ -50,7 +50,11 @@ export default class TxGasUtil { }; } - return { blockGasLimit: block.gasLimit, estimatedGasHex, simulationFails }; + return { + blockGasLimit: block.gasLimit, + estimatedGasHex, + simulationFails, + }; } /** @@ -104,7 +108,6 @@ export default class TxGasUtil { async getBufferedGasLimit(txMeta, multiplier) { const { blockGasLimit, estimatedGasHex, simulationFails } = await this.analyzeGasUsage(txMeta); - // add additional gas buffer to our estimation for safety const gasLimit = this.addGasBuffer( addHexPrefix(estimatedGasHex), diff --git a/app/scripts/controllers/transactions/tx-gas-utils.test.js b/app/scripts/controllers/transactions/tx-gas-utils.test.js index 15386e3191ae..ed512f596899 100644 --- a/app/scripts/controllers/transactions/tx-gas-utils.test.js +++ b/app/scripts/controllers/transactions/tx-gas-utils.test.js @@ -30,14 +30,14 @@ describe('txUtils', function () { gasPrice: '0x199c82cc00', data: '0x', nonce: '0x3', - chainId: 42, + chainId: 5, }; const ethTx = TransactionFactory.fromTxData(txParams, { - common: new Common({ chain: 'kovan' }), + common: new Common({ chain: 'goerli' }), }); assert.equal( ethTx.common.chainIdBN().toNumber(), - 42, + 5, 'chainId is set from tx params', ); }); diff --git a/app/scripts/controllers/transactions/tx-state-manager.test.js b/app/scripts/controllers/transactions/tx-state-manager.test.js index 2e5646a14f4c..3638eefa0778 100644 --- a/app/scripts/controllers/transactions/tx-state-manager.test.js +++ b/app/scripts/controllers/transactions/tx-state-manager.test.js @@ -44,7 +44,7 @@ function generateTransactions( } describe('TransactionStateManager', function () { let txStateManager; - const currentNetworkId = NETWORK_IDS.KOVAN; + const currentNetworkId = NETWORK_IDS.GOERLI; const currentChainId = CHAIN_IDS.MAINNET; const otherNetworkId = '2'; @@ -678,7 +678,7 @@ describe('TransactionStateManager', function () { if (i === 0 || i === 1) { return CHAIN_IDS.MAINNET; } else if (i === 4 || i === 5) { - return CHAIN_IDS.RINKEBY; + return CHAIN_IDS.GOERLI; } return currentChainId; }, diff --git a/app/scripts/flask/snaps-blocklist.js b/app/scripts/flask/snaps-blocklist.js new file mode 100644 index 000000000000..470eb828bad9 --- /dev/null +++ b/app/scripts/flask/snaps-blocklist.js @@ -0,0 +1,24 @@ +/** + * Represents a list of Snaps that are not allowed to be used. + * Can be blocked by [ID, VERSION] or SHASUM of a source code (or both). + * + * Example: + * { + * id: 'npm:@consensys/snap-id', + * versionRange: '<0.1.11', + * shasum: 'TEIbWsAyQe/8rBNXOHx3bOP9YF61PIPP/YHeokLchJE=', + * }, + * { + * shasum: 'eCYGZiYvZ3/uxkKI3npfl79kTQXS/5iD9ojsBS4A3rI=', + * }, + */ +export const SNAP_BLOCKLIST = [ + { + id: 'npm:@consensys/starknet-snap', + versionRange: '<0.1.11', + }, + { + // @consensys/starknet-snap v:0.1.10 + shasum: 'A83r5/ZIcKuKwuAnQHHByVFCuofj7jGK5hOStmHY6A0=', + }, +]; diff --git a/app/scripts/flask/snaps-utilities.js b/app/scripts/flask/snaps-utilities.js new file mode 100644 index 000000000000..98bd2d340dd7 --- /dev/null +++ b/app/scripts/flask/snaps-utilities.js @@ -0,0 +1,35 @@ +import { satisfies as satisfiesSemver } from 'semver'; + +/** + * Checks if provided snaps are on the block list. + * + * @param snapsToCheck - An object containing snap ids and other information. + * @param blocklist - An object containing snap ids, version or shasum of the blocked snaps. + * @returns An object structure containing snaps block information. + */ +async function checkSnapsBlockList(snapsToCheck, blocklist) { + return Object.entries(snapsToCheck).reduce((acc, [snapId, snapInfo]) => { + const blockInfo = blocklist.find( + (blocked) => + (blocked.id === snapId && + satisfiesSemver(snapInfo.version, blocked.versionRange, { + includePrerelease: true, + })) || + // Check for null/undefined for a case in which SnapController did not return + // a valid message. This will avoid blocking all snaps in the given case. + // Avoid having (undefined === undefined). + (blocked.shasum ? blocked.shasum === snapInfo.shasum : false), + ); + + acc[snapId] = blockInfo + ? { + blocked: true, + reason: blockInfo.reason, + infoUrl: blockInfo.infoUrl, + } + : { blocked: false }; + return acc; + }, {}); +} + +export { checkSnapsBlockList }; diff --git a/app/scripts/flask/snaps-utilities.test.js b/app/scripts/flask/snaps-utilities.test.js new file mode 100644 index 000000000000..abb8afa3a1a8 --- /dev/null +++ b/app/scripts/flask/snaps-utilities.test.js @@ -0,0 +1,127 @@ +import { strict as assert } from 'assert'; +import { checkSnapsBlockList } from './snaps-utilities'; + +describe('Snaps Controller utilities', function () { + describe('checkSnapsBlockList', function () { + it('returns one of the given snaps as blocked by its version', async function () { + const mockBlocklist = [ + { + id: 'npm:@consensys/starknet-snap', + versionRange: '<0.1.11', + }, + ]; + const mockSnapsToBeChecked = { + 'npm:exampleA': { + version: '1.0.0', + shasum: 'F5IapP6v1Bp7bl16NkCszfOhtVSZAm362X5zl7wgMhI=', + }, + 'npm:exampleB': { + version: '1.0.0', + shasum: 'eCYGZiYvZ3/uxkKI3npfl79kTQXS/5iD9ojsBS4A3rI=', + }, + 'npm:@consensys/starknet-snap': { + version: '0.1.10', + shasum: 'A83r5/ZIcKuKwuAnQHHByVFCuofj7jGK5hOStmHY6A0=', + }, + }; + + const blockedSnaps = await checkSnapsBlockList( + mockSnapsToBeChecked, + mockBlocklist, + ); + assert.deepEqual(blockedSnaps, { + 'npm:exampleA': { blocked: false }, + 'npm:exampleB': { blocked: false }, + 'npm:@consensys/starknet-snap': { + blocked: true, + reason: undefined, + infoUrl: undefined, + }, + }); + }); + + it('returns given snap as blocked by its shasum', async function () { + const mockBlocklist = [ + { + shasum: 'A83r5/ZIcKuKwuAnQHHByVFCuofj7jGK5hOStmHY6A0=', + }, + ]; + const mockSnapsToBeChecked = { + 'npm:@consensys/starknet-snap': { + version: '0.3.15', // try to fake version with the same source sha + shasum: 'A83r5/ZIcKuKwuAnQHHByVFCuofj7jGK5hOStmHY6A0=', + }, + }; + + const blockedSnaps = await checkSnapsBlockList( + mockSnapsToBeChecked, + mockBlocklist, + ); + assert.deepEqual(blockedSnaps, { + 'npm:@consensys/starknet-snap': { + blocked: true, + reason: undefined, + infoUrl: undefined, + }, + }); + }); + + it('returns false for blocked for the same blocklisted snap but different version', async function () { + const mockBlocklist = [ + { + id: 'npm:@consensys/starknet-snap', + versionRange: '<0.1.11', + }, + ]; + const mockSnapsToBeChecked = { + 'npm:@consensys/starknet-snap': { + version: '0.2.1', + shasum: 'Z4jo37WG1E2rxqF05WaXOSUDxR5upUmOdaTvmgVY/L0=', + }, + }; + + const blockedSnaps = await checkSnapsBlockList( + mockSnapsToBeChecked, + mockBlocklist, + ); + assert.deepEqual(blockedSnaps, { + 'npm:@consensys/starknet-snap': { + blocked: false, + }, + }); + }); + + it('returns false for blocked for multiple snaps that are not on the blocklist', async function () { + const mockBlocklist = [ + { + id: 'npm:@consensys/starknet-snap', + versionRange: '<0.1.11', + }, + ]; + const mockSnapsToBeChecked = { + 'npm:exampleA': { + version: '1.0.0', + shasum: 'F5IapP6v1Bp7bl16NkCszfOhtVSZAm362X5zl7wgMhI=', + }, + 'npm:exampleB': { + version: '2.1.3', + shasum: 'eCYGZiYvZ3/uxkKI3npfl79kTQXS/5iD9ojsBS4A3rI=', + }, + 'npm:exampleC': { + version: '3.7.9', + shasum: '2QqUxo5joo4kKKr7yiCjdYsZOZcIFBnIBEdwU9Yx7+M=', + }, + }; + + const blockedSnaps = await checkSnapsBlockList( + mockSnapsToBeChecked, + mockBlocklist, + ); + assert.deepEqual(blockedSnaps, { + 'npm:exampleA': { blocked: false }, + 'npm:exampleB': { blocked: false }, + 'npm:exampleC': { blocked: false }, + }); + }); + }); +}); diff --git a/app/scripts/lib/account-tracker.js b/app/scripts/lib/account-tracker.js index 38efc9dd5bd4..7e57a8ee9732 100644 --- a/app/scripts/lib/account-tracker.js +++ b/app/scripts/lib/account-tracker.js @@ -14,13 +14,13 @@ import log from 'loglevel'; import pify from 'pify'; import { ethers } from 'ethers'; import SINGLE_CALL_BALANCES_ABI from 'single-call-balance-checker-abi'; -import { CHAIN_IDS } from '../../../shared/constants/network'; +import { + CHAIN_IDS, + LOCALHOST_RPC_URL, +} from '../../../shared/constants/network'; import { SINGLE_CALL_BALANCES_ADDRESS, - SINGLE_CALL_BALANCES_ADDRESS_RINKEBY, - SINGLE_CALL_BALANCES_ADDRESS_ROPSTEN, - SINGLE_CALL_BALANCES_ADDRESS_KOVAN, SINGLE_CALL_BALANCES_ADDRESS_GOERLI, SINGLE_CALL_BALANCES_ADDRESS_SEPOLIA, SINGLE_CALL_BALANCES_ADDRESS_BSC, @@ -53,6 +53,7 @@ export default class AccountTracker { * @param {object} opts.provider - An EIP-1193 provider instance that uses the current global network * @param {object} opts.blockTracker - A block tracker, which emits events for each new block * @param {Function} opts.getCurrentChainId - A function that returns the `chainId` for the current global network + * @param {Function} opts.getNetworkIdentifier - A function that returns the current network */ constructor(opts = {}) { const initState = { @@ -72,6 +73,7 @@ export default class AccountTracker { // bind function for easier listener syntax this._updateForBlock = this._updateForBlock.bind(this); this.getCurrentChainId = opts.getCurrentChainId; + this.getNetworkIdentifier = opts.getNetworkIdentifier; this.ethersProvider = new ethers.providers.Web3Provider(this._provider); } @@ -202,94 +204,79 @@ export default class AccountTracker { const { accounts } = this.store.getState(); const addresses = Object.keys(accounts); const chainId = this.getCurrentChainId(); - - switch (chainId) { - case CHAIN_IDS.MAINNET: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS, - ); - break; - - case CHAIN_IDS.RINKEBY: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS_RINKEBY, - ); - break; - - case CHAIN_IDS.ROPSTEN: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS_ROPSTEN, - ); - break; - - case CHAIN_IDS.KOVAN: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS_KOVAN, - ); - break; - - case CHAIN_IDS.GOERLI: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS_GOERLI, - ); - break; - - case CHAIN_IDS.SEPOLIA: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS_SEPOLIA, - ); - break; - - case CHAIN_IDS.BSC: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS_BSC, - ); - break; - - case CHAIN_IDS.OPTIMISM: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS_OPTIMISM, - ); - break; - - case CHAIN_IDS.POLYGON: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS_POLYGON, - ); - break; - - case CHAIN_IDS.AVALANCHE: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS_AVALANCHE, - ); - break; - - case CHAIN_IDS.FANTOM: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS_FANTOM, - ); - break; - - case CHAIN_IDS.ARBITRUM: - await this._updateAccountsViaBalanceChecker( - addresses, - SINGLE_CALL_BALANCES_ADDRESS_ARBITRUM, - ); - break; - - default: - await Promise.all(addresses.map(this._updateAccount.bind(this))); + const networkId = this.getNetworkIdentifier(); + const rpcUrl = 'http://127.0.0.1:8545'; + + if (networkId === LOCALHOST_RPC_URL || networkId === rpcUrl) { + await Promise.all(addresses.map(this._updateAccount.bind(this))); + } else { + switch (chainId) { + case CHAIN_IDS.MAINNET: + await this._updateAccountsViaBalanceChecker( + addresses, + SINGLE_CALL_BALANCES_ADDRESS, + ); + break; + + case CHAIN_IDS.GOERLI: + await this._updateAccountsViaBalanceChecker( + addresses, + SINGLE_CALL_BALANCES_ADDRESS_GOERLI, + ); + break; + + case CHAIN_IDS.SEPOLIA: + await this._updateAccountsViaBalanceChecker( + addresses, + SINGLE_CALL_BALANCES_ADDRESS_SEPOLIA, + ); + break; + + case CHAIN_IDS.BSC: + await this._updateAccountsViaBalanceChecker( + addresses, + SINGLE_CALL_BALANCES_ADDRESS_BSC, + ); + break; + + case CHAIN_IDS.OPTIMISM: + await this._updateAccountsViaBalanceChecker( + addresses, + SINGLE_CALL_BALANCES_ADDRESS_OPTIMISM, + ); + break; + + case CHAIN_IDS.POLYGON: + await this._updateAccountsViaBalanceChecker( + addresses, + SINGLE_CALL_BALANCES_ADDRESS_POLYGON, + ); + break; + + case CHAIN_IDS.AVALANCHE: + await this._updateAccountsViaBalanceChecker( + addresses, + SINGLE_CALL_BALANCES_ADDRESS_AVALANCHE, + ); + break; + + case CHAIN_IDS.FANTOM: + await this._updateAccountsViaBalanceChecker( + addresses, + SINGLE_CALL_BALANCES_ADDRESS_FANTOM, + ); + break; + + case CHAIN_IDS.ARBITRUM: + await this._updateAccountsViaBalanceChecker( + addresses, + SINGLE_CALL_BALANCES_ADDRESS_ARBITRUM, + ); + break; + + default: + await Promise.all(addresses.map(this._updateAccount.bind(this))); + } } } diff --git a/app/scripts/lib/buy-url.js b/app/scripts/lib/buy-url.js index 5a4f2dadf47c..68a6c506c319 100644 --- a/app/scripts/lib/buy-url.js +++ b/app/scripts/lib/buy-url.js @@ -11,6 +11,7 @@ import { MOONPAY_API_KEY, COINBASEPAY_API_KEY, } from '../constants/on-ramp'; +import { formatMoonpaySymbol } from '../../../ui/helpers/utils/moonpay'; const fetchWithTimeout = getFetchWithTimeout(); @@ -19,15 +20,20 @@ const fetchWithTimeout = getFetchWithTimeout(); * * @param {string} walletAddress - Ethereum destination address * @param {string} chainId - Current chain ID + * @param {string|undefined} symbol - Token symbol to buy * @returns String */ -const createWyrePurchaseUrl = async (walletAddress, chainId) => { +const createWyrePurchaseUrl = async (walletAddress, chainId, symbol) => { const { wyre = {} } = BUYABLE_CHAINS_MAP[chainId]; const { srn, currencyCode } = wyre; const networkId = parseInt(chainId, 16); - const fiatOnRampUrlApi = `${SWAPS_API_V2_BASE_URL}/networks/${networkId}/fiatOnRampUrl?serviceName=wyre&destinationAddress=${walletAddress}`; - const wyrePurchaseUrlFallback = `https://pay.sendwyre.com/purchase?dest=${srn}:${walletAddress}&destCurrency=${currencyCode}&accountId=AC-7AG3W4XH4N2&paymentMethod=debit-card`; + const fiatOnRampUrlApi = `${SWAPS_API_V2_BASE_URL}/networks/${networkId}/fiatOnRampUrl?serviceName=wyre&destinationAddress=${walletAddress}¤cy=${ + symbol || currencyCode + }`; + const wyrePurchaseUrlFallback = `https://pay.sendwyre.com/purchase?dest=${srn}:${walletAddress}&destCurrency=${ + symbol || currencyCode + }&accountId=AC-7AG3W4XH4N2&paymentMethod=debit-card`; try { const response = await fetchWithTimeout(fiatOnRampUrlApi, { method: 'GET', @@ -75,15 +81,17 @@ const createTransakUrl = (walletAddress, chainId, symbol) => { * * @param {string} walletAddress - Destination address * @param {string} chainId - Current chain ID + * @param {string|undefined} symbol - Token symbol to buy * @returns String */ -const createMoonPayUrl = async (walletAddress, chainId) => { +const createMoonPayUrl = async (walletAddress, chainId, symbol) => { const { moonPay: { defaultCurrencyCode, showOnlyCurrencies } = {} } = BUYABLE_CHAINS_MAP[chainId]; const moonPayQueryParams = new URLSearchParams({ apiKey: MOONPAY_API_KEY, walletAddress, - defaultCurrencyCode, + defaultCurrencyCode: + formatMoonpaySymbol(symbol, chainId) || defaultCurrencyCode, showOnlyCurrencies, }); const queryParams = new URLSearchParams({ @@ -155,19 +163,15 @@ export default async function getBuyUrl({ chainId, address, service, symbol }) { switch (service) { case 'wyre': - return await createWyrePurchaseUrl(address, chainId); + return await createWyrePurchaseUrl(address, chainId, symbol); case 'transak': return createTransakUrl(address, chainId, symbol); case 'moonpay': - return createMoonPayUrl(address, chainId); + return createMoonPayUrl(address, chainId, symbol); case 'coinbase': return createCoinbasePayUrl(address, chainId, symbol); case 'metamask-faucet': return 'https://faucet.metamask.io/'; - case 'rinkeby-faucet': - return 'https://www.rinkeby.io/'; - case 'kovan-faucet': - return 'https://github.com/kovan-testnet/faucet'; case 'goerli-faucet': return 'https://goerli-faucet.slock.it/'; case 'sepolia-faucet': @@ -183,12 +187,6 @@ function getDefaultServiceForChain(chainId) { switch (chainId) { case CHAIN_IDS.MAINNET: return 'wyre'; - case CHAIN_IDS.ROPSTEN: - return 'metamask-faucet'; - case CHAIN_IDS.RINKEBY: - return 'rinkeby-faucet'; - case CHAIN_IDS.KOVAN: - return 'kovan-faucet'; case CHAIN_IDS.GOERLI: return 'goerli-faucet'; case CHAIN_IDS.SEPOLIA: diff --git a/app/scripts/lib/buy-url.test.js b/app/scripts/lib/buy-url.test.js index 188153f6c719..80b8d41163e4 100644 --- a/app/scripts/lib/buy-url.test.js +++ b/app/scripts/lib/buy-url.test.js @@ -15,15 +15,6 @@ const MAINNET = { amount: 5, address: ETH_ADDRESS, }; -const ROPSTEN = { - chainId: CHAIN_IDS.ROPSTEN, -}; -const RINKEBY = { - chainId: CHAIN_IDS.RINKEBY, -}; -const KOVAN = { - chainId: CHAIN_IDS.KOVAN, -}; const BSC = { chainId: CHAIN_IDS.BSC, amount: 5, @@ -39,7 +30,7 @@ describe('buy-url', () => { it('returns Wyre url with an ETH address for Ethereum mainnet', async () => { nock(SWAPS_API_V2_BASE_URL) .get( - `/networks/1/fiatOnRampUrl?serviceName=wyre&destinationAddress=${ETH_ADDRESS}`, + `/networks/1/fiatOnRampUrl?serviceName=wyre&destinationAddress=${ETH_ADDRESS}¤cy=${CURRENCY_SYMBOLS.ETH}`, ) .reply(200, { url: `https://pay.sendwyre.com/purchase?accountId=${WYRE_ACCOUNT_ID}&utm_campaign=${WYRE_ACCOUNT_ID}&destCurrency=${CURRENCY_SYMBOLS.ETH}&utm_medium=widget&paymentMethod=debit-card&reservation=MLZVUF8FMXZUMARJC23B&dest=ethereum%3A${ETH_ADDRESS}&utm_source=checkout`, @@ -86,21 +77,6 @@ describe('buy-url', () => { ); }); - it('returns metamask ropsten faucet for network 3', async () => { - const ropstenUrl = await getBuyUrl(ROPSTEN); - expect(ropstenUrl).toStrictEqual('https://faucet.metamask.io/'); - }); - - it('returns rinkeby dapp for network 4', async () => { - const rinkebyUrl = await getBuyUrl(RINKEBY); - expect(rinkebyUrl).toStrictEqual('https://www.rinkeby.io/'); - }); - - it('returns kovan github test faucet for network 42', async () => { - const kovanUrl = await getBuyUrl(KOVAN); - expect(kovanUrl).toStrictEqual('https://github.com/kovan-testnet/faucet'); - }); - it('returns a MoonPay url with a prefilled wallet address for the Ethereum network', async () => { const { moonPay: { defaultCurrencyCode, showOnlyCurrencies } = {} } = BUYABLE_CHAINS_MAP[MAINNET.chainId]; @@ -117,11 +93,11 @@ describe('buy-url', () => { nock(SWAPS_API_V2_BASE_URL) .get(`/moonpaySign/?${queryParams}`) .reply(200, { - url: `https://buy.moonpay.com/?apiKey=${MOONPAY_API_KEY}&walletAddress=${MAINNET.address}&defaultCurrencyCode=${defaultCurrencyCode}&showOnlyCurrencies=eth%2Cusdt%2Cusdc%2Cdai&signature=laefTlgkESEc2hv8AZEH9F25VjLEJUADY27D6MccE54%3D`, + url: `https://buy.moonpay.com/?apiKey=${MOONPAY_API_KEY}&walletAddress=${MAINNET.address}&defaultCurrencyCode=${defaultCurrencyCode}&showOnlyCurrencies=${showOnlyCurrencies}&signature=laefTlgkESEc2hv8AZEH9F25VjLEJUADY27D6MccE54%3D`, }); const moonPayUrl = await getBuyUrl({ ...MAINNET, service: 'moonpay' }); expect(moonPayUrl).toStrictEqual( - `https://buy.moonpay.com/?apiKey=${MOONPAY_API_KEY}&walletAddress=${MAINNET.address}&defaultCurrencyCode=${defaultCurrencyCode}&showOnlyCurrencies=eth%2Cusdt%2Cusdc%2Cdai&signature=laefTlgkESEc2hv8AZEH9F25VjLEJUADY27D6MccE54%3D`, + `https://buy.moonpay.com/?apiKey=${MOONPAY_API_KEY}&walletAddress=${MAINNET.address}&defaultCurrencyCode=${defaultCurrencyCode}&showOnlyCurrencies=${showOnlyCurrencies}&signature=laefTlgkESEc2hv8AZEH9F25VjLEJUADY27D6MccE54%3D`, ); nock.cleanAll(); }); diff --git a/app/scripts/lib/createMetaRPCHandler.js b/app/scripts/lib/createMetaRPCHandler.js index d89156f8680c..f55319783fea 100644 --- a/app/scripts/lib/createMetaRPCHandler.js +++ b/app/scripts/lib/createMetaRPCHandler.js @@ -1,6 +1,7 @@ import { ethErrors, serializeError } from 'eth-rpc-errors'; +import { isManifestV3 } from '../../../shared/modules/mv3.utils'; -const createMetaRPCHandler = (api, outStream) => { +const createMetaRPCHandler = (api, outStream, store, localStoreApiWrapper) => { return async (data) => { if (outStream._writableState.ended) { return; @@ -22,6 +23,10 @@ const createMetaRPCHandler = (api, outStream) => { result = await api[data.method](...data.params); } catch (err) { error = err; + } finally { + if (isManifestV3 && store && data.method !== 'getState') { + localStoreApiWrapper.set(store.getState()); + } } if (outStream._writableState.ended) { diff --git a/app/scripts/lib/createRPCMethodTrackingMiddleware.js b/app/scripts/lib/createRPCMethodTrackingMiddleware.js index 3362e29ad3aa..8829bf5e2dd0 100644 --- a/app/scripts/lib/createRPCMethodTrackingMiddleware.js +++ b/app/scripts/lib/createRPCMethodTrackingMiddleware.js @@ -104,7 +104,7 @@ const rateLimitTimeouts = {}; export default function createRPCMethodTrackingMiddleware({ trackEvent, getMetricsState, - rateLimitSeconds = 60, + rateLimitSeconds = 60 * 5, }) { return function rpcMethodTrackingMiddleware( /** @type {any} */ req, diff --git a/app/scripts/lib/decrypt-message-manager.js b/app/scripts/lib/decrypt-message-manager.js index 020a2b247135..f5d221485cbb 100644 --- a/app/scripts/lib/decrypt-message-manager.js +++ b/app/scripts/lib/decrypt-message-manager.js @@ -1,12 +1,13 @@ import EventEmitter from 'events'; import { ObservableStore } from '@metamask/obs-store'; -import { bufferToHex, stripHexPrefix } from 'ethereumjs-util'; +import { bufferToHex } from 'ethereumjs-util'; import { ethErrors } from 'eth-rpc-errors'; import log from 'loglevel'; import { MESSAGE_TYPE } from '../../../shared/constants/app'; import { EVENT } from '../../../shared/constants/metametrics'; import { METAMASK_CONTROLLER_EVENTS } from '../metamask-controller'; import createId from '../../../shared/modules/random-id'; +import { stripHexPrefix } from '../../../shared/modules/hexstring-utils'; import { addHexPrefix } from './util'; const hexRe = /^[0-9A-Fa-f]+$/gu; diff --git a/app/scripts/lib/ens-ipfs/resolver.js b/app/scripts/lib/ens-ipfs/resolver.js index 94136c5e59e2..602134498ab9 100644 --- a/app/scripts/lib/ens-ipfs/resolver.js +++ b/app/scripts/lib/ens-ipfs/resolver.js @@ -80,7 +80,7 @@ function getRegistryForChainId(chainId) { case 4: case 5: case 6: - // Mainnet, Ropsten, Rinkeby, and Goerli, respectively, use the same address + // Mainnet and Goerli, respectively, use the same address return '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'; default: return null; diff --git a/app/scripts/lib/get-first-preferred-lang-code.js b/app/scripts/lib/get-first-preferred-lang-code.js index a47cdc2ac951..040697136928 100644 --- a/app/scripts/lib/get-first-preferred-lang-code.js +++ b/app/scripts/lib/get-first-preferred-lang-code.js @@ -1,8 +1,10 @@ import browser from 'webextension-polyfill'; import allLocales from '../../_locales/index.json'; +// ensure that we default users with browser language code 'zh' to the supported 'zh_CN' language code +const existingLocaleCodes = { zh: 'zh_CN' }; + // mapping some browsers return hyphen instead underscore in locale codes (e.g. zh_TW -> zh-tw) -const existingLocaleCodes = {}; allLocales.forEach((locale) => { if (locale && locale.code) { existingLocaleCodes[locale.code.toLowerCase().replace('_', '-')] = diff --git a/app/scripts/lib/local-store.js b/app/scripts/lib/local-store.js index 069853e12670..707fb1122ef2 100644 --- a/app/scripts/lib/local-store.js +++ b/app/scripts/lib/local-store.js @@ -1,5 +1,6 @@ import browser from 'webextension-polyfill'; import log from 'loglevel'; +import { captureException } from '@sentry/browser'; import { checkForError } from './util'; /** @@ -11,6 +12,45 @@ export default class ExtensionStore { if (!this.isSupported) { log.error('Storage local API not available.'); } + // we use this flag to avoid flooding sentry with a ton of errors: + // once data persistence fails once and it flips true we don't send further + // data persistence errors to sentry + this.dataPersistenceFailing = false; + } + + setMetadata(initMetaData) { + this.metadata = initMetaData; + } + + async set(state) { + if (!this.isSupported) { + throw new Error( + 'Metamask- cannot persist state to local store as this browser does not support this action', + ); + } + if (!state) { + throw new Error('MetaMask - updated state is missing'); + } + if (!this.metadata) { + throw new Error( + 'MetaMask - metadata must be set on instance of ExtensionStore before calling "set"', + ); + } + try { + // we format the data for storage as an object with the "data" key for the controller state object + // and the "meta" key for a metadata object containing a version number that tracks how the data shape + // has changed using migrations to adapt to backwards incompatible changes + await this._set({ data: state, meta: this.metadata }); + if (this.dataPersistenceFailing) { + this.dataPersistenceFailing = false; + } + } catch (err) { + if (!this.dataPersistenceFailing) { + this.dataPersistenceFailing = true; + captureException(err); + } + log.error('error setting state in local store:', err); + } } /** @@ -31,16 +71,6 @@ export default class ExtensionStore { return result; } - /** - * Sets the key in local state - * - * @param {object} state - The state to set - * @returns {Promise} - */ - async set(state) { - return this._set(state); - } - /** * Returns all of the keys currently saved * diff --git a/app/scripts/lib/local-store.test.js b/app/scripts/lib/local-store.test.js new file mode 100644 index 000000000000..2c3cea4055c7 --- /dev/null +++ b/app/scripts/lib/local-store.test.js @@ -0,0 +1,79 @@ +import browser from 'webextension-polyfill'; +import LocalStore from './local-store'; + +jest.mock('webextension-polyfill', () => ({ + storage: { local: true }, +})); + +const setup = ({ isSupported }) => { + browser.storage.local = isSupported; + return new LocalStore(); +}; +describe('LocalStore', () => { + afterEach(() => { + jest.resetModules(); + }); + describe('contructor', () => { + it('should set isSupported property to false when browser does not support local storage', () => { + const localStore = setup({ isSupported: false }); + + expect(localStore.isSupported).toBe(false); + }); + + it('should set isSupported property to true when browser supports local storage', () => { + const localStore = setup({ isSupported: true }); + expect(localStore.isSupported).toBe(true); + }); + }); + + describe('setMetadata', () => { + it('should set the metadata property on LocalStore', () => { + const metadata = { version: 74 }; + const localStore = setup({ isSupported: true }); + localStore.setMetadata(metadata); + + expect(localStore.metadata).toStrictEqual(metadata); + }); + }); + + describe('set', () => { + it('should throw an error if called in a browser that does not support local storage', async () => { + const localStore = setup({ isSupported: false }); + await expect(() => localStore.set()).rejects.toThrow( + 'Metamask- cannot persist state to local store as this browser does not support this action', + ); + }); + + it('should throw an error if not passed a truthy value as an argument', async () => { + const localStore = setup({ isSupported: true }); + await expect(() => localStore.set()).rejects.toThrow( + 'MetaMask - updated state is missing', + ); + }); + + it('should throw an error if passed a valid argument but metadata has not yet been set', async () => { + const localStore = setup({ isSupported: true }); + await expect(() => + localStore.set({ appState: { test: true } }), + ).rejects.toThrow( + 'MetaMask - metadata must be set on instance of ExtensionStore before calling "set"', + ); + }); + + it('should not throw if passed a valid argument and metadata has been set', async () => { + const localStore = setup({ isSupported: true }); + localStore.setMetadata({ version: 74 }); + await expect(async function () { + localStore.set({ appState: { test: true } }); + }).not.toThrow(); + }); + }); + + describe('get', () => { + it('should return undefined if called in a browser that does not support local storage', async () => { + const localStore = setup({ isSupported: false }); + const result = await localStore.get(); + expect(result).toStrictEqual(undefined); + }); + }); +}); diff --git a/app/scripts/lib/network-store.js b/app/scripts/lib/network-store.js index abee778c1519..ea6ba5876326 100644 --- a/app/scripts/lib/network-store.js +++ b/app/scripts/lib/network-store.js @@ -50,16 +50,37 @@ export default class ReadOnlyNetworkStore { return this._state; } + /** + * Set metadata/version state + * + * @param {object} metadata - The metadata/version data to set + */ + setMetadata(metadata) { + this.metadata = metadata; + } + /** * Set state * * @param {object} state - The state to set - * @returns {Promise} */ async set(state) { + if (!this.isSupported) { + throw new Error( + 'Metamask- cannot persist state to local store as this browser does not support this action', + ); + } + if (!state) { + throw new Error('MetaMask - updated state is missing'); + } + if (!this.metadata) { + throw new Error( + 'MetaMask - metadata must be set on instance of ExtensionStore before calling "set"', + ); + } if (!this._initialized) { await this._initializing; } - this._state = state; + this._state = { data: state, meta: this._metadata }; } } diff --git a/app/scripts/lib/personal-message-manager.js b/app/scripts/lib/personal-message-manager.js index ffc45575b752..493288907a90 100644 --- a/app/scripts/lib/personal-message-manager.js +++ b/app/scripts/lib/personal-message-manager.js @@ -1,6 +1,6 @@ import EventEmitter from 'events'; import { ObservableStore } from '@metamask/obs-store'; -import { bufferToHex, stripHexPrefix } from 'ethereumjs-util'; +import { bufferToHex } from 'ethereumjs-util'; import { ethErrors } from 'eth-rpc-errors'; import log from 'loglevel'; import { MESSAGE_TYPE } from '../../../shared/constants/app'; @@ -8,6 +8,7 @@ import { METAMASK_CONTROLLER_EVENTS } from '../metamask-controller'; import createId from '../../../shared/modules/random-id'; import { EVENT } from '../../../shared/constants/metametrics'; import { detectSIWE } from '../../../shared/modules/siwe'; +import { stripHexPrefix } from '../../../shared/modules/hexstring-utils'; import { addHexPrefix } from './util'; const hexRe = /^[0-9A-Fa-f]+$/gu; diff --git a/app/scripts/lib/seed-phrase-verifier.js b/app/scripts/lib/seed-phrase-verifier.js index e1c18c1ebaab..58d4acdf9c91 100644 --- a/app/scripts/lib/seed-phrase-verifier.js +++ b/app/scripts/lib/seed-phrase-verifier.js @@ -1,6 +1,8 @@ import KeyringController from 'eth-keyring-controller'; import log from 'loglevel'; +import { KEYRING_TYPES } from '../../../shared/constants/keyrings'; + const seedPhraseVerifier = { /** * Verifies if the seed words can restore the accounts. @@ -20,7 +22,9 @@ const seedPhraseVerifier = { } const keyringController = new KeyringController({}); - const Keyring = keyringController.getKeyringClassForType('HD Key Tree'); + const Keyring = keyringController.getKeyringClassForType( + KEYRING_TYPES.HD_KEY_TREE, + ); const opts = { mnemonic: seedPhrase, numberOfAccounts: createdAccounts.length, diff --git a/app/scripts/lib/seed-phrase-verifier.test.js b/app/scripts/lib/seed-phrase-verifier.test.js index 2f56c4b9aecb..aaa161d805b7 100644 --- a/app/scripts/lib/seed-phrase-verifier.test.js +++ b/app/scripts/lib/seed-phrase-verifier.test.js @@ -6,12 +6,13 @@ import { cloneDeep } from 'lodash'; import KeyringController from 'eth-keyring-controller'; import firstTimeState from '../first-time-state'; import mockEncryptor from '../../../test/lib/mock-encryptor'; +import { KEYRING_TYPES } from '../../../shared/constants/keyrings'; import seedPhraseVerifier from './seed-phrase-verifier'; describe('SeedPhraseVerifier', () => { describe('verifyAccounts', () => { const password = 'passw0rd1'; - const hdKeyTree = 'HD Key Tree'; + const hdKeyTree = KEYRING_TYPES.HD_KEY_TREE; let keyringController; let primaryKeyring; diff --git a/app/scripts/lib/segment/analytics.js b/app/scripts/lib/segment/analytics.js new file mode 100644 index 000000000000..8966c8eebf7c --- /dev/null +++ b/app/scripts/lib/segment/analytics.js @@ -0,0 +1,264 @@ +import removeSlash from 'remove-trailing-slash'; +import looselyValidate from '@segment/loosely-validate-event'; +import { isString } from 'lodash'; +import isRetryAllowed from 'is-retry-allowed'; +import { generateRandomId } from '../util'; + +const noop = () => ({}); + +// Method below is inspired from axios-retry https://github.com/softonic/axios-retry +function isNetworkError(error) { + return ( + !error.response && + Boolean(error.code) && // Prevents retrying cancelled requests + error.code !== 'ECONNABORTED' && // Prevents retrying timed out requests + isRetryAllowed(error) + ); // Prevents retrying unsafe errors +} + +export default class Analytics { + /** + * Initialize a new `Analytics` with Segment project's `writeKey` and an + * optional dictionary of `options`. + * + * @param {string} writeKey + * @param {object} [options] - (optional) + * @property {number} [flushAt] (default: 20) + * @property {number} [flushInterval] (default: 10000) + * @property {string} [host] (default: 'https://api.segment.io') + */ + constructor(writeKey, options = {}) { + this.writeKey = writeKey; + + this.host = removeSlash(options.host || 'https://api.segment.io'); + this.flushInterval = options.flushInterval || 10000; + this.flushAt = options.flushAt || Math.max(options.flushAt, 1) || 20; + + this.queue = []; + this.path = '/v1/batch'; + this.maxQueueSize = 1024 * 450; + this.flushed = false; + this.retryCount = 3; + + Object.defineProperty(this, 'enable', { + configurable: false, + writable: false, + enumerable: true, + value: true, + }); + } + + _validate(message, type) { + looselyValidate(message, type); + } + + _message(type, message, callback) { + this._validate(message, type); + this.enqueue(type, message, callback); + return this; + } + + /** + * Send an identify `message`. + * + * @param {object} message + * @param {Function} [callback] - (optional) + * @returns {Analytics} + */ + identify(message, callback) { + return this._message('identify', message, callback); + } + + /** + * Send a track `message`. + * + * @param {object} message + * @param {Function} [callback] - (optional) + * @returns {Analytics} + */ + track(message, callback) { + return this._message('track', message, callback); + } + + /** + * Send a page `message`. + * + * @param {object} message + * @param {Function} [callback] - (optional) + * @returns {Analytics} + */ + page(message, callback) { + return this._message('page', message, callback); + } + + /** + * Add a `message` of type `type` to the queue and + * check whether it should be flushed. + * + * @param {string} type + * @param {object} msg + * @param {Function} [callback] - (optional) + */ + enqueue(type, msg, callback = noop) { + if (!this.enable) { + setImmediate(callback); + return; + } + + const message = { ...msg, type }; + + // Specifying library here helps segment to understand structure of request. + // Currently segment seems to support these source libraries only. + message.context = { + ...message.context, + library: { + name: 'analytics-node', + }, + }; + + if (!message.timestamp) { + message.timestamp = new Date(); + } + + if (!message.messageId) { + message.messageId = generateRandomId(); + } + + if (message.anonymousId && !isString(message.anonymousId)) { + message.anonymousId = JSON.stringify(message.anonymousId); + } + if (message.userId && !isString(message.userId)) { + message.userId = JSON.stringify(message.userId); + } + this.queue.push({ message, callback }); + + if (!this.flushed) { + this.flushed = true; + this.flush(); + return; + } + + const hasReachedFlushAt = this.queue.length >= this.flushAt; + const hasReachedQueueSize = + this.queue.reduce((acc, item) => acc + JSON.stringify(item).length, 0) >= + this.maxQueueSize; + if (hasReachedFlushAt || hasReachedQueueSize) { + this.flush(); + } + + if (this.flushInterval && !this.timer) { + this.timer = setTimeout(this.flush.bind(this), this.flushInterval); + } + } + + /** + * Flush the current queue + * + * @param {Function} [callback] - (optional) + */ + flush(callback = noop) { + if (!this.enable) { + setImmediate(callback); + return Promise.resolve(); + } + + if (this.timer) { + clearTimeout(this.timer); + this.timer = null; + } + + if (!this.queue.length) { + setImmediate(callback); + return Promise.resolve(); + } + + const items = this.queue.splice(0, this.flushAt); + const callbacks = items.map((item) => item.callback); + const messages = items.map((item) => item.message); + + const data = { + batch: messages, + timestamp: new Date(), + sentAt: new Date(), + }; + + const done = (err) => { + setImmediate(() => { + callbacks.forEach((fn) => fn(err, data)); + callback(err, data); + }); + }; + + const headers = { + Authorization: `Basic ${Buffer.from(this.writeKey, 'utf8').toString( + 'base64', + )}`, + }; + + return this._sendRequest( + `${this.host}${this.path}`, + { + method: 'POST', + body: JSON.stringify(data), + headers, + }, + done, + 0, + ); + } + + _retryRequest(url, body, done, retryNo) { + const delay = Math.pow(2, retryNo) * 100; + setTimeout(() => { + this._sendRequest(url, body, done, retryNo + 1); + }, delay); + } + + async _sendRequest(url, body, done, retryNo) { + return fetch(url, body) + .then(async (response) => { + if (response.ok) { + done(); + } else if ( + this._isErrorRetryable({ response }) && + retryNo <= this.retryCount + ) { + this._retryRequest(url, body, done, retryNo); + } else { + const error = new Error(response.statusText); + done(error); + } + }) + .catch((error) => { + if (this._isErrorRetryable(error) && retryNo <= this.retryCount) { + this._retryRequest(url, body, done, retryNo); + } else { + done(error); + } + }); + } + + _isErrorRetryable(error) { + // Retry Network Errors. + if (isNetworkError(error)) { + return true; + } + + if (!error.response) { + // Cannot determine if the request can be retried + return false; + } + + // Retry Server Errors (5xx). + if (error.response.status >= 500 && error.response.status <= 599) { + return true; + } + + // Retry if rate limited. + if (error.response.status === 429) { + return true; + } + + return false; + } +} diff --git a/app/scripts/lib/segment/analytics.test.js b/app/scripts/lib/segment/analytics.test.js new file mode 100644 index 000000000000..33844bb9f6a3 --- /dev/null +++ b/app/scripts/lib/segment/analytics.test.js @@ -0,0 +1,116 @@ +import Analytics from './analytics'; + +const DUMMY_KEY = 'DUMMY_KEY'; +const DUMMY_MESSAGE = { + userId: 'userId', + idValue: 'idValue', + event: 'event', +}; +const FLUSH_INTERVAL = 10000; + +global.setImmediate = (arg) => { + arg(); +}; + +global.fetch = () => + Promise.resolve({ + ok: true, + json: () => Promise.resolve({ success: true }), + }); + +describe('Analytics', function () { + let analytics; + + beforeEach(() => { + analytics = new Analytics(DUMMY_KEY); + }); + + describe('#flush', function () { + it('first message is immediately flushed', function () { + const mock = jest.fn(analytics.flush); + analytics.flush = mock; + analytics.track(DUMMY_MESSAGE); + expect(analytics.queue).toHaveLength(0); + expect(mock).toHaveBeenCalledTimes(1); + }); + + it('after first message it is called when queue size equals flushAt value', function () { + analytics = new Analytics(DUMMY_KEY, { flushAt: 3 }); + const mock = jest.fn(analytics.flush); + analytics.flush = mock; + analytics.track(DUMMY_MESSAGE); + analytics.track(DUMMY_MESSAGE); + analytics.track(DUMMY_MESSAGE); + analytics.track(DUMMY_MESSAGE); + expect(analytics.queue).toHaveLength(0); + expect(mock).toHaveBeenCalledTimes(2); + }); + + it('except for first message it is called until queue size is less than flushAt value', function () { + analytics = new Analytics(DUMMY_KEY, { flushAt: 3 }); + const mock = jest.fn(analytics.flush); + analytics.flush = mock; + analytics.track(DUMMY_MESSAGE); + analytics.track(DUMMY_MESSAGE); + analytics.track(DUMMY_MESSAGE); + expect(analytics.queue).toHaveLength(2); + expect(mock).toHaveBeenCalledTimes(1); + }); + + it('after first message it is called after flushInterval is elapsed', function () { + jest.useFakeTimers(); + analytics = new Analytics(DUMMY_KEY, { flushInterval: FLUSH_INTERVAL }); + const mock = jest.fn(analytics.flush); + analytics.flush = mock; + analytics.track(DUMMY_MESSAGE); + analytics.track(DUMMY_MESSAGE); + jest.advanceTimersByTime(FLUSH_INTERVAL); + expect(analytics.queue).toHaveLength(0); + expect(mock).toHaveBeenCalledTimes(2); + }); + + it('after first message it is not called until flushInterval is elapsed', function () { + jest.useFakeTimers(); + analytics = new Analytics(DUMMY_KEY, { flushInterval: FLUSH_INTERVAL }); + const mock = jest.fn(analytics.flush); + analytics.flush = mock; + analytics.track(DUMMY_MESSAGE); + analytics.track(DUMMY_MESSAGE); + jest.advanceTimersByTime(FLUSH_INTERVAL - 100); + expect(analytics.queue).toHaveLength(1); + expect(mock).toHaveBeenCalledTimes(1); + }); + + it('invokes callbacks', async function () { + const callback = jest.fn(); + analytics.track(DUMMY_MESSAGE); + analytics.track(DUMMY_MESSAGE, callback); + await analytics.flush(); + expect(callback).toHaveBeenCalledTimes(1); + }); + }); + + describe('#track', function () { + it('adds messages to ququq', function () { + analytics.track(DUMMY_MESSAGE); + analytics.track(DUMMY_MESSAGE); + expect(analytics.queue).toHaveLength(1); + }); + }); + + describe('#page', function () { + it('adds messages to ququq', function () { + analytics.page(DUMMY_MESSAGE); + analytics.page(DUMMY_MESSAGE); + expect(analytics.queue).toHaveLength(1); + }); + }); + + describe('#identify', function () { + it('adds messages to ququq', function () { + analytics.identify(DUMMY_MESSAGE); + analytics.identify(DUMMY_MESSAGE); + expect(analytics.queue).toHaveLength(1); + }); + }); +}); diff --git a/app/scripts/lib/segment.js b/app/scripts/lib/segment/index.js similarity index 96% rename from app/scripts/lib/segment.js rename to app/scripts/lib/segment/index.js index 1b054333b7e4..99062b820cab 100644 --- a/app/scripts/lib/segment.js +++ b/app/scripts/lib/segment/index.js @@ -1,5 +1,5 @@ -import Analytics from 'analytics-node'; -import { SECOND } from '../../../shared/constants/time'; +import { SECOND } from '../../../../shared/constants/time'; +import Analytics from './analytics'; const SEGMENT_WRITE_KEY = process.env.SEGMENT_WRITE_KEY ?? null; const SEGMENT_HOST = process.env.SEGMENT_HOST ?? null; diff --git a/app/scripts/lib/setupSentry.js b/app/scripts/lib/setupSentry.js index 5ef0e68b4c17..73bad861c84f 100644 --- a/app/scripts/lib/setupSentry.js +++ b/app/scripts/lib/setupSentry.js @@ -53,11 +53,6 @@ export const SENTRY_STATE = { type: true, }, seedPhraseBackedUp: true, - showRestorePrompt: true, - threeBoxDisabled: true, - threeBoxLastUpdated: true, - threeBoxSynced: true, - threeBoxSyncingAllowed: true, unapprovedDecryptMsgCount: true, unapprovedEncryptionPublicKeyMsgCount: true, unapprovedMsgCount: true, @@ -226,7 +221,7 @@ function rewriteReportUrls(report) { } function toMetamaskUrl(origUrl) { - const filePath = origUrl.split(window.location.origin)[1]; + const filePath = origUrl.split(globalThis.location.origin)[1]; if (!filePath) { return origUrl; } diff --git a/app/scripts/lib/stream-utils.js b/app/scripts/lib/stream-utils.js index 6fa4d7a6cf88..a9c42df7a659 100644 --- a/app/scripts/lib/stream-utils.js +++ b/app/scripts/lib/stream-utils.js @@ -1,6 +1,8 @@ import ObjectMultiplex from 'obj-multiplex'; import pump from 'pump'; +import { EXTENSION_MESSAGES } from '../../../shared/constants/app'; + /** * Sets up stream multiplexing for the given stream * @@ -9,6 +11,14 @@ import pump from 'pump'; */ export function setupMultiplex(connectionStream) { const mux = new ObjectMultiplex(); + /** + * We are using this streams to send keep alive message between backend/ui without setting up a multiplexer + * We need to tell the multiplexer to ignore them, else we get the " orphaned data for stream " warnings + * https://github.com/MetaMask/object-multiplex/blob/280385401de84f57ef57054d92cfeb8361ef2680/src/ObjectMultiplex.ts#L63 + */ + mux.ignoreStream(EXTENSION_MESSAGES.CONNECTION_READY); + mux.ignoreStream('ACK_KEEP_ALIVE_MESSAGE'); + mux.ignoreStream('WORKER_KEEP_ALIVE_MESSAGE'); pump(connectionStream, mux, connectionStream, (err) => { if (err) { console.error(err); diff --git a/app/scripts/lib/uns-ipfs/resolver.js b/app/scripts/lib/uns-ipfs/resolver.js new file mode 100644 index 000000000000..d0f569480f47 --- /dev/null +++ b/app/scripts/lib/uns-ipfs/resolver.js @@ -0,0 +1,31 @@ +import Resolution from '@unstoppabledomains/resolution'; +import { infuraProjectId } from '../../../../shared/constants/network'; + +// Sets the Provider URLS to the MetaMask defaults +const ethereumProviderUrl = `https://mainnet.infura.io/v3/${infuraProjectId}`; +const polygonProviderUrl = `https://polygon-mainnet.infura.io/v3/${infuraProjectId}`; +/** + * Resolves an Unstoppable Domain into an IPFS Website Hash + * + * @param {string} domainName - a Valid Unstoppable Domain Name + */ +export default async function resolveUnsToIpfsContentId(domainName) { + const resolution = new Resolution({ + sourceConfig: { + uns: { + locations: { + Layer1: { + url: ethereumProviderUrl, + network: 'mainnet', + }, + Layer2: { + url: polygonProviderUrl, + network: 'polygon-mainnet', + }, + }, + }, + }, + }); + const result = await resolution.ipfsHash(domainName); + return result; +} diff --git a/app/scripts/lib/uns-ipfs/setup.js b/app/scripts/lib/uns-ipfs/setup.js new file mode 100644 index 000000000000..0ca30ff667c2 --- /dev/null +++ b/app/scripts/lib/uns-ipfs/setup.js @@ -0,0 +1,64 @@ +import browser from 'webextension-polyfill'; +import { udTlds } from '@unstoppabledomains/tldsresolverkeys'; +import { isValidUnstoppableDomainName } from '../../../../ui/helpers/utils/util'; +import resolveUnsToIpfsContentId from './resolver'; +/** + * Initializes the Ipfs resolver + * + * @param {Function} getIpfsGateway - the user selected IpfsGateway determined in MetaMask settings + */ +export default async function setupUnsIpfsResolver({ getIpfsGateway }) { + const urlPatterns = udTlds.map((tld) => `*://*.${tld}/`); + browser.webRequest.onErrorOccurred.addListener(webRequestDidFail, { + urls: urlPatterns, + types: ['main_frame'], + }); + return { + remove() { + browser.webRequest.onErrorOccurred.removeListener(webRequestDidFail); + }, + }; + /** + * Attempts to Resolve to IPFS if a web request fails + * checks for Valid Unstoppable Domain + * If valid, attempt to resolve + * + * @param {object} details - tabID and Url from the browser + */ + async function webRequestDidFail(details) { + const { tabId, url } = details; + if (tabId === -1) { + return; + } + const { hostname: name } = new URL(url); + if (!isValidUnstoppableDomainName(name)) { + return; + } + attemptResolve(tabId, name); + } + /** + * Attempts to Resolve to IPFS + * set the URL to the Unstoppable Domains search page + * Calls resolution to determine an IPFS Hash + * If an IPFS hash is returned by the resolution set the URL to the IPFS Gateway + the IPFS Hash + * if no Ipfs hash, redirect users to the UD search page + * + * @param {string} tabId - browser tab ID + * @param {string} domainName - UD domain name + */ + async function attemptResolve(tabId, domainName) { + const ipfsGateway = getIpfsGateway(); + browser.tabs.update(tabId, { url: `unsloading.html` }); + let url = `http://unstoppabledomains.com/search?searchTerm=${domainName}`; + try { + const ipfsHash = await resolveUnsToIpfsContentId(domainName); + if (ipfsHash) { + url = `https://${ipfsGateway}/ipfs/${ipfsHash}`; + } + } catch (err) { + console.warn(err); + } finally { + browser.tabs.update(tabId, { url }); + } + } +} diff --git a/app/scripts/lib/util.js b/app/scripts/lib/util.js index 11027123d4b2..58c0b3c89687 100644 --- a/app/scripts/lib/util.js +++ b/app/scripts/lib/util.js @@ -1,6 +1,4 @@ import browser from 'webextension-polyfill'; - -import { stripHexPrefix } from 'ethereumjs-util'; import BN from 'bn.js'; import { memoize } from 'lodash'; import { CHAIN_IDS, TEST_CHAINS } from '../../../shared/constants/network'; @@ -16,6 +14,7 @@ import { PLATFORM_EDGE, PLATFORM_BRAVE, } from '../../../shared/constants/app'; +import { stripHexPrefix } from '../../../shared/modules/hexstring-utils'; /** * @see {@link getEnvironmentType} @@ -97,6 +96,7 @@ function BnMultiplyByFraction(targetBN, numerator, denominator) { * Returns an Error if extension.runtime.lastError is present * this is a workaround for the non-standard error object that's used * + * @deprecated use checkForLastError in shared/modules/browser-runtime.utils.js * @returns {Error|undefined} */ function checkForError() { @@ -153,6 +153,17 @@ function getChainType(chainId) { return 'custom'; } +/** + * Checks if the alarmname exists in the list + * + * @param {Array} alarmList + * @param alarmName + * @returns + */ +function checkAlarmExists(alarmList, alarmName) { + return alarmList.some((alarm) => alarm.name === alarmName); +} + export { getPlatform, getEnvironmentType, @@ -162,4 +173,21 @@ export { addHexPrefix, bnToHex, getChainType, + checkAlarmExists, +}; + +// Taken from https://stackoverflow.com/a/1349426/3696652 +const characters = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; +export const generateRandomId = () => { + let result = ''; + const charactersLength = characters.length; + for (let i = 0; i < 20; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +}; + +export const isValidDate = (d) => { + return d instanceof Date && !isNaN(d); }; diff --git a/app/scripts/metamask-controller.actions.test.js b/app/scripts/metamask-controller.actions.test.js index c0e438c666d3..b3eff23d7c6d 100644 --- a/app/scripts/metamask-controller.actions.test.js +++ b/app/scripts/metamask-controller.actions.test.js @@ -1,6 +1,11 @@ import { strict as assert } from 'assert'; import sinon from 'sinon'; import proxyquire from 'proxyquire'; + +import { + ApprovalRequestNotFoundError, + PermissionsRequestNotFoundError, +} from '@metamask/controllers'; import { ORIGIN_METAMASK } from '../../shared/constants/app'; const Ganache = require('../../test/e2e/ganache'); @@ -238,4 +243,137 @@ describe('MetaMaskController', function () { assert.deepEqual(transaction1, transaction2); }); }); + + describe('#removePermissionsFor', function () { + it('should not propagate PermissionsRequestNotFoundError', function () { + const error = new PermissionsRequestNotFoundError('123'); + metamaskController.permissionController = { + revokePermissions: () => { + throw error; + }, + }; + // Line below will not throw error, in case it throws this test case will fail. + metamaskController.removePermissionsFor({ subject: 'test_subject' }); + }); + + it('should propagate Error other than PermissionsRequestNotFoundError', function () { + const error = new Error(); + metamaskController.permissionController = { + revokePermissions: () => { + throw error; + }, + }; + assert.throws(() => { + metamaskController.removePermissionsFor({ subject: 'test_subject' }); + }, error); + }); + }); + + describe('#rejectPermissionsRequest', function () { + it('should not propagate PermissionsRequestNotFoundError', function () { + const error = new PermissionsRequestNotFoundError('123'); + metamaskController.permissionController = { + rejectPermissionsRequest: () => { + throw error; + }, + }; + // Line below will not throw error, in case it throws this test case will fail. + metamaskController.rejectPermissionsRequest('DUMMY_ID'); + }); + + it('should propagate Error other than PermissionsRequestNotFoundError', function () { + const error = new Error(); + metamaskController.permissionController = { + rejectPermissionsRequest: () => { + throw error; + }, + }; + assert.throws(() => { + metamaskController.rejectPermissionsRequest('DUMMY_ID'); + }, error); + }); + }); + + describe('#acceptPermissionsRequest', function () { + it('should not propagate PermissionsRequestNotFoundError', function () { + const error = new PermissionsRequestNotFoundError('123'); + metamaskController.permissionController = { + acceptPermissionsRequest: () => { + throw error; + }, + }; + // Line below will not throw error, in case it throws this test case will fail. + metamaskController.acceptPermissionsRequest('DUMMY_ID'); + }); + + it('should propagate Error other than PermissionsRequestNotFoundError', function () { + const error = new Error(); + metamaskController.permissionController = { + acceptPermissionsRequest: () => { + throw error; + }, + }; + assert.throws(() => { + metamaskController.acceptPermissionsRequest('DUMMY_ID'); + }, error); + }); + }); + + describe('#resolvePendingApproval', function () { + it('should not propagate ApprovalRequestNotFoundError', function () { + const error = new ApprovalRequestNotFoundError('123'); + metamaskController.approvalController = { + accept: () => { + throw error; + }, + }; + // Line below will not throw error, in case it throws this test case will fail. + metamaskController.resolvePendingApproval('DUMMY_ID', 'DUMMY_VALUE'); + }); + + it('should propagate Error other than ApprovalRequestNotFoundError', function () { + const error = new Error(); + metamaskController.approvalController = { + accept: () => { + throw error; + }, + }; + assert.throws(() => { + metamaskController.resolvePendingApproval('DUMMY_ID', 'DUMMY_VALUE'); + }, error); + }); + }); + + describe('#rejectPendingApproval', function () { + it('should not propagate ApprovalRequestNotFoundError', function () { + const error = new ApprovalRequestNotFoundError('123'); + metamaskController.approvalController = { + reject: () => { + throw error; + }, + }; + // Line below will not throw error, in case it throws this test case will fail. + metamaskController.rejectPendingApproval('DUMMY_ID', { + code: 1, + message: 'DUMMY_MESSAGE', + data: 'DUMMY_DATA', + }); + }); + + it('should propagate Error other than ApprovalRequestNotFoundError', function () { + const error = new Error(); + metamaskController.approvalController = { + reject: () => { + throw error; + }, + }; + assert.throws(() => { + metamaskController.rejectPendingApproval('DUMMY_ID', { + code: 1, + message: 'DUMMY_MESSAGE', + data: 'DUMMY_DATA', + }); + }, error); + }); + }); }); diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 1befeb496594..fdf441cef079 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -15,7 +15,6 @@ import { ethErrors, } from 'eth-rpc-errors'; import { Mutex } from 'await-semaphore'; -import { stripHexPrefix } from 'ethereumjs-util'; import log from 'loglevel'; import TrezorKeyring from 'eth-trezor-keyring'; import LedgerBridgeKeyring from '@metamask/eth-ledger-bridge-keyring'; @@ -35,11 +34,13 @@ import { TokenListController, TokensController, TokenRatesController, - CollectiblesController, + NftController, AssetsContractController, - CollectibleDetectionController, + NftDetectionController, PermissionController, SubjectMetadataController, + PermissionsRequestNotFoundError, + ApprovalRequestNotFoundError, ///: BEGIN:ONLY_INCLUDE_IN(flask) RateLimitController, NotificationController, @@ -48,10 +49,10 @@ import { import SmartTransactionsController from '@metamask/smart-transactions-controller'; ///: BEGIN:ONLY_INCLUDE_IN(flask) import { + CronjobController, SnapController, IframeExecutionService, } from '@metamask/snap-controllers'; -import { satisfies as satisfiesSemver } from 'semver'; ///: END:ONLY_INCLUDE_IN import { @@ -65,11 +66,9 @@ import { GAS_DEV_API_BASE_URL, SWAPS_CLIENT_ID, } from '../../shared/constants/swaps'; +import { KEYRING_TYPES } from '../../shared/constants/keyrings'; import { CHAIN_IDS } from '../../shared/constants/network'; -import { - DEVICE_NAMES, - KEYRING_TYPES, -} from '../../shared/constants/hardware-wallets'; +import { DEVICE_NAMES } from '../../shared/constants/hardware-wallets'; import { CaveatTypes, RestrictedMethods, @@ -78,8 +77,11 @@ import { ///: END:ONLY_INCLUDE_IN } from '../../shared/constants/permissions'; import { UI_NOTIFICATIONS } from '../../shared/notifications'; -import { toChecksumHexAddress } from '../../shared/modules/hexstring-utils'; -import { MILLISECOND } from '../../shared/constants/time'; +import { + toChecksumHexAddress, + stripHexPrefix, +} from '../../shared/modules/hexstring-utils'; +import { MILLISECOND, SECOND } from '../../shared/constants/time'; import { ORIGIN_METAMASK, ///: BEGIN:ONLY_INCLUDE_IN(flask) @@ -122,7 +124,6 @@ import AppStateController from './controllers/app-state'; import CachedBalancesController from './controllers/cached-balances'; import AlertController from './controllers/alert'; import OnboardingController from './controllers/onboarding'; -import ThreeBoxController from './controllers/threebox'; import BackupController from './controllers/backup'; import IncomingTransactionsController from './controllers/incoming-transactions'; import MessageManager, { normalizeMsgData } from './lib/message-manager'; @@ -154,6 +155,10 @@ import { ///: END:ONLY_INCLUDE_IN } from './controllers/permissions'; import createRPCMethodTrackingMiddleware from './lib/createRPCMethodTrackingMiddleware'; +///: BEGIN:ONLY_INCLUDE_IN(flask) +import { checkSnapsBlockList } from './flask/snaps-utilities'; +import { SNAP_BLOCKLIST } from './flask/snaps-blocklist'; +///: END:ONLY_INCLUDE_IN export const METAMASK_CONTROLLER_EVENTS = { // Fired after state changes that impact the extension badge (unapproved msg count) @@ -196,6 +201,9 @@ export default class MetamaskController extends EventEmitter { this.controllerMessenger = new ControllerMessenger(); + // instance of a class that wraps the extension's storage local API. + this.localStoreApiWrapper = opts.localStore; + // observable state store this.store = new ComposableObservableStore({ state: initState, @@ -242,7 +250,9 @@ export default class MetamaskController extends EventEmitter { this.tokenListController = new TokenListController({ chainId: hexToDecimal(this.networkController.getCurrentChainId()), - preventPollingOnNetworkRestart: true, + preventPollingOnNetworkRestart: initState.TokenListController + ? initState.TokenListController.preventPollingOnNetworkRestart + : true, onNetworkStateChange: (cb) => { this.networkController.store.subscribe((networkState) => { const modifiedNetworkState = { @@ -302,7 +312,7 @@ export default class MetamaskController extends EventEmitter { initState.AssetsContractController, ); - this.collectiblesController = new CollectiblesController( + this.nftController = new NftController( { onPreferencesStateChange: this.preferencesController.store.subscribe.bind( @@ -333,14 +343,14 @@ export default class MetamaskController extends EventEmitter { this.assetsContractController.getERC1155TokenURI.bind( this.assetsContractController, ), - onCollectibleAdded: ({ address, symbol, tokenId, standard, source }) => + onNftAdded: ({ address, symbol, tokenId, standard, source }) => this.metaMetricsController.trackEvent({ event: EVENT_NAMES.NFT_ADDED, category: EVENT.CATEGORIES.WALLET, properties: { token_contract_address: address, token_symbol: symbol, - asset_type: ASSET_TYPES.COLLECTIBLE, + asset_type: ASSET_TYPES.NFT, token_standard: standard, source, }, @@ -350,34 +360,29 @@ export default class MetamaskController extends EventEmitter { }), }, {}, - initState.CollectiblesController, + initState.NftController, ); - this.collectiblesController.setApiKey(process.env.OPENSEA_KEY); + this.nftController.setApiKey(process.env.OPENSEA_KEY); process.env.COLLECTIBLES_V1 && - (this.collectibleDetectionController = new CollectibleDetectionController( - { - onCollectiblesStateChange: (listener) => - this.collectiblesController.subscribe(listener), - onPreferencesStateChange: - this.preferencesController.store.subscribe.bind( - this.preferencesController.store, - ), - onNetworkStateChange: this.networkController.store.subscribe.bind( - this.networkController.store, + (this.nftDetectionController = new NftDetectionController({ + onNftsStateChange: (listener) => this.nftController.subscribe(listener), + onPreferencesStateChange: + this.preferencesController.store.subscribe.bind( + this.preferencesController.store, ), - getOpenSeaApiKey: () => this.collectiblesController.openSeaApiKey, - getBalancesInSingleCall: - this.assetsContractController.getBalancesInSingleCall.bind( - this.assetsContractController, - ), - addCollectible: this.collectiblesController.addCollectible.bind( - this.collectiblesController, + onNetworkStateChange: this.networkController.store.subscribe.bind( + this.networkController.store, + ), + getOpenSeaApiKey: () => this.nftController.openSeaApiKey, + getBalancesInSingleCall: + this.assetsContractController.getBalancesInSingleCall.bind( + this.assetsContractController, ), - getCollectiblesState: () => this.collectiblesController.state, - }, - )); + addNft: this.nftController.addNft.bind(this.nftController), + getNftState: () => this.nftController.state, + })); this.metaMetricsController = new MetaMetricsController({ segment, @@ -465,6 +470,10 @@ export default class MetamaskController extends EventEmitter { }); this.phishingController = new PhishingController(); + this.phishingController.updatePhishingLists(); + if (process.env.IN_TEST) { + this.phishingController.setRefreshInterval(5 * SECOND); + } this.announcementController = new AnnouncementController( { allAnnouncements: UI_NOTIFICATIONS }, @@ -524,6 +533,9 @@ export default class MetamaskController extends EventEmitter { getCurrentChainId: this.networkController.getCurrentChainId.bind( this.networkController, ), + getNetworkIdentifier: this.networkController.getNetworkIdentifier.bind( + this.networkController, + ), }); // start and stop polling for balances based on activeControllerConnections @@ -649,7 +661,7 @@ export default class MetamaskController extends EventEmitter { ///: BEGIN:ONLY_INCLUDE_IN(flask) this.snapExecutionService = new IframeExecutionService({ iframeUrl: new URL( - 'https://metamask.github.io/iframe-execution-environment/0.7.0', + 'https://metamask.github.io/iframe-execution-environment/0.10.0', ), messenger: this.controllerMessenger.getRestricted({ name: 'ExecutionService', @@ -683,13 +695,6 @@ export default class MetamaskController extends EventEmitter { ], }); - const SNAP_BLOCKLIST = [ - { - id: 'npm:@consensys/starknet-snap', - versionRange: '<0.1.11', - }, - ]; - this.snapController = new SnapController({ environmentEndowmentPermissions: Object.values(EndowmentPermissions), closeAllConnections: this.removeAllConnections.bind(this), @@ -699,27 +704,7 @@ export default class MetamaskController extends EventEmitter { return this.getAppKeyForSubject(`${appKeyType}:${subject}`); }, checkBlockList: async (snapsToCheck) => { - return Object.entries(snapsToCheck).reduce( - (acc, [snapId, snapVersion]) => { - const blockInfo = SNAP_BLOCKLIST.find( - (blocked) => - blocked.id === snapId && - satisfiesSemver(snapVersion, blocked.versionRange, { - includePrerelease: true, - }), - ); - - const cur = blockInfo - ? { - blocked: true, - reason: blockInfo.reason, - infoUrl: blockInfo.infoUrl, - } - : { blocked: false }; - return { ...acc, [snapId]: cur }; - }, - {}, - ); + return checkSnapsBlockList(snapsToCheck, SNAP_BLOCKLIST); }, state: initState.SnapController, messenger: snapControllerMessenger, @@ -762,6 +747,24 @@ export default class MetamaskController extends EventEmitter { }, }, }); + // --- Snaps Cronjob Controller configuration + const cronjobControllerMessenger = this.controllerMessenger.getRestricted({ + name: 'CronjobController', + allowedEvents: [ + 'SnapController:snapInstalled', + 'SnapController:snapUpdated', + 'SnapController:snapRemoved', + ], + allowedActions: [ + `${this.permissionController.name}:getPermissions`, + 'SnapController:handleRequest', + 'SnapController:getAll', + ], + }); + this.cronjobController = new CronjobController({ + state: initState.CronjobController, + messenger: cronjobControllerMessenger, + }); ///: END:ONLY_INCLUDE_IN this.detectTokensController = new DetectTokensController({ preferences: this.preferencesController, @@ -785,20 +788,6 @@ export default class MetamaskController extends EventEmitter { preferencesStore: this.preferencesController.store, }); - this.threeBoxController = new ThreeBoxController({ - preferencesController: this.preferencesController, - addressBookController: this.addressBookController, - keyringController: this.keyringController, - initState: initState.ThreeBoxController, - getKeyringControllerState: this.keyringController.memStore.getState.bind( - this.keyringController.memStore, - ), - version, - trackMetaMetricsEvent: this.metaMetricsController.trackEvent.bind( - this.metaMetricsController, - ), - }); - this.backupController = new BackupController({ preferencesController: this.preferencesController, addressBookController: this.addressBookController, @@ -901,12 +890,10 @@ export default class MetamaskController extends EventEmitter { const transactionDataTokenId = getTokenIdParam(transactionData) ?? getTokenValueParam(transactionData); - const { allCollectibles } = this.collectiblesController.state; + const { allNfts } = this.nftController.state; // check if its a known collectible - const knownCollectible = allCollectibles?.[userAddress]?.[ - chainId - ].find( + const knownCollectible = allNfts?.[userAddress]?.[chainId].find( ({ address, tokenId }) => isEqualCaseInsensitive(address, contractAddress) && tokenId === transactionDataTokenId, @@ -914,7 +901,7 @@ export default class MetamaskController extends EventEmitter { // if it is we check and update ownership status. if (knownCollectible) { - this.collectiblesController.checkAndUpdateSingleCollectibleOwnershipStatus( + this.nftController.checkAndUpdateSingleNftOwnershipStatus( knownCollectible, false, { userAddress, chainId }, @@ -922,7 +909,7 @@ export default class MetamaskController extends EventEmitter { } } - const metamaskState = await this.getState(); + const metamaskState = this.getState(); if (txReceipt && txReceipt.status === '0x0') { this.metaMetricsController.trackEvent( @@ -1018,7 +1005,9 @@ export default class MetamaskController extends EventEmitter { this.metaMetricsController, ), }, - undefined, + { + supportedChainIds: [CHAIN_IDS.MAINNET, CHAIN_IDS.GOERLI], + }, initState.SmartTransactionsController, ); @@ -1056,16 +1045,16 @@ export default class MetamaskController extends EventEmitter { PermissionController: this.permissionController, PermissionLogController: this.permissionLogController.store, SubjectMetadataController: this.subjectMetadataController, - ThreeBoxController: this.threeBoxController.store, BackupController: this.backupController, AnnouncementController: this.announcementController, GasFeeController: this.gasFeeController, TokenListController: this.tokenListController, TokensController: this.tokensController, SmartTransactionsController: this.smartTransactionsController, - CollectiblesController: this.collectiblesController, + NftController: this.nftController, ///: BEGIN:ONLY_INCLUDE_IN(flask) SnapController: this.snapController, + CronjobController: this.cronjobController, NotificationController: this.notificationController, ///: END:ONLY_INCLUDE_IN }); @@ -1095,7 +1084,6 @@ export default class MetamaskController extends EventEmitter { PermissionController: this.permissionController, PermissionLogController: this.permissionLogController.store, SubjectMetadataController: this.subjectMetadataController, - ThreeBoxController: this.threeBoxController.store, BackupController: this.backupController, SwapsController: this.swapsController.store, EnsController: this.ensController.store, @@ -1105,9 +1093,10 @@ export default class MetamaskController extends EventEmitter { TokenListController: this.tokenListController, TokensController: this.tokensController, SmartTransactionsController: this.smartTransactionsController, - CollectiblesController: this.collectiblesController, + NftController: this.nftController, ///: BEGIN:ONLY_INCLUDE_IN(flask) SnapController: this.snapController, + CronjobController: this.cronjobController, NotificationController: this.notificationController, ///: END:ONLY_INCLUDE_IN }, @@ -1156,10 +1145,6 @@ export default class MetamaskController extends EventEmitter { return { ...buildSnapEndowmentSpecifications(), ...buildSnapRestrictedMethodSpecifications({ - addSnap: this.controllerMessenger.call.bind( - this.controllerMessenger, - 'SnapController:add', - ), clearSnapState: this.controllerMessenger.call.bind( this.controllerMessenger, 'SnapController:clearSnapState', @@ -1511,10 +1496,9 @@ export default class MetamaskController extends EventEmitter { const { addressBookController, alertController, - approvalController, appStateController, - collectiblesController, - collectibleDetectionController, + nftController, + nftDetectionController, currencyRateController, detectTokensController, ensController, @@ -1528,7 +1512,6 @@ export default class MetamaskController extends EventEmitter { preferencesController, qrHardwareKeyring, swapsController, - threeBoxController, tokensController, smartTransactionsController, txController, @@ -1554,10 +1537,9 @@ export default class MetamaskController extends EventEmitter { setUseTokenDetection: preferencesController.setUseTokenDetection.bind( preferencesController, ), - setUseCollectibleDetection: - preferencesController.setUseCollectibleDetection.bind( - preferencesController, - ), + setUseNftDetection: preferencesController.setUseNftDetection.bind( + preferencesController, + ), setOpenSeaEnabled: preferencesController.setOpenSeaEnabled.bind( preferencesController, ), @@ -1660,45 +1642,36 @@ export default class MetamaskController extends EventEmitter { preferencesController, ), setTheme: preferencesController.setTheme.bind(preferencesController), - setCustomNetworkListEnabled: - preferencesController.setCustomNetworkListEnabled.bind( + setImprovedTokenAllowanceEnabled: + preferencesController.setImprovedTokenAllowanceEnabled.bind( + preferencesController, + ), + setTransactionSecurityCheckEnabled: + preferencesController.setTransactionSecurityCheckEnabled.bind( preferencesController, ), // AssetsContractController getTokenStandardAndDetails: this.getTokenStandardAndDetails.bind(this), - // CollectiblesController - addCollectible: collectiblesController.addCollectible.bind( - collectiblesController, - ), + // NftController + addNft: nftController.addNft.bind(nftController), - addCollectibleVerifyOwnership: - collectiblesController.addCollectibleVerifyOwnership.bind( - collectiblesController, - ), + addNftVerifyOwnership: + nftController.addNftVerifyOwnership.bind(nftController), - removeAndIgnoreCollectible: - collectiblesController.removeAndIgnoreCollectible.bind( - collectiblesController, - ), + removeAndIgnoreNft: nftController.removeAndIgnoreNft.bind(nftController), - removeCollectible: collectiblesController.removeCollectible.bind( - collectiblesController, - ), + removeNft: nftController.removeNft.bind(nftController), - checkAndUpdateAllCollectiblesOwnershipStatus: - collectiblesController.checkAndUpdateAllCollectiblesOwnershipStatus.bind( - collectiblesController, - ), + checkAndUpdateAllNftsOwnershipStatus: + nftController.checkAndUpdateAllNftsOwnershipStatus.bind(nftController), - checkAndUpdateSingleCollectibleOwnershipStatus: - collectiblesController.checkAndUpdateSingleCollectibleOwnershipStatus.bind( - collectiblesController, + checkAndUpdateSingleNftOwnershipStatus: + nftController.checkAndUpdateSingleNftOwnershipStatus.bind( + nftController, ), - isCollectibleOwner: collectiblesController.isCollectibleOwner.bind( - collectiblesController, - ), + isNftOwner: nftController.isNftOwner.bind(nftController), // AddressController setAddressBook: addressBookController.set.bind(addressBookController), @@ -1729,6 +1702,8 @@ export default class MetamaskController extends EventEmitter { ), setShowPortfolioTooltip: appStateController.setShowPortfolioTooltip.bind(appStateController), + setShowBetaHeader: + appStateController.setShowBetaHeader.bind(appStateController), setCollectiblesDetectionNoticeDismissed: appStateController.setCollectiblesDetectionNoticeDismissed.bind( appStateController, @@ -1821,32 +1796,10 @@ export default class MetamaskController extends EventEmitter { setWeb3ShimUsageAlertDismissed: alertController.setWeb3ShimUsageAlertDismissed.bind(alertController), - // 3Box - setThreeBoxSyncingPermission: - threeBoxController.setThreeBoxSyncingPermission.bind( - threeBoxController, - ), - restoreFromThreeBox: - threeBoxController.restoreFromThreeBox.bind(threeBoxController), - setShowRestorePromptToFalse: - threeBoxController.setShowRestorePromptToFalse.bind(threeBoxController), - getThreeBoxLastUpdated: - threeBoxController.getLastUpdated.bind(threeBoxController), - turnThreeBoxSyncingOn: - threeBoxController.turnThreeBoxSyncingOn.bind(threeBoxController), - initializeThreeBox: this.initializeThreeBox.bind(this), - // permissions - removePermissionsFor: - permissionController.revokePermissions.bind(permissionController), - approvePermissionsRequest: - permissionController.acceptPermissionsRequest.bind( - permissionController, - ), - rejectPermissionsRequest: - permissionController.rejectPermissionsRequest.bind( - permissionController, - ), + removePermissionsFor: this.removePermissionsFor, + approvePermissionsRequest: this.acceptPermissionsRequest, + rejectPermissionsRequest: this.rejectPermissionsRequest, ...getPermissionBackgroundApiMethods(permissionController), ///: BEGIN:ONLY_INCLUDE_IN(flask) @@ -1964,14 +1917,8 @@ export default class MetamaskController extends EventEmitter { ), // approval controller - resolvePendingApproval: - approvalController.accept.bind(approvalController), - rejectPendingApproval: async (id, error) => { - approvalController.reject( - id, - new EthereumRpcError(error.code, error.message, error.data), - ); - }, + resolvePendingApproval: this.resolvePendingApproval, + rejectPendingApproval: this.rejectPendingApproval, // Notifications updateViewedNotifications: announcementController.updateViewed.bind( @@ -2006,10 +1953,8 @@ export default class MetamaskController extends EventEmitter { ), // DetectCollectibleController - detectCollectibles: process.env.COLLECTIBLES_V1 - ? collectibleDetectionController.detectCollectibles.bind( - collectibleDetectionController, - ) + detectNfts: process.env.COLLECTIBLES_V1 + ? nftDetectionController.detectNfts.bind(nftDetectionController) : null, /** Token Detection V2 */ @@ -2100,10 +2045,10 @@ export default class MetamaskController extends EventEmitter { } } - async addCustomNetwork(customRpc) { + async addCustomNetwork(customRpc, actionId) { const { chainId, chainName, rpcUrl, ticker, blockExplorerUrl } = customRpc; - await this.preferencesController.addToFrequentRpcList( + this.preferencesController.addToFrequentRpcList( rpcUrl, chainId, ticker, @@ -2136,6 +2081,7 @@ export default class MetamaskController extends EventEmitter { sensitiveProperties: { rpc_url: rpcUrlOrigin, }, + actionId, }); } @@ -2161,6 +2107,11 @@ export default class MetamaskController extends EventEmitter { // clear permissions this.permissionController.clearState(); + ///: BEGIN:ONLY_INCLUDE_IN(flask) + // Clear snap state + this.snapController.clearState(); + ///: END:ONLY_INCLUDE_IN + // clear accounts in accountTracker this.accountTracker.clearAccounts(); @@ -2183,8 +2134,9 @@ export default class MetamaskController extends EventEmitter { ethQuery, ); - const primaryKeyring = - keyringController.getKeyringsByType('HD Key Tree')[0]; + const [primaryKeyring] = keyringController.getKeyringsByType( + KEYRING_TYPES.HD_KEY_TREE, + ); if (!primaryKeyring) { throw new Error('MetamaskController - No HD Key Tree found'); } @@ -2309,10 +2261,12 @@ export default class MetamaskController extends EventEmitter { }); // Accounts - const hdKeyring = - this.keyringController.getKeyringsByType('HD Key Tree')[0]; - const simpleKeyPairKeyrings = - this.keyringController.getKeyringsByType('Simple Key Pair'); + const [hdKeyring] = this.keyringController.getKeyringsByType( + KEYRING_TYPES.HD_KEY_TREE, + ); + const simpleKeyPairKeyrings = this.keyringController.getKeyringsByType( + KEYRING_TYPES.IMPORTED, + ); const hdAccounts = await hdKeyring.getAccounts(); const simpleKeyPairKeyringAccounts = await Promise.all( simpleKeyPairKeyrings.map((keyring) => keyring.getAccounts()), @@ -2368,20 +2322,6 @@ export default class MetamaskController extends EventEmitter { log.error('Error while unlocking extension.', error); } - try { - const threeBoxSyncingAllowed = - this.threeBoxController.getThreeBoxSyncingState(); - if (threeBoxSyncingAllowed && !this.threeBoxController.box) { - // 'await' intentionally omitted to avoid waiting for initialization - this.threeBoxController.init(); - this.threeBoxController.turnThreeBoxSyncingOn(); - } else if (threeBoxSyncingAllowed && this.threeBoxController.box) { - this.threeBoxController.turnThreeBoxSyncingOn(); - } - } catch (error) { - log.error('Error while unlocking extension.', error); - } - // This must be set as soon as possible to communicate to the // keyring's iframe and have the setting initialized properly // Optimistically called to not block MetaMask login due to @@ -2407,7 +2347,6 @@ export default class MetamaskController extends EventEmitter { * @type Identity * @property {string} name - The account nickname. * @property {string} address - The account's ethereum address, in lower case. - * @property {boolean} mayBeFauceting - Whether this account is currently * receiving funds from our automatic Ropsten faucet. */ @@ -2416,7 +2355,7 @@ export default class MetamaskController extends EventEmitter { */ selectFirstIdentity() { const { identities } = this.preferencesController.store.getState(); - const address = Object.keys(identities)[0]; + const [address] = Object.keys(identities); this.preferencesController.setSelectedAddress(address); } @@ -2424,7 +2363,9 @@ export default class MetamaskController extends EventEmitter { * Gets the mnemonic of the user's primary keyring. */ getPrimaryKeyringMnemonic() { - const keyring = this.keyringController.getKeyringsByType('HD Key Tree')[0]; + const [keyring] = this.keyringController.getKeyringsByType( + KEYRING_TYPES.HD_KEY_TREE, + ); if (!keyring.mnemonic) { throw new Error('Primary keyring mnemonic unavailable.'); } @@ -2455,9 +2396,7 @@ export default class MetamaskController extends EventEmitter { 'MetamaskController:getKeyringForDevice - Unknown device', ); } - let keyring = await this.keyringController.getKeyringsByType( - keyringName, - )[0]; + let [keyring] = await this.keyringController.getKeyringsByType(keyringName); if (!keyring) { keyring = await this.keyringController.addNewKeyring(keyringName); } @@ -2657,8 +2596,9 @@ export default class MetamaskController extends EventEmitter { * @returns {} keyState */ async addNewAccount(accountCount) { - const primaryKeyring = - this.keyringController.getKeyringsByType('HD Key Tree')[0]; + const [primaryKeyring] = this.keyringController.getKeyringsByType( + KEYRING_TYPES.HD_KEY_TREE, + ); if (!primaryKeyring) { throw new Error('MetamaskController - No HD Key Tree found'); } @@ -2701,8 +2641,9 @@ export default class MetamaskController extends EventEmitter { * encoded as an array of UTF-8 bytes. */ async verifySeedPhrase() { - const primaryKeyring = - this.keyringController.getKeyringsByType('HD Key Tree')[0]; + const [primaryKeyring] = this.keyringController.getKeyringsByType( + KEYRING_TYPES.HD_KEY_TREE, + ); if (!primaryKeyring) { throw new Error('MetamaskController - No HD Key Tree found'); } @@ -2823,15 +2764,15 @@ export default class MetamaskController extends EventEmitter { async importAccountWithStrategy(strategy, args) { const privateKey = await accountImporter.importAccount(strategy, args); const keyring = await this.keyringController.addNewKeyring( - 'Simple Key Pair', + KEYRING_TYPES.IMPORTED, [privateKey], ); - const accounts = await keyring.getAccounts(); + const [firstAccount] = await keyring.getAccounts(); // update accounts in preferences controller const allAccounts = await this.keyringController.getAccounts(); this.preferencesController.setAddresses(allAccounts); // set new account as selected - await this.preferencesController.setSelectedAddress(accounts[0]); + this.preferencesController.setSelectedAddress(firstAccount); } // --------------------------------------------------------------------------- @@ -2897,7 +2838,7 @@ export default class MetamaskController extends EventEmitter { if (requestedAccount) { account = requestedAccount; } else { - account = (await this.keyringController.getAccounts())[0]; + [account] = await this.keyringController.getAccounts(); } return this.keyringController.exportAppKeyForAddress(account, subject); @@ -3293,7 +3234,7 @@ export default class MetamaskController extends EventEmitter { customGasSettings, options, ); - const state = await this.getState(); + const state = this.getState(); return state; } @@ -3316,7 +3257,7 @@ export default class MetamaskController extends EventEmitter { customGasSettings, options, ); - const state = await this.getState(); + const state = this.getState(); return state; } @@ -3397,6 +3338,10 @@ export default class MetamaskController extends EventEmitter { if (sender.url) { const { hostname } = new URL(sender.url); + const phishingListsAreOutOfDate = this.phishingController.isOutOfDate(); + if (phishingListsAreOutOfDate) { + this.phishingController.updatePhishingLists(); + } // Check if new connection is blocked if phishing detection is on const phishingTestResponse = this.phishingController.test(hostname); if (usePhishDetect && phishingTestResponse?.result) { @@ -3506,7 +3451,15 @@ export default class MetamaskController extends EventEmitter { this.emit('controllerConnectionChanged', this.activeControllerConnections); // set up postStream transport - outStream.on('data', createMetaRPCHandler(api, outStream)); + outStream.on( + 'data', + createMetaRPCHandler( + api, + outStream, + this.store, + this.localStoreApiWrapper, + ), + ); const handleUpdate = (update) => { if (outStream._writableState.ended) { return; @@ -3770,7 +3723,7 @@ export default class MetamaskController extends EventEmitter { ), getSnaps: this.controllerMessenger.call.bind( this.controllerMessenger, - 'SnapController:getSnaps', + 'SnapController:getPermitted', origin, ), requestPermissions: async (requestedPermissions) => { @@ -4248,10 +4201,6 @@ export default class MetamaskController extends EventEmitter { return null; } - async initializeThreeBox() { - await this.threeBoxController.init(); - } - /** * Sets the Ledger Live preference to use for Ledger hardware wallet support * @@ -4365,4 +4314,57 @@ export default class MetamaskController extends EventEmitter { return this.keyringController.setLocked(); } + + removePermissionsFor = (subjects) => { + try { + this.permissionController.revokePermissions(subjects); + } catch (exp) { + if (!(exp instanceof PermissionsRequestNotFoundError)) { + throw exp; + } + } + }; + + rejectPermissionsRequest = (requestId) => { + try { + this.permissionController.rejectPermissionsRequest(requestId); + } catch (exp) { + if (!(exp instanceof PermissionsRequestNotFoundError)) { + throw exp; + } + } + }; + + acceptPermissionsRequest = (request) => { + try { + this.permissionController.acceptPermissionsRequest(request); + } catch (exp) { + if (!(exp instanceof PermissionsRequestNotFoundError)) { + throw exp; + } + } + }; + + resolvePendingApproval = (id, value) => { + try { + this.approvalController.accept(id, value); + } catch (exp) { + if (!(exp instanceof ApprovalRequestNotFoundError)) { + throw exp; + } + } + }; + + rejectPendingApproval = (id, error) => { + try { + this.approvalController.reject( + id, + new EthereumRpcError(error.code, error.message, error.data), + ); + } catch (exp) { + if (!(exp instanceof ApprovalRequestNotFoundError)) { + throw exp; + } + } + }; } diff --git a/app/scripts/metamask-controller.test.js b/app/scripts/metamask-controller.test.js index 51bfdc77cea6..5fc7232ce4e9 100644 --- a/app/scripts/metamask-controller.test.js +++ b/app/scripts/metamask-controller.test.js @@ -10,10 +10,8 @@ import browser from 'webextension-polyfill'; import { TRANSACTION_STATUSES } from '../../shared/constants/transaction'; import createTxMeta from '../../test/lib/createTxMeta'; import { NETWORK_TYPES } from '../../shared/constants/network'; -import { - KEYRING_TYPES, - DEVICE_NAMES, -} from '../../shared/constants/hardware-wallets'; +import { KEYRING_TYPES } from '../../shared/constants/keyrings'; +import { DEVICE_NAMES } from '../../shared/constants/hardware-wallets'; import { addHexPrefix } from './lib/util'; const Ganache = require('../../test/e2e/ganache'); @@ -49,36 +47,6 @@ const firstTimeState = { const ganacheServer = new Ganache(); -const threeBoxSpies = { - _registerUpdates: sinon.spy(), - init: sinon.stub(), - getLastUpdated: sinon.stub(), - getThreeBoxSyncingState: sinon.stub().returns(true), - restoreFromThreeBox: sinon.stub(), - setShowRestorePromptToFalse: sinon.stub(), - setThreeBoxSyncingPermission: sinon.stub(), - turnThreeBoxSyncingOn: sinon.stub(), -}; - -class ThreeBoxControllerMock { - constructor() { - this._registerUpdates = threeBoxSpies._registerUpdates; - this.init = threeBoxSpies.init; - this.getLastUpdated = threeBoxSpies.getLastUpdated; - this.getThreeBoxSyncingState = threeBoxSpies.getThreeBoxSyncingState; - this.restoreFromThreeBox = threeBoxSpies.restoreFromThreeBox; - this.setShowRestorePromptToFalse = - threeBoxSpies.setShowRestorePromptToFalse; - this.setThreeBoxSyncingPermission = - threeBoxSpies.setThreeBoxSyncingPermission; - this.store = { - subscribe: () => undefined, - getState: () => ({}), - }; - this.turnThreeBoxSyncingOn = threeBoxSpies.turnThreeBoxSyncingOn; - } -} - const browserPolyfillMock = { runtime: { id: 'fake-extension-id', @@ -116,11 +84,10 @@ const createLoggerMiddlewareMock = () => (req, res, next) => { }; const MetaMaskController = proxyquire('./metamask-controller', { - './controllers/threebox': { default: ThreeBoxControllerMock }, './lib/createLoggerMiddleware': { default: createLoggerMiddlewareMock }, }).default; -const currentNetworkId = '42'; +const currentNetworkId = '5'; const DEFAULT_LABEL = 'Account 1'; const TEST_SEED = 'debris dizzy just program just float decrease vacant alarm reduce speak stadium'; @@ -223,7 +190,7 @@ describe('MetaMaskController', function () { it('adds private key to keyrings in KeyringController', async function () { const simpleKeyrings = metamaskController.keyringController.getKeyringsByType( - 'Simple Key Pair', + KEYRING_TYPES.IMPORTED, ); const privKeyBuffer = simpleKeyrings[0].wallets[0].privateKey; const pubKeyBuffer = simpleKeyrings[0].wallets[0].publicKey; @@ -245,15 +212,10 @@ describe('MetaMaskController', function () { }); describe('submitPassword', function () { - const password = 'password'; - - beforeEach(async function () { + it('removes any identities that do not correspond to known accounts.', async function () { + const password = 'password'; await metamaskController.createNewVaultAndKeychain(password); - threeBoxSpies.init.reset(); - threeBoxSpies.turnThreeBoxSyncingOn.reset(); - }); - it('removes any identities that do not correspond to known accounts.', async function () { const fakeAddress = '0xbad0'; metamaskController.preferencesController.addAddresses([fakeAddress]); await metamaskController.submitPassword(password); @@ -278,23 +240,6 @@ describe('MetaMaskController', function () { ); }); }); - - it('gets the address from threebox and creates a new 3box instance', async function () { - await metamaskController.submitPassword(password); - assert(threeBoxSpies.init.calledOnce); - assert(threeBoxSpies.turnThreeBoxSyncingOn.calledOnce); - }); - - it('succeeds even if blockTracker or threeBoxController throw', async function () { - const throwErr = sinon.fake.throws('foo'); - metamaskController.blockTracker.checkForLatestBlock = throwErr; - metamaskController.threeBoxController.getThreeBoxSyncingState = throwErr; - await metamaskController.submitPassword(password); - assert.ok( - throwErr.calledTwice, - 'should have called checkForLatestBlock and getThreeBoxSyncingState', - ); - }); }); describe('#createNewVaultAndKeychain', function () { diff --git a/app/scripts/migrations/052.js b/app/scripts/migrations/052.js index e18040e4740f..4d8433e19628 100644 --- a/app/scripts/migrations/052.js +++ b/app/scripts/migrations/052.js @@ -43,21 +43,18 @@ function transformState(state = {}) { newAccountTokens[address][CHAIN_IDS.MAINNET] = accountTokens[address][NETWORK_TYPES.MAINNET]; break; - case NETWORK_TYPES.ROPSTEN: - newAccountTokens[address][CHAIN_IDS.ROPSTEN] = - accountTokens[address][NETWORK_TYPES.ROPSTEN]; + case 'ropsten': + newAccountTokens[address]['0x3'] = accountTokens[address].ropsten; break; - case NETWORK_TYPES.RINKEBY: - newAccountTokens[address][CHAIN_IDS.RINKEBY] = - accountTokens[address][NETWORK_TYPES.RINKEBY]; + case 'rinkeby': + newAccountTokens[address]['0x4'] = accountTokens[address].rinkeby; break; case NETWORK_TYPES.GOERLI: newAccountTokens[address][CHAIN_IDS.GOERLI] = accountTokens[address][NETWORK_TYPES.GOERLI]; break; - case NETWORK_TYPES.KOVAN: - newAccountTokens[address][CHAIN_IDS.KOVAN] = - accountTokens[address][NETWORK_TYPES.KOVAN]; + case 'kovan': + newAccountTokens[address]['0x2a'] = accountTokens[address].kovan; break; default: break; @@ -82,21 +79,21 @@ function transformState(state = {}) { newAccountHiddenTokens[address][CHAIN_IDS.MAINNET] = accountHiddenTokens[address][NETWORK_TYPES.MAINNET]; break; - case NETWORK_TYPES.ROPSTEN: - newAccountHiddenTokens[address][CHAIN_IDS.ROPSTEN] = - accountHiddenTokens[address][NETWORK_TYPES.ROPSTEN]; + case 'ropsten': + newAccountHiddenTokens[address]['0x3'] = + accountHiddenTokens[address].ropsten; break; - case NETWORK_TYPES.RINKEBY: - newAccountHiddenTokens[address][CHAIN_IDS.RINKEBY] = - accountHiddenTokens[address][NETWORK_TYPES.RINKEBY]; + case 'rinkeby': + newAccountHiddenTokens[address]['0x4'] = + accountHiddenTokens[address].rinkeby; break; case NETWORK_TYPES.GOERLI: newAccountHiddenTokens[address][CHAIN_IDS.GOERLI] = accountHiddenTokens[address][NETWORK_TYPES.GOERLI]; break; - case NETWORK_TYPES.KOVAN: - newAccountHiddenTokens[address][CHAIN_IDS.KOVAN] = - accountHiddenTokens[address][NETWORK_TYPES.KOVAN]; + case 'kovan': + newAccountHiddenTokens[address]['0x2a'] = + accountHiddenTokens[address].kovan; break; default: break; diff --git a/app/scripts/migrations/052.test.js b/app/scripts/migrations/052.test.js index 37c3250663f4..9a7ab8422e23 100644 --- a/app/scripts/migrations/052.test.js +++ b/app/scripts/migrations/052.test.js @@ -73,25 +73,25 @@ describe('migration #52', () => { }); }); - it(`should move ${NETWORK_TYPES.RINKEBY} tokens and hidden tokens to be keyed by ${CHAIN_IDS.RINKEBY} for each address`, async () => { + it(`should move rinkeby tokens and hidden tokens to be keyed by '0x4' for each address`, async () => { const oldStorage = { meta: {}, data: { PreferencesController: { accountHiddenTokens: { '0x1111': { - [NETWORK_TYPES.RINKEBY]: [TOKEN1], + rinkeby: [TOKEN1], }, '0x1112': { - [NETWORK_TYPES.RINKEBY]: [TOKEN3], + rinkeby: [TOKEN3], }, }, accountTokens: { '0x1111': { - [NETWORK_TYPES.RINKEBY]: [TOKEN1, TOKEN2], + rinkeby: [TOKEN1, TOKEN2], }, '0x1112': { - [NETWORK_TYPES.RINKEBY]: [TOKEN1, TOKEN3], + rinkeby: [TOKEN1, TOKEN3], }, }, bar: 'baz', @@ -105,18 +105,18 @@ describe('migration #52', () => { PreferencesController: { accountHiddenTokens: { '0x1111': { - [CHAIN_IDS.RINKEBY]: [TOKEN1], + '0x4': [TOKEN1], }, '0x1112': { - [CHAIN_IDS.RINKEBY]: [TOKEN3], + '0x4': [TOKEN3], }, }, accountTokens: { '0x1111': { - [CHAIN_IDS.RINKEBY]: [TOKEN1, TOKEN2], + '0x4': [TOKEN1, TOKEN2], }, '0x1112': { - [CHAIN_IDS.RINKEBY]: [TOKEN1, TOKEN3], + '0x4': [TOKEN1, TOKEN3], }, }, bar: 'baz', @@ -125,25 +125,25 @@ describe('migration #52', () => { }); }); - it(`should move ${NETWORK_TYPES.KOVAN} tokens and hidden tokens to be keyed by ${CHAIN_IDS.KOVAN} for each address`, async () => { + it(`should move kovan tokens and hidden tokens to be keyed by 0x2a for each address`, async () => { const oldStorage = { meta: {}, data: { PreferencesController: { accountHiddenTokens: { '0x1111': { - [NETWORK_TYPES.KOVAN]: [TOKEN1], + kovan: [TOKEN1], }, '0x1112': { - [NETWORK_TYPES.KOVAN]: [TOKEN3], + kovan: [TOKEN3], }, }, accountTokens: { '0x1111': { - [NETWORK_TYPES.KOVAN]: [TOKEN1, TOKEN2], + kovan: [TOKEN1, TOKEN2], }, '0x1112': { - [NETWORK_TYPES.KOVAN]: [TOKEN1, TOKEN3], + kovan: [TOKEN1, TOKEN3], }, }, bar: 'baz', @@ -157,18 +157,18 @@ describe('migration #52', () => { PreferencesController: { accountHiddenTokens: { '0x1111': { - [CHAIN_IDS.KOVAN]: [TOKEN1], + '0x2a': [TOKEN1], }, '0x1112': { - [CHAIN_IDS.KOVAN]: [TOKEN3], + '0x2a': [TOKEN3], }, }, accountTokens: { '0x1111': { - [CHAIN_IDS.KOVAN]: [TOKEN1, TOKEN2], + '0x2a': [TOKEN1, TOKEN2], }, '0x1112': { - [CHAIN_IDS.KOVAN]: [TOKEN1, TOKEN3], + '0x2a': [TOKEN1, TOKEN3], }, }, bar: 'baz', @@ -229,25 +229,25 @@ describe('migration #52', () => { }); }); - it(`should move ${NETWORK_TYPES.ROPSTEN} tokens and hidden tokens to be keyed by ${CHAIN_IDS.ROPSTEN} for each address`, async () => { + it(`should move ropsten tokens and hidden tokens to be keyed by 0x3 for each address`, async () => { const oldStorage = { meta: {}, data: { PreferencesController: { accountHiddenTokens: { '0x1111': { - [NETWORK_TYPES.ROPSTEN]: [TOKEN1], + ropsten: [TOKEN1], }, '0x1112': { - [NETWORK_TYPES.ROPSTEN]: [TOKEN3], + ropsten: [TOKEN3], }, }, accountTokens: { '0x1111': { - [NETWORK_TYPES.ROPSTEN]: [TOKEN1, TOKEN2], + ropsten: [TOKEN1, TOKEN2], }, '0x1112': { - [NETWORK_TYPES.ROPSTEN]: [TOKEN1, TOKEN3], + ropsten: [TOKEN1, TOKEN3], }, }, bar: 'baz', @@ -261,18 +261,18 @@ describe('migration #52', () => { PreferencesController: { accountHiddenTokens: { '0x1111': { - [CHAIN_IDS.ROPSTEN]: [TOKEN1], + '0x3': [TOKEN1], }, '0x1112': { - [CHAIN_IDS.ROPSTEN]: [TOKEN3], + '0x3': [TOKEN3], }, }, accountTokens: { '0x1111': { - [CHAIN_IDS.ROPSTEN]: [TOKEN1, TOKEN2], + '0x3': [TOKEN1, TOKEN2], }, '0x1112': { - [CHAIN_IDS.ROPSTEN]: [TOKEN1, TOKEN3], + '0x3': [TOKEN1, TOKEN3], }, }, bar: 'baz', diff --git a/app/scripts/migrations/054.test.js b/app/scripts/migrations/054.test.js index 8ac809b3fb2b..98ca1b9bef18 100644 --- a/app/scripts/migrations/054.test.js +++ b/app/scripts/migrations/054.test.js @@ -171,7 +171,7 @@ describe('migration #54', () => { ], }, '0x1112': { - [CHAIN_IDS.ROPSTEN]: [ + '0x3': [ { address: '0x06012c8cf97bead5deae237070f9587f8e7a266d', decimals: '0', @@ -229,7 +229,7 @@ describe('migration #54', () => { ], }, '0x1112': { - [CHAIN_IDS.ROPSTEN]: [ + '0x3': [ { address: '0x06012c8cf97bead5deae237070f9587f8e7a266d', decimals: 0, @@ -289,7 +289,7 @@ describe('migration #54', () => { ], }, '0x1112': { - [CHAIN_IDS.ROPSTEN]: [ + '0x3': [ { address: '0x06012c8cf97bead5deae237070f9587f8e7a266d', decimals: 0, @@ -347,7 +347,7 @@ describe('migration #54', () => { ], }, '0x1112': { - [CHAIN_IDS.ROPSTEN]: [ + '0x3': [ { address: '0x06012c8cf97bead5deae237070f9587f8e7a266d', decimals: 0, @@ -407,7 +407,7 @@ describe('migration #54', () => { ], }, '0x1112': { - [CHAIN_IDS.ROPSTEN]: [ + '0x3': [ { address: '0x06012c8cf97bead5deae237070f9587f8e7a266d', decimals: '0', @@ -486,7 +486,7 @@ describe('migration #54', () => { ], }, '0x1112': { - [CHAIN_IDS.ROPSTEN]: [ + '0x3': [ { address: '0x06012c8cf97bead5deae237070f9587f8e7a266d', decimals: 0, @@ -567,7 +567,7 @@ describe('migration #54', () => { ], }, '0x1112': { - [CHAIN_IDS.ROPSTEN]: [ + '0x3': [ { address: '0x06012c8cf97bead5deae237070f9587f8e7a266d', decimals: '0', @@ -641,7 +641,7 @@ describe('migration #54', () => { ], }, '0x1112': { - [CHAIN_IDS.ROPSTEN]: [ + '0x3': [ { address: '0x06012c8cf97bead5deae237070f9587f8e7a266d', decimals: 0, diff --git a/app/scripts/migrations/055.js b/app/scripts/migrations/055.js index ca79f447e4fe..108c864bbe91 100644 --- a/app/scripts/migrations/055.js +++ b/app/scripts/migrations/055.js @@ -19,6 +19,22 @@ export default { const UNKNOWN_CHAIN_ID_KEY = 'UNKNOWN'; +BUILT_IN_NETWORKS.rinkeby = { + networkId: '4', + chainId: '0x4', + ticker: 'ETH', +}; +BUILT_IN_NETWORKS.ropsten = { + networkId: '3', + chainId: '0x3', + ticker: 'ETH', +}; +BUILT_IN_NETWORKS.kovan = { + networkId: '42', + chainId: '0x2a', + ticker: 'ETH', +}; + function transformState(state) { if ( state?.IncomingTransactionsController?.incomingTxLastFetchedBlocksByNetwork diff --git a/app/scripts/migrations/055.test.js b/app/scripts/migrations/055.test.js index faff99bdd7f4..3b4c6e998af9 100644 --- a/app/scripts/migrations/055.test.js +++ b/app/scripts/migrations/055.test.js @@ -31,10 +31,10 @@ describe('migration #55', () => { }, incomingTxLastFetchedBlocksByNetwork: { [NETWORK_TYPES.MAINNET]: 1, - [NETWORK_TYPES.ROPSTEN]: 2, - [NETWORK_TYPES.RINKEBY]: 3, + ropsten: 2, + rinkeby: 3, [NETWORK_TYPES.GOERLI]: 4, - [NETWORK_TYPES.KOVAN]: 5, + kovan: 5, }, }, foo: 'bar', @@ -48,10 +48,10 @@ describe('migration #55', () => { oldStorage.data.IncomingTransactionsController.incomingTransactions, incomingTxLastFetchedBlockByChainId: { [CHAIN_IDS.MAINNET]: 1, - [CHAIN_IDS.ROPSTEN]: 2, - [CHAIN_IDS.RINKEBY]: 3, + '0x3': 2, + '0x4': 3, [CHAIN_IDS.GOERLI]: 4, - [CHAIN_IDS.KOVAN]: 5, + '0x2a': 5, }, }, foo: 'bar', diff --git a/app/scripts/migrations/059.test.js b/app/scripts/migrations/059.test.js index 271a37b9eba4..34065213c4d4 100644 --- a/app/scripts/migrations/059.test.js +++ b/app/scripts/migrations/059.test.js @@ -28,7 +28,7 @@ const ERRONEOUS_TRANSACTION_STATE = { 2: { type: SENT_ETHER, id: 2, - chainId: CHAIN_IDS.KOVAN, + chainId: '0x2a', txParams: { nonce: '0x2', }, @@ -36,7 +36,7 @@ const ERRONEOUS_TRANSACTION_STATE = { 3: { type: SENT_ETHER, id: 3, - chainId: CHAIN_IDS.RINKEBY, + chainId: '0x4', txParams: { nonce: '0x3', }, @@ -44,7 +44,7 @@ const ERRONEOUS_TRANSACTION_STATE = { 4: { type: SENT_ETHER, id: 4, - chainId: CHAIN_IDS.RINKEBY, + chainId: '0x4', txParams: { nonce: '0x4', }, @@ -60,7 +60,7 @@ const ERRONEOUS_TRANSACTION_STATE = { 6: { type: SENT_ETHER, id: 6, - chainId: CHAIN_IDS.KOVAN, + chainId: '0x2a', txParams: { nonce: '0x6', }, @@ -68,7 +68,7 @@ const ERRONEOUS_TRANSACTION_STATE = { 7: { type: SENT_ETHER, id: 7, - chainId: CHAIN_IDS.RINKEBY, + chainId: '0x4', txParams: { nonce: '0x7', }, @@ -76,7 +76,7 @@ const ERRONEOUS_TRANSACTION_STATE = { 8: { type: SENT_ETHER, id: 8, - chainId: CHAIN_IDS.RINKEBY, + chainId: '0x4', txParams: { nonce: '0x8', }, @@ -84,7 +84,7 @@ const ERRONEOUS_TRANSACTION_STATE = { 9: { type: SENT_ETHER, id: 9, - chainId: CHAIN_IDS.RINKEBY, + chainId: '0x4', status: TRANSACTION_STATUSES.UNAPPROVED, }, }; diff --git a/app/scripts/migrations/074.js b/app/scripts/migrations/074.js new file mode 100644 index 000000000000..0f687d7a0c60 --- /dev/null +++ b/app/scripts/migrations/074.js @@ -0,0 +1,132 @@ +import { cloneDeep, uniq } from 'lodash'; +import BigNumber from 'bignumber.js'; +import { getRpcUrl } from '../../../shared/constants/network'; + +const version = 74; + +const hexNumberIsGreaterThanZero = (hexNumber) => + new BigNumber(hexNumber || '0x0', 16).gt(0); + +const DEPRECATED_TEST_NET_CHAINIDS = ['0x3', '0x2a', '0x4']; +const DEPRECATED_TEST_NET_DETAILS = { + '0x3': { + rpcUrl: getRpcUrl({ network: 'ropsten' }), + nickname: 'Ropsten', + ticker: 'RopstenETH', + }, + '0x2a': { + rpcUrl: getRpcUrl({ network: 'kovan' }), + nickname: 'Kovan', + ticker: 'KovanETH', + }, + '0x4': { + rpcUrl: getRpcUrl({ network: 'rinkeby' }), + nickname: 'Rinkeby', + ticker: 'RinkebyETH', + }, +}; + +/** + * Migrates the user default but deprecated testnet networks to custom networks, and + * if the current network is one such network, updates the network provider details so that it + * will work as a custom rpc + */ +export default { + version, + async migrate(originalVersionedData) { + const versionedData = cloneDeep(originalVersionedData); + versionedData.meta.version = version; + const state = versionedData.data; + const newState = transformState(state); + versionedData.data = newState; + return versionedData; + }, +}; + +function transformState(state) { + const PreferencesController = state?.PreferencesController || {}; + const preferences = PreferencesController.preferences || {}; + const NetworkController = state?.NetworkController || {}; + const provider = NetworkController?.provider || {}; + + const currentlyOnDeprecatedNetwork = DEPRECATED_TEST_NET_CHAINIDS.filter( + (chainId) => chainId === provider?.chainId, + ); + + // If the user does not want to see test networks, and if the the user is not on a deprecated test network, then + // no need to migrate the test network data to a custom network + if ( + !preferences.showTestNetworks && + currentlyOnDeprecatedNetwork.length === 0 + ) { + return state; + } + + const transactions = state?.TransactionController?.transactions || {}; + const cachedBalances = state.CachedBalancesController?.cachedBalances || {}; + + const deprecatedTestnetsOnWhichTheUserHasMadeATransaction = Object.values( + transactions, + ) + .filter(({ chainId }) => DEPRECATED_TEST_NET_CHAINIDS.includes(chainId)) + .map(({ chainId }) => chainId); + const deprecatedTestnetsOnWhichTheUserHasCachedBalance = + DEPRECATED_TEST_NET_CHAINIDS.filter((chainId) => { + const cachedBalancesForChain = Object.values( + cachedBalances[chainId] || {}, + ); + const userHasABalanceGreaterThanZeroOnThisChain = + cachedBalancesForChain.some(hexNumberIsGreaterThanZero); + return userHasABalanceGreaterThanZeroOnThisChain; + }); + const deprecatedTestnetsThatHaveBeenUsed = uniq([ + ...deprecatedTestnetsOnWhichTheUserHasCachedBalance, + ...deprecatedTestnetsOnWhichTheUserHasMadeATransaction, + ...currentlyOnDeprecatedNetwork, + ]); + + const newFrequentRpcListDetail = + PreferencesController.frequentRpcListDetail ?? []; + + deprecatedTestnetsThatHaveBeenUsed.forEach((chainId) => { + if ( + !newFrequentRpcListDetail.find( + (rpcDetails) => rpcDetails.chainId === chainId, + ) + ) { + newFrequentRpcListDetail.unshift({ + rpcUrl: DEPRECATED_TEST_NET_DETAILS[chainId].rpcUrl, + chainId, + ticker: DEPRECATED_TEST_NET_DETAILS[chainId].ticker, + nickname: DEPRECATED_TEST_NET_DETAILS[chainId].nickname, + rpcPrefs: {}, + }); + } + }); + + if (newFrequentRpcListDetail.length) { + PreferencesController.frequentRpcListDetail = newFrequentRpcListDetail; + } + + if (currentlyOnDeprecatedNetwork.length) { + const selectedNetworkChainId = currentlyOnDeprecatedNetwork[0]; + NetworkController.provider = { + ...NetworkController.provider, + type: 'rpc', + rpcUrl: DEPRECATED_TEST_NET_DETAILS[selectedNetworkChainId].rpcUrl, + chainId: selectedNetworkChainId, + nickname: DEPRECATED_TEST_NET_DETAILS[selectedNetworkChainId].nickname, + ticker: DEPRECATED_TEST_NET_DETAILS[selectedNetworkChainId].ticker, + }; + } + + return { + ...state, + PreferencesController: { + ...PreferencesController, + }, + NetworkController: { + ...NetworkController, + }, + }; +} diff --git a/app/scripts/migrations/074.test.js b/app/scripts/migrations/074.test.js new file mode 100644 index 000000000000..bdb03d3867f7 --- /dev/null +++ b/app/scripts/migrations/074.test.js @@ -0,0 +1,561 @@ +import migration74 from './074'; + +describe('migration #74', () => { + it('should update the version metadata', async () => { + const oldStorage = { + meta: { + version: 73, + }, + data: {}, + }; + + const newStorage = await migration74.migrate(oldStorage); + expect(newStorage.meta).toStrictEqual({ + version: 74, + }); + }); + + it('should add a deprecated testnet to custom networks if that network is currently selected and modify the provider', async () => { + const oldStorage = { + meta: { + version: 73, + }, + data: { + NetworkController: { + provider: { + chainId: '0x4', + type: 'rinkeby', + }, + }, + }, + }; + + const newStorage = await migration74.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 74, + }, + data: { + NetworkController: { + provider: { + chainId: '0x4', + type: 'rpc', + rpcUrl: `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + nickname: 'Rinkeby', + ticker: 'RinkebyETH', + }, + }, + PreferencesController: { + frequentRpcListDetail: [ + { + rpcUrl: `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + chainId: '0x4', + nickname: 'Rinkeby', + ticker: 'RinkebyETH', + rpcPrefs: {}, + }, + ], + }, + }, + }); + }); + + it('should not add a deprecated testnet to custom networks if no deprecated testnet is selected', async () => { + const oldStorage = { + meta: { + version: 73, + }, + data: { + NetworkController: { + provider: { + chainId: '0xabc', + }, + }, + PreferencesController: { + preferences: { + showTestNetworks: true, + }, + }, + }, + }; + + const newStorage = await migration74.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 74, + }, + data: { + NetworkController: { + provider: { + chainId: '0xabc', + }, + }, + PreferencesController: { + preferences: { + showTestNetworks: true, + }, + }, + }, + }); + }); + + it('should add a deprecated testnet to custom networks if a transaction has been sent from that network', async () => { + const oldStorage = { + meta: { + version: 73, + }, + data: { + NetworkController: { + provider: { + chainId: '0x1', + }, + }, + TransactionController: { + transactions: { + 1: { + chainId: '0x3', + }, + 2: { + chainId: '0x4', + }, + 3: { + chainId: '0xabc', + }, + }, + }, + PreferencesController: { + preferences: { + showTestNetworks: true, + }, + }, + }, + }; + + const newStorage = await migration74.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 74, + }, + data: { + NetworkController: { + provider: { + chainId: '0x1', + }, + }, + PreferencesController: { + frequentRpcListDetail: [ + { + rpcUrl: `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + chainId: '0x4', + nickname: 'Rinkeby', + ticker: 'RinkebyETH', + rpcPrefs: {}, + }, + { + rpcUrl: `https://ropsten.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + chainId: '0x3', + nickname: 'Ropsten', + ticker: 'RopstenETH', + rpcPrefs: {}, + }, + ], + preferences: { + showTestNetworks: true, + }, + }, + TransactionController: { + transactions: { + 1: { + chainId: '0x3', + }, + 2: { + chainId: '0x4', + }, + 3: { + chainId: '0xabc', + }, + }, + }, + }, + }); + }); + + it('should add a deprecated testnet to custom networks if there is balance on that network', async () => { + const oldStorage = { + meta: { + version: 73, + }, + data: { + NetworkController: { + provider: { + chainId: '0x1', + }, + }, + PreferencesController: { + preferences: { + showTestNetworks: true, + }, + }, + CachedBalancesController: { + cachedBalances: { + '0x2a': { + '0x123456789': '0x1', + }, + }, + }, + }, + }; + + const newStorage = await migration74.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 74, + }, + data: { + NetworkController: { + provider: { + chainId: '0x1', + }, + }, + PreferencesController: { + frequentRpcListDetail: [ + { + rpcUrl: `https://kovan.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + chainId: '0x2a', + nickname: 'Kovan', + ticker: 'KovanETH', + rpcPrefs: {}, + }, + ], + preferences: { + showTestNetworks: true, + }, + }, + CachedBalancesController: { + cachedBalances: { + '0x2a': { + '0x123456789': '0x1', + }, + }, + }, + }, + }); + }); + + it('should add all three deprecated testnets to custom networks if each has a different reason for being added', async () => { + const oldStorage = { + meta: { + version: 73, + }, + data: { + NetworkController: { + provider: { + chainId: '0x2a', + }, + }, + TransactionController: { + transactions: { + 1: { + chainId: '0x3', + }, + }, + }, + PreferencesController: { + preferences: { + showTestNetworks: true, + }, + }, + CachedBalancesController: { + cachedBalances: { + '0x4': { + '0x123456789': '0x1', + }, + }, + }, + }, + }; + + const newStorage = await migration74.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 74, + }, + data: { + NetworkController: { + provider: { + rpcUrl: `https://kovan.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + chainId: '0x2a', + nickname: 'Kovan', + ticker: 'KovanETH', + type: 'rpc', + }, + }, + PreferencesController: { + frequentRpcListDetail: [ + { + rpcUrl: `https://kovan.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + chainId: '0x2a', + nickname: 'Kovan', + ticker: 'KovanETH', + rpcPrefs: {}, + }, + { + rpcUrl: `https://ropsten.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + chainId: '0x3', + nickname: 'Ropsten', + ticker: 'RopstenETH', + rpcPrefs: {}, + }, + { + rpcUrl: `https://rinkeby.infura.io/v3/${process.env.INFURA_PROJECT_ID}`, + chainId: '0x4', + nickname: 'Rinkeby', + ticker: 'RinkebyETH', + rpcPrefs: {}, + }, + ], + preferences: { + showTestNetworks: true, + }, + }, + CachedBalancesController: { + cachedBalances: { + '0x4': { + '0x123456789': '0x1', + }, + }, + }, + TransactionController: { + transactions: { + 1: { + chainId: '0x3', + }, + }, + }, + }, + }); + }); + + it('should not add deprecated testnets to custom networks if none is selected and showTestNetworks is false', async () => { + const oldStorage = { + meta: { + version: 73, + }, + data: { + NetworkController: { + provider: { + chainId: '0xabc', + }, + }, + TransactionController: { + transactions: { + 1: { + chainId: '0x3', + }, + }, + }, + PreferencesController: { + preferences: { + showTestNetworks: false, + }, + }, + CachedBalancesController: { + cachedBalances: { + '0x4': { + '0x123456789': '0x1', + }, + }, + }, + }, + }; + + const newStorage = await migration74.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 74, + }, + data: { + NetworkController: { + provider: { + chainId: '0xabc', + }, + }, + PreferencesController: { + preferences: { + showTestNetworks: false, + }, + }, + CachedBalancesController: { + cachedBalances: { + '0x4': { + '0x123456789': '0x1', + }, + }, + }, + TransactionController: { + transactions: { + 1: { + chainId: '0x3', + }, + }, + }, + }, + }); + }); + + it('should not alter or remove existing custom networks when no deprecated testnets are being added', async () => { + const oldStorage = { + meta: { + version: 73, + }, + data: { + NetworkController: { + provider: { + chainId: '0xabc', + }, + }, + TransactionController: { + transactions: { + 1: { + chainId: '0x3', + }, + }, + }, + PreferencesController: { + frequentRpcListDetail: [ + { + rpcUrl: `https://example.com`, + chainId: '0xdef', + ticker: 'ETH', + nickname: 'Kovan', + rpcPrefs: {}, + }, + ], + preferences: { + showTestNetworks: false, + }, + }, + CachedBalancesController: { + cachedBalances: { + '0x4': { + '0x123456789': '0x1', + }, + }, + }, + }, + }; + + const newStorage = await migration74.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 74, + }, + data: { + NetworkController: { + provider: { + chainId: '0xabc', + }, + }, + PreferencesController: { + frequentRpcListDetail: [ + { + rpcUrl: `https://example.com`, + chainId: '0xdef', + ticker: 'ETH', + nickname: 'Kovan', + rpcPrefs: {}, + }, + ], + preferences: { + showTestNetworks: false, + }, + }, + CachedBalancesController: { + cachedBalances: { + '0x4': { + '0x123456789': '0x1', + }, + }, + }, + TransactionController: { + transactions: { + 1: { + chainId: '0x3', + }, + }, + }, + }, + }); + }); + + it('should not modify an existing custom network with the same chainId as a deprecated testnet', async () => { + const oldStorage = { + meta: { + version: 73, + }, + data: { + NetworkController: { + provider: { + chainId: '0x1', + }, + }, + TransactionController: { + transactions: { + 1: { + chainId: '0x3', + }, + }, + }, + PreferencesController: { + preferences: { + showTestNetworks: true, + }, + frequentRpcListDetail: [ + { + rpcUrl: `https://example.com`, + chainId: '0x3', + ticker: 'ETH', + nickname: 'Ropsten', + rpcPrefs: {}, + }, + ], + }, + }, + }; + + const newStorage = await migration74.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 74, + }, + data: { + NetworkController: { + provider: { + chainId: '0x1', + }, + }, + TransactionController: { + transactions: { + 1: { + chainId: '0x3', + }, + }, + }, + PreferencesController: { + preferences: { + showTestNetworks: true, + }, + frequentRpcListDetail: [ + { + rpcUrl: `https://example.com`, + chainId: '0x3', + ticker: 'ETH', + nickname: 'Ropsten', + rpcPrefs: {}, + }, + ], + }, + }, + }); + }); +}); diff --git a/app/scripts/migrations/075.js b/app/scripts/migrations/075.js new file mode 100644 index 000000000000..4ae6bb5851aa --- /dev/null +++ b/app/scripts/migrations/075.js @@ -0,0 +1,23 @@ +import { cloneDeep } from 'lodash'; + +const version = 75; + +/** + * Delete the ThreeBoxController. + */ +export default { + version, + async migrate(originalVersionedData) { + const versionedData = cloneDeep(originalVersionedData); + versionedData.meta.version = version; + const state = versionedData.data; + const newState = transformState(state); + versionedData.data = newState; + return versionedData; + }, +}; + +function transformState(state) { + delete state.ThreeBoxController; + return state; +} diff --git a/app/scripts/migrations/075.test.js b/app/scripts/migrations/075.test.js new file mode 100644 index 000000000000..fd270b8da6d0 --- /dev/null +++ b/app/scripts/migrations/075.test.js @@ -0,0 +1,63 @@ +import migration75 from './075'; + +describe('migration #75', () => { + it('should update the version metadata', async () => { + const oldStorage = { + meta: { + version: 74, + }, + data: {}, + }; + + const newStorage = await migration75.migrate(oldStorage); + expect(newStorage.meta).toStrictEqual({ + version: 75, + }); + }); + + it('should delete the ThreeBoxController', async () => { + const oldStorage = { + meta: { + version: 74, + }, + data: { + FooController: { a: 'b' }, + ThreeBoxController: { + stuff: 'stuff!', + moreStuff: { moreStuff: ['stuff', 'stuff', 'stuff'] }, + }, + }, + }; + + const newStorage = await migration75.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 75, + }, + data: { + FooController: { a: 'b' }, + }, + }); + }); + + it('should handle missing ThreeBoxController', async () => { + const oldStorage = { + meta: { + version: 74, + }, + data: { + FooController: { a: 'b' }, + }, + }; + + const newStorage = await migration75.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 75, + }, + data: { + FooController: { a: 'b' }, + }, + }); + }); +}); diff --git a/app/scripts/migrations/076.js b/app/scripts/migrations/076.js new file mode 100644 index 000000000000..98ca9e29f4cb --- /dev/null +++ b/app/scripts/migrations/076.js @@ -0,0 +1,46 @@ +import { cloneDeep } from 'lodash'; + +const version = 76; + +/** + * Update to `@metamask/controllers@33.0.0` (rename "Collectible" to "NFT"). + */ +export default { + version, + async migrate(originalVersionedData) { + const versionedData = cloneDeep(originalVersionedData); + versionedData.meta.version = version; + const state = versionedData.data; + const newState = transformState(state); + versionedData.data = newState; + return versionedData; + }, +}; + +function transformState(state) { + if (state.CollectiblesController) { + const { + allCollectibleContracts, + allCollectibles, + ignoredCollectibles, + ...remainingState + } = state.CollectiblesController; + state.NftController = { + ...(allCollectibleContracts + ? { allNftContracts: allCollectibleContracts } + : {}), + ...(allCollectibles ? { allNfts: allCollectibles } : {}), + ...(ignoredCollectibles ? { ignoredNfts: ignoredCollectibles } : {}), + ...remainingState, + }; + delete state.CollectiblesController; + } + + if (state.PreferencesController?.useCollectibleDetection) { + state.PreferencesController.useNftDetection = + state.PreferencesController.useCollectibleDetection; + delete state.PreferencesController.useCollectibleDetection; + } + + return state; +} diff --git a/app/scripts/migrations/076.test.js b/app/scripts/migrations/076.test.js new file mode 100644 index 000000000000..c25c04e6c485 --- /dev/null +++ b/app/scripts/migrations/076.test.js @@ -0,0 +1,143 @@ +import migration76 from './076'; + +describe('migration #76', () => { + it('should update the version metadata', async () => { + const oldStorage = { + meta: { + version: 75, + }, + data: {}, + }; + + const newStorage = await migration76.migrate(oldStorage); + expect(newStorage.meta).toStrictEqual({ + version: 76, + }); + }); + + it('should migrate known controller state properties', async () => { + const oldStorage = { + meta: { + version: 75, + }, + data: { + CollectiblesController: { + allCollectibleContracts: 'foo', + allCollectibles: 'bar', + ignoredCollectibles: 'baz', + }, + PreferencesController: { + useCollectibleDetection: 'foobar', + }, + }, + }; + + const newStorage = await migration76.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 76, + }, + data: { + NftController: { + allNftContracts: 'foo', + allNfts: 'bar', + ignoredNfts: 'baz', + }, + PreferencesController: { + useNftDetection: 'foobar', + }, + }, + }); + }); + + it('should migrate unknown controller state properties', async () => { + const oldStorage = { + meta: { + version: 75, + }, + data: { + CollectiblesController: { + allCollectibleContracts: 'foo', + allCollectibles: 'bar', + ignoredCollectibles: 'baz', + extra: 'extra', + }, + PreferencesController: { + extra: 'extra', + useCollectibleDetection: 'foobar', + }, + }, + }; + + const newStorage = await migration76.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 76, + }, + data: { + NftController: { + allNftContracts: 'foo', + allNfts: 'bar', + ignoredNfts: 'baz', + extra: 'extra', + }, + PreferencesController: { + extra: 'extra', + useNftDetection: 'foobar', + }, + }, + }); + }); + + it('should handle missing controller state', async () => { + const oldStorage = { + meta: { + version: 75, + }, + data: { + CollectiblesController: { + extra: 'extra', + }, + PreferencesController: { + extra: 'extra', + }, + }, + }; + + const newStorage = await migration76.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 76, + }, + data: { + NftController: { + extra: 'extra', + }, + PreferencesController: { + extra: 'extra', + }, + }, + }); + }); + + it('should handle missing CollectiblesController and PreferencesController', async () => { + const oldStorage = { + meta: { + version: 75, + }, + data: { + FooController: { a: 'b' }, + }, + }; + + const newStorage = await migration76.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 76, + }, + data: { + FooController: { a: 'b' }, + }, + }); + }); +}); diff --git a/app/scripts/migrations/077.js b/app/scripts/migrations/077.js new file mode 100644 index 000000000000..141cbb142db8 --- /dev/null +++ b/app/scripts/migrations/077.js @@ -0,0 +1,59 @@ +import { cloneDeep } from 'lodash'; + +const version = 77; + +/** + * Prior to token detection v2 the data property in tokensChainsCache was an array, + * in v2 we changes that to an object. In this migration we are converting the data as array to object. + */ +export default { + version, + async migrate(originalVersionedData) { + const versionedData = cloneDeep(originalVersionedData); + versionedData.meta.version = version; + const state = versionedData.data; + const newState = transformState(state); + versionedData.data = newState; + return versionedData; + }, +}; + +function transformState(state) { + const TokenListController = state?.TokenListController || {}; + + const { tokensChainsCache } = TokenListController; + + let dataCache; + let dataObject; + // eslint-disable-next-line + for (const chainId in tokensChainsCache) { + dataCache = tokensChainsCache[chainId].data; + dataObject = {}; + // if the data is array conver that to object + if (Array.isArray(dataCache)) { + for (const token of dataCache) { + dataObject[token.address] = token; + } + } else if ( + Object.keys(dataCache)[0].toLowerCase() !== + dataCache[Object.keys(dataCache)[0]].address.toLowerCase() + ) { + // for the users who already updated to the recent version + // and the dataCache is already an object keyed with 0,1,2,3 etc + // eslint-disable-next-line + for (const tokenAddress in dataCache) { + dataObject[dataCache[tokenAddress].address] = dataCache[tokenAddress]; + } + } + tokensChainsCache[chainId].data = + Object.keys(dataObject).length > 0 ? dataObject : dataCache; + } + TokenListController.tokensChainsCache = tokensChainsCache; + + return { + ...state, + TokenListController: { + ...TokenListController, + }, + }; +} diff --git a/app/scripts/migrations/077.test.js b/app/scripts/migrations/077.test.js new file mode 100644 index 000000000000..1c16420ecaed --- /dev/null +++ b/app/scripts/migrations/077.test.js @@ -0,0 +1,322 @@ +import migration77 from './077'; + +describe('migration #77', () => { + it('should update the version metadata', async () => { + const oldStorage = { + meta: { + version: 76, + }, + }; + + const newStorage = await migration77.migrate(oldStorage); + expect(newStorage.meta).toStrictEqual({ + version: 77, + }); + }); + it('should change the data from array to object for a single network', async () => { + const oldStorage = { + meta: { + version: 76, + }, + data: { + TokenListController: { + tokenList: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + }, + tokensChainsCache: { + 1: { + timestamp: 1234, + data: [ + { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + { + address: '0xc00e94cb662c3520282e6f5717214004a7f26888', + symbol: 'COMP', + decimals: 18, + }, + ], + }, + }, + }, + }, + }; + const newStorage = await migration77.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 77, + }, + data: { + TokenListController: { + tokenList: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + }, + tokensChainsCache: { + 1: { + timestamp: 1234, + data: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + '0xc00e94cb662c3520282e6f5717214004a7f26888': { + address: '0xc00e94cb662c3520282e6f5717214004a7f26888', + symbol: 'COMP', + decimals: 18, + }, + }, + }, + }, + }, + }, + }); + }); + it('should change the data from array to object for a multiple networks', async () => { + const oldStorage = { + meta: { + version: 76, + }, + data: { + TokenListController: { + tokenList: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + }, + tokensChainsCache: { + 1: { + timestamp: 1234, + data: [ + { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + { + address: '0xc00e94cb662c3520282e6f5717214004a7f26888', + symbol: 'COMP', + decimals: 18, + }, + ], + }, + 56: { + timestamp: 1324, + data: [ + { + address: '0x3ee2200efb3400fabb9aacf31297cbdd1d435d47', + symbol: 'ADA', + decimals: 18, + }, + { + address: '0x928e55dab735aa8260af3cedada18b5f70c72f1b', + symbol: 'FRONT', + decimals: 18, + }, + ], + }, + }, + }, + }, + }; + const newStorage = await migration77.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 77, + }, + data: { + TokenListController: { + tokenList: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + }, + tokensChainsCache: { + 1: { + timestamp: 1234, + data: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + '0xc00e94cb662c3520282e6f5717214004a7f26888': { + address: '0xc00e94cb662c3520282e6f5717214004a7f26888', + symbol: 'COMP', + decimals: 18, + }, + }, + }, + 56: { + timestamp: 1324, + data: { + '0x3ee2200efb3400fabb9aacf31297cbdd1d435d47': { + address: '0x3ee2200efb3400fabb9aacf31297cbdd1d435d47', + symbol: 'ADA', + decimals: 18, + }, + '0x928e55dab735aa8260af3cedada18b5f70c72f1b': { + address: '0x928e55dab735aa8260af3cedada18b5f70c72f1b', + symbol: 'FRONT', + decimals: 18, + }, + }, + }, + }, + }, + }, + }); + }); + it('should not change anything if the data is already an object', async () => { + const oldStorage = { + meta: { + version: 76, + }, + data: { + TokenListController: { + tokenList: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + }, + tokensChainsCache: { + 1: { + timestamp: 1234, + data: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + '0xc00e94cb662c3520282e6f5717214004a7f26888': { + address: '0xc00e94cb662c3520282e6f5717214004a7f26888', + symbol: 'COMP', + decimals: 18, + }, + }, + }, + }, + }, + }, + }; + const newStorage = await migration77.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 77, + }, + data: { + TokenListController: { + tokenList: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + }, + tokensChainsCache: { + 1: { + timestamp: 1234, + data: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + '0xc00e94cb662c3520282e6f5717214004a7f26888': { + address: '0xc00e94cb662c3520282e6f5717214004a7f26888', + symbol: 'COMP', + decimals: 18, + }, + }, + }, + }, + }, + }, + }); + }); + it('should correct the address keys if the object is keyed wrong', async () => { + const oldStorage = { + meta: { + version: 76, + }, + data: { + TokenListController: { + tokenList: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + }, + tokensChainsCache: { + 1: { + timestamp: 1234, + data: { + 0: { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + 1: { + address: '0xc00e94cb662c3520282e6f5717214004a7f26888', + symbol: 'COMP', + decimals: 18, + }, + }, + }, + }, + }, + }, + }; + const newStorage = await migration77.migrate(oldStorage); + expect(newStorage).toStrictEqual({ + meta: { + version: 77, + }, + data: { + TokenListController: { + tokenList: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + }, + tokensChainsCache: { + 1: { + timestamp: 1234, + data: { + '0x514910771af9ca656af840dff83e8264ecf986ca': { + address: '0x514910771af9ca656af840dff83e8264ecf986ca', + symbol: 'LINK', + decimals: 18, + }, + '0xc00e94cb662c3520282e6f5717214004a7f26888': { + address: '0xc00e94cb662c3520282e6f5717214004a7f26888', + symbol: 'COMP', + decimals: 18, + }, + }, + }, + }, + }, + }, + }); + }); +}); diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js index f8a6db8141b3..d39595847f2f 100644 --- a/app/scripts/migrations/index.js +++ b/app/scripts/migrations/index.js @@ -77,6 +77,10 @@ import m070 from './070'; import m071 from './071'; import m072 from './072'; import m073 from './073'; +import m074 from './074'; +import m075 from './075'; +import m076 from './076'; +import m077 from './077'; const migrations = [ m002, @@ -151,6 +155,10 @@ const migrations = [ m071, m072, m073, + m074, + m075, + m076, + m077, ]; export default migrations; diff --git a/app/scripts/migrations/migrations.test.js b/app/scripts/migrations/migrations.test.js index f1f860d903cf..4832adac5b57 100644 --- a/app/scripts/migrations/migrations.test.js +++ b/app/scripts/migrations/migrations.test.js @@ -149,11 +149,6 @@ describe('wallet1 is migrated successfully', () => { 'testnet', ); return migration13.migrate(twelfthResult); - }) - .then((thirteenthResult) => { - expect(thirteenthResult.data.config.provider.type).toStrictEqual( - 'ropsten', - ); }); }); }); diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js index 7381fab9d94c..32cd35671cf2 100644 --- a/app/scripts/platforms/extension.js +++ b/app/scripts/platforms/extension.js @@ -1,7 +1,7 @@ import browser from 'webextension-polyfill'; import { getBlockExplorerLink } from '@metamask/etherscan-link'; -import { getEnvironmentType, checkForError } from '../lib/util'; +import { getEnvironmentType } from '../lib/util'; import { ENVIRONMENT_TYPE_BACKGROUND } from '../../../shared/constants/app'; import { TRANSACTION_STATUSES } from '../../../shared/constants/transaction'; @@ -13,70 +13,32 @@ export default class ExtensionPlatform { browser.runtime.reload(); } - openTab(options) { - return new Promise((resolve, reject) => { - browser.tabs.create(options).then((newTab) => { - const error = checkForError(); - if (error) { - return reject(error); - } - return resolve(newTab); - }); - }); + async openTab(options) { + const newTab = await browser.tabs.create(options); + return newTab; } - openWindow(options) { - return new Promise((resolve, reject) => { - browser.windows.create(options).then((newWindow) => { - const error = checkForError(); - if (error) { - return reject(error); - } - return resolve(newWindow); - }); - }); + async openWindow(options) { + const newWindow = await browser.windows.create(options); + return newWindow; } - focusWindow(windowId) { - return new Promise((resolve, reject) => { - browser.windows.update(windowId, { focused: true }).then(() => { - const error = checkForError(); - if (error) { - return reject(error); - } - return resolve(); - }); - }); + async focusWindow(windowId) { + await browser.windows.update(windowId, { focused: true }); } - updateWindowPosition(windowId, left, top) { - return new Promise((resolve, reject) => { - browser.windows.update(windowId, { left, top }).then(() => { - const error = checkForError(); - if (error) { - return reject(error); - } - return resolve(); - }); - }); + async updateWindowPosition(windowId, left, top) { + await browser.windows.update(windowId, { left, top }); } - getLastFocusedWindow() { - return new Promise((resolve, reject) => { - browser.windows.getLastFocused().then((windowObject) => { - const error = checkForError(); - if (error) { - return reject(error); - } - return resolve(windowObject); - }); - }); + async getLastFocusedWindow() { + const windowObject = await browser.windows.getLastFocused(); + return windowObject; } - closeCurrentWindow() { - return browser.windows.getCurrent().then((windowDetails) => { - return browser.windows.remove(windowDetails.id); - }); + async closeCurrentWindow() { + const windowDetails = await browser.windows.getCurrent(); + browser.windows.remove(windowDetails.id); } getVersion() { @@ -169,67 +131,28 @@ export default class ExtensionPlatform { browser.windows.onRemoved.addListener(listener); } - getAllWindows() { - return new Promise((resolve, reject) => { - browser.windows.getAll().then((windows) => { - const error = checkForError(); - if (error) { - return reject(error); - } - return resolve(windows); - }); - }); + async getAllWindows() { + const windows = await browser.windows.getAll(); + return windows; } - getActiveTabs() { - return new Promise((resolve, reject) => { - browser.tabs.query({ active: true }).then((tabs) => { - const error = checkForError(); - if (error) { - return reject(error); - } - return resolve(tabs); - }); - }); + async getActiveTabs() { + const tabs = await browser.tabs.query({ active: true }); + return tabs; } - currentTab() { - return new Promise((resolve, reject) => { - browser.tabs.getCurrent().then((tab) => { - const err = checkForError(); - if (err) { - reject(err); - } else { - resolve(tab); - } - }); - }); + async currentTab() { + const tab = await browser.tabs.getCurrent(); + return tab; } - switchToTab(tabId) { - return new Promise((resolve, reject) => { - browser.tabs.update(tabId, { highlighted: true }).then((tab) => { - const err = checkForError(); - if (err) { - reject(err); - } else { - resolve(tab); - } - }); - }); + async switchToTab(tabId) { + const tab = await browser.tabs.update(tabId, { highlighted: true }); + return tab; } - closeTab(tabId) { - return new Promise((resolve, reject) => { - browser.tabs.remove(tabId).then(() => { - const err = checkForError(); - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); + async closeTab(tabId) { + await browser.tabs.remove(tabId); } _showConfirmedTransaction(txMeta, rpcPrefs) { diff --git a/app/scripts/sentry-install.js b/app/scripts/sentry-install.js index 1f0b87bd596b..fc654371b5cd 100644 --- a/app/scripts/sentry-install.js +++ b/app/scripts/sentry-install.js @@ -1,10 +1,10 @@ import setupSentry from './lib/setupSentry'; // The root compartment will populate this with hooks -global.sentryHooks = {}; +global.stateHooks = {}; // setup sentry error reporting global.sentry = setupSentry({ release: process.env.METAMASK_VERSION, - getState: () => global.sentryHooks?.getSentryState?.() || {}, + getState: () => global.stateHooks?.getSentryState?.() || {}, }); diff --git a/app/scripts/ui.js b/app/scripts/ui.js index deb12f6c1480..c0f0bb7d1130 100644 --- a/app/scripts/ui.js +++ b/app/scripts/ui.js @@ -15,19 +15,36 @@ import launchMetaMaskUi, { updateBackgroundConnection } from '../../ui'; import { ENVIRONMENT_TYPE_FULLSCREEN, ENVIRONMENT_TYPE_POPUP, + EXTENSION_MESSAGES, + PLATFORM_FIREFOX, } from '../../shared/constants/app'; import { isManifestV3 } from '../../shared/modules/mv3.utils'; import { SUPPORT_LINK } from '../../shared/lib/ui-utils'; import { getErrorHtml } from '../../shared/lib/error-utils'; import ExtensionPlatform from './platforms/extension'; import { setupMultiplex } from './lib/stream-utils'; -import { getEnvironmentType } from './lib/util'; +import { getEnvironmentType, getPlatform } from './lib/util'; import metaRPCClientFactory from './lib/metaRPCClientFactory'; const container = document.getElementById('app-content'); -const WORKER_KEEP_ALIVE_INTERVAL = 1000; +const ONE_SECOND_IN_MILLISECONDS = 1_000; + +// Service Worker Keep Alive Message Constants +const WORKER_KEEP_ALIVE_INTERVAL = ONE_SECOND_IN_MILLISECONDS; const WORKER_KEEP_ALIVE_MESSAGE = 'WORKER_KEEP_ALIVE_MESSAGE'; +const ACK_KEEP_ALIVE_WAIT_TIME = 60_000; // 1 minute +const ACK_KEEP_ALIVE_MESSAGE = 'ACK_KEEP_ALIVE_MESSAGE'; + +// Timeout for initializing phishing warning page. +const PHISHING_WARNING_PAGE_TIMEOUT = ONE_SECOND_IN_MILLISECONDS; + +const PHISHING_WARNING_SW_STORAGE_KEY = 'phishing-warning-sw-registered'; + +let lastMessageReceivedTimestamp = Date.now(); + +let extensionPort; +let ackTimeoutToDisplayError; /* * As long as UI is open it will keep sending messages to service worker @@ -36,8 +53,45 @@ const WORKER_KEEP_ALIVE_MESSAGE = 'WORKER_KEEP_ALIVE_MESSAGE'; * Time has been kept to 1000ms but can be reduced for even faster re-activation of service worker */ if (isManifestV3) { - setInterval(() => { + // Checking for SW aliveness (or stuckness) flow + // 1. Check if we have an extensionPort, if yes + // 2a. Send a keep alive message to the background via extensionPort + // 2b. Add a listener to it (if not already added) + // 3a. Set a timeout to check if we have received an ACK from background + // 3b. If we have not received an ACK within ACK_KEEP_ALIVE_WAIT_TIME, + // we know the background is stuck or dead + // 4. If we recieve an ACK_KEEP_ALIVE_MESSAGE from the service worker, we know it is alive + + const ackKeepAliveListener = (message) => { + if (message.name === ACK_KEEP_ALIVE_MESSAGE) { + lastMessageReceivedTimestamp = Date.now(); + clearTimeout(ackTimeoutToDisplayError); + } + }; + + const keepAliveInterval = setInterval(() => { browser.runtime.sendMessage({ name: WORKER_KEEP_ALIVE_MESSAGE }); + + if (extensionPort !== null && extensionPort !== undefined) { + extensionPort.postMessage({ name: WORKER_KEEP_ALIVE_MESSAGE }); + + if (extensionPort.onMessage.hasListener(ackKeepAliveListener) === false) { + extensionPort.onMessage.addListener(ackKeepAliveListener); + } + } + + ackTimeoutToDisplayError = setTimeout(() => { + if ( + Date.now() - lastMessageReceivedTimestamp > + ACK_KEEP_ALIVE_WAIT_TIME + ) { + clearInterval(keepAliveInterval); + displayCriticalError( + 'somethingIsWrong', + new Error("Something's gone wrong. Try reloading the page."), + ); + } + }, ACK_KEEP_ALIVE_WAIT_TIME); }, WORKER_KEEP_ALIVE_INTERVAL); } @@ -53,23 +107,21 @@ async function start() { let isUIInitialised = false; // setup stream to background - let extensionPort = browser.runtime.connect({ name: windowType }); + extensionPort = browser.runtime.connect({ name: windowType }); let connectionStream = new PortStream(extensionPort); const activeTab = await queryCurrentActiveTab(windowType); - /** - * In case of MV3 the issue of blank screen was very frequent, it is caused by UI initialising before background is ready to send state. - * Code below ensures that UI is rendered only after background is ready. - */ + let loadPhishingWarningPage; + if (isManifestV3) { /* * In case of MV3 the issue of blank screen was very frequent, it is caused by UI initialising before background is ready to send state. * Code below ensures that UI is rendered only after CONNECTION_READY message is received thus background is ready. * In case the UI is already rendered, only update the streams. */ - const messageListener = (message) => { - if (message?.name === 'CONNECTION_READY') { + const messageListener = async (message) => { + if (message?.name === EXTENSION_MESSAGES.CONNECTION_READY) { if (isUIInitialised) { // Currently when service worker is revived we create new streams // in later version we might try to improve it by reviving same streams. @@ -77,16 +129,111 @@ async function start() { } else { initializeUiWithTab(activeTab); } + await loadPhishingWarningPage(); + } + }; + + /** + * An error thrown if the phishing warning page takes too long to load. + */ + class PhishingWarningPageTimeoutError extends Error { + constructor() { + super('Timeout failed'); + } + } + + /** + * Load the phishing warning page temporarily to ensure the service + * worker has been registered, so that the warning page works offline. + */ + loadPhishingWarningPage = async function () { + // Check session storage for whether we've already initialized the phishing warning + // service worker in this browser session and do not attempt to re-initialize if so. + const phishingSWMemoryFetch = await browser.storage.session.get( + PHISHING_WARNING_SW_STORAGE_KEY, + ); + + if (phishingSWMemoryFetch[PHISHING_WARNING_SW_STORAGE_KEY]) { + return; + } + + const currentPlatform = getPlatform(); + let iframe; + + try { + const extensionStartupPhishingPageUrl = new URL( + process.env.PHISHING_WARNING_PAGE_URL, + ); + // The `extensionStartup` hash signals to the phishing warning page that it should not bother + // setting up streams for user interaction. Otherwise this page load would cause a console + // error. + extensionStartupPhishingPageUrl.hash = '#extensionStartup'; + + iframe = window.document.createElement('iframe'); + iframe.setAttribute('src', extensionStartupPhishingPageUrl.href); + iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin'); + + // Create "deferred Promise" to allow passing resolve/reject to event handlers + let deferredResolve; + let deferredReject; + const loadComplete = new Promise((resolve, reject) => { + deferredResolve = resolve; + deferredReject = reject; + }); + + // The load event is emitted once loading has completed, even if the loading failed. + // If loading failed we can't do anything about it, so we don't need to check. + iframe.addEventListener('load', deferredResolve); + + // This step initiates the page loading. + window.document.body.appendChild(iframe); + + // This timeout ensures that this iframe gets cleaned up in a reasonable + // timeframe, and ensures that the "initialization complete" message + // doesn't get delayed too long. + setTimeout( + () => deferredReject(new PhishingWarningPageTimeoutError()), + PHISHING_WARNING_PAGE_TIMEOUT, + ); + + await loadComplete; + + // store a flag in sessions storage that we've already loaded the service worker + // and don't need to try again + if (currentPlatform === PLATFORM_FIREFOX) { + // Firefox does not yet support the storage.session API introduced in MV3 + // Tracked here: https://bugzilla.mozilla.org/show_bug.cgi?id=1687778 + console.error( + 'Firefox does not support required MV3 APIs: Phishing warning page iframe and service worker will reload each page refresh', + ); + } else { + browser.storage.session.set({ + [PHISHING_WARNING_SW_STORAGE_KEY]: true, + }); + } + } catch (error) { + if (error instanceof PhishingWarningPageTimeoutError) { + console.warn( + 'Phishing warning page timeout; page not guaranteed to work offline.', + ); + } else { + console.error('Failed to initialize phishing warning page', error); + } + } finally { + if (iframe) { + iframe.remove(); + } } }; // resetExtensionStreamAndListeners takes care to remove listeners from closed streams - // it also creates new streams and attach event listeners to them + // it also creates new streams and attaches event listeners to them const resetExtensionStreamAndListeners = () => { extensionPort.onMessage.removeListener(messageListener); extensionPort.onDisconnect.removeListener( resetExtensionStreamAndListeners, ); + // message below will try to activate service worker // in MV3 is likely that reason of stream closing is service worker going in-active browser.runtime.sendMessage({ name: WORKER_KEEP_ALIVE_MESSAGE }); @@ -107,7 +254,7 @@ async function start() { initializeUi(tab, connectionStream, (err, store) => { if (err) { // if there's an error, store will be = metamaskState - displayCriticalError(err, store); + displayCriticalError('troubleStarting', err, store); return; } isUIInitialised = true; @@ -125,7 +272,7 @@ async function start() { function updateUiStreams() { connectToAccountManager(connectionStream, (err, backgroundConnection) => { if (err) { - displayCriticalError(err); + displayCriticalError('troubleStarting', err); return; } @@ -135,27 +282,22 @@ async function start() { } async function queryCurrentActiveTab(windowType) { - return new Promise((resolve) => { - // At the time of writing we only have the `activeTab` permission which means - // that this query will only succeed in the popup context (i.e. after a "browserAction") - if (windowType !== ENVIRONMENT_TYPE_POPUP) { - resolve({}); - return; - } + // At the time of writing we only have the `activeTab` permission which means + // that this query will only succeed in the popup context (i.e. after a "browserAction") + if (windowType !== ENVIRONMENT_TYPE_POPUP) { + return {}; + } - browser.tabs.query({ active: true, currentWindow: true }).then((tabs) => { - const [activeTab] = tabs; - const { id, title, url } = activeTab; - const { origin, protocol } = url ? new URL(url) : {}; + const tabs = await browser.tabs.query({ active: true, currentWindow: true }); + const [activeTab] = tabs; + const { id, title, url } = activeTab; + const { origin, protocol } = url ? new URL(url) : {}; - if (!origin || origin === 'null') { - resolve({}); - return; - } + if (!origin || origin === 'null') { + return {}; + } - resolve({ id, title, origin, protocol, url }); - }); - }); + return { id, title, origin, protocol, url }; } function initializeUi(activeTab, connectionStream, cb) { @@ -176,8 +318,8 @@ function initializeUi(activeTab, connectionStream, cb) { }); } -async function displayCriticalError(err, metamaskState) { - const html = await getErrorHtml(SUPPORT_LINK, metamaskState); +async function displayCriticalError(errorKey, err, metamaskState) { + const html = await getErrorHtml(errorKey, SUPPORT_LINK, metamaskState); container.innerHTML = html; diff --git a/app/unsLoading.html b/app/unsLoading.html new file mode 100644 index 000000000000..26a6c729e189 --- /dev/null +++ b/app/unsLoading.html @@ -0,0 +1,40 @@ + + + + + + + MetaMask Loading + + + + + + diff --git a/crowdin.yml b/crowdin.yml index 25f294025f9c..e3d58e4236cf 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -4,9 +4,9 @@ "preserve_hierarchy": true -files: [ - { - "source" : "app/_locales/en/messages.json", - "translation" : "/app/_locales/%two_letters_code%/%original_file_name%", - } -] +files: + - "source" : "app/_locales/en/messages.json" + "translation" : "/app/_locales/%two_letters_code%/%original_file_name%" + "languages_mapping": + "two_letters_code": + "zh-CN": "zh_CN" diff --git a/development/build/index.js b/development/build/index.js index 628cbbbac657..a1a6874e68f6 100755 --- a/development/build/index.js +++ b/development/build/index.js @@ -71,7 +71,7 @@ async function defineAndRunBuildTasks() { version, } = await parseArgv(); - const browserPlatforms = ['firefox', 'chrome', 'brave', 'opera']; + const browserPlatforms = ['firefox', 'chrome']; const browserVersionMap = getBrowserVersionMap(browserPlatforms, version); diff --git a/development/build/scripts.js b/development/build/scripts.js index de5fd260c51c..1e2ec7957d66 100644 --- a/development/build/scripts.js +++ b/development/build/scripts.js @@ -30,6 +30,7 @@ const bifyModuleGroups = require('bify-module-groups'); const { streamFlatMap } = require('../stream-flat-map'); const { BuildType } = require('../lib/build-type'); const { generateIconNames } = require('../generate-icon-names'); +const phishingWarningManifest = require('../../node_modules/@metamask/phishing-warning/package.json'); const { BUILD_TARGETS, ENVIRONMENT } = require('./constants'); const { getConfig, getProductionConfig } = require('./config'); const { @@ -112,7 +113,7 @@ function getPhishingWarningPageUrl({ config, testing }) { if (!phishingWarningPageUrl) { phishingWarningPageUrl = testing ? 'http://localhost:9999/' - : 'https://metamask.github.io/phishing-warning/v1.1.0/'; + : `https://metamask.github.io/phishing-warning/v${phishingWarningManifest.version}/`; } // We add a hash/fragment to the URL dynamically, so we need to ensure it diff --git a/development/build/static.js b/development/build/static.js index 7e3ccf02fadb..8cfdc6b987ae 100644 --- a/development/build/static.js +++ b/development/build/static.js @@ -143,6 +143,10 @@ function getCopyTargets(shouldIncludeLockdown) { src: `./app/loading.html`, dest: `loading.html`, }, + { + src: `./app/unsloading.html`, + dest: `unsloading.html`, + }, { src: `./node_modules/globalthis/dist/browser.js`, dest: `globalthis.js`, diff --git a/development/build/styles.js b/development/build/styles.js index 47c5e5c6685b..8b5ccf29e701 100644 --- a/development/build/styles.js +++ b/development/build/styles.js @@ -58,10 +58,8 @@ function createStyleTasks({ livereload }) { }; async function buildScss() { - await Promise.all([ - buildScssPipeline(src, dest, devMode, false), - buildScssPipeline(src, dest, devMode, true), - ]); + await buildScssPipeline(src, dest, devMode, false); + await buildScssPipeline(src, dest, devMode, true); } } } diff --git a/development/generate-icon-names.js b/development/generate-icon-names.js index bbe49f653cee..f004edbefd61 100644 --- a/development/generate-icon-names.js +++ b/development/generate-icon-names.js @@ -4,7 +4,7 @@ * Reads all the icon svg files in app/images/icons * and returns an object of icon name key value pairs * stored in the environment variable ICON_NAMES - * Used with the Icon component in ./ui/component-library/icon + * Used with the Icon component in ./ui/components/component-library/icon/icon.js */ const fs = require('fs'); const path = require('path'); @@ -22,12 +22,12 @@ const getIconNameInSnakeCase = (fileName) => .replace(/-/gu, '_') .toUpperCase(); -const generateIconNames = async () => { +const generateIconNames = () => { const iconNames = {}; const svgIconsFolderPath = path.join(__dirname, `../${SVG_ICONS_FOLDER}`); - const fileList = await fs.promises.readdir(svgIconsFolderPath); + const fileList = fs.readdirSync(svgIconsFolderPath); const svgIconsFileList = fileList.filter( (fileName) => path.extname(fileName) === ASSET_EXT, @@ -39,9 +39,9 @@ const generateIconNames = async () => { getIconNameKebabCase(fileName)), ); - console.log('ICON_NAMES env var successfully generated!'); + const iconNamesStringified = JSON.stringify(iconNames); - return iconNames; + return iconNamesStringified; }; module.exports = { generateIconNames }; diff --git a/development/generate-lavamoat-policies.js b/development/generate-lavamoat-policies.js index 4ac600636d8e..a4004e0b8456 100755 --- a/development/generate-lavamoat-policies.js +++ b/development/generate-lavamoat-policies.js @@ -11,7 +11,7 @@ start().catch((error) => { async function start() { const { - argv: { buildTypes, parallel }, + argv: { buildTypes, parallel, devMode }, } = yargs(hideBin(process.argv)).usage( '$0 [options]', 'Generate the LavaMoat policy file for one more more build types.', @@ -31,13 +31,22 @@ async function start() { description: 'Whether to generate policies in parallel.', type: 'boolean', }) + .option('devMode', { + alias: ['d'], + default: false, + demandOption: true, + description: + 'Whether to run the process under lavamoat (devMode=false) or node (devMode=true)', + type: 'boolean', + }) .strict(), ); + const buildCommand = devMode ? 'build:dev' : 'build'; await concurrently( (Array.isArray(buildTypes) ? buildTypes : [buildTypes]).map( (buildType) => ({ - command: `yarn build scripts:dist --policy-only --build-type=${buildType}`, + command: `yarn ${buildCommand} scripts:dist --policy-only --lint-fence-files=false --build-type=${buildType}`, env: { WRITE_AUTO_POLICY: 1, }, diff --git a/development/metamaskbot-build-announce.js b/development/metamaskbot-build-announce.js index 8ce98ce67ff4..6e929969c5a9 100755 --- a/development/metamaskbot-build-announce.js +++ b/development/metamaskbot-build-announce.js @@ -23,6 +23,8 @@ async function start() { console.log('CIRCLE_BUILD_NUM', CIRCLE_BUILD_NUM); const { CIRCLE_WORKFLOW_JOB_ID } = process.env; console.log('CIRCLE_WORKFLOW_JOB_ID', CIRCLE_WORKFLOW_JOB_ID); + const { PARENT_COMMIT } = process.env; + console.log('PARENT_COMMIT', PARENT_COMMIT); if (!CIRCLE_PULL_REQUEST) { console.warn(`No pull request detected for commit "${CIRCLE_SHA1}"`); @@ -36,7 +38,7 @@ async function start() { // build the github comment content // links to extension builds - const platforms = ['chrome', 'firefox', 'opera']; + const platforms = ['chrome', 'firefox']; const buildLinks = platforms .map((platform) => { const url = `${BUILD_LINK_BASE}/builds/metamask-${platform}-${VERSION}.zip`; @@ -87,6 +89,9 @@ async function start() { .map((key) => `
  • ${key}: ${bundles[key].join(', ')}
  • `) .join('')}`; + const bundleSizeDataUrl = + 'https://raw.githubusercontent.com/MetaMask/extension_bundlesize_stats/main/stats/bundle_size_data.json'; + const coverageUrl = `${BUILD_LINK_BASE}/coverage/index.html`; const coverageLink = `Report`; @@ -243,6 +248,67 @@ async function start() { console.log(`No results for ${summaryPlatform} found; skipping benchmark`); } + try { + const prBundleSizeStats = JSON.parse( + await fs.readFile( + path.resolve( + __dirname, + '..', + path.join('test-artifacts', 'chrome', 'mv3', 'bundle_size.json'), + ), + 'utf-8', + ), + ); + + const devBundleSizeStats = await ( + await fetch(bundleSizeDataUrl, { + method: 'GET', + }) + ).json(); + + const prSizes = { + background: prBundleSizeStats.background.size, + ui: prBundleSizeStats.ui.size, + common: prBundleSizeStats.common.size, + }; + + const devSizes = Object.keys(prSizes).reduce((sizes, part) => { + sizes[part] = devBundleSizeStats[PARENT_COMMIT][part] || 0; + return sizes; + }, {}); + + const diffs = Object.keys(prSizes).reduce((output, part) => { + output[part] = prSizes[part] - devSizes[part]; + return output; + }, {}); + + const sizeDiffRows = Object.keys(diffs).map( + (part) => `${part}: ${diffs[part]} bytes`, + ); + + const sizeDiffHiddenContent = ``; + + const sizeDiff = diffs.background + diffs.common; + + const sizeDiffWarning = + sizeDiff > 0 + ? `🚨 Warning! Bundle size has increased!` + : `🚀 Bundle size reduced!`; + + const sizeDiffExposedContent = + sizeDiff === 0 + ? `Bundle size diffs` + : `Bundle size diffs [${sizeDiffWarning}]`; + + const sizeDiffBody = `
    ${sizeDiffExposedContent}${sizeDiffHiddenContent}
    \n\n`; + + commentBody += sizeDiffBody; + } catch (error) { + console.error(`Error constructing bundle size diffs results: '${error}'`); + } + try { const highlights = await getHighlights({ artifactBase: BUILD_LINK_BASE }); if (highlights) { diff --git a/development/mock-3box.js b/development/mock-3box.js deleted file mode 100644 index ebbbe325d9ed..000000000000 --- a/development/mock-3box.js +++ /dev/null @@ -1,68 +0,0 @@ -function delay(time) { - return new Promise((resolve) => setTimeout(resolve, time)); -} - -async function loadFromMock3Box(key) { - const res = await window.fetch(`http://localhost:8889?key=${key}`); - const text = await res.text(); - return text.length ? JSON.parse(text) : null; -} - -async function saveToMock3Box(key, newDataAtKey) { - const res = await window.fetch('http://localhost:8889', { - method: 'POST', - body: JSON.stringify({ - key, - data: newDataAtKey, - }), - }); - - return res.text(); -} - -class Mock3Box { - static openBox(address) { - this.address = address; - return Promise.resolve({ - onSyncDone: (cb) => { - setTimeout(cb, 200); - }, - openSpace: async (spaceName, config) => { - const { onSyncDone } = config; - this.spaceName = spaceName; - - setTimeout(onSyncDone, 150); - - await delay(50); - - return { - private: { - get: async (key) => { - await delay(50); - const res = await loadFromMock3Box( - `${this.address}-${this.spaceName}-${key}`, - ); - return res; - }, - set: async (key, data) => { - await saveToMock3Box( - `${this.address}-${this.spaceName}-${key}`, - data, - ); - await delay(50); - return null; - }, - }, - }; - }, - logout: () => undefined, - }); - } - - static async getConfig(address) { - const backup = await loadFromMock3Box(`${address}-metamask-metamaskBackup`); - return backup ? { spaces: { metamask: {} } } : {}; - } -} - -module.exports = Mock3Box; diff --git a/development/states/navigate-txs.json b/development/states/navigate-txs.json index bf39420c1f24..24850ddccc70 100644 --- a/development/states/navigate-txs.json +++ b/development/states/navigate-txs.json @@ -229,7 +229,7 @@ "useETHAsPrimaryCurrency": true }, "provider": { - "type": "rinkeby" + "type": "goerli" }, "network": "4", "accounts": { @@ -276,7 +276,7 @@ "0x8cf82b5aa41ff2282427be151dd328568684007a": {}, "0xbe1a00e10ec68b154adb84e8119167146a71c9a2": {}, "0xe2f12a09ba1098312a7d1cad7581ed253ca5f4b2": { - "rinkeby": [ + "goerli": [ { "address": "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a", "decimals": 9, @@ -305,10 +305,7 @@ "conversionDate": 1538859376, "shapeShiftTxList": [], "infuraNetworkStatus": { - "kovan": "ok", "mainnet": "ok", - "rinkeby": "ok", - "ropsten": "ok", "goerli": "ok", "sepolia": "ok" } diff --git a/development/ts-migration-dashboard/files-to-convert.json b/development/ts-migration-dashboard/files-to-convert.json index 3a184644d0f4..5d705fe04209 100644 --- a/development/ts-migration-dashboard/files-to-convert.json +++ b/development/ts-migration-dashboard/files-to-convert.json @@ -48,7 +48,6 @@ "app/scripts/controllers/preferences.test.js", "app/scripts/controllers/swaps.js", "app/scripts/controllers/swaps.test.js", - "app/scripts/controllers/threebox.js", "app/scripts/controllers/transactions/index.js", "app/scripts/controllers/transactions/index.test.js", "app/scripts/controllers/transactions/lib/tx-state-history-helpers.js", @@ -530,28 +529,10 @@ "ui/components/app/flask/snaps-authorship-pill/snaps-authorship-pill.stories.js", "ui/components/app/flask/update-snap-permission-list/index.js", "ui/components/app/flask/update-snap-permission-list/update-snap-permission-list.js", - "ui/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.component.js", - "ui/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.container.js", - "ui/components/app/gas-customization/advanced-gas-inputs/advanced-gas-inputs.test.js", - "ui/components/app/gas-customization/advanced-gas-inputs/index.js", - "ui/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content-component.test.js", - "ui/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/advanced-tab-content.component.js", - "ui/components/app/gas-customization/gas-modal-page-container/advanced-tab-content/index.js", - "ui/components/app/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content-component.test.js", - "ui/components/app/gas-customization/gas-modal-page-container/basic-tab-content/basic-tab-content.component.js", - "ui/components/app/gas-customization/gas-modal-page-container/basic-tab-content/index.js", - "ui/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container-component.test.js", - "ui/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container-container.test.js", - "ui/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.component.js", - "ui/components/app/gas-customization/gas-modal-page-container/gas-modal-page-container.container.js", - "ui/components/app/gas-customization/gas-modal-page-container/index.js", - "ui/components/app/gas-customization/gas-price-button-group/gas-price-button-group-component.test.js", - "ui/components/app/gas-customization/gas-price-button-group/gas-price-button-group.component.js", - "ui/components/app/gas-customization/gas-price-button-group/gas-price-button-group.stories.js", - "ui/components/app/gas-customization/gas-price-button-group/index.js", - "ui/components/app/gas-customization/gas-slider/gas-slider.component.js", - "ui/components/app/gas-customization/gas-slider/gas-slider.stories.js", - "ui/components/app/gas-customization/gas-slider/index.js", + "ui/components/app/advanced-gas-inputs/advanced-gas-inputs.component.js", + "ui/components/app/advanced-gas-inputs/advanced-gas-inputs.container.js", + "ui/components/app/advanced-gas-inputs/advanced-gas-inputs.test.js", + "ui/components/app/advanced-gas-inputs/index.js", "ui/components/app/gas-details-item/gas-details-item-title/gas-details-item-title.js", "ui/components/app/gas-details-item/gas-details-item-title/gas-details-item-title.test.js", "ui/components/app/gas-details-item/gas-details-item-title/index.js", @@ -717,7 +698,7 @@ "ui/components/app/signature-request/signature-request-header/signature-request-header.component.js", "ui/components/app/signature-request/signature-request-header/signature-request-header.stories.js", "ui/components/app/signature-request/signature-request-message/index.js", - "ui/components/app/signature-request/signature-request-message/signature-request-message.component.js", + "ui/components/app/signature-request/signature-request-message/signature-request-message.js", "ui/components/app/signature-request/signature-request.component.js", "ui/components/app/signature-request/signature-request.component.test.js", "ui/components/app/signature-request/signature-request.container.js", @@ -1088,6 +1069,7 @@ "ui/ducks/confirm-transaction/confirm-transaction.duck.js", "ui/ducks/confirm-transaction/confirm-transaction.duck.test.js", "ui/ducks/ens.js", + "ui/ducks/uns.js", "ui/ducks/gas/gas-action-constants.js", "ui/ducks/gas/gas-duck.test.js", "ui/ducks/gas/gas.duck.js", @@ -1454,9 +1436,9 @@ "ui/pages/send/send-content/add-recipient/add-recipient.container.js", "ui/pages/send/send-content/add-recipient/add-recipient.container.test.js", "ui/pages/send/send-content/add-recipient/add-recipient.stories.js", - "ui/pages/send/send-content/add-recipient/ens-input.component.js", - "ui/pages/send/send-content/add-recipient/ens-input.container.js", - "ui/pages/send/send-content/add-recipient/ens-input.js", + "ui/pages/send/send-content/add-recipient/domain-input.component.js", + "ui/pages/send/send-content/add-recipient/domain-input.container.js", + "ui/pages/send/send-content/add-recipient/domain-input.js", "ui/pages/send/send-content/add-recipient/index.js", "ui/pages/send/send-content/index.js", "ui/pages/send/send-content/send-amount-row/amount-max-button/amount-max-button.js", @@ -1531,7 +1513,6 @@ "ui/pages/settings/contact-list-tab/view-contact/view-contact.container.js", "ui/pages/settings/experimental-tab/experimental-tab.component.js", "ui/pages/settings/experimental-tab/experimental-tab.component.test.js", - "ui/pages/settings/experimental-tab/experimental-tab.constant.js", "ui/pages/settings/experimental-tab/experimental-tab.container.js", "ui/pages/settings/experimental-tab/index.js", "ui/pages/settings/flask/snaps-list-tab/index.js", @@ -1580,6 +1561,7 @@ "ui/pages/settings/settings-tab/index.js", "ui/pages/settings/settings-tab/settings-tab.component.js", "ui/pages/settings/settings-tab/settings-tab.component.test.js", + "ui/pages/settings/settings-tab/settings-tab.constant.js", "ui/pages/settings/settings-tab/settings-tab.container.js", "ui/pages/settings/settings.component.js", "ui/pages/settings/settings.component.test.js", diff --git a/docs/QA_Guide.md b/docs/QA_Guide.md index dc5b94c40f34..a615d5f605a0 100644 --- a/docs/QA_Guide.md +++ b/docs/QA_Guide.md @@ -2,6 +2,7 @@ Steps to mark a full pass of QA complete. * Browsers: Opera, Chrome, Firefox, Edge. + * Use the Chrome build for all Chromium-derived browsers (e.g. Opera and Edge) * OS: Ubuntu, Mac OSX, Windows * Load older version of MetaMask and attempt to simulate updating the extension. * Open Developer Console in background and popup, inspect errors. diff --git a/docs/forking-mainnet-for-testing.md b/docs/forking-mainnet-for-testing.md new file mode 100644 index 000000000000..b6db1e18f167 --- /dev/null +++ b/docs/forking-mainnet-for-testing.md @@ -0,0 +1,11 @@ +# Forking Mainnet With Ganache for Testing + +If you want to test out mainnet functionality without having to actually use mainnet, you can use Ganache's forking feature and then import ganache network and its generated accounts into MetaMask + +1. Get your local dev build running and have MetaMask open in your browser +2. Run `$(yarn bin)/ganache --fork https://mainnet.infura.io/v3/INFURA_PROJECT_ID` with `INFURA_PROJECT_ID` replaced by your own infura project id +3. Ganache will output a list of account addresses, private keys and an "Mnemonic" (aka SRP, aka Secret Recovery Phrase) +4. Import either the private keys or the SRP into MetaMask +5. Add the ganache network as a custom network in MetaMask. The "New RPC URL" will need to be http://127.0.0.1:8545, set the Chain Id as 1, and the currency symbol to ETH + +You should now be able to use MetaMask, and many dapps, as if you were using mainnet. Your accounts should have 1000 ETH which you can use on this simulated local fork. Note that after significant time ellapses since when you forked mainnet (i.e. ran step 2 above), interactions with many dapps and smart contracts may begin to have inconsistent behaviour or failures. \ No newline at end of file diff --git a/test/e2e/fixtures/README.md b/docs/generating-fixture-data.md similarity index 50% rename from test/e2e/fixtures/README.md rename to docs/generating-fixture-data.md index e8bbe39ac3e2..2749457659b8 100644 --- a/test/e2e/fixtures/README.md +++ b/docs/generating-fixture-data.md @@ -1,22 +1,15 @@ -# End-to-end tests - -This directory contains the fixture data used to bootstrap the individual e2e tests. Each sub-directory contains -one thing: - -1. A `state.json` file that represents a the saved state for the extension (see _Generating fixture data_ below) - ## Generating fixture data Fixture data can be generated by following these steps: 1. Load the unpacked extension in development or test mode 2. Inspecting the background context of the extension -3. Call `metamaskGetState`, then call [`copy`][1] on the results +3. Call `stateHooks.metamaskGetState`, then call [`copy`][1] on the results You can then paste the contents directly in your fixture file. ```js -copy(await metamaskGetState()) +copy(await stateHooks.metamaskGetState()) ``` diff --git a/jest.config.js b/jest.config.js index c65632dcef24..98da7bca5303 100644 --- a/jest.config.js +++ b/jest.config.js @@ -11,7 +11,7 @@ module.exports = { coverageThreshold: { global: { branches: 44, - functions: 42, + functions: 46, lines: 52, statements: 52, }, @@ -41,7 +41,11 @@ module.exports = { // TODO: enable resetMocks // resetMocks: true, restoreMocks: true, - setupFiles: ['/test/setup.js', '/test/env.js'], + setupFiles: [ + '/test/setup.js', + '/test/env.js', + '/test/jest/env.js', // jest specific env vars that break mocha tests + ], setupFilesAfterEnv: ['/test/jest/setup.js'], testMatch: [ '/ui/**/*.test.js', @@ -49,25 +53,20 @@ module.exports = { '/app/scripts/lib/**/*.test.js', '/app/scripts/migrations/*.test.js', '/app/scripts/platforms/*.test.js', - 'app/scripts/controllers/network/**/*.test.js', + '/app/scripts/controllers/network/**/*.test.js', '/app/scripts/controllers/permissions/**/*.test.js', + '/app/scripts/flask/**/*.test.js', '/app/scripts/lib/createRPCMethodTrackingMiddleware.test.js', '/app/scripts/constants/error-utils.test.js', ], testTimeout: 2500, // We have to specify the environment we are running in, which is jsdom. The // default is 'node'. This can be modified *per file* using a comment at the - // head of the file. So it may be worth while to switch to 'node' in any + // head of the file. So it may be worthwhile to switch to 'node' in any // background tests. testEnvironment: 'jsdom', - // Our configuration somehow is calling into the esm folder / files of - // some modules. Jest supports ESM but our code is not set to emit ESM files - // so we are telling jest to use babel to transform the node_modules listed. - // Note: for some reason I could not hammer down to the node_modules - // installed in @metamask/controllers so I had to just blanket specify all - // of the @metamask/controllers folder. - transformIgnorePatterns: [ - '/node_modules/(?!(multiformats|uuid|nanoid|@metamask/controllers|@metamask/snap-controllers)/)', - ], + testEnvironmentOptions: { + customExportConditions: ['node', 'node-addons'], + }, workerIdleMemoryLimit: '500MB', }; diff --git a/jest.stories.config.js b/jest.stories.config.js deleted file mode 100644 index dd4d5a6cf0b3..000000000000 --- a/jest.stories.config.js +++ /dev/null @@ -1,17 +0,0 @@ -/* eslint-disable import/unambiguous */ -module.exports = { - coverageDirectory: './jest-coverage/storybook', - coverageReporters: ['html', 'text-summary'], - // TODO: enable resetMocks - // resetMocks: true, - restoreMocks: true, - setupFiles: ['/test/setup.js', '/test/env.js'], - setupFilesAfterEnv: ['/test/jest/setup.js'], - testMatch: ['/ui/**/*stories.test.js'], - testTimeout: 2500, - transform: { - '^.+\\.[tj]sx?$': 'babel-jest', - '^.+\\.mdx$': '@storybook/addon-docs/jest-transform-mdx', - }, - testEnvironment: 'jsdom', -}; diff --git a/lavamoat/browserify/beta/policy.json b/lavamoat/browserify/beta/policy.json index b9fa80382d59..0aeec63548ef 100644 --- a/lavamoat/browserify/beta/policy.json +++ b/lavamoat/browserify/beta/policy.json @@ -14,7 +14,6 @@ "3box>3id-resolver": true, "3box>did-jwt": true, "3box>ethers": true, - "3box>ethers>elliptic": true, "3box>graphql-request": true, "3box>https-did-resolver": true, "3box>ipfs": true, @@ -32,6 +31,8 @@ "3box>tweetnacl": true, "3box>tweetnacl-util": true, "@babel/runtime": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "browserify>buffer": true, "browserify>process": true, "node-fetch": true @@ -61,11 +62,11 @@ }, "packages": { "3box>3box-orbitdb-plugins>ipfs-log>json-stringify-deterministic": true, - "3box>3box-orbitdb-plugins>ipfs-log>p-each-series": true, "3box>3box-orbitdb-plugins>ipfs-log>p-map": true, "3box>3box-orbitdb-plugins>ipfs-log>p-whilst": true, "3box>orbit-db>orbit-db-io": true, - "browserify>buffer": true + "browserify>buffer": true, + "jest>@jest/core>p-each-series": true } }, "3box>3id-resolver": { @@ -81,11 +82,12 @@ "packages": { "3box>3id-resolver>did-jwt>base64url": true, "3box>did-jwt>did-resolver": true, - "3box>ethers>elliptic": true, "3box>js-sha256": true, "3box>tweetnacl": true, "3box>tweetnacl-util": true, "@babel/runtime": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "browserify>buffer": true, "ethers>@ethersproject/keccak256>js-sha3": true } @@ -101,9 +103,10 @@ "3box>did-jwt>did-resolver": true, "3box>did-jwt>js-sha3": true, "3box>did-jwt>uport-base64url": true, - "3box>ethers>elliptic": true, "3box>js-sha256": true, "3box>tweetnacl": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "browserify>buffer": true } }, @@ -135,33 +138,6 @@ "setTimeout": true } }, - "3box>ethers>elliptic": { - "packages": { - "3box>ethers>elliptic>brorand": true, - "3box>ethers>elliptic>hmac-drbg": true, - "3box>ethers>elliptic>minimalistic-crypto-utils": true, - "3box>ethers>hash.js>minimalistic-assert": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true - } - }, - "3box>ethers>elliptic>brorand": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "3box>ethers>elliptic>hmac-drbg": { - "packages": { - "3box>ethers>elliptic>minimalistic-crypto-utils": true, - "3box>ethers>hash.js>minimalistic-assert": true, - "ethers>@ethersproject/sha2>hash.js": true - } - }, "3box>events": { "globals": { "console": true @@ -172,16 +148,7 @@ "fetch": true }, "packages": { - "3box>graphql-request>cross-fetch": true - } - }, - "3box>graphql-request>cross-fetch": { - "globals": { - "Blob": true, - "FileReader": true, - "FormData": true, - "URLSearchParams.prototype.isPrototypeOf": true, - "XMLHttpRequest": true + "@unstoppabledomains/resolution>cross-fetch": true } }, "3box>graphql-request>cross-fetch>node-fetch": { @@ -764,7 +731,7 @@ "3box>ipfs>ipld-raw>multihashing-async": true, "3box>ipfs>multicodec": true, "3box>ipfs>protons": true, - "@storybook/react>@storybook/store>stable": true, + "@storybook/client-api>stable": true, "browserify>assert": true, "browserify>buffer": true, "browserify>insert-module-globals>is-buffer": true @@ -890,7 +857,7 @@ }, "3box>ipfs>libp2p-crypto>asn1.js": { "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, "bn.js": true, "browserify>buffer": true, "pumpify>inherits": true @@ -2049,11 +2016,12 @@ "console.log": true }, "packages": { - "3box>ethers>elliptic": true, "3box>ipfs>libp2p-crypto": true, "3box>orbit-db>orbit-db-cache>level-js": true, "3box>orbit-db>orbit-db-keystore>levelup": true, "3box>orbit-db>orbit-db-keystore>lru": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "eth-trezor-keyring>hdkey>secp256k1": true, "ethereumjs-wallet>safe-buffer": true } @@ -2236,9 +2204,9 @@ }, "@ensdomains/content-hash>cids>multihashes": { "packages": { - "3box>ipfs>varint": true, "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>uint8arrays": true + "@ensdomains/content-hash>cids>uint8arrays": true, + "@ensdomains/content-hash>multihashes>varint": true } }, "@ensdomains/content-hash>cids>uint8arrays": { @@ -2283,17 +2251,17 @@ }, "@ensdomains/content-hash>multihashes": { "packages": { - "3box>ipfs>varint": true, "@ensdomains/content-hash>multihashes>multibase": true, + "@ensdomains/content-hash>multihashes>varint": true, "@ensdomains/content-hash>multihashes>web-encoding": true, "browserify>buffer": true } }, "@ensdomains/content-hash>multihashes>multibase": { "packages": { - "3box>ipfs>bs58>base-x": true, "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "browserify>buffer": true, + "ethereumjs-wallet>bs58check>bs58>base-x": true } }, "@ensdomains/content-hash>multihashes>web-encoding": { @@ -2310,6 +2278,34 @@ "ethers": true } }, + "@eth-optimism/contracts>@ethersproject/abstract-provider": { + "packages": { + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true + } + }, + "@eth-optimism/contracts>@ethersproject/abstract-signer": { + "packages": { + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true + } + }, + "@eth-optimism/contracts>@ethersproject/abstract-provider": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true + } + }, + "@eth-optimism/contracts>@ethersproject/abstract-signer": { + "packages": { + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, "@ethereumjs/common": { "packages": { "@ethereumjs/common>crc-32": true, @@ -2332,6 +2328,31 @@ "ethereumjs-util": true } }, + "@ethersproject/bignumber": { + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@ethersproject/bignumber>bn.js": true + } + }, + "@ethersproject/bignumber>@ethersproject/bytes": { + "packages": { + "@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "@ethersproject/bignumber>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, "@formatjs/intl-relativetimeformat": { "globals": { "Intl": true @@ -2350,7 +2371,7 @@ "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, "@keystonehq/bc-ur-registry-eth>hdkey": true, "browserify>buffer": true, - "ethereumjs-util": true, + "eth-lattice-keyring>@ethereumjs/util": true, "uuid": true } }, @@ -2359,11 +2380,17 @@ "define": true }, "packages": { + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry>tslib": true, "@ngraveio/bc-ur": true, "browserify>buffer": true, "ethereumjs-wallet>bs58check": true } }, + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry>tslib": { + "globals": { + "define": true + } + }, "@keystonehq/bc-ur-registry-eth>hdkey": { "packages": { "@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": true, @@ -2375,14 +2402,14 @@ }, "@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": { "packages": { - "3box>ethers>elliptic": true + "@unstoppabledomains/resolution>elliptic": true } }, "@keystonehq/metamask-airgapped-keyring": { "packages": { "@ethereumjs/tx": true, + "@keystonehq/bc-ur-registry-eth": true, "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/bc-ur-registry-eth": true, "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store": true, "browserify>buffer": true, "browserify>events": true, @@ -2392,37 +2419,32 @@ }, "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { "packages": { - "@keystonehq/bc-ur-registry-eth>hdkey": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@ethereumjs/tx": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@keystonehq/bc-ur-registry-eth": true, + "@ethereumjs/tx": true, + "@keystonehq/bc-ur-registry-eth": true, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey": true, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>rlp": true, "browserify>buffer": true, - "ethereumjs-util": true, + "eth-lattice-keyring>@ethereumjs/util": true, "uuid": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@ethereumjs/tx": { + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey": { "packages": { - "@ethereumjs/common": true, - "browserify>buffer": true, - "ethereumjs-util": true + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey>secp256k1": true, + "browserify>assert": true, + "browserify>crypto-browserify": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>safe-buffer": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@keystonehq/bc-ur-registry-eth": { + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey>secp256k1": { "packages": { - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, - "@keystonehq/bc-ur-registry-eth>hdkey": true, - "browserify>buffer": true, - "ethereumjs-util": true, - "uuid": true + "ethers>@ethersproject/signing-key>elliptic": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/bc-ur-registry-eth": { - "packages": { - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, - "@keystonehq/bc-ur-registry-eth>hdkey": true, - "browserify>buffer": true, - "ethereumjs-util": true, - "uuid": true + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>rlp": { + "globals": { + "TextEncoder": true } }, "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store": { @@ -2633,6 +2655,9 @@ "@ethereumjs/common": true, "@ethereumjs/tx": true, "@metamask/contract-metadata": true, + "@metamask/controllers>@ethersproject/abi": true, + "@metamask/controllers>@ethersproject/contracts": true, + "@metamask/controllers>@ethersproject/providers": true, "@metamask/controllers>abort-controller": true, "@metamask/controllers>async-mutex": true, "@metamask/controllers>eth-json-rpc-infura": true, @@ -2655,7 +2680,6 @@ "eth-rpc-errors": true, "eth-sig-util": true, "ethereumjs-util": true, - "ethers": true, "ethjs>ethjs-unit": true, "immer": true, "json-rpc-engine": true, @@ -2665,6 +2689,103 @@ "uuid": true } }, + "@metamask/controllers>@ethersproject/abi": { + "globals": { + "console.log": true + }, + "packages": { + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true + } + }, + "@metamask/controllers>@ethersproject/contracts": { + "globals": { + "setTimeout": true + }, + "packages": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/abi": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true + } + }, + "@metamask/controllers>@ethersproject/providers": { + "globals": { + "WebSocket": true, + "clearInterval": true, + "clearTimeout": true, + "console.log": true, + "console.warn": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/networks": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/hdnode>@ethersproject/basex": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/pbkdf2>@ethersproject/sha2": true, + "ethers>@ethersproject/providers>bech32": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true, + "ethers>@ethersproject/wallet>@ethersproject/random": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true + } + }, + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true + } + }, + "@metamask/controllers>@ethersproject/providers>@ethersproject/networks": { + "packages": { + "@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "@metamask/controllers>@ethersproject/providers>@ethersproject/rlp": { + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "@metamask/controllers>@ethersproject/providers>@ethersproject/web": { + "globals": { + "clearTimeout": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true + } + }, "@metamask/controllers>abort-controller": { "globals": { "AbortController": true @@ -2725,38 +2846,38 @@ "@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true, "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true, "@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, "browserify>buffer": true, "ethjs>ethjs-filter": true, "ethjs>ethjs-provider-http": true, "ethjs>ethjs-unit": true, "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, "@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": { "packages": { "@metamask/controllers>eth-method-registry>ethjs>bn.js": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, "browserify>buffer": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": { "packages": { "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, "ethjs-query>babel-runtime": true, "ethjs>ethjs-filter": true, "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, "promise-to-callback": true } }, "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": { "packages": { "@metamask/controllers>eth-method-registry>ethjs>bn.js": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, "browserify>buffer": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, @@ -2771,11 +2892,6 @@ "promise-to-callback": true } }, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": { - "packages": { - "browserify>process": true - } - }, "@metamask/controllers>eth-phishing-detect": { "packages": { "eslint>optionator>fast-levenshtein": true @@ -2934,8 +3050,8 @@ }, "@metamask/controllers>web3-provider-engine>eth-sig-util": { "packages": { - "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi": true, - "@metamask/controllers>web3-provider-engine>ethereumjs-util": true + "@metamask/controllers>web3-provider-engine>ethereumjs-util": true, + "ethereumjs-abi": true } }, "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi": { @@ -2947,8 +3063,9 @@ }, "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, @@ -2959,15 +3076,17 @@ }, "@metamask/controllers>web3-provider-engine>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": { @@ -3023,20 +3142,13 @@ "setTimeout": true }, "packages": { - "@metamask/eth-json-rpc-infura>@metamask/utils": true, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware": true, + "eth-block-tracker>@metamask/utils": true, "eth-rpc-errors": true, "json-rpc-engine": true, "node-fetch": true } }, - "@metamask/eth-json-rpc-infura>@metamask/utils": { - "packages": { - "@metamask/eth-json-rpc-infura>@metamask/utils>superstruct": true, - "eslint>fast-deep-equal": true, - "madge>debug": true - } - }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware": { "globals": { "URL": true, @@ -3058,8 +3170,8 @@ }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": { "packages": { - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": true, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true, + "ethereumjs-abi": true } }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": { @@ -3071,8 +3183,9 @@ }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, @@ -3083,15 +3196,17 @@ }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": { @@ -3113,32 +3228,34 @@ "packages": { "@ethereumjs/tx": true, "@metamask/eth-ledger-bridge-keyring>eth-sig-util": true, - "@metamask/eth-ledger-bridge-keyring>hdkey": true, "browserify>buffer": true, "browserify>events": true, + "eth-trezor-keyring>hdkey": true, "ethereumjs-util": true } }, "@metamask/eth-ledger-bridge-keyring>eth-sig-util": { "packages": { - "3box>tweetnacl": true, - "3box>tweetnacl-util": true, "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util": true, "browserify>buffer": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true, "ethereumjs-abi": true } }, "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>ethjs-util": { @@ -3148,30 +3265,42 @@ "ethjs>ethjs-util>strip-hex-prefix": true } }, - "@metamask/eth-ledger-bridge-keyring>hdkey": { - "packages": { - "browserify>assert": true, - "browserify>crypto-browserify": true, - "eth-trezor-keyring>hdkey>coinstring": true, - "eth-trezor-keyring>hdkey>secp256k1": true, - "ethereumjs-wallet>safe-buffer": true - } - }, "@metamask/eth-token-tracker": { "globals": { "console.warn": true }, "packages": { "@babel/runtime": true, + "@metamask/eth-token-tracker>deep-equal": true, "@metamask/eth-token-tracker>eth-block-tracker": true, "@metamask/eth-token-tracker>ethjs": true, "@metamask/eth-token-tracker>human-standard-token-abi": true, "ethjs-contract": true, "ethjs-query": true, - "nock>deep-equal": true, "safe-event-emitter": true } }, + "@metamask/eth-token-tracker>deep-equal": { + "packages": { + "@metamask/eth-token-tracker>deep-equal>is-arguments": true, + "@metamask/eth-token-tracker>deep-equal>is-date-object": true, + "enzyme>is-regex": true, + "enzyme>object-is": true, + "mocha>object.assign>object-keys": true, + "string.prototype.matchall>regexp.prototype.flags": true + } + }, + "@metamask/eth-token-tracker>deep-equal>is-arguments": { + "packages": { + "koa>is-generator-function>has-tostringtag": true, + "string.prototype.matchall>call-bind": true + } + }, + "@metamask/eth-token-tracker>deep-equal>is-date-object": { + "packages": { + "koa>is-generator-function>has-tostringtag": true + } + }, "@metamask/eth-token-tracker>eth-block-tracker": { "globals": { "clearTimeout": true, @@ -3194,38 +3323,38 @@ "@metamask/eth-token-tracker>ethjs>ethjs-abi": true, "@metamask/eth-token-tracker>ethjs>ethjs-contract": true, "@metamask/eth-token-tracker>ethjs>ethjs-query": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, "browserify>buffer": true, "ethjs>ethjs-filter": true, "ethjs>ethjs-provider-http": true, "ethjs>ethjs-unit": true, "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, "@metamask/eth-token-tracker>ethjs>ethjs-abi": { "packages": { "@metamask/eth-token-tracker>ethjs>bn.js": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, "browserify>buffer": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, "@metamask/eth-token-tracker>ethjs>ethjs-contract": { "packages": { "@metamask/eth-token-tracker>ethjs>ethjs-contract>ethjs-abi": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, "ethjs-query>babel-runtime": true, "ethjs>ethjs-filter": true, "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, "promise-to-callback": true } }, "@metamask/eth-token-tracker>ethjs>ethjs-contract>ethjs-abi": { "packages": { "@metamask/eth-token-tracker>ethjs>bn.js": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, "browserify>buffer": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, @@ -3240,11 +3369,6 @@ "promise-to-callback": true } }, - "@metamask/eth-token-tracker>ethjs>js-sha3": { - "packages": { - "browserify>process": true - } - }, "@metamask/etherscan-link": { "globals": { "URL": true @@ -3314,6 +3438,11 @@ "watchify>xtend": true } }, + "@metamask/rpc-methods>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, "@metamask/smart-transactions-controller": { "globals": { "URLSearchParams": true, @@ -3324,34 +3453,167 @@ "setInterval": true }, "packages": { - "@metamask/controllers": true, + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@metamask/controllers>@ethersproject/providers": true, "@metamask/controllers>isomorphic-fetch": true, + "@metamask/smart-transactions-controller>@metamask/controllers": true, "@metamask/smart-transactions-controller>bignumber.js": true, "@metamask/smart-transactions-controller>fast-json-patch": true, - "ethers": true, "lodash": true } }, - "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { + "@metamask/smart-transactions-controller>@metamask/controllers": { "globals": { - "crypto.getRandomValues": true + "Headers": true, + "URL": true, + "clearInterval": true, + "clearTimeout": true, + "console.error": true, + "console.log": true, + "fetch": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "@ethereumjs/common": true, + "@ethereumjs/tx": true, + "@metamask/contract-metadata": true, + "@metamask/controllers>@ethersproject/abi": true, + "@metamask/controllers>@ethersproject/contracts": true, + "@metamask/controllers>@ethersproject/providers": true, + "@metamask/controllers>abort-controller": true, + "@metamask/controllers>async-mutex": true, + "@metamask/controllers>eth-json-rpc-infura": true, + "@metamask/controllers>eth-phishing-detect": true, + "@metamask/controllers>isomorphic-fetch": true, + "@metamask/controllers>multiformats": true, + "@metamask/controllers>web3": true, + "@metamask/controllers>web3-provider-engine": true, + "@metamask/metamask-eth-abis": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": true, + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": true, + "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": true, + "browserify>buffer": true, + "browserify>events": true, + "deep-freeze-strict": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true, + "eth-keyring-controller": true, + "eth-query": true, + "eth-rpc-errors": true, + "eth-sig-util": true, + "ethereumjs-util": true, + "ethjs>ethjs-unit": true, + "immer": true, + "json-rpc-engine": true, + "jsonschema": true, + "punycode": true, + "single-call-balance-checker-abi": true, + "uuid": true } }, - "@metamask/smart-transactions-controller>bignumber.js": { - "globals": { - "crypto": true, - "define": true + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": true } }, - "@metamask/smart-transactions-controller>fast-json-patch": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": { "globals": { - "addEventListener": true, - "clearTimeout": true, - "removeEventListener": true, - "setTimeout": true - } - }, - "@metamask/snap-controllers>nanoid": { + "clearInterval": true, + "setInterval": true + }, + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true, + "browserify>buffer": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-provider-http": true, + "ethjs>ethjs-unit": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true, + "ethjs-query>babel-runtime": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "promise-to-callback": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": { + "globals": { + "console": true + }, + "packages": { + "ethjs-query>babel-runtime": true, + "ethjs-query>ethjs-format": true, + "ethjs-query>ethjs-rpc": true, + "promise-to-callback": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": true, + "@truffle/codec>utf8": true, + "browserify>buffer": true, + "browserify>crypto-browserify": true, + "ethereumjs-util": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-wallet>aes-js": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>randombytes": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": { + "globals": { + "crypto": true, + "msCrypto": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, + "@metamask/smart-transactions-controller>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@metamask/smart-transactions-controller>fast-json-patch": { + "globals": { + "addEventListener": true, + "clearTimeout": true, + "removeEventListener": true, + "setTimeout": true + } + }, + "@metamask/snap-controllers>nanoid": { "globals": { "crypto.getRandomValues": true } @@ -3411,6 +3673,14 @@ "redux-thunk": true } }, + "@segment/loosely-validate-event": { + "packages": { + "@segment/loosely-validate-event>component-type": true, + "@segment/loosely-validate-event>join-component": true, + "browserify>assert": true, + "browserify>buffer": true + } + }, "@sentry/browser": { "globals": { "XMLHttpRequest": true, @@ -3524,11 +3794,6 @@ "localStorage": true } }, - "@storybook/react>@storybook/store>stable": { - "globals": { - "define": true - } - }, "@truffle/codec": { "packages": { "@truffle/codec>@truffle/abi-utils": true, @@ -3544,7 +3809,7 @@ "browserify>buffer": true, "browserify>util": true, "gulp-dart-sass>lodash.clonedeep": true, - "madge>debug": true, + "nock>debug": true, "semver": true } }, @@ -3756,7 +4021,15 @@ }, "@truffle/codec>web3-utils>ethereum-bloom-filters": { "packages": { - "ethers>@ethersproject/keccak256>js-sha3": true + "@truffle/codec>web3-utils>ethereum-bloom-filters>js-sha3": true + } + }, + "@truffle/codec>web3-utils>ethereum-bloom-filters>js-sha3": { + "globals": { + "define": true + }, + "packages": { + "browserify>process": true } }, "@truffle/decoder": { @@ -3767,7 +4040,7 @@ "@truffle/codec>web3-utils": true, "@truffle/decoder>@truffle/source-map-utils": true, "@truffle/decoder>bn.js": true, - "madge>debug": true + "nock>debug": true } }, "@truffle/decoder>@truffle/source-map-utils": { @@ -3777,7 +4050,7 @@ "@truffle/decoder>@truffle/source-map-utils>@truffle/code-utils": true, "@truffle/decoder>@truffle/source-map-utils>json-pointer": true, "@truffle/decoder>@truffle/source-map-utils>node-interval-tree": true, - "madge>debug": true + "nock>debug": true } }, "@truffle/decoder>@truffle/source-map-utils>@truffle/code-utils": { @@ -3804,107 +4077,194 @@ "browserify>browser-resolve": true } }, - "@zxing/browser": { + "@unstoppabledomains/resolution": { "globals": { - "HTMLElement": true, - "HTMLImageElement": true, - "HTMLVideoElement": true, - "URL.createObjectURL": true, - "clearTimeout": true, - "console.error": true, - "console.warn": true, - "document": true, - "navigator": true, - "setTimeout": true + "__values": true }, "packages": { - "@zxing/library": true + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "@unstoppabledomains/resolution>cross-fetch": true, + "@unstoppabledomains/resolution>crypto-js": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>buffer": true, + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "@zxing/library": { + "@unstoppabledomains/resolution>@ethersproject/abi": { "globals": { - "TextDecoder": true, - "TextEncoder": true, - "btoa": true, - "clearTimeout": true, + "console.log": true + }, + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true + } + }, + "@unstoppabledomains/resolution>cross-fetch": { + "globals": { + "Blob": true, + "FileReader": true, + "FormData": true, + "URLSearchParams.prototype.isPrototypeOf": true, + "XMLHttpRequest": true + } + }, + "@unstoppabledomains/resolution>crypto-js": { + "globals": { + "crypto": true, "define": true, - "document.createElement": true, - "document.createElementNS": true, - "document.getElementById": true, - "navigator.mediaDevices.enumerateDevices": true, - "navigator.mediaDevices.getUserMedia": true, - "setTimeout": true + "msCrypto": true + }, + "packages": { + "browserify>browser-resolve": true } }, - "addons-linter>sha.js": { + "@unstoppabledomains/resolution>elliptic": { "packages": { - "ethereumjs-wallet>safe-buffer": true, + "@unstoppabledomains/resolution>elliptic>brorand": true, + "@unstoppabledomains/resolution>elliptic>hmac-drbg": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-crypto-utils": true, + "bn.js": true, + "ethers>@ethersproject/sha2>hash.js": true, "pumpify>inherits": true } }, - "analytics-node": { + "@unstoppabledomains/resolution>elliptic>brorand": { "globals": { - "clearTimeout": true, - "console.log": true, - "setImmediate": true, - "setTimeout": true + "crypto": true, + "msCrypto": true }, "packages": { - "analytics-node>@segment/loosely-validate-event": true, - "analytics-node>axios": true, - "analytics-node>axios-retry": true, - "analytics-node>lodash.isstring": true, - "analytics-node>md5": true, - "analytics-node>ms": true, - "analytics-node>remove-trailing-slash": true, - "analytics-node>uuid": true, - "browserify>assert": true, - "browserify>process": true + "browserify>browser-resolve": true } }, - "analytics-node>@segment/loosely-validate-event": { + "@unstoppabledomains/resolution>elliptic>hmac-drbg": { "packages": { - "analytics-node>@segment/loosely-validate-event>component-type": true, - "analytics-node>@segment/loosely-validate-event>join-component": true, - "browserify>assert": true, - "browserify>buffer": true + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-crypto-utils": true, + "ethers>@ethersproject/sha2>hash.js": true } }, - "analytics-node>axios": { + "@unstoppabledomains/resolution": { "globals": { - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true + "__values": true }, "packages": { - "browserify>process": true + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "@unstoppabledomains/resolution>cross-fetch": true, + "@unstoppabledomains/resolution>crypto-js": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>buffer": true, + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "analytics-node>axios-retry": { + "@unstoppabledomains/resolution>@ethersproject/abi": { "globals": { - "setTimeout": true + "console.log": true + }, + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true + } + }, + "@unstoppabledomains/resolution>cross-fetch": { + "globals": { + "Blob": true, + "FileReader": true, + "FormData": true, + "URLSearchParams.prototype.isPrototypeOf": true, + "XMLHttpRequest": true + } + }, + "@unstoppabledomains/resolution>crypto-js": { + "globals": { + "crypto": true, + "define": true, + "msCrypto": true }, "packages": { - "geckodriver>got>is-retry-allowed": true + "browserify>browser-resolve": true } }, - "analytics-node>md5": { + "@unstoppabledomains/resolution>elliptic": { "packages": { - "analytics-node>md5>charenc": true, - "analytics-node>md5>crypt": true, - "browserify>insert-module-globals>is-buffer": true + "@unstoppabledomains/resolution>elliptic>brorand": true, + "@unstoppabledomains/resolution>elliptic>hmac-drbg": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-crypto-utils": true, + "bn.js": true, + "ethers>@ethersproject/sha2>hash.js": true, + "pumpify>inherits": true } }, - "analytics-node>uuid": { + "@unstoppabledomains/resolution>elliptic>brorand": { "globals": { "crypto": true, "msCrypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "@unstoppabledomains/resolution>elliptic>hmac-drbg": { + "packages": { + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-crypto-utils": true, + "ethers>@ethersproject/sha2>hash.js": true + } + }, + "@zxing/browser": { + "globals": { + "HTMLElement": true, + "HTMLImageElement": true, + "HTMLVideoElement": true, + "URL.createObjectURL": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true + }, + "packages": { + "@zxing/library": true + } + }, + "@zxing/library": { + "globals": { + "TextDecoder": true, + "TextEncoder": true, + "btoa": true, + "clearTimeout": true, + "define": true, + "document.createElement": true, + "document.createElementNS": true, + "document.getElementById": true, + "navigator.mediaDevices.enumerateDevices": true, + "navigator.mediaDevices.getUserMedia": true, + "setTimeout": true + } + }, + "addons-linter>sha.js": { + "packages": { + "ethereumjs-wallet>safe-buffer": true, + "pumpify>inherits": true } }, "await-semaphore": { @@ -3998,7 +4358,7 @@ }, "browserify>crypto-browserify>browserify-cipher>browserify-des>des.js": { "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, "pumpify>inherits": true } }, @@ -4010,7 +4370,7 @@ }, "browserify>crypto-browserify>browserify-sign": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>buffer": true, "browserify>crypto-browserify>create-hmac": true, @@ -4018,14 +4378,16 @@ "browserify>crypto-browserify>public-encrypt>parse-asn1": true, "browserify>stream-browserify": true, "ethereumjs-util>create-hash": true, + "ethers>@ethersproject/signing-key>elliptic": true, "pumpify>inherits": true } }, "browserify>crypto-browserify>create-ecdh": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, - "browserify>buffer": true + "browserify>buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "browserify>crypto-browserify>create-hmac": { @@ -4048,7 +4410,7 @@ }, "browserify>crypto-browserify>diffie-hellman>miller-rabin": { "packages": { - "3box>ethers>elliptic>brorand": true, + "@unstoppabledomains/resolution>elliptic>brorand": true, "bn.js": true } }, @@ -4096,10 +4458,11 @@ }, "browserify>crypto-browserify>public-encrypt>parse-asn1>asn1.js": { "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, "bn.js": true, "browserify>buffer": true, "browserify>vm-browserify": true, + "ethers>@ethersproject/sha2>hash.js>minimalistic-assert": true, "pumpify>inherits": true } }, @@ -4324,25 +4687,17 @@ }, "enzyme>is-regex": { "packages": { - "enzyme>is-regex>has-tostringtag": true, + "koa>is-generator-function>has-tostringtag": true, "string.prototype.matchall>call-bind": true } }, - "enzyme>is-regex>has-tostringtag": { + "enzyme>object-is": { "packages": { - "string.prototype.matchall>has-symbols": true + "globalthis>define-properties": true, + "string.prototype.matchall>call-bind": true } }, - "enzyme>object-inspect": { - "globals": { - "HTMLElement": true, - "WeakRef": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "eslint>optionator>fast-levenshtein": { + "eslint>optionator>fast-levenshtein": { "globals": { "Intl": true, "Levenshtein": "write", @@ -4366,10 +4721,14 @@ } }, "eth-block-tracker>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "eslint>fast-deep-equal": true, - "eth-block-tracker>@metamask/utils>superstruct": true, - "madge>debug": true + "@metamask/snap-utils>superstruct": true, + "browserify>buffer": true, + "nock>debug": true } }, "eth-ens-namehash": { @@ -4425,8 +4784,8 @@ }, "packages": { "browserify>browser-resolve": true, - "eth-json-rpc-middleware>@metamask/utils": true, - "eth-json-rpc-middleware>eth-sig-util": true, + "eth-block-tracker>@metamask/utils": true, + "eth-json-rpc-middleware>@metamask/eth-sig-util": true, "eth-json-rpc-middleware>pify": true, "eth-rpc-errors": true, "json-rpc-engine": true, @@ -4435,29 +4794,29 @@ "vinyl>clone": true } }, - "eth-json-rpc-middleware>@metamask/utils": { - "packages": { - "eslint>fast-deep-equal": true, - "eth-json-rpc-middleware>@metamask/utils>superstruct": true, - "madge>debug": true - } - }, - "eth-json-rpc-middleware>eth-sig-util": { + "eth-json-rpc-middleware>@metamask/eth-sig-util": { "packages": { - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": true, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true + "browserify>buffer": true, + "eth-json-rpc-middleware>@metamask/eth-sig-util>bn.js": true, + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethereum-cryptography": true, + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethjs-util": true, + "eth-lattice-keyring>@ethereumjs/util": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true } }, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": { + "eth-json-rpc-middleware>@metamask/eth-sig-util>bn.js": { "packages": { - "bn.js": true, - "browserify>buffer": true, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": true + "browserify>browser-resolve": true } }, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": { + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true + }, "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, @@ -4469,7 +4828,7 @@ }, "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, @@ -4480,7 +4839,7 @@ "ethereumjs-wallet>safe-buffer": true } }, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": { + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethjs-util": { "packages": { "browserify>buffer": true, "ethjs>ethjs-util>is-hex-prefixed": true, @@ -4593,22 +4952,64 @@ "clearInterval": true, "fetch": true, "open": true, - "setInterval": true, - "txData.type": true + "setInterval": true }, "packages": { - "@ethereumjs/common": true, - "@ethereumjs/tx": true, "browserify>buffer": true, "browserify>crypto-browserify": true, "browserify>events": true, + "eth-lattice-keyring>@ethereumjs/tx": true, + "eth-lattice-keyring>@ethereumjs/util": true, "eth-lattice-keyring>bn.js": true, "eth-lattice-keyring>gridplus-sdk": true, - "eth-lattice-keyring>rlp": true, - "eth-lattice-keyring>secp256k1": true, + "eth-lattice-keyring>rlp": true + } + }, + "eth-lattice-keyring>@ethereumjs/tx": { + "packages": { + "@ethereumjs/common": true, + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, "ethereumjs-util": true } }, + "eth-lattice-keyring>@ethereumjs/util": { + "packages": { + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "eth-lattice-keyring>@ethereumjs/util>@ethereumjs/rlp": true, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography": true + } + }, + "eth-lattice-keyring>@ethereumjs/util>@ethereumjs/rlp": { + "globals": { + "TextEncoder": true + } + }, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true + }, + "packages": { + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/hashes": true, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/secp256k1": true + } + }, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true + } + }, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/secp256k1": { + "globals": { + "crypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, "eth-lattice-keyring>bn.js": { "globals": { "Buffer": true @@ -4619,35 +5020,72 @@ }, "eth-lattice-keyring>gridplus-sdk": { "globals": { + "ActiveXObject": true, + "AbortController": true, + "Request": true, "__values": true, + "caches": true, + "clearTimeout": true, + "console.error": true, + "document": true, "console.log": true, "console.warn": true, + "fetch": true, "setTimeout": true }, "packages": { - "3box>ethers>elliptic": true, "@ethereumjs/common": true, "@ethereumjs/common>crc-32": true, - "@ethereumjs/tx": true, + "@metamask/controllers>@ethersproject/abi": true, + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>buffer": true, "browserify>process": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": true, "eth-lattice-keyring>gridplus-sdk>bech32": true, "eth-lattice-keyring>gridplus-sdk>bignumber.js": true, "eth-lattice-keyring>gridplus-sdk>bitwise": true, "eth-lattice-keyring>gridplus-sdk>borc": true, "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": true, + "eth-lattice-keyring>gridplus-sdk>js-sha3": true, "eth-lattice-keyring>gridplus-sdk>rlp": true, - "eth-lattice-keyring>gridplus-sdk>secp256k1": true, - "eth-lattice-keyring>gridplus-sdk>superagent": true, "ethereumjs-wallet>aes-js": true, "ethereumjs-wallet>bs58check": true, - "ethers>@ethersproject/abi": true, "ethers>@ethersproject/keccak256>js-sha3": true, "ethers>@ethersproject/sha2>hash.js": true, + "ethers>@ethersproject/signing-key>elliptic": true, + "ganache>secp256k1": true, "lodash": true } }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": { + "packages": { + "@ethereumjs/common>crc-32": true, + "browserify>buffer": true, + "browserify>events": true, + "ethereumjs-util": true + } + }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": { + "packages": { + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": true, + "ethereumjs-util": true + } + }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": { + "packages": { + "@ethereumjs/common>crc-32": true, + "browserify>buffer": true, + "browserify>events": true, + "ethereumjs-util": true + } + }, "eth-lattice-keyring>gridplus-sdk>bignumber.js": { "globals": { "crypto": true, @@ -4664,10 +5102,10 @@ "console": true }, "packages": { - "3box>ipfs>iso-url": true, "browserify>buffer": true, "browserify>buffer>ieee754": true, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true, + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": true } }, "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { @@ -4676,14 +5114,19 @@ "define": true } }, + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": { + "globals": { + "URL": true, + "URLSearchParams": true, + "location": true + } + }, "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { "globals": { "intToBuffer": true }, "packages": { - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>bn.js": true, - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>buffer": true, - "ethers>@ethersproject/keccak256>js-sha3": true + "3box>ethers>elliptic": true } }, "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>bn.js": { @@ -4703,41 +5146,30 @@ "browserify>buffer>ieee754": true } }, - "eth-lattice-keyring>gridplus-sdk>rlp": { + "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>js-sha3": { "globals": { - "TextEncoder": true - } - }, - "eth-lattice-keyring>gridplus-sdk>secp256k1": { + "define": true + }, "packages": { - "3box>ethers>elliptic": true + "@unstoppabledomains/resolution>elliptic": true } }, - "eth-lattice-keyring>gridplus-sdk>superagent": { + "eth-lattice-keyring>gridplus-sdk>js-sha3": { "globals": { - "XMLHttpRequest": true, - "btoa": true, - "clearTimeout": true, - "console.error": true, - "console.warn": true, - "setTimeout": true + "define": true }, "packages": { - "browserify>browser-resolve": true, - "browserify>process": true, - "eth-rpc-errors>fast-safe-stringify": true, - "nock>qs": true, - "pubnub>superagent>component-emitter": true + "browserify>process": true } }, - "eth-lattice-keyring>rlp": { + "eth-lattice-keyring>gridplus-sdk>rlp": { "globals": { "TextEncoder": true } }, - "eth-lattice-keyring>secp256k1": { - "packages": { - "3box>ethers>elliptic": true + "eth-lattice-keyring>rlp": { + "globals": { + "TextEncoder": true } }, "eth-method-registry": { @@ -4748,7 +5180,7 @@ "eth-query": { "packages": { "eth-query>json-rpc-random-id": true, - "madge>debug": true, + "nock>debug": true, "watchify>xtend": true } }, @@ -4759,16 +5191,16 @@ }, "eth-sig-util": { "packages": { - "3box>tweetnacl": true, - "3box>tweetnacl-util": true, "browserify>buffer": true, "eth-sig-util>ethereumjs-util": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true, "ethereumjs-abi": true } }, "eth-sig-util>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, @@ -4776,7 +5208,8 @@ "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "eth-sig-util>ethereumjs-util>ethjs-util": { @@ -4786,6 +5219,25 @@ "ethjs>ethjs-util>strip-hex-prefix": true } }, + "eth-sig-util>tweetnacl": { + "globals": { + "crypto": true, + "msCrypto": true, + "nacl": "write" + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "eth-sig-util>tweetnacl-util": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, "eth-trezor-keyring": { "globals": { "setTimeout": true @@ -4801,9 +5253,9 @@ }, "eth-trezor-keyring>@metamask/eth-sig-util": { "packages": { - "3box>tweetnacl": true, - "3box>tweetnacl-util": true, "browserify>buffer": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true, "eth-trezor-keyring>@metamask/eth-sig-util>ethereumjs-util": true, "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": true, "ethereumjs-abi": true @@ -4811,14 +5263,15 @@ }, "eth-trezor-keyring>@metamask/eth-sig-util>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "ethereumjs-util>rlp": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": { @@ -4846,13 +5299,13 @@ }, "eth-trezor-keyring>hdkey>secp256k1": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>insert-module-globals>is-buffer": true, "eth-trezor-keyring>hdkey>secp256k1>bip66": true, - "eth-trezor-keyring>hdkey>secp256k1>drbg.js": true, "ethereumjs-util>create-hash": true, - "ethereumjs-wallet>safe-buffer": true + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "eth-trezor-keyring>hdkey>secp256k1>bip66": { @@ -4860,12 +5313,6 @@ "ethereumjs-wallet>safe-buffer": true } }, - "eth-trezor-keyring>hdkey>secp256k1>drbg.js": { - "packages": { - "browserify>buffer": true, - "browserify>crypto-browserify>create-hmac": true - } - }, "eth-trezor-keyring>trezor-connect": { "globals": { "__TREZOR_CONNECT_SRC": true, @@ -4888,10 +5335,21 @@ "setTimeout": true }, "packages": { - "3box>graphql-request>cross-fetch": true, "@babel/runtime": true, + "@unstoppabledomains/resolution>cross-fetch": true, + "@unstoppabledomains/resolution>cross-fetch": true, "browserify>events": true, - "eth-trezor-keyring>@metamask/eth-sig-util": true + "eth-trezor-keyring>@metamask/eth-sig-util": true, + "eth-trezor-keyring>trezor-connect>cross-fetch": true + } + }, + "eth-trezor-keyring>trezor-connect>cross-fetch": { + "globals": { + "Blob": true, + "FileReader": true, + "FormData": true, + "URLSearchParams.prototype.isPrototypeOf": true, + "XMLHttpRequest": true } }, "ethereumjs-abi": { @@ -4903,14 +5361,15 @@ }, "ethereumjs-abi>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "ethereumjs-abi>ethereumjs-util>ethjs-util": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "ethereumjs-util>rlp": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "ethereumjs-abi>ethereumjs-util>ethjs-util": { @@ -4928,7 +5387,6 @@ "ethereumjs-util>bn.js": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>ethjs-util": true, "ethereumjs-util>rlp": true } }, @@ -5002,12 +5460,6 @@ "ethers>@ethersproject/sha2>hash.js": true } }, - "ethereumjs-util>ethereum-cryptography>blakejs": { - "globals": { - "TextEncoder": true, - "console.log": true - } - }, "ethereumjs-util>ethereum-cryptography>browserify-aes": { "packages": { "browserify>buffer": true, @@ -5042,14 +5494,7 @@ }, "ethereumjs-util>ethereum-cryptography>secp256k1": { "packages": { - "3box>ethers>elliptic": true - } - }, - "ethereumjs-util>ethjs-util": { - "packages": { - "browserify>buffer": true, - "ethjs>ethjs-util>is-hex-prefixed": true, - "ethjs>ethjs-util>strip-hex-prefix": true + "@unstoppabledomains/resolution>elliptic": true } }, "ethereumjs-util>rlp": { @@ -5086,21 +5531,32 @@ }, "ethereumjs-wallet>bs58check": { "packages": { - "3box>ipfs>bs58": true, "ethereumjs-util>create-hash": true, + "ethereumjs-wallet>bs58check>bs58": true, + "ethereumjs-wallet>safe-buffer": true + } + }, + "ethereumjs-wallet>bs58check>bs58": { + "packages": { + "ethereumjs-wallet>bs58check>bs58>base-x": true + } + }, + "ethereumjs-wallet>bs58check>bs58>base-x": { + "packages": { "ethereumjs-wallet>safe-buffer": true } }, "ethereumjs-wallet>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, "ethereumjs-util>rlp": true, - "ethereumjs-wallet>ethereumjs-util>ethjs-util": true + "ethereumjs-wallet>ethereumjs-util>ethjs-util": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "ethereumjs-wallet>ethereumjs-util>ethjs-util": { @@ -5173,323 +5629,1342 @@ "console.log": true }, "packages": { - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/address": true, + "ethers>@ethersproject/abi>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/constants": true, + "ethers>@ethersproject/abi>@ethersproject/hash": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/strings": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/hash": true, - "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/properties": true } }, - "ethers>@ethersproject/abstract-provider": { + "ethers>@ethersproject/abi>@ethersproject/address": { "packages": { - "ethers>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/abi>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "ethers>@ethersproject/logger": true } }, - "ethers>@ethersproject/abstract-signer": { + "ethers>@ethersproject/abi>@ethersproject/address>@ethersproject/rlp": { "packages": { - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "ethers>@ethersproject/address": { + "ethers>@ethersproject/abi>@ethersproject/bignumber": { "packages": { - "ethers>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/bignumber>bn.js": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/rlp": true + "ethers>@ethersproject/logger": true } }, - "ethers>@ethersproject/base64": { + "ethers>@ethersproject/abi>@ethersproject/bignumber>bn.js": { "globals": { - "atob": true, - "btoa": true + "Buffer": true }, "packages": { - "ethers>@ethersproject/bytes": true + "browserify>browser-resolve": true } }, - "ethers>@ethersproject/basex": { + "ethers>@ethersproject/abi>@ethersproject/constants": { "packages": { + "ethers>@ethersproject/abi>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/hash": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/address": true, + "ethers>@ethersproject/abi>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/strings": true, "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true } }, - "ethers>@ethersproject/bignumber": { + "ethers>@ethersproject/abi>@ethersproject/keccak256": { "packages": { - "bn.js": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/constants": true, "ethers>@ethersproject/bytes": true, "ethers>@ethersproject/logger": true } }, - "ethers>@ethersproject/bytes": { + "ethers>@ethersproject/abstract-signer": { + "packages": { + "ethers>@ethersproject/abstract-signer>@ethersproject/logger": true, + "ethers>@ethersproject/abstract-signer>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/abstract-signer>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/abstract-signer>@ethersproject/properties": { "packages": { + "ethers>@ethersproject/abstract-signer>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/address>@ethersproject/bignumber": true, + "ethers>@ethersproject/address>@ethersproject/keccak256": true, + "ethers>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/bytes": true, "ethers>@ethersproject/logger": true } }, - "ethers>@ethersproject/constants": { + "ethers>@ethersproject/address>@ethersproject/bignumber": { "packages": { - "ethers>@ethersproject/bignumber": true + "ethers>@ethersproject/address>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "ethers>@ethersproject/contracts": { + "ethers>@ethersproject/address>@ethersproject/bignumber>bn.js": { "globals": { - "setTimeout": true + "Buffer": true }, "packages": { - "ethers>@ethersproject/abi": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, - "ethers>@ethersproject/bytes": true, + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/address>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/address>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "ethers>@ethersproject/base64>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/base64>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/base64>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/base64>@ethersproject/bytes>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/basex": { + "packages": { + "ethers>@ethersproject/basex>@ethersproject/bytes": true, + "ethers>@ethersproject/basex>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/basex>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/basex>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/basex>@ethersproject/bytes>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/basex>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/basex>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/bignumber": { + "packages": { + "bn.js": true, + "ethers>@ethersproject/bignumber>@ethersproject/bytes": true, + "ethers>@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/bignumber>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/bignumber>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/bytes>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/constants>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/constants>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/constants>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/contracts": { + "globals": { + "setTimeout": true + }, + "packages": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi": { + "globals": { + "console.log": true + }, + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/strings": true, + "ethers>@ethersproject/contracts>@ethersproject/address": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/constants": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash>@ethersproject/base64": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/strings": true, + "ethers>@ethersproject/contracts>@ethersproject/address": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/constants": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abstract-provider": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abstract-signer": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/address>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/transactions": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/address": true, + "ethers>@ethersproject/contracts>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/constants": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true, + "ethers>@ethersproject/contracts>@ethersproject/transactions>@ethersproject/signing-key": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/transactions>@ethersproject/signing-key": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true, + "ethers>@ethersproject/signing-key>elliptic": true + } + }, + "ethers>@ethersproject/hash": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/address": true, + "ethers>@ethersproject/hash>@ethersproject/bignumber": true, + "ethers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/hash>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/hash>@ethersproject/bignumber": true, + "ethers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/address>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/strings>@ethersproject/constants": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/strings>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/hdnode": { + "packages": { + "ethers>@ethersproject/basex": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/pbkdf2": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true, + "ethers>@ethersproject/wordlists": true + } + }, + "ethers>@ethersproject/hdnode>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/units>@ethersproject/constants": true + } + }, + "ethers>@ethersproject/json-wallets": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/json-wallets>aes-js": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/pbkdf2": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true + } + }, + "ethers>@ethersproject/json-wallets>aes-js": { + "globals": { + "define": true + } + }, + "ethers>@ethersproject/json-wallets>scrypt-js": { + "globals": { + "define": true, + "setTimeout": true + }, + "packages": { + "browserify>timers-browserify": true + } + }, + "ethers>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/keccak256>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/keccak256>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/keccak256>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/keccak256>@ethersproject/bytes>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/keccak256>js-sha3": { + "globals": { + "define": true + }, + "packages": { + "browserify>process": true + } + }, + "ethers>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/pbkdf2": { + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true + } + }, + "ethers>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/properties>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/properties>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/providers": { + "globals": { + "WebSocket": true, + "clearInterval": true, + "clearTimeout": true, + "console.log": true, + "console.warn": true, + "name": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/basex": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/networks": true, + "ethers>@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/providers>bech32": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/networks": { + "packages": { + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/web": { + "globals": { + "clearTimeout": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "ethers>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/random": { + "globals": { + "crypto.getRandomValues": true + }, + "packages": { + "ethers>@ethersproject/random>@ethersproject/bytes": true, + "ethers>@ethersproject/random>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/random>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/random>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/random>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/rlp>@ethersproject/bytes": true, + "ethers>@ethersproject/rlp>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/rlp>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/rlp>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/rlp>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/sha2": { + "packages": { + "ethers>@ethersproject/sha2>@ethersproject/bytes": true, + "ethers>@ethersproject/sha2>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true + } + }, + "ethers>@ethersproject/sha2>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/sha2>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/sha2>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/sha2>hash.js": { + "packages": { + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "pumpify>inherits": true + } + }, + "ethers>@ethersproject/signing-key": { + "packages": { + "@unstoppabledomains/resolution>elliptic": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/signing-key>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/signing-key>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/signing-key>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/signing-key>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/signing-key>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/signing-key>elliptic": { + "packages": { + "bn.js": true, + "ethers>@ethersproject/sha2>hash.js": true, + "ethers>@ethersproject/sha2>hash.js>minimalistic-assert": true, + "ethers>@ethersproject/signing-key>elliptic>brorand": true, + "ethers>@ethersproject/signing-key>elliptic>hmac-drbg": true, + "ethers>@ethersproject/signing-key>elliptic>minimalistic-crypto-utils": true, + "pumpify>inherits": true + } + }, + "ethers>@ethersproject/signing-key>elliptic>brorand": { + "globals": { + "crypto": true, + "msCrypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/signing-key>elliptic>hmac-drbg": { + "packages": { + "ethers>@ethersproject/sha2>hash.js": true, + "ethers>@ethersproject/sha2>hash.js>minimalistic-assert": true, + "ethers>@ethersproject/signing-key>elliptic>minimalistic-crypto-utils": true + } + }, + "ethers>@ethersproject/solidity": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true + } + }, + "ethers>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/strings>@ethersproject/bytes": true, + "ethers>@ethersproject/strings>@ethersproject/logger": true, + "ethers>@ethersproject/strings>@ethersproject/strings>@ethersproject/constants": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/strings>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/strings>@ethersproject/bytes": true, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/strings>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/transactions": { + "globals": { + "console.log": true + }, + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/transactions>@ethersproject/address": true, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true, + "ethers>@ethersproject/transactions>@ethersproject/constants": true, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": true, + "ethers>@ethersproject/transactions>@ethersproject/transactions>@ethersproject/address": true, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true, + "ethers>@ethersproject/transactions>@ethersproject/constants": true, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": true, + "ethers>@ethersproject/transactions>@ethersproject/rlp": true, + "ethers>@ethersproject/trantransactions>@ethersproject/sactions>@ethersproject/signing-key": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/rlp": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/keccak256>js-sha3": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/signing-key": { + "packages": { + "ethers>@ethersproject/signing-key>elliptic": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": true, + "ethers>@ethersproject/transactions>@ethersproject/rlp": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": true, + "ethers>@ethersproject/transactions>@ethersproject/rlp": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/signing-key": { + "packages": { + "@unstoppabledomains/resolution>elliptic": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/units": { + "packages": { + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/units>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/units>@ethersproject/bignumber>bn.js": true + } + }, + "ethers>@ethersproject/units>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/units>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/units>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/units>@ethersproject/constants": { + "packages": { + "@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/signing-key": { + "packages": { + "@unstoppabledomains/resolution>elliptic": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/units": { + "packages": { + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/units>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/units>@ethersproject/bignumber>bn.js": true + } + }, + "ethers>@ethersproject/units>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/units>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/units>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/wallet": { + "packages": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/wallet>@ethersproject/signing-key": true, + "ethers>@ethersproject/wallet>@ethersproject/wallet>@ethersproject/transactions": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/hash": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": { + "packages": { + "@unstoppabledomains/resolution>elliptic": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/transactions": { + "packages": { + "ethers>@ethersproject/bytes": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/address": { + "packages": { + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/hash": { + "packages": { + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": { + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/keccak256>js-sha3": { + "globals": { + "define": true + }, + "packages": { + "browserify>process": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/properties": { + "packages": { + "@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/random": { + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": { + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/signing-key>elliptic": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true } }, - "ethers>@ethersproject/hash": { + "ethers>@ethersproject/wallet>@ethersproject/transactions": { "packages": { - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true } }, - "ethers>@ethersproject/hdnode": { + "ethers>@ethersproject/wallet>@ethersproject/address": { "packages": { - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/bignumber": true, "ethers>@ethersproject/bytes": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/pbkdf2": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/wordlists": true + "ethers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true } }, - "ethers>@ethersproject/json-wallets": { + "ethers>@ethersproject/wallet>@ethersproject/hash": { "packages": { - "ethers>@ethersproject/address": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/hdnode": true, - "ethers>@ethersproject/json-wallets>aes-js": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true, - "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/pbkdf2": true, "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true } }, - "ethers>@ethersproject/json-wallets>aes-js": { - "globals": { - "define": true + "ethers>@ethersproject/wallet>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "ethers>@ethersproject/json-wallets>scrypt-js": { - "globals": { - "define": true, - "setTimeout": true - }, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": { "packages": { - "browserify>timers-browserify": true + "@unstoppabledomains/resolution>elliptic": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true } }, - "ethers>@ethersproject/keccak256": { + "ethers>@ethersproject/wallet>@ethersproject/transactions": { "packages": { "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256>js-sha3": true + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true } }, - "ethers>@ethersproject/keccak256>js-sha3": { + "ethers>@ethersproject/web": { "globals": { - "define": true + "clearTimeout": true, + "fetch": true, + "setTimeout": true }, "packages": { - "browserify>process": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/web>@ethersproject/base64": true, + "ethers>@ethersproject/web>@ethersproject/base64": true, + "ethers>@ethersproject/web>@ethersproject/web>@ethersproject/strings": true } }, - "ethers>@ethersproject/logger": { + "ethers>@ethersproject/web>@ethersproject/base64": { "globals": { - "console": true + "atob": true, + "btoa": true + }, + "packages": { + "ethers>@ethersproject/bytes": true } }, - "ethers>@ethersproject/networks": { + "ethers>@ethersproject/web>@ethersproject/strings": { "packages": { - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": true } }, - "ethers>@ethersproject/pbkdf2": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": { "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/sha2": true + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true } }, - "ethers>@ethersproject/properties": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { "packages": { - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true } }, - "ethers>@ethersproject/providers": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { "globals": { - "WebSocket": true, - "clearInterval": true, - "clearTimeout": true, - "console.log": true, - "console.warn": true, - "name": true, - "setInterval": true, - "setTimeout": true + "Buffer": true }, "packages": { - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/bignumber": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/hash": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/networks": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers>bech32": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/web": true + "browserify>browser-resolve": true } }, - "ethers>@ethersproject/random": { + "ethers>@ethersproject/web>@ethersproject/base64": { "globals": { - "crypto.getRandomValues": true + "atob": true, + "btoa": true }, "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/web>@ethersproject/bytes": true } }, - "ethers>@ethersproject/rlp": { + "ethers>@ethersproject/web>@ethersproject/bytes": { "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/web>@ethersproject/logger": true } }, - "ethers>@ethersproject/sha2": { + "ethers>@ethersproject/web>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/web>@ethersproject/properties": { "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2>hash.js": true + "ethers>@ethersproject/web>@ethersproject/logger": true } }, - "ethers>@ethersproject/sha2>hash.js": { + "ethers>@ethersproject/web>@ethersproject/strings": { "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, - "pumpify>inherits": true + "ethers>@ethersproject/web>@ethersproject/bytes": true, + "ethers>@ethersproject/web>@ethersproject/logger": true, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": true } }, - "ethers>@ethersproject/signing-key": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": { "packages": { - "3box>ethers>elliptic": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true } }, - "ethers>@ethersproject/solidity": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { "packages": { - "ethers>@ethersproject/bignumber": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/web>@ethersproject/bytes": true, + "ethers>@ethersproject/web>@ethersproject/logger": true, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true } }, - "ethers>@ethersproject/strings": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true + "browserify>browser-resolve": true } }, - "ethers>@ethersproject/transactions": { + "ethers>@ethersproject/web>@ethersproject/base64": { "globals": { - "console.log": true + "atob": true, + "btoa": true }, "packages": { - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, + "ethers>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/web>@ethersproject/strings": { + "packages": { "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/signing-key": true + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": true } }, - "ethers>@ethersproject/units": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": { "packages": { - "ethers>@ethersproject/bignumber": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true } }, - "ethers>@ethersproject/wallet": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { "packages": { - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/hash": true, - "ethers>@ethersproject/hdnode": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true } }, - "ethers>@ethersproject/web": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true + "Buffer": true }, "packages": { - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "browserify>browser-resolve": true } }, "ethers>@ethersproject/wordlists": { "packages": { "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/hash": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/wallet>@ethersproject/hash": true } }, "ethjs": { @@ -5514,10 +6989,10 @@ "ethjs-contract": { "packages": { "ethjs-contract>ethjs-abi": true, - "ethjs-contract>js-sha3": true, "ethjs-query>babel-runtime": true, "ethjs>ethjs-filter": true, "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, "promise-to-callback": true } }, @@ -5525,20 +7000,10 @@ "packages": { "browserify>buffer": true, "ethjs-contract>ethjs-abi>bn.js": true, - "ethjs-contract>ethjs-abi>js-sha3": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, - "ethjs-contract>ethjs-abi>js-sha3": { - "packages": { - "browserify>process": true - } - }, - "ethjs-contract>js-sha3": { - "packages": { - "browserify>process": true - } - }, "ethjs-query": { "globals": { "console": true @@ -5655,9 +7120,13 @@ "define": true } }, + "ganache>secp256k1": { + "packages": { + "ethers>@ethersproject/signing-key>elliptic": true + } + }, "gh-pages>async": { "globals": { - "clearTimeout": true, "setTimeout": true }, "packages": { @@ -5669,7 +7138,7 @@ "globalthis>define-properties": { "packages": { "globalthis>define-properties>has-property-descriptors": true, - "nock>deep-equal>object-keys": true + "mocha>object.assign>object-keys": true } }, "globalthis>define-properties>has-property-descriptors": { @@ -5701,6 +7170,11 @@ "browserify>url": true } }, + "koa>is-generator-function>has-tostringtag": { + "packages": { + "string.prototype.matchall>has-symbols": true + } + }, "lavamoat>json-stable-stringify": { "packages": { "lavamoat>json-stable-stringify>jsonify": true @@ -5755,72 +7229,24 @@ "Intl": true } }, - "madge>debug": { + "nanoid": { "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true - }, - "packages": { - "browserify>process": true, - "madge>debug>ms": true - } - }, - "madge>rc>deep-extend": { - "packages": { - "browserify>buffer": true + "crypto": true, + "msCrypto": true, + "navigator": true } }, - "mockttp>node-forge": { + "nock>debug": { "globals": { - "Blob": true, - "MutationObserver": true, - "QuotaExceededError": true, - "URL.createObjectURL": true, - "URL.revokeObjectURL": true, - "Worker": true, - "addEventListener": true, + "console": true, "document": true, - "jQuery": true, "localStorage": true, "navigator": true, - "postMessage": true, - "removeEventListener": true, - "setTimeout": true + "process": true }, "packages": { - "browserify>browser-resolve": true, "browserify>process": true, - "browserify>timers-browserify": true - } - }, - "nanoid": { - "globals": { - "crypto": true, - "msCrypto": true, - "navigator": true - } - }, - "nock>deep-equal": { - "packages": { - "enzyme>is-regex": true, - "enzyme>object-is": true, - "nock>deep-equal>is-arguments": true, - "nock>deep-equal>is-date-object": true, - "nock>deep-equal>object-keys": true, - "string.prototype.matchall>regexp.prototype.flags": true - } - }, - "nock>deep-equal>is-date-object": { - "packages": { - "enzyme>is-regex>has-tostringtag": true - } - }, - "nock>qs": { - "packages": { - "string.prototype.matchall>side-channel": true + "nock>debug>ms": true } }, "node-fetch": { @@ -5950,12 +7376,6 @@ "react-devtools>react-devtools-core": true } }, - "react-devtools>ip": { - "packages": { - "browserify>buffer": true, - "browserify>os-browserify": true - } - }, "react-devtools>react-devtools-core": { "globals": { "WebSocket": true, @@ -6371,8 +7791,13 @@ "setTimeout": true }, "packages": { - "3box>events": true, - "browserify>util": true + "browserify>util": true, + "safe-event-emitter>events": true + } + }, + "safe-event-emitter>events": { + "globals": { + "console": true } }, "semver": { @@ -6424,19 +7849,6 @@ "string.prototype.matchall>call-bind": true } }, - "string.prototype.matchall>side-channel": { - "packages": { - "enzyme>object-inspect": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true - } - }, - "stylelint>write-file-atomic>typedarray-to-buffer": { - "packages": { - "browserify>buffer": true, - "jsdom>request>is-typedarray": true - } - }, "textarea-caret": { "globals": { "document.body.appendChild": true, @@ -6488,11 +7900,6 @@ "console.warn": true, "define": true } - }, - "webpack>memory-fs>errno": { - "packages": { - "webpack>memory-fs>errno>prr": true - } } } } \ No newline at end of file diff --git a/lavamoat/browserify/flask/policy.json b/lavamoat/browserify/flask/policy.json index ecfe34552232..af418ae44acb 100644 --- a/lavamoat/browserify/flask/policy.json +++ b/lavamoat/browserify/flask/policy.json @@ -1,12 +1,8 @@ { "resources": { - "3box": { + "@babel/code-frame": { "globals": { - "console.error": true, - "console.log": true, - "console.warn": true, - "fetch": true, - "setTimeout": true + "console.warn": true }, "packages": { "3box>3box-orbitdb-plugins": true, @@ -14,7 +10,6 @@ "3box>3id-resolver": true, "3box>did-jwt": true, "3box>ethers": true, - "3box>ethers>elliptic": true, "3box>graphql-request": true, "3box>https-did-resolver": true, "3box>ipfs": true, @@ -32,12 +27,14 @@ "3box>tweetnacl": true, "3box>tweetnacl-util": true, "@babel/runtime": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "browserify>buffer": true, "browserify>process": true, - "node-fetch": true + "lavamoat>@babel/highlight": true } }, - "3box>3box-orbitdb-plugins": { + "@babel/core": { "globals": { "console.log": true }, @@ -61,11 +58,11 @@ }, "packages": { "3box>3box-orbitdb-plugins>ipfs-log>json-stringify-deterministic": true, - "3box>3box-orbitdb-plugins>ipfs-log>p-each-series": true, "3box>3box-orbitdb-plugins>ipfs-log>p-map": true, "3box>3box-orbitdb-plugins>ipfs-log>p-whilst": true, "3box>orbit-db>orbit-db-io": true, - "browserify>buffer": true + "browserify>buffer": true, + "jest>@jest/core>p-each-series": true } }, "3box>3id-resolver": { @@ -81,11 +78,12 @@ "packages": { "3box>3id-resolver>did-jwt>base64url": true, "3box>did-jwt>did-resolver": true, - "3box>ethers>elliptic": true, "3box>js-sha256": true, "3box>tweetnacl": true, "3box>tweetnacl-util": true, "@babel/runtime": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "browserify>buffer": true, "ethers>@ethersproject/keccak256>js-sha3": true } @@ -101,9 +99,10 @@ "3box>did-jwt>did-resolver": true, "3box>did-jwt>js-sha3": true, "3box>did-jwt>uport-base64url": true, - "3box>ethers>elliptic": true, "3box>js-sha256": true, "3box>tweetnacl": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "browserify>buffer": true } }, @@ -135,33 +134,6 @@ "setTimeout": true } }, - "3box>ethers>elliptic": { - "packages": { - "3box>ethers>elliptic>brorand": true, - "3box>ethers>elliptic>hmac-drbg": true, - "3box>ethers>elliptic>minimalistic-crypto-utils": true, - "3box>ethers>hash.js>minimalistic-assert": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true - } - }, - "3box>ethers>elliptic>brorand": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "3box>ethers>elliptic>hmac-drbg": { - "packages": { - "3box>ethers>elliptic>minimalistic-crypto-utils": true, - "3box>ethers>hash.js>minimalistic-assert": true, - "ethers>@ethersproject/sha2>hash.js": true - } - }, "3box>events": { "globals": { "console": true @@ -172,16 +144,7 @@ "fetch": true }, "packages": { - "3box>graphql-request>cross-fetch": true - } - }, - "3box>graphql-request>cross-fetch": { - "globals": { - "Blob": true, - "FileReader": true, - "FormData": true, - "URLSearchParams.prototype.isPrototypeOf": true, - "XMLHttpRequest": true + "@unstoppabledomains/resolution>cross-fetch": true } }, "3box>graphql-request>cross-fetch>node-fetch": { @@ -418,201 +381,22 @@ "browserify>buffer": true, "browserify>os-browserify": true, "browserify>path-browserify": true, - "gh-pages>async": true - } - }, - "3box>ipfs>interface-datastore>uuid": { - "globals": { - "crypto": true, - "msCrypto": true - } - }, - "3box>ipfs>ipfs-bitswap": { - "globals": { - "clearInterval": true, - "clearTimeout": true, - "setInterval": true, - "setTimeout": true - }, - "packages": { - "3box>ipfs>cids": true, - "3box>ipfs>ipfs-bitswap>bignumber.js": true, - "3box>ipfs>ipfs-bitswap>just-debounce-it": true, - "3box>ipfs>ipfs-bitswap>lodash.isequalwith": true, - "3box>ipfs>ipfs-bitswap>moving-average": true, - "3box>ipfs>ipfs-bitswap>multihashing-async": true, - "3box>ipfs>ipfs-bitswap>varint-decoder": true, - "3box>ipfs>ipfs-block": true, - "3box>ipfs>libp2p-secio>pull-length-prefixed": true, - "3box>ipfs>multicodec": true, - "3box>ipfs>protons": true, - "3box>ipfs>pull-stream": true, - "browserify>assert": true, - "browserify>events": true, - "gh-pages>async": true, - "madge>debug": true - } - }, - "3box>ipfs>ipfs-bitswap>bignumber.js": { - "globals": { - "crypto": true, - "define": true - } - }, - "3box>ipfs>ipfs-bitswap>just-debounce-it": { - "globals": { - "clearTimeout": true, - "setTimeout": true - } - }, - "3box>ipfs>ipfs-bitswap>multihashing-async": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "3box>ipfs>multihashes": true, - "3box>ipfs>multihashing-async>murmurhash3js": true, - "3box>ipfs>multihashing-async>nodeify": true, - "browserify>buffer": true, "browserify>process": true, - "ethereumjs-util>ethereum-cryptography>blakejs": true, - "ethers>@ethersproject/keccak256>js-sha3": true - } - }, - "3box>ipfs>ipfs-bitswap>varint-decoder": { - "packages": { - "3box>ipfs>varint": true, - "browserify>insert-module-globals>is-buffer": true - } - }, - "3box>ipfs>ipfs-block": { - "packages": { - "3box>ipfs>cids": true, - "3box>ipfs>class-is": true, - "browserify>insert-module-globals>is-buffer": true - } - }, - "3box>ipfs>ipfs-block-service": { - "packages": { - "gh-pages>async": true - } - }, - "3box>ipfs>ipfs-mfs": { - "globals": { - "Blob": true, - "FileReader": true - }, - "packages": { - "3box>ipfs>cids": true, - "3box>ipfs>err-code": true, - "3box>ipfs>interface-datastore": true, - "3box>ipfs>ipfs-mfs>async-iterator-last": true, - "3box>ipfs>ipfs-mfs>hamt-sharding": true, - "3box>ipfs>ipfs-mfs>mortice": true, - "3box>ipfs>ipfs-unixfs": true, - "3box>ipfs>ipfs-unixfs-exporter": true, - "3box>ipfs>ipfs-unixfs-importer": true, - "3box>ipfs>ipld-dag-pb": true, - "3box>ipfs>multicodec": true, - "3box>ipfs>multihashes": true, - "3box>ipfs>promisify-es6": true, - "browserify>assert": true, - "browserify>browser-resolve": true, - "browserify>buffer": true, - "madge>debug": true - } - }, - "3box>ipfs>ipfs-mfs>hamt-sharding": { - "packages": { - "3box>ipfs>ipfs-mfs>hamt-sharding>sparse-array": true, - "browserify>insert-module-globals>is-buffer": true - } - }, - "3box>ipfs>ipfs-mfs>mortice": { - "globals": { - "Worker": true - }, - "packages": { - "3box>ipfs-postmsg-proxy>shortid": true, - "3box>ipfs>ipfs-mfs>mortice>observable-webworkers": true, - "3box>ipfs>ipfs-mfs>mortice>promise-timeout": true, - "3box>ipfs>libp2p-kad-dht>p-queue": true, - "browserify>browser-resolve": true, - "browserify>events": true, - "browserify>process": true - } - }, - "3box>ipfs>ipfs-mfs>mortice>promise-timeout": { - "globals": { - "clearTimeout": true, - "setTimeout": true - } - }, - "3box>ipfs>ipfs-repo": { - "packages": { - "3box>ipfs>base32.js": true, - "3box>ipfs>cids": true, - "3box>ipfs>datastore-core": true, - "3box>ipfs>dlv": true, - "3box>ipfs>interface-datastore": true, - "3box>ipfs>ipfs-block": true, - "3box>ipfs>ipfs-repo>bignumber.js": true, - "3box>ipfs>ipfs-repo>datastore-level": true, - "3box>ipfs>ipfs-repo>sort-keys": true, - "3box>ipfs>just-safe-set": true, - "3box>ipfs>pull-stream": true, - "browserify>assert": true, - "browserify>buffer": true, - "browserify>path-browserify": true, - "browserify>timers-browserify": true, - "gh-pages>async": true, - "madge>debug": true + "depcheck>@babel/traverse": true, + "nock>debug": true, + "nyc>convert-source-map": true } }, - "3box>ipfs>ipfs-repo>bignumber.js": { + "@babel/core>@ampproject/remapping": { "globals": { - "crypto": true, "define": true - } - }, - "3box>ipfs>ipfs-repo>datastore-level": { - "packages": { - "3box>ipfs>interface-datastore": true, - "3box>ipfs>ipfs-repo>datastore-level>encoding-down": true, - "3box>ipfs>ipfs-repo>datastore-level>level-js": true, - "3box>ipfs>pull-stream": true, - "3box>orbit-db>orbit-db-keystore>levelup": true, - "browserify>buffer": true - } - }, - "3box>ipfs>ipfs-repo>datastore-level>encoding-down": { - "packages": { - "3box>ipfs>ipfs-repo>datastore-level>encoding-down>abstract-leveldown": true, - "3box>ipfs>ipfs-repo>datastore-level>encoding-down>level-codec": true, - "3box>orbit-db>orbit-db-keystore>levelup>level-errors": true, - "pumpify>inherits": true - } - }, - "3box>ipfs>ipfs-repo>datastore-level>encoding-down>abstract-leveldown": { - "packages": { - "3box>ipfs>ipfs-repo>datastore-level>encoding-down>abstract-leveldown>level-supports": true, - "3box>orbit-db>orbit-db-cache>level-js>immediate": true, - "browserify>buffer": true, - "watchify>xtend": true - } - }, - "3box>ipfs>ipfs-repo>datastore-level>encoding-down>abstract-leveldown>level-supports": { - "packages": { - "watchify>xtend": true - } - }, - "3box>ipfs>ipfs-repo>datastore-level>encoding-down>level-codec": { + }, "packages": { - "browserify>buffer": true + "@babel/core>@ampproject/remapping>@jridgewell/gen-mapping": true, + "terser>@jridgewell/source-map>@jridgewell/trace-mapping": true } }, - "3box>ipfs>ipfs-repo>datastore-level>level-js": { + "@babel/core>@ampproject/remapping>@jridgewell/gen-mapping": { "globals": { "IDBKeyRange.bound": true, "IDBKeyRange.lowerBound": true, @@ -764,7 +548,7 @@ "3box>ipfs>ipld-raw>multihashing-async": true, "3box>ipfs>multicodec": true, "3box>ipfs>protons": true, - "@storybook/react>@storybook/store>stable": true, + "@storybook/client-api>stable": true, "browserify>assert": true, "browserify>buffer": true, "browserify>insert-module-globals>is-buffer": true @@ -794,38 +578,13 @@ "3box>ipfs>ipld-raw>multihashing-async>murmurhash3js-revisited": { "globals": { "define": true - } - }, - "3box>ipfs>ipld>typical": { - "globals": { - "define": true - } - }, - "3box>ipfs>ipns": { - "packages": { - "3box>ipfs>interface-datastore": true, - "3box>ipfs>ipns>timestamp-nano": true, - "3box>ipfs>libp2p-crypto": true, - "3box>ipfs>multihashes": true, - "3box>ipfs>peer-id": true, - "3box>ipfs>protons": true, - "base32-encode": true, - "browserify>buffer": true, - "madge>debug": true - } - }, - "3box>ipfs>is-ipfs": { + }, "packages": { - "3box>ipfs>bs58": true, - "3box>ipfs>cids": true, - "3box>ipfs>mafmt": true, - "3box>ipfs>multiaddr": true, - "3box>ipfs>multibase": true, - "3box>ipfs>multihashes": true, - "browserify>buffer": true + "terser>@jridgewell/source-map>@jridgewell/gen-mapping>@jridgewell/set-array": true, + "terser>@jridgewell/source-map>@jridgewell/gen-mapping>@jridgewell/sourcemap-codec": true } }, - "3box>ipfs>iso-url": { + "@babel/core>@babel/generator": { "globals": { "URL": true, "URLSearchParams": true, @@ -890,7 +649,7 @@ }, "3box>ipfs>libp2p-crypto>asn1.js": { "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, "bn.js": true, "browserify>buffer": true, "pumpify>inherits": true @@ -1386,2833 +1145,4296 @@ "console.error": true }, "packages": { - "3box>ipfs>class-is": true, - "3box>ipfs>libp2p-crypto": true, - "3box>ipfs>libp2p-webrtc-star>socket.io-client": true, - "3box>ipfs>libp2p-websocket-star-multi>libp2p-websocket-star>socket.io-pull-stream": true, - "3box>ipfs>mafmt": true, - "3box>ipfs>multiaddr": true, - "3box>ipfs>peer-id": true, - "3box>ipfs>peer-info": true, - "3box>ipfs>pull-mplex>interface-connection": true, - "3box>ipfs>pull-stream": true, + "@babel/core>@babel/generator>jsesc": true, + "@babel/core>@babel/types": true, "browserify>buffer": true, - "browserify>events": true, - "gh-pages>async": true, - "madge>debug": true, - "pump>once": true, - "uuid": true + "terser>@jridgewell/source-map>@jridgewell/gen-mapping": true + } + }, + "@babel/core>@babel/generator>jsesc": { + "packages": { + "browserify>insert-module-globals>is-buffer": true } }, - "3box>ipfs>libp2p-websocket-star-multi>libp2p-websocket-star>socket.io-pull-stream": { + "@babel/core>@babel/helper-compilation-targets": { "globals": { - "console.error": true + "console.warn": true }, "packages": { - "3box>ipfs>libp2p-websocket-star-multi>libp2p-websocket-star>socket.io-pull-stream>data-queue": true, - "3box>ipfs>libp2p-websocket-star-multi>libp2p-websocket-star>socket.io-pull-stream>debug": true, - "3box>ipfs>libp2p-websocket-star-multi>libp2p-websocket-star>socket.io-pull-stream>uuid": true, - "3box>ipfs>pull-stream": true, - "browserify>buffer": true + "@babel/core>@babel/helper-compilation-targets>semver": true, + "@babel/preset-env>@babel/compat-data": true, + "@babel/preset-env>@babel/helper-validator-option": true, + "browserify>process": true, + "stylelint>autoprefixer>browserslist": true } }, - "3box>ipfs>libp2p-websocket-star-multi>libp2p-websocket-star>socket.io-pull-stream>data-queue": { + "@babel/core>@babel/helper-compilation-targets>semver": { + "globals": { + "console": true + }, "packages": { - "browserify>events": true + "browserify>process": true } }, - "3box>ipfs>libp2p-websocket-star-multi>libp2p-websocket-star>socket.io-pull-stream>debug": { - "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true - }, + "@babel/core>@babel/helper-module-transforms": { "packages": { - "analytics-node>ms": true, - "browserify>process": true - } - }, - "3box>ipfs>libp2p-websocket-star-multi>libp2p-websocket-star>socket.io-pull-stream>uuid": { - "globals": { - "crypto": true, - "msCrypto": true + "@babel/core>@babel/helper-module-transforms>@babel/helper-module-imports": true, + "@babel/core>@babel/helper-module-transforms>@babel/helper-simple-access": true, + "@babel/core>@babel/template": true, + "@babel/core>@babel/types": true, + "browserify>assert": true, + "browserify>path-browserify": true, + "depcheck>@babel/traverse": true, + "depcheck>@babel/traverse>@babel/helper-environment-visitor": true, + "depcheck>@babel/traverse>@babel/helper-split-export-declaration": true, + "lavamoat>@babel/highlight>@babel/helper-validator-identifier": true } }, - "3box>ipfs>libp2p-websockets": { + "@babel/core>@babel/helper-module-transforms>@babel/helper-module-imports": { "packages": { - "3box>ipfs>class-is": true, - "3box>ipfs>libp2p-websockets>pull-ws": true, - "3box>ipfs>mafmt": true, - "3box>ipfs>multiaddr": true, - "3box>ipfs>multiaddr-to-uri": true, - "3box>ipfs>pull-mplex>interface-connection": true, - "browserify>os-browserify": true, - "madge>debug": true + "@babel/core>@babel/types": true, + "browserify>assert": true } }, - "3box>ipfs>libp2p-websockets>pull-ws": { - "globals": { - "WebSocket": true, - "location": true - }, + "@babel/core>@babel/helper-module-transforms>@babel/helper-simple-access": { "packages": { - "3box>ipfs>libp2p-websockets>pull-ws>relative-url": true, - "browserify>browser-resolve": true, - "browserify>events": true, - "browserify>https-browserify": true, - "browserify>process": true, - "browserify>stream-http": true, - "browserify>timers-browserify": true, - "browserify>url": true, - "ethereumjs-wallet>safe-buffer": true + "@babel/core>@babel/types": true } }, - "3box>ipfs>libp2p-websockets>pull-ws>relative-url": { + "@babel/core>@babel/helpers": { "packages": { - "browserify>url": true + "@babel/core>@babel/template": true, + "@babel/core>@babel/types": true, + "depcheck>@babel/traverse": true } }, - "3box>ipfs>libp2p>libp2p-connection-manager": { + "@babel/core>@babel/template": { "packages": { - "3box>ipfs>libp2p>libp2p-connection-manager>latency-monitor": true, - "browserify>events": true, - "madge>debug": true + "@babel/code-frame": true, + "@babel/core>@babel/parser": true, + "@babel/core>@babel/types": true } }, - "3box>ipfs>libp2p>libp2p-connection-manager>latency-monitor": { + "@babel/core>@babel/types": { "globals": { - "clearInterval": true, - "clearTimeout": true, - "document": true, - "performance": true, - "setInterval": true, - "setTimeout": true + "console.trace": true }, "packages": { - "3box>ipfs>libp2p>libp2p-connection-manager>latency-monitor>debug": true, - "browserify>events": true, + "@babel/core>@babel/types>@babel/helper-string-parser": true, + "@babel/core>@babel/types>to-fast-properties": true, "browserify>process": true, - "lodash": true + "lavamoat>@babel/highlight>@babel/helper-validator-identifier": true } }, - "3box>ipfs>libp2p>libp2p-connection-manager>latency-monitor>debug": { + "@babel/core>semver": { "globals": { - "chrome": true, - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true + "console": true }, "packages": { - "3box>ipfs>libp2p>libp2p-connection-manager>latency-monitor>debug>ms": true, "browserify>process": true } }, - "3box>ipfs>libp2p>libp2p-floodsub": { + "3box>js-sha256": { + "globals": { + "define": true + }, "packages": { - "3box>ipfs>libp2p-secio>pull-length-prefixed": true, - "3box>ipfs>libp2p>libp2p-floodsub>libp2p-pubsub": true, - "3box>ipfs>pull-stream": true, - "browserify>assert": true, - "gh-pages>async": true, - "madge>debug": true + "browserify>process": true } }, - "3box>ipfs>libp2p>libp2p-floodsub>libp2p-pubsub": { + "3box>muport-did-resolver": { "packages": { - "3box>ipfs>bs58": true, - "3box>ipfs>err-code": true, - "3box>ipfs>libp2p-crypto": true, - "3box>ipfs>libp2p-secio>pull-length-prefixed": true, - "3box>ipfs>libp2p>libp2p-floodsub>libp2p-pubsub>time-cache": true, - "3box>ipfs>protons": true, - "3box>ipfs>pull-pushable": true, - "3box>ipfs>pull-stream": true, - "browserify>buffer": true, - "browserify>events": true, - "browserify>insert-module-globals>is-buffer": true, - "gh-pages>async": true, - "madge>debug": true + "3box>did-jwt>did-resolver": true, + "@babel/runtime": true, + "node-fetch": true } }, - "3box>ipfs>libp2p>libp2p-floodsub>libp2p-pubsub>time-cache": { + "3box>orbit-db": { + "globals": { + "console.log": true + }, "packages": { - "3box>ipfs>libp2p>libp2p-floodsub>libp2p-pubsub>time-cache>lodash.throttle": true + "3box>ipfs>cids": true, + "3box>ipfs>multihashes": true, + "3box>orbit-db>ipfs-pubsub-1on1": true, + "3box>orbit-db>logplease": true, + "3box>orbit-db>orbit-db-access-controllers": true, + "3box>orbit-db>orbit-db-cache": true, + "3box>orbit-db>orbit-db-counterstore": true, + "3box>orbit-db>orbit-db-docstore": true, + "3box>orbit-db>orbit-db-eventstore": true, + "3box>orbit-db>orbit-db-feedstore": true, + "3box>orbit-db>orbit-db-identity-provider": true, + "3box>orbit-db>orbit-db-io": true, + "3box>orbit-db>orbit-db-keystore": true, + "3box>orbit-db>orbit-db-kvstore": true, + "3box>orbit-db>orbit-db-pubsub": true, + "browserify>path-browserify": true } }, - "3box>ipfs>libp2p>libp2p-floodsub>libp2p-pubsub>time-cache>lodash.throttle": { + "3box>orbit-db>ipfs-pubsub-1on1": { "globals": { - "clearTimeout": true, - "setTimeout": true - } - }, - "3box>ipfs>libp2p>libp2p-ping": { + "clearInterval": true, + "setInterval": true + }, "packages": { - "3box>ipfs>libp2p-crypto": true, - "3box>ipfs>libp2p-secio>pull-handshake": true, - "3box>ipfs>pull-stream": true, + "3box>orbit-db>ipfs-pubsub-1on1>safe-buffer": true, "browserify>events": true, - "madge>debug": true + "browserify>path-browserify": true } }, - "3box>ipfs>libp2p>libp2p-switch": { + "3box>orbit-db>ipfs-pubsub-1on1>safe-buffer": { "packages": { - "3box>ipfs>class-is": true, - "3box>ipfs>err-code": true, - "3box>ipfs>fsm-event": true, - "3box>ipfs>ipfs-bitswap>moving-average": true, - "3box>ipfs>libp2p-kad-dht>hashlru": true, - "3box>ipfs>libp2p>libp2p-switch>bignumber.js": true, - "3box>ipfs>libp2p>libp2p-switch>libp2p-circuit": true, - "3box>ipfs>libp2p>libp2p-switch>libp2p-identify": true, - "3box>ipfs>libp2p>libp2p-switch>multistream-select": true, - "3box>ipfs>libp2p>libp2p-switch>retimer": true, - "3box>ipfs>multiaddr": true, - "3box>ipfs>peer-id": true, - "3box>ipfs>peer-info": true, - "3box>ipfs>pull-mplex>interface-connection": true, - "3box>ipfs>pull-stream": true, - "browserify>assert": true, - "browserify>events": true, - "gh-pages>async": true, - "madge>debug": true, - "pump>once": true + "browserify>buffer": true } }, - "3box>ipfs>libp2p>libp2p-switch>bignumber.js": { + "3box>orbit-db>logplease": { "globals": { - "crypto": true, - "define": true - } - }, - "3box>ipfs>libp2p>libp2p-switch>libp2p-circuit": { + "LOG": true, + "console.error": true, + "console.log": true + }, "packages": { - "3box>ipfs>libp2p-secio>pull-handshake": true, - "3box>ipfs>libp2p-secio>pull-length-prefixed": true, - "3box>ipfs>mafmt": true, - "3box>ipfs>multiaddr": true, - "3box>ipfs>peer-id": true, - "3box>ipfs>peer-info": true, - "3box>ipfs>protons": true, - "3box>ipfs>pull-mplex>interface-connection": true, - "3box>ipfs>pull-stream": true, + "browserify>browser-resolve": true, "browserify>events": true, - "gh-pages>async": true, - "madge>debug": true, - "pump>once": true + "browserify>process": true, + "browserify>util": true } }, - "3box>ipfs>libp2p>libp2p-switch>libp2p-identify": { + "3box>orbit-db>orbit-db-access-controllers": { "globals": { - "console.warn": true + "console.log": true }, "packages": { - "3box>ipfs>libp2p-secio>pull-length-prefixed": true, - "3box>ipfs>multiaddr": true, - "3box>ipfs>peer-id": true, - "3box>ipfs>peer-info": true, - "3box>ipfs>protons": true, - "3box>ipfs>pull-stream": true, - "browserify>buffer": true + "3box>orbit-db>orbit-db-access-controllers>p-map-series": true, + "3box>orbit-db>orbit-db-io": true, + "browserify>events": true, + "browserify>path-browserify": true, + "ethereumjs-wallet>safe-buffer": true } }, - "3box>ipfs>libp2p>libp2p-switch>multistream-select": { + "3box>orbit-db>orbit-db-access-controllers>p-map-series": { "packages": { - "3box>ipfs>err-code": true, - "3box>ipfs>libp2p-secio>pull-handshake": true, - "3box>ipfs>libp2p-secio>pull-length-prefixed": true, - "3box>ipfs>libp2p>libp2p-switch>multistream-select>semver": true, - "3box>ipfs>pull-mplex>interface-connection": true, - "3box>ipfs>pull-stream": true, - "3box>ipfs>varint": true, - "browserify>assert": true, - "browserify>buffer": true, - "gh-pages>async": true, - "madge>debug": true, - "pump>once": true + "3box>orbit-db>orbit-db-store>p-each-series>p-reduce": true } }, - "3box>ipfs>libp2p>libp2p-switch>multistream-select>semver": { + "3box>orbit-db>orbit-db-cache": { + "packages": { + "3box>orbit-db>logplease": true, + "3box>orbit-db>orbit-db-cache>level-js": true, + "browserify>path-browserify": true + } + }, + "3box>orbit-db>orbit-db-cache>level-js": { "globals": { - "console": true + "IDBKeyRange.bound": true, + "IDBKeyRange.lowerBound": true, + "IDBKeyRange.upperBound": true, + "indexedDB": true }, "packages": { - "browserify>process": true + "3box>orbit-db>orbit-db-cache>level-js>abstract-leveldown": true, + "3box>orbit-db>orbit-db-cache>level-js>immediate": true, + "3box>orbit-db>orbit-db-cache>level-js>ltgt": true, + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "pumpify>inherits": true, + "stylelint>write-file-atomic>typedarray-to-buffer": true + } + }, + "3box>orbit-db>orbit-db-cache>level-js>abstract-leveldown": { + "packages": { + "browserify>insert-module-globals>is-buffer": true, + "browserify>process": true, + "watchify>xtend": true } }, - "3box>ipfs>libp2p>libp2p-switch>retimer": { + "3box>orbit-db>orbit-db-cache>level-js>immediate": { "globals": { + "MessageChannel": true, + "MutationObserver": true, + "WebKitMutationObserver": true, "clearTimeout": true, + "document.createElement": true, + "document.createTextNode": true, + "document.documentElement.appendChild": true, + "setImmediate": true, "setTimeout": true + }, + "packages": { + "browserify>process": true } }, - "3box>ipfs>mafmt": { + "3box>orbit-db>orbit-db-cache>level-js>ltgt": { "packages": { - "3box>ipfs>multiaddr": true + "browserify>insert-module-globals>is-buffer": true } }, - "3box>ipfs>merge-options": { + "3box>orbit-db>orbit-db-counterstore": { "packages": { - "geckodriver>got>is-plain-obj": true + "3box>orbit-db>orbit-db-counterstore>crdts": true, + "3box>orbit-db>orbit-db-store": true } }, - "3box>ipfs>multiaddr": { + "3box>orbit-db>orbit-db-docstore": { "packages": { - "3box>ipfs>bs58": true, - "3box>ipfs>class-is": true, - "3box>ipfs>multiaddr>hi-base32": true, - "3box>ipfs>multiaddr>is-ip": true, - "3box>ipfs>varint": true, - "browserify>buffer": true, - "react-devtools>ip": true + "3box>orbit-db>orbit-db-docstore>p-map": true, + "3box>orbit-db>orbit-db-store": true, + "readable-stream": true } }, - "3box>ipfs>multiaddr-to-uri": { + "3box>orbit-db>orbit-db-eventstore": { "packages": { - "3box>ipfs>multiaddr": true + "3box>orbit-db>orbit-db-store": true } }, - "3box>ipfs>multiaddr>hi-base32": { - "globals": { - "define": true - }, + "3box>orbit-db>orbit-db-feedstore": { "packages": { - "browserify>process": true + "3box>orbit-db>orbit-db-eventstore": true } }, - "3box>ipfs>multiaddr>is-ip": { + "3box>orbit-db>orbit-db-identity-provider": { "packages": { - "chromedriver>tcp-port-used>is2>ip-regex": true + "3box>orbit-db>orbit-db-keystore": true } }, - "3box>ipfs>multibase": { + "3box>orbit-db>orbit-db-io": { "packages": { - "3box>ipfs>multibase>base-x": true, + "3box>ipfs>cids": true, + "3box>ipfs>ipld-dag-pb": true, "browserify>buffer": true } }, - "3box>ipfs>multibase>base-x": { + "3box>orbit-db>orbit-db-keystore": { + "globals": { + "console.error": true, + "console.log": true + }, "packages": { + "3box>ipfs>libp2p-crypto": true, + "3box>orbit-db>orbit-db-cache>level-js": true, + "3box>orbit-db>orbit-db-keystore>levelup": true, + "3box>orbit-db>orbit-db-keystore>lru": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, + "eth-trezor-keyring>hdkey>secp256k1": true, "ethereumjs-wallet>safe-buffer": true } }, - "3box>ipfs>multicodec": { + "3box>orbit-db>orbit-db-keystore>levelup": { "packages": { - "3box>ipfs>varint": true, - "browserify>buffer": true + "3box>orbit-db>orbit-db-keystore>levelup>deferred-leveldown": true, + "3box>orbit-db>orbit-db-keystore>levelup>level-errors": true, + "3box>orbit-db>orbit-db-keystore>levelup>level-iterator-stream": true, + "browserify>assert": true, + "browserify>events": true, + "browserify>process": true, + "browserify>util": true, + "watchify>xtend": true } }, - "3box>ipfs>multihashes": { + "3box>orbit-db>orbit-db-keystore>levelup>deferred-leveldown": { "packages": { - "3box>ipfs>bs58": true, - "3box>ipfs>varint": true, - "browserify>buffer": true + "3box>orbit-db>orbit-db-cache>level-js>abstract-leveldown": true, + "pumpify>inherits": true } }, - "3box>ipfs>multihashing-async": { - "globals": { - "crypto": true, - "msCrypto": true - }, + "3box>orbit-db>orbit-db-keystore>levelup>level-errors": { "packages": { - "3box>ipfs>multihashes": true, - "3box>ipfs>multihashing-async>murmurhash3js": true, - "3box>ipfs>multihashing-async>nodeify": true, - "browserify>buffer": true, - "browserify>process": true, - "ethereumjs-util>ethereum-cryptography>blakejs": true, - "ethers>@ethersproject/keccak256>js-sha3": true + "webpack>memory-fs>errno": true } }, - "3box>ipfs>multihashing-async>murmurhash3js": { - "globals": { - "define": true + "3box>orbit-db>orbit-db-keystore>levelup>level-iterator-stream": { + "packages": { + "3box>orbit-db>orbit-db-keystore>levelup>level-iterator-stream>readable-stream": true, + "pumpify>inherits": true, + "watchify>xtend": true } }, - "3box>ipfs>multihashing-async>nodeify": { - "globals": { - "setTimeout": true - }, + "3box>orbit-db>orbit-db-keystore>levelup>level-iterator-stream>readable-stream": { "packages": { - "3box>ipfs>multihashing-async>nodeify>is-promise": true, - "3box>ipfs>multihashing-async>nodeify>promise": true, + "@storybook/api>util-deprecate": true, + "browserify>browser-resolve": true, + "browserify>buffer": true, + "browserify>events": true, "browserify>process": true, - "browserify>timers-browserify": true + "browserify>string_decoder": true, + "pumpify>inherits": true } }, - "3box>ipfs>multihashing-async>nodeify>promise": { - "globals": { - "setImediate": true, - "setTimeout": true - }, + "3box>orbit-db>orbit-db-keystore>lru": { "packages": { - "3box>ipfs>multihashing-async>nodeify>is-promise": true, - "browserify>process": true + "browserify>events": true, + "pumpify>inherits": true } }, - "3box>ipfs>peer-book": { + "3box>orbit-db>orbit-db-kvstore": { "packages": { - "3box>ipfs>bs58": true, - "3box>ipfs>peer-id": true, - "3box>ipfs>peer-info": true, - "browserify>insert-module-globals>is-buffer": true + "3box>orbit-db>orbit-db-store": true } }, - "3box>ipfs>peer-id": { + "3box>orbit-db>orbit-db-pubsub": { "packages": { - "3box>ipfs>class-is": true, - "3box>ipfs>libp2p-crypto": true, - "3box>ipfs>multihashes": true, - "browserify>assert": true, - "browserify>buffer": true, - "gh-pages>async": true + "3box>orbit-db>logplease": true, + "3box>orbit-db>orbit-db-pubsub>ipfs-pubsub-peer-monitor": true, + "3box>orbit-db>orbit-db-pubsub>p-series": true, + "browserify>buffer": true } }, - "3box>ipfs>peer-info": { + "3box>orbit-db>orbit-db-pubsub>ipfs-pubsub-peer-monitor": { + "globals": { + "clearInterval": true, + "setInterval": true, + "setTimeout": true + }, "packages": { - "3box>ipfs>multiaddr": true, - "3box>ipfs>peer-id": true, - "3box>ipfs>peer-info>unique-by": true, - "browserify>assert": true + "browserify>events": true } }, - "3box>ipfs>protons": { + "3box>orbit-db>orbit-db-pubsub>p-series": { "packages": { - "3box>ipfs>protons>protocol-buffers-schema": true, - "3box>ipfs>protons>signed-varint": true, - "3box>ipfs>varint": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-wallet>safe-buffer": true + "3box>orbit-db>orbit-db-pubsub>p-series>@sindresorhus/is": true, + "3box>orbit-db>orbit-db-store>p-each-series>p-reduce": true } }, - "3box>ipfs>protons>signed-varint": { + "3box>orbit-db>orbit-db-pubsub>p-series>@sindresorhus/is": { "packages": { - "3box>ipfs>varint": true + "browserify>insert-module-globals>is-buffer": true, + "browserify>util": true } }, - "3box>ipfs>pull-mplex": { + "3box>orbit-db>orbit-db-store": { + "globals": { + "clearInterval": true, + "console.error": true, + "console.warn": true, + "setInterval": true, + "setTimeout": true + }, "packages": { - "3box>ipfs>pull-abortable": true, - "3box>ipfs>pull-mplex>interface-connection": true, - "3box>ipfs>pull-mplex>looper": true, - "3box>ipfs>pull-mplex>pull-through": true, - "3box>ipfs>pull-pushable": true, - "3box>ipfs>pull-stream": true, - "3box>ipfs>varint": true, + "3box>3box-orbitdb-plugins>ipfs-log": true, + "3box>ipfs>libp2p-kad-dht>p-times>p-map": true, + "3box>orbit-db>logplease": true, + "3box>orbit-db>orbit-db-io": true, + "3box>orbit-db>orbit-db-store>p-each-series": true, "browserify>buffer": true, "browserify>events": true, - "gh-pages>async": true, - "madge>debug": true + "readable-stream": true } }, - "3box>ipfs>pull-mplex>interface-connection": { + "3box>orbit-db>orbit-db-store>p-each-series": { "packages": { - "3box>ipfs>pull-defer": true + "3box>orbit-db>orbit-db-store>p-each-series>p-reduce": true } }, - "3box>ipfs>pull-mplex>pull-through": { - "packages": { - "3box>ipfs>stream-to-pull-stream>looper": true + "3box>store": { + "globals": { + "ActiveXObject": true, + "console": true } }, - "3box>ipfs>pull-sort": { + "3box>tweetnacl": { + "globals": { + "crypto": true, + "msCrypto": true, + "nacl": "write" + }, "packages": { - "3box>ipfs>pull-defer": true, - "3box>ipfs>pull-stream": true + "browserify>browser-resolve": true } }, - "3box>ipfs>pull-stream": { + "3box>tweetnacl-util": { "globals": { - "console.log": true - } - }, - "3box>ipfs>pull-stream-to-async-iterator": { + "atob": true, + "btoa": true + }, "packages": { - "3box>ipfs>pull-stream": true + "browserify>browser-resolve": true } }, - "3box>ipfs>pull-stream-to-stream": { - "packages": { - "browserify>process": true, - "browserify>stream-browserify": true, - "browserify>timers-browserify": true + "@babel/runtime": { + "globals": { + "regeneratorRuntime": "write" } }, - "3box>ipfs>readable-stream": { - "packages": { - "@storybook/api>util-deprecate": true, - "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>events": true, - "browserify>process": true, - "browserify>string_decoder": true, - "pumpify>inherits": true + "@download/blockies": { + "globals": { + "document.createElement": true } }, - "3box>ipfs>receptacle": { + "@ensdomains/content-hash": { "globals": { - "clearTimeout": true, - "setTimeout": true + "console.warn": true }, "packages": { - "analytics-node>ms": true + "@ensdomains/content-hash>cids": true, + "@ensdomains/content-hash>js-base64": true, + "@ensdomains/content-hash>multicodec": true, + "@ensdomains/content-hash>multihashes": true, + "browserify>buffer": true } }, - "3box>ipfs>stream-to-pull-stream": { - "globals": { - "console.error": true - }, + "@ensdomains/content-hash>cids": { "packages": { - "3box>ipfs>pull-stream": true, - "3box>ipfs>stream-to-pull-stream>looper": true, - "browserify>process": true + "@ensdomains/content-hash>cids>multibase": true, + "@ensdomains/content-hash>cids>multicodec": true, + "@ensdomains/content-hash>cids>multihashes": true, + "@ensdomains/content-hash>cids>uint8arrays": true } }, - "3box>js-sha256": { + "@ensdomains/content-hash>cids>multibase": { "globals": { - "define": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "browserify>process": true + "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true } }, - "3box>muport-did-resolver": { + "@ensdomains/content-hash>cids>multicodec": { "packages": { - "3box>did-jwt>did-resolver": true, - "@babel/runtime": true, - "node-fetch": true + "@ensdomains/content-hash>cids>multicodec>varint": true, + "@ensdomains/content-hash>cids>uint8arrays": true } }, - "3box>orbit-db": { - "globals": { - "console.log": true - }, + "@ensdomains/content-hash>cids>multihashes": { "packages": { - "3box>ipfs>cids": true, - "3box>ipfs>multihashes": true, - "3box>orbit-db>ipfs-pubsub-1on1": true, - "3box>orbit-db>logplease": true, - "3box>orbit-db>orbit-db-access-controllers": true, - "3box>orbit-db>orbit-db-cache": true, - "3box>orbit-db>orbit-db-counterstore": true, - "3box>orbit-db>orbit-db-docstore": true, - "3box>orbit-db>orbit-db-eventstore": true, - "3box>orbit-db>orbit-db-feedstore": true, - "3box>orbit-db>orbit-db-identity-provider": true, - "3box>orbit-db>orbit-db-io": true, - "3box>orbit-db>orbit-db-keystore": true, - "3box>orbit-db>orbit-db-kvstore": true, - "3box>orbit-db>orbit-db-pubsub": true, - "browserify>path-browserify": true + "@ensdomains/content-hash>cids>multibase": true, + "@ensdomains/content-hash>cids>uint8arrays": true, + "@ensdomains/content-hash>multihashes>varint": true } }, - "3box>orbit-db>ipfs-pubsub-1on1": { + "@ensdomains/content-hash>cids>uint8arrays": { "globals": { - "clearInterval": true, - "setInterval": true + "TextDecoder": true, + "TextEncoder": true }, "packages": { - "3box>orbit-db>ipfs-pubsub-1on1>safe-buffer": true, - "browserify>events": true, - "browserify>path-browserify": true + "@ensdomains/content-hash>cids>multibase": true } }, - "3box>orbit-db>ipfs-pubsub-1on1>safe-buffer": { + "@ensdomains/content-hash>js-base64": { + "globals": { + "Base64": "write", + "TextDecoder": true, + "TextEncoder": true, + "atob": true, + "btoa": true, + "define": true + }, "packages": { "browserify>buffer": true } }, - "3box>orbit-db>logplease": { - "globals": { - "LOG": true, - "console.error": true, - "console.log": true - }, + "@ensdomains/content-hash>multicodec": { "packages": { - "browserify>browser-resolve": true, - "browserify>events": true, - "browserify>process": true, - "browserify>util": true + "@ensdomains/content-hash>multicodec>uint8arrays": true, + "@ensdomains/content-hash>multicodec>varint": true } }, - "3box>orbit-db>orbit-db-access-controllers": { - "globals": { - "console.log": true - }, + "@ensdomains/content-hash>multicodec>uint8arrays": { "packages": { - "3box>orbit-db>orbit-db-access-controllers>p-map-series": true, - "3box>orbit-db>orbit-db-io": true, - "browserify>events": true, - "browserify>path-browserify": true, - "ethereumjs-wallet>safe-buffer": true + "@ensdomains/content-hash>multicodec>uint8arrays>multibase": true, + "@ensdomains/content-hash>multihashes>web-encoding": true } }, - "3box>orbit-db>orbit-db-access-controllers>p-map-series": { + "@ensdomains/content-hash>multicodec>uint8arrays>multibase": { "packages": { - "3box>orbit-db>orbit-db-store>p-each-series>p-reduce": true + "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true, + "@ensdomains/content-hash>multihashes>web-encoding": true } }, - "3box>orbit-db>orbit-db-cache": { + "@ensdomains/content-hash>multihashes": { "packages": { - "3box>orbit-db>logplease": true, - "3box>orbit-db>orbit-db-cache>level-js": true, - "browserify>path-browserify": true + "@ensdomains/content-hash>multihashes>multibase": true, + "@ensdomains/content-hash>multihashes>varint": true, + "@ensdomains/content-hash>multihashes>web-encoding": true, + "browserify>buffer": true } }, - "3box>orbit-db>orbit-db-cache>level-js": { - "globals": { - "IDBKeyRange.bound": true, - "IDBKeyRange.lowerBound": true, - "IDBKeyRange.upperBound": true, - "indexedDB": true - }, + "@ensdomains/content-hash>multihashes>multibase": { "packages": { - "3box>orbit-db>orbit-db-cache>level-js>abstract-leveldown": true, - "3box>orbit-db>orbit-db-cache>level-js>immediate": true, - "3box>orbit-db>orbit-db-cache>level-js>ltgt": true, + "@ensdomains/content-hash>multihashes>web-encoding": true, "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "pumpify>inherits": true, - "stylelint>write-file-atomic>typedarray-to-buffer": true + "ethereumjs-wallet>bs58check>bs58>base-x": true } }, - "3box>orbit-db>orbit-db-cache>level-js>abstract-leveldown": { + "@ensdomains/content-hash>multihashes>web-encoding": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "browserify>insert-module-globals>is-buffer": true, - "browserify>process": true, - "watchify>xtend": true + "browserify>util": true } }, - "3box>orbit-db>orbit-db-cache>level-js>immediate": { - "globals": { - "MessageChannel": true, - "MutationObserver": true, - "WebKitMutationObserver": true, - "clearTimeout": true, - "document.createElement": true, - "document.createTextNode": true, - "document.documentElement.appendChild": true, - "setImmediate": true, - "setTimeout": true - }, + "@eth-optimism/contracts": { "packages": { - "browserify>process": true + "ethers": true } }, - "3box>orbit-db>orbit-db-cache>level-js>ltgt": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": { "packages": { - "browserify>insert-module-globals>is-buffer": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true } }, - "3box>orbit-db>orbit-db-counterstore": { + "@eth-optimism/contracts>@ethersproject/abstract-signer": { "packages": { - "3box>orbit-db>orbit-db-counterstore>crdts": true, - "3box>orbit-db>orbit-db-store": true + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true } }, - "3box>orbit-db>orbit-db-docstore": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": { "packages": { - "3box>orbit-db>orbit-db-docstore>p-map": true, - "3box>orbit-db>orbit-db-store": true, - "readable-stream": true + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true } }, - "3box>orbit-db>orbit-db-eventstore": { + "@eth-optimism/contracts>@ethersproject/abstract-signer": { "packages": { - "3box>orbit-db>orbit-db-store": true + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true } }, - "3box>orbit-db>orbit-db-feedstore": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": { "packages": { - "3box>orbit-db>orbit-db-eventstore": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true } }, - "3box>orbit-db>orbit-db-identity-provider": { + "@eth-optimism/contracts>@ethersproject/abstract-signer": { "packages": { - "3box>orbit-db>orbit-db-keystore": true + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true } }, - "3box>orbit-db>orbit-db-io": { + "@ethereumjs/common": { "packages": { - "3box>ipfs>cids": true, - "3box>ipfs>ipld-dag-pb": true, - "browserify>buffer": true + "@ethereumjs/common>crc-32": true, + "browserify>buffer": true, + "browserify>events": true, + "ethereumjs-util": true } }, - "3box>orbit-db>orbit-db-keystore": { + "@ethereumjs/common>crc-32": { "globals": { - "console.error": true, - "console.log": true - }, - "packages": { - "3box>ethers>elliptic": true, - "3box>ipfs>libp2p-crypto": true, - "3box>orbit-db>orbit-db-cache>level-js": true, - "3box>orbit-db>orbit-db-keystore>levelup": true, - "3box>orbit-db>orbit-db-keystore>lru": true, - "eth-trezor-keyring>hdkey>secp256k1": true, - "ethereumjs-wallet>safe-buffer": true + "DO_NOT_EXPORT_CRC": true, + "define": true } }, - "3box>orbit-db>orbit-db-keystore>levelup": { + "@ethereumjs/tx": { "packages": { - "3box>orbit-db>orbit-db-keystore>levelup>deferred-leveldown": true, - "3box>orbit-db>orbit-db-keystore>levelup>level-errors": true, - "3box>orbit-db>orbit-db-keystore>levelup>level-iterator-stream": true, - "browserify>assert": true, - "browserify>events": true, - "browserify>process": true, - "browserify>util": true, - "watchify>xtend": true + "@ethereumjs/common": true, + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "ethereumjs-util": true } }, - "3box>orbit-db>orbit-db-keystore>levelup>deferred-leveldown": { + "@ethersproject/bignumber": { "packages": { - "3box>orbit-db>orbit-db-cache>level-js>abstract-leveldown": true, - "pumpify>inherits": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@ethersproject/bignumber>bn.js": true } }, - "3box>orbit-db>orbit-db-keystore>levelup>level-errors": { + "@ethersproject/bignumber>@ethersproject/bytes": { "packages": { - "webpack>memory-fs>errno": true + "@ethersproject/bignumber>@ethersproject/logger": true } }, - "3box>orbit-db>orbit-db-keystore>levelup>level-iterator-stream": { - "packages": { - "3box>orbit-db>orbit-db-keystore>levelup>level-iterator-stream>readable-stream": true, - "pumpify>inherits": true, - "watchify>xtend": true + "@ethersproject/bignumber>@ethersproject/logger": { + "globals": { + "console": true } }, - "3box>orbit-db>orbit-db-keystore>levelup>level-iterator-stream>readable-stream": { + "@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "@storybook/api>util-deprecate": true, - "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>events": true, - "browserify>process": true, - "browserify>string_decoder": true, - "pumpify>inherits": true + "browserify>browser-resolve": true } }, - "3box>orbit-db>orbit-db-keystore>lru": { + "@formatjs/intl-relativetimeformat": { + "globals": { + "Intl": true + }, "packages": { - "browserify>events": true, - "pumpify>inherits": true + "@formatjs/intl-relativetimeformat>@formatjs/intl-utils": true } }, - "3box>orbit-db>orbit-db-kvstore": { - "packages": { - "3box>orbit-db>orbit-db-store": true + "@formatjs/intl-relativetimeformat>@formatjs/intl-utils": { + "globals": { + "Intl.getCanonicalLocales": true } }, - "3box>orbit-db>orbit-db-pubsub": { + "@keystonehq/bc-ur-registry-eth": { "packages": { - "3box>orbit-db>logplease": true, - "3box>orbit-db>orbit-db-pubsub>ipfs-pubsub-peer-monitor": true, - "3box>orbit-db>orbit-db-pubsub>p-series": true, - "browserify>buffer": true + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, + "@keystonehq/bc-ur-registry-eth>hdkey": true, + "browserify>buffer": true, + "eth-lattice-keyring>@ethereumjs/util": true, + "uuid": true } }, - "3box>orbit-db>orbit-db-pubsub>ipfs-pubsub-peer-monitor": { + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": { "globals": { - "clearInterval": true, - "setInterval": true, - "setTimeout": true + "define": true }, "packages": { - "browserify>events": true + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry>tslib": true, + "@ngraveio/bc-ur": true, + "browserify>buffer": true, + "ethereumjs-wallet>bs58check": true } }, - "3box>orbit-db>orbit-db-pubsub>p-series": { + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry>tslib": { + "globals": { + "define": true + } + }, + "@keystonehq/bc-ur-registry-eth>hdkey": { "packages": { - "3box>orbit-db>orbit-db-pubsub>p-series>@sindresorhus/is": true, - "3box>orbit-db>orbit-db-store>p-each-series>p-reduce": true + "@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": true, + "browserify>assert": true, + "browserify>crypto-browserify": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>safe-buffer": true } }, - "3box>orbit-db>orbit-db-pubsub>p-series>@sindresorhus/is": { + "@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": { "packages": { - "browserify>insert-module-globals>is-buffer": true, - "browserify>util": true + "@unstoppabledomains/resolution>elliptic": true } }, - "3box>orbit-db>orbit-db-store": { - "globals": { - "clearInterval": true, - "console.error": true, - "console.warn": true, - "setInterval": true, - "setTimeout": true - }, + "@keystonehq/metamask-airgapped-keyring": { "packages": { - "3box>3box-orbitdb-plugins>ipfs-log": true, - "3box>ipfs>libp2p-kad-dht>p-times>p-map": true, - "3box>orbit-db>logplease": true, - "3box>orbit-db>orbit-db-io": true, - "3box>orbit-db>orbit-db-store>p-each-series": true, + "@ethereumjs/tx": true, + "@keystonehq/bc-ur-registry-eth": true, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, + "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store": true, "browserify>buffer": true, "browserify>events": true, - "readable-stream": true + "ethereumjs-util>rlp": true, + "uuid": true } }, - "3box>orbit-db>orbit-db-store>p-each-series": { + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { "packages": { - "3box>orbit-db>orbit-db-store>p-each-series>p-reduce": true + "@ethereumjs/tx": true, + "@keystonehq/bc-ur-registry-eth": true, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey": true, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>rlp": true, + "browserify>buffer": true, + "eth-lattice-keyring>@ethereumjs/util": true, + "uuid": true } }, - "3box>store": { - "globals": { - "ActiveXObject": true, - "console": true + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey": { + "packages": { + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey>secp256k1": true, + "browserify>assert": true, + "browserify>crypto-browserify": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>safe-buffer": true } }, - "3box>tweetnacl": { - "globals": { - "crypto": true, - "msCrypto": true, - "nacl": "write" - }, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey>secp256k1": { "packages": { - "browserify>browser-resolve": true + "ethers>@ethersproject/signing-key>elliptic": true } }, - "3box>tweetnacl-util": { + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>rlp": { "globals": { - "atob": true, - "btoa": true - }, - "packages": { - "browserify>browser-resolve": true + "TextEncoder": true } }, - "@babel/code-frame": { - "globals": { - "console.warn": true - }, + "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store": { "packages": { - "browserify>process": true, - "lavamoat>@babel/highlight": true + "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store>through2": true, + "browserify>stream-browserify": true, + "json-rpc-engine>@metamask/safe-event-emitter": true } }, - "@babel/core": { - "globals": { - "console.log": true - }, + "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store>through2": { "packages": { - "@babel/code-frame": true, - "@babel/core>@ampproject/remapping": true, - "@babel/core>@babel/generator": true, - "@babel/core>@babel/helper-compilation-targets": true, - "@babel/core>@babel/helper-module-transforms": true, - "@babel/core>@babel/helpers": true, - "@babel/core>@babel/parser": true, - "@babel/core>@babel/template": true, - "@babel/core>@babel/types": true, - "@babel/core>gensync": true, - "@babel/core>semver": true, - "browserify": true, - "browserify>path-browserify": true, "browserify>process": true, - "depcheck>@babel/traverse": true, - "madge>debug": true, - "nyc>convert-source-map": true + "browserify>util": true, + "readable-stream": true, + "watchify>xtend": true } }, - "@babel/core>@ampproject/remapping": { + "@material-ui/core": { "globals": { - "define": true + "Image": true, + "_formatMuiErrorMessage": true, + "addEventListener": true, + "clearInterval": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "getComputedStyle": true, + "getSelection": true, + "innerHeight": true, + "innerWidth": true, + "matchMedia": true, + "navigator": true, + "performance.now": true, + "removeEventListener": true, + "requestAnimationFrame": true, + "setInterval": true, + "setTimeout": true }, "packages": { - "@babel/core>@ampproject/remapping>@jridgewell/gen-mapping": true, - "terser>@jridgewell/source-map>@jridgewell/trace-mapping": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles": true, + "@material-ui/core>@material-ui/system": true, + "@material-ui/core>@material-ui/utils": true, + "@material-ui/core>clsx": true, + "@material-ui/core>popper.js": true, + "@material-ui/core>react-transition-group": true, + "prop-types": true, + "prop-types>react-is": true, + "react": true, + "react-dom": true, + "react-redux>hoist-non-react-statics": true } }, - "@babel/core>@ampproject/remapping>@jridgewell/gen-mapping": { + "@material-ui/core>@material-ui/styles": { "globals": { - "define": true + "console.error": true, + "console.warn": true, + "document.createComment": true, + "document.head": true }, "packages": { - "terser>@jridgewell/source-map>@jridgewell/gen-mapping>@jridgewell/set-array": true, - "terser>@jridgewell/source-map>@jridgewell/gen-mapping>@jridgewell/sourcemap-codec": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss": true, + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": true, + "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": true, + "@material-ui/core>@material-ui/styles>jss-plugin-global": true, + "@material-ui/core>@material-ui/styles>jss-plugin-nested": true, + "@material-ui/core>@material-ui/styles>jss-plugin-props-sort": true, + "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": true, + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": true, + "@material-ui/core>@material-ui/utils": true, + "@material-ui/core>clsx": true, + "prop-types": true, + "react": true, + "react-redux>hoist-non-react-statics": true } }, - "@babel/core>@babel/generator": { + "@material-ui/core>@material-ui/styles>jss": { "globals": { - "console.error": true + "CSS": true, + "document.createElement": true, + "document.querySelector": true }, "packages": { - "@babel/core>@babel/generator>jsesc": true, - "@babel/core>@babel/types": true, - "browserify>buffer": true, - "terser>@jridgewell/source-map>@jridgewell/gen-mapping": true - } - }, - "@babel/core>@babel/generator>jsesc": { - "packages": { - "browserify>insert-module-globals>is-buffer": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss>is-in-browser": true, + "react-router-dom>tiny-warning": true } }, - "@babel/core>@babel/helper-compilation-targets": { - "globals": { - "console.warn": true - }, + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": { "packages": { - "@babel/core>@babel/helper-compilation-targets>semver": true, - "@babel/preset-env>@babel/compat-data": true, - "@babel/preset-env>@babel/helper-validator-option": true, - "browserify>process": true, - "stylelint>autoprefixer>browserslist": true + "@material-ui/core>@material-ui/styles>jss-plugin-camel-case>hyphenate-style-name": true } }, - "@babel/core>@babel/helper-compilation-targets>semver": { + "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": { "globals": { - "console": true + "CSS": true }, "packages": { - "browserify>process": true + "@material-ui/core>@material-ui/styles>jss": true } }, - "@babel/core>@babel/helper-module-transforms": { + "@material-ui/core>@material-ui/styles>jss-plugin-global": { "packages": { - "@babel/core>@babel/helper-module-transforms>@babel/helper-module-imports": true, - "@babel/core>@babel/helper-module-transforms>@babel/helper-simple-access": true, - "@babel/core>@babel/template": true, - "@babel/core>@babel/types": true, - "browserify>assert": true, - "browserify>path-browserify": true, - "depcheck>@babel/traverse": true, - "depcheck>@babel/traverse>@babel/helper-environment-visitor": true, - "depcheck>@babel/traverse>@babel/helper-split-export-declaration": true, - "lavamoat>@babel/highlight>@babel/helper-validator-identifier": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss": true } }, - "@babel/core>@babel/helper-module-transforms>@babel/helper-module-imports": { + "@material-ui/core>@material-ui/styles>jss-plugin-nested": { "packages": { - "@babel/core>@babel/types": true, - "browserify>assert": true + "@babel/runtime": true, + "react-router-dom>tiny-warning": true } }, - "@babel/core>@babel/helper-module-transforms>@babel/helper-simple-access": { + "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": { "packages": { - "@babel/core>@babel/types": true + "@material-ui/core>@material-ui/styles>jss": true, + "react-router-dom>tiny-warning": true } }, - "@babel/core>@babel/helpers": { + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": { "packages": { - "@babel/core>@babel/template": true, - "@babel/core>@babel/types": true, - "depcheck>@babel/traverse": true + "@material-ui/core>@material-ui/styles>jss": true, + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": true } }, - "@babel/core>@babel/template": { + "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": { + "globals": { + "document.createElement": true, + "document.documentElement": true, + "getComputedStyle": true + }, "packages": { - "@babel/code-frame": true, - "@babel/core>@babel/parser": true, - "@babel/core>@babel/types": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/styles>jss>is-in-browser": true } }, - "@babel/core>@babel/types": { + "@material-ui/core>@material-ui/styles>jss>is-in-browser": { "globals": { - "console.trace": true - }, - "packages": { - "@babel/core>@babel/types>@babel/helper-string-parser": true, - "@babel/core>@babel/types>to-fast-properties": true, - "browserify>process": true, - "lavamoat>@babel/highlight>@babel/helper-validator-identifier": true + "document": true } }, - "@babel/core>semver": { + "@material-ui/core>@material-ui/system": { "globals": { - "console": true + "console.error": true }, "packages": { - "browserify>process": true + "@babel/runtime": true, + "@material-ui/core>@material-ui/utils": true, + "prop-types": true } }, - "@babel/runtime": { - "globals": { - "regeneratorRuntime": "write" + "@material-ui/core>@material-ui/utils": { + "packages": { + "@babel/runtime": true, + "prop-types": true, + "prop-types>react-is": true } }, - "@download/blockies": { + "@material-ui/core>popper.js": { "globals": { - "document.createElement": true + "MSInputMethodContext": true, + "Node.DOCUMENT_POSITION_FOLLOWING": true, + "cancelAnimationFrame": true, + "console.warn": true, + "define": true, + "devicePixelRatio": true, + "document": true, + "getComputedStyle": true, + "innerHeight": true, + "innerWidth": true, + "navigator": true, + "requestAnimationFrame": true, + "setTimeout": true } }, - "@ensdomains/content-hash": { + "@material-ui/core>react-transition-group": { "globals": { - "console.warn": true + "Element": true, + "setTimeout": true }, "packages": { - "@ensdomains/content-hash>cids": true, - "@ensdomains/content-hash>js-base64": true, - "@ensdomains/content-hash>multicodec": true, - "@ensdomains/content-hash>multihashes": true, - "browserify>buffer": true + "@material-ui/core>react-transition-group>dom-helpers": true, + "prop-types": true, + "react": true, + "react-dom": true } }, - "@ensdomains/content-hash>cids": { + "@material-ui/core>react-transition-group>dom-helpers": { "packages": { - "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>multicodec": true, - "@ensdomains/content-hash>cids>multihashes": true, - "@ensdomains/content-hash>cids>uint8arrays": true + "@babel/runtime": true } }, - "@ensdomains/content-hash>cids>multibase": { + "@metamask/controllers": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "Headers": true, + "URL": true, + "clearInterval": true, + "clearTimeout": true, + "console.error": true, + "console.log": true, + "fetch": true, + "setInterval": true, + "setTimeout": true }, "packages": { - "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true - } - }, - "@ensdomains/content-hash>cids>multicodec": { - "packages": { - "@ensdomains/content-hash>cids>multicodec>varint": true, - "@ensdomains/content-hash>cids>uint8arrays": true + "@ethereumjs/common": true, + "@ethereumjs/tx": true, + "@metamask/contract-metadata": true, + "@metamask/controllers>@ethersproject/abi": true, + "@metamask/controllers>@ethersproject/contracts": true, + "@metamask/controllers>@ethersproject/providers": true, + "@metamask/controllers>abort-controller": true, + "@metamask/controllers>async-mutex": true, + "@metamask/controllers>eth-json-rpc-infura": true, + "@metamask/controllers>eth-method-registry": true, + "@metamask/controllers>eth-phishing-detect": true, + "@metamask/controllers>ethereumjs-wallet": true, + "@metamask/controllers>isomorphic-fetch": true, + "@metamask/controllers>multiformats": true, + "@metamask/controllers>nanoid": true, + "@metamask/controllers>web3": true, + "@metamask/controllers>web3-provider-engine": true, + "@metamask/metamask-eth-abis": true, + "browserify>buffer": true, + "browserify>events": true, + "deep-freeze-strict": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true, + "eth-keyring-controller": true, + "eth-query": true, + "eth-rpc-errors": true, + "eth-sig-util": true, + "ethereumjs-util": true, + "ethjs>ethjs-unit": true, + "immer": true, + "json-rpc-engine": true, + "jsonschema": true, + "punycode": true, + "single-call-balance-checker-abi": true, + "uuid": true } }, - "@ensdomains/content-hash>cids>multihashes": { + "@metamask/controllers>@ethersproject/abi": { + "globals": { + "console.log": true + }, "packages": { - "3box>ipfs>varint": true, - "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>uint8arrays": true + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true } }, - "@ensdomains/content-hash>cids>uint8arrays": { + "@metamask/controllers>@ethersproject/contracts": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "setTimeout": true }, "packages": { - "@ensdomains/content-hash>cids>multibase": true + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/abi": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true } }, - "@ensdomains/content-hash>js-base64": { + "@metamask/controllers>@ethersproject/providers": { "globals": { - "Base64": "write", - "TextDecoder": true, - "TextEncoder": true, - "atob": true, - "btoa": true, - "define": true + "WebSocket": true, + "clearInterval": true, + "clearTimeout": true, + "console.log": true, + "console.warn": true, + "setInterval": true, + "setTimeout": true }, "packages": { - "browserify>buffer": true + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/networks": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/hdnode>@ethersproject/basex": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/pbkdf2>@ethersproject/sha2": true, + "ethers>@ethersproject/providers>bech32": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true, + "ethers>@ethersproject/wallet>@ethersproject/random": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true } }, - "@ensdomains/content-hash>multicodec": { + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays": true, - "@ensdomains/content-hash>multicodec>varint": true + "@ethersproject/bignumber>@ethersproject/bytes": true } }, - "@ensdomains/content-hash>multicodec>uint8arrays": { + "@metamask/controllers>@ethersproject/providers>@ethersproject/networks": { "packages": { - "@ensdomains/content-hash>multicodec>uint8arrays>multibase": true, - "@ensdomains/content-hash>multihashes>web-encoding": true + "@ethersproject/bignumber>@ethersproject/logger": true } }, - "@ensdomains/content-hash>multicodec>uint8arrays>multibase": { + "@metamask/controllers>@ethersproject/providers>@ethersproject/rlp": { "packages": { - "@ensdomains/content-hash>cids>multibase>@multiformats/base-x": true, - "@ensdomains/content-hash>multihashes>web-encoding": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true } }, - "@ensdomains/content-hash>multihashes": { + "@metamask/controllers>@ethersproject/providers>@ethersproject/web": { + "globals": { + "clearTimeout": true, + "fetch": true, + "setTimeout": true + }, "packages": { - "3box>ipfs>varint": true, - "@ensdomains/content-hash>multihashes>multibase": true, - "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true } }, - "@ensdomains/content-hash>multihashes>multibase": { - "packages": { - "3box>ipfs>bs58>base-x": true, - "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "@metamask/controllers>abort-controller": { + "globals": { + "AbortController": true } }, - "@ensdomains/content-hash>multihashes>web-encoding": { + "@metamask/controllers>async-mutex": { "globals": { - "TextDecoder": true, - "TextEncoder": true + "setTimeout": true }, "packages": { - "browserify>util": true - } - }, - "@eth-optimism/contracts": { - "packages": { - "ethers": true + "@metamask/controllers>async-mutex>tslib": true } }, - "@ethereumjs/common": { - "packages": { - "@ethereumjs/common>crc-32": true, - "browserify>buffer": true, - "browserify>events": true, - "ethereumjs-util": true + "@metamask/controllers>async-mutex>tslib": { + "globals": { + "define": true } }, - "@ethereumjs/common>crc-32": { + "@metamask/controllers>eth-json-rpc-infura": { "globals": { - "DO_NOT_EXPORT_CRC": true, - "define": true + "setTimeout": true + }, + "packages": { + "@metamask/controllers>eth-json-rpc-infura>eth-json-rpc-middleware": true, + "@metamask/controllers>eth-json-rpc-infura>eth-rpc-errors": true, + "@metamask/controllers>eth-json-rpc-infura>json-rpc-engine": true, + "node-fetch": true } }, - "@ethereumjs/tx": { + "@metamask/controllers>eth-json-rpc-infura>eth-json-rpc-middleware": { "packages": { - "@ethereumjs/common": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-util": true + "safe-event-emitter": true } }, - "@formatjs/intl-relativetimeformat": { - "globals": { - "Intl": true - }, + "@metamask/controllers>eth-json-rpc-infura>eth-rpc-errors": { "packages": { - "@formatjs/intl-relativetimeformat>@formatjs/intl-utils": true + "eth-rpc-errors>fast-safe-stringify": true } }, - "@formatjs/intl-relativetimeformat>@formatjs/intl-utils": { - "globals": { - "Intl.getCanonicalLocales": true + "@metamask/controllers>eth-json-rpc-infura>json-rpc-engine": { + "packages": { + "@metamask/controllers>eth-json-rpc-infura>eth-rpc-errors": true, + "safe-event-emitter": true } }, - "@keystonehq/bc-ur-registry-eth": { + "@metamask/controllers>eth-method-registry": { "packages": { - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, - "@keystonehq/bc-ur-registry-eth>hdkey": true, - "browserify>buffer": true, - "ethereumjs-util": true, - "uuid": true + "@metamask/controllers>eth-method-registry>ethjs": true } }, - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": { + "@metamask/controllers>eth-method-registry>ethjs": { "globals": { - "define": true + "clearInterval": true, + "setInterval": true }, "packages": { - "@ngraveio/bc-ur": true, + "@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true, + "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true, + "@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true, "browserify>buffer": true, - "ethereumjs-wallet>bs58check": true - } - }, - "@keystonehq/bc-ur-registry-eth>hdkey": { - "packages": { - "@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": true, - "browserify>assert": true, - "browserify>crypto-browserify": true, - "ethereumjs-wallet>bs58check": true, - "ethereumjs-wallet>safe-buffer": true + "ethjs>ethjs-filter": true, + "ethjs>ethjs-provider-http": true, + "ethjs>ethjs-unit": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true } }, - "@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": { + "@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": { "packages": { - "3box>ethers>elliptic": true + "@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true } }, - "@keystonehq/metamask-airgapped-keyring": { + "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": { "packages": { - "@ethereumjs/tx": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/bc-ur-registry-eth": true, - "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store": true, - "browserify>buffer": true, - "browserify>events": true, - "ethereumjs-util>rlp": true, - "uuid": true + "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true, + "ethjs-query>babel-runtime": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "promise-to-callback": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { + "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": { "packages": { - "@keystonehq/bc-ur-registry-eth>hdkey": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@ethereumjs/tx": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@keystonehq/bc-ur-registry-eth": true, + "@metamask/controllers>eth-method-registry>ethjs>bn.js": true, "browserify>buffer": true, - "ethereumjs-util": true, - "uuid": true + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@ethereumjs/tx": { + "@metamask/controllers>eth-method-registry>ethjs>ethjs-query": { + "globals": { + "console": true + }, "packages": { - "@ethereumjs/common": true, - "browserify>buffer": true, - "ethereumjs-util": true + "ethjs-query>babel-runtime": true, + "ethjs-query>ethjs-format": true, + "ethjs-query>ethjs-rpc": true, + "promise-to-callback": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@keystonehq/bc-ur-registry-eth": { + "@metamask/controllers>eth-phishing-detect": { "packages": { - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, - "@keystonehq/bc-ur-registry-eth>hdkey": true, - "browserify>buffer": true, - "ethereumjs-util": true, - "uuid": true + "eslint>optionator>fast-levenshtein": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/bc-ur-registry-eth": { + "@metamask/controllers>ethereumjs-wallet": { "packages": { - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, - "@keystonehq/bc-ur-registry-eth>hdkey": true, + "@metamask/controllers>ethereumjs-wallet>uuid": true, + "@truffle/codec>utf8": true, "browserify>buffer": true, + "browserify>crypto-browserify": true, "ethereumjs-util": true, - "uuid": true + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-wallet>aes-js": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>randombytes": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true } }, - "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store": { - "packages": { - "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store>through2": true, - "browserify>stream-browserify": true, - "json-rpc-engine>@metamask/safe-event-emitter": true + "@metamask/controllers>ethereumjs-wallet>uuid": { + "globals": { + "crypto": true, + "msCrypto": true } }, - "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store>through2": { + "@metamask/controllers>isomorphic-fetch": { + "globals": { + "fetch.bind": true + }, "packages": { - "browserify>process": true, - "browserify>util": true, - "readable-stream": true, - "watchify>xtend": true + "@metamask/controllers>isomorphic-fetch>whatwg-fetch": true } }, - "@material-ui/core": { + "@metamask/controllers>isomorphic-fetch>whatwg-fetch": { "globals": { - "Image": true, - "_formatMuiErrorMessage": true, - "addEventListener": true, - "clearInterval": true, + "Blob": true, + "FileReader": true, + "FormData": true, + "URLSearchParams.prototype.isPrototypeOf": true, + "XMLHttpRequest": true, + "define": true, + "setTimeout": true + } + }, + "@metamask/controllers>multiformats": { + "globals": { + "TextDecoder": true, + "TextEncoder": true, + "console.warn": true + } + }, + "@metamask/controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, + "@metamask/controllers>web3": { + "globals": { + "Web3": "write", + "XMLHttpRequest": true, "clearTimeout": true, "console.error": true, - "console.warn": true, - "document": true, - "getComputedStyle": true, - "getSelection": true, - "innerHeight": true, - "innerWidth": true, - "matchMedia": true, - "navigator": true, - "performance.now": true, - "removeEventListener": true, - "requestAnimationFrame": true, - "setInterval": true, "setTimeout": true }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles": true, - "@material-ui/core>@material-ui/system": true, - "@material-ui/core>@material-ui/utils": true, - "@material-ui/core>clsx": true, - "@material-ui/core>popper.js": true, - "@material-ui/core>react-transition-group": true, - "prop-types": true, - "prop-types>react-is": true, - "react": true, - "react-dom": true, - "react-redux>hoist-non-react-statics": true + "@metamask/controllers>web3>bignumber.js": true, + "@metamask/controllers>web3>crypto-js": true, + "@metamask/controllers>web3>utf8": true, + "@metamask/controllers>web3>xhr2-cookies": true, + "browserify>buffer": true } }, - "@material-ui/core>@material-ui/styles": { + "@metamask/controllers>web3-provider-engine": { "globals": { - "console.error": true, - "console.warn": true, - "document.createComment": true, - "document.head": true + "WebSocket": true, + "console": true, + "setTimeout": true }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss": true, - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": true, - "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": true, - "@material-ui/core>@material-ui/styles>jss-plugin-global": true, - "@material-ui/core>@material-ui/styles>jss-plugin-nested": true, - "@material-ui/core>@material-ui/styles>jss-plugin-props-sort": true, - "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": true, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": true, - "@material-ui/core>@material-ui/utils": true, - "@material-ui/core>clsx": true, - "prop-types": true, - "react": true, - "react-redux>hoist-non-react-statics": true + "@ethereumjs/tx": true, + "@metamask/controllers>eth-json-rpc-infura": true, + "@metamask/controllers>web3-provider-engine>backoff": true, + "@metamask/controllers>web3-provider-engine>eth-block-tracker": true, + "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware": true, + "@metamask/controllers>web3-provider-engine>eth-sig-util": true, + "@metamask/controllers>web3-provider-engine>ethereumjs-util": true, + "@metamask/controllers>web3-provider-engine>semaphore": true, + "browserify>browser-resolve": true, + "browserify>buffer": true, + "browserify>events": true, + "browserify>util": true, + "eth-json-rpc-filters": true, + "gh-pages>async": true, + "lavamoat>json-stable-stringify": true, + "watchify>xtend": true } }, - "@material-ui/core>@material-ui/styles>jss": { + "@metamask/controllers>web3-provider-engine>backoff": { "globals": { - "CSS": true, - "document.createElement": true, - "document.querySelector": true + "clearTimeout": true, + "setTimeout": true }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": true, - "react-router-dom>tiny-warning": true + "@metamask/controllers>web3-provider-engine>backoff>precond": true, + "browserify>events": true, + "browserify>util": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case": { + "@metamask/controllers>web3-provider-engine>backoff>precond": { "packages": { - "@material-ui/core>@material-ui/styles>jss-plugin-camel-case>hyphenate-style-name": true + "browserify>util": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-default-unit": { + "@metamask/controllers>web3-provider-engine>cross-fetch>node-fetch": { "globals": { - "CSS": true + "fetch": true + } + }, + "@metamask/controllers>web3-provider-engine>eth-block-tracker": { + "globals": { + "clearTimeout": true, + "console.error": true, + "setTimeout": true }, "packages": { - "@material-ui/core>@material-ui/styles>jss": true + "@metamask/controllers>web3-provider-engine>eth-block-tracker>pify": true, + "eth-query": true, + "safe-event-emitter": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-global": { + "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware": { + "globals": { + "console.error": true, + "fetch": true, + "setTimeout": true + }, "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss": true + "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>json-rpc-engine": true, + "@metamask/controllers>web3-provider-engine>eth-rpc-errors": true, + "browserify>url": true, + "lavamoat>json-stable-stringify": true, + "node-fetch": true, + "source-map-explorer>btoa": true, + "vinyl>clone": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-nested": { - "packages": { - "@babel/runtime": true, - "react-router-dom>tiny-warning": true + "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>node-fetch": { + "globals": { + "fetch": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-rule-value-function": { + "@metamask/controllers>web3-provider-engine>eth-rpc-errors": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true, - "react-router-dom>tiny-warning": true + "eth-rpc-errors>fast-safe-stringify": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer": { + "@metamask/controllers>web3-provider-engine>eth-sig-util": { "packages": { - "@material-ui/core>@material-ui/styles>jss": true, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": true + "@metamask/controllers>web3-provider-engine>ethereumjs-util": true, + "ethereumjs-abi": true } }, - "@material-ui/core>@material-ui/styles>jss-plugin-vendor-prefixer>css-vendor": { - "globals": { - "document.createElement": true, - "document.documentElement": true, - "getComputedStyle": true - }, + "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": true + "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi>ethereumjs-util": true, + "bn.js": true, + "browserify>buffer": true } }, - "@material-ui/core>@material-ui/styles>jss>is-in-browser": { - "globals": { - "document": true + "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi>ethereumjs-util": { + "packages": { + "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>assert": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true } }, - "@material-ui/core>@material-ui/system": { - "globals": { - "console.error": true - }, + "@metamask/controllers>web3-provider-engine>ethereumjs-util": { "packages": { - "@babel/runtime": true, - "@material-ui/core>@material-ui/utils": true, - "prop-types": true + "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>assert": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true, + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, - "@material-ui/core>@material-ui/utils": { + "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": { "packages": { - "@babel/runtime": true, - "prop-types": true, - "prop-types>react-is": true + "browserify>buffer": true, + "ethjs>ethjs-util>is-hex-prefixed": true, + "ethjs>ethjs-util>strip-hex-prefix": true } }, - "@material-ui/core>popper.js": { + "@metamask/controllers>web3-provider-engine>semaphore": { "globals": { - "MSInputMethodContext": true, - "Node.DOCUMENT_POSITION_FOLLOWING": true, - "cancelAnimationFrame": true, - "console.warn": true, "define": true, - "devicePixelRatio": true, - "document": true, - "getComputedStyle": true, - "innerHeight": true, - "innerWidth": true, - "navigator": true, - "requestAnimationFrame": true, "setTimeout": true + }, + "packages": { + "browserify>process": true } }, - "@material-ui/core>react-transition-group": { + "@metamask/controllers>web3>bignumber.js": { "globals": { - "Element": true, - "setTimeout": true + "define": true }, "packages": { - "@material-ui/core>react-transition-group>dom-helpers": true, - "prop-types": true, - "react": true, - "react-dom": true + "browserify>crypto-browserify": true } }, - "@material-ui/core>react-transition-group>dom-helpers": { - "packages": { - "@babel/runtime": true + "@metamask/controllers>web3>crypto-js": { + "globals": { + "define": true } }, - "@metamask/controllers": { + "@metamask/controllers>web3>utf8": { "globals": { - "Headers": true, - "URL": true, - "clearInterval": true, - "clearTimeout": true, - "console.error": true, - "console.log": true, - "fetch": true, - "setInterval": true, - "setTimeout": true + "define": true + } + }, + "@metamask/controllers>web3>xhr2-cookies": { + "globals": { + "console.warn": true + }, + "packages": { + "browserify>buffer": true, + "browserify>https-browserify": true, + "browserify>os-browserify": true, + "browserify>process": true, + "browserify>stream-http": true, + "browserify>url": true, + "pubnub>superagent>cookiejar": true + } + }, + "@metamask/eth-json-rpc-infura": { + "globals": { + "setTimeout": true + }, + "packages": { + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware": true, + "eth-block-tracker>@metamask/utils": true, + "eth-rpc-errors": true, + "json-rpc-engine": true, + "node-fetch": true + } + }, + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware": { + "globals": { + "URL": true, + "btoa": true, + "console.error": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": true, + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>pify": true, + "browserify>browser-resolve": true, + "eth-rpc-errors": true, + "json-rpc-engine": true, + "json-rpc-engine>@metamask/safe-event-emitter": true, + "lavamoat>json-stable-stringify": true, + "vinyl>clone": true + } + }, + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": { + "packages": { + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true, + "ethereumjs-abi": true + } + }, + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": { + "packages": { + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": true, + "bn.js": true, + "browserify>buffer": true + } + }, + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": { + "packages": { + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>assert": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true + } + }, + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": { + "packages": { + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>assert": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true, + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true + } + }, + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": { + "packages": { + "browserify>buffer": true, + "ethjs>ethjs-util>is-hex-prefixed": true, + "ethjs>ethjs-util>strip-hex-prefix": true + } + }, + "@metamask/eth-ledger-bridge-keyring": { + "globals": { + "addEventListener": true, + "console.log": true, + "document.createElement": true, + "document.head.appendChild": true, + "fetch": true, + "removeEventListener": true }, "packages": { - "@ethereumjs/common": true, "@ethereumjs/tx": true, - "@metamask/contract-metadata": true, - "@metamask/controllers>abort-controller": true, - "@metamask/controllers>async-mutex": true, - "@metamask/controllers>eth-json-rpc-infura": true, - "@metamask/controllers>eth-method-registry": true, - "@metamask/controllers>eth-phishing-detect": true, - "@metamask/controllers>ethereumjs-wallet": true, - "@metamask/controllers>isomorphic-fetch": true, - "@metamask/controllers>multiformats": true, - "@metamask/controllers>nanoid": true, - "@metamask/controllers>web3": true, - "@metamask/controllers>web3-provider-engine": true, - "@metamask/metamask-eth-abis": true, + "@metamask/eth-ledger-bridge-keyring>eth-sig-util": true, "browserify>buffer": true, "browserify>events": true, - "deep-freeze-strict": true, - "eslint>fast-deep-equal": true, - "eth-ens-namehash": true, - "eth-keyring-controller": true, + "eth-trezor-keyring>hdkey": true, + "ethereumjs-util": true + } + }, + "@metamask/eth-ledger-bridge-keyring>eth-sig-util": { + "packages": { + "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util": true, + "browserify>buffer": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true, + "ethereumjs-abi": true + } + }, + "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util": { + "packages": { + "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>assert": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true, + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true + } + }, + "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>ethjs-util": { + "packages": { + "browserify>buffer": true, + "ethjs>ethjs-util>is-hex-prefixed": true, + "ethjs>ethjs-util>strip-hex-prefix": true + } + }, + "@metamask/eth-token-tracker": { + "globals": { + "console.warn": true + }, + "packages": { + "@babel/runtime": true, + "@metamask/eth-token-tracker>deep-equal": true, + "@metamask/eth-token-tracker>eth-block-tracker": true, + "@metamask/eth-token-tracker>ethjs": true, + "@metamask/eth-token-tracker>human-standard-token-abi": true, + "ethjs-contract": true, + "ethjs-query": true, + "safe-event-emitter": true + } + }, + "@metamask/eth-token-tracker>deep-equal": { + "packages": { + "@metamask/eth-token-tracker>deep-equal>is-arguments": true, + "@metamask/eth-token-tracker>deep-equal>is-date-object": true, + "enzyme>is-regex": true, + "enzyme>object-is": true, + "mocha>object.assign>object-keys": true, + "string.prototype.matchall>regexp.prototype.flags": true + } + }, + "@metamask/eth-token-tracker>deep-equal>is-arguments": { + "packages": { + "koa>is-generator-function>has-tostringtag": true, + "string.prototype.matchall>call-bind": true + } + }, + "@metamask/eth-token-tracker>deep-equal>is-date-object": { + "packages": { + "koa>is-generator-function>has-tostringtag": true + } + }, + "@metamask/eth-token-tracker>eth-block-tracker": { + "globals": { + "clearTimeout": true, + "console.error": true, + "setTimeout": true + }, + "packages": { + "@metamask/eth-token-tracker>eth-block-tracker>pify": true, "eth-query": true, - "eth-rpc-errors": true, - "eth-sig-util": true, - "ethereumjs-util": true, - "ethers": true, + "safe-event-emitter": true + } + }, + "@metamask/eth-token-tracker>ethjs": { + "globals": { + "clearInterval": true, + "setInterval": true + }, + "packages": { + "@metamask/eth-token-tracker>ethjs>bn.js": true, + "@metamask/eth-token-tracker>ethjs>ethjs-abi": true, + "@metamask/eth-token-tracker>ethjs>ethjs-contract": true, + "@metamask/eth-token-tracker>ethjs>ethjs-query": true, + "browserify>buffer": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-provider-http": true, "ethjs>ethjs-unit": true, - "immer": true, - "json-rpc-engine": true, - "jsonschema": true, - "punycode": true, - "single-call-balance-checker-abi": true, - "uuid": true + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/eth-token-tracker>ethjs>ethjs-abi": { + "packages": { + "@metamask/eth-token-tracker>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/eth-token-tracker>ethjs>ethjs-contract": { + "packages": { + "@metamask/eth-token-tracker>ethjs>ethjs-contract>ethjs-abi": true, + "ethjs-query>babel-runtime": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "promise-to-callback": true + } + }, + "@metamask/eth-token-tracker>ethjs>ethjs-contract>ethjs-abi": { + "packages": { + "@metamask/eth-token-tracker>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/eth-token-tracker>ethjs>ethjs-query": { + "globals": { + "console": true + }, + "packages": { + "ethjs-query>babel-runtime": true, + "ethjs-query>ethjs-format": true, + "ethjs-query>ethjs-rpc": true, + "promise-to-callback": true + } + }, + "@metamask/etherscan-link": { + "globals": { + "URL": true + } + }, + "@metamask/jazzicon": { + "globals": { + "document.createElement": true, + "document.createElementNS": true + }, + "packages": { + "@metamask/jazzicon>color": true, + "@metamask/jazzicon>mersenne-twister": true + } + }, + "@metamask/jazzicon>color": { + "packages": { + "@metamask/jazzicon>color>clone": true, + "@metamask/jazzicon>color>color-convert": true, + "@metamask/jazzicon>color>color-string": true + } + }, + "@metamask/jazzicon>color>clone": { + "packages": { + "browserify>buffer": true + } + }, + "@metamask/jazzicon>color>color-convert": { + "packages": { + "@metamask/jazzicon>color>color-convert>color-name": true + } + }, + "@metamask/jazzicon>color>color-string": { + "packages": { + "jest-canvas-mock>moo-color>color-name": true + } + }, + "@metamask/logo": { + "globals": { + "addEventListener": true, + "document.body.appendChild": true, + "document.createElementNS": true, + "innerHeight": true, + "innerWidth": true, + "requestAnimationFrame": true + }, + "packages": { + "@metamask/logo>gl-mat4": true, + "@metamask/logo>gl-vec3": true + } + }, + "@metamask/obs-store": { + "globals": { + "localStorage": true + }, + "packages": { + "@metamask/obs-store>through2": true, + "browserify>stream-browserify": true, + "json-rpc-engine>@metamask/safe-event-emitter": true + } + }, + "@metamask/obs-store>through2": { + "packages": { + "browserify>process": true, + "browserify>util": true, + "readable-stream": true, + "watchify>xtend": true + } + }, + "@metamask/post-message-stream": { + "globals": { + "WorkerGlobalScope": true, + "addEventListener": true, + "location.origin": true, + "onmessage": "write", + "postMessage": true, + "removeEventListener": true + }, + "packages": { + "@metamask/post-message-stream>@metamask/utils": true, + "@metamask/post-message-stream>readable-stream": true + } + }, + "@metamask/post-message-stream>@metamask/utils": { + "packages": { + "eslint>fast-deep-equal": true + } + }, + "@metamask/post-message-stream>readable-stream": { + "packages": { + "@metamask/post-message-stream>readable-stream>safe-buffer": true, + "@metamask/post-message-stream>readable-stream>string_decoder": true, + "@storybook/api>util-deprecate": true, + "browserify>browser-resolve": true, + "browserify>events": true, + "browserify>process": true, + "browserify>timers-browserify": true, + "pumpify>inherits": true, + "readable-stream>core-util-is": true, + "readable-stream>isarray": true, + "vinyl>cloneable-readable>process-nextick-args": true + } + }, + "@metamask/post-message-stream>readable-stream>safe-buffer": { + "packages": { + "browserify>buffer": true + } + }, + "@metamask/post-message-stream>readable-stream>string_decoder": { + "packages": { + "@metamask/post-message-stream>readable-stream>safe-buffer": true + } + }, + "@metamask/providers>@metamask/object-multiplex": { + "globals": { + "console.warn": true + }, + "packages": { + "end-of-stream": true, + "pump>once": true, + "readable-stream": true + } + }, + "@metamask/rpc-methods": { + "globals": { + "console.warn": true + }, + "packages": { + "@metamask/rpc-methods>@metamask/controllers": true, + "@metamask/rpc-methods>@metamask/key-tree": true, + "@metamask/rpc-methods>nanoid": true, + "@metamask/snap-utils": true, + "@metamask/snap-utils>superstruct": true, + "eth-block-tracker>@metamask/utils": true, + "eth-rpc-errors": true + } + }, + "@metamask/rpc-methods>@metamask/controllers": { + "globals": { + "Headers": true, + "URL": true, + "clearInterval": true, + "clearTimeout": true, + "console.error": true, + "console.log": true, + "fetch": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "@ethereumjs/common": true, + "@ethereumjs/tx": true, + "@metamask/contract-metadata": true, + "@metamask/controllers>@ethersproject/abi": true, + "@metamask/controllers>@ethersproject/contracts": true, + "@metamask/controllers>@ethersproject/providers": true, + "@metamask/controllers>abort-controller": true, + "@metamask/controllers>async-mutex": true, + "@metamask/controllers>eth-json-rpc-infura": true, + "@metamask/controllers>eth-phishing-detect": true, + "@metamask/controllers>isomorphic-fetch": true, + "@metamask/controllers>multiformats": true, + "@metamask/controllers>web3": true, + "@metamask/controllers>web3-provider-engine": true, + "@metamask/metamask-eth-abis": true, + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry": true, + "@metamask/rpc-methods>@metamask/controllers>ethereumjs-wallet": true, + "@metamask/rpc-methods>nanoid": true, + "browserify>buffer": true, + "browserify>events": true, + "deep-freeze-strict": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true, + "eth-keyring-controller": true, + "eth-query": true, + "eth-rpc-errors": true, + "eth-sig-util": true, + "ethereumjs-util": true, + "ethjs>ethjs-unit": true, + "immer": true, + "json-rpc-engine": true, + "jsonschema": true, + "punycode": true, + "single-call-balance-checker-abi": true, + "uuid": true + } + }, + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry": { + "packages": { + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs": true + } + }, + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs": { + "globals": { + "clearInterval": true, + "setInterval": true + }, + "packages": { + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true, + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true, + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true, + "browserify>buffer": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-provider-http": true, + "ethjs>ethjs-unit": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": { + "packages": { + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": { + "packages": { + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true, + "ethjs-query>babel-runtime": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "promise-to-callback": true + } + }, + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": { + "packages": { + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/rpc-methods>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": { + "globals": { + "console": true + }, + "packages": { + "ethjs-query>babel-runtime": true, + "ethjs-query>ethjs-format": true, + "ethjs-query>ethjs-rpc": true, + "promise-to-callback": true + } + }, + "@metamask/rpc-methods>@metamask/controllers>ethereumjs-wallet": { + "packages": { + "@metamask/rpc-methods>@metamask/controllers>ethereumjs-wallet>uuid": true, + "@truffle/codec>utf8": true, + "browserify>buffer": true, + "browserify>crypto-browserify": true, + "ethereumjs-util": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-wallet>aes-js": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>randombytes": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true + } + }, + "@metamask/rpc-methods>@metamask/controllers>ethereumjs-wallet>uuid": { + "globals": { + "crypto": true, + "msCrypto": true + } + }, + "@metamask/rpc-methods>@metamask/key-tree": { + "packages": { + "@metamask/rpc-methods>@metamask/key-tree>@noble/ed25519": true, + "@metamask/rpc-methods>@metamask/key-tree>@noble/secp256k1": true, + "@metamask/rpc-methods>@metamask/key-tree>@scure/bip39": true, + "@metamask/snap-utils>@noble/hashes": true, + "@metamask/snap-utils>@scure/base": true, + "eth-block-tracker>@metamask/utils": true + } + }, + "@metamask/rpc-methods>@metamask/key-tree>@noble/ed25519": { + "globals": { + "crypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "@metamask/rpc-methods>@metamask/key-tree>@noble/secp256k1": { + "globals": { + "crypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "@metamask/rpc-methods>@metamask/key-tree>@scure/bip39": { + "packages": { + "@metamask/snap-utils>@noble/hashes": true, + "@metamask/snap-utils>@scure/base": true + } + }, + "@metamask/rpc-methods>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, + "@metamask/smart-transactions-controller": { + "globals": { + "URLSearchParams": true, + "clearInterval": true, + "console.error": true, + "console.log": true, + "fetch": true, + "setInterval": true + }, + "packages": { + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@metamask/controllers>@ethersproject/providers": true, + "@metamask/controllers>isomorphic-fetch": true, + "@metamask/smart-transactions-controller>@metamask/controllers": true, + "@metamask/smart-transactions-controller>bignumber.js": true, + "@metamask/smart-transactions-controller>fast-json-patch": true, + "lodash": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers": { + "globals": { + "Headers": true, + "URL": true, + "clearInterval": true, + "clearTimeout": true, + "console.error": true, + "console.log": true, + "fetch": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "@ethereumjs/common": true, + "@ethereumjs/tx": true, + "@metamask/contract-metadata": true, + "@metamask/controllers>@ethersproject/abi": true, + "@metamask/controllers>@ethersproject/contracts": true, + "@metamask/controllers>@ethersproject/providers": true, + "@metamask/controllers>abort-controller": true, + "@metamask/controllers>async-mutex": true, + "@metamask/controllers>eth-json-rpc-infura": true, + "@metamask/controllers>eth-phishing-detect": true, + "@metamask/controllers>isomorphic-fetch": true, + "@metamask/controllers>multiformats": true, + "@metamask/controllers>web3": true, + "@metamask/controllers>web3-provider-engine": true, + "@metamask/metamask-eth-abis": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": true, + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": true, + "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": true, + "browserify>buffer": true, + "browserify>events": true, + "deep-freeze-strict": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true, + "eth-keyring-controller": true, + "eth-query": true, + "eth-rpc-errors": true, + "eth-sig-util": true, + "ethereumjs-util": true, + "ethjs>ethjs-unit": true, + "immer": true, + "json-rpc-engine": true, + "jsonschema": true, + "punycode": true, + "single-call-balance-checker-abi": true, + "uuid": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": { + "globals": { + "clearInterval": true, + "setInterval": true + }, + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true, + "browserify>buffer": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-provider-http": true, + "ethjs>ethjs-unit": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true, + "ethjs-query>babel-runtime": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "promise-to-callback": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": { + "globals": { + "console": true + }, + "packages": { + "ethjs-query>babel-runtime": true, + "ethjs-query>ethjs-format": true, + "ethjs-query>ethjs-rpc": true, + "promise-to-callback": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": true, + "@truffle/codec>utf8": true, + "browserify>buffer": true, + "browserify>crypto-browserify": true, + "ethereumjs-util": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-wallet>aes-js": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>randombytes": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": { + "globals": { + "crypto": true, + "msCrypto": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, + "@metamask/smart-transactions-controller>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@metamask/smart-transactions-controller>fast-json-patch": { + "globals": { + "addEventListener": true, + "clearTimeout": true, + "removeEventListener": true, + "setTimeout": true + } + }, + "@metamask/snap-controllers": { + "globals": { + "URL": true, + "clearTimeout": true, + "console.error": true, + "console.info": true, + "console.log": true, + "console.warn": true, + "document.body.appendChild": true, + "document.createElement": true, + "document.getElementById": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@metamask/post-message-stream": true, + "@metamask/providers>@metamask/object-multiplex": true, + "@metamask/rpc-methods": true, + "@metamask/snap-controllers>@metamask/browser-passworder": true, + "@metamask/snap-controllers>@metamask/controllers": true, + "@metamask/snap-controllers>@xstate/fsm": true, + "@metamask/snap-controllers>concat-stream": true, + "@metamask/snap-controllers>gunzip-maybe": true, + "@metamask/snap-controllers>json-rpc-middleware-stream": true, + "@metamask/snap-controllers>nanoid": true, + "@metamask/snap-controllers>readable-web-to-node-stream": true, + "@metamask/snap-controllers>tar-stream": true, + "@metamask/snap-utils": true, + "eth-block-tracker>@metamask/utils": true, + "eth-rpc-errors": true, + "json-rpc-engine": true, + "pump": true + } + }, + "@metamask/snap-controllers>@metamask/browser-passworder": { + "globals": { + "btoa": true, + "crypto.getRandomValues": true, + "crypto.subtle.decrypt": true, + "crypto.subtle.deriveKey": true, + "crypto.subtle.encrypt": true, + "crypto.subtle.importKey": true + }, + "packages": { + "browserify>buffer": true + } + }, + "@metamask/snap-controllers>@metamask/controllers": { + "globals": { + "Headers": true, + "URL": true, + "clearInterval": true, + "clearTimeout": true, + "console.error": true, + "console.log": true, + "fetch": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "@ethereumjs/common": true, + "@ethereumjs/tx": true, + "@metamask/contract-metadata": true, + "@metamask/controllers>@ethersproject/abi": true, + "@metamask/controllers>@ethersproject/contracts": true, + "@metamask/controllers>@ethersproject/providers": true, + "@metamask/controllers>abort-controller": true, + "@metamask/controllers>async-mutex": true, + "@metamask/controllers>eth-json-rpc-infura": true, + "@metamask/controllers>eth-phishing-detect": true, + "@metamask/controllers>isomorphic-fetch": true, + "@metamask/controllers>multiformats": true, + "@metamask/controllers>web3": true, + "@metamask/controllers>web3-provider-engine": true, + "@metamask/metamask-eth-abis": true, + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry": true, + "@metamask/snap-controllers>@metamask/controllers>ethereumjs-wallet": true, + "@metamask/snap-controllers>nanoid": true, + "browserify>buffer": true, + "browserify>events": true, + "deep-freeze-strict": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true, + "eth-keyring-controller": true, + "eth-query": true, + "eth-rpc-errors": true, + "eth-sig-util": true, + "ethereumjs-util": true, + "ethjs>ethjs-unit": true, + "immer": true, + "json-rpc-engine": true, + "jsonschema": true, + "punycode": true, + "single-call-balance-checker-abi": true, + "uuid": true + } + }, + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry": { + "packages": { + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs": true + } + }, + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs": { + "globals": { + "clearInterval": true, + "setInterval": true + }, + "packages": { + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true, + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true, + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true, + "browserify>buffer": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-provider-http": true, + "ethjs>ethjs-unit": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": { + "packages": { + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": { + "packages": { + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true, + "ethjs-query>babel-runtime": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "promise-to-callback": true + } + }, + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": { + "packages": { + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/snap-controllers>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": { + "globals": { + "console": true + }, + "packages": { + "ethjs-query>babel-runtime": true, + "ethjs-query>ethjs-format": true, + "ethjs-query>ethjs-rpc": true, + "promise-to-callback": true + } + }, + "@metamask/snap-controllers>@metamask/controllers>ethereumjs-wallet": { + "packages": { + "@metamask/snap-controllers>@metamask/controllers>ethereumjs-wallet>uuid": true, + "@truffle/codec>utf8": true, + "browserify>buffer": true, + "browserify>crypto-browserify": true, + "ethereumjs-util": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-wallet>aes-js": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>randombytes": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true + } + }, + "@metamask/snap-controllers>@metamask/controllers>ethereumjs-wallet>uuid": { + "globals": { + "crypto": true, + "msCrypto": true + } + }, + "@metamask/snap-controllers>concat-stream": { + "packages": { + "@metamask/snap-controllers>concat-stream>readable-stream": true, + "browserify>buffer": true, + "pumpify>inherits": true + } + }, + "@metamask/snap-controllers>concat-stream>readable-stream": { + "packages": { + "@storybook/api>util-deprecate": true, + "browserify>browser-resolve": true, + "browserify>buffer": true, + "browserify>events": true, + "browserify>process": true, + "browserify>string_decoder": true, + "pumpify>inherits": true + } + }, + "@metamask/snap-controllers>gunzip-maybe": { + "packages": { + "@metamask/snap-controllers>gunzip-maybe>browserify-zlib": true, + "@metamask/snap-controllers>gunzip-maybe>is-deflate": true, + "@metamask/snap-controllers>gunzip-maybe>is-gzip": true, + "@metamask/snap-controllers>gunzip-maybe>peek-stream": true, + "@metamask/snap-controllers>gunzip-maybe>pumpify": true, + "@metamask/snap-controllers>gunzip-maybe>through2": true + } + }, + "@metamask/snap-controllers>gunzip-maybe>browserify-zlib": { + "packages": { + "@metamask/snap-controllers>gunzip-maybe>browserify-zlib>pako": true, + "browserify>assert": true, + "browserify>buffer": true, + "browserify>process": true, + "browserify>util": true, + "readable-stream": true + } + }, + "@metamask/snap-controllers>gunzip-maybe>peek-stream": { + "packages": { + "@metamask/snap-controllers>gunzip-maybe>peek-stream>duplexify": true, + "@metamask/snap-controllers>gunzip-maybe>peek-stream>through2": true, + "browserify>buffer": true, + "terser>source-map-support>buffer-from": true + } + }, + "@metamask/snap-controllers>gunzip-maybe>peek-stream>duplexify": { + "packages": { + "browserify>buffer": true, + "browserify>process": true, + "duplexify>stream-shift": true, + "end-of-stream": true, + "pumpify>inherits": true, + "readable-stream": true + } + }, + "@metamask/snap-controllers>gunzip-maybe>peek-stream>through2": { + "packages": { + "browserify>process": true, + "browserify>util": true, + "readable-stream": true, + "watchify>xtend": true + } + }, + "@metamask/snap-controllers>gunzip-maybe>pumpify": { + "packages": { + "@metamask/snap-controllers>gunzip-maybe>pumpify>duplexify": true, + "@metamask/snap-controllers>gunzip-maybe>pumpify>pump": true, + "pumpify>inherits": true + } + }, + "@metamask/snap-controllers>gunzip-maybe>pumpify>duplexify": { + "packages": { + "browserify>buffer": true, + "browserify>process": true, + "duplexify>stream-shift": true, + "end-of-stream": true, + "pumpify>inherits": true, + "readable-stream": true + } + }, + "@metamask/snap-controllers>gunzip-maybe>pumpify>pump": { + "packages": { + "browserify>browser-resolve": true, + "end-of-stream": true, + "pump>once": true + } + }, + "@metamask/snap-controllers>gunzip-maybe>through2": { + "packages": { + "browserify>process": true, + "browserify>util": true, + "readable-stream": true, + "watchify>xtend": true + } + }, + "@metamask/snap-controllers>json-rpc-middleware-stream": { + "globals": { + "setTimeout": true + }, + "packages": { + "json-rpc-engine>@metamask/safe-event-emitter": true, + "readable-stream": true + } + }, + "@metamask/snap-controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, + "@metamask/snap-controllers>readable-web-to-node-stream": { + "packages": { + "@metamask/snap-controllers>readable-web-to-node-stream>readable-stream": true + } + }, + "@metamask/snap-controllers>readable-web-to-node-stream>readable-stream": { + "packages": { + "@storybook/api>util-deprecate": true, + "browserify>browser-resolve": true, + "browserify>buffer": true, + "browserify>events": true, + "browserify>process": true, + "browserify>string_decoder": true, + "pumpify>inherits": true + } + }, + "@metamask/snap-controllers>tar-stream": { + "packages": { + "@metamask/snap-controllers>tar-stream>fs-constants": true, + "@metamask/snap-controllers>tar-stream>readable-stream": true, + "browserify>buffer": true, + "browserify>process": true, + "browserify>string_decoder": true, + "browserify>util": true, + "end-of-stream": true, + "madge>ora>bl": true, + "pumpify>inherits": true + } + }, + "@metamask/snap-controllers>tar-stream>fs-constants": { + "packages": { + "browserify>constants-browserify": true + } + }, + "@metamask/snap-controllers>tar-stream>readable-stream": { + "packages": { + "@storybook/api>util-deprecate": true, + "browserify>browser-resolve": true, + "browserify>buffer": true, + "browserify>events": true, + "browserify>process": true, + "browserify>string_decoder": true, + "pumpify>inherits": true + } + }, + "@metamask/snap-utils": { + "globals": { + "URL": true + }, + "packages": { + "@babel/core": true, + "@babel/core>@babel/types": true, + "@metamask/snap-utils>@noble/hashes": true, + "@metamask/snap-utils>@scure/base": true, + "@metamask/snap-utils>cron-parser": true, + "@metamask/snap-utils>rfdc": true, + "@metamask/snap-utils>superstruct": true, + "browserify": true, + "browserify>buffer": true, + "browserify>crypto-browserify": true, + "browserify>events": true, + "browserify>path-browserify": true, + "eslint>fast-deep-equal": true, + "eth-block-tracker>@metamask/utils": true, + "semver": true + } + }, + "@metamask/snap-utils>@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true + } + }, + "@metamask/snap-utils>@scure/base": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + } + }, + "@metamask/snap-utils>cron-parser": { + "packages": { + "browserify>browser-resolve": true, + "luxon": true + } + }, + "@metamask/snap-utils>rfdc": { + "packages": { + "browserify>buffer": true + } + }, + "@ngraveio/bc-ur": { + "packages": { + "@ngraveio/bc-ur>@apocentre/alias-sampling": true, + "@ngraveio/bc-ur>bignumber.js": true, + "@ngraveio/bc-ur>crc": true, + "@ngraveio/bc-ur>jsbi": true, + "addons-linter>sha.js": true, + "browserify>assert": true, + "browserify>buffer": true, + "pubnub>cbor-sync": true + } + }, + "@ngraveio/bc-ur>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@ngraveio/bc-ur>crc": { + "packages": { + "browserify>buffer": true + } + }, + "@ngraveio/bc-ur>jsbi": { + "globals": { + "define": true + } + }, + "@popperjs/core": { + "globals": { + "Element": true, + "HTMLElement": true, + "ShadowRoot": true, + "console.error": true, + "console.warn": true, + "document": true, + "navigator.userAgent": true + } + }, + "@reduxjs/toolkit": { + "globals": { + "AbortController": true, + "__REDUX_DEVTOOLS_EXTENSION_COMPOSE__": true, + "__REDUX_DEVTOOLS_EXTENSION__": true, + "console.error": true, + "console.info": true, + "console.warn": true + }, + "packages": { + "@reduxjs/toolkit>reselect": true, + "immer": true, + "redux": true, + "redux-thunk": true + } + }, + "@segment/loosely-validate-event": { + "packages": { + "@segment/loosely-validate-event>component-type": true, + "@segment/loosely-validate-event>join-component": true, + "browserify>assert": true, + "browserify>buffer": true + } + }, + "@sentry/browser": { + "globals": { + "XMLHttpRequest": true, + "setTimeout": true + }, + "packages": { + "@sentry/browser>@sentry/core": true, + "@sentry/types": true, + "@sentry/utils": true, + "@sentry/utils>tslib": true + } + }, + "@sentry/browser>@sentry/core": { + "globals": { + "clearInterval": true, + "setInterval": true + }, + "packages": { + "@sentry/browser>@sentry/core>@sentry/hub": true, + "@sentry/browser>@sentry/core>@sentry/minimal": true, + "@sentry/types": true, + "@sentry/utils": true, + "@sentry/utils>tslib": true + } + }, + "@sentry/browser>@sentry/core>@sentry/hub": { + "globals": { + "clearInterval": true, + "setInterval": true + }, + "packages": { + "@sentry/types": true, + "@sentry/utils": true, + "@sentry/utils>tslib": true + } + }, + "@sentry/browser>@sentry/core>@sentry/minimal": { + "packages": { + "@sentry/browser>@sentry/core>@sentry/hub": true, + "@sentry/utils>tslib": true + } + }, + "@sentry/integrations": { + "globals": { + "clearTimeout": true, + "console.error": true, + "console.log": true, + "setTimeout": true + }, + "packages": { + "@sentry/types": true, + "@sentry/utils": true, + "@sentry/utils>tslib": true, + "localforage": true + } + }, + "@sentry/utils": { + "globals": { + "CustomEvent": true, + "DOMError": true, + "DOMException": true, + "Element": true, + "ErrorEvent": true, + "Event": true, + "Headers": true, + "Request": true, + "Response": true, + "XMLHttpRequest.prototype": true, + "clearTimeout": true, + "console.error": true, + "document": true, + "setTimeout": true + }, + "packages": { + "@sentry/utils>tslib": true, + "browserify>process": true + } + }, + "@sentry/utils>tslib": { + "globals": { + "define": true + } + }, + "@spruceid/siwe-parser": { + "globals": { + "console.error": true, + "console.log": true + }, + "packages": { + "@spruceid/siwe-parser>apg-js": true + } + }, + "@spruceid/siwe-parser>apg-js": { + "globals": { + "mode": true + }, + "packages": { + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true + } + }, + "@storybook/api>regenerator-runtime": { + "globals": { + "regeneratorRuntime": "write" + } + }, + "@storybook/api>util-deprecate": { + "globals": { + "console.trace": true, + "console.warn": true, + "localStorage": true + } + }, + "@truffle/codec": { + "packages": { + "@truffle/codec>@truffle/abi-utils": true, + "@truffle/codec>@truffle/compile-common": true, + "@truffle/codec>big.js": true, + "@truffle/codec>bn.js": true, + "@truffle/codec>cbor": true, + "@truffle/codec>lodash.escaperegexp": true, + "@truffle/codec>lodash.partition": true, + "@truffle/codec>lodash.sum": true, + "@truffle/codec>utf8": true, + "@truffle/codec>web3-utils": true, + "browserify>buffer": true, + "browserify>util": true, + "gulp-dart-sass>lodash.clonedeep": true, + "nock>debug": true, + "semver": true + } + }, + "@truffle/codec>@truffle/abi-utils": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case": true, + "@truffle/codec>@truffle/abi-utils>faker": true, + "@truffle/codec>@truffle/abi-utils>fast-check": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>camel-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>constant-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>dot-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>header-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>is-lower-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>is-upper-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>lower-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>lower-case-first": true, + "@truffle/codec>@truffle/abi-utils>change-case>no-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>param-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>pascal-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>path-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>sentence-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>snake-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>swap-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>title-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>upper-case-first": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>camel-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>no-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>constant-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>snake-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>dot-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>no-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>header-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>no-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>is-lower-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>lower-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>is-upper-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>lower-case-first": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>lower-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>no-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>lower-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>param-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>no-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>pascal-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>camel-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>upper-case-first": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>path-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>no-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>sentence-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>no-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>upper-case-first": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>snake-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>no-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>swap-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>lower-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>title-case": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>no-case": true, + "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>change-case>upper-case-first": { + "packages": { + "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + } + }, + "@truffle/codec>@truffle/abi-utils>faker": { + "globals": { + "console.error": true, + "console.log": true, + "dbg": "write" + } + }, + "@truffle/codec>@truffle/abi-utils>fast-check": { + "globals": { + "clearTimeout": true, + "console.log": true, + "setTimeout": true + }, + "packages": { + "@truffle/codec>@truffle/abi-utils>fast-check>pure-rand": true, + "browserify>buffer": true + } + }, + "@truffle/codec>@truffle/compile-common": { + "packages": { + "@truffle/codec>@truffle/compile-common>@truffle/error": true, + "@truffle/codec>@truffle/compile-common>colors": true, + "browserify>path-browserify": true + } + }, + "@truffle/codec>@truffle/compile-common>colors": { + "globals": { + "console.log": true + }, + "packages": { + "browserify>os-browserify": true, + "browserify>process": true, + "browserify>util": true + } + }, + "@truffle/codec>big.js": { + "globals": { + "define": true } }, - "@metamask/controllers>abort-controller": { + "@truffle/codec>bn.js": { "globals": { - "AbortController": true + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true } }, - "@metamask/controllers>async-mutex": { + "@truffle/codec>cbor": { "globals": { - "setTimeout": true + "TextDecoder": true }, "packages": { - "@metamask/controllers>async-mutex>tslib": true + "@truffle/codec>cbor>bignumber.js": true, + "@truffle/codec>cbor>nofilter": true, + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "browserify>stream-browserify": true, + "browserify>url": true, + "browserify>util": true } }, - "@metamask/controllers>async-mutex>tslib": { + "@truffle/codec>cbor>bignumber.js": { "globals": { + "crypto": true, "define": true } }, - "@metamask/controllers>eth-json-rpc-infura": { + "@truffle/codec>cbor>nofilter": { + "packages": { + "browserify>buffer": true, + "browserify>stream-browserify": true, + "browserify>util": true + } + }, + "@truffle/codec>web3-utils": { "globals": { "setTimeout": true }, "packages": { - "@metamask/controllers>eth-json-rpc-infura>eth-json-rpc-middleware": true, - "@metamask/controllers>eth-json-rpc-infura>eth-rpc-errors": true, - "@metamask/controllers>eth-json-rpc-infura>json-rpc-engine": true, - "node-fetch": true + "@truffle/codec>utf8": true, + "@truffle/codec>web3-utils>eth-lib": true, + "@truffle/codec>web3-utils>ethereum-bloom-filters": true, + "bn.js": true, + "browserify>insert-module-globals>is-buffer": true, + "ethereumjs-wallet>randombytes": true, + "ethjs>ethjs-unit": true, + "ethjs>number-to-bn": true } }, - "@metamask/controllers>eth-json-rpc-infura>eth-json-rpc-middleware": { + "@truffle/codec>web3-utils>ethereum-bloom-filters": { "packages": { - "safe-event-emitter": true + "@truffle/codec>web3-utils>ethereum-bloom-filters>js-sha3": true } }, - "@metamask/controllers>eth-json-rpc-infura>eth-rpc-errors": { + "@truffle/codec>web3-utils>ethereum-bloom-filters>js-sha3": { + "globals": { + "define": true + }, "packages": { - "eth-rpc-errors>fast-safe-stringify": true + "browserify>process": true } }, - "@metamask/controllers>eth-json-rpc-infura>json-rpc-engine": { + "@truffle/decoder": { "packages": { - "@metamask/controllers>eth-json-rpc-infura>eth-rpc-errors": true, - "safe-event-emitter": true + "@truffle/codec": true, + "@truffle/codec>@truffle/abi-utils": true, + "@truffle/codec>@truffle/compile-common": true, + "@truffle/codec>web3-utils": true, + "@truffle/decoder>@truffle/source-map-utils": true, + "@truffle/decoder>bn.js": true, + "nock>debug": true } }, - "@metamask/controllers>eth-method-registry": { + "@truffle/decoder>@truffle/source-map-utils": { "packages": { - "@metamask/controllers>eth-method-registry>ethjs": true + "@truffle/codec": true, + "@truffle/codec>web3-utils": true, + "@truffle/decoder>@truffle/source-map-utils>@truffle/code-utils": true, + "@truffle/decoder>@truffle/source-map-utils>json-pointer": true, + "@truffle/decoder>@truffle/source-map-utils>node-interval-tree": true, + "nock>debug": true } }, - "@metamask/controllers>eth-method-registry>ethjs": { - "globals": { - "clearInterval": true, - "setInterval": true - }, + "@truffle/decoder>@truffle/source-map-utils>@truffle/code-utils": { "packages": { - "@metamask/controllers>eth-method-registry>ethjs>bn.js": true, - "@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true, - "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true, - "@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, - "browserify>buffer": true, - "ethjs>ethjs-filter": true, - "ethjs>ethjs-provider-http": true, - "ethjs>ethjs-unit": true, - "ethjs>ethjs-util": true, - "ethjs>number-to-bn": true + "@truffle/codec>cbor": true, + "browserify>buffer": true } }, - "@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": { + "@truffle/decoder>@truffle/source-map-utils>json-pointer": { "packages": { - "@metamask/controllers>eth-method-registry>ethjs>bn.js": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, - "browserify>buffer": true, - "ethjs>number-to-bn": true + "@truffle/decoder>@truffle/source-map-utils>json-pointer>foreach": true } }, - "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": { + "@truffle/decoder>@truffle/source-map-utils>node-interval-tree": { "packages": { - "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, - "ethjs-query>babel-runtime": true, - "ethjs>ethjs-filter": true, - "ethjs>ethjs-util": true, - "promise-to-callback": true + "react-dnd>shallowequal": true } }, - "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": { + "@truffle/decoder>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "@metamask/controllers>eth-method-registry>ethjs>bn.js": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, - "browserify>buffer": true, - "ethjs>number-to-bn": true + "browserify>browser-resolve": true } }, - "@metamask/controllers>eth-method-registry>ethjs>ethjs-query": { + "@unstoppabledomains/resolution": { "globals": { - "console": true + "__values": true }, "packages": { - "ethjs-query>babel-runtime": true, - "ethjs-query>ethjs-format": true, - "ethjs-query>ethjs-rpc": true, - "promise-to-callback": true + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "@unstoppabledomains/resolution>cross-fetch": true, + "@unstoppabledomains/resolution>crypto-js": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>buffer": true, + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": { + "@unstoppabledomains/resolution>@ethersproject/abi": { + "globals": { + "console.log": true + }, "packages": { - "browserify>process": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true } }, - "@metamask/controllers>eth-phishing-detect": { + "@unstoppabledomains/resolution>cross-fetch": { + "globals": { + "Blob": true, + "FileReader": true, + "FormData": true, + "URLSearchParams.prototype.isPrototypeOf": true, + "XMLHttpRequest": true + } + }, + "@unstoppabledomains/resolution>crypto-js": { + "globals": { + "crypto": true, + "define": true, + "msCrypto": true + }, "packages": { - "eslint>optionator>fast-levenshtein": true + "browserify>browser-resolve": true } }, - "@metamask/controllers>ethereumjs-wallet": { + "@unstoppabledomains/resolution>elliptic": { "packages": { - "@metamask/controllers>ethereumjs-wallet>uuid": true, - "@truffle/codec>utf8": true, - "browserify>buffer": true, - "browserify>crypto-browserify": true, - "ethereumjs-util": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-wallet>aes-js": true, - "ethereumjs-wallet>bs58check": true, - "ethereumjs-wallet>randombytes": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true + "@unstoppabledomains/resolution>elliptic>brorand": true, + "@unstoppabledomains/resolution>elliptic>hmac-drbg": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-crypto-utils": true, + "bn.js": true, + "ethers>@ethersproject/sha2>hash.js": true, + "pumpify>inherits": true } }, - "@metamask/controllers>ethereumjs-wallet>uuid": { + "@unstoppabledomains/resolution>elliptic>brorand": { "globals": { "crypto": true, "msCrypto": true + }, + "packages": { + "browserify>browser-resolve": true } }, - "@metamask/controllers>isomorphic-fetch": { + "@unstoppabledomains/resolution>elliptic>hmac-drbg": { + "packages": { + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-crypto-utils": true, + "ethers>@ethersproject/sha2>hash.js": true + } + }, + "@unstoppabledomains/resolution": { "globals": { - "fetch.bind": true + "__values": true }, "packages": { - "@metamask/controllers>isomorphic-fetch>whatwg-fetch": true + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "@unstoppabledomains/resolution>cross-fetch": true, + "@unstoppabledomains/resolution>crypto-js": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>buffer": true, + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "@metamask/controllers>isomorphic-fetch>whatwg-fetch": { + "@unstoppabledomains/resolution>@ethersproject/abi": { + "globals": { + "console.log": true + }, + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true + } + }, + "@unstoppabledomains/resolution>cross-fetch": { "globals": { "Blob": true, "FileReader": true, "FormData": true, "URLSearchParams.prototype.isPrototypeOf": true, - "XMLHttpRequest": true, + "XMLHttpRequest": true + } + }, + "@unstoppabledomains/resolution>crypto-js": { + "globals": { + "crypto": true, + "define": true, + "msCrypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "@unstoppabledomains/resolution>elliptic": { + "packages": { + "@unstoppabledomains/resolution>elliptic>brorand": true, + "@unstoppabledomains/resolution>elliptic>hmac-drbg": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-crypto-utils": true, + "bn.js": true, + "ethers>@ethersproject/sha2>hash.js": true, + "pumpify>inherits": true + } + }, + "@unstoppabledomains/resolution>elliptic>brorand": { + "globals": { + "crypto": true, + "msCrypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "@unstoppabledomains/resolution>elliptic>hmac-drbg": { + "packages": { + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-crypto-utils": true, + "ethers>@ethersproject/sha2>hash.js": true + } + }, + "@zxing/browser": { + "globals": { + "HTMLElement": true, + "HTMLImageElement": true, + "HTMLVideoElement": true, + "URL.createObjectURL": true, + "clearTimeout": true, + "console.error": true, + "console.warn": true, + "document": true, + "navigator": true, + "setTimeout": true + }, + "packages": { + "@zxing/library": true + } + }, + "@zxing/library": { + "globals": { + "TextDecoder": true, + "TextEncoder": true, + "btoa": true, + "clearTimeout": true, "define": true, + "document.createElement": true, + "document.createElementNS": true, + "document.getElementById": true, + "navigator.mediaDevices.enumerateDevices": true, + "navigator.mediaDevices.getUserMedia": true, "setTimeout": true } }, - "@metamask/controllers>multiformats": { - "globals": { - "TextDecoder": true, - "TextEncoder": true, - "console.warn": true + "addons-linter>sha.js": { + "packages": { + "ethereumjs-wallet>safe-buffer": true, + "pumpify>inherits": true + } + }, + "await-semaphore": { + "packages": { + "browserify>process": true, + "browserify>timers-browserify": true + } + }, + "base32-encode": { + "packages": { + "base32-encode>to-data-view": true } }, - "@metamask/controllers>nanoid": { + "bignumber.js": { "globals": { - "crypto.getRandomValues": true + "crypto": true, + "define": true } }, - "@metamask/controllers>web3": { + "bn.js": { "globals": { - "Web3": "write", - "XMLHttpRequest": true, - "clearTimeout": true, - "console.error": true, - "setTimeout": true + "Buffer": true }, "packages": { - "@metamask/controllers>web3>bignumber.js": true, - "@metamask/controllers>web3>crypto-js": true, - "@metamask/controllers>web3>utf8": true, - "@metamask/controllers>web3>xhr2-cookies": true, - "browserify>buffer": true + "browserify>browser-resolve": true } }, - "@metamask/controllers>web3-provider-engine": { + "browserify>assert": { "globals": { - "WebSocket": true, - "console": true, - "setTimeout": true + "Buffer": true }, "packages": { - "@ethereumjs/tx": true, - "@metamask/controllers>eth-json-rpc-infura": true, - "@metamask/controllers>web3-provider-engine>backoff": true, - "@metamask/controllers>web3-provider-engine>eth-block-tracker": true, - "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware": true, - "@metamask/controllers>web3-provider-engine>eth-sig-util": true, - "@metamask/controllers>web3-provider-engine>ethereumjs-util": true, - "@metamask/controllers>web3-provider-engine>semaphore": true, - "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>events": true, - "browserify>util": true, - "eth-json-rpc-filters": true, - "gh-pages>async": true, - "lavamoat>json-stable-stringify": true, - "watchify>xtend": true + "browserify>assert>util": true, + "react>object-assign": true } }, - "@metamask/controllers>web3-provider-engine>backoff": { + "browserify>assert>util": { "globals": { - "clearTimeout": true, - "setTimeout": true + "console.error": true, + "console.log": true, + "console.trace": true, + "process": true }, "packages": { - "@metamask/controllers>web3-provider-engine>backoff>precond": true, - "browserify>events": true, - "browserify>util": true + "browserify>assert>util>inherits": true, + "browserify>process": true } }, - "@metamask/controllers>web3-provider-engine>backoff>precond": { + "browserify>browser-resolve": { "packages": { - "browserify>util": true - } - }, - "@metamask/controllers>web3-provider-engine>cross-fetch>node-fetch": { - "globals": { - "fetch": true + "ethjs-query>babel-runtime>core-js": true } }, - "@metamask/controllers>web3-provider-engine>eth-block-tracker": { + "browserify>buffer": { "globals": { - "clearTimeout": true, - "console.error": true, - "setTimeout": true + "console": true }, "packages": { - "@metamask/controllers>web3-provider-engine>eth-block-tracker>pify": true, - "eth-query": true, - "safe-event-emitter": true + "base64-js": true, + "browserify>buffer>ieee754": true } }, - "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware": { - "globals": { - "console.error": true, - "fetch": true, - "setTimeout": true - }, + "browserify>crypto-browserify": { "packages": { - "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>json-rpc-engine": true, - "@metamask/controllers>web3-provider-engine>eth-rpc-errors": true, - "browserify>url": true, - "lavamoat>json-stable-stringify": true, - "node-fetch": true, - "source-map-explorer>btoa": true, - "vinyl>clone": true + "browserify>crypto-browserify>browserify-cipher": true, + "browserify>crypto-browserify>browserify-sign": true, + "browserify>crypto-browserify>create-ecdh": true, + "browserify>crypto-browserify>create-hmac": true, + "browserify>crypto-browserify>diffie-hellman": true, + "browserify>crypto-browserify>pbkdf2": true, + "browserify>crypto-browserify>public-encrypt": true, + "browserify>crypto-browserify>randomfill": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-wallet>randombytes": true } }, - "@metamask/controllers>web3-provider-engine>eth-json-rpc-middleware>node-fetch": { - "globals": { - "fetch": true + "browserify>crypto-browserify>browserify-cipher": { + "packages": { + "browserify>crypto-browserify>browserify-cipher>browserify-des": true, + "browserify>crypto-browserify>browserify-cipher>evp_bytestokey": true, + "ethereumjs-util>ethereum-cryptography>browserify-aes": true } }, - "@metamask/controllers>web3-provider-engine>eth-rpc-errors": { + "browserify>crypto-browserify>browserify-cipher>browserify-des": { "packages": { - "eth-rpc-errors>fast-safe-stringify": true + "browserify>buffer": true, + "browserify>crypto-browserify>browserify-cipher>browserify-des>des.js": true, + "ethereumjs-util>create-hash>cipher-base": true, + "pumpify>inherits": true } }, - "@metamask/controllers>web3-provider-engine>eth-sig-util": { + "browserify>crypto-browserify>browserify-cipher>browserify-des>des.js": { "packages": { - "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi": true, - "@metamask/controllers>web3-provider-engine>ethereumjs-util": true + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "pumpify>inherits": true } }, - "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi": { + "browserify>crypto-browserify>browserify-cipher>evp_bytestokey": { "packages": { - "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi>ethereumjs-util": true, - "bn.js": true, - "browserify>buffer": true + "ethereumjs-util>create-hash>md5.js": true, + "ethereumjs-wallet>safe-buffer": true } }, - "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi>ethereumjs-util": { + "browserify>crypto-browserify>browserify-sign": { "packages": { - "3box>ethers>elliptic": true, - "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, - "browserify>assert": true, "browserify>buffer": true, + "browserify>crypto-browserify>create-hmac": true, + "browserify>crypto-browserify>public-encrypt>browserify-rsa": true, + "browserify>crypto-browserify>public-encrypt>parse-asn1": true, + "browserify>stream-browserify": true, "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "ethers>@ethersproject/signing-key>elliptic": true, + "pumpify>inherits": true } }, - "@metamask/controllers>web3-provider-engine>ethereumjs-util": { + "browserify>crypto-browserify>create-ecdh": { "packages": { - "3box>ethers>elliptic": true, - "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, - "browserify>assert": true, "browserify>buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true + } + }, + "browserify>crypto-browserify>create-hmac": { + "packages": { + "addons-linter>sha.js": true, "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "ethereumjs-util>create-hash>cipher-base": true, + "ethereumjs-util>create-hash>ripemd160": true, + "ethereumjs-wallet>safe-buffer": true, + "pumpify>inherits": true } }, - "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": { + "browserify>crypto-browserify>diffie-hellman": { "packages": { + "bn.js": true, "browserify>buffer": true, - "ethjs>ethjs-util>is-hex-prefixed": true, - "ethjs>ethjs-util>strip-hex-prefix": true + "browserify>crypto-browserify>diffie-hellman>miller-rabin": true, + "ethereumjs-wallet>randombytes": true } }, - "@metamask/controllers>web3-provider-engine>semaphore": { - "globals": { - "define": true, - "setTimeout": true - }, + "browserify>crypto-browserify>diffie-hellman>miller-rabin": { "packages": { - "browserify>process": true + "@unstoppabledomains/resolution>elliptic>brorand": true, + "bn.js": true } }, - "@metamask/controllers>web3>bignumber.js": { + "browserify>crypto-browserify>pbkdf2": { "globals": { - "define": true + "crypto": true, + "process": true, + "queueMicrotask": true, + "setImmediate": true, + "setTimeout": true }, "packages": { - "browserify>crypto-browserify": true - } - }, - "@metamask/controllers>web3>crypto-js": { - "globals": { - "define": true + "addons-linter>sha.js": true, + "browserify>process": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>create-hash>ripemd160": true, + "ethereumjs-wallet>safe-buffer": true } }, - "@metamask/controllers>web3>utf8": { - "globals": { - "define": true + "browserify>crypto-browserify>public-encrypt": { + "packages": { + "bn.js": true, + "browserify>buffer": true, + "browserify>crypto-browserify>public-encrypt>browserify-rsa": true, + "browserify>crypto-browserify>public-encrypt>parse-asn1": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-wallet>randombytes": true } }, - "@metamask/controllers>web3>xhr2-cookies": { - "globals": { - "console.warn": true - }, + "browserify>crypto-browserify>public-encrypt>browserify-rsa": { "packages": { + "bn.js": true, "browserify>buffer": true, - "browserify>https-browserify": true, - "browserify>os-browserify": true, - "browserify>process": true, - "browserify>stream-http": true, - "browserify>url": true, - "pubnub>superagent>cookiejar": true + "ethereumjs-wallet>randombytes": true } }, - "@metamask/eth-json-rpc-infura": { - "globals": { - "setTimeout": true - }, + "browserify>crypto-browserify>public-encrypt>parse-asn1": { "packages": { - "@metamask/eth-json-rpc-infura>@metamask/utils": true, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware": true, - "eth-rpc-errors": true, - "json-rpc-engine": true, - "node-fetch": true + "browserify>buffer": true, + "browserify>crypto-browserify>browserify-cipher>evp_bytestokey": true, + "browserify>crypto-browserify>pbkdf2": true, + "browserify>crypto-browserify>public-encrypt>parse-asn1>asn1.js": true, + "ethereumjs-util>ethereum-cryptography>browserify-aes": true } }, - "@metamask/eth-json-rpc-infura>@metamask/utils": { + "browserify>crypto-browserify>public-encrypt>parse-asn1>asn1.js": { "packages": { - "@metamask/eth-json-rpc-infura>@metamask/utils>superstruct": true, - "eslint>fast-deep-equal": true, - "madge>debug": true + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "bn.js": true, + "browserify>buffer": true, + "browserify>vm-browserify": true, + "ethers>@ethersproject/sha2>hash.js>minimalistic-assert": true, + "pumpify>inherits": true } }, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware": { + "browserify>crypto-browserify>randomfill": { "globals": { - "URL": true, - "btoa": true, - "console.error": true, - "fetch": true, - "setTimeout": true + "crypto": true, + "msCrypto": true }, "packages": { - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": true, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>pify": true, - "browserify>browser-resolve": true, - "eth-rpc-errors": true, - "json-rpc-engine": true, - "json-rpc-engine>@metamask/safe-event-emitter": true, - "lavamoat>json-stable-stringify": true, - "vinyl>clone": true + "browserify>process": true, + "ethereumjs-wallet>randombytes": true, + "ethereumjs-wallet>safe-buffer": true } }, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": { - "packages": { - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": true, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true + "browserify>events": { + "globals": { + "console": true } }, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": { + "browserify>https-browserify": { "packages": { - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": true, - "bn.js": true, - "browserify>buffer": true + "browserify>stream-http": true, + "browserify>url": true } }, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": { - "packages": { - "3box>ethers>elliptic": true, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "browserify>os-browserify": { + "globals": { + "location": true, + "navigator": true } }, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": { + "browserify>path-browserify": { "packages": { - "3box>ethers>elliptic": true, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "browserify>process": true } }, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": { + "browserify>process": { + "globals": { + "clearTimeout": true, + "setTimeout": true + } + }, + "browserify>punycode": { + "globals": { + "define": true + } + }, + "browserify>stream-browserify": { "packages": { - "browserify>buffer": true, - "ethjs>ethjs-util>is-hex-prefixed": true, - "ethjs>ethjs-util>strip-hex-prefix": true + "browserify>events": true, + "pumpify>inherits": true, + "readable-stream": true } }, - "@metamask/eth-ledger-bridge-keyring": { + "browserify>stream-http": { "globals": { - "addEventListener": true, - "console.log": true, - "document.createElement": true, - "document.head.appendChild": true, + "AbortController": true, + "Blob": true, + "MSStreamReader": true, + "ReadableStream": true, + "WritableStream": true, + "XDomainRequest": true, + "XMLHttpRequest": true, + "clearTimeout": true, "fetch": true, - "removeEventListener": true + "location.protocol.search": true, + "setTimeout": true }, "packages": { - "@ethereumjs/tx": true, - "@metamask/eth-ledger-bridge-keyring>eth-sig-util": true, - "@metamask/eth-ledger-bridge-keyring>hdkey": true, "browserify>buffer": true, - "browserify>events": true, - "ethereumjs-util": true + "browserify>process": true, + "browserify>stream-http>builtin-status-codes": true, + "browserify>stream-http>readable-stream": true, + "browserify>url": true, + "pumpify>inherits": true, + "watchify>xtend": true } }, - "@metamask/eth-ledger-bridge-keyring>eth-sig-util": { + "browserify>stream-http>readable-stream": { "packages": { - "3box>tweetnacl": true, - "3box>tweetnacl-util": true, - "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util": true, + "@storybook/api>util-deprecate": true, + "browserify>browser-resolve": true, "browserify>buffer": true, - "ethereumjs-abi": true + "browserify>events": true, + "browserify>process": true, + "browserify>string_decoder": true, + "pumpify>inherits": true } }, - "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util": { + "browserify>string_decoder": { "packages": { - "3box>ethers>elliptic": true, - "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>ethjs-util": true, - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true, "ethereumjs-wallet>safe-buffer": true } }, - "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>ethjs-util": { + "browserify>timers-browserify": { + "globals": { + "clearInterval": true, + "clearTimeout": true, + "setInterval": true, + "setTimeout": true + }, "packages": { - "browserify>buffer": true, - "ethjs>ethjs-util>is-hex-prefixed": true, - "ethjs>ethjs-util>strip-hex-prefix": true + "browserify>process": true } }, - "@metamask/eth-ledger-bridge-keyring>hdkey": { + "browserify>url": { "packages": { - "browserify>assert": true, - "browserify>crypto-browserify": true, - "eth-trezor-keyring>hdkey>coinstring": true, - "eth-trezor-keyring>hdkey>secp256k1": true, - "ethereumjs-wallet>safe-buffer": true + "browserify>punycode": true, + "browserify>querystring-es3": true } }, - "@metamask/eth-token-tracker": { + "browserify>util": { "globals": { - "console.warn": true + "console.error": true, + "console.log": true, + "console.trace": true, + "process": true }, "packages": { - "@babel/runtime": true, - "@metamask/eth-token-tracker>eth-block-tracker": true, - "@metamask/eth-token-tracker>ethjs": true, - "@metamask/eth-token-tracker>human-standard-token-abi": true, - "ethjs-contract": true, - "ethjs-query": true, - "nock>deep-equal": true, - "safe-event-emitter": true + "browserify>process": true, + "browserify>util>inherits": true } }, - "@metamask/eth-token-tracker>eth-block-tracker": { + "browserify>vm-browserify": { "globals": { - "clearTimeout": true, - "console.error": true, - "setTimeout": true - }, - "packages": { - "@metamask/eth-token-tracker>eth-block-tracker>pify": true, - "eth-query": true, - "safe-event-emitter": true + "document.body.appendChild": true, + "document.body.removeChild": true, + "document.createElement": true } }, - "@metamask/eth-token-tracker>ethjs": { + "classnames": { "globals": { - "clearInterval": true, - "setInterval": true + "classNames": "write", + "define": true + } + }, + "copy-to-clipboard": { + "globals": { + "clipboardData": true, + "console.error": true, + "console.warn": true, + "document.body.appendChild": true, + "document.body.removeChild": true, + "document.createElement": true, + "document.createRange": true, + "document.execCommand": true, + "document.getSelection": true, + "navigator.userAgent": true, + "prompt": true }, "packages": { - "@metamask/eth-token-tracker>ethjs>bn.js": true, - "@metamask/eth-token-tracker>ethjs>ethjs-abi": true, - "@metamask/eth-token-tracker>ethjs>ethjs-contract": true, - "@metamask/eth-token-tracker>ethjs>ethjs-query": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, - "browserify>buffer": true, - "ethjs>ethjs-filter": true, - "ethjs>ethjs-provider-http": true, - "ethjs>ethjs-unit": true, - "ethjs>ethjs-util": true, - "ethjs>number-to-bn": true + "copy-to-clipboard>toggle-selection": true } }, - "@metamask/eth-token-tracker>ethjs>ethjs-abi": { - "packages": { - "@metamask/eth-token-tracker>ethjs>bn.js": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, - "browserify>buffer": true, - "ethjs>number-to-bn": true + "copy-to-clipboard>toggle-selection": { + "globals": { + "document.activeElement": true, + "document.getSelection": true } }, - "@metamask/eth-token-tracker>ethjs>ethjs-contract": { + "currency-formatter": { "packages": { - "@metamask/eth-token-tracker>ethjs>ethjs-contract>ethjs-abi": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, - "ethjs-query>babel-runtime": true, - "ethjs>ethjs-filter": true, - "ethjs>ethjs-util": true, - "promise-to-callback": true + "currency-formatter>accounting": true, + "currency-formatter>locale-currency": true, + "react>object-assign": true } }, - "@metamask/eth-token-tracker>ethjs>ethjs-contract>ethjs-abi": { - "packages": { - "@metamask/eth-token-tracker>ethjs>bn.js": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, - "browserify>buffer": true, - "ethjs>number-to-bn": true + "currency-formatter>accounting": { + "globals": { + "define": true } }, - "@metamask/eth-token-tracker>ethjs>ethjs-query": { + "currency-formatter>locale-currency": { "globals": { - "console": true - }, - "packages": { - "ethjs-query>babel-runtime": true, - "ethjs-query>ethjs-format": true, - "ethjs-query>ethjs-rpc": true, - "promise-to-callback": true + "countryCode": true } }, - "@metamask/eth-token-tracker>ethjs>js-sha3": { + "debounce-stream": { "packages": { - "browserify>process": true + "debounce-stream>debounce": true, + "debounce-stream>duplexer": true, + "debounce-stream>through": true } }, - "@metamask/etherscan-link": { + "debounce-stream>debounce": { "globals": { - "URL": true + "clearTimeout": true, + "setTimeout": true } }, - "@metamask/jazzicon": { - "globals": { - "document.createElement": true, - "document.createElementNS": true - }, + "debounce-stream>duplexer": { "packages": { - "@metamask/jazzicon>color": true, - "@metamask/jazzicon>mersenne-twister": true + "browserify>stream-browserify": true } }, - "@metamask/jazzicon>color": { + "debounce-stream>through": { "packages": { - "@metamask/jazzicon>color>clone": true, - "@metamask/jazzicon>color>color-convert": true, - "@metamask/jazzicon>color>color-string": true + "browserify>process": true, + "browserify>stream-browserify": true + } + }, + "depcheck>@babel/traverse": { + "globals": { + "console.log": true, + "console.trace": true + }, + "packages": { + "@babel/code-frame": true, + "@babel/core>@babel/generator": true, + "@babel/core>@babel/parser": true, + "@babel/core>@babel/types": true, + "depcheck>@babel/traverse>@babel/helper-environment-visitor": true, + "depcheck>@babel/traverse>@babel/helper-function-name": true, + "depcheck>@babel/traverse>@babel/helper-hoist-variables": true, + "depcheck>@babel/traverse>@babel/helper-split-export-declaration": true, + "depcheck>@babel/traverse>globals": true, + "nock>debug": true } }, - "@metamask/jazzicon>color>clone": { + "depcheck>@babel/traverse>@babel/helper-function-name": { "packages": { - "browserify>buffer": true + "@babel/core>@babel/template": true, + "@babel/core>@babel/types": true } }, - "@metamask/jazzicon>color>color-convert": { + "depcheck>@babel/traverse>@babel/helper-hoist-variables": { "packages": { - "@metamask/jazzicon>color>color-convert>color-name": true + "@babel/core>@babel/types": true } }, - "@metamask/jazzicon>color>color-string": { + "depcheck>@babel/traverse>@babel/helper-split-export-declaration": { "packages": { - "jest-canvas-mock>moo-color>color-name": true + "@babel/core>@babel/types": true } }, - "@metamask/logo": { + "depcheck>@vue/compiler-sfc>postcss>nanoid": { "globals": { - "addEventListener": true, - "document.body.appendChild": true, - "document.createElementNS": true, - "innerHeight": true, - "innerWidth": true, - "requestAnimationFrame": true - }, - "packages": { - "@metamask/logo>gl-mat4": true, - "@metamask/logo>gl-vec3": true + "crypto.getRandomValues": true } }, - "@metamask/obs-store": { + "dependency-tree>precinct>detective-postcss>postcss>nanoid": { "globals": { - "localStorage": true - }, - "packages": { - "@metamask/obs-store>through2": true, - "browserify>stream-browserify": true, - "json-rpc-engine>@metamask/safe-event-emitter": true + "crypto.getRandomValues": true } }, - "@metamask/obs-store>through2": { + "end-of-stream": { "packages": { "browserify>process": true, - "browserify>util": true, - "readable-stream": true, - "watchify>xtend": true + "pump>once": true } }, - "@metamask/providers>@metamask/object-multiplex": { - "globals": { - "console.warn": true - }, + "enzyme>has": { "packages": { - "end-of-stream": true, - "pump>once": true, - "readable-stream": true + "mocha>object.assign>function-bind": true } }, - "@metamask/rpc-methods": { - "globals": { - "console.warn": true - }, + "enzyme>is-regex": { "packages": { - "@metamask/controllers": true, - "@metamask/rpc-methods>@metamask/key-tree": true, - "@metamask/snap-utils": true, - "@metamask/snap-utils>@metamask/utils": true, - "eth-rpc-errors": true + "koa>is-generator-function>has-tostringtag": true, + "string.prototype.matchall>call-bind": true } }, - "@metamask/rpc-methods>@metamask/key-tree": { + "enzyme>object-is": { "packages": { - "@metamask/rpc-methods>@metamask/key-tree>@noble/ed25519": true, - "@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": true, - "@metamask/rpc-methods>@metamask/key-tree>@noble/secp256k1": true, - "@metamask/rpc-methods>@metamask/key-tree>@scure/base": true, - "@metamask/rpc-methods>@metamask/key-tree>@scure/bip39": true, - "browserify>buffer": true + "globalthis>define-properties": true, + "string.prototype.matchall>call-bind": true } }, - "@metamask/rpc-methods>@metamask/key-tree>@noble/ed25519": { + "eslint>optionator>fast-levenshtein": { "globals": { - "crypto": true - }, - "packages": { - "browserify>browser-resolve": true + "Intl": true, + "Levenshtein": "write", + "console.log": true, + "define": true, + "importScripts": true, + "postMessage": true } }, - "@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": { + "eth-block-tracker": { "globals": { - "TextEncoder": true, - "crypto": true, + "clearTimeout": true, + "console.error": true, "setTimeout": true - } - }, - "@metamask/rpc-methods>@metamask/key-tree>@noble/secp256k1": { - "globals": { - "crypto": true }, "packages": { - "browserify>browser-resolve": true + "eth-block-tracker>@metamask/utils": true, + "eth-block-tracker>pify": true, + "eth-query>json-rpc-random-id": true, + "json-rpc-engine>@metamask/safe-event-emitter": true } }, - "@metamask/rpc-methods>@metamask/key-tree>@scure/base": { + "eth-block-tracker>@metamask/utils": { "globals": { "TextDecoder": true, "TextEncoder": true - } - }, - "@metamask/rpc-methods>@metamask/key-tree>@scure/bip39": { + }, "packages": { - "@metamask/rpc-methods>@metamask/key-tree>@noble/hashes": true, - "@metamask/rpc-methods>@metamask/key-tree>@scure/base": true + "@metamask/snap-utils>superstruct": true, + "browserify>buffer": true, + "nock>debug": true } }, - "@metamask/smart-transactions-controller": { + "eth-ens-namehash": { "globals": { - "URLSearchParams": true, - "clearInterval": true, - "console.error": true, - "console.log": true, - "fetch": true, - "setInterval": true + "name": "write" }, "packages": { - "@metamask/controllers": true, - "@metamask/controllers>isomorphic-fetch": true, - "@metamask/smart-transactions-controller>bignumber.js": true, - "@metamask/smart-transactions-controller>fast-json-patch": true, - "ethers": true, - "lodash": true - } - }, - "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { - "globals": { - "crypto.getRandomValues": true + "browserify>buffer": true, + "eth-ens-namehash>idna-uts46-hx": true, + "eth-ens-namehash>js-sha3": true } }, - "@metamask/smart-transactions-controller>bignumber.js": { + "eth-ens-namehash>idna-uts46-hx": { "globals": { - "crypto": true, "define": true + }, + "packages": { + "browserify>punycode": true } }, - "@metamask/smart-transactions-controller>fast-json-patch": { - "globals": { - "addEventListener": true, - "clearTimeout": true, - "removeEventListener": true, - "setTimeout": true + "eth-ens-namehash>js-sha3": { + "packages": { + "browserify>process": true } }, - "@metamask/snap-controllers": { + "eth-json-rpc-filters": { "globals": { - "URL": true, - "clearTimeout": true, "console.error": true, - "console.info": true, - "console.log": true, - "console.warn": true, - "document.body.appendChild": true, - "document.createElement": true, - "document.getElementById": true, - "fetch": true, - "setTimeout": true + "results": "write" }, "packages": { - "@metamask/controllers": true, - "@metamask/providers>@metamask/object-multiplex": true, - "@metamask/rpc-methods": true, - "@metamask/snap-controllers>@metamask/browser-passworder": true, - "@metamask/snap-controllers>@metamask/post-message-stream": true, - "@metamask/snap-controllers>@xstate/fsm": true, - "@metamask/snap-controllers>concat-stream": true, - "@metamask/snap-controllers>gunzip-maybe": true, - "@metamask/snap-controllers>json-rpc-middleware-stream": true, - "@metamask/snap-controllers>nanoid": true, - "@metamask/snap-controllers>readable-web-to-node-stream": true, - "@metamask/snap-controllers>tar-stream": true, - "@metamask/snap-utils": true, - "@metamask/snap-utils>@metamask/utils": true, - "eth-rpc-errors": true, - "json-rpc-engine": true, - "pump": true + "await-semaphore": true, + "eth-json-rpc-filters>eth-json-rpc-middleware": true, + "eth-json-rpc-filters>eth-json-rpc-middleware>pify": true, + "eth-json-rpc-filters>json-rpc-engine": true, + "eth-json-rpc-filters>lodash.flatmap": true, + "eth-query": true, + "safe-event-emitter": true } }, - "@metamask/snap-controllers>@metamask/browser-passworder": { - "globals": { - "btoa": true, - "crypto.getRandomValues": true, - "crypto.subtle.decrypt": true, - "crypto.subtle.deriveKey": true, - "crypto.subtle.encrypt": true, - "crypto.subtle.importKey": true - }, + "eth-json-rpc-filters>eth-json-rpc-middleware": { "packages": { - "browserify>buffer": true + "eth-json-rpc-filters>json-rpc-engine": true } }, - "@metamask/snap-controllers>@metamask/post-message-stream": { + "eth-json-rpc-middleware": { "globals": { - "WorkerGlobalScope": true, - "addEventListener": true, - "location.origin": true, - "onmessage": "write", - "postMessage": true, - "removeEventListener": true + "URL": true, + "btoa": true, + "console.error": true, + "fetch": true, + "setTimeout": true }, "packages": { - "@metamask/snap-controllers>@metamask/post-message-stream>readable-stream": true, - "@metamask/snap-utils>@metamask/utils": true - } - }, - "@metamask/snap-controllers>@metamask/post-message-stream>readable-stream": { - "packages": { - "@metamask/snap-controllers>@metamask/post-message-stream>readable-stream>string_decoder": true, - "@metamask/snap-controllers>json-rpc-middleware-stream>readable-stream>safe-buffer": true, - "@storybook/api>util-deprecate": true, "browserify>browser-resolve": true, - "browserify>events": true, - "browserify>process": true, - "browserify>timers-browserify": true, - "pumpify>inherits": true, - "readable-stream>core-util-is": true, - "readable-stream>isarray": true, - "vinyl>cloneable-readable>process-nextick-args": true - } - }, - "@metamask/snap-controllers>@metamask/post-message-stream>readable-stream>string_decoder": { - "packages": { - "@metamask/snap-controllers>json-rpc-middleware-stream>readable-stream>safe-buffer": true + "eth-block-tracker>@metamask/utils": true, + "eth-json-rpc-middleware>@metamask/eth-sig-util": true, + "eth-json-rpc-middleware>pify": true, + "eth-rpc-errors": true, + "json-rpc-engine": true, + "json-rpc-engine>@metamask/safe-event-emitter": true, + "lavamoat>json-stable-stringify": true, + "vinyl>clone": true } }, - "@metamask/snap-controllers>concat-stream": { + "eth-json-rpc-middleware>@metamask/eth-sig-util": { "packages": { - "@metamask/snap-controllers>concat-stream>readable-stream": true, "browserify>buffer": true, - "pumpify>inherits": true + "eth-json-rpc-middleware>@metamask/eth-sig-util>bn.js": true, + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethereum-cryptography": true, + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethjs-util": true, + "eth-lattice-keyring>@ethereumjs/util": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true } }, - "@metamask/snap-controllers>concat-stream>readable-stream": { + "eth-json-rpc-middleware>@metamask/eth-sig-util>bn.js": { "packages": { - "@storybook/api>util-deprecate": true, - "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>events": true, - "browserify>process": true, - "browserify>string_decoder": true, - "pumpify>inherits": true + "browserify>browser-resolve": true } }, - "@metamask/snap-controllers>gunzip-maybe": { + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true + }, "packages": { - "@metamask/snap-controllers>gunzip-maybe>browserify-zlib": true, - "@metamask/snap-controllers>gunzip-maybe>is-deflate": true, - "@metamask/snap-controllers>gunzip-maybe>is-gzip": true, - "@metamask/snap-controllers>gunzip-maybe>peek-stream": true, - "@metamask/snap-controllers>gunzip-maybe>pumpify": true, - "@metamask/snap-controllers>gunzip-maybe>through2": true + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>assert": true, + "browserify>buffer": true, + "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true } }, - "@metamask/snap-controllers>gunzip-maybe>browserify-zlib": { + "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": { "packages": { - "@metamask/snap-controllers>gunzip-maybe>browserify-zlib>pako": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, "browserify>assert": true, "browserify>buffer": true, - "browserify>process": true, - "browserify>util": true, - "readable-stream": true + "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true, + "ethereumjs-wallet>safe-buffer": true } }, - "@metamask/snap-controllers>gunzip-maybe>peek-stream": { + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethjs-util": { "packages": { - "@metamask/snap-controllers>gunzip-maybe>peek-stream>duplexify": true, - "@metamask/snap-controllers>gunzip-maybe>peek-stream>through2": true, "browserify>buffer": true, - "terser>source-map-support>buffer-from": true + "ethjs>ethjs-util>is-hex-prefixed": true, + "ethjs>ethjs-util>strip-hex-prefix": true } }, - "@metamask/snap-controllers>gunzip-maybe>peek-stream>duplexify": { + "eth-keyring-controller": { "packages": { "browserify>buffer": true, - "browserify>process": true, - "duplexify>stream-shift": true, - "end-of-stream": true, - "pumpify>inherits": true, - "readable-stream": true + "browserify>events": true, + "eth-keyring-controller>@metamask/bip39": true, + "eth-keyring-controller>@metamask/eth-hd-keyring": true, + "eth-keyring-controller>browser-passworder": true, + "eth-keyring-controller>eth-simple-keyring": true, + "eth-keyring-controller>obs-store": true, + "eth-sig-util": true } }, - "@metamask/snap-controllers>gunzip-maybe>peek-stream>through2": { + "eth-keyring-controller>@metamask/bip39": { "packages": { - "browserify>process": true, - "browserify>util": true, - "readable-stream": true, - "watchify>xtend": true + "browserify>buffer": true, + "browserify>crypto-browserify>pbkdf2": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-wallet>randombytes": true } }, - "@metamask/snap-controllers>gunzip-maybe>pumpify": { + "eth-keyring-controller>@metamask/eth-hd-keyring": { "packages": { - "@metamask/snap-controllers>gunzip-maybe>pumpify>duplexify": true, - "@metamask/snap-controllers>gunzip-maybe>pumpify>pump": true, - "pumpify>inherits": true + "browserify>buffer": true, + "eth-keyring-controller>@metamask/bip39": true, + "eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet": true, + "eth-keyring-controller>eth-simple-keyring": true, + "eth-trezor-keyring>@metamask/eth-sig-util": true } }, - "@metamask/snap-controllers>gunzip-maybe>pumpify>duplexify": { + "eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet": { "packages": { + "@truffle/codec>utf8": true, "browserify>buffer": true, - "browserify>process": true, - "duplexify>stream-shift": true, - "end-of-stream": true, - "pumpify>inherits": true, - "readable-stream": true + "browserify>crypto-browserify": true, + "eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet>uuid": true, + "ethereumjs-util": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-wallet>aes-js": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>randombytes": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true } }, - "@metamask/snap-controllers>gunzip-maybe>pumpify>pump": { - "packages": { - "browserify>browser-resolve": true, - "end-of-stream": true, - "pump>once": true + "eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet>uuid": { + "globals": { + "crypto": true, + "msCrypto": true } }, - "@metamask/snap-controllers>gunzip-maybe>through2": { + "eth-keyring-controller>browser-passworder": { + "globals": { + "btoa": true, + "crypto": true + }, "packages": { - "browserify>process": true, - "browserify>util": true, - "readable-stream": true, - "watchify>xtend": true + "eth-keyring-controller>browser-passworder>browserify-unibabel": true } }, - "@metamask/snap-controllers>json-rpc-middleware-stream": { + "eth-keyring-controller>browser-passworder>browserify-unibabel": { "globals": { - "setTimeout": true - }, - "packages": { - "@metamask/snap-controllers>json-rpc-middleware-stream>readable-stream": true, - "json-rpc-engine>@metamask/safe-event-emitter": true + "atob": true, + "btoa": true } }, - "@metamask/snap-controllers>json-rpc-middleware-stream>readable-stream": { + "eth-keyring-controller>eth-simple-keyring": { "packages": { - "@metamask/snap-controllers>json-rpc-middleware-stream>readable-stream>process-nextick-args": true, - "@metamask/snap-controllers>json-rpc-middleware-stream>readable-stream>safe-buffer": true, - "@metamask/snap-controllers>json-rpc-middleware-stream>readable-stream>string_decoder": true, - "@storybook/api>util-deprecate": true, - "browserify>browser-resolve": true, + "browserify>buffer": true, "browserify>events": true, - "browserify>process": true, - "browserify>timers-browserify": true, - "pumpify>inherits": true, - "readable-stream>core-util-is": true, - "readable-stream>isarray": true + "eth-keyring-controller>eth-simple-keyring>ethereumjs-wallet": true, + "eth-sig-util": true, + "ethereumjs-util": true } }, - "@metamask/snap-controllers>json-rpc-middleware-stream>readable-stream>process-nextick-args": { + "eth-keyring-controller>eth-simple-keyring>ethereumjs-wallet": { "packages": { - "browserify>process": true + "@truffle/codec>utf8": true, + "browserify>buffer": true, + "browserify>crypto-browserify": true, + "eth-keyring-controller>eth-simple-keyring>ethereumjs-wallet>uuid": true, + "ethereumjs-util": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-wallet>aes-js": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>randombytes": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true } }, - "@metamask/snap-controllers>json-rpc-middleware-stream>readable-stream>safe-buffer": { - "packages": { - "browserify>buffer": true + "eth-keyring-controller>eth-simple-keyring>ethereumjs-wallet>uuid": { + "globals": { + "crypto": true, + "msCrypto": true } }, - "@metamask/snap-controllers>json-rpc-middleware-stream>readable-stream>string_decoder": { + "eth-keyring-controller>obs-store": { "packages": { - "@metamask/snap-controllers>json-rpc-middleware-stream>readable-stream>safe-buffer": true + "safe-event-emitter": true, + "watchify>xtend": true } }, - "@metamask/snap-controllers>nanoid": { + "eth-lattice-keyring": { "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/snap-controllers>readable-web-to-node-stream": { + "addEventListener": true, + "browser": true, + "clearInterval": true, + "fetch": true, + "open": true, + "setInterval": true + }, "packages": { - "@metamask/snap-controllers>readable-web-to-node-stream>readable-stream": true + "browserify>buffer": true, + "browserify>crypto-browserify": true, + "browserify>events": true, + "eth-lattice-keyring>@ethereumjs/tx": true, + "eth-lattice-keyring>@ethereumjs/util": true, + "eth-lattice-keyring>bn.js": true, + "eth-lattice-keyring>gridplus-sdk": true, + "eth-lattice-keyring>rlp": true } }, - "@metamask/snap-controllers>readable-web-to-node-stream>readable-stream": { + "eth-lattice-keyring>@ethereumjs/tx": { "packages": { - "@storybook/api>util-deprecate": true, - "browserify>browser-resolve": true, + "@ethereumjs/common": true, "browserify>buffer": true, - "browserify>events": true, - "browserify>process": true, - "browserify>string_decoder": true, - "pumpify>inherits": true + "browserify>insert-module-globals>is-buffer": true, + "ethereumjs-util": true } }, - "@metamask/snap-controllers>tar-stream": { + "eth-lattice-keyring>@ethereumjs/util": { "packages": { - "@metamask/snap-controllers>tar-stream>bl": true, - "@metamask/snap-controllers>tar-stream>fs-constants": true, - "@metamask/snap-controllers>tar-stream>readable-stream": true, "browserify>buffer": true, - "browserify>process": true, - "browserify>string_decoder": true, - "browserify>util": true, - "end-of-stream": true, - "pumpify>inherits": true + "browserify>insert-module-globals>is-buffer": true, + "eth-lattice-keyring>@ethereumjs/util>@ethereumjs/rlp": true, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography": true + } + }, + "eth-lattice-keyring>@ethereumjs/util>@ethereumjs/rlp": { + "globals": { + "TextEncoder": true } }, - "@metamask/snap-controllers>tar-stream>bl": { + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true + }, "packages": { - "@metamask/snap-controllers>tar-stream>readable-stream": true, - "browserify>buffer": true, - "pumpify>inherits": true + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/hashes": true, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/secp256k1": true } }, - "@metamask/snap-controllers>tar-stream>fs-constants": { + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true + } + }, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/secp256k1": { + "globals": { + "crypto": true + }, "packages": { - "browserify>constants-browserify": true + "browserify>browser-resolve": true } }, - "@metamask/snap-controllers>tar-stream>readable-stream": { + "eth-lattice-keyring>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "@storybook/api>util-deprecate": true, - "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>events": true, - "browserify>process": true, - "browserify>string_decoder": true, - "pumpify>inherits": true + "browserify>browser-resolve": true } }, - "@metamask/snap-utils": { + "eth-lattice-keyring>gridplus-sdk": { "globals": { - "URL": true + "ActiveXObject": true, + "AbortController": true, + "Request": true, + "__values": true, + "caches": true, + "clearTimeout": true, + "console.error": true, + "document": true, + "console.log": true, + "console.warn": true, + "fetch": true, + "setTimeout": true }, "packages": { - "@babel/core": true, - "@babel/core>@babel/types": true, - "@metamask/snap-utils>ajv": true, - "@metamask/snap-utils>rfdc": true, - "browserify": true, + "@ethereumjs/common": true, + "@ethereumjs/common>crc-32": true, + "@metamask/controllers>@ethersproject/abi": true, + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, "browserify>buffer": true, - "browserify>crypto-browserify": true, - "browserify>events": true, - "browserify>path-browserify": true, - "eslint>fast-deep-equal": true, - "semver": true + "browserify>process": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": true, + "eth-lattice-keyring>gridplus-sdk>bech32": true, + "eth-lattice-keyring>gridplus-sdk>bignumber.js": true, + "eth-lattice-keyring>gridplus-sdk>bitwise": true, + "eth-lattice-keyring>gridplus-sdk>borc": true, + "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": true, + "eth-lattice-keyring>gridplus-sdk>js-sha3": true, + "eth-lattice-keyring>gridplus-sdk>rlp": true, + "ethereumjs-wallet>aes-js": true, + "ethereumjs-wallet>bs58check": true, + "ethers>@ethersproject/keccak256>js-sha3": true, + "ethers>@ethersproject/sha2>hash.js": true, + "ethers>@ethersproject/signing-key>elliptic": true, + "ganache>secp256k1": true, + "lodash": true } }, - "@metamask/snap-utils>@metamask/utils": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": { "packages": { - "eslint>fast-deep-equal": true + "@ethereumjs/common>crc-32": true, + "browserify>buffer": true, + "browserify>events": true, + "ethereumjs-util": true } }, - "@metamask/snap-utils>rfdc": { + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": { "packages": { - "browserify>buffer": true + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": true, + "ethereumjs-util": true } }, - "@ngraveio/bc-ur": { - "packages": { - "@ngraveio/bc-ur>@apocentre/alias-sampling": true, - "@ngraveio/bc-ur>bignumber.js": true, - "@ngraveio/bc-ur>crc": true, - "@ngraveio/bc-ur>jsbi": true, - "addons-linter>sha.js": true, - "browserify>assert": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": { + "packages": { + "@ethereumjs/common>crc-32": true, "browserify>buffer": true, - "pubnub>cbor-sync": true + "browserify>events": true, + "ethereumjs-util": true } }, - "@ngraveio/bc-ur>bignumber.js": { + "eth-lattice-keyring>gridplus-sdk>bignumber.js": { "globals": { "crypto": true, "define": true } }, - "@ngraveio/bc-ur>crc": { + "eth-lattice-keyring>gridplus-sdk>bitwise": { "packages": { "browserify>buffer": true } }, - "@ngraveio/bc-ur>jsbi": { - "globals": { - "define": true - } - }, - "@popperjs/core": { - "globals": { - "Element": true, - "HTMLElement": true, - "ShadowRoot": true, - "console.error": true, - "console.warn": true, - "document": true, - "navigator.userAgent": true - } - }, - "@reduxjs/toolkit": { + "eth-lattice-keyring>gridplus-sdk>borc": { "globals": { - "AbortController": true, - "__REDUX_DEVTOOLS_EXTENSION_COMPOSE__": true, - "__REDUX_DEVTOOLS_EXTENSION__": true, - "console.error": true, - "console.info": true, - "console.warn": true + "console": true }, "packages": { - "@reduxjs/toolkit>reselect": true, - "immer": true, - "redux": true, - "redux-thunk": true + "browserify>buffer": true, + "browserify>buffer>ieee754": true, + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true, + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": true } }, - "@sentry/browser": { + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { "globals": { - "XMLHttpRequest": true, - "setTimeout": true - }, - "packages": { - "@sentry/browser>@sentry/core": true, - "@sentry/types": true, - "@sentry/utils": true, - "@sentry/utils>tslib": true + "crypto": true, + "define": true } }, - "@sentry/browser>@sentry/core": { + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": { "globals": { - "clearInterval": true, - "setInterval": true - }, - "packages": { - "@sentry/browser>@sentry/core>@sentry/hub": true, - "@sentry/browser>@sentry/core>@sentry/minimal": true, - "@sentry/types": true, - "@sentry/utils": true, - "@sentry/utils>tslib": true + "URL": true, + "URLSearchParams": true, + "location": true } }, - "@sentry/browser>@sentry/core>@sentry/hub": { + "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { "globals": { - "clearInterval": true, - "setInterval": true + "intToBuffer": true }, "packages": { - "@sentry/types": true, - "@sentry/utils": true, - "@sentry/utils>tslib": true - } - }, - "@sentry/browser>@sentry/core>@sentry/minimal": { - "packages": { - "@sentry/browser>@sentry/core>@sentry/hub": true, - "@sentry/utils>tslib": true + "@unstoppabledomains/resolution>elliptic": true } }, - "@sentry/integrations": { + "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>bn.js": { "globals": { - "clearTimeout": true, - "console.error": true, - "console.log": true, - "setTimeout": true + "Buffer": true }, "packages": { - "@sentry/types": true, - "@sentry/utils": true, - "@sentry/utils>tslib": true, - "localforage": true + "browserify>browser-resolve": true } }, - "@sentry/utils": { + "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>buffer": { "globals": { - "CustomEvent": true, - "DOMError": true, - "DOMException": true, - "Element": true, - "ErrorEvent": true, - "Event": true, - "Headers": true, - "Request": true, - "Response": true, - "XMLHttpRequest.prototype": true, - "clearTimeout": true, - "console.error": true, - "document": true, - "setTimeout": true + "console": true }, "packages": { - "@sentry/utils>tslib": true, - "browserify>process": true + "base64-js": true, + "browserify>buffer>ieee754": true } }, - "@sentry/utils>tslib": { + "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>js-sha3": { "globals": { "define": true - } - }, - "@spruceid/siwe-parser": { - "globals": { - "console.error": true, - "console.log": true }, "packages": { - "@spruceid/siwe-parser>apg-js": true + "@unstoppabledomains/resolution>elliptic": true } }, - "@spruceid/siwe-parser>apg-js": { + "eth-lattice-keyring>gridplus-sdk>js-sha3": { "globals": { - "mode": true + "define": true }, "packages": { - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true - } - }, - "@storybook/api>regenerator-runtime": { - "globals": { - "regeneratorRuntime": "write" + "browserify>process": true } }, - "@storybook/api>util-deprecate": { + "eth-lattice-keyring>gridplus-sdk>rlp": { "globals": { - "console.trace": true, - "console.warn": true, - "localStorage": true + "TextEncoder": true } }, - "@storybook/react>@storybook/store>stable": { + "eth-lattice-keyring>rlp": { "globals": { - "define": true - } - }, - "@truffle/codec": { - "packages": { - "@truffle/codec>@truffle/abi-utils": true, - "@truffle/codec>@truffle/compile-common": true, - "@truffle/codec>big.js": true, - "@truffle/codec>bn.js": true, - "@truffle/codec>cbor": true, - "@truffle/codec>lodash.escaperegexp": true, - "@truffle/codec>lodash.partition": true, - "@truffle/codec>lodash.sum": true, - "@truffle/codec>utf8": true, - "@truffle/codec>web3-utils": true, - "browserify>buffer": true, - "browserify>util": true, - "gulp-dart-sass>lodash.clonedeep": true, - "madge>debug": true, - "semver": true - } - }, - "@truffle/codec>@truffle/abi-utils": { - "packages": { - "@truffle/codec>@truffle/abi-utils>change-case": true, - "@truffle/codec>@truffle/abi-utils>faker": true, - "@truffle/codec>@truffle/abi-utils>fast-check": true + "TextEncoder": true } }, - "@truffle/codec>@truffle/abi-utils>change-case": { + "eth-method-registry": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>camel-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>constant-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>dot-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>header-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>is-lower-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>is-upper-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>lower-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>lower-case-first": true, - "@truffle/codec>@truffle/abi-utils>change-case>no-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>param-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>pascal-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>path-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>sentence-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>snake-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>swap-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>title-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>upper-case-first": true + "ethjs": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>camel-case": { + "eth-query": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>no-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + "eth-query>json-rpc-random-id": true, + "nock>debug": true, + "watchify>xtend": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>constant-case": { + "eth-rpc-errors": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>snake-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + "eth-rpc-errors>fast-safe-stringify": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>dot-case": { + "eth-sig-util": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>no-case": true + "browserify>buffer": true, + "eth-sig-util>ethereumjs-util": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true, + "ethereumjs-abi": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>header-case": { + "eth-sig-util>ethereumjs-util": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>no-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>assert": true, + "browserify>buffer": true, + "eth-sig-util>ethereumjs-util>ethjs-util": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true, + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>is-lower-case": { + "eth-sig-util>ethereumjs-util>ethjs-util": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>lower-case": true + "browserify>buffer": true, + "ethjs>ethjs-util>is-hex-prefixed": true, + "ethjs>ethjs-util>strip-hex-prefix": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>is-upper-case": { + "eth-sig-util>tweetnacl": { + "globals": { + "crypto": true, + "msCrypto": true, + "nacl": "write" + }, "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + "browserify>browser-resolve": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>lower-case-first": { + "eth-sig-util>tweetnacl-util": { + "globals": { + "atob": true, + "btoa": true + }, "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>lower-case": true + "browserify>browser-resolve": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>no-case": { + "eth-trezor-keyring": { + "globals": { + "setTimeout": true + }, "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>lower-case": true + "@ethereumjs/tx": true, + "browserify>buffer": true, + "browserify>events": true, + "eth-trezor-keyring>hdkey": true, + "eth-trezor-keyring>trezor-connect": true, + "ethereumjs-util": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>param-case": { + "eth-trezor-keyring>@metamask/eth-sig-util": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>no-case": true + "browserify>buffer": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true, + "eth-trezor-keyring>@metamask/eth-sig-util>ethereumjs-util": true, + "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": true, + "ethereumjs-abi": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>pascal-case": { + "eth-trezor-keyring>@metamask/eth-sig-util>ethereumjs-util": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>camel-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>upper-case-first": true + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>assert": true, + "browserify>buffer": true, + "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>path-case": { + "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>no-case": true + "browserify>buffer": true, + "ethjs>ethjs-util>is-hex-prefixed": true, + "ethjs>ethjs-util>strip-hex-prefix": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>sentence-case": { + "eth-trezor-keyring>hdkey": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>no-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>upper-case-first": true + "browserify>assert": true, + "browserify>crypto-browserify": true, + "eth-trezor-keyring>hdkey>coinstring": true, + "eth-trezor-keyring>hdkey>secp256k1": true, + "ethereumjs-wallet>safe-buffer": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>snake-case": { + "eth-trezor-keyring>hdkey>coinstring": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>no-case": true + "browserify>buffer": true, + "eth-trezor-keyring>hdkey>coinstring>bs58": true, + "ethereumjs-util>create-hash": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>swap-case": { + "eth-trezor-keyring>hdkey>secp256k1": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>lower-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>insert-module-globals>is-buffer": true, + "eth-trezor-keyring>hdkey>secp256k1>bip66": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>title-case": { + "eth-trezor-keyring>hdkey>secp256k1>bip66": { "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>no-case": true, - "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + "ethereumjs-wallet>safe-buffer": true } }, - "@truffle/codec>@truffle/abi-utils>change-case>upper-case-first": { + "eth-trezor-keyring>trezor-connect": { + "globals": { + "__TREZOR_CONNECT_SRC": true, + "addEventListener": true, + "btoa": true, + "chrome": true, + "clearInterval": true, + "clearTimeout": true, + "console": true, + "document.body": true, + "document.createElement": true, + "document.createTextNode": true, + "document.getElementById": true, + "document.querySelectorAll": true, + "location": true, + "navigator": true, + "open": true, + "removeEventListener": true, + "setInterval": true, + "setTimeout": true + }, "packages": { - "@truffle/codec>@truffle/abi-utils>change-case>upper-case": true + "@babel/runtime": true, + "@unstoppabledomains/resolution>cross-fetch": true, + "browserify>events": true, + "eth-trezor-keyring>@metamask/eth-sig-util": true, + "eth-trezor-keyring>trezor-connect>cross-fetch": true } }, - "@truffle/codec>@truffle/abi-utils>faker": { + "eth-trezor-keyring>trezor-connect>cross-fetch": { "globals": { - "console.error": true, - "console.log": true, - "dbg": "write" + "Blob": true, + "FileReader": true, + "FormData": true, + "URLSearchParams.prototype.isPrototypeOf": true, + "XMLHttpRequest": true } }, - "@truffle/codec>@truffle/abi-utils>fast-check": { - "globals": { - "clearTimeout": true, - "console.log": true, - "setTimeout": true - }, + "ethereumjs-abi": { "packages": { - "@truffle/codec>@truffle/abi-utils>fast-check>pure-rand": true, - "browserify>buffer": true + "bn.js": true, + "browserify>buffer": true, + "ethereumjs-abi>ethereumjs-util": true } }, - "@truffle/codec>@truffle/compile-common": { + "ethereumjs-abi>ethereumjs-util": { "packages": { - "@truffle/codec>@truffle/compile-common>@truffle/error": true, - "@truffle/codec>@truffle/compile-common>colors": true, - "browserify>path-browserify": true + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>assert": true, + "browserify>buffer": true, + "ethereumjs-abi>ethereumjs-util>ethjs-util": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, - "@truffle/codec>@truffle/compile-common>colors": { - "globals": { - "console.log": true - }, + "ethereumjs-abi>ethereumjs-util>ethjs-util": { "packages": { - "browserify>os-browserify": true, - "browserify>process": true, - "browserify>util": true + "browserify>buffer": true, + "ethjs>ethjs-util>is-hex-prefixed": true, + "ethjs>ethjs-util>strip-hex-prefix": true } }, - "@truffle/codec>big.js": { - "globals": { - "define": true + "ethereumjs-util": { + "packages": { + "browserify>assert": true, + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "ethereumjs-util>bn.js": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true } }, - "@truffle/codec>bn.js": { + "ethereumjs-util>bn.js": { "globals": { "Buffer": true }, @@ -4220,1387 +5442,1354 @@ "browserify>browser-resolve": true } }, - "@truffle/codec>cbor": { - "globals": { - "TextDecoder": true - }, + "ethereumjs-util>create-hash": { "packages": { - "@truffle/codec>cbor>bignumber.js": true, - "@truffle/codec>cbor>nofilter": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "browserify>stream-browserify": true, - "browserify>url": true, - "browserify>util": true - } - }, - "@truffle/codec>cbor>bignumber.js": { - "globals": { - "crypto": true, - "define": true + "addons-linter>sha.js": true, + "ethereumjs-util>create-hash>cipher-base": true, + "ethereumjs-util>create-hash>md5.js": true, + "ethereumjs-util>create-hash>ripemd160": true, + "pumpify>inherits": true } }, - "@truffle/codec>cbor>nofilter": { + "ethereumjs-util>create-hash>cipher-base": { "packages": { - "browserify>buffer": true, "browserify>stream-browserify": true, - "browserify>util": true + "browserify>string_decoder": true, + "ethereumjs-wallet>safe-buffer": true, + "pumpify>inherits": true } }, - "@truffle/codec>web3-utils": { - "globals": { - "setTimeout": true - }, + "ethereumjs-util>create-hash>md5.js": { "packages": { - "@truffle/codec>utf8": true, - "@truffle/codec>web3-utils>eth-lib": true, - "@truffle/codec>web3-utils>ethereum-bloom-filters": true, - "bn.js": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-wallet>randombytes": true, - "ethjs>ethjs-unit": true, - "ethjs>number-to-bn": true + "ethereumjs-util>create-hash>md5.js>hash-base": true, + "ethereumjs-wallet>safe-buffer": true, + "pumpify>inherits": true } }, - "@truffle/codec>web3-utils>ethereum-bloom-filters": { + "ethereumjs-util>create-hash>md5.js>hash-base": { "packages": { - "ethers>@ethersproject/keccak256>js-sha3": true + "ethereumjs-util>create-hash>md5.js>hash-base>readable-stream": true, + "ethereumjs-wallet>safe-buffer": true, + "pumpify>inherits": true } }, - "@truffle/decoder": { + "ethereumjs-util>create-hash>md5.js>hash-base>readable-stream": { "packages": { - "@truffle/codec": true, - "@truffle/codec>@truffle/abi-utils": true, - "@truffle/codec>@truffle/compile-common": true, - "@truffle/codec>web3-utils": true, - "@truffle/decoder>@truffle/source-map-utils": true, - "@truffle/decoder>bn.js": true, - "madge>debug": true + "@storybook/api>util-deprecate": true, + "browserify>browser-resolve": true, + "browserify>buffer": true, + "browserify>events": true, + "browserify>process": true, + "browserify>string_decoder": true, + "pumpify>inherits": true } }, - "@truffle/decoder>@truffle/source-map-utils": { + "ethereumjs-util>create-hash>ripemd160": { "packages": { - "@truffle/codec": true, - "@truffle/codec>web3-utils": true, - "@truffle/decoder>@truffle/source-map-utils>@truffle/code-utils": true, - "@truffle/decoder>@truffle/source-map-utils>json-pointer": true, - "@truffle/decoder>@truffle/source-map-utils>node-interval-tree": true, - "madge>debug": true + "browserify>buffer": true, + "ethereumjs-util>create-hash>md5.js>hash-base": true, + "pumpify>inherits": true } }, - "@truffle/decoder>@truffle/source-map-utils>@truffle/code-utils": { + "ethereumjs-util>ethereum-cryptography": { "packages": { - "@truffle/codec>cbor": true, - "browserify>buffer": true + "browserify>assert": true, + "browserify>buffer": true, + "browserify>crypto-browserify>create-hmac": true, + "ethereumjs-util>ethereum-cryptography>keccak": true, + "ethereumjs-util>ethereum-cryptography>secp256k1": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>randombytes": true, + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/sha2>hash.js": true } }, - "@truffle/decoder>@truffle/source-map-utils>json-pointer": { + "ethereumjs-util>ethereum-cryptography>browserify-aes": { "packages": { - "@truffle/decoder>@truffle/source-map-utils>json-pointer>foreach": true + "browserify>buffer": true, + "browserify>crypto-browserify>browserify-cipher>evp_bytestokey": true, + "ethereumjs-util>create-hash>cipher-base": true, + "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": true, + "ethereumjs-wallet>safe-buffer": true, + "pumpify>inherits": true } }, - "@truffle/decoder>@truffle/source-map-utils>node-interval-tree": { + "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": { "packages": { - "react-dnd>shallowequal": true + "browserify>buffer": true } }, - "@truffle/decoder>bn.js": { - "globals": { - "Buffer": true - }, + "ethereumjs-util>ethereum-cryptography>keccak": { "packages": { - "browserify>browser-resolve": true + "browserify>buffer": true, + "ethereumjs-util>ethereum-cryptography>keccak>readable-stream": true } - }, - "@zxing/browser": { - "globals": { - "HTMLElement": true, - "HTMLImageElement": true, - "HTMLVideoElement": true, - "URL.createObjectURL": true, - "clearTimeout": true, - "console.error": true, - "console.warn": true, - "document": true, - "navigator": true, - "setTimeout": true - }, + }, + "ethereumjs-util>ethereum-cryptography>keccak>readable-stream": { "packages": { - "@zxing/library": true + "@storybook/api>util-deprecate": true, + "browserify>browser-resolve": true, + "browserify>buffer": true, + "browserify>events": true, + "browserify>process": true, + "browserify>string_decoder": true, + "pumpify>inherits": true } }, - "@zxing/library": { - "globals": { - "TextDecoder": true, - "TextEncoder": true, - "btoa": true, - "clearTimeout": true, - "define": true, - "document.createElement": true, - "document.createElementNS": true, - "document.getElementById": true, - "navigator.mediaDevices.enumerateDevices": true, - "navigator.mediaDevices.getUserMedia": true, - "setTimeout": true + "ethereumjs-util>ethereum-cryptography>secp256k1": { + "packages": { + "@unstoppabledomains/resolution>elliptic": true } }, - "addons-linter>sha.js": { + "ethereumjs-util>rlp": { "packages": { - "ethereumjs-wallet>safe-buffer": true, - "pumpify>inherits": true + "browserify>buffer": true, + "ethereumjs-util>rlp>bn.js": true } }, - "analytics-node": { + "ethereumjs-util>rlp>bn.js": { "globals": { - "clearTimeout": true, - "console.log": true, - "setImmediate": true, - "setTimeout": true + "Buffer": true }, "packages": { - "analytics-node>@segment/loosely-validate-event": true, - "analytics-node>axios": true, - "analytics-node>axios-retry": true, - "analytics-node>lodash.isstring": true, - "analytics-node>md5": true, - "analytics-node>ms": true, - "analytics-node>remove-trailing-slash": true, - "analytics-node>uuid": true, - "browserify>assert": true, - "browserify>process": true + "browserify>browser-resolve": true } }, - "analytics-node>@segment/loosely-validate-event": { + "ethereumjs-wallet": { "packages": { - "analytics-node>@segment/loosely-validate-event>component-type": true, - "analytics-node>@segment/loosely-validate-event>join-component": true, - "browserify>assert": true, - "browserify>buffer": true + "@truffle/codec>utf8": true, + "browserify>crypto-browserify": true, + "ethereumjs-wallet>aes-js": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>ethereumjs-util": true, + "ethereumjs-wallet>randombytes": true, + "ethereumjs-wallet>safe-buffer": true, + "ethereumjs-wallet>scryptsy": true, + "ethereumjs-wallet>uuid": true } }, - "analytics-node>axios": { + "ethereumjs-wallet>aes-js": { "globals": { - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true - }, - "packages": { - "browserify>process": true + "define": true } }, - "analytics-node>axios-retry": { - "globals": { - "setTimeout": true - }, + "ethereumjs-wallet>bs58check": { "packages": { - "geckodriver>got>is-retry-allowed": true + "ethereumjs-util>create-hash": true, + "ethereumjs-wallet>bs58check>bs58": true, + "ethereumjs-wallet>safe-buffer": true } }, - "analytics-node>md5": { + "ethereumjs-wallet>bs58check>bs58": { "packages": { - "analytics-node>md5>charenc": true, - "analytics-node>md5>crypt": true, - "browserify>insert-module-globals>is-buffer": true + "ethereumjs-wallet>bs58check>bs58>base-x": true } }, - "analytics-node>uuid": { - "globals": { - "crypto": true, - "msCrypto": true + "ethereumjs-wallet>bs58check>bs58>base-x": { + "packages": { + "ethereumjs-wallet>safe-buffer": true } }, - "await-semaphore": { + "ethereumjs-wallet>ethereumjs-util": { "packages": { - "browserify>process": true, - "browserify>timers-browserify": true + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>assert": true, + "browserify>buffer": true, + "ethereumjs-util>create-hash": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-util>rlp": true, + "ethereumjs-wallet>ethereumjs-util>ethjs-util": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, - "base32-encode": { + "ethereumjs-wallet>ethereumjs-util>ethjs-util": { "packages": { - "base32-encode>to-data-view": true + "browserify>buffer": true, + "ethjs>ethjs-util>is-hex-prefixed": true, + "ethjs>ethjs-util>strip-hex-prefix": true } }, - "bignumber.js": { + "ethereumjs-wallet>randombytes": { "globals": { "crypto": true, - "define": true + "msCrypto": true + }, + "packages": { + "browserify>process": true, + "ethereumjs-wallet>safe-buffer": true } }, - "bn.js": { - "globals": { - "Buffer": true - }, + "ethereumjs-wallet>safe-buffer": { "packages": { - "browserify>browser-resolve": true + "browserify>buffer": true } }, - "browserify>assert": { - "globals": { - "Buffer": true - }, + "ethereumjs-wallet>scryptsy": { "packages": { - "browserify>assert>util": true, - "react>object-assign": true + "browserify>buffer": true, + "browserify>crypto-browserify>pbkdf2": true } }, - "browserify>assert>util": { + "ethereumjs-wallet>uuid": { "globals": { - "console.error": true, - "console.log": true, - "console.trace": true, - "process": true - }, - "packages": { - "browserify>assert>util>inherits": true, - "browserify>process": true + "crypto": true, + "msCrypto": true } }, - "browserify>browser-resolve": { + "ethers": { "packages": { - "ethjs-query>babel-runtime>core-js": true + "ethers>@ethersproject/abi": true, + "ethers>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/address": true, + "ethers>@ethersproject/base64": true, + "ethers>@ethersproject/basex": true, + "ethers>@ethersproject/bignumber": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/constants": true, + "ethers>@ethersproject/contracts": true, + "ethers>@ethersproject/hash": true, + "ethers>@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/rlp": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/signing-key": true, + "ethers>@ethersproject/solidity": true, + "ethers>@ethersproject/strings": true, + "ethers>@ethersproject/transactions": true, + "ethers>@ethersproject/units": true, + "ethers>@ethersproject/wallet": true, + "ethers>@ethersproject/web": true, + "ethers>@ethersproject/wordlists": true } }, - "browserify>buffer": { + "ethers>@ethersproject/abi": { "globals": { - "console": true + "console.log": true }, "packages": { - "base64-js": true, - "browserify>buffer>ieee754": true + "ethers>@ethersproject/abi>@ethersproject/address": true, + "ethers>@ethersproject/abi>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/constants": true, + "ethers>@ethersproject/abi>@ethersproject/hash": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/strings": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true } }, - "browserify>crypto-browserify": { + "ethers>@ethersproject/abi>@ethersproject/address": { "packages": { - "browserify>crypto-browserify>browserify-cipher": true, - "browserify>crypto-browserify>browserify-sign": true, - "browserify>crypto-browserify>create-ecdh": true, - "browserify>crypto-browserify>create-hmac": true, - "browserify>crypto-browserify>diffie-hellman": true, - "browserify>crypto-browserify>pbkdf2": true, - "browserify>crypto-browserify>public-encrypt": true, - "browserify>crypto-browserify>randomfill": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-wallet>randombytes": true + "ethers>@ethersproject/abi>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/abi>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/abi>@ethersproject/abi>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "browserify>crypto-browserify>browserify-cipher": { + "ethers>@ethersproject/abi>@ethersproject/address>@ethersproject/rlp": { "packages": { - "browserify>crypto-browserify>browserify-cipher>browserify-des": true, - "browserify>crypto-browserify>browserify-cipher>evp_bytestokey": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "browserify>crypto-browserify>browserify-cipher>browserify-des": { + "ethers>@ethersproject/abi>@ethersproject/bignumber": { "packages": { - "browserify>buffer": true, - "browserify>crypto-browserify>browserify-cipher>browserify-des>des.js": true, - "ethereumjs-util>create-hash>cipher-base": true, - "pumpify>inherits": true + "ethers>@ethersproject/abi>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "browserify>crypto-browserify>browserify-cipher>browserify-des>des.js": { + "ethers>@ethersproject/abi>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, - "pumpify>inherits": true + "browserify>browser-resolve": true } }, - "browserify>crypto-browserify>browserify-cipher>evp_bytestokey": { + "ethers>@ethersproject/abi>@ethersproject/constants": { "packages": { - "ethereumjs-util>create-hash>md5.js": true, - "ethereumjs-wallet>safe-buffer": true + "ethers>@ethersproject/abi>@ethersproject/bignumber": true } }, - "browserify>crypto-browserify>browserify-sign": { + "ethers>@ethersproject/abi>@ethersproject/hash": { "packages": { - "3box>ethers>elliptic": true, - "bn.js": true, - "browserify>buffer": true, - "browserify>crypto-browserify>create-hmac": true, - "browserify>crypto-browserify>public-encrypt>browserify-rsa": true, - "browserify>crypto-browserify>public-encrypt>parse-asn1": true, - "browserify>stream-browserify": true, - "ethereumjs-util>create-hash": true, - "pumpify>inherits": true + "ethers>@ethersproject/abi>@ethersproject/address": true, + "ethers>@ethersproject/abi>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/strings": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/logger": true } }, - "browserify>crypto-browserify>create-ecdh": { + "ethers>@ethersproject/abi>@ethersproject/keccak256": { "packages": { - "3box>ethers>elliptic": true, - "bn.js": true, - "browserify>buffer": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "browserify>crypto-browserify>create-hmac": { + "ethers>@ethersproject/abi>@ethersproject/strings": { "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>create-hash>ripemd160": true, - "ethereumjs-wallet>safe-buffer": true, - "pumpify>inherits": true + "ethers>@ethersproject/abi>@ethersproject/constants": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "browserify>crypto-browserify>diffie-hellman": { + "ethers>@ethersproject/abi>@ethersproject/address>@ethersproject/rlp": { "packages": { - "bn.js": true, - "browserify>buffer": true, - "browserify>crypto-browserify>diffie-hellman>miller-rabin": true, - "ethereumjs-wallet>randombytes": true + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/abi>@ethersproject/logger": true } }, - "browserify>crypto-browserify>diffie-hellman>miller-rabin": { + "ethers>@ethersproject/abi>@ethersproject/bignumber": { "packages": { - "3box>ethers>elliptic>brorand": true, - "bn.js": true + "ethers>@ethersproject/abi>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/abi>@ethersproject/logger": true } }, - "browserify>crypto-browserify>pbkdf2": { + "ethers>@ethersproject/abi>@ethersproject/bignumber>bn.js": { "globals": { - "crypto": true, - "process": true, - "queueMicrotask": true, - "setImmediate": true, - "setTimeout": true + "Buffer": true }, - "packages": { - "addons-linter>sha.js": true, - "browserify>process": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>create-hash>ripemd160": true, - "ethereumjs-wallet>safe-buffer": true - } - }, - "browserify>crypto-browserify>public-encrypt": { - "packages": { - "bn.js": true, - "browserify>buffer": true, - "browserify>crypto-browserify>public-encrypt>browserify-rsa": true, - "browserify>crypto-browserify>public-encrypt>parse-asn1": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-wallet>randombytes": true + "packages": { + "browserify>browser-resolve": true } }, - "browserify>crypto-browserify>public-encrypt>browserify-rsa": { + "ethers>@ethersproject/abi>@ethersproject/bytes": { "packages": { - "bn.js": true, - "browserify>buffer": true, - "ethereumjs-wallet>randombytes": true + "ethers>@ethersproject/abi>@ethersproject/logger": true } }, - "browserify>crypto-browserify>public-encrypt>parse-asn1": { + "ethers>@ethersproject/abi>@ethersproject/constants": { "packages": { - "browserify>buffer": true, - "browserify>crypto-browserify>browserify-cipher>evp_bytestokey": true, - "browserify>crypto-browserify>pbkdf2": true, - "browserify>crypto-browserify>public-encrypt>parse-asn1>asn1.js": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes": true + "ethers>@ethersproject/abi>@ethersproject/bignumber": true } }, - "browserify>crypto-browserify>public-encrypt>parse-asn1>asn1.js": { + "ethers>@ethersproject/abi>@ethersproject/hash": { "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, - "bn.js": true, - "browserify>buffer": true, - "browserify>vm-browserify": true, - "pumpify>inherits": true + "ethers>@ethersproject/abi>@ethersproject/address": true, + "ethers>@ethersproject/abi>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/abi>@ethersproject/hash>@ethersproject/base64": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/logger": true, + "ethers>@ethersproject/abi>@ethersproject/properties": true, + "ethers>@ethersproject/abi>@ethersproject/strings": true } }, - "browserify>crypto-browserify>randomfill": { + "ethers>@ethersproject/abi>@ethersproject/hash>@ethersproject/base64": { "globals": { - "crypto": true, - "msCrypto": true + "atob": true, + "btoa": true }, "packages": { - "browserify>process": true, - "ethereumjs-wallet>randombytes": true, - "ethereumjs-wallet>safe-buffer": true + "ethers>@ethersproject/abi>@ethersproject/bytes": true } }, - "browserify>events": { + "ethers>@ethersproject/abi>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/logger": { "globals": { "console": true } }, - "browserify>https-browserify": { + "ethers>@ethersproject/abi>@ethersproject/properties": { "packages": { - "browserify>stream-http": true, - "browserify>url": true + "ethers>@ethersproject/abi>@ethersproject/logger": true } }, - "browserify>os-browserify": { - "globals": { - "location": true, - "navigator": true + "ethers>@ethersproject/abi>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/abi>@ethersproject/constants": true, + "ethers>@ethersproject/abi>@ethersproject/logger": true } }, - "browserify>path-browserify": { + "ethers>@ethersproject/abstract-signer": { "packages": { - "browserify>process": true + "ethers>@ethersproject/abstract-signer>@ethersproject/logger": true, + "ethers>@ethersproject/abstract-signer>@ethersproject/properties": true } }, - "browserify>process": { + "ethers>@ethersproject/abstract-signer>@ethersproject/logger": { "globals": { - "clearTimeout": true, - "setTimeout": true + "console": true } }, - "browserify>punycode": { - "globals": { - "define": true + "ethers>@ethersproject/abstract-signer>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/abstract-signer>@ethersproject/logger": true } }, - "browserify>stream-browserify": { + "ethers>@ethersproject/address": { "packages": { - "browserify>events": true, - "pumpify>inherits": true, - "readable-stream": true + "ethers>@ethersproject/address>@ethersproject/bignumber": true, + "ethers>@ethersproject/address>@ethersproject/keccak256": true, + "ethers>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "browserify>stream-http": { + "ethers>@ethersproject/address>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/address>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/address>@ethersproject/bignumber>bn.js": { "globals": { - "AbortController": true, - "Blob": true, - "MSStreamReader": true, - "ReadableStream": true, - "WritableStream": true, - "XDomainRequest": true, - "XMLHttpRequest": true, - "clearTimeout": true, - "fetch": true, - "location.protocol.search": true, - "setTimeout": true + "Buffer": true }, "packages": { - "browserify>buffer": true, - "browserify>process": true, - "browserify>stream-http>builtin-status-codes": true, - "browserify>stream-http>readable-stream": true, - "browserify>url": true, - "pumpify>inherits": true, - "watchify>xtend": true + "browserify>browser-resolve": true } }, - "browserify>stream-http>readable-stream": { + "ethers>@ethersproject/address>@ethersproject/keccak256": { "packages": { - "@storybook/api>util-deprecate": true, - "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>events": true, - "browserify>process": true, - "browserify>string_decoder": true, - "pumpify>inherits": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "browserify>string_decoder": { + "ethers>@ethersproject/address>@ethersproject/rlp": { "packages": { - "ethereumjs-wallet>safe-buffer": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "browserify>timers-browserify": { + "ethers>@ethersproject/address>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/address>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/address>@ethersproject/bytes": true, + "ethers>@ethersproject/address>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/address>@ethersproject/bignumber>bn.js": { "globals": { - "clearInterval": true, - "clearTimeout": true, - "setInterval": true, - "setTimeout": true + "Buffer": true }, "packages": { - "browserify>process": true + "browserify>browser-resolve": true } }, - "browserify>url": { + "ethers>@ethersproject/address>@ethersproject/bytes": { "packages": { - "browserify>punycode": true, - "browserify>querystring-es3": true + "ethers>@ethersproject/address>@ethersproject/logger": true } }, - "browserify>util": { - "globals": { - "console.error": true, - "console.log": true, - "console.trace": true, - "process": true - }, + "ethers>@ethersproject/address>@ethersproject/keccak256": { "packages": { - "browserify>process": true, - "browserify>util>inherits": true + "ethers>@ethersproject/address>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "browserify>vm-browserify": { + "ethers>@ethersproject/address>@ethersproject/logger": { "globals": { - "document.body.appendChild": true, - "document.body.removeChild": true, - "document.createElement": true + "console": true } }, - "classnames": { - "globals": { - "classNames": "write", - "define": true + "ethers>@ethersproject/address>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/address>@ethersproject/bytes": true, + "ethers>@ethersproject/address>@ethersproject/logger": true } }, - "copy-to-clipboard": { + "ethers>@ethersproject/base64": { "globals": { - "clipboardData": true, - "console.error": true, - "console.warn": true, - "document.body.appendChild": true, - "document.body.removeChild": true, - "document.createElement": true, - "document.createRange": true, - "document.execCommand": true, - "document.getSelection": true, - "navigator.userAgent": true, - "prompt": true + "atob": true, + "btoa": true }, "packages": { - "copy-to-clipboard>toggle-selection": true + "ethers>@ethersproject/base64>@ethersproject/bytes": true } }, - "copy-to-clipboard>toggle-selection": { + "ethers>@ethersproject/base64>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/base64>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/base64>@ethersproject/bytes>@ethersproject/logger": { "globals": { - "document.activeElement": true, - "document.getSelection": true + "console": true } }, - "currency-formatter": { + "ethers>@ethersproject/basex": { "packages": { - "currency-formatter>accounting": true, - "currency-formatter>locale-currency": true, - "react>object-assign": true + "ethers>@ethersproject/basex>@ethersproject/bytes": true, + "ethers>@ethersproject/basex>@ethersproject/properties": true } }, - "currency-formatter>accounting": { + "ethers>@ethersproject/basex>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/basex>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/basex>@ethersproject/bytes>@ethersproject/logger": { "globals": { - "define": true + "console": true } }, - "currency-formatter>locale-currency": { + "ethers>@ethersproject/basex>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/basex>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/bignumber": { + "packages": { + "bn.js": true, + "ethers>@ethersproject/bignumber>@ethersproject/bytes": true, + "ethers>@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/bignumber>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/bignumber>@ethersproject/logger": { "globals": { - "countryCode": true + "console": true } }, - "debounce-stream": { + "ethers>@ethersproject/bytes": { "packages": { - "debounce-stream>debounce": true, - "debounce-stream>duplexer": true, - "debounce-stream>through": true + "ethers>@ethersproject/bytes>@ethersproject/logger": true } }, - "debounce-stream>debounce": { + "ethers>@ethersproject/bytes>@ethersproject/logger": { "globals": { - "clearTimeout": true, - "setTimeout": true + "console": true } }, - "debounce-stream>duplexer": { + "ethers>@ethersproject/constants": { "packages": { - "browserify>stream-browserify": true + "ethers>@ethersproject/constants>@ethersproject/constants>@ethersproject/bignumber": true } }, - "debounce-stream>through": { + "ethers>@ethersproject/constants>@ethersproject/bignumber": { "packages": { - "browserify>process": true, - "browserify>stream-browserify": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/constants>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/logger": true } }, - "depcheck>@babel/traverse": { + "ethers>@ethersproject/constants>@ethersproject/bignumber>bn.js": { "globals": { - "console.log": true, - "console.trace": true + "Buffer": true }, "packages": { - "@babel/code-frame": true, - "@babel/core>@babel/generator": true, - "@babel/core>@babel/parser": true, - "@babel/core>@babel/types": true, - "depcheck>@babel/traverse>@babel/helper-environment-visitor": true, - "depcheck>@babel/traverse>@babel/helper-function-name": true, - "depcheck>@babel/traverse>@babel/helper-hoist-variables": true, - "depcheck>@babel/traverse>@babel/helper-split-export-declaration": true, - "depcheck>@babel/traverse>globals": true, - "madge>debug": true + "browserify>browser-resolve": true } }, - "depcheck>@babel/traverse>@babel/helper-function-name": { + "ethers>@ethersproject/constants>@ethersproject/bignumber": { "packages": { - "@babel/core>@babel/template": true, - "@babel/core>@babel/types": true + "ethers>@ethersproject/constants>@ethersproject/bignumber>@ethersproject/bytes": true, + "ethers>@ethersproject/constants>@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/constants>@ethersproject/bignumber>bn.js": true } }, - "depcheck>@babel/traverse>@babel/helper-hoist-variables": { + "ethers>@ethersproject/constants>@ethersproject/bignumber>@ethersproject/bytes": { "packages": { - "@babel/core>@babel/types": true + "ethers>@ethersproject/constants>@ethersproject/bignumber>@ethersproject/logger": true } }, - "depcheck>@babel/traverse>@babel/helper-split-export-declaration": { + "ethers>@ethersproject/constants>@ethersproject/bignumber>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "@babel/core>@babel/types": true + "browserify>browser-resolve": true } }, - "depcheck>@vue/compiler-sfc>postcss>nanoid": { + "ethers>@ethersproject/contracts": { "globals": { - "crypto.getRandomValues": true + "setTimeout": true + }, + "packages": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true } }, - "dependency-tree>precinct>detective-postcss>postcss>nanoid": { + "ethers>@ethersproject/contracts>@ethersproject/abi": { "globals": { - "crypto.getRandomValues": true + "console.log": true + }, + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/strings": true, + "ethers>@ethersproject/contracts>@ethersproject/address": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/constants": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true } }, - "end-of-stream": { + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash": { "packages": { - "browserify>process": true, - "pump>once": true + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash>@ethersproject/base64": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/strings": true, + "ethers>@ethersproject/contracts>@ethersproject/address": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/constants": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true } }, - "enzyme>has": { + "ethers>@ethersproject/contracts>@ethersproject/abstract-provider": { "packages": { - "mocha>object.assign>function-bind": true + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true } }, - "enzyme>is-regex": { + "ethers>@ethersproject/contracts>@ethersproject/abstract-signer": { "packages": { - "enzyme>is-regex>has-tostringtag": true, - "string.prototype.matchall>call-bind": true + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true } }, - "enzyme>is-regex>has-tostringtag": { + "ethers>@ethersproject/contracts>@ethersproject/address": { "packages": { - "string.prototype.matchall>has-symbols": true + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true } }, - "enzyme>object-inspect": { - "globals": { - "HTMLElement": true, - "WeakRef": true - }, + "ethers>@ethersproject/contracts>@ethersproject/address>@ethersproject/rlp": { "packages": { - "browserify>browser-resolve": true + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true } }, - "eslint>optionator>fast-levenshtein": { - "globals": { - "Intl": true, - "Levenshtein": "write", - "console.log": true, - "define": true, - "importScripts": true, - "postMessage": true + "ethers>@ethersproject/contracts>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true } }, - "eth-block-tracker": { + "ethers>@ethersproject/contracts>@ethersproject/bignumber>bn.js": { "globals": { - "clearTimeout": true, - "console.error": true, - "setTimeout": true + "Buffer": true }, "packages": { - "eth-block-tracker>@metamask/utils": true, - "eth-block-tracker>pify": true, - "eth-query>json-rpc-random-id": true, - "json-rpc-engine>@metamask/safe-event-emitter": true + "browserify>browser-resolve": true } }, - "eth-block-tracker>@metamask/utils": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": { "packages": { - "eslint>fast-deep-equal": true, - "eth-block-tracker>@metamask/utils>superstruct": true, - "madge>debug": true + "ethers>@ethersproject/contracts>@ethersproject/logger": true } }, - "eth-ens-namehash": { - "globals": { - "name": "write" - }, + "ethers>@ethersproject/contracts>@ethersproject/constants": { "packages": { - "browserify>buffer": true, - "eth-ens-namehash>idna-uts46-hx": true, - "eth-ens-namehash>js-sha3": true + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true } }, - "eth-ens-namehash>idna-uts46-hx": { + "ethers>@ethersproject/contracts>@ethersproject/logger": { "globals": { - "define": true - }, - "packages": { - "browserify>punycode": true + "console": true } }, - "eth-ens-namehash>js-sha3": { + "ethers>@ethersproject/contracts>@ethersproject/properties": { "packages": { - "browserify>process": true + "ethers>@ethersproject/contracts>@ethersproject/logger": true } }, - "eth-json-rpc-filters": { - "globals": { - "console.error": true, - "results": "write" - }, + "ethers>@ethersproject/contracts>@ethersproject/transactions": { "packages": { - "await-semaphore": true, - "eth-json-rpc-filters>eth-json-rpc-middleware": true, - "eth-json-rpc-filters>eth-json-rpc-middleware>pify": true, - "eth-json-rpc-filters>json-rpc-engine": true, - "eth-json-rpc-filters>lodash.flatmap": true, - "eth-query": true, - "safe-event-emitter": true + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/address": true, + "ethers>@ethersproject/contracts>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/constants": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true, + "ethers>@ethersproject/contracts>@ethersproject/transactions>@ethersproject/signing-key": true } }, - "eth-json-rpc-filters>eth-json-rpc-middleware": { + "ethers>@ethersproject/contracts>@ethersproject/transactions>@ethersproject/signing-key": { "packages": { - "eth-json-rpc-filters>json-rpc-engine": true + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, - "eth-json-rpc-middleware": { - "globals": { - "URL": true, - "btoa": true, - "console.error": true, - "fetch": true, - "setTimeout": true - }, + "ethers>@ethersproject/hash": { "packages": { - "browserify>browser-resolve": true, - "eth-json-rpc-middleware>@metamask/utils": true, - "eth-json-rpc-middleware>eth-sig-util": true, - "eth-json-rpc-middleware>pify": true, - "eth-rpc-errors": true, - "json-rpc-engine": true, - "json-rpc-engine>@metamask/safe-event-emitter": true, - "lavamoat>json-stable-stringify": true, - "vinyl>clone": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/address": true, + "ethers>@ethersproject/hash>@ethersproject/bignumber": true, + "ethers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/hash>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true } }, - "eth-json-rpc-middleware>@metamask/utils": { + "ethers>@ethersproject/hash>@ethersproject/address": { "packages": { - "eslint>fast-deep-equal": true, - "eth-json-rpc-middleware>@metamask/utils>superstruct": true, - "madge>debug": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/hash>@ethersproject/bignumber": true, + "ethers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true } }, - "eth-json-rpc-middleware>eth-sig-util": { + "ethers>@ethersproject/hash>@ethersproject/address>@ethersproject/rlp": { "packages": { - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": true, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": { + "ethers>@ethersproject/hash>@ethersproject/bignumber": { "packages": { - "bn.js": true, - "browserify>buffer": true, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/logger": true } }, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": { + "ethers>@ethersproject/hash>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "3box>ethers>elliptic": true, - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "browserify>browser-resolve": true } }, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": { + "ethers>@ethersproject/hash>@ethersproject/keccak256": { "packages": { - "3box>ethers>elliptic": true, - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": { + "ethers>@ethersproject/hash>@ethersproject/strings": { "packages": { - "browserify>buffer": true, - "ethjs>ethjs-util>is-hex-prefixed": true, - "ethjs>ethjs-util>strip-hex-prefix": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/strings>@ethersproject/constants": true, + "ethers>@ethersproject/logger": true } }, - "eth-keyring-controller": { + "ethers>@ethersproject/hash>@ethersproject/strings>@ethersproject/constants": { "packages": { - "browserify>buffer": true, - "browserify>events": true, - "eth-keyring-controller>@metamask/bip39": true, - "eth-keyring-controller>@metamask/eth-hd-keyring": true, - "eth-keyring-controller>browser-passworder": true, - "eth-keyring-controller>eth-simple-keyring": true, - "eth-keyring-controller>obs-store": true, - "eth-sig-util": true + "ethers>@ethersproject/hash>@ethersproject/bignumber": true } }, - "eth-keyring-controller>@metamask/bip39": { + "ethers>@ethersproject/hash>@ethersproject/address": { "packages": { - "browserify>buffer": true, - "browserify>crypto-browserify>pbkdf2": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-wallet>randombytes": true + "ethers>@ethersproject/hash>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/hash>@ethersproject/bignumber": true, + "ethers>@ethersproject/hash>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/hash>@ethersproject/logger": true } }, - "eth-keyring-controller>@metamask/eth-hd-keyring": { + "ethers>@ethersproject/hash>@ethersproject/address>@ethersproject/rlp": { "packages": { - "browserify>buffer": true, - "eth-keyring-controller>@metamask/bip39": true, - "eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet": true, - "eth-keyring-controller>eth-simple-keyring": true, - "eth-trezor-keyring>@metamask/eth-sig-util": true + "ethers>@ethersproject/hash>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/logger": true } }, - "eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet": { + "ethers>@ethersproject/hash>@ethersproject/bignumber": { "packages": { - "@truffle/codec>utf8": true, - "browserify>buffer": true, - "browserify>crypto-browserify": true, - "eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet>uuid": true, - "ethereumjs-util": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-wallet>aes-js": true, - "ethereumjs-wallet>bs58check": true, - "ethereumjs-wallet>randombytes": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true + "ethers>@ethersproject/hash>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/hash>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/logger": true } }, - "eth-keyring-controller>@metamask/eth-hd-keyring>ethereumjs-wallet>uuid": { + "ethers>@ethersproject/hash>@ethersproject/bignumber>bn.js": { "globals": { - "crypto": true, - "msCrypto": true + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true } }, - "eth-keyring-controller>browser-passworder": { - "globals": { - "btoa": true, - "crypto": true - }, + "ethers>@ethersproject/hash>@ethersproject/bytes": { "packages": { - "eth-keyring-controller>browser-passworder>browserify-unibabel": true + "ethers>@ethersproject/hash>@ethersproject/logger": true } }, - "eth-keyring-controller>browser-passworder>browserify-unibabel": { + "ethers>@ethersproject/hash>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/logger": { "globals": { - "atob": true, - "btoa": true + "console": true } }, - "eth-keyring-controller>eth-simple-keyring": { + "ethers>@ethersproject/hash>@ethersproject/properties": { "packages": { - "browserify>buffer": true, - "browserify>events": true, - "eth-keyring-controller>eth-simple-keyring>ethereumjs-wallet": true, - "eth-sig-util": true, - "ethereumjs-util": true + "ethers>@ethersproject/hash>@ethersproject/logger": true } }, - "eth-keyring-controller>eth-simple-keyring>ethereumjs-wallet": { + "ethers>@ethersproject/hash>@ethersproject/strings": { "packages": { - "@truffle/codec>utf8": true, - "browserify>buffer": true, - "browserify>crypto-browserify": true, - "eth-keyring-controller>eth-simple-keyring>ethereumjs-wallet>uuid": true, - "ethereumjs-util": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-wallet>aes-js": true, - "ethereumjs-wallet>bs58check": true, - "ethereumjs-wallet>randombytes": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true + "ethers>@ethersproject/hash>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/logger": true, + "ethers>@ethersproject/hash>@ethersproject/strings>@ethersproject/constants": true } }, - "eth-keyring-controller>eth-simple-keyring>ethereumjs-wallet>uuid": { - "globals": { - "crypto": true, - "msCrypto": true + "ethers>@ethersproject/hash>@ethersproject/strings>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/bignumber": true } }, - "eth-keyring-controller>obs-store": { + "ethers>@ethersproject/hdnode": { "packages": { - "safe-event-emitter": true, - "watchify>xtend": true + "ethers>@ethersproject/basex": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/pbkdf2": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true, + "ethers>@ethersproject/wordlists": true } }, - "eth-lattice-keyring": { - "globals": { - "addEventListener": true, - "browser": true, - "clearInterval": true, - "fetch": true, - "open": true, - "setInterval": true, - "txData.type": true - }, + "ethers>@ethersproject/hdnode>@ethersproject/strings": { "packages": { - "@ethereumjs/common": true, - "@ethereumjs/tx": true, - "browserify>buffer": true, - "browserify>crypto-browserify": true, - "browserify>events": true, - "eth-lattice-keyring>bn.js": true, - "eth-lattice-keyring>gridplus-sdk": true, - "eth-lattice-keyring>rlp": true, - "eth-lattice-keyring>secp256k1": true, - "ethereumjs-util": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/units>@ethersproject/constants": true } }, - "eth-lattice-keyring>bn.js": { - "globals": { - "Buffer": true - }, + "ethers>@ethersproject/hdnode>@ethersproject/basex": { "packages": { - "browserify>browser-resolve": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true } }, - "eth-lattice-keyring>gridplus-sdk": { - "globals": { - "__values": true, - "console.log": true, - "console.warn": true, - "setTimeout": true - }, + "ethers>@ethersproject/hdnode>@ethersproject/strings": { "packages": { - "3box>ethers>elliptic": true, - "@ethereumjs/common": true, - "@ethereumjs/common>crc-32": true, - "@ethereumjs/tx": true, - "bn.js": true, - "browserify>buffer": true, - "browserify>process": true, - "eth-lattice-keyring>gridplus-sdk>bech32": true, - "eth-lattice-keyring>gridplus-sdk>bignumber.js": true, - "eth-lattice-keyring>gridplus-sdk>bitwise": true, - "eth-lattice-keyring>gridplus-sdk>borc": true, - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": true, - "eth-lattice-keyring>gridplus-sdk>rlp": true, - "eth-lattice-keyring>gridplus-sdk>secp256k1": true, - "eth-lattice-keyring>gridplus-sdk>superagent": true, - "ethereumjs-wallet>aes-js": true, - "ethereumjs-wallet>bs58check": true, - "ethers>@ethersproject/abi": true, - "ethers>@ethersproject/keccak256>js-sha3": true, - "ethers>@ethersproject/sha2>hash.js": true, - "lodash": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/units>@ethersproject/constants": true + } + }, + "ethers>@ethersproject/json-wallets": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/json-wallets>aes-js": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/pbkdf2": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true } }, - "eth-lattice-keyring>gridplus-sdk>bignumber.js": { + "ethers>@ethersproject/json-wallets>aes-js": { "globals": { - "crypto": true, "define": true } }, - "eth-lattice-keyring>gridplus-sdk>bitwise": { + "ethers>@ethersproject/json-wallets>scrypt-js": { + "globals": { + "define": true, + "setTimeout": true + }, "packages": { - "browserify>buffer": true + "browserify>timers-browserify": true } }, - "eth-lattice-keyring>gridplus-sdk>borc": { - "globals": { - "console": true - }, + "ethers>@ethersproject/keccak256": { "packages": { - "3box>ipfs>iso-url": true, - "browserify>buffer": true, - "browserify>buffer>ieee754": true, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true + "ethers>@ethersproject/keccak256>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { + "ethers>@ethersproject/keccak256>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/keccak256>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/keccak256>@ethersproject/bytes>@ethersproject/logger": { "globals": { - "crypto": true, - "define": true + "console": true } }, - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { + "ethers>@ethersproject/keccak256>js-sha3": { "globals": { - "intToBuffer": true + "define": true }, "packages": { - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>bn.js": true, - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>buffer": true, - "ethers>@ethersproject/keccak256>js-sha3": true + "browserify>process": true } }, - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>bn.js": { + "ethers>@ethersproject/logger": { "globals": { - "Buffer": true - }, + "console": true + } + }, + "ethers>@ethersproject/pbkdf2": { "packages": { - "browserify>browser-resolve": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true } }, - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>buffer": { + "ethers>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/properties>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/properties>@ethersproject/logger": { "globals": { "console": true + } + }, + "ethers>@ethersproject/providers": { + "globals": { + "WebSocket": true, + "clearInterval": true, + "clearTimeout": true, + "console.log": true, + "console.warn": true, + "name": true, + "setInterval": true, + "setTimeout": true }, "packages": { - "base64-js": true, - "browserify>buffer>ieee754": true + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/basex": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/networks": true, + "ethers>@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/providers>bech32": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true } }, - "eth-lattice-keyring>gridplus-sdk>rlp": { - "globals": { - "TextEncoder": true + "ethers>@ethersproject/providers>@ethersproject/networks": { + "packages": { + "ethers>@ethersproject/logger": true } }, - "eth-lattice-keyring>gridplus-sdk>secp256k1": { + "ethers>@ethersproject/providers>@ethersproject/rlp": { "packages": { - "3box>ethers>elliptic": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "eth-lattice-keyring>gridplus-sdk>superagent": { + "ethers>@ethersproject/providers>@ethersproject/web": { "globals": { - "XMLHttpRequest": true, - "btoa": true, "clearTimeout": true, - "console.error": true, - "console.warn": true, + "fetch": true, "setTimeout": true }, "packages": { - "browserify>browser-resolve": true, - "browserify>process": true, - "eth-rpc-errors>fast-safe-stringify": true, - "nock>qs": true, - "pubnub>superagent>component-emitter": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": true } }, - "eth-lattice-keyring>rlp": { + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": { "globals": { - "TextEncoder": true + "atob": true, + "btoa": true + }, + "packages": { + "ethers>@ethersproject/bytes": true } }, - "eth-lattice-keyring>secp256k1": { + "ethers>@ethersproject/providers>@ethersproject/abstract-provider": { "packages": { - "3box>ethers>elliptic": true + "ethers>@ethersproject/providers>@ethersproject/bignumber": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true } }, - "eth-method-registry": { + "ethers>@ethersproject/providers>@ethersproject/abstract-signer": { "packages": { - "ethjs": true + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true } }, - "eth-query": { + "ethers>@ethersproject/providers>@ethersproject/address": { "packages": { - "eth-query>json-rpc-random-id": true, - "madge>debug": true, - "watchify>xtend": true + "ethers>@ethersproject/providers>@ethersproject/bignumber": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/rlp": true } }, - "eth-rpc-errors": { + "ethers>@ethersproject/providers>@ethersproject/basex": { "packages": { - "eth-rpc-errors>fast-safe-stringify": true + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true } }, - "eth-sig-util": { + "ethers>@ethersproject/providers>@ethersproject/bignumber": { "packages": { - "3box>tweetnacl": true, - "3box>tweetnacl-util": true, - "browserify>buffer": true, - "eth-sig-util>ethereumjs-util": true, - "ethereumjs-abi": true + "ethers>@ethersproject/providers>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true } }, - "eth-sig-util>ethereumjs-util": { + "ethers>@ethersproject/providers>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "3box>ethers>elliptic": true, - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "eth-sig-util>ethereumjs-util>ethjs-util": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "browserify>browser-resolve": true } }, - "eth-sig-util>ethereumjs-util>ethjs-util": { + "ethers>@ethersproject/providers>@ethersproject/bytes": { "packages": { - "browserify>buffer": true, - "ethjs>ethjs-util>is-hex-prefixed": true, - "ethjs>ethjs-util>strip-hex-prefix": true + "ethers>@ethersproject/providers>@ethersproject/logger": true } }, - "eth-trezor-keyring": { - "globals": { - "setTimeout": true - }, + "ethers>@ethersproject/providers>@ethersproject/constants": { "packages": { - "@ethereumjs/tx": true, - "browserify>buffer": true, - "browserify>events": true, - "eth-trezor-keyring>hdkey": true, - "eth-trezor-keyring>trezor-connect": true, - "ethereumjs-util": true + "ethers>@ethersproject/providers>@ethersproject/bignumber": true } }, - "eth-trezor-keyring>@metamask/eth-sig-util": { + "ethers>@ethersproject/providers>@ethersproject/hash": { "packages": { - "3box>tweetnacl": true, - "3box>tweetnacl-util": true, - "browserify>buffer": true, - "eth-trezor-keyring>@metamask/eth-sig-util>ethereumjs-util": true, - "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": true, - "ethereumjs-abi": true + "ethers>@ethersproject/providers>@ethersproject/address": true, + "ethers>@ethersproject/providers>@ethersproject/bignumber": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/strings": true, + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": true } }, - "eth-trezor-keyring>@metamask/eth-sig-util>ethereumjs-util": { + "ethers>@ethersproject/providers>@ethersproject/hash>@ethersproject/keccak256": { "packages": { - "3box>ethers>elliptic": true, - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "ethers>@ethersproject/keccak256>js-sha3": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true } }, - "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": { + "ethers>@ethersproject/providers>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/networks": { "packages": { - "browserify>buffer": true, - "ethjs>ethjs-util>is-hex-prefixed": true, - "ethjs>ethjs-util>strip-hex-prefix": true + "ethers>@ethersproject/providers>@ethersproject/logger": true } }, - "eth-trezor-keyring>hdkey": { + "ethers>@ethersproject/providers>@ethersproject/properties": { "packages": { - "browserify>assert": true, - "browserify>crypto-browserify": true, - "eth-trezor-keyring>hdkey>coinstring": true, - "eth-trezor-keyring>hdkey>secp256k1": true, - "ethereumjs-wallet>safe-buffer": true + "ethers>@ethersproject/providers>@ethersproject/logger": true } }, - "eth-trezor-keyring>hdkey>coinstring": { + "ethers>@ethersproject/providers>@ethersproject/random": { "packages": { - "browserify>buffer": true, - "eth-trezor-keyring>hdkey>coinstring>bs58": true, - "ethereumjs-util>create-hash": true + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true } }, - "eth-trezor-keyring>hdkey>secp256k1": { + "ethers>@ethersproject/providers>@ethersproject/rlp": { "packages": { - "3box>ethers>elliptic": true, - "bn.js": true, - "browserify>insert-module-globals>is-buffer": true, - "eth-trezor-keyring>hdkey>secp256k1>bip66": true, - "eth-trezor-keyring>hdkey>secp256k1>drbg.js": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-wallet>safe-buffer": true + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true } }, - "eth-trezor-keyring>hdkey>secp256k1>bip66": { + "ethers>@ethersproject/providers>@ethersproject/sha2": { "packages": { - "ethereumjs-wallet>safe-buffer": true + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true } }, - "eth-trezor-keyring>hdkey>secp256k1>drbg.js": { + "ethers>@ethersproject/providers>@ethersproject/strings": { "packages": { - "browserify>buffer": true, - "browserify>crypto-browserify>create-hmac": true + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/constants": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true } }, - "eth-trezor-keyring>trezor-connect": { + "ethers>@ethersproject/providers>@ethersproject/transactions": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/address": true, + "ethers>@ethersproject/providers>@ethersproject/bignumber": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/constants": true, + "ethers>@ethersproject/providers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/providers>@ethersproject/transactions>@ethersproject/signing-key": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/transactions>@ethersproject/signing-key": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true, + "ethers>@ethersproject/signing-key>elliptic": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/web": { "globals": { - "__TREZOR_CONNECT_SRC": true, - "addEventListener": true, - "btoa": true, - "chrome": true, - "clearInterval": true, "clearTimeout": true, - "console": true, - "document.body": true, - "document.createElement": true, - "document.createTextNode": true, - "document.getElementById": true, - "document.querySelectorAll": true, - "location": true, - "navigator": true, - "open": true, - "removeEventListener": true, - "setInterval": true, + "fetch": true, "setTimeout": true }, "packages": { - "3box>graphql-request>cross-fetch": true, - "@babel/runtime": true, - "browserify>events": true, - "eth-trezor-keyring>@metamask/eth-sig-util": true + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/strings": true, + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": true } }, - "ethereumjs-abi": { + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, "packages": { - "bn.js": true, - "browserify>buffer": true, - "ethereumjs-abi>ethereumjs-util": true + "ethers>@ethersproject/providers>@ethersproject/bytes": true } }, - "ethereumjs-abi>ethereumjs-util": { + "ethers>@ethersproject/random": { + "globals": { + "crypto.getRandomValues": true + }, "packages": { - "3box>ethers>elliptic": true, - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "ethereumjs-abi>ethereumjs-util>ethjs-util": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "ethers>@ethersproject/random>@ethersproject/bytes": true, + "ethers>@ethersproject/random>@ethersproject/logger": true } }, - "ethereumjs-abi>ethereumjs-util>ethjs-util": { + "ethers>@ethersproject/random>@ethersproject/bytes": { "packages": { - "browserify>buffer": true, - "ethjs>ethjs-util>is-hex-prefixed": true, - "ethjs>ethjs-util>strip-hex-prefix": true + "ethers>@ethersproject/random>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/random>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/rlp>@ethersproject/bytes": true, + "ethers>@ethersproject/rlp>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/rlp>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/rlp>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/rlp>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/sha2": { + "packages": { + "ethers>@ethersproject/sha2>@ethersproject/bytes": true, + "ethers>@ethersproject/sha2>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true } }, - "ethereumjs-util": { + "ethers>@ethersproject/sha2>@ethersproject/bytes": { "packages": { - "browserify>assert": true, - "browserify>buffer": true, - "browserify>insert-module-globals>is-buffer": true, - "ethereumjs-util>bn.js": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>ethjs-util": true, - "ethereumjs-util>rlp": true + "ethers>@ethersproject/sha2>@ethersproject/logger": true } }, - "ethereumjs-util>bn.js": { + "ethers>@ethersproject/sha2>@ethersproject/logger": { "globals": { - "Buffer": true - }, - "packages": { - "browserify>browser-resolve": true + "console": true } }, - "ethereumjs-util>create-hash": { + "ethers>@ethersproject/sha2>hash.js": { "packages": { - "addons-linter>sha.js": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>create-hash>md5.js": true, - "ethereumjs-util>create-hash>ripemd160": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, "pumpify>inherits": true } }, - "ethereumjs-util>create-hash>cipher-base": { + "ethers>@ethersproject/signing-key": { "packages": { - "browserify>stream-browserify": true, - "browserify>string_decoder": true, - "ethereumjs-wallet>safe-buffer": true, - "pumpify>inherits": true + "@unstoppabledomains/resolution>elliptic": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true } }, - "ethereumjs-util>create-hash>md5.js": { + "ethers>@ethersproject/signing-key>@ethersproject/bytes": { "packages": { - "ethereumjs-util>create-hash>md5.js>hash-base": true, - "ethereumjs-wallet>safe-buffer": true, - "pumpify>inherits": true + "ethers>@ethersproject/signing-key>@ethersproject/logger": true } }, - "ethereumjs-util>create-hash>md5.js>hash-base": { + "ethers>@ethersproject/signing-key>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/signing-key>@ethersproject/properties": { "packages": { - "ethereumjs-util>create-hash>md5.js>hash-base>readable-stream": true, - "ethereumjs-wallet>safe-buffer": true, - "pumpify>inherits": true + "ethers>@ethersproject/signing-key>@ethersproject/logger": true } }, - "ethereumjs-util>create-hash>md5.js>hash-base>readable-stream": { + "ethers>@ethersproject/signing-key>elliptic": { "packages": { - "@storybook/api>util-deprecate": true, - "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>events": true, - "browserify>process": true, - "browserify>string_decoder": true, + "bn.js": true, + "ethers>@ethersproject/sha2>hash.js": true, + "ethers>@ethersproject/sha2>hash.js>minimalistic-assert": true, + "ethers>@ethersproject/signing-key>elliptic>brorand": true, + "ethers>@ethersproject/signing-key>elliptic>hmac-drbg": true, + "ethers>@ethersproject/signing-key>elliptic>minimalistic-crypto-utils": true, "pumpify>inherits": true } }, - "ethereumjs-util>create-hash>ripemd160": { + "ethers>@ethersproject/signing-key>elliptic>brorand": { + "globals": { + "crypto": true, + "msCrypto": true + }, "packages": { - "browserify>buffer": true, - "ethereumjs-util>create-hash>md5.js>hash-base": true, - "pumpify>inherits": true + "browserify>browser-resolve": true } }, - "ethereumjs-util>ethereum-cryptography": { + "ethers>@ethersproject/signing-key>elliptic>hmac-drbg": { "packages": { - "browserify>assert": true, - "browserify>buffer": true, - "browserify>crypto-browserify>create-hmac": true, - "ethereumjs-util>ethereum-cryptography>keccak": true, - "ethereumjs-util>ethereum-cryptography>secp256k1": true, - "ethereumjs-wallet>bs58check": true, - "ethereumjs-wallet>randombytes": true, - "ethereumjs-wallet>safe-buffer": true, - "ethers>@ethersproject/sha2>hash.js": true + "ethers>@ethersproject/sha2>hash.js": true, + "ethers>@ethersproject/sha2>hash.js>minimalistic-assert": true, + "ethers>@ethersproject/signing-key>elliptic>minimalistic-crypto-utils": true } }, - "ethereumjs-util>ethereum-cryptography>blakejs": { - "globals": { - "TextEncoder": true, - "console.log": true + "ethers>@ethersproject/solidity": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true } }, - "ethereumjs-util>ethereum-cryptography>browserify-aes": { + "ethers>@ethersproject/strings": { "packages": { - "browserify>buffer": true, - "browserify>crypto-browserify>browserify-cipher>evp_bytestokey": true, - "ethereumjs-util>create-hash>cipher-base": true, - "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": true, - "ethereumjs-wallet>safe-buffer": true, - "pumpify>inherits": true + "ethers>@ethersproject/strings>@ethersproject/bytes": true, + "ethers>@ethersproject/strings>@ethersproject/logger": true, + "ethers>@ethersproject/strings>@ethersproject/strings>@ethersproject/constants": true } }, - "ethereumjs-util>ethereum-cryptography>browserify-aes>buffer-xor": { + "ethers>@ethersproject/strings>@ethersproject/constants": { "packages": { - "browserify>buffer": true + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true } }, - "ethereumjs-util>ethereum-cryptography>keccak": { + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { "packages": { - "browserify>buffer": true, - "ethereumjs-util>ethereum-cryptography>keccak>readable-stream": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true } }, - "ethereumjs-util>ethereum-cryptography>keccak>readable-stream": { + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "@storybook/api>util-deprecate": true, - "browserify>browser-resolve": true, - "browserify>buffer": true, - "browserify>events": true, - "browserify>process": true, - "browserify>string_decoder": true, - "pumpify>inherits": true + "browserify>browser-resolve": true } }, - "ethereumjs-util>ethereum-cryptography>secp256k1": { + "ethers>@ethersproject/strings>@ethersproject/bytes": { "packages": { - "3box>ethers>elliptic": true + "ethers>@ethersproject/strings>@ethersproject/logger": true } }, - "ethereumjs-util>ethjs-util": { + "ethers>@ethersproject/strings>@ethersproject/constants": { "packages": { - "browserify>buffer": true, - "ethjs>ethjs-util>is-hex-prefixed": true, - "ethjs>ethjs-util>strip-hex-prefix": true + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true } }, - "ethereumjs-util>rlp": { + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { "packages": { - "browserify>buffer": true, - "ethereumjs-util>rlp>bn.js": true + "ethers>@ethersproject/strings>@ethersproject/bytes": true, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/strings>@ethersproject/logger": true } }, - "ethereumjs-util>rlp>bn.js": { + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { "globals": { "Buffer": true }, @@ -5608,258 +6797,263 @@ "browserify>browser-resolve": true } }, - "ethereumjs-wallet": { + "ethers>@ethersproject/strings>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/transactions": { + "globals": { + "console.log": true + }, "packages": { - "@truffle/codec>utf8": true, - "browserify>crypto-browserify": true, - "ethereumjs-wallet>aes-js": true, - "ethereumjs-wallet>bs58check": true, - "ethereumjs-wallet>ethereumjs-util": true, - "ethereumjs-wallet>randombytes": true, - "ethereumjs-wallet>safe-buffer": true, - "ethereumjs-wallet>scryptsy": true, - "ethereumjs-wallet>uuid": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/transactions>@ethersproject/address": true, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true, + "ethers>@ethersproject/transactions>@ethersproject/constants": true, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": true, + "ethers>@ethersproject/transactions>@ethersproject/rlp": true, + "ethers>@ethersproject/transactions>@ethersproject/signing-key": true } }, - "ethereumjs-wallet>aes-js": { + "ethers>@ethersproject/transactions>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/rlp": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": { "globals": { - "define": true + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true } }, - "ethereumjs-wallet>bs58check": { + "ethers>@ethersproject/transactions>@ethersproject/bytes": { "packages": { - "3box>ipfs>bs58": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-wallet>safe-buffer": true + "ethers>@ethersproject/transactions>@ethersproject/logger": true } }, - "ethereumjs-wallet>ethereumjs-util": { + "ethers>@ethersproject/transactions>@ethersproject/constants": { "packages": { - "3box>ethers>elliptic": true, - "bn.js": true, - "browserify>assert": true, - "browserify>buffer": true, - "ethereumjs-util>create-hash": true, - "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true, - "ethereumjs-wallet>ethereumjs-util>ethjs-util": true + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true } }, - "ethereumjs-wallet>ethereumjs-util>ethjs-util": { + "ethers>@ethersproject/transactions>@ethersproject/keccak256": { "packages": { - "browserify>buffer": true, - "ethjs>ethjs-util>is-hex-prefixed": true, - "ethjs>ethjs-util>strip-hex-prefix": true + "ethers>@ethersproject/keccak256>js-sha3": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true } }, - "ethereumjs-wallet>randombytes": { + "ethers>@ethersproject/transactions>@ethersproject/logger": { "globals": { - "crypto": true, - "msCrypto": true - }, + "console": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/properties": { "packages": { - "browserify>process": true, - "ethereumjs-wallet>safe-buffer": true + "ethers>@ethersproject/transactions>@ethersproject/logger": true } }, - "ethereumjs-wallet>safe-buffer": { + "ethers>@ethersproject/transactions>@ethersproject/rlp": { "packages": { - "browserify>buffer": true + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true } }, - "ethereumjs-wallet>scryptsy": { + "ethers>@ethersproject/transactions>@ethersproject/signing-key": { "packages": { - "browserify>buffer": true, - "browserify>crypto-browserify>pbkdf2": true + "ethers>@ethersproject/signing-key>elliptic": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/properties": true } }, - "ethereumjs-wallet>uuid": { - "globals": { - "crypto": true, - "msCrypto": true + "ethers>@ethersproject/transactions>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": true, + "ethers>@ethersproject/transactions>@ethersproject/rlp": true } }, - "ethers": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber": { "packages": { - "ethers>@ethersproject/abi": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/bignumber": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/contracts": true, - "ethers>@ethersproject/hash": true, - "ethers>@ethersproject/hdnode": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/solidity": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/units": true, - "ethers>@ethersproject/wallet": true, - "ethers>@ethersproject/web": true, - "ethers>@ethersproject/wordlists": true + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": true } }, - "ethers>@ethersproject/abi": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": { "globals": { - "console.log": true + "Buffer": true }, "packages": { - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": { + "packages": { "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/hash": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "ethers>@ethersproject/abstract-provider": { + "ethers>@ethersproject/transactions>@ethersproject/rlp": { "packages": { - "ethers>@ethersproject/bignumber": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/signing-key": { + "packages": { + "@unstoppabledomains/resolution>elliptic": true, "ethers>@ethersproject/bytes": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true } }, - "ethers>@ethersproject/abstract-signer": { + "ethers>@ethersproject/units": { "packages": { "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "ethers>@ethersproject/units>@ethersproject/bignumber": true } }, - "ethers>@ethersproject/address": { + "ethers>@ethersproject/units>@ethersproject/bignumber": { "packages": { - "ethers>@ethersproject/bignumber": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/rlp": true + "ethers>@ethersproject/units>@ethersproject/bignumber>bn.js": true } }, - "ethers>@ethersproject/base64": { + "ethers>@ethersproject/units>@ethersproject/bignumber>bn.js": { "globals": { - "atob": true, - "btoa": true + "Buffer": true }, "packages": { - "ethers>@ethersproject/bytes": true + "browserify>browser-resolve": true } }, - "ethers>@ethersproject/basex": { + "ethers>@ethersproject/units>@ethersproject/constants": { "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/properties": true + "ethers>@ethersproject/units>@ethersproject/bignumber": true } }, - "ethers>@ethersproject/bignumber": { + "ethers>@ethersproject/units>@ethersproject/constants": { "packages": { - "bn.js": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "@ethersproject/bignumber": true } }, - "ethers>@ethersproject/bytes": { + "ethers>@ethersproject/wallet": { "packages": { - "ethers>@ethersproject/logger": true + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true } }, - "ethers>@ethersproject/constants": { + "ethers>@ethersproject/wallet>@ethersproject/address": { "packages": { - "ethers>@ethersproject/bignumber": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true } }, - "ethers>@ethersproject/contracts": { - "globals": { - "setTimeout": true - }, + "ethers>@ethersproject/wallet>@ethersproject/hash": { "packages": { - "ethers>@ethersproject/abi": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true } }, - "ethers>@ethersproject/hash": { + "ethers>@ethersproject/wallet>@ethersproject/keccak256": { "packages": { - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "ethers>@ethersproject/hdnode": { + "ethers>@ethersproject/wallet>@ethersproject/signing-key": { "packages": { - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/bignumber": true, + "@unstoppabledomains/resolution>elliptic": true, "ethers>@ethersproject/bytes": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/pbkdf2": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/wordlists": true + "ethers>@ethersproject/properties": true } }, - "ethers>@ethersproject/json-wallets": { + "ethers>@ethersproject/wallet>@ethersproject/transactions": { "packages": { - "ethers>@ethersproject/address": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/hdnode": true, - "ethers>@ethersproject/json-wallets>aes-js": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true, - "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/pbkdf2": true, "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true } }, - "ethers>@ethersproject/json-wallets>aes-js": { - "globals": { - "define": true + "ethers>@ethersproject/wallet>@ethersproject/address": { + "packages": { + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true } }, - "ethers>@ethersproject/json-wallets>scrypt-js": { - "globals": { - "define": true, - "setTimeout": true - }, + "ethers>@ethersproject/wallet>@ethersproject/hash": { "packages": { - "browserify>timers-browserify": true + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true } }, - "ethers>@ethersproject/keccak256": { + "ethers>@ethersproject/wallet>@ethersproject/keccak256": { "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256>js-sha3": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256>js-sha3": true } }, - "ethers>@ethersproject/keccak256>js-sha3": { + "ethers>@ethersproject/wallet>@ethersproject/keccak256>js-sha3": { "globals": { "define": true }, @@ -5867,171 +7061,146 @@ "browserify>process": true } }, - "ethers>@ethersproject/logger": { - "globals": { - "console": true + "ethers>@ethersproject/wallet>@ethersproject/properties": { + "packages": { + "@ethersproject/bignumber>@ethersproject/logger": true } }, - "ethers>@ethersproject/networks": { + "ethers>@ethersproject/wallet>@ethersproject/random": { "packages": { - "ethers>@ethersproject/logger": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true } }, - "ethers>@ethersproject/pbkdf2": { + "ethers>@ethersproject/wallet>@ethersproject/signing-key": { "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/sha2": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/signing-key>elliptic": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true } }, - "ethers>@ethersproject/properties": { + "ethers>@ethersproject/wallet>@ethersproject/transactions": { "packages": { - "ethers>@ethersproject/logger": true + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true } }, - "ethers>@ethersproject/providers": { + "ethers>@ethersproject/web": { "globals": { - "WebSocket": true, - "clearInterval": true, "clearTimeout": true, - "console.log": true, - "console.warn": true, - "name": true, - "setInterval": true, + "fetch": true, "setTimeout": true }, "packages": { - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/bignumber": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/hash": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/networks": true, "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers>bech32": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/web": true + "ethers>@ethersproject/web>@ethersproject/base64": true, + "ethers>@ethersproject/web>@ethersproject/strings": true } }, - "ethers>@ethersproject/random": { + "ethers>@ethersproject/web>@ethersproject/base64": { "globals": { - "crypto.getRandomValues": true + "atob": true, + "btoa": true }, "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/bytes": true } }, - "ethers>@ethersproject/rlp": { + "ethers>@ethersproject/web>@ethersproject/strings": { "packages": { "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": true } }, - "ethers>@ethersproject/sha2": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { "packages": { "ethers>@ethersproject/bytes": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2>hash.js": true + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true } }, - "ethers>@ethersproject/sha2>hash.js": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, - "pumpify>inherits": true + "browserify>browser-resolve": true } }, - "ethers>@ethersproject/signing-key": { + "ethers>@ethersproject/web>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, "packages": { - "3box>ethers>elliptic": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "ethers>@ethersproject/web>@ethersproject/bytes": true } }, - "ethers>@ethersproject/solidity": { + "ethers>@ethersproject/web>@ethersproject/bytes": { "packages": { - "ethers>@ethersproject/bignumber": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/web>@ethersproject/logger": true } }, - "ethers>@ethersproject/strings": { + "ethers>@ethersproject/web>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/web>@ethersproject/properties": { "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/web>@ethersproject/logger": true } }, - "ethers>@ethersproject/transactions": { - "globals": { - "console.log": true - }, + "ethers>@ethersproject/web>@ethersproject/strings": { "packages": { - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/signing-key": true + "ethers>@ethersproject/web>@ethersproject/bytes": true, + "ethers>@ethersproject/web>@ethersproject/logger": true, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": true } }, - "ethers>@ethersproject/units": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": { "packages": { - "ethers>@ethersproject/bignumber": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true } }, - "ethers>@ethersproject/wallet": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { "packages": { - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/hash": true, - "ethers>@ethersproject/hdnode": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/web>@ethersproject/bytes": true, + "ethers>@ethersproject/web>@ethersproject/logger": true, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true } }, - "ethers>@ethersproject/web": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true + "Buffer": true }, "packages": { - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "browserify>browser-resolve": true } }, "ethers>@ethersproject/wordlists": { "packages": { "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/hash": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/wallet>@ethersproject/hash": true } }, "ethjs": { @@ -6056,10 +7225,10 @@ "ethjs-contract": { "packages": { "ethjs-contract>ethjs-abi": true, - "ethjs-contract>js-sha3": true, "ethjs-query>babel-runtime": true, "ethjs>ethjs-filter": true, "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, "promise-to-callback": true } }, @@ -6067,20 +7236,10 @@ "packages": { "browserify>buffer": true, "ethjs-contract>ethjs-abi>bn.js": true, - "ethjs-contract>ethjs-abi>js-sha3": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, - "ethjs-contract>ethjs-abi>js-sha3": { - "packages": { - "browserify>process": true - } - }, - "ethjs-contract>js-sha3": { - "packages": { - "browserify>process": true - } - }, "ethjs-query": { "globals": { "console": true @@ -6197,9 +7356,13 @@ "define": true } }, + "ganache>secp256k1": { + "packages": { + "ethers>@ethersproject/signing-key>elliptic": true + } + }, "gh-pages>async": { "globals": { - "clearTimeout": true, "setTimeout": true }, "packages": { @@ -6211,7 +7374,7 @@ "globalthis>define-properties": { "packages": { "globalthis>define-properties>has-property-descriptors": true, - "nock>deep-equal>object-keys": true + "mocha>object.assign>object-keys": true } }, "globalthis>define-properties>has-property-descriptors": { @@ -6243,6 +7406,11 @@ "browserify>url": true } }, + "koa>is-generator-function>has-tostringtag": { + "packages": { + "string.prototype.matchall>has-symbols": true + } + }, "lavamoat>@babel/highlight": { "packages": { "lavamoat>@babel/highlight>@babel/helper-validator-identifier": true, @@ -6317,45 +7485,22 @@ "Intl": true } }, - "madge>debug": { - "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true - }, - "packages": { - "browserify>process": true, - "madge>debug>ms": true - } - }, - "madge>rc>deep-extend": { + "madge>ora>bl": { "packages": { - "browserify>buffer": true + "browserify>buffer": true, + "madge>ora>bl>readable-stream": true, + "pumpify>inherits": true } }, - "mockttp>node-forge": { - "globals": { - "Blob": true, - "MutationObserver": true, - "QuotaExceededError": true, - "URL.createObjectURL": true, - "URL.revokeObjectURL": true, - "Worker": true, - "addEventListener": true, - "document": true, - "jQuery": true, - "localStorage": true, - "navigator": true, - "postMessage": true, - "removeEventListener": true, - "setTimeout": true - }, + "madge>ora>bl>readable-stream": { "packages": { + "@storybook/api>util-deprecate": true, "browserify>browser-resolve": true, + "browserify>buffer": true, + "browserify>events": true, "browserify>process": true, - "browserify>timers-browserify": true + "browserify>string_decoder": true, + "pumpify>inherits": true } }, "nanoid": { @@ -6365,24 +7510,17 @@ "navigator": true } }, - "nock>deep-equal": { - "packages": { - "enzyme>is-regex": true, - "enzyme>object-is": true, - "nock>deep-equal>is-arguments": true, - "nock>deep-equal>is-date-object": true, - "nock>deep-equal>object-keys": true, - "string.prototype.matchall>regexp.prototype.flags": true - } - }, - "nock>deep-equal>is-date-object": { - "packages": { - "enzyme>is-regex>has-tostringtag": true - } - }, - "nock>qs": { + "nock>debug": { + "globals": { + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true + }, "packages": { - "string.prototype.matchall>side-channel": true + "browserify>process": true, + "nock>debug>ms": true } }, "node-fetch": { @@ -6524,12 +7662,6 @@ "react-devtools>react-devtools-core": true } }, - "react-devtools>ip": { - "packages": { - "browserify>buffer": true, - "browserify>os-browserify": true - } - }, "react-devtools>react-devtools-core": { "globals": { "WebSocket": true, @@ -6945,8 +8077,13 @@ "setTimeout": true }, "packages": { - "3box>events": true, - "browserify>util": true + "browserify>util": true, + "safe-event-emitter>events": true + } + }, + "safe-event-emitter>events": { + "globals": { + "console": true } }, "semver": { @@ -6998,13 +8135,6 @@ "string.prototype.matchall>call-bind": true } }, - "string.prototype.matchall>side-channel": { - "packages": { - "enzyme>object-inspect": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true - } - }, "stylelint>autoprefixer>browserslist": { "packages": { "browserify>browser-resolve": true, @@ -7014,12 +8144,6 @@ "stylelint>autoprefixer>caniuse-lite": true } }, - "stylelint>write-file-atomic>typedarray-to-buffer": { - "packages": { - "browserify>buffer": true, - "jsdom>request>is-typedarray": true - } - }, "terser>@jridgewell/source-map>@jridgewell/gen-mapping": { "globals": { "define": true @@ -7119,11 +8243,6 @@ "console.warn": true, "define": true } - }, - "webpack>memory-fs>errno": { - "packages": { - "webpack>memory-fs>errno>prr": true - } } } } \ No newline at end of file diff --git a/lavamoat/browserify/main/policy.json b/lavamoat/browserify/main/policy.json index b9fa80382d59..8a377ff32596 100644 --- a/lavamoat/browserify/main/policy.json +++ b/lavamoat/browserify/main/policy.json @@ -14,7 +14,6 @@ "3box>3id-resolver": true, "3box>did-jwt": true, "3box>ethers": true, - "3box>ethers>elliptic": true, "3box>graphql-request": true, "3box>https-did-resolver": true, "3box>ipfs": true, @@ -32,6 +31,7 @@ "3box>tweetnacl": true, "3box>tweetnacl-util": true, "@babel/runtime": true, + "@unstoppabledomains/resolution>elliptic": true, "browserify>buffer": true, "browserify>process": true, "node-fetch": true @@ -61,11 +61,11 @@ }, "packages": { "3box>3box-orbitdb-plugins>ipfs-log>json-stringify-deterministic": true, - "3box>3box-orbitdb-plugins>ipfs-log>p-each-series": true, "3box>3box-orbitdb-plugins>ipfs-log>p-map": true, "3box>3box-orbitdb-plugins>ipfs-log>p-whilst": true, "3box>orbit-db>orbit-db-io": true, - "browserify>buffer": true + "browserify>buffer": true, + "jest>@jest/core>p-each-series": true } }, "3box>3id-resolver": { @@ -81,11 +81,11 @@ "packages": { "3box>3id-resolver>did-jwt>base64url": true, "3box>did-jwt>did-resolver": true, - "3box>ethers>elliptic": true, "3box>js-sha256": true, "3box>tweetnacl": true, "3box>tweetnacl-util": true, "@babel/runtime": true, + "@unstoppabledomains/resolution>elliptic": true, "browserify>buffer": true, "ethers>@ethersproject/keccak256>js-sha3": true } @@ -101,9 +101,9 @@ "3box>did-jwt>did-resolver": true, "3box>did-jwt>js-sha3": true, "3box>did-jwt>uport-base64url": true, - "3box>ethers>elliptic": true, "3box>js-sha256": true, "3box>tweetnacl": true, + "@unstoppabledomains/resolution>elliptic": true, "browserify>buffer": true } }, @@ -135,33 +135,6 @@ "setTimeout": true } }, - "3box>ethers>elliptic": { - "packages": { - "3box>ethers>elliptic>brorand": true, - "3box>ethers>elliptic>hmac-drbg": true, - "3box>ethers>elliptic>minimalistic-crypto-utils": true, - "3box>ethers>hash.js>minimalistic-assert": true, - "bn.js": true, - "ethers>@ethersproject/sha2>hash.js": true, - "pumpify>inherits": true - } - }, - "3box>ethers>elliptic>brorand": { - "globals": { - "crypto": true, - "msCrypto": true - }, - "packages": { - "browserify>browser-resolve": true - } - }, - "3box>ethers>elliptic>hmac-drbg": { - "packages": { - "3box>ethers>elliptic>minimalistic-crypto-utils": true, - "3box>ethers>hash.js>minimalistic-assert": true, - "ethers>@ethersproject/sha2>hash.js": true - } - }, "3box>events": { "globals": { "console": true @@ -172,16 +145,7 @@ "fetch": true }, "packages": { - "3box>graphql-request>cross-fetch": true - } - }, - "3box>graphql-request>cross-fetch": { - "globals": { - "Blob": true, - "FileReader": true, - "FormData": true, - "URLSearchParams.prototype.isPrototypeOf": true, - "XMLHttpRequest": true + "@unstoppabledomains/resolution>cross-fetch": true } }, "3box>graphql-request>cross-fetch>node-fetch": { @@ -764,7 +728,7 @@ "3box>ipfs>ipld-raw>multihashing-async": true, "3box>ipfs>multicodec": true, "3box>ipfs>protons": true, - "@storybook/react>@storybook/store>stable": true, + "@storybook/client-api>stable": true, "browserify>assert": true, "browserify>buffer": true, "browserify>insert-module-globals>is-buffer": true @@ -890,7 +854,7 @@ }, "3box>ipfs>libp2p-crypto>asn1.js": { "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, "bn.js": true, "browserify>buffer": true, "pumpify>inherits": true @@ -2049,11 +2013,11 @@ "console.log": true }, "packages": { - "3box>ethers>elliptic": true, "3box>ipfs>libp2p-crypto": true, "3box>orbit-db>orbit-db-cache>level-js": true, "3box>orbit-db>orbit-db-keystore>levelup": true, "3box>orbit-db>orbit-db-keystore>lru": true, + "@unstoppabledomains/resolution>elliptic": true, "eth-trezor-keyring>hdkey>secp256k1": true, "ethereumjs-wallet>safe-buffer": true } @@ -2236,9 +2200,9 @@ }, "@ensdomains/content-hash>cids>multihashes": { "packages": { - "3box>ipfs>varint": true, "@ensdomains/content-hash>cids>multibase": true, - "@ensdomains/content-hash>cids>uint8arrays": true + "@ensdomains/content-hash>cids>uint8arrays": true, + "@ensdomains/content-hash>multihashes>varint": true } }, "@ensdomains/content-hash>cids>uint8arrays": { @@ -2283,17 +2247,17 @@ }, "@ensdomains/content-hash>multihashes": { "packages": { - "3box>ipfs>varint": true, "@ensdomains/content-hash>multihashes>multibase": true, + "@ensdomains/content-hash>multihashes>varint": true, "@ensdomains/content-hash>multihashes>web-encoding": true, "browserify>buffer": true } }, "@ensdomains/content-hash>multihashes>multibase": { "packages": { - "3box>ipfs>bs58>base-x": true, "@ensdomains/content-hash>multihashes>web-encoding": true, - "browserify>buffer": true + "browserify>buffer": true, + "ethereumjs-wallet>bs58check>bs58>base-x": true } }, "@ensdomains/content-hash>multihashes>web-encoding": { @@ -2310,6 +2274,34 @@ "ethers": true } }, + "@eth-optimism/contracts>@ethersproject/abstract-provider": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true + } + }, + "@eth-optimism/contracts>@ethersproject/abstract-signer": { + "packages": { + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "@eth-optimism/contracts>@ethersproject/abstract-provider": { + "packages": { + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true + } + }, + "@eth-optimism/contracts>@ethersproject/abstract-signer": { + "packages": { + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true + } + }, "@ethereumjs/common": { "packages": { "@ethereumjs/common>crc-32": true, @@ -2332,6 +2324,31 @@ "ethereumjs-util": true } }, + "@ethersproject/bignumber": { + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@ethersproject/bignumber>bn.js": true + } + }, + "@ethersproject/bignumber>@ethersproject/bytes": { + "packages": { + "@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "@ethersproject/bignumber>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, "@formatjs/intl-relativetimeformat": { "globals": { "Intl": true @@ -2350,7 +2367,7 @@ "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, "@keystonehq/bc-ur-registry-eth>hdkey": true, "browserify>buffer": true, - "ethereumjs-util": true, + "eth-lattice-keyring>@ethereumjs/util": true, "uuid": true } }, @@ -2359,11 +2376,17 @@ "define": true }, "packages": { + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry>tslib": true, "@ngraveio/bc-ur": true, "browserify>buffer": true, "ethereumjs-wallet>bs58check": true } }, + "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry>tslib": { + "globals": { + "define": true + } + }, "@keystonehq/bc-ur-registry-eth>hdkey": { "packages": { "@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": true, @@ -2375,14 +2398,14 @@ }, "@keystonehq/bc-ur-registry-eth>hdkey>secp256k1": { "packages": { - "3box>ethers>elliptic": true + "@unstoppabledomains/resolution>elliptic": true } }, "@keystonehq/metamask-airgapped-keyring": { "packages": { "@ethereumjs/tx": true, + "@keystonehq/bc-ur-registry-eth": true, "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/bc-ur-registry-eth": true, "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store": true, "browserify>buffer": true, "browserify>events": true, @@ -2392,37 +2415,32 @@ }, "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring": { "packages": { - "@keystonehq/bc-ur-registry-eth>hdkey": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@ethereumjs/tx": true, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@keystonehq/bc-ur-registry-eth": true, + "@ethereumjs/tx": true, + "@keystonehq/bc-ur-registry-eth": true, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey": true, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>rlp": true, "browserify>buffer": true, - "ethereumjs-util": true, + "eth-lattice-keyring>@ethereumjs/util": true, "uuid": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@ethereumjs/tx": { + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey": { "packages": { - "@ethereumjs/common": true, - "browserify>buffer": true, - "ethereumjs-util": true + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey>secp256k1": true, + "browserify>assert": true, + "browserify>crypto-browserify": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>safe-buffer": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>@keystonehq/bc-ur-registry-eth": { + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey>secp256k1": { "packages": { - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, - "@keystonehq/bc-ur-registry-eth>hdkey": true, - "browserify>buffer": true, - "ethereumjs-util": true, - "uuid": true + "ethers>@ethersproject/signing-key>elliptic": true } }, - "@keystonehq/metamask-airgapped-keyring>@keystonehq/bc-ur-registry-eth": { - "packages": { - "@keystonehq/bc-ur-registry-eth>@keystonehq/bc-ur-registry": true, - "@keystonehq/bc-ur-registry-eth>hdkey": true, - "browserify>buffer": true, - "ethereumjs-util": true, - "uuid": true + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>rlp": { + "globals": { + "TextEncoder": true } }, "@keystonehq/metamask-airgapped-keyring>@metamask/obs-store": { @@ -2633,6 +2651,9 @@ "@ethereumjs/common": true, "@ethereumjs/tx": true, "@metamask/contract-metadata": true, + "@metamask/controllers>@ethersproject/abi": true, + "@metamask/controllers>@ethersproject/contracts": true, + "@metamask/controllers>@ethersproject/providers": true, "@metamask/controllers>abort-controller": true, "@metamask/controllers>async-mutex": true, "@metamask/controllers>eth-json-rpc-infura": true, @@ -2655,7 +2676,6 @@ "eth-rpc-errors": true, "eth-sig-util": true, "ethereumjs-util": true, - "ethers": true, "ethjs>ethjs-unit": true, "immer": true, "json-rpc-engine": true, @@ -2665,6 +2685,103 @@ "uuid": true } }, + "@metamask/controllers>@ethersproject/abi": { + "globals": { + "console.log": true + }, + "packages": { + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true + } + }, + "@metamask/controllers>@ethersproject/contracts": { + "globals": { + "setTimeout": true + }, + "packages": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/abi": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true + } + }, + "@metamask/controllers>@ethersproject/providers": { + "globals": { + "WebSocket": true, + "clearInterval": true, + "clearTimeout": true, + "console.log": true, + "console.warn": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/networks": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/hdnode>@ethersproject/basex": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/pbkdf2>@ethersproject/sha2": true, + "ethers>@ethersproject/providers>bech32": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true, + "ethers>@ethersproject/wallet>@ethersproject/random": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true + } + }, + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true + } + }, + "@metamask/controllers>@ethersproject/providers>@ethersproject/networks": { + "packages": { + "@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "@metamask/controllers>@ethersproject/providers>@ethersproject/rlp": { + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "@metamask/controllers>@ethersproject/providers>@ethersproject/web": { + "globals": { + "clearTimeout": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true + } + }, "@metamask/controllers>abort-controller": { "globals": { "AbortController": true @@ -2725,38 +2842,38 @@ "@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true, "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true, "@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, "browserify>buffer": true, "ethjs>ethjs-filter": true, "ethjs>ethjs-provider-http": true, "ethjs>ethjs-unit": true, "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, "@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": { "packages": { "@metamask/controllers>eth-method-registry>ethjs>bn.js": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, "browserify>buffer": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": { "packages": { "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, "ethjs-query>babel-runtime": true, "ethjs>ethjs-filter": true, "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, "promise-to-callback": true } }, "@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": { "packages": { "@metamask/controllers>eth-method-registry>ethjs>bn.js": true, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": true, "browserify>buffer": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, @@ -2771,11 +2888,6 @@ "promise-to-callback": true } }, - "@metamask/controllers>eth-method-registry>ethjs>js-sha3": { - "packages": { - "browserify>process": true - } - }, "@metamask/controllers>eth-phishing-detect": { "packages": { "eslint>optionator>fast-levenshtein": true @@ -2934,8 +3046,8 @@ }, "@metamask/controllers>web3-provider-engine>eth-sig-util": { "packages": { - "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi": true, - "@metamask/controllers>web3-provider-engine>ethereumjs-util": true + "@metamask/controllers>web3-provider-engine>ethereumjs-util": true, + "ethereumjs-abi": true } }, "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi": { @@ -2947,8 +3059,8 @@ }, "@metamask/controllers>web3-provider-engine>eth-sig-util>ethereumjs-abi>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, @@ -2959,15 +3071,16 @@ }, "@metamask/controllers>web3-provider-engine>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "@metamask/controllers>web3-provider-engine>ethereumjs-util>ethjs-util": { @@ -3023,20 +3136,13 @@ "setTimeout": true }, "packages": { - "@metamask/eth-json-rpc-infura>@metamask/utils": true, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware": true, + "eth-block-tracker>@metamask/utils": true, "eth-rpc-errors": true, "json-rpc-engine": true, "node-fetch": true } }, - "@metamask/eth-json-rpc-infura>@metamask/utils": { - "packages": { - "@metamask/eth-json-rpc-infura>@metamask/utils>superstruct": true, - "eslint>fast-deep-equal": true, - "madge>debug": true - } - }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware": { "globals": { "URL": true, @@ -3058,8 +3164,8 @@ }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util": { "packages": { - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": true, - "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true + "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true, + "ethereumjs-abi": true } }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": { @@ -3071,8 +3177,8 @@ }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, @@ -3083,15 +3189,16 @@ }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "@metamask/eth-json-rpc-infura>eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": { @@ -3113,32 +3220,33 @@ "packages": { "@ethereumjs/tx": true, "@metamask/eth-ledger-bridge-keyring>eth-sig-util": true, - "@metamask/eth-ledger-bridge-keyring>hdkey": true, "browserify>buffer": true, "browserify>events": true, + "eth-trezor-keyring>hdkey": true, "ethereumjs-util": true } }, "@metamask/eth-ledger-bridge-keyring>eth-sig-util": { "packages": { - "3box>tweetnacl": true, - "3box>tweetnacl-util": true, "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util": true, "browserify>buffer": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true, "ethereumjs-abi": true } }, "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>ethjs-util": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "@metamask/eth-ledger-bridge-keyring>eth-sig-util>ethereumjs-util>ethjs-util": { @@ -3148,30 +3256,42 @@ "ethjs>ethjs-util>strip-hex-prefix": true } }, - "@metamask/eth-ledger-bridge-keyring>hdkey": { - "packages": { - "browserify>assert": true, - "browserify>crypto-browserify": true, - "eth-trezor-keyring>hdkey>coinstring": true, - "eth-trezor-keyring>hdkey>secp256k1": true, - "ethereumjs-wallet>safe-buffer": true - } - }, "@metamask/eth-token-tracker": { "globals": { "console.warn": true }, "packages": { "@babel/runtime": true, + "@metamask/eth-token-tracker>deep-equal": true, "@metamask/eth-token-tracker>eth-block-tracker": true, "@metamask/eth-token-tracker>ethjs": true, "@metamask/eth-token-tracker>human-standard-token-abi": true, "ethjs-contract": true, "ethjs-query": true, - "nock>deep-equal": true, "safe-event-emitter": true } }, + "@metamask/eth-token-tracker>deep-equal": { + "packages": { + "@metamask/eth-token-tracker>deep-equal>is-arguments": true, + "@metamask/eth-token-tracker>deep-equal>is-date-object": true, + "enzyme>is-regex": true, + "enzyme>object-is": true, + "mocha>object.assign>object-keys": true, + "string.prototype.matchall>regexp.prototype.flags": true + } + }, + "@metamask/eth-token-tracker>deep-equal>is-arguments": { + "packages": { + "koa>is-generator-function>has-tostringtag": true, + "string.prototype.matchall>call-bind": true + } + }, + "@metamask/eth-token-tracker>deep-equal>is-date-object": { + "packages": { + "koa>is-generator-function>has-tostringtag": true + } + }, "@metamask/eth-token-tracker>eth-block-tracker": { "globals": { "clearTimeout": true, @@ -3194,38 +3314,38 @@ "@metamask/eth-token-tracker>ethjs>ethjs-abi": true, "@metamask/eth-token-tracker>ethjs>ethjs-contract": true, "@metamask/eth-token-tracker>ethjs>ethjs-query": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, "browserify>buffer": true, "ethjs>ethjs-filter": true, "ethjs>ethjs-provider-http": true, "ethjs>ethjs-unit": true, "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, "@metamask/eth-token-tracker>ethjs>ethjs-abi": { "packages": { "@metamask/eth-token-tracker>ethjs>bn.js": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, "browserify>buffer": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, "@metamask/eth-token-tracker>ethjs>ethjs-contract": { "packages": { "@metamask/eth-token-tracker>ethjs>ethjs-contract>ethjs-abi": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, "ethjs-query>babel-runtime": true, "ethjs>ethjs-filter": true, "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, "promise-to-callback": true } }, "@metamask/eth-token-tracker>ethjs>ethjs-contract>ethjs-abi": { "packages": { "@metamask/eth-token-tracker>ethjs>bn.js": true, - "@metamask/eth-token-tracker>ethjs>js-sha3": true, "browserify>buffer": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, @@ -3240,11 +3360,6 @@ "promise-to-callback": true } }, - "@metamask/eth-token-tracker>ethjs>js-sha3": { - "packages": { - "browserify>process": true - } - }, "@metamask/etherscan-link": { "globals": { "URL": true @@ -3314,6 +3429,11 @@ "watchify>xtend": true } }, + "@metamask/rpc-methods>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, "@metamask/smart-transactions-controller": { "globals": { "URLSearchParams": true, @@ -3324,36 +3444,169 @@ "setInterval": true }, "packages": { - "@metamask/controllers": true, + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@metamask/controllers>@ethersproject/providers": true, "@metamask/controllers>isomorphic-fetch": true, + "@metamask/smart-transactions-controller>@metamask/controllers": true, "@metamask/smart-transactions-controller>bignumber.js": true, "@metamask/smart-transactions-controller>fast-json-patch": true, - "ethers": true, "lodash": true } }, - "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { - "globals": { - "crypto.getRandomValues": true - } - }, - "@metamask/smart-transactions-controller>bignumber.js": { - "globals": { - "crypto": true, - "define": true - } - }, - "@metamask/smart-transactions-controller>fast-json-patch": { + "@metamask/smart-transactions-controller>@metamask/controllers": { "globals": { - "addEventListener": true, + "Headers": true, + "URL": true, + "clearInterval": true, "clearTimeout": true, - "removeEventListener": true, + "console.error": true, + "console.log": true, + "fetch": true, + "setInterval": true, "setTimeout": true + }, + "packages": { + "@ethereumjs/common": true, + "@ethereumjs/tx": true, + "@metamask/contract-metadata": true, + "@metamask/controllers>@ethersproject/abi": true, + "@metamask/controllers>@ethersproject/contracts": true, + "@metamask/controllers>@ethersproject/providers": true, + "@metamask/controllers>abort-controller": true, + "@metamask/controllers>async-mutex": true, + "@metamask/controllers>eth-json-rpc-infura": true, + "@metamask/controllers>eth-phishing-detect": true, + "@metamask/controllers>isomorphic-fetch": true, + "@metamask/controllers>multiformats": true, + "@metamask/controllers>web3": true, + "@metamask/controllers>web3-provider-engine": true, + "@metamask/metamask-eth-abis": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": true, + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": true, + "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": true, + "browserify>buffer": true, + "browserify>events": true, + "deep-freeze-strict": true, + "eslint>fast-deep-equal": true, + "eth-ens-namehash": true, + "eth-keyring-controller": true, + "eth-query": true, + "eth-rpc-errors": true, + "eth-sig-util": true, + "ethereumjs-util": true, + "ethjs>ethjs-unit": true, + "immer": true, + "json-rpc-engine": true, + "jsonschema": true, + "punycode": true, + "single-call-balance-checker-abi": true, + "uuid": true } }, - "@metamask/snap-controllers>nanoid": { - "globals": { - "crypto.getRandomValues": true + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs": { + "globals": { + "clearInterval": true, + "setInterval": true + }, + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": true, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": true, + "browserify>buffer": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-provider-http": true, + "ethjs>ethjs-unit": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-abi": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": true, + "ethjs-query>babel-runtime": true, + "ethjs>ethjs-filter": true, + "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, + "promise-to-callback": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-contract>ethjs-abi": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>bn.js": true, + "browserify>buffer": true, + "ethjs>js-sha3": true, + "ethjs>number-to-bn": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>eth-method-registry>ethjs>ethjs-query": { + "globals": { + "console": true + }, + "packages": { + "ethjs-query>babel-runtime": true, + "ethjs-query>ethjs-format": true, + "ethjs-query>ethjs-rpc": true, + "promise-to-callback": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet": { + "packages": { + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": true, + "@truffle/codec>utf8": true, + "browserify>buffer": true, + "browserify>crypto-browserify": true, + "ethereumjs-util": true, + "ethereumjs-util>ethereum-cryptography": true, + "ethereumjs-wallet>aes-js": true, + "ethereumjs-wallet>bs58check": true, + "ethereumjs-wallet>randombytes": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>ethereumjs-wallet>uuid": { + "globals": { + "crypto": true, + "msCrypto": true + } + }, + "@metamask/smart-transactions-controller>@metamask/controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, + "@metamask/smart-transactions-controller>bignumber.js": { + "globals": { + "crypto": true, + "define": true + } + }, + "@metamask/smart-transactions-controller>fast-json-patch": { + "globals": { + "addEventListener": true, + "clearTimeout": true, + "removeEventListener": true, + "setTimeout": true + } + }, + "@metamask/snap-controllers>nanoid": { + "globals": { + "crypto.getRandomValues": true } }, "@ngraveio/bc-ur": { @@ -3411,6 +3664,14 @@ "redux-thunk": true } }, + "@segment/loosely-validate-event": { + "packages": { + "@segment/loosely-validate-event>component-type": true, + "@segment/loosely-validate-event>join-component": true, + "browserify>assert": true, + "browserify>buffer": true + } + }, "@sentry/browser": { "globals": { "XMLHttpRequest": true, @@ -3524,11 +3785,6 @@ "localStorage": true } }, - "@storybook/react>@storybook/store>stable": { - "globals": { - "define": true - } - }, "@truffle/codec": { "packages": { "@truffle/codec>@truffle/abi-utils": true, @@ -3544,7 +3800,7 @@ "browserify>buffer": true, "browserify>util": true, "gulp-dart-sass>lodash.clonedeep": true, - "madge>debug": true, + "nock>debug": true, "semver": true } }, @@ -3756,7 +4012,15 @@ }, "@truffle/codec>web3-utils>ethereum-bloom-filters": { "packages": { - "ethers>@ethersproject/keccak256>js-sha3": true + "@truffle/codec>web3-utils>ethereum-bloom-filters>js-sha3": true + } + }, + "@truffle/codec>web3-utils>ethereum-bloom-filters>js-sha3": { + "globals": { + "define": true + }, + "packages": { + "browserify>process": true } }, "@truffle/decoder": { @@ -3767,7 +4031,7 @@ "@truffle/codec>web3-utils": true, "@truffle/decoder>@truffle/source-map-utils": true, "@truffle/decoder>bn.js": true, - "madge>debug": true + "nock>debug": true } }, "@truffle/decoder>@truffle/source-map-utils": { @@ -3777,7 +4041,7 @@ "@truffle/decoder>@truffle/source-map-utils>@truffle/code-utils": true, "@truffle/decoder>@truffle/source-map-utils>json-pointer": true, "@truffle/decoder>@truffle/source-map-utils>node-interval-tree": true, - "madge>debug": true + "nock>debug": true } }, "@truffle/decoder>@truffle/source-map-utils>@truffle/code-utils": { @@ -3804,6 +4068,82 @@ "browserify>browser-resolve": true } }, + "@unstoppabledomains/resolution": { + "globals": { + "__values": true + }, + "packages": { + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "@unstoppabledomains/resolution>cross-fetch": true, + "@unstoppabledomains/resolution>crypto-js": true, + "@unstoppabledomains/resolution>elliptic": true, + "bn.js": true, + "browserify>buffer": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "@unstoppabledomains/resolution>@ethersproject/abi": { + "globals": { + "console.log": true + }, + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true + } + }, + "@unstoppabledomains/resolution>cross-fetch": { + "globals": { + "Blob": true, + "FileReader": true, + "FormData": true, + "URLSearchParams.prototype.isPrototypeOf": true, + "XMLHttpRequest": true + } + }, + "@unstoppabledomains/resolution>crypto-js": { + "globals": { + "crypto": true, + "define": true, + "msCrypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "@unstoppabledomains/resolution>elliptic": { + "packages": { + "@unstoppabledomains/resolution>elliptic>brorand": true, + "@unstoppabledomains/resolution>elliptic>hmac-drbg": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-crypto-utils": true, + "bn.js": true, + "ethers>@ethersproject/sha2>hash.js": true, + "pumpify>inherits": true + } + }, + "@unstoppabledomains/resolution>elliptic>brorand": { + "globals": { + "crypto": true, + "msCrypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "@unstoppabledomains/resolution>elliptic>hmac-drbg": { + "packages": { + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-crypto-utils": true, + "ethers>@ethersproject/sha2>hash.js": true + } + }, "@zxing/browser": { "globals": { "HTMLElement": true, @@ -3842,71 +4182,6 @@ "pumpify>inherits": true } }, - "analytics-node": { - "globals": { - "clearTimeout": true, - "console.log": true, - "setImmediate": true, - "setTimeout": true - }, - "packages": { - "analytics-node>@segment/loosely-validate-event": true, - "analytics-node>axios": true, - "analytics-node>axios-retry": true, - "analytics-node>lodash.isstring": true, - "analytics-node>md5": true, - "analytics-node>ms": true, - "analytics-node>remove-trailing-slash": true, - "analytics-node>uuid": true, - "browserify>assert": true, - "browserify>process": true - } - }, - "analytics-node>@segment/loosely-validate-event": { - "packages": { - "analytics-node>@segment/loosely-validate-event>component-type": true, - "analytics-node>@segment/loosely-validate-event>join-component": true, - "browserify>assert": true, - "browserify>buffer": true - } - }, - "analytics-node>axios": { - "globals": { - "FormData": true, - "URLSearchParams": true, - "XMLHttpRequest": true, - "btoa": true, - "console.warn": true, - "document": true, - "location.href": true, - "navigator": true, - "setTimeout": true - }, - "packages": { - "browserify>process": true - } - }, - "analytics-node>axios-retry": { - "globals": { - "setTimeout": true - }, - "packages": { - "geckodriver>got>is-retry-allowed": true - } - }, - "analytics-node>md5": { - "packages": { - "analytics-node>md5>charenc": true, - "analytics-node>md5>crypt": true, - "browserify>insert-module-globals>is-buffer": true - } - }, - "analytics-node>uuid": { - "globals": { - "crypto": true, - "msCrypto": true - } - }, "await-semaphore": { "packages": { "browserify>process": true, @@ -3998,7 +4273,7 @@ }, "browserify>crypto-browserify>browserify-cipher>browserify-des>des.js": { "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, "pumpify>inherits": true } }, @@ -4010,7 +4285,7 @@ }, "browserify>crypto-browserify>browserify-sign": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>buffer": true, "browserify>crypto-browserify>create-hmac": true, @@ -4018,14 +4293,16 @@ "browserify>crypto-browserify>public-encrypt>parse-asn1": true, "browserify>stream-browserify": true, "ethereumjs-util>create-hash": true, + "ethers>@ethersproject/signing-key>elliptic": true, "pumpify>inherits": true } }, "browserify>crypto-browserify>create-ecdh": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, - "browserify>buffer": true + "browserify>buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "browserify>crypto-browserify>create-hmac": { @@ -4048,7 +4325,7 @@ }, "browserify>crypto-browserify>diffie-hellman>miller-rabin": { "packages": { - "3box>ethers>elliptic>brorand": true, + "@unstoppabledomains/resolution>elliptic>brorand": true, "bn.js": true } }, @@ -4096,10 +4373,11 @@ }, "browserify>crypto-browserify>public-encrypt>parse-asn1>asn1.js": { "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, "bn.js": true, "browserify>buffer": true, "browserify>vm-browserify": true, + "ethers>@ethersproject/sha2>hash.js>minimalistic-assert": true, "pumpify>inherits": true } }, @@ -4324,22 +4602,14 @@ }, "enzyme>is-regex": { "packages": { - "enzyme>is-regex>has-tostringtag": true, + "koa>is-generator-function>has-tostringtag": true, "string.prototype.matchall>call-bind": true } }, - "enzyme>is-regex>has-tostringtag": { - "packages": { - "string.prototype.matchall>has-symbols": true - } - }, - "enzyme>object-inspect": { - "globals": { - "HTMLElement": true, - "WeakRef": true - }, + "enzyme>object-is": { "packages": { - "browserify>browser-resolve": true + "globalthis>define-properties": true, + "string.prototype.matchall>call-bind": true } }, "eslint>optionator>fast-levenshtein": { @@ -4366,10 +4636,14 @@ } }, "eth-block-tracker>@metamask/utils": { + "globals": { + "TextDecoder": true, + "TextEncoder": true + }, "packages": { - "eslint>fast-deep-equal": true, - "eth-block-tracker>@metamask/utils>superstruct": true, - "madge>debug": true + "@metamask/snap-utils>superstruct": true, + "browserify>buffer": true, + "nock>debug": true } }, "eth-ens-namehash": { @@ -4425,8 +4699,8 @@ }, "packages": { "browserify>browser-resolve": true, - "eth-json-rpc-middleware>@metamask/utils": true, - "eth-json-rpc-middleware>eth-sig-util": true, + "eth-block-tracker>@metamask/utils": true, + "eth-json-rpc-middleware>@metamask/eth-sig-util": true, "eth-json-rpc-middleware>pify": true, "eth-rpc-errors": true, "json-rpc-engine": true, @@ -4435,29 +4709,29 @@ "vinyl>clone": true } }, - "eth-json-rpc-middleware>@metamask/utils": { + "eth-json-rpc-middleware>@metamask/eth-sig-util": { "packages": { - "eslint>fast-deep-equal": true, - "eth-json-rpc-middleware>@metamask/utils>superstruct": true, - "madge>debug": true - } - }, - "eth-json-rpc-middleware>eth-sig-util": { - "packages": { - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": true, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": true + "browserify>buffer": true, + "eth-json-rpc-middleware>@metamask/eth-sig-util>bn.js": true, + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethereum-cryptography": true, + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethjs-util": true, + "eth-lattice-keyring>@ethereumjs/util": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true } }, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi": { + "eth-json-rpc-middleware>@metamask/eth-sig-util>bn.js": { "packages": { - "bn.js": true, - "browserify>buffer": true, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": true + "browserify>browser-resolve": true } }, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-abi>ethereumjs-util": { + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true + }, "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, @@ -4469,7 +4743,7 @@ }, "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, @@ -4480,7 +4754,7 @@ "ethereumjs-wallet>safe-buffer": true } }, - "eth-json-rpc-middleware>eth-sig-util>ethereumjs-util>ethjs-util": { + "eth-json-rpc-middleware>@metamask/eth-sig-util>ethjs-util": { "packages": { "browserify>buffer": true, "ethjs>ethjs-util>is-hex-prefixed": true, @@ -4593,61 +4867,138 @@ "clearInterval": true, "fetch": true, "open": true, - "setInterval": true, - "txData.type": true + "setInterval": true }, "packages": { - "@ethereumjs/common": true, - "@ethereumjs/tx": true, "browserify>buffer": true, "browserify>crypto-browserify": true, "browserify>events": true, + "eth-lattice-keyring>@ethereumjs/tx": true, + "eth-lattice-keyring>@ethereumjs/util": true, "eth-lattice-keyring>bn.js": true, "eth-lattice-keyring>gridplus-sdk": true, - "eth-lattice-keyring>rlp": true, - "eth-lattice-keyring>secp256k1": true, + "eth-lattice-keyring>rlp": true + } + }, + "eth-lattice-keyring>@ethereumjs/tx": { + "packages": { + "@ethereumjs/common": true, + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, "ethereumjs-util": true } }, - "eth-lattice-keyring>bn.js": { - "globals": { - "Buffer": true - }, + "eth-lattice-keyring>@ethereumjs/util": { "packages": { - "browserify>browser-resolve": true + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "eth-lattice-keyring>@ethereumjs/util>@ethereumjs/rlp": true, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography": true } }, - "eth-lattice-keyring>gridplus-sdk": { + "eth-lattice-keyring>@ethereumjs/util>@ethereumjs/rlp": { "globals": { - "__values": true, + "TextEncoder": true + } + }, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography": { + "globals": { + "TextDecoder": true, + "crypto": true + }, + "packages": { + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/hashes": true, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/secp256k1": true + } + }, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/hashes": { + "globals": { + "TextEncoder": true, + "crypto": true + } + }, + "eth-lattice-keyring>@ethereumjs/util>ethereum-cryptography>@noble/secp256k1": { + "globals": { + "crypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "eth-lattice-keyring>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "eth-lattice-keyring>gridplus-sdk": { + "globals": { + "ActiveXObject": true, + "AbortController": true, + "Request": true, + "__values": true, + "caches": true, + "clearTimeout": true, + "console.error": true, + "document": true, "console.log": true, "console.warn": true, + "fetch": true, "setTimeout": true }, "packages": { - "3box>ethers>elliptic": true, "@ethereumjs/common": true, "@ethereumjs/common>crc-32": true, - "@ethereumjs/tx": true, + "@metamask/controllers>@ethersproject/abi": true, + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>buffer": true, "browserify>process": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": true, "eth-lattice-keyring>gridplus-sdk>bech32": true, "eth-lattice-keyring>gridplus-sdk>bignumber.js": true, "eth-lattice-keyring>gridplus-sdk>bitwise": true, "eth-lattice-keyring>gridplus-sdk>borc": true, "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": true, + "eth-lattice-keyring>gridplus-sdk>js-sha3": true, "eth-lattice-keyring>gridplus-sdk>rlp": true, - "eth-lattice-keyring>gridplus-sdk>secp256k1": true, - "eth-lattice-keyring>gridplus-sdk>superagent": true, "ethereumjs-wallet>aes-js": true, "ethereumjs-wallet>bs58check": true, - "ethers>@ethersproject/abi": true, "ethers>@ethersproject/keccak256>js-sha3": true, "ethers>@ethersproject/sha2>hash.js": true, + "ethers>@ethersproject/signing-key>elliptic": true, + "ganache>secp256k1": true, "lodash": true } }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/common": { + "packages": { + "@ethereumjs/common>crc-32": true, + "browserify>buffer": true, + "browserify>events": true, + "ethereumjs-util": true + } + }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx": { + "packages": { + "browserify>buffer": true, + "browserify>insert-module-globals>is-buffer": true, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": true, + "ethereumjs-util": true + } + }, + "eth-lattice-keyring>gridplus-sdk>@ethereumjs/tx>@ethereumjs/common": { + "packages": { + "@ethereumjs/common>crc-32": true, + "browserify>buffer": true, + "browserify>events": true, + "ethereumjs-util": true + } + }, "eth-lattice-keyring>gridplus-sdk>bignumber.js": { "globals": { "crypto": true, @@ -4664,10 +5015,10 @@ "console": true }, "packages": { - "3box>ipfs>iso-url": true, "browserify>buffer": true, "browserify>buffer>ieee754": true, - "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true + "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": true, + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": true } }, "eth-lattice-keyring>gridplus-sdk>borc>bignumber.js": { @@ -4676,14 +5027,19 @@ "define": true } }, + "eth-lattice-keyring>gridplus-sdk>borc>iso-url": { + "globals": { + "URL": true, + "URLSearchParams": true, + "location": true + } + }, "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser": { "globals": { "intToBuffer": true }, "packages": { - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>bn.js": true, - "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>buffer": true, - "ethers>@ethersproject/keccak256>js-sha3": true + "@unstoppabledomains/resolution>elliptic": true } }, "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>bn.js": { @@ -4703,41 +5059,30 @@ "browserify>buffer>ieee754": true } }, - "eth-lattice-keyring>gridplus-sdk>rlp": { + "eth-lattice-keyring>gridplus-sdk>eth-eip712-util-browser>js-sha3": { "globals": { - "TextEncoder": true - } - }, - "eth-lattice-keyring>gridplus-sdk>secp256k1": { + "define": true + }, "packages": { - "3box>ethers>elliptic": true + "@unstoppabledomains/resolution>elliptic": true } }, - "eth-lattice-keyring>gridplus-sdk>superagent": { + "eth-lattice-keyring>gridplus-sdk>js-sha3": { "globals": { - "XMLHttpRequest": true, - "btoa": true, - "clearTimeout": true, - "console.error": true, - "console.warn": true, - "setTimeout": true + "define": true }, "packages": { - "browserify>browser-resolve": true, - "browserify>process": true, - "eth-rpc-errors>fast-safe-stringify": true, - "nock>qs": true, - "pubnub>superagent>component-emitter": true + "browserify>process": true } }, - "eth-lattice-keyring>rlp": { + "eth-lattice-keyring>gridplus-sdk>rlp": { "globals": { "TextEncoder": true } }, - "eth-lattice-keyring>secp256k1": { - "packages": { - "3box>ethers>elliptic": true + "eth-lattice-keyring>rlp": { + "globals": { + "TextEncoder": true } }, "eth-method-registry": { @@ -4748,7 +5093,7 @@ "eth-query": { "packages": { "eth-query>json-rpc-random-id": true, - "madge>debug": true, + "nock>debug": true, "watchify>xtend": true } }, @@ -4759,16 +5104,16 @@ }, "eth-sig-util": { "packages": { - "3box>tweetnacl": true, - "3box>tweetnacl-util": true, "browserify>buffer": true, "eth-sig-util>ethereumjs-util": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true, "ethereumjs-abi": true } }, "eth-sig-util>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, @@ -4776,7 +5121,8 @@ "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, "ethereumjs-util>rlp": true, - "ethereumjs-wallet>safe-buffer": true + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "eth-sig-util>ethereumjs-util>ethjs-util": { @@ -4786,6 +5132,25 @@ "ethjs>ethjs-util>strip-hex-prefix": true } }, + "eth-sig-util>tweetnacl": { + "globals": { + "crypto": true, + "msCrypto": true, + "nacl": "write" + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "eth-sig-util>tweetnacl-util": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, "eth-trezor-keyring": { "globals": { "setTimeout": true @@ -4801,9 +5166,9 @@ }, "eth-trezor-keyring>@metamask/eth-sig-util": { "packages": { - "3box>tweetnacl": true, - "3box>tweetnacl-util": true, "browserify>buffer": true, + "eth-sig-util>tweetnacl": true, + "eth-sig-util>tweetnacl-util": true, "eth-trezor-keyring>@metamask/eth-sig-util>ethereumjs-util": true, "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": true, "ethereumjs-abi": true @@ -4811,14 +5176,15 @@ }, "eth-trezor-keyring>@metamask/eth-sig-util>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "ethereumjs-util>rlp": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "eth-trezor-keyring>@metamask/eth-sig-util>ethjs-util": { @@ -4846,13 +5212,13 @@ }, "eth-trezor-keyring>hdkey>secp256k1": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>insert-module-globals>is-buffer": true, "eth-trezor-keyring>hdkey>secp256k1>bip66": true, - "eth-trezor-keyring>hdkey>secp256k1>drbg.js": true, "ethereumjs-util>create-hash": true, - "ethereumjs-wallet>safe-buffer": true + "ethereumjs-wallet>safe-buffer": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "eth-trezor-keyring>hdkey>secp256k1>bip66": { @@ -4860,12 +5226,6 @@ "ethereumjs-wallet>safe-buffer": true } }, - "eth-trezor-keyring>hdkey>secp256k1>drbg.js": { - "packages": { - "browserify>buffer": true, - "browserify>crypto-browserify>create-hmac": true - } - }, "eth-trezor-keyring>trezor-connect": { "globals": { "__TREZOR_CONNECT_SRC": true, @@ -4888,10 +5248,20 @@ "setTimeout": true }, "packages": { - "3box>graphql-request>cross-fetch": true, "@babel/runtime": true, + "@unstoppabledomains/resolution>cross-fetch": true, "browserify>events": true, - "eth-trezor-keyring>@metamask/eth-sig-util": true + "eth-trezor-keyring>@metamask/eth-sig-util": true, + "eth-trezor-keyring>trezor-connect>cross-fetch": true + } + }, + "eth-trezor-keyring>trezor-connect>cross-fetch": { + "globals": { + "Blob": true, + "FileReader": true, + "FormData": true, + "URLSearchParams.prototype.isPrototypeOf": true, + "XMLHttpRequest": true } }, "ethereumjs-abi": { @@ -4903,14 +5273,15 @@ }, "ethereumjs-abi>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "ethereumjs-abi>ethereumjs-util>ethjs-util": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>rlp": true + "ethereumjs-util>rlp": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "ethereumjs-abi>ethereumjs-util>ethjs-util": { @@ -4928,7 +5299,6 @@ "ethereumjs-util>bn.js": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, - "ethereumjs-util>ethjs-util": true, "ethereumjs-util>rlp": true } }, @@ -5002,12 +5372,6 @@ "ethers>@ethersproject/sha2>hash.js": true } }, - "ethereumjs-util>ethereum-cryptography>blakejs": { - "globals": { - "TextEncoder": true, - "console.log": true - } - }, "ethereumjs-util>ethereum-cryptography>browserify-aes": { "packages": { "browserify>buffer": true, @@ -5042,14 +5406,7 @@ }, "ethereumjs-util>ethereum-cryptography>secp256k1": { "packages": { - "3box>ethers>elliptic": true - } - }, - "ethereumjs-util>ethjs-util": { - "packages": { - "browserify>buffer": true, - "ethjs>ethjs-util>is-hex-prefixed": true, - "ethjs>ethjs-util>strip-hex-prefix": true + "@unstoppabledomains/resolution>elliptic": true } }, "ethereumjs-util>rlp": { @@ -5086,21 +5443,32 @@ }, "ethereumjs-wallet>bs58check": { "packages": { - "3box>ipfs>bs58": true, "ethereumjs-util>create-hash": true, + "ethereumjs-wallet>bs58check>bs58": true, + "ethereumjs-wallet>safe-buffer": true + } + }, + "ethereumjs-wallet>bs58check>bs58": { + "packages": { + "ethereumjs-wallet>bs58check>bs58>base-x": true + } + }, + "ethereumjs-wallet>bs58check>bs58>base-x": { + "packages": { "ethereumjs-wallet>safe-buffer": true } }, "ethereumjs-wallet>ethereumjs-util": { "packages": { - "3box>ethers>elliptic": true, + "@unstoppabledomains/resolution>elliptic": true, "bn.js": true, "browserify>assert": true, "browserify>buffer": true, "ethereumjs-util>create-hash": true, "ethereumjs-util>ethereum-cryptography": true, "ethereumjs-util>rlp": true, - "ethereumjs-wallet>ethereumjs-util>ethjs-util": true + "ethereumjs-wallet>ethereumjs-util>ethjs-util": true, + "ethers>@ethersproject/signing-key>elliptic": true } }, "ethereumjs-wallet>ethereumjs-util>ethjs-util": { @@ -5173,151 +5541,1387 @@ "console.log": true }, "packages": { - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/address": true, + "ethers>@ethersproject/abi>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/constants": true, + "ethers>@ethersproject/abi>@ethersproject/hash": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/strings": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/hash": true, - "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/properties": true } }, - "ethers>@ethersproject/abstract-provider": { + "ethers>@ethersproject/abi>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/abi>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/abi>@ethersproject/abi>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/address>@ethersproject/rlp": { "packages": { - "ethers>@ethersproject/bignumber": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "ethers>@ethersproject/logger": true } }, - "ethers>@ethersproject/abstract-signer": { + "ethers>@ethersproject/abi>@ethersproject/bignumber": { "packages": { - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "ethers>@ethersproject/abi>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true } }, - "ethers>@ethersproject/address": { + "ethers>@ethersproject/abi>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "ethers>@ethersproject/bignumber": true, + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/hash": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/address": true, + "ethers>@ethersproject/abi>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/strings": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/rlp": true + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/logger": true } }, - "ethers>@ethersproject/base64": { + "ethers>@ethersproject/abi>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/constants": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/address>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/abi>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/abi>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/hash": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/address": true, + "ethers>@ethersproject/abi>@ethersproject/bignumber": true, + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/abi>@ethersproject/hash>@ethersproject/base64": true, + "ethers>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/abi>@ethersproject/logger": true, + "ethers>@ethersproject/abi>@ethersproject/properties": true, + "ethers>@ethersproject/abi>@ethersproject/strings": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/hash>@ethersproject/base64": { "globals": { "atob": true, "btoa": true }, "packages": { - "ethers>@ethersproject/bytes": true + "ethers>@ethersproject/abi>@ethersproject/bytes": true } }, - "ethers>@ethersproject/basex": { + "ethers>@ethersproject/abi>@ethersproject/keccak256": { "packages": { + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/abi>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/abi>@ethersproject/bytes": true, + "ethers>@ethersproject/abi>@ethersproject/constants": true, + "ethers>@ethersproject/abi>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/abstract-signer": { + "packages": { + "ethers>@ethersproject/abstract-signer>@ethersproject/logger": true, + "ethers>@ethersproject/abstract-signer>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/abstract-signer>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/abstract-signer>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/abstract-signer>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/address>@ethersproject/bignumber": true, + "ethers>@ethersproject/address>@ethersproject/keccak256": true, + "ethers>@ethersproject/address>@ethersproject/rlp": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/properties": true + "ethers>@ethersproject/logger": true } }, - "ethers>@ethersproject/bignumber": { + "ethers>@ethersproject/address>@ethersproject/bignumber": { "packages": { - "bn.js": true, + "ethers>@ethersproject/address>@ethersproject/bignumber>bn.js": true, "ethers>@ethersproject/bytes": true, "ethers>@ethersproject/logger": true } }, - "ethers>@ethersproject/bytes": { + "ethers>@ethersproject/address>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/address>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/address>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/address>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/address>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/address>@ethersproject/bytes": true, + "ethers>@ethersproject/address>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/address>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/address>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/address>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/address>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/address>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/address>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/address>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/address>@ethersproject/bytes": true, + "ethers>@ethersproject/address>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "ethers>@ethersproject/base64>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/base64>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/base64>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/base64>@ethersproject/bytes>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/basex": { + "packages": { + "ethers>@ethersproject/basex>@ethersproject/bytes": true, + "ethers>@ethersproject/basex>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/basex>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/basex>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/basex>@ethersproject/bytes>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/basex>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/basex>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/bignumber": { + "packages": { + "bn.js": true, + "ethers>@ethersproject/bignumber>@ethersproject/bytes": true, + "ethers>@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/bignumber>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/bignumber>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/bytes>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/constants>@ethersproject/constants>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/constants>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/constants>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/constants>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/constants>@ethersproject/bignumber>@ethersproject/bytes": true, + "ethers>@ethersproject/constants>@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/constants>@ethersproject/bignumber>bn.js": true + } + }, + "ethers>@ethersproject/constants>@ethersproject/bignumber>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/constants>@ethersproject/bignumber>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/constants>@ethersproject/bignumber>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/contracts": { + "globals": { + "setTimeout": true + }, + "packages": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "@unstoppabledomains/resolution>@ethersproject/abi": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi": { + "globals": { + "console.log": true + }, + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/strings": true, + "ethers>@ethersproject/contracts>@ethersproject/address": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/constants": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash>@ethersproject/base64": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/strings": true, + "ethers>@ethersproject/contracts>@ethersproject/address": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/hash>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/constants": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abstract-provider": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/abstract-signer": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/address>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/transactions": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/abi>@ethersproject/keccak256": true, + "ethers>@ethersproject/contracts>@ethersproject/address": true, + "ethers>@ethersproject/contracts>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/contracts>@ethersproject/bignumber": true, + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/constants": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true, + "ethers>@ethersproject/contracts>@ethersproject/transactions>@ethersproject/signing-key": true + } + }, + "ethers>@ethersproject/contracts>@ethersproject/transactions>@ethersproject/signing-key": { + "packages": { + "ethers>@ethersproject/contracts>@ethersproject/bytes": true, + "ethers>@ethersproject/contracts>@ethersproject/logger": true, + "ethers>@ethersproject/contracts>@ethersproject/properties": true, + "ethers>@ethersproject/signing-key>elliptic": true + } + }, + "ethers>@ethersproject/hash": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/address": true, + "ethers>@ethersproject/hash>@ethersproject/bignumber": true, + "ethers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/hash>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/hash>@ethersproject/bignumber": true, + "ethers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/address>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/strings>@ethersproject/constants": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/strings>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/address>@ethersproject/rlp": true, + "ethers>@ethersproject/hash>@ethersproject/bignumber": true, + "ethers>@ethersproject/hash>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/hash>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/address>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/hash>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/bytes": true, + "ethers>@ethersproject/hash>@ethersproject/logger": true, + "ethers>@ethersproject/hash>@ethersproject/strings>@ethersproject/constants": true + } + }, + "ethers>@ethersproject/hash>@ethersproject/strings>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/hash>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/hdnode": { + "packages": { + "ethers>@ethersproject/basex": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/pbkdf2": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true, + "ethers>@ethersproject/wordlists": true + } + }, + "ethers>@ethersproject/hdnode>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/units>@ethersproject/constants": true + } + }, + "ethers>@ethersproject/hdnode>@ethersproject/basex": { + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/hdnode>@ethersproject/strings": { + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/units>@ethersproject/constants": true + } + }, + "ethers>@ethersproject/json-wallets": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/json-wallets>aes-js": true, + "ethers>@ethersproject/json-wallets>scrypt-js": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/pbkdf2": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true + } + }, + "ethers>@ethersproject/json-wallets>aes-js": { + "globals": { + "define": true + } + }, + "ethers>@ethersproject/json-wallets>scrypt-js": { + "globals": { + "define": true, + "setTimeout": true + }, + "packages": { + "browserify>timers-browserify": true + } + }, + "ethers>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/keccak256>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/keccak256>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/keccak256>@ethersproject/bytes>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/keccak256>@ethersproject/bytes>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/keccak256>js-sha3": { + "globals": { + "define": true + }, + "packages": { + "browserify>process": true + } + }, + "ethers>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/pbkdf2": { + "packages": { + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true + } + }, + "ethers>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/properties>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/properties>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/providers": { + "globals": { + "WebSocket": true, + "clearInterval": true, + "clearTimeout": true, + "console.log": true, + "console.warn": true, + "name": true, + "setInterval": true, + "setTimeout": true + }, + "packages": { + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/basex": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/networks": true, + "ethers>@ethersproject/providers>@ethersproject/web": true, + "ethers>@ethersproject/providers>bech32": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/networks": { + "packages": { + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/web": { + "globals": { + "clearTimeout": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "ethers>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/abstract-provider": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bignumber": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/abstract-signer": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bignumber": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/rlp": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/basex": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/hash": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/address": true, + "ethers>@ethersproject/providers>@ethersproject/bignumber": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/strings": true, + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/hash>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/keccak256>js-sha3": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/networks": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/random": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/sha2": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/constants": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/transactions": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/address": true, + "ethers>@ethersproject/providers>@ethersproject/bignumber": true, + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/constants": true, + "ethers>@ethersproject/providers>@ethersproject/hash>@ethersproject/keccak256": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/providers>@ethersproject/transactions>@ethersproject/signing-key": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/transactions>@ethersproject/signing-key": { + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true, + "ethers>@ethersproject/signing-key>elliptic": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/web": { + "globals": { + "clearTimeout": true, + "fetch": true, + "setTimeout": true + }, + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bytes": true, + "ethers>@ethersproject/providers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/properties": true, + "ethers>@ethersproject/providers>@ethersproject/strings": true, + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": true + } + }, + "ethers>@ethersproject/providers>@ethersproject/web>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, + "packages": { + "ethers>@ethersproject/providers>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/random": { + "globals": { + "crypto.getRandomValues": true + }, + "packages": { + "ethers>@ethersproject/random>@ethersproject/bytes": true, + "ethers>@ethersproject/random>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/random>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/random>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/random>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/rlp>@ethersproject/bytes": true, + "ethers>@ethersproject/rlp>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/rlp>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/rlp>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/rlp>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/sha2": { + "packages": { + "ethers>@ethersproject/sha2>@ethersproject/bytes": true, + "ethers>@ethersproject/sha2>@ethersproject/logger": true, + "ethers>@ethersproject/sha2>hash.js": true + } + }, + "ethers>@ethersproject/sha2>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/sha2>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/sha2>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/sha2>hash.js": { + "packages": { + "@unstoppabledomains/resolution>elliptic>minimalistic-assert": true, + "pumpify>inherits": true + } + }, + "ethers>@ethersproject/signing-key": { + "packages": { + "@unstoppabledomains/resolution>elliptic": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/signing-key>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/signing-key>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/signing-key>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/signing-key>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/signing-key>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/signing-key>elliptic": { + "packages": { + "bn.js": true, + "ethers>@ethersproject/sha2>hash.js": true, + "ethers>@ethersproject/sha2>hash.js>minimalistic-assert": true, + "ethers>@ethersproject/signing-key>elliptic>brorand": true, + "ethers>@ethersproject/signing-key>elliptic>hmac-drbg": true, + "ethers>@ethersproject/signing-key>elliptic>minimalistic-crypto-utils": true, + "pumpify>inherits": true + } + }, + "ethers>@ethersproject/signing-key>elliptic>brorand": { + "globals": { + "crypto": true, + "msCrypto": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/signing-key>elliptic>hmac-drbg": { + "packages": { + "ethers>@ethersproject/sha2>hash.js": true, + "ethers>@ethersproject/sha2>hash.js>minimalistic-assert": true, + "ethers>@ethersproject/signing-key>elliptic>minimalistic-crypto-utils": true + } + }, + "ethers>@ethersproject/solidity": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/sha2": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true + } + }, + "ethers>@ethersproject/strings": { + "packages": { + "ethers>@ethersproject/strings>@ethersproject/bytes": true, + "ethers>@ethersproject/strings>@ethersproject/logger": true, + "ethers>@ethersproject/strings>@ethersproject/strings>@ethersproject/constants": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/strings>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/strings>@ethersproject/bytes": true, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/strings>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/strings>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/transactions": { + "globals": { + "console.log": true + }, + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/transactions>@ethersproject/address": true, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true, + "ethers>@ethersproject/transactions>@ethersproject/constants": true, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": true, + "ethers>@ethersproject/transactions>@ethersproject/rlp": true, + "ethers>@ethersproject/transactions>@ethersproject/signing-key": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/rlp": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bytes": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/keccak256>js-sha3": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/properties": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/signing-key": { + "packages": { + "ethers>@ethersproject/signing-key>elliptic": true, + "ethers>@ethersproject/transactions>@ethersproject/bytes": true, + "ethers>@ethersproject/transactions>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/address": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": true, + "ethers>@ethersproject/transactions>@ethersproject/rlp": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/transactions>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/keccak256": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/keccak256>js-sha3": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/rlp": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true + } + }, + "ethers>@ethersproject/transactions>@ethersproject/signing-key": { + "packages": { + "@unstoppabledomains/resolution>elliptic": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true + } + }, + "ethers>@ethersproject/units": { + "packages": { + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/units>@ethersproject/bignumber": { + "packages": { + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/units>@ethersproject/bignumber>bn.js": true + } + }, + "ethers>@ethersproject/units>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, + "packages": { + "browserify>browser-resolve": true + } + }, + "ethers>@ethersproject/units>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/units>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/units>@ethersproject/constants": { + "packages": { + "@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/wallet": { "packages": { - "ethers>@ethersproject/logger": true + "@eth-optimism/contracts>@ethersproject/abstract-provider": true, + "@eth-optimism/contracts>@ethersproject/abstract-signer": true, + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode": true, + "ethers>@ethersproject/json-wallets": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/properties": true, + "ethers>@ethersproject/random": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/hash": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true, + "ethers>@ethersproject/wallet>@ethersproject/transactions": true } }, - "ethers>@ethersproject/constants": { + "ethers>@ethersproject/wallet>@ethersproject/address": { "packages": { - "ethers>@ethersproject/bignumber": true + "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true } }, - "ethers>@ethersproject/contracts": { - "globals": { - "setTimeout": true - }, + "ethers>@ethersproject/wallet>@ethersproject/hash": { "packages": { - "ethers>@ethersproject/abi": true, - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, "ethers>@ethersproject/bytes": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true } }, - "ethers>@ethersproject/hash": { + "ethers>@ethersproject/wallet>@ethersproject/keccak256": { "packages": { - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/keccak256>js-sha3": true } }, - "ethers>@ethersproject/hdnode": { + "ethers>@ethersproject/wallet>@ethersproject/signing-key": { "packages": { - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/bignumber": true, + "@unstoppabledomains/resolution>elliptic": true, "ethers>@ethersproject/bytes": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/pbkdf2": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/wordlists": true + "ethers>@ethersproject/properties": true } }, - "ethers>@ethersproject/json-wallets": { + "ethers>@ethersproject/wallet>@ethersproject/transactions": { "packages": { - "ethers>@ethersproject/address": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/hdnode": true, - "ethers>@ethersproject/json-wallets>aes-js": true, - "ethers>@ethersproject/json-wallets>scrypt-js": true, - "ethers>@ethersproject/keccak256": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/pbkdf2": true, "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/units>@ethersproject/bignumber": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true } }, - "ethers>@ethersproject/json-wallets>aes-js": { - "globals": { - "define": true + "ethers>@ethersproject/wallet>@ethersproject/address": { + "packages": { + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true } }, - "ethers>@ethersproject/json-wallets>scrypt-js": { - "globals": { - "define": true, - "setTimeout": true - }, + "ethers>@ethersproject/wallet>@ethersproject/hash": { "packages": { - "browserify>timers-browserify": true + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/base64": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true } }, - "ethers>@ethersproject/keccak256": { + "ethers>@ethersproject/wallet>@ethersproject/keccak256": { "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256>js-sha3": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256>js-sha3": true } }, - "ethers>@ethersproject/keccak256>js-sha3": { + "ethers>@ethersproject/wallet>@ethersproject/keccak256>js-sha3": { "globals": { "define": true }, @@ -5325,171 +6929,146 @@ "browserify>process": true } }, - "ethers>@ethersproject/logger": { - "globals": { - "console": true + "ethers>@ethersproject/wallet>@ethersproject/properties": { + "packages": { + "@ethersproject/bignumber>@ethersproject/logger": true } }, - "ethers>@ethersproject/networks": { + "ethers>@ethersproject/wallet>@ethersproject/random": { "packages": { - "ethers>@ethersproject/logger": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true } }, - "ethers>@ethersproject/pbkdf2": { + "ethers>@ethersproject/wallet>@ethersproject/signing-key": { "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/sha2": true + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "ethers>@ethersproject/signing-key>elliptic": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true } }, - "ethers>@ethersproject/properties": { + "ethers>@ethersproject/wallet>@ethersproject/transactions": { "packages": { - "ethers>@ethersproject/logger": true + "@ethersproject/bignumber": true, + "@ethersproject/bignumber>@ethersproject/bytes": true, + "@ethersproject/bignumber>@ethersproject/logger": true, + "@metamask/controllers>@ethersproject/providers>@ethersproject/rlp": true, + "ethers>@ethersproject/units>@ethersproject/constants": true, + "ethers>@ethersproject/wallet>@ethersproject/address": true, + "ethers>@ethersproject/wallet>@ethersproject/keccak256": true, + "ethers>@ethersproject/wallet>@ethersproject/properties": true, + "ethers>@ethersproject/wallet>@ethersproject/signing-key": true } }, - "ethers>@ethersproject/providers": { + "ethers>@ethersproject/web": { "globals": { - "WebSocket": true, - "clearInterval": true, "clearTimeout": true, - "console.log": true, - "console.warn": true, - "name": true, - "setInterval": true, + "fetch": true, "setTimeout": true }, "packages": { - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/basex": true, - "ethers>@ethersproject/bignumber": true, "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/hash": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/networks": true, "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/providers>bech32": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true, - "ethers>@ethersproject/transactions": true, - "ethers>@ethersproject/web": true + "ethers>@ethersproject/web>@ethersproject/base64": true, + "ethers>@ethersproject/web>@ethersproject/strings": true } }, - "ethers>@ethersproject/random": { + "ethers>@ethersproject/web>@ethersproject/base64": { "globals": { - "crypto.getRandomValues": true + "atob": true, + "btoa": true }, "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/bytes": true } }, - "ethers>@ethersproject/rlp": { + "ethers>@ethersproject/web>@ethersproject/strings": { "packages": { "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/logger": true, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": true } }, - "ethers>@ethersproject/sha2": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": { + "packages": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true + } + }, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { "packages": { "ethers>@ethersproject/bytes": true, "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2>hash.js": true + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true } }, - "ethers>@ethersproject/sha2>hash.js": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { + "globals": { + "Buffer": true + }, "packages": { - "3box>ethers>hash.js>minimalistic-assert": true, - "pumpify>inherits": true + "browserify>browser-resolve": true } }, - "ethers>@ethersproject/signing-key": { + "ethers>@ethersproject/web>@ethersproject/base64": { + "globals": { + "atob": true, + "btoa": true + }, "packages": { - "3box>ethers>elliptic": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true + "ethers>@ethersproject/web>@ethersproject/bytes": true } }, - "ethers>@ethersproject/solidity": { + "ethers>@ethersproject/web>@ethersproject/bytes": { "packages": { - "ethers>@ethersproject/bignumber": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/sha2": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/web>@ethersproject/logger": true } }, - "ethers>@ethersproject/strings": { + "ethers>@ethersproject/web>@ethersproject/logger": { + "globals": { + "console": true + } + }, + "ethers>@ethersproject/web>@ethersproject/properties": { "packages": { - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/web>@ethersproject/logger": true } }, - "ethers>@ethersproject/transactions": { - "globals": { - "console.log": true - }, + "ethers>@ethersproject/web>@ethersproject/strings": { "packages": { - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bignumber": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/constants": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/rlp": true, - "ethers>@ethersproject/signing-key": true + "ethers>@ethersproject/web>@ethersproject/bytes": true, + "ethers>@ethersproject/web>@ethersproject/logger": true, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": true } }, - "ethers>@ethersproject/units": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants": { "packages": { - "ethers>@ethersproject/bignumber": true, - "ethers>@ethersproject/logger": true + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": true } }, - "ethers>@ethersproject/wallet": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber": { "packages": { - "ethers>@ethersproject/abstract-provider": true, - "ethers>@ethersproject/abstract-signer": true, - "ethers>@ethersproject/address": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/hash": true, - "ethers>@ethersproject/hdnode": true, - "ethers>@ethersproject/json-wallets": true, - "ethers>@ethersproject/keccak256": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/random": true, - "ethers>@ethersproject/signing-key": true, - "ethers>@ethersproject/transactions": true + "ethers>@ethersproject/web>@ethersproject/bytes": true, + "ethers>@ethersproject/web>@ethersproject/logger": true, + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": true } }, - "ethers>@ethersproject/web": { + "ethers>@ethersproject/web>@ethersproject/strings>@ethersproject/constants>@ethersproject/bignumber>bn.js": { "globals": { - "clearTimeout": true, - "fetch": true, - "setTimeout": true + "Buffer": true }, "packages": { - "ethers>@ethersproject/base64": true, - "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/logger": true, - "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "browserify>browser-resolve": true } }, "ethers>@ethersproject/wordlists": { "packages": { "ethers>@ethersproject/bytes": true, - "ethers>@ethersproject/hash": true, + "ethers>@ethersproject/hdnode>@ethersproject/strings": true, "ethers>@ethersproject/logger": true, "ethers>@ethersproject/properties": true, - "ethers>@ethersproject/strings": true + "ethers>@ethersproject/wallet>@ethersproject/hash": true } }, "ethjs": { @@ -5514,10 +7093,10 @@ "ethjs-contract": { "packages": { "ethjs-contract>ethjs-abi": true, - "ethjs-contract>js-sha3": true, "ethjs-query>babel-runtime": true, "ethjs>ethjs-filter": true, "ethjs>ethjs-util": true, + "ethjs>js-sha3": true, "promise-to-callback": true } }, @@ -5525,20 +7104,10 @@ "packages": { "browserify>buffer": true, "ethjs-contract>ethjs-abi>bn.js": true, - "ethjs-contract>ethjs-abi>js-sha3": true, + "ethjs>js-sha3": true, "ethjs>number-to-bn": true } }, - "ethjs-contract>ethjs-abi>js-sha3": { - "packages": { - "browserify>process": true - } - }, - "ethjs-contract>js-sha3": { - "packages": { - "browserify>process": true - } - }, "ethjs-query": { "globals": { "console": true @@ -5655,9 +7224,13 @@ "define": true } }, + "ganache>secp256k1": { + "packages": { + "ethers>@ethersproject/signing-key>elliptic": true + } + }, "gh-pages>async": { "globals": { - "clearTimeout": true, "setTimeout": true }, "packages": { @@ -5669,7 +7242,7 @@ "globalthis>define-properties": { "packages": { "globalthis>define-properties>has-property-descriptors": true, - "nock>deep-equal>object-keys": true + "mocha>object.assign>object-keys": true } }, "globalthis>define-properties>has-property-descriptors": { @@ -5701,6 +7274,11 @@ "browserify>url": true } }, + "koa>is-generator-function>has-tostringtag": { + "packages": { + "string.prototype.matchall>has-symbols": true + } + }, "lavamoat>json-stable-stringify": { "packages": { "lavamoat>json-stable-stringify>jsonify": true @@ -5755,72 +7333,24 @@ "Intl": true } }, - "madge>debug": { + "nanoid": { "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true - }, - "packages": { - "browserify>process": true, - "madge>debug>ms": true - } - }, - "madge>rc>deep-extend": { - "packages": { - "browserify>buffer": true + "crypto": true, + "msCrypto": true, + "navigator": true } }, - "mockttp>node-forge": { + "nock>debug": { "globals": { - "Blob": true, - "MutationObserver": true, - "QuotaExceededError": true, - "URL.createObjectURL": true, - "URL.revokeObjectURL": true, - "Worker": true, - "addEventListener": true, + "console": true, "document": true, - "jQuery": true, "localStorage": true, "navigator": true, - "postMessage": true, - "removeEventListener": true, - "setTimeout": true + "process": true }, "packages": { - "browserify>browser-resolve": true, "browserify>process": true, - "browserify>timers-browserify": true - } - }, - "nanoid": { - "globals": { - "crypto": true, - "msCrypto": true, - "navigator": true - } - }, - "nock>deep-equal": { - "packages": { - "enzyme>is-regex": true, - "enzyme>object-is": true, - "nock>deep-equal>is-arguments": true, - "nock>deep-equal>is-date-object": true, - "nock>deep-equal>object-keys": true, - "string.prototype.matchall>regexp.prototype.flags": true - } - }, - "nock>deep-equal>is-date-object": { - "packages": { - "enzyme>is-regex>has-tostringtag": true - } - }, - "nock>qs": { - "packages": { - "string.prototype.matchall>side-channel": true + "nock>debug>ms": true } }, "node-fetch": { @@ -5950,12 +7480,6 @@ "react-devtools>react-devtools-core": true } }, - "react-devtools>ip": { - "packages": { - "browserify>buffer": true, - "browserify>os-browserify": true - } - }, "react-devtools>react-devtools-core": { "globals": { "WebSocket": true, @@ -6371,8 +7895,13 @@ "setTimeout": true }, "packages": { - "3box>events": true, - "browserify>util": true + "browserify>util": true, + "safe-event-emitter>events": true + } + }, + "safe-event-emitter>events": { + "globals": { + "console": true } }, "semver": { @@ -6424,19 +7953,6 @@ "string.prototype.matchall>call-bind": true } }, - "string.prototype.matchall>side-channel": { - "packages": { - "enzyme>object-inspect": true, - "string.prototype.matchall>call-bind": true, - "string.prototype.matchall>get-intrinsic": true - } - }, - "stylelint>write-file-atomic>typedarray-to-buffer": { - "packages": { - "browserify>buffer": true, - "jsdom>request>is-typedarray": true - } - }, "textarea-caret": { "globals": { "document.body.appendChild": true, @@ -6488,11 +8004,6 @@ "console.warn": true, "define": true } - }, - "webpack>memory-fs>errno": { - "packages": { - "webpack>memory-fs>errno>prr": true - } } } } \ No newline at end of file diff --git a/lavamoat/browserify/policy-override.json b/lavamoat/browserify/policy-override.json index 4089a7536d6e..9bc3387269c9 100644 --- a/lavamoat/browserify/policy-override.json +++ b/lavamoat/browserify/policy-override.json @@ -20,11 +20,6 @@ "fetch": true } }, - "3box>graphql-request>cross-fetch>node-fetch": { - "globals": { - "fetch": true - } - }, "lodash": { "globals": { "setTimeout": true, @@ -97,6 +92,11 @@ "crypto.getRandomValues": true } }, + "@metamask/rpc-methods>nanoid": { + "globals": { + "crypto.getRandomValues": true + } + }, "@metamask/controllers>nanoid": { "globals": { "crypto.getRandomValues": true diff --git a/lavamoat/build-system/policy-override.json b/lavamoat/build-system/policy-override.json index 499e683e2df1..39640ea8d7aa 100644 --- a/lavamoat/build-system/policy-override.json +++ b/lavamoat/build-system/policy-override.json @@ -158,7 +158,8 @@ "eslint-plugin-jest>@typescript-eslint/utils": true, "eslint>debug": true, "madge>debug": true, - "typescript": true + "typescript": true, + "nock>debug": true } }, "@typescript-eslint/eslint-plugin>@typescript-eslint/type-utils>debug": { diff --git a/lavamoat/build-system/policy.json b/lavamoat/build-system/policy.json index 3b27e82c263d..93371a9b0e15 100644 --- a/lavamoat/build-system/policy.json +++ b/lavamoat/build-system/policy.json @@ -1,11 +1,5 @@ { "resources": { - "3box>ipfs>superstruct>clone-deep>shallow-clone>mixin-object": { - "packages": { - "3box>ipfs>superstruct>clone-deep>shallow-clone>mixin-object>for-in": true, - "webpack>micromatch>extglob>extend-shallow>is-extendable": true - } - }, "@babel/code-frame": { "globals": { "console.warn": true, @@ -52,7 +46,7 @@ "@babel/preset-typescript": true, "depcheck>@babel/traverse": true, "depcheck>json5": true, - "madge>debug": true, + "nock>debug": true, "nyc>convert-source-map": true } }, @@ -1046,6 +1040,11 @@ "pumpify>inherits": true } }, + "@metamask/eth-token-tracker>deep-equal>is-date-object": { + "packages": { + "koa>is-generator-function>has-tostringtag": true + } + }, "@metamask/jazzicon>color>color-convert": { "packages": { "@metamask/jazzicon>color>color-convert>color-name": true @@ -1076,6 +1075,11 @@ "util.deprecate": true } }, + "@storybook/components>qs": { + "packages": { + "string.prototype.matchall>side-channel": true + } + }, "@storybook/react>acorn-walk": { "globals": { "define": true @@ -1109,6 +1113,7 @@ "eslint-plugin-jest>@typescript-eslint/utils": true, "eslint>debug": true, "madge>debug": true, + "nock>debug": true, "typescript": true } }, @@ -1144,7 +1149,7 @@ "packages": { "@typescript-eslint/parser>@typescript-eslint/scope-manager": true, "@typescript-eslint/parser>@typescript-eslint/typescript-estree": true, - "madge>debug": true, + "nock>debug": true, "typescript": true } }, @@ -1177,11 +1182,21 @@ "@typescript-eslint/parser>@typescript-eslint/types": true, "eslint>is-glob": true, "globby": true, - "madge>debug": true, + "nock>debug": true, "semver": true, "typescript": true } }, + "addons-linter>postcss>picocolors": { + "builtin": { + "tty.isatty": true + }, + "globals": { + "process.argv.includes": true, + "process.env": true, + "process.platform": true + } + }, "babelify": { "builtin": { "path.extname": true, @@ -1798,6 +1813,8 @@ }, "packages": { "chokidar>braces": true, + "chokidar>fsevents": true, + "chokidar>fsevents": true, "chokidar>glob-parent": true, "chokidar>is-binary-path": true, "chokidar>normalize-path": true, @@ -1824,6 +1841,18 @@ "chokidar>braces>fill-range>to-regex-range>is-number": true } }, + "chokidar>fsevents": { + "globals": { + "process.platform": true + }, + "native": true + }, + "chokidar>fsevents": { + "globals": { + "process.platform": true + }, + "native": true + }, "chokidar>glob-parent": { "builtin": { "os.platform": true, @@ -1997,7 +2026,7 @@ "depcheck>@babel/traverse>@babel/helper-hoist-variables": true, "depcheck>@babel/traverse>@babel/helper-split-export-declaration": true, "depcheck>@babel/traverse>globals": true, - "madge>debug": true + "nock>debug": true } }, "depcheck>@babel/traverse>@babel/helper-function-name": { @@ -2148,18 +2177,13 @@ }, "enzyme>is-regex": { "packages": { - "enzyme>is-regex>has-tostringtag": true, + "koa>is-generator-function>has-tostringtag": true, "string.prototype.matchall>call-bind": true } }, - "enzyme>is-regex>has-tostringtag": { - "packages": { - "string.prototype.matchall>has-symbols": true - } - }, "enzyme>is-string": { "packages": { - "enzyme>is-regex>has-tostringtag": true + "koa>is-generator-function>has-tostringtag": true } }, "enzyme>object-inspect": { @@ -2174,7 +2198,7 @@ "enzyme>object.assign": { "packages": { "globalthis>define-properties": true, - "nock>deep-equal>object-keys": true, + "mocha>object.assign>object-keys": true, "string.prototype.matchall>call-bind": true, "string.prototype.matchall>has-symbols": true } @@ -2241,7 +2265,7 @@ "eslint>natural-compare": true, "eslint>regexpp": true, "globby>ignore": true, - "madge>debug": true + "nock>debug": true } }, "eslint-config-prettier": { @@ -2273,7 +2297,7 @@ "process": true }, "packages": { - "analytics-node>ms": true, + "gulp-livereload>debug>ms": true, "sinon>supports-color": true } }, @@ -2289,7 +2313,7 @@ "brfs>resolve": true, "eslint-plugin-import>tsconfig-paths": true, "eslint>is-glob": true, - "madge>debug": true, + "nock>debug": true, "nyc>glob": true } }, @@ -2386,7 +2410,7 @@ "process": true }, "packages": { - "analytics-node>ms": true, + "gulp-livereload>debug>ms": true, "sinon>supports-color": true } }, @@ -2535,7 +2559,7 @@ "eslint-plugin-jsdoc>escape-string-regexp": true, "eslint-plugin-jsdoc>spdx-expression-parse": true, "eslint>esquery": true, - "madge>debug": true, + "nock>debug": true, "semver": true } }, @@ -2762,7 +2786,7 @@ "eslint>minimatch": true, "eslint>strip-json-comments": true, "globby>ignore": true, - "madge>debug": true + "nock>debug": true } }, "eslint>@humanwhocodes/config-array": { @@ -2772,7 +2796,7 @@ "packages": { "eslint>@humanwhocodes/config-array>@humanwhocodes/object-schema": true, "eslint>minimatch": true, - "madge>debug": true + "nock>debug": true } }, "eslint>ajv": { @@ -3120,7 +3144,7 @@ "globalthis>define-properties": { "packages": { "globalthis>define-properties>has-property-descriptors": true, - "nock>deep-equal>object-keys": true + "mocha>object.assign>object-keys": true } }, "globalthis>define-properties>has-property-descriptors": { @@ -3206,106 +3230,58 @@ "fancy-log": true, "gulp-autoprefixer>autoprefixer": true, "gulp-autoprefixer>postcss": true, - "gulp-autoprefixer>through2": true, "gulp-zip>plugin-error": true, + "through2": true, "vinyl-sourcemaps-apply": true } }, "gulp-autoprefixer>autoprefixer": { "globals": { - "process.cwd": true + "console": true, + "process.cwd": true, + "process.env.AUTOPREFIXER_GRID": true }, "packages": { - "gulp-autoprefixer>autoprefixer>browserslist": true, - "gulp-autoprefixer>autoprefixer>postcss-value-parser": true, + "addons-linter>postcss>picocolors": true, + "gulp-autoprefixer>autoprefixer>fraction.js": true, "gulp-autoprefixer>postcss": true, + "stylelint>autoprefixer>browserslist": true, "stylelint>autoprefixer>caniuse-lite": true, "stylelint>autoprefixer>normalize-range": true, - "stylelint>autoprefixer>num2fraction": true + "stylelint>postcss-value-parser": true } }, - "gulp-autoprefixer>autoprefixer>browserslist": { - "builtin": { - "fs.existsSync": true, - "fs.readFileSync": true, - "fs.statSync": true, - "path.basename": true, - "path.dirname": true, - "path.join": true, - "path.resolve": true - }, + "gulp-autoprefixer>autoprefixer>fraction.js": { "globals": { - "console.warn": true, - "process.env.BROWSERSLIST": true, - "process.env.BROWSERSLIST_CONFIG": true, - "process.env.BROWSERSLIST_DISABLE_CACHE": true, - "process.env.BROWSERSLIST_ENV": true, - "process.env.BROWSERSLIST_STATS": true, - "process.env.NODE_ENV": true - }, - "packages": { - "stylelint>autoprefixer>browserslist>electron-to-chromium": true, - "stylelint>autoprefixer>caniuse-lite": true + "define": true } }, "gulp-autoprefixer>postcss": { "builtin": { - "fs": true, - "path": true + "fs.existsSync": true, + "fs.readFileSync": true, + "path.dirname": true, + "path.isAbsolute": true, + "path.join": true, + "path.relative": true, + "path.resolve": true, + "path.sep": true, + "url.fileURLToPath": true, + "url.pathToFileURL": true }, "globals": { "Buffer": true, + "URL": true, "atob": true, "btoa": true, - "console": true - }, - "packages": { - "gulp-autoprefixer>postcss>chalk": true, - "gulp-autoprefixer>postcss>source-map": true, - "gulp-autoprefixer>postcss>supports-color": true - } - }, - "gulp-autoprefixer>postcss>chalk": { - "globals": { - "process.env.TERM": true, - "process.platform": true - }, - "packages": { - "gulp-autoprefixer>postcss>chalk>ansi-styles": true, - "gulp-autoprefixer>postcss>supports-color": true, - "mocha>escape-string-regexp": true - } - }, - "gulp-autoprefixer>postcss>chalk>ansi-styles": { - "packages": { - "@metamask/jazzicon>color>color-convert": true - } - }, - "gulp-autoprefixer>postcss>supports-color": { - "builtin": { - "os.release": true - }, - "globals": { - "process.env": true, - "process.platform": true, - "process.stderr": true, - "process.stdout": true, - "process.versions.node.split": true - }, - "packages": { - "mocha>supports-color>has-flag": true - } - }, - "gulp-autoprefixer>through2": { - "builtin": { - "util.inherits": true - }, - "globals": { - "process.nextTick": true + "console": true, + "process.env.LANG": true, + "process.env.NODE_ENV": true }, "packages": { - "readable-stream": true, - "watchify>xtend": true + "addons-linter>postcss>picocolors": true, + "addons-linter>postcss>source-map-js": true, + "gulp-autoprefixer>postcss>nanoid": true } }, "gulp-dart-sass": { @@ -3436,8 +3412,8 @@ "process": true }, "packages": { - "analytics-node>ms": true, - "gulp-livereload>chalk>supports-color": true + "gulp-livereload>chalk>supports-color": true, + "gulp-livereload>debug>ms": true } }, "gulp-livereload>event-stream": { @@ -3508,10 +3484,10 @@ "console.error": true }, "packages": { + "@storybook/components>qs": true, "gulp-livereload>tiny-lr>body": true, "gulp-livereload>tiny-lr>debug": true, "gulp-livereload>tiny-lr>faye-websocket": true, - "nock>qs": true, "react>object-assign": true } }, @@ -3563,7 +3539,7 @@ "process": true }, "packages": { - "analytics-node>ms": true, + "gulp-livereload>debug>ms": true, "sinon>supports-color": true } }, @@ -3888,7 +3864,7 @@ "process": true }, "packages": { - "analytics-node>ms": true, + "gulp-livereload>debug>ms": true, "sinon>supports-color": true } }, @@ -4104,9 +4080,9 @@ }, "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>randomatic": { "packages": { - "3box>ipfs>kind-of": true, "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>randomatic>math-random": true, - "gulp>undertaker>bach>array-last>is-number": true + "gulp>undertaker>bach>array-last>is-number": true, + "webpack>micromatch>kind-of": true } }, "gulp-watch>anymatch>micromatch>braces>expand-range>fill-range>randomatic>math-random": { @@ -4222,6 +4198,8 @@ "gulp-watch>chokidar>anymatch": true, "gulp-watch>chokidar>async-each": true, "gulp-watch>chokidar>braces": true, + "gulp-watch>chokidar>fsevents": true, + "gulp-watch>chokidar>fsevents": true, "gulp-watch>chokidar>is-binary-path": true, "gulp-watch>chokidar>normalize-path": true, "gulp-watch>chokidar>readdirp": true, @@ -4370,552 +4348,2086 @@ "webpack>micromatch>braces>fill-range>repeat-string": true } }, - "gulp-watch>chokidar>is-binary-path": { + "gulp-watch>chokidar>fsevents": { "builtin": { - "path.extname": true + "events.EventEmitter": true, + "fs.stat": true, + "path.join": true, + "util.inherits": true + }, + "globals": { + "__dirname": true, + "process.nextTick": true, + "process.platform": true, + "setImmediate": true }, "packages": { - "gulp-watch>chokidar>is-binary-path>binary-extensions": true + "gulp-watch>chokidar>fsevents>node-pre-gyp": true } }, - "gulp-watch>chokidar>readdirp": { + "gulp-watch>chokidar>fsevents>node-pre-gyp": { "builtin": { + "events.EventEmitter": true, + "fs.existsSync": true, + "fs.readFileSync": true, + "fs.renameSync": true, + "path.dirname": true, + "path.existsSync": true, "path.join": true, - "path.relative": true, + "path.resolve": true, + "url.parse": true, + "url.resolve": true, "util.inherits": true }, "globals": { - "setImmediate": true + "__dirname": true, + "console.log": true, + "process.arch": true, + "process.cwd": true, + "process.env": true, + "process.platform": true, + "process.version.substr": true, + "process.versions": true }, "packages": { - "fs-extra>graceful-fs": true, - "gulp-watch>chokidar>readdirp>micromatch": true, - "readable-stream": true + "gulp-watch>chokidar>fsevents>node-pre-gyp>detect-libc": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>semver": true } }, - "gulp-watch>chokidar>readdirp>micromatch": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>detect-libc": { "builtin": { - "path.basename": true, - "path.sep": true, - "util.inspect": true + "child_process.spawnSync": true, + "fs.readdirSync": true, + "os.platform": true }, "globals": { - "process.platform": true - }, - "packages": { - "gulp-watch>chokidar>braces": true, - "gulp-watch>chokidar>readdirp>micromatch>arr-diff": true, - "gulp-watch>chokidar>readdirp>micromatch>array-unique": true, - "gulp-watch>chokidar>readdirp>micromatch>define-property": true, - "gulp-watch>chokidar>readdirp>micromatch>extend-shallow": true, - "gulp-watch>chokidar>readdirp>micromatch>extglob": true, - "gulp-watch>chokidar>readdirp>micromatch>kind-of": true, - "webpack>micromatch>fragment-cache": true, - "webpack>micromatch>nanomatch": true, - "webpack>micromatch>object.pick": true, - "webpack>micromatch>regex-not": true, - "webpack>micromatch>snapdragon": true, - "webpack>micromatch>to-regex": true + "process.env": true } }, - "gulp-watch>chokidar>readdirp>micromatch>define-property": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt": { + "builtin": { + "path": true, + "stream.Stream": true, + "url": true + }, + "globals": { + "console": true, + "process.argv": true, + "process.env.DEBUG_NOPT": true, + "process.env.NOPT_DEBUG": true, + "process.platform": true + }, "packages": { - "gulp>gulp-cli>isobject": true, - "webpack>micromatch>define-property>is-descriptor": true + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>abbrev": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extend-shallow": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv": { + "builtin": { + "child_process.exec": true, + "path": true + }, + "globals": { + "process.env.COMPUTERNAME": true, + "process.env.ComSpec": true, + "process.env.EDITOR": true, + "process.env.HOSTNAME": true, + "process.env.PATH": true, + "process.env.PROMPT": true, + "process.env.PS1": true, + "process.env.Path": true, + "process.env.SHELL": true, + "process.env.USER": true, + "process.env.USERDOMAIN": true, + "process.env.USERNAME": true, + "process.env.VISUAL": true, + "process.env.path": true, + "process.nextTick": true, + "process.platform": true + }, "packages": { - "gulp-watch>chokidar>readdirp>micromatch>extend-shallow>is-extendable": true, - "webpack>micromatch>extend-shallow>assign-symbols": true + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-homedir": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extend-shallow>is-extendable": { - "packages": { - "@babel/register>clone-deep>is-plain-object": true + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-homedir": { + "builtin": { + "os.homedir": true + }, + "globals": { + "process.env": true, + "process.getuid": true, + "process.platform": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extglob": { - "packages": { - "gulp-watch>chokidar>readdirp>micromatch>array-unique": true, - "gulp-watch>chokidar>readdirp>micromatch>extglob>define-property": true, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets": true, - "gulp-watch>chokidar>readdirp>micromatch>extglob>extend-shallow": true, - "webpack>micromatch>fragment-cache": true, - "webpack>micromatch>regex-not": true, - "webpack>micromatch>snapdragon": true, - "webpack>micromatch>to-regex": true + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": { + "globals": { + "process.env.SystemRoot": true, + "process.env.TEMP": true, + "process.env.TMP": true, + "process.env.TMPDIR": true, + "process.env.windir": true, + "process.platform": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extglob>define-property": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog": { + "builtin": { + "events.EventEmitter": true, + "util": true + }, + "globals": { + "process.nextTick": true, + "process.stderr": true + }, "packages": { - "webpack>micromatch>define-property>is-descriptor": true + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>console-control-strings": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>set-blocking": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets": { - "globals": { - "__filename": true + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet": { + "builtin": { + "events.EventEmitter": true, + "util.inherits": true }, "packages": { - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>debug": true, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property": true, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>extend-shallow": true, - "webpack>micromatch>extglob>expand-brackets>posix-character-classes": true, - "webpack>micromatch>regex-not": true, - "webpack>micromatch>snapdragon": true, - "webpack>micromatch>to-regex": true + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>delegates": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>debug": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream": { "builtin": { - "fs.SyncWriteStream": true, - "net.Socket": true, - "tty.WriteStream": true, - "tty.isatty": true, + "events.EventEmitter": true, + "stream": true, "util": true }, "globals": { - "chrome": true, - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>core-util-is": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>isarray": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>process-nextick-args": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>string_decoder": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>util-deprecate": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>core-util-is": { + "globals": { + "Buffer.isBuffer": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>process-nextick-args": { + "globals": { + "process": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>string_decoder": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>util-deprecate": { + "builtin": { + "util.deprecate": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge": { + "builtin": { + "util.format": true + }, + "globals": { + "clearInterval": true, + "process": true, + "setImmediate": true, + "setInterval": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>console-control-strings": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>aproba": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>has-unicode": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>object-assign": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>signal-exit": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>wide-align": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>has-unicode": { + "builtin": { + "os.type": true + }, + "globals": { + "process.env.LANG": true, + "process.env.LC_ALL": true, + "process.env.LC_CTYPE": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>signal-exit": { + "builtin": { + "assert.equal": true, + "events": true + }, + "globals": { + "process": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>code-point-at": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point>number-is-nan": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi>ansi-regex": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>wide-align": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>set-blocking": { + "globals": { + "process.stderr": true, + "process.stdout": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf": { + "builtin": { + "assert": true, + "fs": true, + "path.join": true + }, + "globals": { + "process.platform": true, + "setTimeout": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob": { + "builtin": { + "assert": true, + "events.EventEmitter": true, + "fs.lstat": true, + "fs.lstatSync": true, + "fs.readdir": true, + "fs.readdirSync": true, + "fs.stat": true, + "fs.statSync": true, + "path.join": true, + "path.resolve": true, + "util": true + }, + "globals": { + "console.error": true, + "process.cwd": true, + "process.nextTick": true, + "process.platform": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>fs.realpath": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>inflight": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>path-is-absolute": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>fs.realpath": { + "builtin": { + "fs.lstat": true, + "fs.lstatSync": true, + "fs.readlink": true, + "fs.readlinkSync": true, + "fs.realpath": true, + "fs.realpathSync": true, + "fs.stat": true, + "fs.statSync": true, + "path.normalize": true, + "path.resolve": true + }, + "globals": { + "console.error": true, + "console.trace": true, + "process.env.NODE_DEBUG": true, + "process.nextTick": true, + "process.noDeprecation": true, + "process.platform": true, + "process.throwDeprecation": true, + "process.traceDeprecation": true, + "process.version": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>inflight": { + "globals": { + "process.nextTick": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>once>wrappy": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": { + "builtin": { + "util.inherits": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch": { + "builtin": { + "path": true + }, + "globals": { + "console.error": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion>balanced-match": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion>concat-map": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>once>wrappy": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>path-is-absolute": { + "globals": { + "process.platform": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>semver": { + "globals": { + "console": true, + "process": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "gulp-watch>chokidar>fsevents": { + "builtin": { + "events.EventEmitter": true, + "fs.stat": true, + "path.join": true, + "util.inherits": true + }, + "globals": { + "__dirname": true, + "process.nextTick": true, + "process.platform": true, + "setImmediate": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp": { + "builtin": { + "events.EventEmitter": true, + "fs.existsSync": true, + "fs.readFileSync": true, + "fs.renameSync": true, + "path.dirname": true, + "path.existsSync": true, + "path.join": true, + "path.resolve": true, + "url.parse": true, + "url.resolve": true, + "util.inherits": true + }, + "globals": { + "__dirname": true, + "console.log": true, + "process.arch": true, + "process.cwd": true, + "process.env": true, + "process.platform": true, + "process.version.substr": true, + "process.versions": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>detect-libc": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>semver": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>detect-libc": { + "builtin": { + "child_process.spawnSync": true, + "fs.readdirSync": true, + "os.platform": true + }, + "globals": { + "process.env": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt": { + "builtin": { + "path": true, + "stream.Stream": true, + "url": true + }, + "globals": { + "console": true, + "process.argv": true, + "process.env.DEBUG_NOPT": true, + "process.env.NOPT_DEBUG": true, + "process.platform": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>abbrev": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv": { + "builtin": { + "child_process.exec": true, + "path": true + }, + "globals": { + "process.env.COMPUTERNAME": true, + "process.env.ComSpec": true, + "process.env.EDITOR": true, + "process.env.HOSTNAME": true, + "process.env.PATH": true, + "process.env.PROMPT": true, + "process.env.PS1": true, + "process.env.Path": true, + "process.env.SHELL": true, + "process.env.USER": true, + "process.env.USERDOMAIN": true, + "process.env.USERNAME": true, + "process.env.VISUAL": true, + "process.env.path": true, + "process.nextTick": true, + "process.platform": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-homedir": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-homedir": { + "builtin": { + "os.homedir": true + }, + "globals": { + "process.env": true, + "process.getuid": true, + "process.platform": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": { + "globals": { + "process.env.SystemRoot": true, + "process.env.TEMP": true, + "process.env.TMP": true, + "process.env.TMPDIR": true, + "process.env.windir": true, + "process.platform": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog": { + "builtin": { + "events.EventEmitter": true, + "util": true + }, + "globals": { + "process.nextTick": true, + "process.stderr": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>console-control-strings": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>set-blocking": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet": { + "builtin": { + "events.EventEmitter": true, + "util.inherits": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>delegates": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>core-util-is": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>isarray": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>process-nextick-args": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>string_decoder": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>util-deprecate": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>core-util-is": { + "globals": { + "Buffer.isBuffer": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>process-nextick-args": { + "globals": { + "process": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>string_decoder": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>util-deprecate": { + "builtin": { + "util.deprecate": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge": { + "builtin": { + "util.format": true + }, + "globals": { + "clearInterval": true, + "process": true, + "setImmediate": true, + "setInterval": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>console-control-strings": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>aproba": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>has-unicode": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>object-assign": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>signal-exit": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>wide-align": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>has-unicode": { + "builtin": { + "os.type": true + }, + "globals": { + "process.env.LANG": true, + "process.env.LC_ALL": true, + "process.env.LC_CTYPE": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>signal-exit": { + "builtin": { + "assert.equal": true, + "events": true + }, + "globals": { + "process": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>code-point-at": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point>number-is-nan": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi>ansi-regex": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>wide-align": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>npmlog>set-blocking": { + "globals": { + "process.stderr": true, + "process.stdout": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf": { + "builtin": { + "assert": true, + "fs": true, + "path.join": true + }, + "globals": { + "process.platform": true, + "setTimeout": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob": { + "builtin": { + "assert": true, + "events.EventEmitter": true, + "fs.lstat": true, + "fs.lstatSync": true, + "fs.readdir": true, + "fs.readdirSync": true, + "fs.stat": true, + "fs.statSync": true, + "path.join": true, + "path.resolve": true, + "util": true + }, + "globals": { + "console.error": true, + "process.cwd": true, + "process.nextTick": true, + "process.platform": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>fs.realpath": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>inflight": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>path-is-absolute": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>fs.realpath": { + "builtin": { + "fs.lstat": true, + "fs.lstatSync": true, + "fs.readlink": true, + "fs.readlinkSync": true, + "fs.realpath": true, + "fs.realpathSync": true, + "fs.stat": true, + "fs.statSync": true, + "path.normalize": true, + "path.resolve": true + }, + "globals": { + "console.error": true, + "console.trace": true, + "process.env.NODE_DEBUG": true, + "process.nextTick": true, + "process.noDeprecation": true, + "process.platform": true, + "process.throwDeprecation": true, + "process.traceDeprecation": true, + "process.version": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>inflight": { + "globals": { + "process.nextTick": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>once>wrappy": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": { + "builtin": { + "util.inherits": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch": { + "builtin": { + "path": true + }, + "globals": { + "console.error": true + }, + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion>balanced-match": true, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion>concat-map": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": { + "packages": { + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>once>wrappy": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>rimraf>glob>path-is-absolute": { + "globals": { + "process.platform": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>semver": { + "globals": { + "console": true, + "process": true + } + }, + "gulp-watch>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "gulp-watch>chokidar>is-binary-path": { + "builtin": { + "path.extname": true + }, + "packages": { + "gulp-watch>chokidar>is-binary-path>binary-extensions": true + } + }, + "gulp-watch>chokidar>readdirp": { + "builtin": { + "path.join": true, + "path.relative": true, + "util.inherits": true + }, + "globals": { + "setImmediate": true + }, + "packages": { + "fs-extra>graceful-fs": true, + "gulp-watch>chokidar>readdirp>micromatch": true, + "readable-stream": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch": { + "builtin": { + "path.basename": true, + "path.sep": true, + "util.inspect": true + }, + "globals": { + "process.platform": true + }, + "packages": { + "gulp-watch>chokidar>braces": true, + "gulp-watch>chokidar>readdirp>micromatch>arr-diff": true, + "gulp-watch>chokidar>readdirp>micromatch>array-unique": true, + "gulp-watch>chokidar>readdirp>micromatch>define-property": true, + "gulp-watch>chokidar>readdirp>micromatch>extend-shallow": true, + "gulp-watch>chokidar>readdirp>micromatch>extglob": true, + "gulp-watch>chokidar>readdirp>micromatch>kind-of": true, + "webpack>micromatch>fragment-cache": true, + "webpack>micromatch>nanomatch": true, + "webpack>micromatch>object.pick": true, + "webpack>micromatch>regex-not": true, + "webpack>micromatch>snapdragon": true, + "webpack>micromatch>to-regex": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>define-property": { + "packages": { + "gulp>gulp-cli>isobject": true, + "webpack>micromatch>define-property>is-descriptor": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extend-shallow": { + "packages": { + "gulp-watch>chokidar>readdirp>micromatch>extend-shallow>is-extendable": true, + "webpack>micromatch>extend-shallow>assign-symbols": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extend-shallow>is-extendable": { + "packages": { + "@babel/register>clone-deep>is-plain-object": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extglob": { + "packages": { + "gulp-watch>chokidar>readdirp>micromatch>array-unique": true, + "gulp-watch>chokidar>readdirp>micromatch>extglob>define-property": true, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets": true, + "gulp-watch>chokidar>readdirp>micromatch>extglob>extend-shallow": true, + "webpack>micromatch>fragment-cache": true, + "webpack>micromatch>regex-not": true, + "webpack>micromatch>snapdragon": true, + "webpack>micromatch>to-regex": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extglob>define-property": { + "packages": { + "webpack>micromatch>define-property>is-descriptor": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets": { + "globals": { + "__filename": true + }, + "packages": { + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>debug": true, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property": true, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>extend-shallow": true, + "webpack>micromatch>extglob>expand-brackets>posix-character-classes": true, + "webpack>micromatch>regex-not": true, + "webpack>micromatch>snapdragon": true, + "webpack>micromatch>to-regex": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>debug": { + "builtin": { + "fs.SyncWriteStream": true, + "net.Socket": true, + "tty.WriteStream": true, + "tty.isatty": true, + "util": true + }, + "globals": { + "chrome": true, + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true + }, + "packages": { + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>debug>ms": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property": { + "packages": { + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor": { + "packages": { + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor": true, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-data-descriptor": true, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor>kind-of": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor": { + "packages": { + "gulp-watch>anymatch>micromatch>kind-of": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-data-descriptor": { + "packages": { + "gulp-watch>anymatch>micromatch>kind-of": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>extend-shallow": { + "packages": { + "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>extend-shallow>is-extendable": true + } + }, + "gulp-watch>chokidar>readdirp>micromatch>extglob>extend-shallow": { + "packages": { + "gulp-watch>chokidar>readdirp>micromatch>extglob>extend-shallow>is-extendable": true + } + }, + "gulp-watch>chokidar>upath": { + "builtin": { + "path": true + } + }, + "gulp-watch>fancy-log": { + "globals": { + "console": true, + "process.argv.indexOf": true, + "process.stderr.write": true, + "process.stdout.write": true + }, + "packages": { + "fancy-log>ansi-gray": true, + "fancy-log>color-support": true, + "fancy-log>time-stamp": true + } + }, + "gulp-watch>glob-parent": { + "builtin": { + "os.platform": true, + "path": true + }, + "packages": { + "gulp-watch>glob-parent>is-glob": true, + "gulp-watch>glob-parent>path-dirname": true + } + }, + "gulp-watch>glob-parent>is-glob": { + "packages": { + "gulp-watch>glob-parent>is-glob>is-extglob": true + } + }, + "gulp-watch>glob-parent>path-dirname": { + "builtin": { + "path": true, + "util.inspect": true + }, + "globals": { + "process.platform": true + } + }, + "gulp-watch>path-is-absolute": { + "globals": { + "process.platform": true + } + }, + "gulp-watch>vinyl-file": { + "builtin": { + "path.resolve": true + }, + "globals": { + "process.cwd": true + }, + "packages": { + "del>globby>pinkie-promise": true, + "fs-extra>graceful-fs": true, + "gulp-watch>vinyl-file>pify": true, + "gulp-watch>vinyl-file>strip-bom": true, + "gulp-watch>vinyl-file>strip-bom-stream": true, + "gulp-watch>vinyl-file>vinyl": true + } + }, + "gulp-watch>vinyl-file>strip-bom": { + "globals": { + "Buffer.isBuffer": true + }, + "packages": { + "gulp>vinyl-fs>remove-bom-buffer>is-utf8": true + } + }, + "gulp-watch>vinyl-file>strip-bom-stream": { + "packages": { + "gulp-watch>vinyl-file>strip-bom": true, + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream": true + } + }, + "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream": { + "builtin": { + "util.inherits": true + }, + "globals": { + "Buffer.concat": true, + "setImmediate": true + }, + "packages": { + "readable-stream": true + } + }, + "gulp-watch>vinyl-file>vinyl": { + "builtin": { + "buffer.Buffer": true, + "path.basename": true, + "path.dirname": true, + "path.extname": true, + "path.join": true, + "path.relative": true, + "stream.PassThrough": true, + "stream.Stream": true + }, + "globals": { + "process.cwd": true + }, + "packages": { + "gulp-watch>vinyl-file>vinyl>clone": true, + "gulp-watch>vinyl-file>vinyl>clone-stats": true, + "gulp-watch>vinyl-file>vinyl>replace-ext": true + } + }, + "gulp-watch>vinyl-file>vinyl>clone": { + "globals": { + "Buffer": true + } + }, + "gulp-watch>vinyl-file>vinyl>clone-stats": { + "builtin": { + "fs.Stats": true + } + }, + "gulp-watch>vinyl-file>vinyl>replace-ext": { + "builtin": { + "path.basename": true, + "path.dirname": true, + "path.extname": true, + "path.join": true + } + }, + "gulp-zip": { + "builtin": { + "buffer.constants.MAX_LENGTH": true, + "path.join": true + }, + "packages": { + "gulp-zip>get-stream": true, + "gulp-zip>plugin-error": true, + "gulp-zip>through2": true, + "gulp-zip>yazl": true, + "vinyl": true + } + }, + "gulp-zip>get-stream": { + "builtin": { + "buffer.constants.MAX_LENGTH": true, + "stream.PassThrough": true + }, + "globals": { + "Buffer.concat": true + }, + "packages": { + "pump": true + } + }, + "gulp-zip>plugin-error": { + "builtin": { + "util.inherits": true + }, + "packages": { + "gulp-watch>ansi-colors": true, + "gulp-zip>plugin-error>arr-union": true, + "gulp-zip>plugin-error>extend-shallow": true, + "webpack>micromatch>arr-diff": true + } + }, + "gulp-zip>plugin-error>extend-shallow": { + "packages": { + "gulp-zip>plugin-error>extend-shallow>is-extendable": true, + "webpack>micromatch>extend-shallow>assign-symbols": true + } + }, + "gulp-zip>plugin-error>extend-shallow>is-extendable": { + "packages": { + "@babel/register>clone-deep>is-plain-object": true + } + }, + "gulp-zip>through2": { + "builtin": { + "util.inherits": true + }, + "globals": { + "process.nextTick": true + }, + "packages": { + "gulp-zip>through2>readable-stream": true + } + }, + "gulp-zip>through2>readable-stream": { + "builtin": { + "buffer.Buffer": true, + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.env.READABLE_STREAM": true, + "process.nextTick": true, + "process.stderr": true, + "process.stdout": true + }, + "packages": { + "@storybook/api>util-deprecate": true, + "browserify>string_decoder": true, + "pumpify>inherits": true + } + }, + "gulp-zip>yazl": { + "builtin": { + "events.EventEmitter": true, + "fs.createReadStream": true, + "fs.stat": true, + "stream.PassThrough": true, + "stream.Transform": true, + "util.inherits": true, + "zlib.DeflateRaw": true, + "zlib.deflateRaw": true + }, + "globals": { + "Buffer": true, + "setImmediate": true, + "utf8FileName.length": true + }, + "packages": { + "gulp-zip>yazl>buffer-crc32": true + } + }, + "gulp-zip>yazl>buffer-crc32": { + "builtin": { + "buffer.Buffer": true + } + }, + "gulp>glob-watcher": { + "packages": { + "gulp>glob-watcher>anymatch": true, + "gulp>glob-watcher>async-done": true, + "gulp>glob-watcher>chokidar": true, + "gulp>glob-watcher>is-negated-glob": true, + "gulp>glob-watcher>just-debounce": true, + "gulp>undertaker>object.defaults": true + } + }, + "gulp>glob-watcher>anymatch": { + "builtin": { + "path.sep": true + }, + "packages": { + "gulp>glob-watcher>anymatch>micromatch": true, + "gulp>glob-watcher>anymatch>normalize-path": true + } + }, + "gulp>glob-watcher>anymatch>micromatch": { + "builtin": { + "path.basename": true, + "path.sep": true, + "util.inspect": true + }, + "globals": { + "process.platform": true + }, + "packages": { + "gulp>glob-watcher>anymatch>micromatch>define-property": true, + "gulp>glob-watcher>anymatch>micromatch>extend-shallow": true, + "gulp>glob-watcher>chokidar>braces": true, + "webpack>micromatch>arr-diff": true, + "webpack>micromatch>array-unique": true, + "webpack>micromatch>extglob": true, + "webpack>micromatch>fragment-cache": true, + "webpack>micromatch>kind-of": true, + "webpack>micromatch>nanomatch": true, + "webpack>micromatch>object.pick": true, + "webpack>micromatch>regex-not": true, + "webpack>micromatch>snapdragon": true, + "webpack>micromatch>to-regex": true + } + }, + "gulp>glob-watcher>anymatch>micromatch>define-property": { + "packages": { + "gulp>gulp-cli>isobject": true, + "webpack>micromatch>define-property>is-descriptor": true + } + }, + "gulp>glob-watcher>anymatch>micromatch>extend-shallow": { + "packages": { + "gulp>glob-watcher>anymatch>micromatch>extend-shallow>is-extendable": true, + "webpack>micromatch>extend-shallow>assign-symbols": true + } + }, + "gulp>glob-watcher>anymatch>micromatch>extend-shallow>is-extendable": { + "packages": { + "@babel/register>clone-deep>is-plain-object": true + } + }, + "gulp>glob-watcher>anymatch>normalize-path": { + "packages": { + "vinyl>remove-trailing-separator": true + } + }, + "gulp>glob-watcher>async-done": { + "builtin": { + "domain.create": true + }, + "globals": { + "process.nextTick": true }, "packages": { - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>debug>ms": true + "end-of-stream": true, + "gulp>glob-watcher>async-done>process-nextick-args": true, + "gulp>glob-watcher>async-done>stream-exhaust": true, + "pump>once": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property": { + "gulp>glob-watcher>async-done>process-nextick-args": { + "globals": { + "process": true + } + }, + "gulp>glob-watcher>async-done>stream-exhaust": { + "builtin": { + "stream.Writable": true, + "util.inherits": true + }, + "globals": { + "setImmediate": true + } + }, + "gulp>glob-watcher>chokidar": { + "builtin": { + "events.EventEmitter": true, + "fs": true, + "path.basename": true, + "path.dirname": true, + "path.extname": true, + "path.join": true, + "path.relative": true, + "path.resolve": true, + "path.sep": true + }, + "globals": { + "clearTimeout": true, + "console.error": true, + "process.env.CHOKIDAR_INTERVAL": true, + "process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR": true, + "process.env.CHOKIDAR_USEPOLLING": true, + "process.nextTick": true, + "process.platform": true, + "setTimeout": true + }, "packages": { - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor": true + "eslint>is-glob": true, + "gulp-watch>chokidar>async-each": true, + "gulp-watch>glob-parent": true, + "gulp-watch>path-is-absolute": true, + "gulp>glob-watcher>anymatch": true, + "gulp>glob-watcher>chokidar>braces": true, + "gulp>glob-watcher>chokidar>fsevents": true, + "gulp>glob-watcher>chokidar>fsevents": true, + "gulp>glob-watcher>chokidar>is-binary-path": true, + "gulp>glob-watcher>chokidar>normalize-path": true, + "gulp>glob-watcher>chokidar>readdirp": true, + "gulp>glob-watcher>chokidar>upath": true, + "pumpify>inherits": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor": { + "gulp>glob-watcher>chokidar>braces": { "packages": { - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor": true, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-data-descriptor": true, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor>kind-of": true + "gulp>glob-watcher>chokidar>braces>fill-range": true, + "gulp>gulp-cli>isobject": true, + "gulp>undertaker>arr-flatten": true, + "webpack>micromatch>array-unique": true, + "webpack>micromatch>braces>repeat-element": true, + "webpack>micromatch>braces>snapdragon-node": true, + "webpack>micromatch>braces>split-string": true, + "webpack>micromatch>extglob>extend-shallow": true, + "webpack>micromatch>snapdragon": true, + "webpack>micromatch>to-regex": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-accessor-descriptor": { + "gulp>glob-watcher>chokidar>braces>fill-range": { + "builtin": { + "util.inspect": true + }, "packages": { - "gulp-watch>anymatch>micromatch>kind-of": true + "gulp>glob-watcher>chokidar>braces>fill-range>is-number": true, + "gulp>glob-watcher>chokidar>braces>fill-range>to-regex-range": true, + "webpack>micromatch>braces>fill-range>repeat-string": true, + "webpack>micromatch>extglob>extend-shallow": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>define-property>is-descriptor>is-data-descriptor": { + "gulp>glob-watcher>chokidar>braces>fill-range>is-number": { "packages": { - "gulp-watch>anymatch>micromatch>kind-of": true + "gulp>glob-watcher>chokidar>braces>fill-range>is-number>kind-of": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>extend-shallow": { + "gulp>glob-watcher>chokidar>braces>fill-range>is-number>kind-of": { "packages": { - "gulp-watch>chokidar>readdirp>micromatch>extglob>expand-brackets>extend-shallow>is-extendable": true + "browserify>insert-module-globals>is-buffer": true } }, - "gulp-watch>chokidar>readdirp>micromatch>extglob>extend-shallow": { + "gulp>glob-watcher>chokidar>braces>fill-range>to-regex-range": { "packages": { - "gulp-watch>chokidar>readdirp>micromatch>extglob>extend-shallow>is-extendable": true + "gulp>glob-watcher>chokidar>braces>fill-range>is-number": true, + "webpack>micromatch>braces>fill-range>repeat-string": true + } + }, + "gulp>glob-watcher>chokidar>fsevents": { + "builtin": { + "events.EventEmitter": true, + "fs.stat": true, + "path.join": true, + "util.inherits": true + }, + "globals": { + "__dirname": true, + "process.nextTick": true, + "process.platform": true, + "setImmediate": true + }, + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp": { + "builtin": { + "events.EventEmitter": true, + "fs.existsSync": true, + "fs.readFileSync": true, + "fs.renameSync": true, + "path.dirname": true, + "path.existsSync": true, + "path.join": true, + "path.resolve": true, + "url.parse": true, + "url.resolve": true, + "util.inherits": true + }, + "globals": { + "__dirname": true, + "console.log": true, + "process.arch": true, + "process.cwd": true, + "process.env": true, + "process.platform": true, + "process.version.substr": true, + "process.versions": true + }, + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>detect-libc": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>semver": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>detect-libc": { + "builtin": { + "child_process.spawnSync": true, + "fs.readdirSync": true, + "os.platform": true + }, + "globals": { + "process.env": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt": { + "builtin": { + "path": true, + "stream.Stream": true, + "url": true + }, + "globals": { + "console": true, + "process.argv": true, + "process.env.DEBUG_NOPT": true, + "process.env.NOPT_DEBUG": true, + "process.platform": true + }, + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>abbrev": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv": { + "builtin": { + "child_process.exec": true, + "path": true + }, + "globals": { + "process.env.COMPUTERNAME": true, + "process.env.ComSpec": true, + "process.env.EDITOR": true, + "process.env.HOSTNAME": true, + "process.env.PATH": true, + "process.env.PROMPT": true, + "process.env.PS1": true, + "process.env.Path": true, + "process.env.SHELL": true, + "process.env.USER": true, + "process.env.USERDOMAIN": true, + "process.env.USERNAME": true, + "process.env.VISUAL": true, + "process.env.path": true, + "process.nextTick": true, + "process.platform": true + }, + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-homedir": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-homedir": { + "builtin": { + "os.homedir": true + }, + "globals": { + "process.env": true, + "process.getuid": true, + "process.platform": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": { + "globals": { + "process.env.SystemRoot": true, + "process.env.TEMP": true, + "process.env.TMP": true, + "process.env.TMPDIR": true, + "process.env.windir": true, + "process.platform": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog": { + "builtin": { + "events.EventEmitter": true, + "util": true + }, + "globals": { + "process.nextTick": true, + "process.stderr": true + }, + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>console-control-strings": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>set-blocking": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet": { + "builtin": { + "events.EventEmitter": true, + "util.inherits": true + }, + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>delegates": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream": { + "builtin": { + "events.EventEmitter": true, + "stream": true, + "util": true + }, + "globals": { + "process.browser": true, + "process.env.READABLE_STREAM": true, + "process.stderr": true, + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true + }, + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>core-util-is": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>isarray": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>process-nextick-args": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>string_decoder": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>util-deprecate": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>core-util-is": { + "globals": { + "Buffer.isBuffer": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>process-nextick-args": { + "globals": { + "process": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>string_decoder": { + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>util-deprecate": { + "builtin": { + "util.deprecate": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge": { + "builtin": { + "util.format": true + }, + "globals": { + "clearInterval": true, + "process": true, + "setImmediate": true, + "setInterval": true + }, + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>console-control-strings": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>aproba": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>has-unicode": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>object-assign": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>signal-exit": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>wide-align": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>has-unicode": { + "builtin": { + "os.type": true + }, + "globals": { + "process.env.LANG": true, + "process.env.LC_ALL": true, + "process.env.LC_CTYPE": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>signal-exit": { + "builtin": { + "assert.equal": true, + "events": true + }, + "globals": { + "process": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": { + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>code-point-at": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": { + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point>number-is-nan": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": { + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi>ansi-regex": true } }, - "gulp-watch>chokidar>upath": { - "builtin": { - "path": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>wide-align": { + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": true } }, - "gulp-watch>fancy-log": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>set-blocking": { "globals": { - "console": true, - "process.argv.indexOf": true, - "process.stderr.write": true, - "process.stdout.write": true - }, - "packages": { - "fancy-log>ansi-gray": true, - "fancy-log>color-support": true, - "fancy-log>time-stamp": true + "process.stderr": true, + "process.stdout": true } }, - "gulp-watch>glob-parent": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf": { "builtin": { - "os.platform": true, - "path": true + "assert": true, + "fs": true, + "path.join": true + }, + "globals": { + "process.platform": true, + "setTimeout": true }, "packages": { - "gulp-watch>glob-parent>is-glob": true, - "gulp-watch>glob-parent>path-dirname": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob": true } }, - "gulp-watch>glob-parent>is-glob": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob": { + "builtin": { + "assert": true, + "events.EventEmitter": true, + "fs.lstat": true, + "fs.lstatSync": true, + "fs.readdir": true, + "fs.readdirSync": true, + "fs.stat": true, + "fs.statSync": true, + "path.join": true, + "path.resolve": true, + "util": true + }, + "globals": { + "console.error": true, + "process.cwd": true, + "process.nextTick": true, + "process.platform": true + }, "packages": { - "gulp-watch>glob-parent>is-glob>is-extglob": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>fs.realpath": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>inflight": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>path-is-absolute": true } }, - "gulp-watch>glob-parent>path-dirname": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>fs.realpath": { "builtin": { - "path": true, - "util.inspect": true + "fs.lstat": true, + "fs.lstatSync": true, + "fs.readlink": true, + "fs.readlinkSync": true, + "fs.realpath": true, + "fs.realpathSync": true, + "fs.stat": true, + "fs.statSync": true, + "path.normalize": true, + "path.resolve": true }, "globals": { - "process.platform": true + "console.error": true, + "console.trace": true, + "process.env.NODE_DEBUG": true, + "process.nextTick": true, + "process.noDeprecation": true, + "process.platform": true, + "process.throwDeprecation": true, + "process.traceDeprecation": true, + "process.version": true } }, - "gulp-watch>path-is-absolute": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>inflight": { "globals": { - "process.platform": true + "process.nextTick": true + }, + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>once>wrappy": true } }, - "gulp-watch>vinyl-file": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": { "builtin": { - "path.resolve": true + "util.inherits": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch": { + "builtin": { + "path": true }, "globals": { - "process.cwd": true + "console.error": true }, "packages": { - "del>globby>pinkie-promise": true, - "fs-extra>graceful-fs": true, - "gulp-watch>vinyl-file>pify": true, - "gulp-watch>vinyl-file>strip-bom": true, - "gulp-watch>vinyl-file>strip-bom-stream": true, - "gulp-watch>vinyl-file>vinyl": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion": true } }, - "gulp-watch>vinyl-file>strip-bom": { - "globals": { - "Buffer.isBuffer": true - }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion": { "packages": { - "gulp>vinyl-fs>remove-bom-buffer>is-utf8": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion>balanced-match": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion>concat-map": true } }, - "gulp-watch>vinyl-file>strip-bom-stream": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": { "packages": { - "gulp-watch>vinyl-file>strip-bom": true, - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>once>wrappy": true } }, - "gulp-watch>vinyl-file>strip-bom-stream>first-chunk-stream": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>path-is-absolute": { + "globals": { + "process.platform": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>semver": { + "globals": { + "console": true, + "process": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": { + "builtin": { + "buffer": true + } + }, + "gulp>glob-watcher>chokidar>fsevents": { "builtin": { + "events.EventEmitter": true, + "fs.stat": true, + "path.join": true, "util.inherits": true }, "globals": { - "Buffer.concat": true, + "__dirname": true, + "process.nextTick": true, + "process.platform": true, "setImmediate": true }, "packages": { - "readable-stream": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp": true } }, - "gulp-watch>vinyl-file>vinyl": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp": { "builtin": { - "buffer.Buffer": true, - "path.basename": true, + "events.EventEmitter": true, + "fs.existsSync": true, + "fs.readFileSync": true, + "fs.renameSync": true, "path.dirname": true, - "path.extname": true, + "path.existsSync": true, "path.join": true, - "path.relative": true, - "stream.PassThrough": true, - "stream.Stream": true + "path.resolve": true, + "url.parse": true, + "url.resolve": true, + "util.inherits": true }, "globals": { - "process.cwd": true + "__dirname": true, + "console.log": true, + "process.arch": true, + "process.cwd": true, + "process.env": true, + "process.platform": true, + "process.version.substr": true, + "process.versions": true }, "packages": { - "gulp-watch>vinyl-file>vinyl>clone": true, - "gulp-watch>vinyl-file>vinyl>clone-stats": true, - "gulp-watch>vinyl-file>vinyl>replace-ext": true - } - }, - "gulp-watch>vinyl-file>vinyl>clone": { - "globals": { - "Buffer": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>detect-libc": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>semver": true } }, - "gulp-watch>vinyl-file>vinyl>clone-stats": { - "builtin": { - "fs.Stats": true - } - }, - "gulp-watch>vinyl-file>vinyl>replace-ext": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>detect-libc": { "builtin": { - "path.basename": true, - "path.dirname": true, - "path.extname": true, - "path.join": true + "child_process.spawnSync": true, + "fs.readdirSync": true, + "os.platform": true + }, + "globals": { + "process.env": true } }, - "gulp-zip": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt": { "builtin": { - "buffer.constants.MAX_LENGTH": true, - "path.join": true + "path": true, + "stream.Stream": true, + "url": true + }, + "globals": { + "console": true, + "process.argv": true, + "process.env.DEBUG_NOPT": true, + "process.env.NOPT_DEBUG": true, + "process.platform": true }, "packages": { - "gulp-zip>get-stream": true, - "gulp-zip>plugin-error": true, - "gulp-zip>through2": true, - "gulp-zip>yazl": true, - "vinyl": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>abbrev": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv": true } }, - "gulp-zip>get-stream": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv": { "builtin": { - "buffer.constants.MAX_LENGTH": true, - "stream.PassThrough": true + "child_process.exec": true, + "path": true }, "globals": { - "Buffer.concat": true + "process.env.COMPUTERNAME": true, + "process.env.ComSpec": true, + "process.env.EDITOR": true, + "process.env.HOSTNAME": true, + "process.env.PATH": true, + "process.env.PROMPT": true, + "process.env.PS1": true, + "process.env.Path": true, + "process.env.SHELL": true, + "process.env.USER": true, + "process.env.USERDOMAIN": true, + "process.env.USERNAME": true, + "process.env.VISUAL": true, + "process.env.path": true, + "process.nextTick": true, + "process.platform": true }, "packages": { - "pump": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-homedir": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": true } }, - "gulp-zip>plugin-error": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-homedir": { "builtin": { - "util.inherits": true + "os.homedir": true }, - "packages": { - "gulp-watch>ansi-colors": true, - "gulp-zip>plugin-error>arr-union": true, - "gulp-zip>plugin-error>extend-shallow": true, - "webpack>micromatch>arr-diff": true + "globals": { + "process.env": true, + "process.getuid": true, + "process.platform": true } }, - "gulp-zip>plugin-error>extend-shallow": { - "packages": { - "gulp-zip>plugin-error>extend-shallow>is-extendable": true, - "webpack>micromatch>extend-shallow>assign-symbols": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>nopt>osenv>os-tmpdir": { + "globals": { + "process.env.SystemRoot": true, + "process.env.TEMP": true, + "process.env.TMP": true, + "process.env.TMPDIR": true, + "process.env.windir": true, + "process.platform": true } }, - "gulp-zip>plugin-error>extend-shallow>is-extendable": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog": { + "builtin": { + "events.EventEmitter": true, + "util": true + }, + "globals": { + "process.nextTick": true, + "process.stderr": true + }, "packages": { - "@babel/register>clone-deep>is-plain-object": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>console-control-strings": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>set-blocking": true } }, - "gulp-zip>through2": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet": { "builtin": { + "events.EventEmitter": true, "util.inherits": true }, - "globals": { - "process.nextTick": true - }, "packages": { - "gulp-zip>through2>readable-stream": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>delegates": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream": true } }, - "gulp-zip>through2>readable-stream": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream": { "builtin": { - "buffer.Buffer": true, "events.EventEmitter": true, "stream": true, "util": true }, "globals": { + "process.browser": true, "process.env.READABLE_STREAM": true, - "process.nextTick": true, "process.stderr": true, - "process.stdout": true + "process.stdout": true, + "process.version.slice": true, + "setImmediate": true }, "packages": { - "@storybook/api>util-deprecate": true, - "browserify>string_decoder": true, - "pumpify>inherits": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>core-util-is": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>isarray": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>process-nextick-args": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>string_decoder": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>util-deprecate": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": true } }, - "gulp-zip>yazl": { - "builtin": { - "events.EventEmitter": true, - "fs.createReadStream": true, - "fs.stat": true, - "stream.PassThrough": true, - "stream.Transform": true, - "util.inherits": true, - "zlib.DeflateRaw": true, - "zlib.deflateRaw": true - }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>core-util-is": { "globals": { - "Buffer": true, - "setImmediate": true, - "utf8FileName.length": true - }, + "Buffer.isBuffer": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>process-nextick-args": { + "globals": { + "process": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>string_decoder": { "packages": { - "gulp-zip>yazl>buffer-crc32": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": true } }, - "gulp-zip>yazl>buffer-crc32": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>are-we-there-yet>readable-stream>util-deprecate": { "builtin": { - "buffer.Buffer": true + "util.deprecate": true } }, - "gulp>glob-watcher": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge": { + "builtin": { + "util.format": true + }, + "globals": { + "clearInterval": true, + "process": true, + "setImmediate": true, + "setInterval": true + }, "packages": { - "gulp>glob-watcher>anymatch": true, - "gulp>glob-watcher>async-done": true, - "gulp>glob-watcher>chokidar": true, - "gulp>glob-watcher>is-negated-glob": true, - "gulp>glob-watcher>just-debounce": true, - "gulp>undertaker>object.defaults": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>console-control-strings": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>aproba": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>has-unicode": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>object-assign": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>signal-exit": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>wide-align": true } }, - "gulp>glob-watcher>anymatch": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>has-unicode": { "builtin": { - "path.sep": true + "os.type": true }, - "packages": { - "gulp>glob-watcher>anymatch>micromatch": true, - "gulp>glob-watcher>anymatch>normalize-path": true + "globals": { + "process.env.LANG": true, + "process.env.LC_ALL": true, + "process.env.LC_CTYPE": true } }, - "gulp>glob-watcher>anymatch>micromatch": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>signal-exit": { "builtin": { - "path.basename": true, - "path.sep": true, - "util.inspect": true + "assert.equal": true, + "events": true }, "globals": { - "process.platform": true - }, - "packages": { - "3box>ipfs>kind-of": true, - "gulp>glob-watcher>anymatch>micromatch>define-property": true, - "gulp>glob-watcher>anymatch>micromatch>extend-shallow": true, - "gulp>glob-watcher>chokidar>braces": true, - "webpack>micromatch>arr-diff": true, - "webpack>micromatch>array-unique": true, - "webpack>micromatch>extglob": true, - "webpack>micromatch>fragment-cache": true, - "webpack>micromatch>nanomatch": true, - "webpack>micromatch>object.pick": true, - "webpack>micromatch>regex-not": true, - "webpack>micromatch>snapdragon": true, - "webpack>micromatch>to-regex": true + "process": true } }, - "gulp>glob-watcher>anymatch>micromatch>define-property": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": { "packages": { - "gulp>gulp-cli>isobject": true, - "webpack>micromatch>define-property>is-descriptor": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>code-point-at": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": true } }, - "gulp>glob-watcher>anymatch>micromatch>extend-shallow": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point": { "packages": { - "gulp>glob-watcher>anymatch>micromatch>extend-shallow>is-extendable": true, - "webpack>micromatch>extend-shallow>assign-symbols": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width>is-fullwidth-code-point>number-is-nan": true } }, - "gulp>glob-watcher>anymatch>micromatch>extend-shallow>is-extendable": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi": { "packages": { - "@babel/register>clone-deep>is-plain-object": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>strip-ansi>ansi-regex": true } }, - "gulp>glob-watcher>anymatch>normalize-path": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>wide-align": { "packages": { - "vinyl>remove-trailing-separator": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>gauge>string-width": true } }, - "gulp>glob-watcher>async-done": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>npmlog>set-blocking": { + "globals": { + "process.stderr": true, + "process.stdout": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf": { "builtin": { - "domain.create": true + "assert": true, + "fs": true, + "path.join": true }, "globals": { - "process.nextTick": true + "process.platform": true, + "setTimeout": true }, "packages": { - "end-of-stream": true, - "gulp>glob-watcher>async-done>process-nextick-args": true, - "gulp>glob-watcher>async-done>stream-exhaust": true, - "pump>once": true - } - }, - "gulp>glob-watcher>async-done>process-nextick-args": { - "globals": { - "process": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob": true } }, - "gulp>glob-watcher>async-done>stream-exhaust": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob": { "builtin": { - "stream.Writable": true, - "util.inherits": true + "assert": true, + "events.EventEmitter": true, + "fs.lstat": true, + "fs.lstatSync": true, + "fs.readdir": true, + "fs.readdirSync": true, + "fs.stat": true, + "fs.statSync": true, + "path.join": true, + "path.resolve": true, + "util": true }, "globals": { - "setImmediate": true + "console.error": true, + "process.cwd": true, + "process.nextTick": true, + "process.platform": true + }, + "packages": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>fs.realpath": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>inflight": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>path-is-absolute": true } }, - "gulp>glob-watcher>chokidar": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>fs.realpath": { "builtin": { - "events.EventEmitter": true, - "fs": true, - "path.basename": true, - "path.dirname": true, - "path.extname": true, - "path.join": true, - "path.relative": true, - "path.resolve": true, - "path.sep": true + "fs.lstat": true, + "fs.lstatSync": true, + "fs.readlink": true, + "fs.readlinkSync": true, + "fs.realpath": true, + "fs.realpathSync": true, + "fs.stat": true, + "fs.statSync": true, + "path.normalize": true, + "path.resolve": true }, "globals": { - "clearTimeout": true, "console.error": true, - "process.env.CHOKIDAR_INTERVAL": true, - "process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR": true, - "process.env.CHOKIDAR_USEPOLLING": true, + "console.trace": true, + "process.env.NODE_DEBUG": true, "process.nextTick": true, + "process.noDeprecation": true, "process.platform": true, - "setTimeout": true + "process.throwDeprecation": true, + "process.traceDeprecation": true, + "process.version": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>inflight": { + "globals": { + "process.nextTick": true }, "packages": { - "eslint>is-glob": true, - "gulp-watch>chokidar>async-each": true, - "gulp-watch>glob-parent": true, - "gulp-watch>path-is-absolute": true, - "gulp>glob-watcher>anymatch": true, - "gulp>glob-watcher>chokidar>braces": true, - "gulp>glob-watcher>chokidar>is-binary-path": true, - "gulp>glob-watcher>chokidar>normalize-path": true, - "gulp>glob-watcher>chokidar>readdirp": true, - "gulp>glob-watcher>chokidar>upath": true, - "pumpify>inherits": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>once>wrappy": true } }, - "gulp>glob-watcher>chokidar>braces": { - "packages": { - "gulp>glob-watcher>chokidar>braces>fill-range": true, - "gulp>gulp-cli>isobject": true, - "gulp>undertaker>arr-flatten": true, - "webpack>micromatch>array-unique": true, - "webpack>micromatch>braces>repeat-element": true, - "webpack>micromatch>braces>snapdragon-node": true, - "webpack>micromatch>braces>split-string": true, - "webpack>micromatch>extglob>extend-shallow": true, - "webpack>micromatch>snapdragon": true, - "webpack>micromatch>to-regex": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>inherits": { + "builtin": { + "util.inherits": true } }, - "gulp>glob-watcher>chokidar>braces>fill-range": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch": { "builtin": { - "util.inspect": true + "path": true + }, + "globals": { + "console.error": true }, "packages": { - "gulp>glob-watcher>chokidar>braces>fill-range>is-number": true, - "gulp>glob-watcher>chokidar>braces>fill-range>to-regex-range": true, - "webpack>micromatch>braces>fill-range>repeat-string": true, - "webpack>micromatch>extglob>extend-shallow": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion": true } }, - "gulp>glob-watcher>chokidar>braces>fill-range>is-number": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion": { "packages": { - "gulp>glob-watcher>chokidar>braces>fill-range>is-number>kind-of": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion>balanced-match": true, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>minimatch>brace-expansion>concat-map": true } }, - "gulp>glob-watcher>chokidar>braces>fill-range>is-number>kind-of": { + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>once": { "packages": { - "browserify>insert-module-globals>is-buffer": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>once>wrappy": true } }, - "gulp>glob-watcher>chokidar>braces>fill-range>to-regex-range": { - "packages": { - "gulp>glob-watcher>chokidar>braces>fill-range>is-number": true, - "webpack>micromatch>braces>fill-range>repeat-string": true + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>rimraf>glob>path-is-absolute": { + "globals": { + "process.platform": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>semver": { + "globals": { + "console": true, + "process": true + } + }, + "gulp>glob-watcher>chokidar>fsevents>node-pre-gyp>tar>safe-buffer": { + "builtin": { + "buffer": true } }, "gulp>glob-watcher>chokidar>is-binary-path": { @@ -4998,7 +6510,7 @@ }, "gulp>undertaker>arr-map>make-iterator": { "packages": { - "3box>ipfs>kind-of": true + "webpack>micromatch>kind-of": true } }, "gulp>undertaker>bach": { @@ -5412,6 +6924,11 @@ "jsdom>escodegen>source-map": true } }, + "koa>is-generator-function>has-tostringtag": { + "packages": { + "string.prototype.matchall>has-symbols": true + } + }, "labeled-stream-splicer": { "packages": { "labeled-stream-splicer>stream-splicer": true, @@ -5619,9 +7136,9 @@ }, "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone": { "packages": { - "3box>ipfs>superstruct>clone-deep>shallow-clone>mixin-object": true, "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>kind-of": true, "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>lazy-cache": true, + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>mixin-object": true, "webpack>micromatch>extglob>extend-shallow>is-extendable": true } }, @@ -5638,6 +7155,12 @@ "process.env.UNLAZY": true } }, + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>mixin-object": { + "packages": { + "lavamoat>lavamoat-core>merge-deep>clone-deep>shallow-clone>mixin-object>for-in": true, + "webpack>micromatch>extglob>extend-shallow>is-extendable": true + } + }, "lavamoat>lavamoat-core>merge-deep>kind-of": { "packages": { "browserify>insert-module-globals>is-buffer": true @@ -5677,25 +7200,6 @@ "loose-envify>js-tokens": true } }, - "madge>debug": { - "builtin": { - "tty.isatty": true, - "util.deprecate": true, - "util.format": true, - "util.inspect": true - }, - "globals": { - "console": true, - "document": true, - "localStorage": true, - "navigator": true, - "process": true - }, - "packages": { - "madge>debug>ms": true, - "sinon>supports-color": true - } - }, "madge>detective-scss>gonzales-pe": { "globals": { "console.error": true, @@ -5723,6 +7227,13 @@ "stylelint>balanced-match": true } }, + "mocha>mkdirp": { + "builtin": { + "fs": true, + "path.dirname": true, + "path.resolve": true + } + }, "mocha>supports-color>has-flag": { "globals": { "process.argv": true @@ -5755,21 +7266,23 @@ "process.platform": true } }, - "nock>deep-equal>is-date-object": { - "packages": { - "enzyme>is-regex>has-tostringtag": true - } - }, - "nock>mkdirp": { + "nock>debug": { "builtin": { - "fs": true, - "path.dirname": true, - "path.resolve": true - } - }, - "nock>qs": { + "tty.isatty": true, + "util.deprecate": true, + "util.format": true, + "util.inspect": true + }, + "globals": { + "console": true, + "document": true, + "localStorage": true, + "navigator": true, + "process": true + }, "packages": { - "string.prototype.matchall>side-channel": true + "nock>debug>ms": true, + "sinon>supports-color": true } }, "node-sass": { @@ -6185,9 +7698,9 @@ }, "string.prototype.matchall>es-abstract>es-to-primitive": { "packages": { + "@metamask/eth-token-tracker>deep-equal>is-date-object": true, "@storybook/api>telejson>is-symbol": true, - "enzyme>is-callable": true, - "nock>deep-equal>is-date-object": true + "enzyme>is-callable": true } }, "string.prototype.matchall>get-intrinsic": { @@ -6254,7 +7767,7 @@ "globby>ignore": true, "globby>slash": true, "lodash": true, - "madge>debug": true, + "nock>debug": true, "nyc>resolve-from": true, "stylelint>@stylelint/postcss-css-in-js": true, "stylelint>@stylelint/postcss-markdown": true, @@ -6452,9 +7965,9 @@ "stylelint>autoprefixer>caniuse-lite": true, "stylelint>autoprefixer>normalize-range": true, "stylelint>autoprefixer>num2fraction": true, + "stylelint>autoprefixer>picocolors": true, "stylelint>postcss": true, - "stylelint>postcss-value-parser": true, - "stylelint>postcss>picocolors": true + "stylelint>postcss-value-parser": true } }, "stylelint>autoprefixer>browserslist": { @@ -6485,6 +7998,16 @@ "stylelint>autoprefixer>caniuse-lite": true } }, + "stylelint>autoprefixer>picocolors": { + "builtin": { + "tty.isatty": true + }, + "globals": { + "process.argv.includes": true, + "process.env": true, + "process.platform": true + } + }, "stylelint>chalk": { "packages": { "chalk>ansi-styles": true, @@ -6568,7 +8091,7 @@ "path.dirname": true }, "packages": { - "nock>mkdirp": true + "mocha>mkdirp": true } }, "stylelint>global-modules": { @@ -7215,19 +8738,19 @@ }, "webpack>micromatch>define-property>is-descriptor": { "packages": { - "3box>ipfs>kind-of": true, "webpack>micromatch>define-property>is-descriptor>is-accessor-descriptor": true, - "webpack>micromatch>define-property>is-descriptor>is-data-descriptor": true + "webpack>micromatch>define-property>is-descriptor>is-data-descriptor": true, + "webpack>micromatch>kind-of": true } }, "webpack>micromatch>define-property>is-descriptor>is-accessor-descriptor": { "packages": { - "3box>ipfs>kind-of": true + "webpack>micromatch>kind-of": true } }, "webpack>micromatch>define-property>is-descriptor>is-data-descriptor": { "packages": { - "3box>ipfs>kind-of": true + "webpack>micromatch>kind-of": true } }, "webpack>micromatch>extglob": { @@ -7330,11 +8853,11 @@ "util.inspect": true }, "packages": { - "3box>ipfs>kind-of": true, "nyc>spawn-wrap>is-windows": true, "webpack>micromatch>arr-diff": true, "webpack>micromatch>array-unique": true, "webpack>micromatch>fragment-cache": true, + "webpack>micromatch>kind-of": true, "webpack>micromatch>nanomatch>define-property": true, "webpack>micromatch>nanomatch>extend-shallow": true, "webpack>micromatch>nanomatch>is-odd": true, @@ -7647,7 +9170,7 @@ }, "webpack>micromatch>snapdragon>use": { "packages": { - "3box>ipfs>kind-of": true + "webpack>micromatch>kind-of": true } }, "webpack>micromatch>to-regex": { diff --git a/package.json b/package.json index a7e5e0dfc7e1..0799df89268f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "metamask-crx", - "version": "10.19.0", + "version": "10.22.2", "private": true, "repository": { "type": "git", @@ -15,15 +15,14 @@ "dist": "yarn build dist", "build": "yarn lavamoat:build", "build:dev": "node development/build/index.js", - "build:icons": "node ui/components/component-library/icon/scripts/generate-icon-names.js && node ui/components/component-library/icon/scripts/generate-icon-scss.js", - "start:test": "SEGMENT_HOST='https://api.segment.io' SEGMENT_WRITE_KEY='FAKE' SENTRY_DSN_DEV=https://fake@sentry.io/0000000 yarn build testDev", + "start:test": "SEGMENT_HOST='https://api.segment.io' SEGMENT_WRITE_KEY='FAKE' SENTRY_DSN_DEV=https://fake@sentry.io/0000000 PORTFOLIO_URL=http://127.0.0.1:8080 yarn build testDev", "benchmark:chrome": "SELENIUM_BROWSER=chrome node test/e2e/benchmark.js", "mv3:stats:chrome": "SELENIUM_BROWSER=chrome ENABLE_MV3=true node test/e2e/mv3-perf-stats/index.js", "user-actions-benchmark:chrome": "SELENIUM_BROWSER=chrome node test/e2e/user-actions-benchmark.js", "benchmark:firefox": "SELENIUM_BROWSER=firefox node test/e2e/benchmark.js", - "build:test": "SEGMENT_HOST='https://api.segment.io' SEGMENT_WRITE_KEY='FAKE' SENTRY_DSN_DEV=https://fake@sentry.io/0000000 yarn build test", + "build:test": "SEGMENT_HOST='https://api.segment.io' SEGMENT_WRITE_KEY='FAKE' SENTRY_DSN_DEV=https://fake@sentry.io/0000000 PORTFOLIO_URL=http://127.0.0.1:8080 yarn build test", "build:test:flask": "yarn build test --build-type flask", - "build:test:mv3": "ENABLE_MV3=true yarn build test", + "build:test:mv3": "ENABLE_MV3=true SEGMENT_HOST='https://api.segment.io' SEGMENT_WRITE_KEY='FAKE' SENTRY_DSN_DEV=https://fake@sentry.io/0000000 PORTFOLIO_URL=http://127.0.0.1:8080 yarn build test", "test": "yarn lint && yarn test:unit && yarn test:unit:jest", "dapp": "node development/static-server.js node_modules/@metamask/test-dapp/dist --port 8080", "dapp-chain": "GANACHE_ARGS='-b 2' concurrently -k -n ganache,dapp -p '[{time}][{name}]' 'yarn ganache:start' 'sleep 5 && yarn dapp'", @@ -66,7 +65,6 @@ "start:dev": "concurrently -k -n build,react,redux yarn:start yarn:devtools:react yarn:devtools:redux", "announce": "node development/announcer.js", "storybook": "start-storybook -p 6006 -c .storybook", - "storybook:test": "jest --config=./jest.stories.config.js", "storybook:build": "build-storybook -c .storybook -o storybook-build", "storybook:deploy": "storybook-to-ghpages --existing-output-dir storybook-build --remote storybook --branch master", "update-changelog": "auto-changelog update", @@ -74,10 +72,10 @@ "lavamoat:build": "lavamoat development/build/index.js --policy lavamoat/build-system/policy.json --policyOverride lavamoat/build-system/policy-override.json", "lavamoat:build:auto": "yarn lavamoat:build --writeAutoPolicy", "lavamoat:debug:build": "yarn lavamoat:build --writeAutoPolicyDebug --policydebug lavamoat/build-system/policy-debug.json", - "lavamoat:background:auto": "node ./development/generate-lavamoat-policies.js", - "lavamoat:background:auto:ci": "node ./development/generate-lavamoat-policies.js --parallel=false", - "lavamoat:auto": "yarn lavamoat:build:auto && yarn lavamoat:background:auto", - "lavamoat:auto:ci": "yarn lavamoat:build:auto && yarn lavamoat:background:auto:ci", + "lavamoat:webapp:auto": "node ./development/generate-lavamoat-policies.js --devMode=true", + "lavamoat:webapp:auto:ci": "node ./development/generate-lavamoat-policies.js --parallel=false", + "lavamoat:auto": "yarn lavamoat:build:auto && yarn lavamoat:webapp:auto", + "lavamoat:auto:ci": "yarn lavamoat:build:auto && yarn lavamoat:webapp:auto:ci", "ts-migration:enumerate": "ts-node development/ts-migration-dashboard/scripts/write-list-of-files-to-convert.ts", "ts-migration:dashboard:watch": "ts-node development/ts-migration-dashboard/scripts/build.ts --watch", "ts-migration:dashboard:build": "ts-node development/ts-migration-dashboard/scripts/build.ts", @@ -85,31 +83,21 @@ }, "resolutions": { "**/regenerator-runtime": "^0.13.7", - "**/caniuse-lite": "^1.0.30001312", "**/cross-fetch": "^3.1.5", "**/configstore/dot-prop": "^5.1.1", "**/ethers/elliptic": "^6.5.4", "**/redux/symbol-observable": "^2.0.3", "**/redux-devtools-instrument/symbol-observable": "^2.0.3", "**/rxjs/symbol-observable": "^2.0.3", - "**/xmlhttprequest-ssl": "^1.6.2", - "3box/ipfs/ipld-zcash/zcash-bitcore-lib/lodash": "^4.17.21", - "3box/ipfs/ipld-zcash/zcash-bitcore-lib/elliptic": "^6.5.4", - "3box/ipfs/libp2p-mdns/multicast-dns/dns-packet": "^5.2.2", - "3box/ipfs/prometheus-gc-stats/gc-stats/node-pre-gyp/tar": "^6.1.2", - "3box/**/libp2p-crypto/node-forge": "^1.3.0", - "3box/**/libp2p-keychain/node-forge": "^1.3.0", - "3box/ipfs/libp2p-webrtc-star/socket.io/engine.io": "^4.0.0", "analytics-node/axios": "^0.21.2", "ganache-core/lodash": "^4.17.21", "netmask": "^2.0.1", "pubnub/superagent-proxy": "^3.0.0", - "pull-ws": "^3.3.2", "json-schema": "^0.4.0", - "simple-get": "^4.0.1" + "simple-get": "^4.0.1", + "@storybook/**/ast-types": "^0.14.2" }, "dependencies": { - "3box": "^1.10.2", "@babel/runtime": "^7.5.5", "@download/blockies": "^1.0.3", "@ensdomains/content-hash": "^2.5.6", @@ -118,30 +106,31 @@ "@ethereumjs/tx": "^3.2.1", "@formatjs/intl-relativetimeformat": "^5.2.6", "@fortawesome/fontawesome-free": "^5.13.0", - "@keystonehq/bc-ur-registry-eth": "^0.6.8", - "@keystonehq/metamask-airgapped-keyring": "0.2.1", + "@keystonehq/bc-ur-registry-eth": "^0.12.1", + "@keystonehq/metamask-airgapped-keyring": "^0.6.1", "@material-ui/core": "^4.11.0", "@metamask/contract-metadata": "^1.31.0", - "@metamask/controllers": "^30.3.0", + "@metamask/controllers": "^33.0.0", "@metamask/design-tokens": "^1.9.0", - "@metamask/eth-ledger-bridge-keyring": "^0.13.0", "@metamask/eth-json-rpc-infura": "^7.0.0", + "@metamask/eth-ledger-bridge-keyring": "^0.13.0", "@metamask/eth-token-tracker": "^4.0.0", "@metamask/etherscan-link": "^2.2.0", "@metamask/jazzicon": "^2.0.0", "@metamask/logo": "^3.1.1", "@metamask/metamask-eth-abis": "^3.0.0", "@metamask/obs-store": "^5.0.0", - "@metamask/post-message-stream": "^4.0.0", - "@metamask/providers": "^9.0.0", - "@metamask/rpc-methods": "^0.20.0", + "@metamask/post-message-stream": "^6.0.0", + "@metamask/providers": "^10.0.0", + "@metamask/rpc-methods": "^0.23.0", "@metamask/slip44": "^2.1.0", - "@metamask/smart-transactions-controller": "^2.3.1", - "@metamask/snap-controllers": "^0.20.0", - "@metamask/snap-utils": "^0.20.0", + "@metamask/smart-transactions-controller": "^3.0.0", + "@metamask/snap-controllers": "^0.23.0", + "@metamask/snap-utils": "^0.23.0", "@ngraveio/bc-ur": "^1.1.6", "@popperjs/core": "^2.4.0", "@reduxjs/toolkit": "^1.6.2", + "@segment/loosely-validate-event": "^2.0.0", "@sentry/browser": "^6.0.0", "@sentry/integrations": "^6.0.0", "@sentry/types": "^6.0.1", @@ -149,9 +138,10 @@ "@spruceid/siwe-parser": "^1.1.3", "@truffle/codec": "^0.11.18", "@truffle/decoder": "^5.1.0", + "@unstoppabledomains/resolution": "^8.3.3", + "@unstoppabledomains/tldsresolverkeys": "^2.3.9", "@zxing/browser": "^0.0.10", "@zxing/library": "0.8.0", - "analytics-node": "^3.4.0-beta.3", "await-semaphore": "^0.1.1", "base32-encode": "^1.2.0", "base64-js": "^1.5.1", @@ -166,9 +156,9 @@ "eth-block-tracker": "^6.0.0", "eth-ens-namehash": "^2.0.8", "eth-json-rpc-filters": "^4.2.1", - "eth-json-rpc-middleware": "^9.0.0", + "eth-json-rpc-middleware": "^9.0.1", "eth-keyring-controller": "^7.0.2", - "eth-lattice-keyring": "^0.12.0", + "eth-lattice-keyring": "^0.12.3", "eth-method-registry": "^2.0.0", "eth-query": "^2.1.2", "eth-rpc-errors": "^4.0.2", @@ -188,6 +178,7 @@ "globalthis": "^1.0.1", "human-standard-token-abi": "^2.0.0", "immer": "^9.0.6", + "is-retry-allowed": "^2.2.0", "jest-junit": "^14.0.1", "json-rpc-engine": "^6.1.0", "json-rpc-middleware-stream": "^2.1.1", @@ -196,7 +187,7 @@ "localforage": "^1.9.0", "lodash": "^4.17.21", "loglevel": "^1.4.1", - "luxon": "^1.26.0", + "luxon": "^3.1.0", "nanoid": "^2.1.6", "nonce-tracker": "^1.0.0", "obj-multiplex": "^1.0.0", @@ -225,6 +216,7 @@ "readable-stream": "^2.3.3", "redux": "^4.0.5", "redux-thunk": "^2.3.0", + "remove-trailing-slash": "^0.1.1", "reselect": "^3.0.1", "safe-event-emitter": "^1.0.1", "ses": "^0.12.4", @@ -246,6 +238,7 @@ "@babel/preset-react": "^7.0.0", "@babel/preset-typescript": "^7.16.7", "@babel/register": "^7.5.5", + "@ethersproject/bignumber": "^5.7.0", "@lavamoat/allow-scripts": "^2.0.3", "@lavamoat/lavapack": "^3.1.0", "@metamask/auto-changelog": "^2.1.0", @@ -256,7 +249,7 @@ "@metamask/eslint-config-typescript": "^9.0.1", "@metamask/forwarder": "^1.1.0", "@metamask/phishing-warning": "^1.2.1", - "@metamask/test-dapp": "^5.2.0", + "@metamask/test-dapp": "^5.2.1", "@sentry/cli": "^1.58.0", "@storybook/addon-a11y": "^6.5.10", "@storybook/addon-actions": "^6.5.10", @@ -302,7 +295,7 @@ "browserify": "^16.5.1", "chalk": "^3.0.0", "chokidar": "^3.5.3", - "chromedriver": "^105.0.0", + "chromedriver": "^107.0.0", "concurrently": "^5.2.0", "copy-webpack-plugin": "^6.0.3", "cross-spawn": "^7.0.3", @@ -332,11 +325,11 @@ "fast-glob": "^3.2.2", "fs-extra": "^8.1.0", "ganache": "^v7.0.4", - "geckodriver": "^1.21.0", + "geckodriver": "^3.2.0", "gh-pages": "^3.2.3", "globby": "^11.0.4", "gulp": "^4.0.2", - "gulp-autoprefixer": "^5.0.0", + "gulp-autoprefixer": "^8.0.0", "gulp-dart-sass": "^1.0.2", "gulp-livereload": "4.0.0", "gulp-rename": "^2.0.0", @@ -349,9 +342,9 @@ "history": "^5.0.0", "improved-yarn-audit": "^3.0.0", "ini": "^3.0.0", - "jest": "^29.0.0-alpha.5", + "jest": "^29.1.2", "jest-canvas-mock": "^2.3.1", - "jest-environment-jsdom": "^29.0.0-alpha.4", + "jest-environment-jsdom": "^29.1.2", "jest-it-up": "^2.0.2", "jsdom": "^11.2.0", "koa": "^2.7.0", @@ -363,7 +356,7 @@ "madge": "^5.0.1", "mocha": "^7.2.0", "mockttp": "^2.6.0", - "nock": "^9.0.14", + "nock": "^13.2.9", "node-fetch": "^2.6.1", "nyc": "^15.0.0", "patch-package": "^6.4.7", @@ -416,23 +409,6 @@ "chromedriver": true, "geckodriver": true, "react-devtools>electron": true, - "3box>ipfs-postmsg-proxy>peer-id>libp2p-crypto>libp2p-crypto-secp256k1>secp256k1": false, - "3box>ipfs>ipfs-repo>datastore-level>leveldown": false, - "3box>ipfs>ipfs-unixfs-importer>rabin-wasm>assemblyscript": false, - "3box>ipfs>ipld-ethereum>ethereumjs-account>ethereumjs-util>keccak": false, - "3box>ipfs>ipld-ethereum>ethereumjs-account>ethereumjs-util>secp256k1": false, - "3box>ipfs>ipld-ethereum>ethereumjs-block>ethereumjs-util>keccak": false, - "3box>ipfs>ipld-ethereum>ethereumjs-block>ethereumjs-util>secp256k1": false, - "3box>ipfs>ipld-ethereum>ethereumjs-tx>ethereumjs-util>keccak": false, - "3box>ipfs>ipld-ethereum>ethereumjs-tx>ethereumjs-util>secp256k1": false, - "3box>ipfs>ipld-ethereum>merkle-patricia-tree>ethereumjs-util>keccak": false, - "3box>ipfs>ipld-ethereum>merkle-patricia-tree>ethereumjs-util>secp256k1": false, - "3box>ipfs>libp2p-crypto>libp2p-crypto-secp256k1>secp256k1": false, - "3box>ipfs>libp2p-crypto>ursa-optional": false, - "3box>ipfs>prometheus-gc-stats>gc-stats": false, - "3box>orbit-db>orbit-db-cache>leveldown": false, - "3box>orbit-db>orbit-db-keystore>leveldown": false, - "3box>orbit-db>orbit-db-keystore>libp2p-crypto-secp256k1>secp256k1": false, "@eth-optimism/contracts>@ethersproject/hardware-wallets>@ledgerhq/hw-transport-node-hid>@ledgerhq/hw-transport-node-hid-noevents>node-hid": false, "@eth-optimism/contracts>@ethersproject/hardware-wallets>@ledgerhq/hw-transport-node-hid>node-hid": false, "@eth-optimism/contracts>@ethersproject/hardware-wallets>@ledgerhq/hw-transport-node-hid>usb": false, @@ -478,7 +454,8 @@ "web3>web3-core>web3-core-requestmanager>web3-providers-ws>websocket>bufferutil": false, "web3>web3-core>web3-core-requestmanager>web3-providers-ws>websocket>es5-ext": false, "web3>web3-core>web3-core-requestmanager>web3-providers-ws>websocket>utf-8-validate": false, - "web3>web3-shh": false + "web3>web3-shh": false, + "@keystonehq/metamask-airgapped-keyring>@keystonehq/base-eth-keyring>hdkey>secp256k1": false } } } diff --git a/patches/@keystonehq+bc-ur-registry+0.4.4.patch b/patches/@keystonehq+bc-ur-registry+0.5.0-alpha.5.patch similarity index 87% rename from patches/@keystonehq+bc-ur-registry+0.4.4.patch rename to patches/@keystonehq+bc-ur-registry+0.5.0-alpha.5.patch index eec0a3388e85..b99840ebf59a 100644 --- a/patches/@keystonehq+bc-ur-registry+0.4.4.patch +++ b/patches/@keystonehq+bc-ur-registry+0.5.0-alpha.5.patch @@ -40,14 +40,15 @@ index a5f9f7d..0000000 -} diff --git a/node_modules/@keystonehq/bc-ur-registry/src/CryptoAccount.ts b/node_modules/@keystonehq/bc-ur-registry/src/CryptoAccount.ts deleted file mode 100644 -index 753e535..0000000 +index e6efeeb..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/CryptoAccount.ts +++ /dev/null -@@ -1,57 +0,0 @@ +@@ -1,58 +0,0 @@ -import { CryptoOutput } from '.'; -import { decodeToDataItem, DataItem } from './lib'; -import { RegistryItem } from './RegistryItem'; -import { RegistryTypes } from './RegistryType'; +-import { DataItemMap } from './types'; - -enum Keys { - masterFingerprint = 1, @@ -70,7 +71,7 @@ index 753e535..0000000 - public getOutputDescriptors = () => this.outputDescriptors; - - public toDataItem = () => { -- const map = {}; +- const map: DataItemMap = {}; - if (this.masterFingerprint) { - map[Keys.masterFingerprint] = this.masterFingerprint.readUInt32BE(0); - } @@ -103,13 +104,14 @@ index 753e535..0000000 -} diff --git a/node_modules/@keystonehq/bc-ur-registry/src/CryptoCoinInfo.ts b/node_modules/@keystonehq/bc-ur-registry/src/CryptoCoinInfo.ts deleted file mode 100644 -index 0201682..0000000 +index 843b50c..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/CryptoCoinInfo.ts +++ /dev/null -@@ -1,58 +0,0 @@ +@@ -1,59 +0,0 @@ -import { decodeToDataItem, DataItem } from './lib'; -import { RegistryItem } from './RegistryItem'; -import { RegistryTypes } from './RegistryType'; +-import { DataItemMap } from './types'; - -enum Keys { - type = '1', @@ -143,7 +145,7 @@ index 0201682..0000000 - }; - - public toDataItem = () => { -- const map = {}; +- const map: DataItemMap = {}; - if (this.type) { - map[Keys.type] = this.type; - } @@ -167,13 +169,14 @@ index 0201682..0000000 -} diff --git a/node_modules/@keystonehq/bc-ur-registry/src/CryptoECKey.ts b/node_modules/@keystonehq/bc-ur-registry/src/CryptoECKey.ts deleted file mode 100644 -index 1e964fc..0000000 +index 54c3c4b..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/CryptoECKey.ts +++ /dev/null -@@ -1,59 +0,0 @@ +@@ -1,68 +0,0 @@ -import { decodeToDataItem, DataItem } from './lib'; -import { RegistryItem } from './RegistryItem'; -import { RegistryTypes } from './RegistryType'; +-import { DataItemMap, ICryptoKey } from './types'; - -enum Keys { - curve = 1, @@ -181,17 +184,21 @@ index 1e964fc..0000000 - data, -} - --export class CryptoECKey extends RegistryItem { +-export class CryptoECKey extends RegistryItem implements ICryptoKey { - private data: Buffer; -- private curve: number; -- private privateKey: boolean; +- private curve: number | undefined; +- private privateKey: boolean | undefined; - constructor(args: { data: Buffer; curve?: number; privateKey?: boolean }) { - super(); - this.data = args.data; - this.curve = args.curve; -- this.privateKey = args.privateKey; +- this.privateKey = args.privateKey || undefined; - } - +- isECKey = () => { +- return true; +- }; +- - public getCurve = () => this.curve || 0; - public isPrivateKey = () => this.privateKey || false; - public getData = () => this.data; @@ -201,7 +208,7 @@ index 1e964fc..0000000 - }; - - toDataItem = () => { -- const map = {}; +- const map: DataItemMap = {}; - if (this.curve) { - map[Keys.curve] = this.curve; - } @@ -212,6 +219,10 @@ index 1e964fc..0000000 - return new DataItem(map); - }; - +- getOutputDescriptorContent = () => { +- return this.data.toString('hex'); +- } +- - static fromDataItem = (dataItem: DataItem) => { - const map = dataItem.getData(); - const curve = map[Keys.curve]; @@ -232,16 +243,20 @@ index 1e964fc..0000000 -} diff --git a/node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts b/node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts deleted file mode 100644 -index bbfd331..0000000 +index 8fc2a82..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/CryptoHDKey.ts +++ /dev/null -@@ -1,210 +0,0 @@ +@@ -1,237 +0,0 @@ +-// eslint-disable-next-line @typescript-eslint/ban-ts-comment +-// @ts-ignore -import { encode } from 'bs58check'; -import { CryptoCoinInfo } from './CryptoCoinInfo'; -import { CryptoKeypath } from './CryptoKeypath'; -import { decodeToDataItem, DataItem } from './lib'; -import { RegistryItem } from './RegistryItem'; -import { RegistryTypes } from './RegistryType'; +-import { DataItemMap, ICryptoKey } from './types'; +-import { PathComponent } from './PathComponent'; - -enum Keys { - is_master = 1, @@ -274,17 +289,22 @@ index bbfd331..0000000 - name?: string; - note?: string; -}; --export class CryptoHDKey extends RegistryItem { -- private master: boolean; -- private privateKey: boolean; -- private key: Buffer; -- private chainCode: Buffer; -- private useInfo: CryptoCoinInfo; -- private origin: CryptoKeypath; -- private children: CryptoKeypath; -- private parentFingerprint: Buffer; -- private name: string; -- private note: string; +- +-export class CryptoHDKey extends RegistryItem implements ICryptoKey { +- private master?: boolean; +- private privateKey?: boolean; +- private key?: Buffer; +- private chainCode?: Buffer; +- private useInfo?: CryptoCoinInfo; +- private origin?: CryptoKeypath; +- private children?: CryptoKeypath; +- private parentFingerprint?: Buffer; +- private name?: string; +- private note?: string; +- +- isECKey = () => { +- return false; +- }; - - public getKey = () => this.key; - public getChainCode = () => this.chainCode; @@ -299,22 +319,24 @@ index bbfd331..0000000 - public getBip32Key = () => { - let version: Buffer; - let depth: number; -- let index: number; +- let index = 0; - let parentFingerprint: Buffer = Buffer.alloc(4).fill(0); -- if(this.isMaster()) { +- if (this.isMaster()) { - // version bytes defined on https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#serialization-format -- version = Buffer.from("0488ADE4", "hex") +- version = Buffer.from('0488ADE4', 'hex'); - depth = 0; - index = 0; - } else { -- depth = this.getOrigin().getComponents().length || this.getOrigin().getDepth(); -- const paths = this.getOrigin().getComponents(); +- depth = this.getOrigin()?.getComponents().length || this.getOrigin()?.getDepth() as number; +- const paths = this.getOrigin()?.getComponents() as PathComponent[]; - const lastPath = paths[paths.length - 1]; -- if(lastPath) { +- if (lastPath) { - index = lastPath.isHardened() ? lastPath.getIndex()! + 0x80000000 : lastPath.getIndex()!; -- parentFingerprint = this.getParentFingerprint(); +- if (this.getParentFingerprint()) { +- parentFingerprint = this.getParentFingerprint() as Buffer; +- } - } -- if(this.isPrivateKey()) { +- if (this.isPrivateKey()) { - version = Buffer.from('0488ADE4', 'hex'); - } else { - version = Buffer.from('0488B21E', 'hex'); @@ -326,13 +348,29 @@ index bbfd331..0000000 - indexBuffer.writeUInt32BE(index, 0); - const chainCode = this.getChainCode(); - const key = this.getKey(); -- return encode(Buffer.concat([version, depthBuffer, parentFingerprint, indexBuffer, chainCode, key])); -- } +- return encode(Buffer.concat([version, depthBuffer, parentFingerprint, indexBuffer, chainCode as Buffer, key as Buffer])); +- }; - - public getRegistryType = () => { - return RegistryTypes.CRYPTO_HDKEY; - }; - +- public getOutputDescriptorContent = () => { +- let result = ''; +- if (this.getOrigin()) { +- if (this.getOrigin()?.getSourceFingerprint() && this.getOrigin()?.getPath()) { +- result += `${this.getOrigin()?.getSourceFingerprint()?.toString('hex')}/${this.getOrigin()?.getPath()}`; +- } +- } +- result += this.getBip32Key(); +- if (this.getChildren()) { +- if (this.getChildren()?.getPath()) { +- result += `/${this.getChildren()?.getPath()}`; +- } +- } +- return result; +- }; +- - constructor(args: DeriveKeyProps | MasterKeyProps) { - super(); - if (args.isMaster) { @@ -362,7 +400,7 @@ index bbfd331..0000000 - }; - - public toDataItem = () => { -- const map = {}; +- const map: DataItemMap = {}; - if (this.master) { - map[Keys.is_master] = true; - map[Keys.key_data] = this.key; @@ -418,8 +456,8 @@ index bbfd331..0000000 - const children = map[Keys.children] - ? CryptoKeypath.fromDataItem(map[Keys.children]) - : undefined; -- let _parentFingerprint = map[Keys.parent_fingerprint]; -- let parentFingerprint: Buffer; +- const _parentFingerprint = map[Keys.parent_fingerprint]; +- let parentFingerprint: Buffer | undefined = undefined; - if (_parentFingerprint) { - parentFingerprint = Buffer.alloc(4); - parentFingerprint.writeUInt32BE(_parentFingerprint, 0); @@ -448,14 +486,15 @@ index bbfd331..0000000 -} diff --git a/node_modules/@keystonehq/bc-ur-registry/src/CryptoKeypath.ts b/node_modules/@keystonehq/bc-ur-registry/src/CryptoKeypath.ts deleted file mode 100644 -index 4babe91..0000000 +index 00146ce..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/CryptoKeypath.ts +++ /dev/null -@@ -1,95 +0,0 @@ +@@ -1,96 +0,0 @@ -import { decodeToDataItem, DataItem } from './lib'; -import { PathComponent } from './PathComponent'; -import { RegistryItem } from './RegistryItem'; -import { RegistryTypes } from './RegistryType'; +-import { DataItemMap } from './types'; - -enum Keys { - components = 1, @@ -494,16 +533,16 @@ index 4babe91..0000000 - public getDepth = () => this.depth; - - toDataItem = () => { -- const map: Record = {}; -- const components = []; +- const map: DataItemMap = {}; +- const components: (number | boolean | any[])[] = []; - this.components && - this.components.forEach((component) => { - if (component.isWildcard()) { - components.push([]); - } else { -- components.push(component.getIndex()); +- components.push(component.getIndex() as number); - } -- components.push(component.isHardened() ? true : false); +- components.push(component.isHardened()); - }); - map[Keys.components] = components; - if (this.sourceFingerprint) { @@ -533,7 +572,7 @@ index 4babe91..0000000 - } - } - const _sourceFingerprint = map[Keys.source_fingerprint]; -- let sourceFingerprint: Buffer; +- let sourceFingerprint: Buffer | undefined; - if (_sourceFingerprint) { - sourceFingerprint = Buffer.alloc(4); - sourceFingerprint.writeUInt32BE(_sourceFingerprint, 0); @@ -549,10 +588,10 @@ index 4babe91..0000000 -} diff --git a/node_modules/@keystonehq/bc-ur-registry/src/CryptoOutput.ts b/node_modules/@keystonehq/bc-ur-registry/src/CryptoOutput.ts deleted file mode 100644 -index cd3009c..0000000 +index 90abf6f..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/CryptoOutput.ts +++ /dev/null -@@ -1,114 +0,0 @@ +@@ -1,127 +0,0 @@ -import { CryptoECKey } from './CryptoECKey'; -import { CryptoHDKey } from './CryptoHDKey'; -import { decodeToDataItem, DataItem } from './lib'; @@ -599,6 +638,18 @@ index cd3009c..0000000 - - public getScriptExpressions = () => this.scriptExpressions; - +- private _toOutputDescriptor = (seIndex: number): string => { +- if (seIndex >= this.scriptExpressions.length) { +- return this.cryptoKey.getOutputDescriptorContent(); +- } else { +- return `${this.scriptExpressions[seIndex].getExpression()}(${this._toOutputDescriptor(seIndex + 1)})`; +- } +- }; +- +- public toString = () => { +- return this._toOutputDescriptor(0); +- }; +- - toDataItem = () => { - let dataItem = this.cryptoKey.toDataItem(); - if ( @@ -625,9 +676,10 @@ index cd3009c..0000000 - public static fromDataItem = (dataItem: DataItem) => { - const scriptExpressions: ScriptExpression[] = []; - let _dataItem = dataItem; +- // eslint-disable-next-line no-constant-condition - while (true) { -- let _tag = _dataItem.getTag() || undefined; -- const se = ScriptExpression.fromTag(_tag); +- let _tag = _dataItem.getTag(); +- const se = ScriptExpression.fromTag(_tag as number); - if (se) { - scriptExpressions.push(se); - if (_dataItem.getData() instanceof DataItem) { @@ -646,7 +698,7 @@ index cd3009c..0000000 - (scriptExpressions[seLength - 1].getExpression() === - ScriptExpressions.MULTISIG.getExpression() || - scriptExpressions[seLength - 1].getExpression() === -- ScriptExpressions.SORTED_MULTISIG.getExpression()); +- ScriptExpressions.SORTED_MULTISIG.getExpression()); - //TODO: judge is multi key by scriptExpressions - if (isMultiKey) { - const multiKey = MultiKey.fromDataItem(_dataItem); @@ -707,10 +759,10 @@ index 626b647..0000000 -} diff --git a/node_modules/@keystonehq/bc-ur-registry/src/Decoder/index.ts b/node_modules/@keystonehq/bc-ur-registry/src/Decoder/index.ts deleted file mode 100644 -index 0460694..0000000 +index 5d7e3fe..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/Decoder/index.ts +++ /dev/null -@@ -1,40 +0,0 @@ +@@ -1,41 +0,0 @@ -import { URDecoder } from '@ngraveio/bc-ur'; -import { - Bytes, @@ -723,6 +775,7 @@ index 0460694..0000000 - CryptoPSBT, -} from '..'; -import { RegistryTypes } from '../RegistryType'; +-import { UnknownURTypeError } from '../errors'; - -export class URRegistryDecoder extends URDecoder { - public resultRegistryType = () => { @@ -745,7 +798,7 @@ index 0460694..0000000 - case RegistryTypes.CRYPTO_ACCOUNT.getType(): - return CryptoAccount.fromCBOR(ur.cbor); - default: -- throw new Error( +- throw new UnknownURTypeError( - `#[ur-registry][Decoder][fn.resultRegistryType]: registry type ${ur.type} is not supported now`, - ); - } @@ -753,15 +806,16 @@ index 0460694..0000000 -} diff --git a/node_modules/@keystonehq/bc-ur-registry/src/MultiKey.ts b/node_modules/@keystonehq/bc-ur-registry/src/MultiKey.ts deleted file mode 100644 -index 0522fbd..0000000 +index ced19dc..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/MultiKey.ts +++ /dev/null -@@ -1,54 +0,0 @@ +@@ -1,60 +0,0 @@ -import { CryptoECKey } from './CryptoECKey'; -import { CryptoHDKey } from './CryptoHDKey'; -import { DataItem } from './lib/DataItem'; -import { RegistryItem } from './RegistryItem'; -import { RegistryType, RegistryTypes } from './RegistryType'; +-import { DataItemMap } from './types'; - -enum Keys { - threshold = 1, @@ -769,24 +823,24 @@ index 0522fbd..0000000 -} - -export class MultiKey extends RegistryItem { +- // eslint-disable-next-line @typescript-eslint/ban-ts-comment +- // @ts-ignore - getRegistryType: () => RegistryType; - - constructor( - private threshold: number, -- private ecKeys: CryptoECKey[], -- private hdKeys: CryptoHDKey[], +- private keys: (CryptoECKey | CryptoHDKey)[], - ) { - super(); - } - - getThreshold = () => this.threshold; -- getEcKeys = () => this.ecKeys as CryptoECKey[]; -- getHdKeys = () => this.hdKeys as CryptoHDKey[]; +- getKeys = () => this.keys; - - toDataItem = () => { -- const map = {}; +- const map: DataItemMap = {}; - map[Keys.threshold] = this.threshold; -- const keys: DataItem[] = [...this.ecKeys, ...this.hdKeys].map((k) => { +- const keys: DataItem[] = this.keys.map((k) => { - const dataItem = k.toDataItem(); - dataItem.setTag(k.getRegistryType().getTag()); - return dataItem; @@ -795,20 +849,25 @@ index 0522fbd..0000000 - return new DataItem(map); - }; - +- getOutputDescriptorContent = () => { +- return [this.getThreshold(), +- this.keys.map(k => k.getOutputDescriptorContent()).join(','), +- ].join(','); +- }; +- - static fromDataItem = (dataItem: DataItem) => { - const map = dataItem.getData(); - const threshold = map[Keys.threshold]; -- const keys = map[Keys.keys] as DataItem[]; -- const ecKeys = []; -- const hdKeys = []; -- keys.forEach((k) => { +- const _keys = map[Keys.keys] as DataItem[]; +- const keys: (CryptoECKey | CryptoHDKey)[] = []; +- _keys.forEach((k) => { - if (k.getTag() === RegistryTypes.CRYPTO_HDKEY.getTag()) { -- hdKeys.push(CryptoHDKey.fromDataItem(k)); +- keys.push(CryptoHDKey.fromDataItem(k)); - } else if (k.getTag() === RegistryTypes.CRYPTO_ECKEY.getTag()) { -- ecKeys.push(CryptoECKey.fromDataItem(k)); +- keys.push(CryptoECKey.fromDataItem(k)); - } - }); -- return new MultiKey(threshold, ecKeys, hdKeys); +- return new MultiKey(threshold, keys); - }; -} diff --git a/node_modules/@keystonehq/bc-ur-registry/src/PathComponent.ts b/node_modules/@keystonehq/bc-ur-registry/src/PathComponent.ts @@ -914,7 +973,7 @@ index 64637bc..0000000 -}; diff --git a/node_modules/@keystonehq/bc-ur-registry/src/ScriptExpression.ts b/node_modules/@keystonehq/bc-ur-registry/src/ScriptExpression.ts deleted file mode 100644 -index fdd3f05..0000000 +index 8fbf0db..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/ScriptExpression.ts +++ /dev/null @@ -1,26 +0,0 @@ @@ -940,16 +999,27 @@ index fdd3f05..0000000 - WITNESS_PUBLIC_KEY_HASH: new ScriptExpression(404, 'wpkh'), - COMBO: new ScriptExpression(405, 'combo'), - MULTISIG: new ScriptExpression(406, 'multi'), -- SORTED_MULTISIG: new ScriptExpression(407, 'sorted'), +- SORTED_MULTISIG: new ScriptExpression(407, 'sortedmulti'), - ADDRESS: new ScriptExpression(307, 'addr'), - RAW_SCRIPT: new ScriptExpression(408, 'raw'), -}; +diff --git a/node_modules/@keystonehq/bc-ur-registry/src/errors/index.ts b/node_modules/@keystonehq/bc-ur-registry/src/errors/index.ts +deleted file mode 100644 +index dd2b0bd..0000000 +--- a/node_modules/@keystonehq/bc-ur-registry/src/errors/index.ts ++++ /dev/null +@@ -1,5 +0,0 @@ +-export class UnknownURTypeError extends Error { +- constructor(message: string) { +- super(message); +- } +-} diff --git a/node_modules/@keystonehq/bc-ur-registry/src/index.ts b/node_modules/@keystonehq/bc-ur-registry/src/index.ts deleted file mode 100644 -index 172a1e5..0000000 +index bb07bc8..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/index.ts +++ /dev/null -@@ -1,89 +0,0 @@ +@@ -1,110 +0,0 @@ -import './patchCBOR'; - -import { CryptoHDKey } from './CryptoHDKey'; @@ -971,6 +1041,7 @@ index 172a1e5..0000000 -import { ScriptExpressions } from './ScriptExpression'; -import { PathComponent } from './PathComponent'; - +-import { RegistryItem } from './RegistryItem'; -import { RegistryTypes, RegistryType } from './RegistryType'; - -import { @@ -983,7 +1054,6 @@ index 172a1e5..0000000 -} from './lib'; - -export { DataItem } from './lib'; --export { RegistryItem } from './RegistryItem'; - -import { patchTags } from './utils'; - @@ -1014,9 +1084,12 @@ index 172a1e5..0000000 - -const extend = { - RegistryTypes, +- RegistryItem, - RegistryType, +- - decodeToDataItem, - encodeDataItem, +- - cbor, -}; - @@ -1038,6 +1111,24 @@ index 172a1e5..0000000 - extend, -}; - +-export * from './errors'; +-export * from './Decoder'; +-export * from './lib'; +-export * from './CryptoAccount' +-export * from './CryptoPSBT' +-export * from './CryptoHDKey' +-export * from './CryptoOutput' +-export * from './CryptoCoinInfo' +-export * from './CryptoECKey' +-export * from './MultiKey' +-export * from './CryptoKeypath' +-export * from './patchCBOR' +-export * from './PathComponent' +-export * from './RegistryItem' +-export * from './RegistryType' +-export * from './types' +-export * from './utils' +- -export default URlib; diff --git a/node_modules/@keystonehq/bc-ur-registry/src/lib/DataItem.ts b/node_modules/@keystonehq/bc-ur-registry/src/lib/DataItem.ts deleted file mode 100644 @@ -1070,12 +1161,54 @@ index 9727f7e..0000000 - return this.data; - }; -} +diff --git a/node_modules/@keystonehq/bc-ur-registry/src/lib/cbor-sync.d.ts b/node_modules/@keystonehq/bc-ur-registry/src/lib/cbor-sync.d.ts +deleted file mode 100644 +index 6374ba7..0000000 +--- a/node_modules/@keystonehq/bc-ur-registry/src/lib/cbor-sync.d.ts ++++ /dev/null +@@ -1,36 +0,0 @@ +-export namespace config { +- const useToJSON: boolean; +-} +-export function addWriter(format: any, writerFunction: any): void; +-export function addReader(format: any, readerFunction: any): void; +-export function encode(data: any, format: any): any; +-export function encodeDataItem(data: any, format?: any): any; +-export function decode(data: any, format: any): any; +-export function decodeToDataItem(data: any, format?: any): import("./DataItem").DataItem; +-export function addSemanticEncode(tag: any, fn: any): { +- config: { +- useToJSON: boolean; +- }; +- addWriter: (format: any, writerFunction: any) => void; +- addReader: (format: any, readerFunction: any) => void; +- encode: (data: any, format: any) => any; +- encodeDataItem: (data: any, format: any) => any; +- decode: (data: any, format: any) => any; +- decodeToDataItem: (data: any, format: any) => import("./DataItem").DataItem; +- addSemanticEncode: (tag: any, fn: any) => any; +- addSemanticDecode: (tag: any, fn: any) => any; +-}; +-export function addSemanticDecode(tag: any, fn: any): { +- config: { +- useToJSON: boolean; +- }; +- addWriter: (format: any, writerFunction: any) => void; +- addReader: (format: any, readerFunction: any) => void; +- encode: (data: any, format: any) => any; +- encodeDataItem: (data: any, format: any) => any; +- decode: (data: any, format: any) => any; +- decodeToDataItem: (data: any, format: any) => import("./DataItem").DataItem; +- addSemanticEncode: (tag: any, fn: any) => any; +- addSemanticDecode: (tag: any, fn: any) => any; +-}; +-//# sourceMappingURL=cbor-sync.d.ts.map diff --git a/node_modules/@keystonehq/bc-ur-registry/src/lib/cbor-sync.js b/node_modules/@keystonehq/bc-ur-registry/src/lib/cbor-sync.js deleted file mode 100644 -index 63e5b3a..0000000 +index df8db90..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/lib/cbor-sync.js +++ /dev/null -@@ -1,695 +0,0 @@ +@@ -1,693 +0,0 @@ -(function (global, factory) { - if (typeof define === 'function' && define.amd) { - define([], factory); @@ -1531,8 +1664,6 @@ index 63e5b3a..0000000 - semanticDecoders[tag] = fn; - return this; - }, -- Reader: Reader, -- Writer: Writer, - }; - - /** Node.js Buffers **/ @@ -1788,7 +1919,7 @@ index deb0156..0000000 -export { DataItem } from './DataItem'; diff --git a/node_modules/@keystonehq/bc-ur-registry/src/patchCBOR.ts b/node_modules/@keystonehq/bc-ur-registry/src/patchCBOR.ts deleted file mode 100644 -index b9909a7..0000000 +index 218e912..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/patchCBOR.ts +++ /dev/null @@ -1,11 +0,0 @@ @@ -1802,17 +1933,29 @@ index b9909a7..0000000 -const scriptExpressionTags = Object.values(ScriptExpressions).map((se) => - se.getTag(), -); --patchTags(registryTags.concat(scriptExpressionTags)); +-patchTags(registryTags.concat(scriptExpressionTags) as number[]); +diff --git a/node_modules/@keystonehq/bc-ur-registry/src/types.ts b/node_modules/@keystonehq/bc-ur-registry/src/types.ts +deleted file mode 100644 +index 29aa370..0000000 +--- a/node_modules/@keystonehq/bc-ur-registry/src/types.ts ++++ /dev/null +@@ -1,6 +0,0 @@ +-export interface ICryptoKey { +- isECKey: () => boolean; +- getOutputDescriptorContent: () => string; +-} +- +-export type DataItemMap = Record; diff --git a/node_modules/@keystonehq/bc-ur-registry/src/utils.ts b/node_modules/@keystonehq/bc-ur-registry/src/utils.ts deleted file mode 100644 -index ee39b78..0000000 +index e38112b..0000000 --- a/node_modules/@keystonehq/bc-ur-registry/src/utils.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { addSemanticDecode, addSemanticEncode, DataItem } from './lib'; - --const alreadyPatchedTag = []; --export const patchTags = (tags: number[]) => { +-const alreadyPatchedTag: number[] = []; +-export const patchTags = (tags: number[]): void => { - tags.forEach((tag) => { - if (alreadyPatchedTag.find((i) => i === tag)) return; - addSemanticEncode(tag, (data: any) => { diff --git a/patches/@metamask+snap-controllers+0.20.0.patch b/patches/@metamask+snap-controllers+0.20.0.patch deleted file mode 100644 index 6e1df558ce0c..000000000000 --- a/patches/@metamask+snap-controllers+0.20.0.patch +++ /dev/null @@ -1,62 +0,0 @@ -diff --git a/node_modules/@metamask/snap-controllers/dist/snaps/SnapController.js b/node_modules/@metamask/snap-controllers/dist/snaps/SnapController.js -index ad84417..158e8e6 100644 ---- a/node_modules/@metamask/snap-controllers/dist/snaps/SnapController.js -+++ b/node_modules/@metamask/snap-controllers/dist/snaps/SnapController.js -@@ -30,6 +30,7 @@ const RequestQueue_1 = require("./RequestQueue"); - const utils_3 = require("./utils"); - const Timer_1 = require("./Timer"); - exports.controllerName = 'SnapController'; -+exports.SNAP_APPROVAL_INSTALL = 'wallet_installSnap'; - exports.SNAP_APPROVAL_UPDATE = 'wallet_updateSnap'; - const TRUNCATED_SNAP_PROPERTIES = new Set([ - 'initialPermissions', -@@ -738,7 +739,7 @@ class SnapController extends controllers_1.BaseControllerV2 { - id: snapId, - versionRange, - }); -- await this.authorize(snapId); -+ await this.authorize(origin, snapId); - await this._startSnap({ - snapId, - sourceCode, -@@ -1073,18 +1074,34 @@ class SnapController extends controllers_1.BaseControllerV2 { - * @param snapId - The id of the Snap. - * @returns The snap's approvedPermissions. - */ -- async authorize(snapId) { -+ async authorize(origin, snapId) { - console.info(`Authorizing snap: ${snapId}`); - const snapsState = this.state.snaps; - const snap = snapsState[snapId]; - const { initialPermissions } = snap; - try { -- if ((0, utils_1.isNonEmptyArray)(Object.keys(initialPermissions))) { -- const processedPermissions = this.processSnapPermissions(initialPermissions); -- const [approvedPermissions] = await this.messagingSystem.call('PermissionController:requestPermissions', { origin: snapId }, processedPermissions); -- return Object.values(approvedPermissions).map((perm) => perm.parentCapability); -+ const processedPermissions = this.processSnapPermissions(initialPermissions); -+ const id = (0, nanoid_1.nanoid)(); -+ const isApproved = await this.messagingSystem.call('ApprovalController:addRequest', { -+ origin, -+ id, -+ type: exports.SNAP_APPROVAL_INSTALL, -+ requestData: { -+ // Mirror previous installation metadata -+ metadata: { id, origin: snapId, dappOrigin: origin }, -+ permissions: processedPermissions, -+ snapId, -+ }, -+ }, true); -+ if (!isApproved) { -+ throw eth_rpc_errors_1.ethErrors.provider.userRejectedRequest(); -+ } -+ if ((0, utils_1.isNonEmptyArray)(Object.keys(processedPermissions))) { -+ await this.messagingSystem.call('PermissionController:grantPermissions', { -+ approvedPermissions: processedPermissions, -+ subject: { origin: snapId }, -+ }); - } -- return []; - } - finally { - const runtime = this.getRuntimeExpect(snapId); diff --git a/patches/eth-query+2.1.2.patch b/patches/eth-query+2.1.2.patch index ea405d5f8f03..5ab82b6d5202 100644 --- a/patches/eth-query+2.1.2.patch +++ b/patches/eth-query+2.1.2.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/eth-query/index.js b/node_modules/eth-query/index.js -index 13e9f3c..303d703 100644 +index 13e9f3c..d714bb7 100644 --- a/node_modules/eth-query/index.js +++ b/node_modules/eth-query/index.js @@ -1,5 +1,6 @@ @@ -9,7 +9,7 @@ index 13e9f3c..303d703 100644 module.exports = EthQuery -@@ -63,7 +64,9 @@ EthQuery.prototype.submitHashrate = generateFnFor('eth_subm +@@ -63,7 +64,10 @@ EthQuery.prototype.submitHashrate = generateFnFor('eth_subm EthQuery.prototype.sendAsync = function(opts, cb){ const self = this @@ -17,6 +17,7 @@ index 13e9f3c..303d703 100644 + const payload = createPayload(opts) + debug('making request %o', payload) + self.currentProvider.sendAsync(payload, function(err, response){ ++ debug('got err = %o, response = %o', err, response) if (!err && response.error) err = new Error('EthQuery - RPC Error - '+response.error.message) if (err) return cb(err) cb(null, response.result) diff --git a/patches/ethereumjs-util+7.1.5.patch b/patches/ethereumjs-util+7.1.5.patch new file mode 100644 index 000000000000..d8d4a9142bd7 --- /dev/null +++ b/patches/ethereumjs-util+7.1.5.patch @@ -0,0 +1,48 @@ +diff --git a/node_modules/ethereumjs-util/dist.browser/internal.js b/node_modules/ethereumjs-util/dist.browser/internal.js +index 9f3888b..3803958 100644 +--- a/node_modules/ethereumjs-util/dist.browser/internal.js ++++ b/node_modules/ethereumjs-util/dist.browser/internal.js +@@ -43,8 +43,9 @@ exports.isHexPrefixed = isHexPrefixed; + * @returns the string without 0x prefix + */ + var stripHexPrefix = function (str) { +- if (typeof str !== 'string') +- throw new Error("[stripHexPrefix] input must be type 'string', received ".concat(typeof str)); ++ if (typeof str !== 'string'){ ++ return str; ++ } + return isHexPrefixed(str) ? str.slice(2) : str; + }; + exports.stripHexPrefix = stripHexPrefix; +diff --git a/node_modules/ethereumjs-util/dist/internal.js b/node_modules/ethereumjs-util/dist/internal.js +index 01a90a0..9f1d8cd 100644 +--- a/node_modules/ethereumjs-util/dist/internal.js ++++ b/node_modules/ethereumjs-util/dist/internal.js +@@ -43,8 +43,9 @@ exports.isHexPrefixed = isHexPrefixed; + * @returns the string without 0x prefix + */ + const stripHexPrefix = (str) => { +- if (typeof str !== 'string') +- throw new Error(`[stripHexPrefix] input must be type 'string', received ${typeof str}`); ++ if (typeof str !== 'string'){ ++ return str; ++ } + return isHexPrefixed(str) ? str.slice(2) : str; + }; + exports.stripHexPrefix = stripHexPrefix; +diff --git a/node_modules/ethereumjs-util/src/internal.ts b/node_modules/ethereumjs-util/src/internal.ts +index 52032f5..8f6f5f8 100644 +--- a/node_modules/ethereumjs-util/src/internal.ts ++++ b/node_modules/ethereumjs-util/src/internal.ts +@@ -42,8 +42,9 @@ export function isHexPrefixed(str: string): boolean { + * @returns the string without 0x prefix + */ + export const stripHexPrefix = (str: string): string => { +- if (typeof str !== 'string') +- throw new Error(`[stripHexPrefix] input must be type 'string', received ${typeof str}`) ++ if (typeof str !== 'string') { ++ return str; ++ } + + return isHexPrefixed(str) ? str.slice(2) : str + } diff --git a/patches/luxon+1.26.0.patch b/patches/luxon+3.1.0.patch similarity index 61% rename from patches/luxon+1.26.0.patch rename to patches/luxon+3.1.0.patch index 6c448221673b..0cb7a6e659c5 100644 --- a/patches/luxon+1.26.0.patch +++ b/patches/luxon+3.1.0.patch @@ -1,20 +1,22 @@ diff --git a/node_modules/luxon/build/cjs-browser/luxon.js b/node_modules/luxon/build/cjs-browser/luxon.js -index 206a47a..5556d1d 100644 +index 9ab2b9f..14c2891 100644 --- a/node_modules/luxon/build/cjs-browser/luxon.js +++ b/node_modules/luxon/build/cjs-browser/luxon.js -@@ -7243,13 +7243,13 @@ var DateTime = /*#__PURE__*/function () { +@@ -7373,7 +7373,7 @@ var DateTime = /*#__PURE__*/function () { */ ; -- _proto.toLocaleString = function toLocaleString(opts) { -+ Reflect.defineProperty(_proto, 'toLocaleString', { value: function toLocaleString(opts) { - if (opts === void 0) { - opts = DATE_SHORT; +- _proto.toLocaleString = function toLocaleString(formatOpts, opts) { ++ Reflect.defineProperty(_proto, 'toLocaleString', { value: function toLocaleString(formatOpts, opts) { + if (formatOpts === void 0) { + formatOpts = DATE_SHORT; + } +@@ -7383,7 +7383,7 @@ var DateTime = /*#__PURE__*/function () { } - return this.isValid ? Formatter.create(this.loc.clone(opts), opts).formatDateTime(this) : INVALID$2; + return this.isValid ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this) : INVALID; - } + }}) /** * Returns an array of format "parts", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output. - * Defaults to the system's locale if no locale has been specified \ No newline at end of file + * Defaults to the system's locale if no locale has been specified diff --git a/patches/secp256k1+3.8.0.patch b/patches/secp256k1+3.8.0.patch deleted file mode 100644 index e44de3f04e1a..000000000000 --- a/patches/secp256k1+3.8.0.patch +++ /dev/null @@ -1,37 +0,0 @@ -lazy precompute for faster module initialization - -diff --git a/node_modules/secp256k1/lib/js/ecpointg.js b/node_modules/secp256k1/lib/js/ecpointg.js -index 0144364..09a87c5 100644 ---- a/node_modules/secp256k1/lib/js/ecpointg.js -+++ b/node_modules/secp256k1/lib/js/ecpointg.js -@@ -8,11 +8,12 @@ function ECPointG () { - this.x = BN.fromBuffer(Buffer.from('79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798', 'hex')) - this.y = BN.fromBuffer(Buffer.from('483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8', 'hex')) - this.inf = false -- -- this._precompute() -+ this.precomputed = undefined - } - - ECPointG.prototype._precompute = function () { -+ if (this.precomputed !== undefined) return -+ - var ecpoint = new ECPoint(this.x, this.y) - - var dstep = 4 -@@ -34,6 +35,7 @@ ECPointG.prototype._precompute = function () { - } - - ECPointG.prototype.mul = function (num) { -+ this._precompute() - // Algorithm 3.42 Fixed-base NAF windowing method for point multiplication - var step = this.precomputed.doubles.step - var points = this.precomputed.doubles.points -@@ -68,6 +70,7 @@ ECPointG.prototype.mul = function (num) { - } - - ECPointG.prototype.mulAdd = function (k1, p2, k2) { -+ this._precompute() - var nafPointsP1 = this.precomputed.naf - var nafPointsP2 = p2._getNAFPoints1() - var wnd = [nafPointsP1.points, nafPointsP2.points] diff --git a/shared/constants/alarms.js b/shared/constants/alarms.js new file mode 100644 index 000000000000..730fdd826ac7 --- /dev/null +++ b/shared/constants/alarms.js @@ -0,0 +1,3 @@ +export const AUTO_LOCK_TIMEOUT_ALARM = 'AUTO_LOCK_TIMEOUT_ALARM'; +export const METAMETRICS_FINALIZE_EVENT_FRAGMENT_ALARM = + 'METAMETRICS_FINALIZE_EVENT_FRAGMENT_ALARM'; diff --git a/shared/constants/app.ts b/shared/constants/app.ts index 496d48434597..017e4a347886 100644 --- a/shared/constants/app.ts +++ b/shared/constants/app.ts @@ -57,6 +57,14 @@ export const MESSAGE_TYPE = { ///: END:ONLY_INCLUDE_IN } as const; +/** + * Custom messages to send and be received by the extension + */ +export const EXTENSION_MESSAGES = { + CONNECTION_READY: 'CONNECTION_READY', + READY: 'METAMASK_EXTENSION_READY', +} as const; + /** * The different kinds of subjects that MetaMask may interact with, including * third parties and itself (e.g. when the background communicated with the UI). diff --git a/shared/constants/hardware-wallets.js b/shared/constants/hardware-wallets.js index 48bc65d3d176..981c2cf4835e 100644 --- a/shared/constants/hardware-wallets.js +++ b/shared/constants/hardware-wallets.js @@ -3,12 +3,11 @@ * keyring types. Both simple and HD are treated as default but we do special * case accounts managed by a hardware wallet. */ -export const KEYRING_TYPES = { +export const HARDWARE_KEYRING_TYPES = { LEDGER: 'Ledger Hardware', TREZOR: 'Trezor Hardware', LATTICE: 'Lattice Hardware', QR: 'QR Hardware Wallet Device', - IMPORTED: 'Simple Key Pair', }; export const DEVICE_NAMES = { @@ -48,3 +47,28 @@ export const TRANSPORT_STATES = { DEVICE_OPEN_FAILURE: 'DEVICE_OPEN_FAILURE', UNKNOWN_FAILURE: 'UNKNOWN_FAILURE', }; + +export const AFFILIATE_LINKS = { + LEDGER: 'https://shop.ledger.com/?r=17c4991a03fa', + GRIDPLUS: 'https://gridplus.io/?afmc=7p', + TREZOR: + 'https://shop.trezor.io/product/trezor-one-black?offer_id=35&aff_id=11009', + KEYSTONE: + 'https://shop.keyst.one/?rfsn=6088257.656b3e9&utm_source=refersion&utm_medium=affiliate&utm_campaign=6088257.656b3e9', + AIRGAP: 'https://airgap.it/', + COOLWALLET: 'https://www.coolwallet.io/', + DCENT: 'https://dcentwallet.com/', +}; + +export const AFFILIATE_TUTORIAL_LINKS = { + LEDGER: + 'https://support.ledger.com/hc/en-us/articles/4404366864657-Set-up-and-use-MetaMask-to-access-your-Ledger-Ethereum-ETH-account?docs=true', + GRIDPLUS: 'https://docs.gridplus.io/setup/metamask', + TREZOR: 'https://wiki.trezor.io/Apps:MetaMask', + KEYSTONE: + 'https://support.keyst.one/3rd-party-wallets/eth-and-web3-wallets-keystone/bind-metamask-with-keystone', + AIRGAP: 'https://support.airgap.it/guides/metamask/', + COOLWALLET: 'https://www.coolwallet.io/metamask-step-by-step-guides/', + DCENT: + 'https://medium.com/dcentwallet/dcent-wallet-now-supports-qr-based-protocol-to-link-with-metamask-57555f02603f', +}; diff --git a/shared/constants/keyrings.js b/shared/constants/keyrings.js new file mode 100644 index 000000000000..bcbd179539f7 --- /dev/null +++ b/shared/constants/keyrings.js @@ -0,0 +1,7 @@ +import { HARDWARE_KEYRING_TYPES } from './hardware-wallets'; + +export const KEYRING_TYPES = { + HD_KEY_TREE: 'HD Key Tree', + IMPORTED: 'Simple Key Pair', + ...HARDWARE_KEYRING_TYPES, +}; diff --git a/shared/constants/metametrics.js b/shared/constants/metametrics.js index 78990d81b0d1..f30dc56c2af9 100644 --- a/shared/constants/metametrics.js +++ b/shared/constants/metametrics.js @@ -178,8 +178,8 @@ * identify the new number_of_tokens trait * @property {'opensea_api_enabled'} OPENSEA_API_ENABLED - when the OpenSea API is enabled * we identify the opensea_api_enabled trait - * @property {'three_box_enabled'} THREE_BOX_ENABLED - when 3box feature is - * toggled we identify the 3box_enabled trait + * @property {'three_box_enabled'} THREE_BOX_ENABLED - When 3Box feature is + * toggled we identify the 3box_enabled trait. This trait has been deprecated. * @property {'theme'} THEME - when the user's theme changes we identify the theme trait * @property {'token_detection_enabled'} TOKEN_DETECTION_ENABLED - when token detection feature is toggled we * identify the token_detection_enabled trait @@ -231,8 +231,8 @@ export const TRAITS = { * the user has across all networks and accounts. * @property {boolean} [opensea_api_enabled] - does the user have the OpenSea * API enabled? - * @property {boolean} [three_box_enabled] - does the user have 3box sync - * enabled? + * @property {boolean} [three_box_enabled] - Does the user have 3box sync + * enabled? (deprecated) * @property {string} [theme] - which theme the user has selected * @property {boolean} [token_detection_enabled] - does the user have token detection is enabled? */ diff --git a/shared/constants/network.ts b/shared/constants/network.ts index 45a7d7d0339a..a94617b8638e 100644 --- a/shared/constants/network.ts +++ b/shared/constants/network.ts @@ -23,11 +23,6 @@ type CurrencySymbol = typeof CURRENCY_SYMBOLS[keyof typeof CURRENCY_SYMBOLS]; */ type SupportedCurrencySymbol = typeof SUPPORTED_CURRENCY_SYMBOLS[keyof typeof SUPPORTED_CURRENCY_SYMBOLS]; -/** - * For certain specific situations we need the above type, but with all symbols - * in lowercase format. - */ -type LowercaseCurrencySymbol = Lowercase; /** * Test networks have special symbols that combine the network name and 'ETH' * so that they are distinct from mainnet and other networks that use 'ETH'. @@ -40,7 +35,7 @@ export type TestNetworkCurrencySymbol = * inform the MoonPay API which network the user is attempting to onramp into. * This type reflects those possible values. */ -type MoonPayNetworkAbbreviation = 'bsc' | 'cchain' | 'polygon'; +type MoonPayNetworkAbbreviation = 'BSC' | 'CCHAIN' | 'POLYGON'; /** * MoonPay requires some settings that are configured per network that it is @@ -49,25 +44,20 @@ type MoonPayNetworkAbbreviation = 'bsc' | 'cchain' | 'polygon'; type MoonPayChainSettings = { /** * What should the default onramp currency be, for example 'eth' on 'mainnet' - * This type matches a single LowercaseCurrencySymbol or a - * LowercaseCurrencySymbol and a MoonPayNetworkAbbreviation joined by a '_'. + * This type matches a single SupportedCurrencySymbol or a + * SupportedCurrencySymbol and a MoonPayNetworkAbbreviation joined by a '_'. */ defaultCurrencyCode: - | LowercaseCurrencySymbol - | `${LowercaseCurrencySymbol}_${MoonPayNetworkAbbreviation}`; + | SupportedCurrencySymbol + | `${SupportedCurrencySymbol}_${MoonPayNetworkAbbreviation}`; /** * We must also configure all possible onramp currencies we wish to support. - * This type matches 1 to 3 LowercaseCurrencySymbols, joined by ','. It also - * matches 1 or 2 LowercaseCurrencySymbols with a - * MoonPayNetworkAbbreviation joined by a '_', and concatenated with ','. + * This type matches either an array of SupportedCurrencySymbol or + * an array of SupportedCurrencySymbol and a MoonPayNetworkAbbreviation joined by a '_'. */ showOnlyCurrencies: - | `${LowercaseCurrencySymbol}` - | `${LowercaseCurrencySymbol},${LowercaseCurrencySymbol}` - | `${LowercaseCurrencySymbol},${LowercaseCurrencySymbol},${LowercaseCurrencySymbol}` - | `${LowercaseCurrencySymbol},${LowercaseCurrencySymbol},${LowercaseCurrencySymbol},${LowercaseCurrencySymbol}` - | `${LowercaseCurrencySymbol}_${MoonPayNetworkAbbreviation}` - | `${LowercaseCurrencySymbol}_${MoonPayNetworkAbbreviation},${LowercaseCurrencySymbol}_${MoonPayNetworkAbbreviation}`; + | SupportedCurrencySymbol[] + | `${SupportedCurrencySymbol}_${MoonPayNetworkAbbreviation}`[]; }; /** @@ -123,6 +113,10 @@ type WyreChainSettings = { * The native currency for the network */ currencyCode: CurrencySymbol; + /** + * The list of supported currencies for the Wyre onramp provider + */ + currencies: SupportedCurrencySymbol[]; }; /** @@ -166,11 +160,8 @@ type BuyableChainSettings = { */ export const NETWORK_TYPES = { GOERLI: 'goerli', - KOVAN: 'kovan', LOCALHOST: 'localhost', MAINNET: 'mainnet', - RINKEBY: 'rinkeby', - ROPSTEN: 'ropsten', RPC: 'rpc', SEPOLIA: 'sepolia', } as const; @@ -195,10 +186,7 @@ export const NETWORK_NAMES = { */ export const NETWORK_IDS = { MAINNET: '1', - ROPSTEN: '3', - RINKEBY: '4', GOERLI: '5', - KOVAN: '42', LOCALHOST: '1337', SEPOLIA: '11155111', } as const; @@ -209,10 +197,7 @@ export const NETWORK_IDS = { */ export const CHAIN_IDS = { MAINNET: '0x1', - ROPSTEN: '0x3', - RINKEBY: '0x4', GOERLI: '0x5', - KOVAN: '0x2a', LOCALHOST: '0x539', BSC: '0x38', OPTIMISM: '0xa', @@ -225,6 +210,7 @@ export const CHAIN_IDS = { HARMONY: '0x63564c40', PALM: '0x2a15c308d', SEPOLIA: '0xaa36a7', + AURORA: '0x4e454152', } as const; /** @@ -233,9 +219,6 @@ export const CHAIN_IDS = { */ export const MAX_SAFE_CHAIN_ID = 4503599627370476; -export const ROPSTEN_DISPLAY_NAME = 'Ropsten'; -export const RINKEBY_DISPLAY_NAME = 'Rinkeby'; -export const KOVAN_DISPLAY_NAME = 'Kovan'; export const MAINNET_DISPLAY_NAME = 'Ethereum Mainnet'; export const GOERLI_DISPLAY_NAME = 'Goerli'; export const SEPOLIA_DISPLAY_NAME = 'Sepolia'; @@ -250,6 +233,7 @@ export const OPTIMISM_DISPLAY_NAME = 'Optimism'; export const FANTOM_DISPLAY_NAME = 'Fantom Opera'; export const HARMONY_DISPLAY_NAME = 'Harmony Mainnet Shard 0'; export const PALM_DISPLAY_NAME = 'Palm'; +export const AURORA_DISPLAY_NAME = 'Aurora Mainnet'; export const infuraProjectId = process.env.INFURA_PROJECT_ID; export const getRpcUrl = ({ @@ -261,13 +245,6 @@ export const getRpcUrl = ({ }) => `https://${network}.infura.io/v3/${excludeProjectId ? '' : infuraProjectId}`; -export const ROPSTEN_RPC_URL = getRpcUrl({ - network: NETWORK_TYPES.ROPSTEN, -}); -export const RINKEBY_RPC_URL = getRpcUrl({ - network: NETWORK_TYPES.RINKEBY, -}); -export const KOVAN_RPC_URL = getRpcUrl({ network: NETWORK_TYPES.KOVAN }); export const MAINNET_RPC_URL = getRpcUrl({ network: NETWORK_TYPES.MAINNET, }); @@ -282,6 +259,7 @@ export const LOCALHOST_RPC_URL = 'http://localhost:8545'; */ export const CURRENCY_SYMBOLS = { ARBITRUM: 'ETH', + AURORA: 'Aurora ETH', AVALANCHE: 'AVAX', BNB: 'BNB', BUSD: 'BUSD', @@ -296,6 +274,7 @@ export const CURRENCY_SYMBOLS = { USDC: 'USDC', USDT: 'USDT', WETH: 'WETH', + OPTIMISM: 'OP', } as const; /** @@ -318,6 +297,9 @@ const SUPPORTED_CURRENCY_SYMBOLS = { ASM: 'ASM', AUCTION: 'AUCTION', AXS: 'AXS', + AVAX: 'AVAX', + AVAXC: 'AVAXC', + AVAXCUSDC: 'AVAXCUSDC', BADGER: 'BADGER', BAL: 'BAL', BAND: 'BAND', @@ -349,8 +331,11 @@ const SUPPORTED_CURRENCY_SYMBOLS = { GRT: 'GRT', GTC: 'GTC', GTH: 'GTH', + GUSD: 'GUSD', + GYEN: 'GYEN', HEX: 'HEX', IOTX: 'IOTX', + IMX: 'IMX', JASMY: 'JASMY', KEEP: 'KEEP', KNC: 'KNC', @@ -366,11 +351,13 @@ const SUPPORTED_CURRENCY_SYMBOLS = { MKR: 'MKR', MLN: 'MLN', MTL: 'MTL', + MUSDC: 'mUSDC', NKN: 'NKN', NMR: 'NMR', NU: 'NU', OGN: 'OGN', OMG: 'OMG', + ORN: 'ORN', OXT: 'OXT', PAX: 'PAX', PERP: 'PERP', @@ -391,6 +378,7 @@ const SUPPORTED_CURRENCY_SYMBOLS = { SHIB: 'SHIB', SKL: 'SKL', SNX: 'SNX', + SPA: 'SPA', STETH: 'STETH', STORJ: 'STORJ', SUKU: 'SUKU', @@ -404,13 +392,16 @@ const SUPPORTED_CURRENCY_SYMBOLS = { TXL: 'TXL', UMA: 'UMA', UNI: 'UNI', + USDS: 'USDS', VRA: 'VRA', WBTC: 'WBTC', WCFG: 'WCFG', XYO: 'XYO', YFII: 'YFII', + YFI: 'YFI', YLD: 'YLD', ZRX: 'ZRX', + ZUSD: 'ZUSD', } as const; export const ETH_TOKEN_IMAGE_URL = './images/eth_logo.svg'; @@ -423,21 +414,16 @@ export const FTM_TOKEN_IMAGE_URL = './images/fantom-opera.svg'; export const HARMONY_ONE_TOKEN_IMAGE_URL = './images/harmony-one.svg'; export const OPTIMISM_TOKEN_IMAGE_URL = './images/optimism.svg'; export const PALM_TOKEN_IMAGE_URL = './images/palm.svg'; +export const AURORA_TOKEN_IMAGE_URL = './images/aurora.png'; export const INFURA_PROVIDER_TYPES = [ - NETWORK_TYPES.ROPSTEN, - NETWORK_TYPES.RINKEBY, - NETWORK_TYPES.KOVAN, NETWORK_TYPES.MAINNET, NETWORK_TYPES.GOERLI, NETWORK_TYPES.SEPOLIA, ]; export const TEST_CHAINS = [ - CHAIN_IDS.ROPSTEN, - CHAIN_IDS.RINKEBY, CHAIN_IDS.GOERLI, - CHAIN_IDS.KOVAN, CHAIN_IDS.SEPOLIA, CHAIN_IDS.LOCALHOST, ]; @@ -451,15 +437,6 @@ export const TEST_NETWORK_TICKER_MAP: { 'localhost' | 'mainnet' | 'rpc' >]: `${Capitalize}${typeof CURRENCY_SYMBOLS.ETH}`; } = { - [NETWORK_TYPES.ROPSTEN]: `${typedCapitalize(NETWORK_TYPES.ROPSTEN)}${ - CURRENCY_SYMBOLS.ETH - }`, - [NETWORK_TYPES.RINKEBY]: `${typedCapitalize(NETWORK_TYPES.RINKEBY)}${ - CURRENCY_SYMBOLS.ETH - }`, - [NETWORK_TYPES.KOVAN]: `${typedCapitalize(NETWORK_TYPES.KOVAN)}${ - CURRENCY_SYMBOLS.ETH - }`, [NETWORK_TYPES.GOERLI]: `${typedCapitalize(NETWORK_TYPES.GOERLI)}${ CURRENCY_SYMBOLS.ETH }`, @@ -472,21 +449,6 @@ export const TEST_NETWORK_TICKER_MAP: { * Map of all build-in Infura networks to their network, ticker and chain IDs. */ export const BUILT_IN_NETWORKS = { - [NETWORK_TYPES.ROPSTEN]: { - networkId: NETWORK_IDS.ROPSTEN, - chainId: CHAIN_IDS.ROPSTEN, - ticker: TEST_NETWORK_TICKER_MAP[NETWORK_TYPES.ROPSTEN], - }, - [NETWORK_TYPES.RINKEBY]: { - networkId: NETWORK_IDS.RINKEBY, - chainId: CHAIN_IDS.RINKEBY, - ticker: TEST_NETWORK_TICKER_MAP[NETWORK_TYPES.RINKEBY], - }, - [NETWORK_TYPES.KOVAN]: { - networkId: NETWORK_IDS.KOVAN, - chainId: CHAIN_IDS.KOVAN, - ticker: TEST_NETWORK_TICKER_MAP[NETWORK_TYPES.KOVAN], - }, [NETWORK_TYPES.GOERLI]: { networkId: NETWORK_IDS.GOERLI, chainId: CHAIN_IDS.GOERLI, @@ -508,25 +470,16 @@ export const BUILT_IN_NETWORKS = { } as const; export const NETWORK_TO_NAME_MAP = { - [NETWORK_TYPES.ROPSTEN]: ROPSTEN_DISPLAY_NAME, - [NETWORK_TYPES.RINKEBY]: RINKEBY_DISPLAY_NAME, - [NETWORK_TYPES.KOVAN]: KOVAN_DISPLAY_NAME, [NETWORK_TYPES.MAINNET]: MAINNET_DISPLAY_NAME, [NETWORK_TYPES.GOERLI]: GOERLI_DISPLAY_NAME, [NETWORK_TYPES.SEPOLIA]: SEPOLIA_DISPLAY_NAME, [NETWORK_TYPES.LOCALHOST]: LOCALHOST_DISPLAY_NAME, - [NETWORK_IDS.ROPSTEN]: ROPSTEN_DISPLAY_NAME, - [NETWORK_IDS.RINKEBY]: RINKEBY_DISPLAY_NAME, - [NETWORK_IDS.KOVAN]: KOVAN_DISPLAY_NAME, [NETWORK_IDS.GOERLI]: GOERLI_DISPLAY_NAME, [NETWORK_IDS.SEPOLIA]: SEPOLIA_DISPLAY_NAME, [NETWORK_IDS.MAINNET]: MAINNET_DISPLAY_NAME, [NETWORK_IDS.LOCALHOST]: LOCALHOST_DISPLAY_NAME, - [CHAIN_IDS.ROPSTEN]: ROPSTEN_DISPLAY_NAME, - [CHAIN_IDS.RINKEBY]: RINKEBY_DISPLAY_NAME, - [CHAIN_IDS.KOVAN]: KOVAN_DISPLAY_NAME, [CHAIN_IDS.GOERLI]: GOERLI_DISPLAY_NAME, [CHAIN_IDS.SEPOLIA]: SEPOLIA_DISPLAY_NAME, [CHAIN_IDS.MAINNET]: MAINNET_DISPLAY_NAME, @@ -537,16 +490,10 @@ export const CHAIN_ID_TO_TYPE_MAP = { [CHAIN_IDS.MAINNET]: NETWORK_TYPES.MAINNET, [CHAIN_IDS.GOERLI]: NETWORK_TYPES.GOERLI, [CHAIN_IDS.SEPOLIA]: NETWORK_TYPES.SEPOLIA, - [CHAIN_IDS.KOVAN]: NETWORK_TYPES.KOVAN, [CHAIN_IDS.LOCALHOST]: NETWORK_TYPES.LOCALHOST, - [CHAIN_IDS.RINKEBY]: NETWORK_TYPES.RINKEBY, - [CHAIN_IDS.ROPSTEN]: NETWORK_TYPES.ROPSTEN, } as const; export const CHAIN_ID_TO_RPC_URL_MAP = { - [CHAIN_IDS.ROPSTEN]: ROPSTEN_RPC_URL, - [CHAIN_IDS.RINKEBY]: RINKEBY_RPC_URL, - [CHAIN_IDS.KOVAN]: KOVAN_RPC_URL, [CHAIN_IDS.GOERLI]: GOERLI_RPC_URL, [CHAIN_IDS.SEPOLIA]: SEPOLIA_RPC_URL, [CHAIN_IDS.MAINNET]: MAINNET_RPC_URL, @@ -563,11 +510,10 @@ export const CHAIN_ID_TO_NETWORK_IMAGE_URL_MAP = { [CHAIN_IDS.HARMONY]: HARMONY_ONE_TOKEN_IMAGE_URL, [CHAIN_IDS.OPTIMISM]: OPTIMISM_TOKEN_IMAGE_URL, [CHAIN_IDS.PALM]: PALM_TOKEN_IMAGE_URL, + [CHAIN_IDS.AURORA]: AURORA_TOKEN_IMAGE_URL, } as const; export const NETWORK_ID_TO_ETHERS_NETWORK_NAME_MAP = { - [NETWORK_IDS.ROPSTEN]: NETWORK_TYPES.ROPSTEN, - [NETWORK_IDS.RINKEBY]: NETWORK_TYPES.RINKEBY, [NETWORK_IDS.GOERLI]: NETWORK_TYPES.GOERLI, [NETWORK_IDS.SEPOLIA]: NETWORK_TYPES.SEPOLIA, [NETWORK_IDS.MAINNET]: NETWORK_NAMES.HOMESTEAD, @@ -577,10 +523,7 @@ export const CHAIN_ID_TO_NETWORK_ID_MAP = { [CHAIN_IDS.MAINNET]: NETWORK_IDS.MAINNET, [CHAIN_IDS.GOERLI]: NETWORK_IDS.GOERLI, [CHAIN_IDS.SEPOLIA]: NETWORK_IDS.SEPOLIA, - [CHAIN_IDS.KOVAN]: NETWORK_IDS.KOVAN, [CHAIN_IDS.LOCALHOST]: NETWORK_IDS.LOCALHOST, - [CHAIN_IDS.RINKEBY]: NETWORK_IDS.RINKEBY, - [CHAIN_IDS.ROPSTEN]: NETWORK_IDS.ROPSTEN, } as const; export const NATIVE_CURRENCY_TOKEN_IMAGE_MAP = { @@ -589,6 +532,7 @@ export const NATIVE_CURRENCY_TOKEN_IMAGE_MAP = { [CURRENCY_SYMBOLS.BNB]: BNB_TOKEN_IMAGE_URL, [CURRENCY_SYMBOLS.MATIC]: MATIC_TOKEN_IMAGE_URL, [CURRENCY_SYMBOLS.AVALANCHE]: AVAX_TOKEN_IMAGE_URL, + [CURRENCY_SYMBOLS.OPTIMISM]: OPTIMISM_TOKEN_IMAGE_URL, } as const; export const INFURA_BLOCKED_KEY = 'countryBlocked'; @@ -641,9 +585,7 @@ export const BUYABLE_CHAINS_MAP: { | typeof CHAIN_IDS.LOCALHOST | typeof CHAIN_IDS.PALM | typeof CHAIN_IDS.HARMONY - | typeof CHAIN_IDS.OPTIMISM | typeof CHAIN_IDS.OPTIMISM_TESTNET - | typeof CHAIN_IDS.ARBITRUM >]: BuyableChainSettings; } = { [CHAIN_IDS.MAINNET]: { @@ -685,12 +627,46 @@ export const BUYABLE_CHAINS_MAP: { SUPPORTED_CURRENCY_SYMBOLS.YLD, ], moonPay: { - defaultCurrencyCode: 'eth', - showOnlyCurrencies: 'eth,usdt,usdc,dai', + defaultCurrencyCode: SUPPORTED_CURRENCY_SYMBOLS.ETH, + showOnlyCurrencies: [ + SUPPORTED_CURRENCY_SYMBOLS.ETH, + SUPPORTED_CURRENCY_SYMBOLS.USDT, + SUPPORTED_CURRENCY_SYMBOLS.USDC, + SUPPORTED_CURRENCY_SYMBOLS.DAI, + SUPPORTED_CURRENCY_SYMBOLS.MATIC, + SUPPORTED_CURRENCY_SYMBOLS.ORN, + SUPPORTED_CURRENCY_SYMBOLS.WETH, + SUPPORTED_CURRENCY_SYMBOLS.IMX, + ], }, wyre: { srn: 'ethereum', currencyCode: CURRENCY_SYMBOLS.ETH, + currencies: [ + SUPPORTED_CURRENCY_SYMBOLS.ETH, + SUPPORTED_CURRENCY_SYMBOLS.AAVE, + SUPPORTED_CURRENCY_SYMBOLS.BAT, + SUPPORTED_CURRENCY_SYMBOLS.BUSD, + SUPPORTED_CURRENCY_SYMBOLS.COMP, + SUPPORTED_CURRENCY_SYMBOLS.CRV, + SUPPORTED_CURRENCY_SYMBOLS.DAI, + SUPPORTED_CURRENCY_SYMBOLS.GUSD, + SUPPORTED_CURRENCY_SYMBOLS.GYEN, + SUPPORTED_CURRENCY_SYMBOLS.LINK, + SUPPORTED_CURRENCY_SYMBOLS.MKR, + SUPPORTED_CURRENCY_SYMBOLS.PAX, + SUPPORTED_CURRENCY_SYMBOLS.RAI, + SUPPORTED_CURRENCY_SYMBOLS.SNX, + SUPPORTED_CURRENCY_SYMBOLS.UMA, + SUPPORTED_CURRENCY_SYMBOLS.UNI, + SUPPORTED_CURRENCY_SYMBOLS.USDC, + SUPPORTED_CURRENCY_SYMBOLS.USDS, + SUPPORTED_CURRENCY_SYMBOLS.USDT, + SUPPORTED_CURRENCY_SYMBOLS.WBTC, + SUPPORTED_CURRENCY_SYMBOLS.WETH, + SUPPORTED_CURRENCY_SYMBOLS.YFI, + SUPPORTED_CURRENCY_SYMBOLS.ZUSD, + ], }, coinbasePayCurrencies: [ SUPPORTED_CURRENCY_SYMBOLS.ETH, @@ -793,14 +769,6 @@ export const BUYABLE_CHAINS_MAP: { SUPPORTED_CURRENCY_SYMBOLS.ZRX, ], }, - [CHAIN_IDS.ROPSTEN]: { - nativeCurrency: TEST_NETWORK_TICKER_MAP[NETWORK_TYPES.ROPSTEN], - network: BUYABLE_CHAIN_ETHEREUM_NETWORK_NAME, - }, - [CHAIN_IDS.RINKEBY]: { - nativeCurrency: TEST_NETWORK_TICKER_MAP[NETWORK_TYPES.RINKEBY], - network: BUYABLE_CHAIN_ETHEREUM_NETWORK_NAME, - }, [CHAIN_IDS.GOERLI]: { nativeCurrency: TEST_NETWORK_TICKER_MAP[NETWORK_TYPES.GOERLI], network: BUYABLE_CHAIN_ETHEREUM_NETWORK_NAME, @@ -809,10 +777,6 @@ export const BUYABLE_CHAINS_MAP: { nativeCurrency: TEST_NETWORK_TICKER_MAP[NETWORK_TYPES.SEPOLIA], network: BUYABLE_CHAIN_ETHEREUM_NETWORK_NAME, }, - [CHAIN_IDS.KOVAN]: { - nativeCurrency: TEST_NETWORK_TICKER_MAP[NETWORK_TYPES.KOVAN], - network: BUYABLE_CHAIN_ETHEREUM_NETWORK_NAME, - }, [CHAIN_IDS.BSC]: { nativeCurrency: CURRENCY_SYMBOLS.BNB, network: 'bsc', @@ -821,8 +785,11 @@ export const BUYABLE_CHAINS_MAP: { SUPPORTED_CURRENCY_SYMBOLS.BUSD, ], moonPay: { - defaultCurrencyCode: 'bnb_bsc', - showOnlyCurrencies: 'bnb_bsc,busd_bsc', + defaultCurrencyCode: `${SUPPORTED_CURRENCY_SYMBOLS.BNB}_BSC`, + showOnlyCurrencies: [ + `${SUPPORTED_CURRENCY_SYMBOLS.BNB}_BSC`, + `${SUPPORTED_CURRENCY_SYMBOLS.BUSD}_BSC`, + ], }, }, [CHAIN_IDS.POLYGON]: { @@ -835,12 +802,19 @@ export const BUYABLE_CHAINS_MAP: { SUPPORTED_CURRENCY_SYMBOLS.DAI, ], moonPay: { - defaultCurrencyCode: 'matic_polygon', - showOnlyCurrencies: 'matic_polygon,usdc_polygon', + defaultCurrencyCode: `${SUPPORTED_CURRENCY_SYMBOLS.BNB}_POLYGON`, + showOnlyCurrencies: [ + `${SUPPORTED_CURRENCY_SYMBOLS.MATIC}_POLYGON`, + `${SUPPORTED_CURRENCY_SYMBOLS.USDC}_POLYGON`, + ], }, wyre: { srn: 'matic', currencyCode: CURRENCY_SYMBOLS.MATIC, + currencies: [ + SUPPORTED_CURRENCY_SYMBOLS.MATIC, + SUPPORTED_CURRENCY_SYMBOLS.MUSDC, + ], }, }, [CHAIN_IDS.AVALANCHE]: { @@ -848,12 +822,17 @@ export const BUYABLE_CHAINS_MAP: { network: 'avaxcchain', transakCurrencies: [SUPPORTED_CURRENCY_SYMBOLS.AVALANCHE], moonPay: { - defaultCurrencyCode: 'avax_cchain', - showOnlyCurrencies: 'avax_cchain', + defaultCurrencyCode: `${SUPPORTED_CURRENCY_SYMBOLS.AVAX}_CCHAIN`, + showOnlyCurrencies: [`${SUPPORTED_CURRENCY_SYMBOLS.AVAX}_CCHAIN`], }, wyre: { srn: 'avalanche', currencyCode: CURRENCY_SYMBOLS.AVALANCHE, + currencies: [ + SUPPORTED_CURRENCY_SYMBOLS.AVALANCHE, + SUPPORTED_CURRENCY_SYMBOLS.AVAXC, + SUPPORTED_CURRENCY_SYMBOLS.AVAXCUSDC, + ], }, coinbasePayCurrencies: [SUPPORTED_CURRENCY_SYMBOLS.AVALANCHE], }, @@ -867,10 +846,33 @@ export const BUYABLE_CHAINS_MAP: { network: 'celo', transakCurrencies: [SUPPORTED_CURRENCY_SYMBOLS.CELO], moonPay: { - defaultCurrencyCode: 'celo', - showOnlyCurrencies: 'celo', + defaultCurrencyCode: SUPPORTED_CURRENCY_SYMBOLS.CELO, + showOnlyCurrencies: [SUPPORTED_CURRENCY_SYMBOLS.CELO], }, }, + [CHAIN_IDS.OPTIMISM]: { + nativeCurrency: CURRENCY_SYMBOLS.ETH, + network: 'optimism', + transakCurrencies: [ + SUPPORTED_CURRENCY_SYMBOLS.ETH, + SUPPORTED_CURRENCY_SYMBOLS.USDC, + ], + }, + [CHAIN_IDS.ARBITRUM]: { + nativeCurrency: CURRENCY_SYMBOLS.ARBITRUM, + network: 'arbitrum', + transakCurrencies: [ + SUPPORTED_CURRENCY_SYMBOLS.ARBITRUM, + SUPPORTED_CURRENCY_SYMBOLS.SPA, + SUPPORTED_CURRENCY_SYMBOLS.USDC, + SUPPORTED_CURRENCY_SYMBOLS.USDS, + ], + }, + [CHAIN_IDS.AURORA]: { + nativeCurrency: CURRENCY_SYMBOLS.AURORA, + network: 'aurora', + transakCurrencies: [SUPPORTED_CURRENCY_SYMBOLS.AURORA], + }, }; export const FEATURED_RPCS: RPCDefinition[] = [ @@ -884,6 +886,16 @@ export const FEATURED_RPCS: RPCDefinition[] = [ imageUrl: AETH_TOKEN_IMAGE_URL, }, }, + { + chainId: CHAIN_IDS.AURORA, + nickname: AURORA_DISPLAY_NAME, + rpcUrl: `https://aurora-mainnet.infura.io/v3/${infuraProjectId}`, + ticker: CURRENCY_SYMBOLS.AURORA, + rpcPrefs: { + blockExplorerUrl: 'https://aurorascan.dev/', + imageUrl: AURORA_TOKEN_IMAGE_URL, + }, + }, { chainId: CHAIN_IDS.AVALANCHE, nickname: AVALANCHE_DISPLAY_NAME, diff --git a/shared/constants/permissions.test.js b/shared/constants/permissions.test.js index 3637fed5818a..433d6629c3b5 100644 --- a/shared/constants/permissions.test.js +++ b/shared/constants/permissions.test.js @@ -2,6 +2,7 @@ import { endowmentPermissionBuilders } from '@metamask/snap-controllers'; import { restrictedMethodPermissionBuilders } from '@metamask/rpc-methods'; import { EndowmentPermissions, + ExcludedSnapEndowments, ExcludedSnapPermissions, RestrictedMethods, } from './permissions'; @@ -9,7 +10,9 @@ import { describe('EndowmentPermissions', () => { it('has the expected permission keys', () => { expect(Object.keys(EndowmentPermissions).sort()).toStrictEqual( - Object.keys(endowmentPermissionBuilders).sort(), + Object.keys(endowmentPermissionBuilders) + .filter((targetKey) => !ExcludedSnapEndowments.has(targetKey)) + .sort(), ); }); }); diff --git a/shared/constants/permissions.ts b/shared/constants/permissions.ts index e2eeb6e1f1c0..dbd39b51e69b 100644 --- a/shared/constants/permissions.ts +++ b/shared/constants/permissions.ts @@ -8,16 +8,15 @@ export const RestrictedMethods = Object.freeze({ snap_confirm: 'snap_confirm', snap_notify: 'snap_notify', snap_manageState: 'snap_manageState', + snap_getBip32PublicKey: 'snap_getBip32PublicKey', snap_getBip32Entropy: 'snap_getBip32Entropy', snap_getBip44Entropy: 'snap_getBip44Entropy', - 'snap_getBip44Entropy_*': 'snap_getBip44Entropy_*', 'wallet_snap_*': 'wallet_snap_*', ///: END:ONLY_INCLUDE_IN } as const); ///: BEGIN:ONLY_INCLUDE_IN(flask) export const PermissionNamespaces = Object.freeze({ - snap_getBip44Entropy_: 'snap_getBip44Entropy_*', wallet_snap_: 'wallet_snap_*', } as const); @@ -25,8 +24,10 @@ export const EndowmentPermissions = Object.freeze({ 'endowment:network-access': 'endowment:network-access', 'endowment:long-running': 'endowment:long-running', 'endowment:transaction-insight': 'endowment:transaction-insight', + 'endowment:cronjob': 'endowment:cronjob', } as const); // Methods / permissions in external packages that we are temporarily excluding. -export const ExcludedSnapPermissions = new Set([]); +export const ExcludedSnapPermissions = new Set(['snap_dialog']); +export const ExcludedSnapEndowments = new Set(['endowment:keyring']); ///: END:ONLY_INCLUDE_IN diff --git a/shared/constants/swaps.js b/shared/constants/swaps.js index 22629bc1ac2b..37f9e30d2503 100644 --- a/shared/constants/swaps.js +++ b/shared/constants/swaps.js @@ -1,4 +1,5 @@ import { + ETH_TOKEN_IMAGE_URL, TEST_ETH_TOKEN_IMAGE_URL, BNB_TOKEN_IMAGE_URL, MATIC_TOKEN_IMAGE_URL, @@ -23,7 +24,7 @@ export const ETH_SWAPS_TOKEN_OBJECT = { name: 'Ether', address: DEFAULT_TOKEN_ADDRESS, decimals: 18, - iconUrl: './images/black-eth-logo.svg', + iconUrl: ETH_TOKEN_IMAGE_URL, }; export const BNB_SWAPS_TOKEN_OBJECT = { @@ -66,6 +67,10 @@ export const GOERLI_SWAPS_TOKEN_OBJECT = { iconUrl: TEST_ETH_TOKEN_IMAGE_URL, }; +export const ARBITRUM_SWAPS_TOKEN_OBJECT = { ...ETH_SWAPS_TOKEN_OBJECT }; + +export const OPTIMISM_SWAPS_TOKEN_OBJECT = { ...ETH_SWAPS_TOKEN_OBJECT }; + // A gas value for ERC20 approve calls that should be sufficient for all ERC20 approve implementations export const DEFAULT_ERC20_APPROVE_GAS = '0x1d4c0'; @@ -77,8 +82,9 @@ const BSC_CONTRACT_ADDRESS = '0x1a1ec25dc08e98e5e93f1104b5e5cdd298707d31'; // It's the same as we use for BSC. const POLYGON_CONTRACT_ADDRESS = '0x1a1ec25dc08e98e5e93f1104b5e5cdd298707d31'; - const AVALANCHE_CONTRACT_ADDRESS = '0x1a1ec25dc08e98e5e93f1104b5e5cdd298707d31'; +const OPTIMISM_CONTRACT_ADDRESS = '0x9dDA6Ef3D919c9bC8885D5560999A3640431e8e6'; +const ARBITRUM_CONTRACT_ADDRESS = '0x9dDA6Ef3D919c9bC8885D5560999A3640431e8e6'; export const WETH_CONTRACT_ADDRESS = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'; @@ -91,6 +97,11 @@ export const WMATIC_CONTRACT_ADDRESS = export const WAVAX_CONTRACT_ADDRESS = '0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7'; +export const WETH_OPTIMISM_CONTRACT_ADDRESS = + '0x4200000000000000000000000000000000000006'; +export const WETH_ARBITRUM_CONTRACT_ADDRESS = + '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1'; + const SWAPS_TESTNET_CHAIN_ID = '0x539'; export const SWAPS_API_V2_BASE_URL = 'https://swap.metaswap.codefi.network'; @@ -105,6 +116,8 @@ const MAINNET_DEFAULT_BLOCK_EXPLORER_URL = 'https://etherscan.io/'; const GOERLI_DEFAULT_BLOCK_EXPLORER_URL = 'https://goerli.etherscan.io/'; const POLYGON_DEFAULT_BLOCK_EXPLORER_URL = 'https://polygonscan.com/'; const AVALANCHE_DEFAULT_BLOCK_EXPLORER_URL = 'https://snowtrace.io/'; +const OPTIMISM_DEFAULT_BLOCK_EXPLORER_URL = 'https://optimistic.etherscan.io/'; +const ARBITRUM_DEFAULT_BLOCK_EXPLORER_URL = 'https://arbiscan.io/'; export const ALLOWED_PROD_SWAPS_CHAIN_IDS = [ CHAIN_IDS.MAINNET, @@ -112,6 +125,8 @@ export const ALLOWED_PROD_SWAPS_CHAIN_IDS = [ CHAIN_IDS.BSC, CHAIN_IDS.POLYGON, CHAIN_IDS.AVALANCHE, + CHAIN_IDS.OPTIMISM, + CHAIN_IDS.ARBITRUM, ]; export const ALLOWED_DEV_SWAPS_CHAIN_IDS = [ @@ -131,6 +146,8 @@ export const SWAPS_CHAINID_CONTRACT_ADDRESS_MAP = { [CHAIN_IDS.POLYGON]: POLYGON_CONTRACT_ADDRESS, [CHAIN_IDS.GOERLI]: TESTNET_CONTRACT_ADDRESS, [CHAIN_IDS.AVALANCHE]: AVALANCHE_CONTRACT_ADDRESS, + [CHAIN_IDS.OPTIMISM]: OPTIMISM_CONTRACT_ADDRESS, + [CHAIN_IDS.ARBITRUM]: ARBITRUM_CONTRACT_ADDRESS, }; export const SWAPS_WRAPPED_TOKENS_ADDRESSES = { @@ -140,6 +157,8 @@ export const SWAPS_WRAPPED_TOKENS_ADDRESSES = { [CHAIN_IDS.POLYGON]: WMATIC_CONTRACT_ADDRESS, [CHAIN_IDS.GOERLI]: WETH_GOERLI_CONTRACT_ADDRESS, [CHAIN_IDS.AVALANCHE]: WAVAX_CONTRACT_ADDRESS, + [CHAIN_IDS.OPTIMISM]: WETH_OPTIMISM_CONTRACT_ADDRESS, + [CHAIN_IDS.ARBITRUM]: WETH_ARBITRUM_CONTRACT_ADDRESS, }; export const ALLOWED_CONTRACT_ADDRESSES = { @@ -167,6 +186,14 @@ export const ALLOWED_CONTRACT_ADDRESSES = { SWAPS_CHAINID_CONTRACT_ADDRESS_MAP[CHAIN_IDS.AVALANCHE], SWAPS_WRAPPED_TOKENS_ADDRESSES[CHAIN_IDS.AVALANCHE], ], + [CHAIN_IDS.OPTIMISM]: [ + SWAPS_CHAINID_CONTRACT_ADDRESS_MAP[CHAIN_IDS.OPTIMISM], + SWAPS_WRAPPED_TOKENS_ADDRESSES[CHAIN_IDS.OPTIMISM], + ], + [CHAIN_IDS.ARBITRUM]: [ + SWAPS_CHAINID_CONTRACT_ADDRESS_MAP[CHAIN_IDS.ARBITRUM], + SWAPS_WRAPPED_TOKENS_ADDRESSES[CHAIN_IDS.ARBITRUM], + ], }; export const SWAPS_CHAINID_DEFAULT_TOKEN_MAP = { @@ -176,6 +203,8 @@ export const SWAPS_CHAINID_DEFAULT_TOKEN_MAP = { [CHAIN_IDS.POLYGON]: MATIC_SWAPS_TOKEN_OBJECT, [CHAIN_IDS.GOERLI]: GOERLI_SWAPS_TOKEN_OBJECT, [CHAIN_IDS.AVALANCHE]: AVAX_SWAPS_TOKEN_OBJECT, + [CHAIN_IDS.OPTIMISM]: OPTIMISM_SWAPS_TOKEN_OBJECT, + [CHAIN_IDS.ARBITRUM]: ARBITRUM_SWAPS_TOKEN_OBJECT, }; export const SWAPS_CHAINID_DEFAULT_BLOCK_EXPLORER_URL_MAP = { @@ -184,6 +213,8 @@ export const SWAPS_CHAINID_DEFAULT_BLOCK_EXPLORER_URL_MAP = { [CHAIN_IDS.POLYGON]: POLYGON_DEFAULT_BLOCK_EXPLORER_URL, [CHAIN_IDS.GOERLI]: GOERLI_DEFAULT_BLOCK_EXPLORER_URL, [CHAIN_IDS.AVALANCHE]: AVALANCHE_DEFAULT_BLOCK_EXPLORER_URL, + [CHAIN_IDS.OPTIMISM]: OPTIMISM_DEFAULT_BLOCK_EXPLORER_URL, + [CHAIN_IDS.ARBITRUM]: ARBITRUM_DEFAULT_BLOCK_EXPLORER_URL, }; export const ETHEREUM = 'ethereum'; @@ -191,6 +222,8 @@ export const POLYGON = 'polygon'; export const BSC = 'bsc'; export const GOERLI = 'goerli'; export const AVALANCHE = 'avalanche'; +export const OPTIMISM = 'optimism'; +export const ARBITRUM = 'arbitrum'; export const SWAPS_CLIENT_ID = 'extension'; diff --git a/shared/constants/tokens.js b/shared/constants/tokens.js index c846fff183b8..ef9e7f76aac5 100644 --- a/shared/constants/tokens.js +++ b/shared/constants/tokens.js @@ -12,11 +12,11 @@ export const LISTED_CONTRACT_ADDRESSES = Object.keys(contractMap).map( /** * @typedef {object} TokenDetails * @property {string} address - The address of the selected 'TOKEN' or - * 'COLLECTIBLE' contract. + * 'NFT' contract. * @property {string} [symbol] - The symbol of the token. * @property {number} [decimals] - The number of decimals of the selected * 'ERC20' asset. - * @property {number} [tokenId] - The id of the selected 'COLLECTIBLE' asset. + * @property {number} [tokenId] - The id of the selected 'NFT' asset. * @property {TokenStandardStrings} [standard] - The standard of the selected * asset. * @property {boolean} [isERC721] - True when the asset is a ERC721 token. diff --git a/shared/constants/transaction.js b/shared/constants/transaction.js index 9564f066cb90..37c2e45e3b96 100644 --- a/shared/constants/transaction.js +++ b/shared/constants/transaction.js @@ -364,7 +364,7 @@ export const TRANSACTION_EVENTS = { * @property {'NATIVE'} NATIVE - The native asset for the current network, such * as ETH * @property {'TOKEN'} TOKEN - An ERC20 token. - * @property {'COLLECTIBLE'} COLLECTIBLE - An ERC721 or ERC1155 token. + * @property {'NFT'} NFT - An ERC721 or ERC1155 token. * @property {'UNKNOWN'} UNKNOWN - A transaction interacting with a contract * that isn't a token method interaction will be marked as dealing with an * unknown asset type. @@ -385,7 +385,7 @@ export const TRANSACTION_EVENTS = { export const ASSET_TYPES = { NATIVE: 'NATIVE', TOKEN: 'TOKEN', - COLLECTIBLE: 'COLLECTIBLE', + NFT: 'NFT', UNKNOWN: 'UNKNOWN', }; diff --git a/shared/constants/uns.js b/shared/constants/uns.js new file mode 100644 index 000000000000..6244c8fdc53d --- /dev/null +++ b/shared/constants/uns.js @@ -0,0 +1,27 @@ +export const ALLOWED_UNSTOPPABLE_TLDS = [ + '.crypto', + '.x', + '.nft', + '.wallet', + '.dao', + '.bitcoin', + '.blockchain', + '.888', + '.zil', + ]; + '.wallet', + '.crypto', + '.x', + '.nft', + '.coin', + '.dao', + '.bitcoin', + '.blockchain', + '.888', + '.zil', +]; + + export const RESPONSE_JSON = { + "version":"2.1.8","information":{"description":"This file describes all resolver keys with a defined meaning and related metadata used by Unstoppable Domains UNS Registry","documentation":"https://docs.unstoppabledomains.com/developer-toolkit/records-reference/","contribution":"https://github.com/unstoppabledomains/uns/blob/main/resolver-keys.json"},"keys":{"crypto.BTC.address":{"deprecatedKeyName":"BTC","deprecated":false,"validationRegex":"^bc1[ac-hj-np-z02-9]{6,87}$|^[13][a-km-zA-HJ-NP-Z1-9]{25,39}$"},"crypto.B2M.version.MATIC.address":{"deprecatedKeyName":"B2M_MATIC","validationRegex":"^0x[a-zA-Z0-9]*$","deprecated":false},"crypto.B2M.version.BEP20.address":{"deprecatedKeyName":"B2M_BEP20","validationRegex":"^0x[a-zA-Z0-9]*$","deprecated":false},"crypto.B2M.version.ERC20.address":{"deprecatedKeyName":"B2M_ERC20","validationRegex":"^0x[a-zA-Z0-9]*$","deprecated":false},"crypto.ETH.address":{"deprecatedKeyName":"ETH","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.ZIL.address":{"deprecatedKeyName":"ZIL","deprecated":false,"validationRegex":"^zil1[qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}$"},"crypto.LTC.address":{"deprecatedKeyName":"LTC","deprecated":false,"validationRegex":"^[LM3][a-km-zA-HJ-NP-Z1-9]{26,33}$|^ltc1[a-zA-HJ-NP-Z0-9]{25,39}$"},"crypto.ETC.address":{"deprecatedKeyName":"ETC","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.EQL.address":{"deprecatedKeyName":"EQL","deprecated":false,"validationRegex":"^bnb[0-9a-z]{39}$"},"crypto.LINK.address":{"deprecatedKeyName":"LINK","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.USDC.address":{"deprecatedKeyName":"USDC","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.BAT.address":{"deprecatedKeyName":"BAT","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.REP.address":{"deprecatedKeyName":"REP","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.ZRX.address":{"deprecatedKeyName":"ZRX","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.DAI.address":{"deprecatedKeyName":"DAI","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.BCH.address":{"deprecatedKeyName":"BCH","deprecated":false,"validationRegex":"^[13][a-km-zA-HJ-NP-Z1-9]{33}$|^((bitcoincash|bchreg|bchtest):)?(q|p)[a-z0-9]{41}$|^((BITCOINCASH:)?(Q|P)[A-Z0-9]{41})$"},"crypto.XMR.address":{"deprecatedKeyName":"XMR","deprecated":false,"validationRegex":"^[48]{1}[0-9AB][1-9A-HJ-NP-Za-km-z]{93}$"},"crypto.DASH.address":{"deprecatedKeyName":"DASH","deprecated":false,"validationRegex":"^X[1-9A-HJ-NP-Za-km-z]{33}$"},"crypto.NEO.address":{"deprecatedKeyName":"NEO","deprecated":false,"validationRegex":"^A[0-9a-zA-Z]{33}$"},"crypto.SWTH.address":{"deprecatedKeyName":"SWTH","deprecated":false,"validationRegex":"^A[0-9a-zA-Z]{33}$"},"crypto.DOGE.address":{"deprecatedKeyName":"DOGE","deprecated":false,"validationRegex":"^D[5-9A-HJ-NP-U]{1}[1-9A-HJ-NP-Za-km-z]{32}$"},"crypto.XRP.address":{"deprecatedKeyName":"XRP","deprecated":false,"validationRegex":"^r[1-9a-km-zA-HJ-NP-Z]{24,34}$"},"crypto.ZEC.address":{"deprecatedKeyName":"ZEC","deprecated":false,"validationRegex":"^z([a-zA-Z0-9]){94}$|^zs1([a-zA-Z0-9]){75}$|^t([a-zA-Z0-9]){34}$"},"crypto.YEC.address":{"deprecatedKeyName":"YEC","deprecated":false,"validationRegex":"^y([a-zA-Z0-9]){94}$|^ys1([a-zA-Z0-9]){75}$|^s([a-zA-Z0-9]){34}$"},"crypto.ADA.address":{"deprecatedKeyName":"ADA","deprecated":false,"validationRegex":"^[1-9a-km-zA-HJ-NP-Z]{104}$|^A[1-9A-HJ-NP-Za-km-z]{58}$|^addr[0-9a-zA-Z]{99}$"},"crypto.EOS.address":{"deprecatedKeyName":"EOS","deprecated":false,"validationRegex":"^[a-z][a-z1-5.]{10}[a-z1-5]$"},"crypto.XLM.address":{"deprecatedKeyName":"XLM","deprecated":false,"validationRegex":"^G[A-Z2-7]{55}$"},"crypto.BNB.address":{"deprecatedKeyName":"BNB","deprecated":false,"validationRegex":"^bnb[0-9a-z]{39}$"},"crypto.BTG.address":{"deprecatedKeyName":"BTG","deprecated":false,"validationRegex":"^[GA][a-km-zA-HJ-NP-Z1-9]{33}$"},"crypto.NANO.address":{"deprecatedKeyName":"NANO","deprecated":false,"validationRegex":"^nano_[1-9a-z]{60}$"},"crypto.WAVES.address":{"deprecatedKeyName":"WAVES","deprecated":false,"validationRegex":"^3[a-km-zA-HJ-NP-Z1-9]{34}$"},"crypto.KMD.address":{"deprecatedKeyName":"KMD","deprecated":false,"validationRegex":"^R[a-km-zA-Z1-9]{33}$"},"crypto.AE.address":{"deprecatedKeyName":"AE","deprecated":false,"validationRegex":"^ak_[a-km-zA-Z1-9]{48,52}$"},"crypto.RSK.address":{"deprecatedKeyName":"RSK","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.WAN.address":{"deprecatedKeyName":"WAN","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.STRAT.address":{"deprecatedKeyName":"STRAT","deprecated":false,"validationRegex":"^S[a-km-zA-HJ-NP-Z1-9]{33}$"},"crypto.UBQ.address":{"deprecatedKeyName":"UBQ","deprecated":false,"validationRegex":"^0x[a-km-zA-HJ-NP-Z0-9]{40}$"},"crypto.XTZ.address":{"deprecatedKeyName":"XTZ","deprecated":false,"validationRegex":"^(tz|KT)[a-km-zA-HJ-NP-Z1-9]{34}$"},"crypto.IOTA.address":{"deprecatedKeyName":"IOTA","deprecated":false,"validationRegex":"^[A-Z0-9]{90}$|^iota1[a-z0-9]{59}$"},"crypto.VET.address":{"deprecatedKeyName":"VET","deprecated":false,"validationRegex":"^0x[a-km-zA-HJ-NP-Z0-9]{40}$"},"crypto.QTUM.address":{"deprecatedKeyName":"QTUM","deprecated":false,"validationRegex":"^Q[a-km-zA-HJ-NP-Z1-9]{33}$"},"crypto.ICX.address":{"deprecatedKeyName":"ICX","deprecated":false,"validationRegex":"^[a-km-zA-HJ-NP-Z0-9]{42}$"},"crypto.DGB.address":{"deprecatedKeyName":"DGB","deprecated":false,"validationRegex":"(^[a-km-zA-HJ-NP-Z1-9]{34}$)|(^[a-zA-Z1-9]{42}$)|(^dgb1[a-zA-Z0-9]{39}$)"},"crypto.XZC.address":{"deprecatedKeyName":"XZC","deprecated":false,"validationRegex":"^[a-km-zA-HJ-NP-Z1-9]{34}$"},"crypto.BURST.address":{"deprecatedKeyName":"BURST","deprecated":false,"validationRegex":"^BURST-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{5}"},"crypto.DCR.address":{"deprecatedKeyName":"DCR","deprecated":false,"validationRegex":"^D[a-zA-Z0-9]*$"},"crypto.XEM.address":{"deprecatedKeyName":"XEM","deprecated":false,"validationRegex":"^N[ABCDEFGHIJKLMNOPQRSTUVWXYZ234567]{39}$"},"crypto.LSK.address":{"deprecatedKeyName":"LSK","deprecated":false,"validationRegex":"^\\d{1,21}[L]$"},"crypto.ATOM.address":{"deprecatedKeyName":"ATOM","deprecated":false,"validationRegex":"^(cosmos)1([qpzry9x8gf2tvdw0s3jn54khce6mua7l]+)$"},"crypto.ONG.address":{"deprecatedKeyName":"ONG","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.ONT.address":{"deprecatedKeyName":"ONT","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.SMART.address":{"deprecatedKeyName":"SMART","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.TPAY.address":{"deprecatedKeyName":"TPAY","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.GRS.address":{"deprecatedKeyName":"GRS","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.BSV.address":{"deprecatedKeyName":"BSV","deprecated":false,"validationRegex":"^bitcoincash:[a-zA-Z0-9]{42}$"},"crypto.GAS.address":{"deprecatedKeyName":"GAS","deprecated":false,"validationRegex":"^[a-zA-Z0-9]*$"},"crypto.TRX.address":{"deprecatedKeyName":"TRX","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.VTHO.address":{"deprecatedKeyName":"VTHO","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{42}$"},"crypto.BCD.address":{"deprecatedKeyName":"BCD","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.BTT.address":{"deprecatedKeyName":"BTT","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.KIN.address":{"deprecatedKeyName":"KIN","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{56}$"},"crypto.RVN.address":{"deprecatedKeyName":"RVN","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.ARK.address":{"deprecatedKeyName":"ARK","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.XVG.address":{"deprecatedKeyName":"XVG","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.ALGO.address":{"deprecatedKeyName":"ALGO","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{58}$"},"crypto.NEBL.address":{"deprecatedKeyName":"NEBL","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.XPM.address":{"deprecatedKeyName":"XPM","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.ONE.address":{"deprecatedKeyName":"ONE","deprecated":false,"validationRegex":"^one[a-zA-Z0-9]{39}$"},"crypto.BNTY.address":{"deprecatedKeyName":"BNTY","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.CRO.address":{"deprecatedKeyName":"CRO","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.TWT.address":{"deprecatedKeyName":"TWT","deprecated":false,"validationRegex":"^bnb[0-9a-z]{39}$"},"crypto.SIERRA.address":{"deprecatedKeyName":"SIERRA","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{34}$"},"crypto.VSYS.address":{"deprecatedKeyName":"VSYS","deprecated":false,"validationRegex":"^[a-zA-Z0-9]{35}$"},"crypto.HIVE.address":{"deprecatedKeyName":"HIVE","validationRegex":"^(?!s*$).+","deprecated":false},"crypto.HT.address":{"deprecatedKeyName":"HT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.ENJ.address":{"deprecatedKeyName":"ENJ","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.YFI.address":{"deprecatedKeyName":"YFI","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MTA.address":{"deprecatedKeyName":"MTA","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.COMP.address":{"deprecatedKeyName":"COMP","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.BAL.address":{"deprecatedKeyName":"BAL","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.AMPL.address":{"deprecatedKeyName":"AMPL","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.LEND.address":{"deprecatedKeyName":"LEND","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.TLOS.address":{"deprecatedKeyName":"TLOS","validationRegex":"^[a-z][a-z1-5.]{10}[a-z1-5]$","deprecated":false},"crypto.XDC.address":{"deprecatedKeyName":"XDC","validationRegex":"^xdc[a-fA-F0-9]{40}$","deprecated":false},"crypto.XST.address":{"deprecatedKeyName":"XST","validationRegex":"(?:RwxQ3jUs2BjKhseNX1em4msn2GyV5XAec[PQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]|RwxQ3jUs2BjKhseNX1em4msn2GyV5XAe[defghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]|RwxQ3jUs2BjKhseNX1em4msn2GyV5XA[fghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{2}|RwxQ3jUs2BjKhseNX1em4msn2GyV5X[BCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{3}|RwxQ3jUs2BjKhseNX1em4msn2GyV5[YZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{4}|RwxQ3jUs2BjKhseNX1em4msn2GyV[6789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{5}|RwxQ3jUs2BjKhseNX1em4msn2Gy[WXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{6}|RwxQ3jUs2BjKhseNX1em4msn2G[z][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{7}|RwxQ3jUs2BjKhseNX1em4msn2[HJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{8}|RwxQ3jUs2BjKhseNX1em4msn[3456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{9}|RwxQ3jUs2BjKhseNX1em4ms[opqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{10}|RwxQ3jUs2BjKhseNX1em4m[tuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{11}|RwxQ3jUs2BjKhseNX1em4[nopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{12}|RwxQ3jUs2BjKhseNX1em[56789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{13}|RwxQ3jUs2BjKhseNX1e[nopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{14}|RwxQ3jUs2BjKhseNX1[fghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{15}|RwxQ3jUs2BjKhseNX[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{16}|RwxQ3jUs2BjKhseN[YZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{17}|RwxQ3jUs2BjKhse[PQRSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{18}|RwxQ3jUs2BjKhs[fghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{19}|RwxQ3jUs2BjKh[tuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{20}|RwxQ3jUs2BjK[ijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{21}|RwxQ3jUs2Bj[LMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}|RwxQ3jUs2B[kmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{23}|RwxQ3jUs2[CDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{24}|RwxQ3jUs[3456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{25}|RwxQ3jU[tuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{26}|RwxQ3j[VWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{27}|RwxQ3[kmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{28}|RwxQ[456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{29}|Rwx[RSTUVWXYZabcdefghijkmnopqrstuvwxyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{30}|Rw[yz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{31}|R[xyz][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{32}|S[123456789ABCDEFGHJKL][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{32}|SM[123456789ABCDEFGH][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{31}|SMJ11[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{29}|SMJ11[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{29}|SMJ12[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnop][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{28}|SMJ12q[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkm][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{27}|SMJ12qn[12345678][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{26}|SMJ12qn9[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghi][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{25}|SMJ12qn9j[123456789ABCDEFGHJKLM][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{24}|SMJ12qn9jN[123456789AB][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{23}|SMJ12qn9jNC[123456789AB][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}|SMJ12qn9jNCC[123456789ABCDEFGHJKLMNPQRSTUVW][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{21}|SMJ12qn9jNCCX[123456789ABCDEFGH][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{20}|SMJ12qn9jNCCXJ[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkm][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{19}|SMJ12qn9jNCCXJn[123456789ABCDEFGHJKLMNPQRS][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{18}|SMJ12qn9jNCCXJnT[123456789ABCDEFGHJKLMNPQRSTUVWX][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{17}|SMJ12qn9jNCCXJnTY[123456789ABCDEFGHJKLMNPQ][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{16}|SMJ12qn9jNCCXJnTYR[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxy][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{15}|SMJ12qn9jNCCXJnTYRz[1234][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{14}|SMJ12qn9jNCCXJnTYRz5[123456789ABCDEFGHJKLMNPQRSTUVWX][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{13}|SMJ12qn9jNCCXJnTYRz5Y[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrst][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{12}|SMJ12qn9jNCCXJnTYRz5Yu[12345678][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{11}|SMJ12qn9jNCCXJnTYRz5Yu9[123456789ABCDEFGHJKLMNPQRSTUVWXY][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{10}|SMJ12qn9jNCCXJnTYRz5Yu9Z[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcd][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{9}|SMJ12qn9jNCCXJnTYRz5Yu9Ze[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkm][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{8}|SMJ12qn9jNCCXJnTYRz5Yu9Zen[123456789ABCD][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{7}|SMJ12qn9jNCCXJnTYRz5Yu9ZenE[123456789ABCDEFGHJKLMNPQ][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{6}|SMJ12qn9jNCCXJnTYRz5Yu9ZenER[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkm][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{5}|SMJ12qn9jNCCXJnTYRz5Yu9ZenERn[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghij][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{4}|SMJ12qn9jNCCXJnTYRz5Yu9ZenERnk[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghij][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{3}|SMJ12qn9jNCCXJnTYRz5Yu9ZenERnkk[123456789ABCDEFGHJKLMNPQRST][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{2}|SMJ12qn9jNCCXJnTYRz5Yu9ZenERnkkU[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstu][123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]|SMJ12qn9jNCCXJnTYRz5Yu9ZenERnkkUv[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghi])","deprecated":false},"crypto.STRAX.address":{"deprecatedKeyName":"STRAX","validationRegex":"^X[a-km-zA-HJ-NP-Z1-9]{33}$","deprecated":false},"crypto.SIGNA.address":{"deprecatedKeyName":"SIGNA","validationRegex":"^S-((?=[A-Z2-9]{4})(?:[^IO]{4})-){3}(?=[A-Z2-9]{5})(?:[^IO]{5})$","deprecated":false},"crypto.NIM.address":{"deprecatedKeyName":"NIM","validationRegex":"^NQ[0-9]{2} ([A-Z0-9]{4} ){7}[A-Z0-9]{4}$","deprecated":false},"crypto.GUAP.address":{"deprecatedKeyName":"GUAP","validationRegex":"^(G|P)[a-zA-HJ-NP-Z0-9]{25,39}$","deprecated":false},"crypto.YLD.address":{"deprecatedKeyName":"YLD","deprecated":false,"validationRegex":"^0x[a-fA-F0-9]{40}$"},"crypto.OKT.address":{"deprecatedKeyName":"OKT","validationRegex":"^0x[a-fA-F0-9]{40}$|^ex[a-zA-HJ-NP-Z0-9]{6,90}$","deprecated":false},"crypto.ELA.version.ELA.address":{"deprecatedKeyName":"ELA_ELA","validationRegex":"E[a-zA-HJ-NP-Z0-9]{33}","deprecated":false},"crypto.ELA.version.ESC.address":{"deprecatedKeyName":"ELA_ESC","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.USDT.version.ERC20.address":{"deprecatedKeyName":"USDT_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.USDT.version.TRON.address":{"deprecatedKeyName":"USDT_TRON","validationRegex":"^[T][a-zA-HJ-NP-Z0-9]{33}$","deprecated":false},"crypto.USDT.version.EOS.address":{"deprecatedKeyName":"USDT_EOS","validationRegex":"^[a-z][a-z1-5.]{10}[a-z1-5]$","deprecated":false},"crypto.USDT.version.OMNI.address":{"deprecatedKeyName":"USDT_OMNI","validationRegex":"^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$","deprecated":false},"crypto.USDT.version.OKC.address":{"deprecatedKeyName":"USDT_OKC","validationRegex":"^0x[a-fA-F0-9]{40}$|^ex[a-zA-HJ-NP-Z0-9]{6,90}$","deprecated":false},"crypto.FTM.version.ERC20.address":{"deprecatedKeyName":"FTM_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.FTM.version.BEP2.address":{"deprecatedKeyName":"FTM_BEP2","validationRegex":"^(bnb|tbnb)[a-zA-HJ-NP-Z0-9]{39}$","deprecated":false},"crypto.FTM.version.OPERA.address":{"deprecatedKeyName":"FTM_OPERA","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.FUSE.version.ERC20.address":{"deprecatedKeyName":"FUSE_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.FUSE.version.FUSE.address":{"deprecatedKeyName":"FUSE_FUSE","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MATIC.version.MATIC.address":{"deprecatedKeyName":"MATIC_MATIC","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MATIC.version.BEP20.address":{"deprecatedKeyName":"MATIC_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MATIC.version.ERC20.address":{"deprecatedKeyName":"MATIC_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"social.payid.name":{"deprecatedKeyName":"payid","validationRegex":"^[0-9a-zA-Z]+\\$[0-9a-zA-Z]+\\.[0-9a-zA-Z]+$","deprecated":false},"social.picture.value":{"deprecatedKeyName":"picture","validationRegex":null,"deprecated":false},"whois.email.value":{"deprecatedKeyName":"email","validationRegex":"^[^@]+@[^\\.]+\\..+$","deprecated":false},"whois.for_sale.value":{"deprecatedKeyName":"for_sale","validationRegex":"(true)|(false)","deprecated":false},"ipfs.html.value":{"deprecatedKeyName":"html","validationRegex":".{0,100}","deprecated":false},"ipfs.redirect_domain.value":{"deprecatedKeyName":"redirect_domain","validationRegex":".{0,253}","deprecated":false},"dweb.ipfs.hash":{"deprecatedKeyName":"dweb_hash","validationRegex":".{0,100}","deprecated":false},"browser.redirect_url":{"deprecatedKeyName":"browser_redirect","validationRegex":".{0,253}","deprecated":false},"browser.preferred_protocols":{"deprecatedKeyName":"browser_preferred_protocols","validationRegex":null,"deprecated":false},"gundb.username.value":{"deprecatedKeyName":"gundb_username","validationRegex":null,"deprecated":false},"gundb.public_key.value":{"deprecatedKeyName":"gundb_public_key","validationRegex":null,"deprecated":false},"social.image.value":{"deprecatedKeyName":"image","validationRegex":null,"deprecated":false},"social.twitter.username":{"deprecatedKeyName":"twitter_username","validationRegex":null,"deprecated":false},"validation.social.twitter.username":{"deprecatedKeyName":"validation_twitter_username","validationRegex":null,"deprecated":false},"forwarding.url":{"deprecatedKeyName":"forwarding_url","validationRegex":"^(https?)://[^\\s/$.?#].[^\\s]*$","deprecated":false},"dns.ttl":{"deprecatedKeyName":"dns_ttl","validationRegex":null,"deprecated":false},"dns.A":{"deprecatedKeyName":"dns_A","validationRegex":null,"deprecated":false},"dns.A.ttl":{"deprecatedKeyName":"dns_A_ttl","validationRegex":null,"deprecated":false},"dns.AAAA":{"deprecatedKeyName":"dns_AAAA","validationRegex":null,"deprecated":false},"dns.AAAA.ttl":{"deprecatedKeyName":"dns_AAAA_ttl","validationRegex":null,"deprecated":false},"dns.AFSDB":{"deprecatedKeyName":"dns_AFSDB","validationRegex":null,"deprecated":false},"dns.AFSDB.ttl":{"deprecatedKeyName":"dns_AFSDB_ttl","validationRegex":null,"deprecated":false},"dns.APL":{"deprecatedKeyName":"dns_APL","validationRegex":null,"deprecated":false},"dns.APL.ttl":{"deprecatedKeyName":"dns_APL_ttl","validationRegex":null,"deprecated":false},"dns.CAA":{"deprecatedKeyName":"dns_CAA","validationRegex":null,"deprecated":false},"dns.CAA.ttl":{"deprecatedKeyName":"dns_CAA_ttl","validationRegex":null,"deprecated":false},"dns.CDNSKEY":{"deprecatedKeyName":"dns_CDNSKEY","validationRegex":null,"deprecated":false},"dns.CDNSKEY.ttl":{"deprecatedKeyName":"dns_CDNSKEY_ttl","validationRegex":null,"deprecated":false},"dns.CDS":{"deprecatedKeyName":"dns_CDS","validationRegex":null,"deprecated":false},"dns.CDS.ttl":{"deprecatedKeyName":"dns_CDS_ttl","validationRegex":null,"deprecated":false},"dns.CERT":{"deprecatedKeyName":"dns_CERT","validationRegex":null,"deprecated":false},"dns.CERT.ttl":{"deprecatedKeyName":"dns_CERT_ttl","validationRegex":null,"deprecated":false},"dns.CNAME":{"deprecatedKeyName":"dns_CNAME","validationRegex":null,"deprecated":false},"dns.CNAME.ttl":{"deprecatedKeyName":"dns_CNAME_ttl","validationRegex":null,"deprecated":false},"dns.CSYNC":{"deprecatedKeyName":"dns_CSYNC","validationRegex":null,"deprecated":false},"dns.CSYNC.ttl":{"deprecatedKeyName":"dns_CSYNC_ttl","validationRegex":null,"deprecated":false},"dns.DHCID":{"deprecatedKeyName":"dns_DHCID","validationRegex":null,"deprecated":false},"dns.DHCID.ttl":{"deprecatedKeyName":"dns_DHCID_ttl","validationRegex":null,"deprecated":false},"dns.DLV":{"deprecatedKeyName":"dns_DLV","validationRegex":null,"deprecated":false},"dns.DLV.ttl":{"deprecatedKeyName":"dns_DLV_ttl","validationRegex":null,"deprecated":false},"dns.DNAME":{"deprecatedKeyName":"dns_DNAME","validationRegex":null,"deprecated":false},"dns.DNAME.ttl":{"deprecatedKeyName":"dns_DNAME_ttl","validationRegex":null,"deprecated":false},"dns.DNSKEY":{"deprecatedKeyName":"dns_DNSKEY","validationRegex":null,"deprecated":false},"dns.DNSKEY.ttl":{"deprecatedKeyName":"dns_DNSKEY_ttl","validationRegex":null,"deprecated":false},"dns.DS":{"deprecatedKeyName":"dns_DS","validationRegex":null,"deprecated":false},"dns.DS.ttl":{"deprecatedKeyName":"dns_DS_ttl","validationRegex":null,"deprecated":false},"dns.EUI48":{"deprecatedKeyName":"dns_EUI48","validationRegex":null,"deprecated":false},"dns.EUI48.ttl":{"deprecatedKeyName":"dns_EUI48_ttl","validationRegex":null,"deprecated":false},"dns.EUI64":{"deprecatedKeyName":"dns_EUI64","validationRegex":null,"deprecated":false},"dns.EUI64.ttl":{"deprecatedKeyName":"dns_EUI64_ttl","validationRegex":null,"deprecated":false},"dns.HINFO":{"deprecatedKeyName":"dns_HINFO","validationRegex":null,"deprecated":false},"dns.HINFO.ttl":{"deprecatedKeyName":"dns_HINFO_ttl","validationRegex":null,"deprecated":false},"dns.HIP":{"deprecatedKeyName":"dns_HIP","validationRegex":null,"deprecated":false},"dns.HIP.ttl":{"deprecatedKeyName":"dns_HIP_ttl","validationRegex":null,"deprecated":false},"dns.HTTPS":{"deprecatedKeyName":"dns_HTTPS","validationRegex":null,"deprecated":false},"dns.HTTPS.ttl":{"deprecatedKeyName":"dns_HTTPS_ttl","validationRegex":null,"deprecated":false},"dns.IPSECKEY":{"deprecatedKeyName":"dns_IPSECKEY","validationRegex":null,"deprecated":false},"dns.IPSECKEY.ttl":{"deprecatedKeyName":"dns_IPSECKEY_ttl","validationRegex":null,"deprecated":false},"dns.KEY":{"deprecatedKeyName":"dns_KEY","validationRegex":null,"deprecated":false},"dns.KEY.ttl":{"deprecatedKeyName":"dns_KEY_ttl","validationRegex":null,"deprecated":false},"dns.KX":{"deprecatedKeyName":"dns_KX","validationRegex":null,"deprecated":false},"dns.KX.ttl":{"deprecatedKeyName":"dns_KX_ttl","validationRegex":null,"deprecated":false},"dns.LOC":{"deprecatedKeyName":"dns_LOC","validationRegex":null,"deprecated":false},"dns.LOC.ttl":{"deprecatedKeyName":"dns_LOC_ttl","validationRegex":null,"deprecated":false},"dns.MX":{"deprecatedKeyName":"dns_MX","validationRegex":null,"deprecated":false},"dns.MX.ttl":{"deprecatedKeyName":"dns_MX_ttl","validationRegex":null,"deprecated":false},"dns.NAPTR":{"deprecatedKeyName":"dns_NAPTR","validationRegex":null,"deprecated":false},"dns.NAPTR.ttl":{"deprecatedKeyName":"dns_NAPTR_ttl","validationRegex":null,"deprecated":false},"dns.NS":{"deprecatedKeyName":"dns_NS","validationRegex":null,"deprecated":false},"dns.NS.ttl":{"deprecatedKeyName":"dns_NS_ttl","validationRegex":null,"deprecated":false},"dns.NSEC":{"deprecatedKeyName":"dns_NSEC","validationRegex":null,"deprecated":false},"dns.NSEC.ttl":{"deprecatedKeyName":"dns_NSEC_ttl","validationRegex":null,"deprecated":false},"dns.NSEC3":{"deprecatedKeyName":"dns_NSEC3","validationRegex":null,"deprecated":false},"dns.NSEC3.ttl":{"deprecatedKeyName":"dns_NSEC3_ttl","validationRegex":null,"deprecated":false},"dns.NSEC3PARAM":{"deprecatedKeyName":"dns_NSEC3PARAM","validationRegex":null,"deprecated":false},"dns.NSEC3PARAM.ttl":{"deprecatedKeyName":"dns_NSEC3PARAM_ttl","validationRegex":null,"deprecated":false},"dns.OPENPGPKEY":{"deprecatedKeyName":"dns_OPENPGPKEY","validationRegex":null,"deprecated":false},"dns.OPENPGPKEY.ttl":{"deprecatedKeyName":"dns_OPENPGPKEY_ttl","validationRegex":null,"deprecated":false},"dns.PTR":{"deprecatedKeyName":"dns_PTR","validationRegex":null,"deprecated":false},"dns.PTR.ttl":{"deprecatedKeyName":"dns_PTR_ttl","validationRegex":null,"deprecated":false},"dns.RP":{"deprecatedKeyName":"dns_RP","validationRegex":null,"deprecated":false},"dns.RP.ttl":{"deprecatedKeyName":"dns_RP_ttl","validationRegex":null,"deprecated":false},"dns.RRSIG":{"deprecatedKeyName":"dns_RRSIG","validationRegex":null,"deprecated":false},"dns.RRSIG.ttl":{"deprecatedKeyName":"dns_RRSIG_ttl","validationRegex":null,"deprecated":false},"dns.SIG":{"deprecatedKeyName":"dns_SIG","validationRegex":null,"deprecated":false},"dns.SIG.ttl":{"deprecatedKeyName":"dns_SIG_ttl","validationRegex":null,"deprecated":false},"dns.SMIMEA":{"deprecatedKeyName":"dns_SMIMEA","validationRegex":null,"deprecated":false},"dns.SMIMEA.ttl":{"deprecatedKeyName":"dns_SMIMEA_ttl","validationRegex":null,"deprecated":false},"dns.SOA":{"deprecatedKeyName":"dns_SOA","validationRegex":null,"deprecated":false},"dns.SOA.ttl":{"deprecatedKeyName":"dns_SOA_ttl","validationRegex":null,"deprecated":false},"dns.SRV":{"deprecatedKeyName":"dns_SRV","validationRegex":null,"deprecated":false},"dns.SRV.ttl":{"deprecatedKeyName":"dns_SRV_ttl","validationRegex":null,"deprecated":false},"dns.SSHFP":{"deprecatedKeyName":"dns_SSHFP","validationRegex":null,"deprecated":false},"dns.SSHFP.ttl":{"deprecatedKeyName":"dns_SSHFP_ttl","validationRegex":null,"deprecated":false},"dns.SVCB":{"deprecatedKeyName":"dns_SVCB","validationRegex":null,"deprecated":false},"dns.SVCB.ttl":{"deprecatedKeyName":"dns_SVCB_ttl","validationRegex":null,"deprecated":false},"dns.TA":{"deprecatedKeyName":"dns_TA","validationRegex":null,"deprecated":false},"dns.TA.ttl":{"deprecatedKeyName":"dns_TA_ttl","validationRegex":null,"deprecated":false},"dns.TKEY":{"deprecatedKeyName":"dns_TKEY","validationRegex":null,"deprecated":false},"dns.TKEY.ttl":{"deprecatedKeyName":"dns_TKEY_ttl","validationRegex":null,"deprecated":false},"dns.TLSA":{"deprecatedKeyName":"dns_TLSA","validationRegex":null,"deprecated":false},"dns.TLSA.ttl":{"deprecatedKeyName":"dns_TLSA_ttl","validationRegex":null,"deprecated":false},"dns.TSIG":{"deprecatedKeyName":"dns_TSIG","validationRegex":null,"deprecated":false},"dns.TSIG.ttl":{"deprecatedKeyName":"dns_TSIG_ttl","validationRegex":null,"deprecated":false},"dns.TXT":{"deprecatedKeyName":"dns_TXT","validationRegex":null,"deprecated":false},"dns.TXT.ttl":{"deprecatedKeyName":"dns_TXT_ttl","validationRegex":null,"deprecated":false},"dns.URI":{"deprecatedKeyName":"dns_URI","validationRegex":null,"deprecated":false},"dns.URI.ttl":{"deprecatedKeyName":"dns_URI_ttl","validationRegex":null,"deprecated":false},"dns.ZONEMD":{"deprecatedKeyName":"dns_ZONEMD","validationRegex":null,"deprecated":false},"dns.ZONEMD.ttl":{"deprecatedKeyName":"dns_ZONEMD_ttl","validationRegex":null,"deprecated":false},"crypto.DOT.address":{"deprecatedKeyName":"DOT","validationRegex":"^1[a-zA-Z0-9]*$","deprecated":false},"crypto.UNI.version.ERC20.address":{"deprecatedKeyName":"UNI_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.UNI.version.BEP20.address":{"deprecatedKeyName":"UNI_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.UNI.version.MATIC.address":{"deprecatedKeyName":"UNI_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.UNI.version.HRC20.address":{"deprecatedKeyName":"UNI_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.UNI.version.XDAI.address":{"deprecatedKeyName":"UNI_XDAI","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.SOL.address":{"deprecatedKeyName":"SOL","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.BUSD.version.ERC20.address":{"deprecatedKeyName":"BUSD_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.BUSD.version.BEP20.address":{"deprecatedKeyName":"BUSD_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.BUSD.version.HRC20.address":{"deprecatedKeyName":"BUSD_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.ICP.address":{"deprecatedKeyName":"ICP","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.THETA.address":{"deprecatedKeyName":"THETA","validationRegex":"^0x[a-zA-Z0-9]*$","deprecated":false},"crypto.WBTC.version.ERC20.address":{"deprecatedKeyName":"WBTC_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.WBTC.version.MATIC.address":{"deprecatedKeyName":"WBTC_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.WBTC.version.FANTOM.address":{"deprecatedKeyName":"WBTC_FANTOM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.WBTC.version.HRC20.address":{"deprecatedKeyName":"WBTC_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.WBTC.version.XDAI.address":{"deprecatedKeyName":"WBTC_XDAI","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.FIL.address":{"deprecatedKeyName":"FIL","validationRegex":"^f[a-zA-Z0-9]*$","deprecated":false},"crypto.CDAI.address":{"deprecatedKeyName":"CDAI","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.KSM.address":{"deprecatedKeyName":"KSM","validationRegex":"^[CDEFGHJ][a-zA-Z0-9]*$","deprecated":false},"crypto.OKB.address":{"deprecatedKeyName":"OKB","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.AAVE.version.ERC20.address":{"deprecatedKeyName":"AAVE_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.AAVE.version.MATIC.address":{"deprecatedKeyName":"AAVE_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.AAVE.version.FANTOM.address":{"deprecatedKeyName":"AAVE_FANTOM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.AAVE.version.HRC20.address":{"deprecatedKeyName":"AAVE_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.BLOCKS.address":{"deprecatedKeyName":"BLOCKS","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SHIB.version.ERC20.address":{"deprecatedKeyName":"SHIB_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SHIB.version.MATIC.address":{"deprecatedKeyName":"SHIB_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.SHIB.version.FANTOM.address":{"deprecatedKeyName":"SHIB_FANTOM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.CEL.version.ERC20.address":{"deprecatedKeyName":"CEL_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CEL.version.MATIC.address":{"deprecatedKeyName":"CEL_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.CEL.version.FANTOM.address":{"deprecatedKeyName":"CEL_FANTOM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.CEL.version.HRC20.address":{"deprecatedKeyName":"CEL_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CUSDC.address":{"deprecatedKeyName":"CUSDC","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CETH.address":{"deprecatedKeyName":"CETH","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.AMP.address":{"deprecatedKeyName":"AMP","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CAKE.version.BEP20.address":{"deprecatedKeyName":"CAKE_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CAKE.version.HRC20.address":{"deprecatedKeyName":"CAKE_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MIOTA.address":{"deprecatedKeyName":"MIOTA","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.FTT.address":{"deprecatedKeyName":"FTT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MKR.address":{"deprecatedKeyName":"MKR","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.TFUEL.address":{"deprecatedKeyName":"TFUEL","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.KLAY.address":{"deprecatedKeyName":"KLAY","validationRegex":"^0x[a-zA-Z0-9]*$","deprecated":false},"crypto.LUNA.address":{"deprecatedKeyName":"LUNA","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.AVAX.address":{"deprecatedKeyName":"AVAX","validationRegex":"^0x[a-zA-Z0-9]*$","deprecated":false},"crypto.LEO.address":{"deprecatedKeyName":"LEO","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SAFEMOON.version.BEP20.address":{"deprecatedKeyName":"SAFEMOON_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SAFEMOON.version.HRC20.address":{"deprecatedKeyName":"SAFEMOON_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.UST.address":{"deprecatedKeyName":"UST","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.RUNE.address":{"deprecatedKeyName":"RUNE","validationRegex":"^(bnb|tbnb)[a-zA-HJ-NP-Z0-9]{39}$","deprecated":false},"crypto.HBAR.address":{"deprecatedKeyName":"HBAR","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.TEL.version.ERC20.address":{"deprecatedKeyName":"TEL_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.TEL.version.MATIC.address":{"deprecatedKeyName":"TEL_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.CHZ.address":{"deprecatedKeyName":"CHZ","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SUSHI.version.ERC20.address":{"deprecatedKeyName":"SUSHI_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SUSHI.version.BEP20.address":{"deprecatedKeyName":"SUSHI_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SUSHI.version.MATIC.address":{"deprecatedKeyName":"SUSHI_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.SUSHI.version.FANTOM.address":{"deprecatedKeyName":"SUSHI_FANTOM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.SUSHI.version.HRC20.address":{"deprecatedKeyName":"SUSHI_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.EGLD.address":{"deprecatedKeyName":"EGLD","validationRegex":"^0x[a-zA-Z0-9]*$","deprecated":false},"crypto.TUSD.version.ERC20.address":{"deprecatedKeyName":"TUSD_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.TUSD.version.BEP20.address":{"deprecatedKeyName":"TUSD_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.TUSD.version.AVAX.address":{"deprecatedKeyName":"TUSD_AVAX","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.TUSD.version.HRC20.address":{"deprecatedKeyName":"TUSD_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.TUSD.version.BEP2.address":{"deprecatedKeyName":"TUSD_BEP2","validationRegex":"^(bnb|tbnb)[a-zA-HJ-NP-Z0-9]{39}$","deprecated":false},"crypto.TUSD.version.TRON.address":{"deprecatedKeyName":"TUSD_TRON","validationRegex":"^[T][a-zA-HJ-NP-Z0-9]{33}$","deprecated":false},"crypto.HBTC.version.ERC20.address":{"deprecatedKeyName":"HBTC_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.HBTC.version.HRC20.address":{"deprecatedKeyName":"HBTC_HRC20","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.SNX.version.ERC20.address":{"deprecatedKeyName":"SNX_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SNX.version.MATIC.address":{"deprecatedKeyName":"SNX_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.SNX.version.FANTOM.address":{"deprecatedKeyName":"SNX_FANTOM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.SNX.version.HRC20.address":{"deprecatedKeyName":"SNX_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.HOT.version.ERC20.address":{"deprecatedKeyName":"HOT_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.HOT.version.HRC20.address":{"deprecatedKeyName":"HOT_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.NEAR.address":{"deprecatedKeyName":"NEAR","validationRegex":"^0x[a-zA-Z0-9]*$","deprecated":false},"crypto.HNT.address":{"deprecatedKeyName":"HNT","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.STETH.address":{"deprecatedKeyName":"STETH","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.NEXO.version.ERC20.address":{"deprecatedKeyName":"NEXO_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.NEXO.version.FANTOM.address":{"deprecatedKeyName":"NEXO_FANTOM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.PAX.address":{"deprecatedKeyName":"PAX","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.STX.address":{"deprecatedKeyName":"STX","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.MANA.version.ERC20.address":{"deprecatedKeyName":"MANA_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MANA.version.MATIC.address":{"deprecatedKeyName":"MANA_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.MDX.version.HRC20.address":{"deprecatedKeyName":"MDX_HRC20","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.MDX.version.BEP20.address":{"deprecatedKeyName":"MDX_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.ZEN.address":{"deprecatedKeyName":"ZEN","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.ARRR.address":{"deprecatedKeyName":"ARRR","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.BNT.address":{"deprecatedKeyName":"BNT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.LUSD.version.ERC20.address":{"deprecatedKeyName":"LUSD_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.LUSD.version.MATIC.address":{"deprecatedKeyName":"LUSD_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.GRT.version.ERC20.address":{"deprecatedKeyName":"GRT_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.GRT.version.MATIC.address":{"deprecatedKeyName":"GRT_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.GRT.version.HRC20.address":{"deprecatedKeyName":"GRT_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SC.address":{"deprecatedKeyName":"SC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.HUSD.version.ERC20.address":{"deprecatedKeyName":"HUSD_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.HUSD.version.HRC20.address":{"deprecatedKeyName":"HUSD_HRC20","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.CRV.version.ERC20.address":{"deprecatedKeyName":"CRV_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CRV.version.MATIC.address":{"deprecatedKeyName":"CRV_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.CRV.version.FANTOM.address":{"deprecatedKeyName":"CRV_FANTOM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.UMA.address":{"deprecatedKeyName":"UMA","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.WRX.version.BEP2.address":{"deprecatedKeyName":"WRX_BEP2","validationRegex":"^(bnb|tbnb)[a-zA-HJ-NP-Z0-9]{39}$","deprecated":false},"crypto.WRX.version.MATIC.address":{"deprecatedKeyName":"WRX_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.AR.address":{"deprecatedKeyName":"AR","validationRegex":"^[a-zA-Z0-9-_]{43}$","deprecated":false},"crypto.OMG.address":{"deprecatedKeyName":"OMG","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.GT.address":{"deprecatedKeyName":"GT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.QNT.address":{"deprecatedKeyName":"QNT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CHSB.address":{"deprecatedKeyName":"CHSB","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.IOST.address":{"deprecatedKeyName":"IOST","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.NXM.address":{"deprecatedKeyName":"NXM","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.KCS.address":{"deprecatedKeyName":"KCS","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.LPT.version.ERC20.address":{"deprecatedKeyName":"LPT_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.LPT.version.HRC20.address":{"deprecatedKeyName":"LPT_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.XSUSHI.address":{"deprecatedKeyName":"XSUSHI","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CUSDT.address":{"deprecatedKeyName":"CUSDT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.FLOW.address":{"deprecatedKeyName":"FLOW","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.ANKR.address":{"deprecatedKeyName":"ANKR","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.HBC.address":{"deprecatedKeyName":"HBC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.VGX.address":{"deprecatedKeyName":"VGX","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.FEI.address":{"deprecatedKeyName":"FEI","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.BAKE.version.BEP20.address":{"deprecatedKeyName":"BAKE_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.BAKE.version.HRC20.address":{"deprecatedKeyName":"BAKE_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.1INCH.version.ERC20.address":{"deprecatedKeyName":"1INCH_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.1INCH.version.BEP20.address":{"deprecatedKeyName":"1INCH_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.1INCH.version.MATIC.address":{"deprecatedKeyName":"1INCH_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.1INCH.version.HRC20.address":{"deprecatedKeyName":"1INCH_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CKB.address":{"deprecatedKeyName":"CKB","validationRegex":"^ckb1q[a-zA-Z0-9]*$","deprecated":false},"crypto.WOO.version.ERC20.address":{"deprecatedKeyName":"WOO_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.WOO.version.HRC20.address":{"deprecatedKeyName":"WOO_HRC20","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.TITAN.address":{"deprecatedKeyName":"TITAN","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.OMI.address":{"deprecatedKeyName":"OMI","validationRegex":"^0x[a-zA-Z0-9]*$","deprecated":false},"crypto.MINA.address":{"deprecatedKeyName":"MINA","validationRegex":"^B62[a-zA-Z0-9]*$","deprecated":false},"crypto.SETH.address":{"deprecatedKeyName":"SETH","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.RSR.address":{"deprecatedKeyName":"RSR","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.OXY.version.SOLANA.address":{"deprecatedKeyName":"OXY_SOLANA","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.OXY.version.ERC20.address":{"deprecatedKeyName":"OXY_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.REN.version.ERC20.address":{"deprecatedKeyName":"REN_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.REN.version.HRC20.address":{"deprecatedKeyName":"REN_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.XCH.address":{"deprecatedKeyName":"XCH","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.RENBTC.version.ERC20.address":{"deprecatedKeyName":"RENBTC_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.RENBTC.version.BEP20.address":{"deprecatedKeyName":"RENBTC_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.RENBTC.version.HRC20.address":{"deprecatedKeyName":"RENBTC_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.USDN.address":{"deprecatedKeyName":"USDN","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.BCHA.address":{"deprecatedKeyName":"BCHA","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.LRC.address":{"deprecatedKeyName":"LRC","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.PUNDIX.address":{"deprecatedKeyName":"PUNDIX","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.ERG.address":{"deprecatedKeyName":"ERG","validationRegex":"^0x[a-zA-Z0-9]*$","deprecated":false},"crypto.WIN.address":{"deprecatedKeyName":"WIN","validationRegex":"^[T][a-zA-HJ-NP-Z0-9]{33}$","deprecated":false},"crypto.NPXS.address":{"deprecatedKeyName":"NPXS","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.TRIBE.address":{"deprecatedKeyName":"TRIBE","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MAID.address":{"deprecatedKeyName":"MAID","validationRegex":"^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}$","deprecated":false},"crypto.ASD.address":{"deprecatedKeyName":"ASD","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CUNI.address":{"deprecatedKeyName":"CUNI","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CELO.address":{"deprecatedKeyName":"CELO","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.DENT.address":{"deprecatedKeyName":"DENT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SNT.address":{"deprecatedKeyName":"SNT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.FEG.version.ERC20.address":{"deprecatedKeyName":"FEG_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.FEG.version.HRC20.address":{"deprecatedKeyName":"FEG_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SKL.address":{"deprecatedKeyName":"SKL","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.ALUSD.address":{"deprecatedKeyName":"ALUSD","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MIR.version.ERC20.address":{"deprecatedKeyName":"MIR_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MIR.version.BEP20.address":{"deprecatedKeyName":"MIR_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.GLM.address":{"deprecatedKeyName":"GLM","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.PAXG.version.ERC20.address":{"deprecatedKeyName":"PAXG_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.PAXG.version.HRC20.address":{"deprecatedKeyName":"PAXG_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CFX.address":{"deprecatedKeyName":"CFX","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.UOS.address":{"deprecatedKeyName":"UOS","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SVCS.address":{"deprecatedKeyName":"SVCS","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.REEF.version.ERC20.address":{"deprecatedKeyName":"REEF_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.REEF.version.BEP20.address":{"deprecatedKeyName":"REEF_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.REEF.version.HRC20.address":{"deprecatedKeyName":"REEF_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.GNO.address":{"deprecatedKeyName":"GNO","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.USDP.address":{"deprecatedKeyName":"USDP","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.KAVA.address":{"deprecatedKeyName":"KAVA","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.ALCX.address":{"deprecatedKeyName":"ALCX","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.EWT.address":{"deprecatedKeyName":"EWT","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.TON.address":{"deprecatedKeyName":"TON","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.RLC.address":{"deprecatedKeyName":"RLC","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.AXS.address":{"deprecatedKeyName":"AXS","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.AUDIO.address":{"deprecatedKeyName":"AUDIO","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.XVS.address":{"deprecatedKeyName":"XVS","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.BAND.version.ERC20.address":{"deprecatedKeyName":"BAND_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.BAND.version.FANTOM.address":{"deprecatedKeyName":"BAND_FANTOM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.NMR.address":{"deprecatedKeyName":"NMR","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.INJ.version.ERC20.address":{"deprecatedKeyName":"INJ_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.INJ.version.BEP20.address":{"deprecatedKeyName":"INJ_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.WAXP.address":{"deprecatedKeyName":"WAXP","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.UQC.address":{"deprecatedKeyName":"UQC","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.IOTX.address":{"deprecatedKeyName":"IOTX","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.FUN.address":{"deprecatedKeyName":"FUN","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.OCEAN.address":{"deprecatedKeyName":"OCEAN","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SAND.version.ERC20.address":{"deprecatedKeyName":"SAND_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SAND.version.HRC20.address":{"deprecatedKeyName":"SAND_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CTSI.version.ERC20.address":{"deprecatedKeyName":"CTSI_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CTSI.version.BEP20.address":{"deprecatedKeyName":"CTSI_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CTSI.version.MATIC.address":{"deprecatedKeyName":"CTSI_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.RAY.address":{"deprecatedKeyName":"RAY","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.ANC.version.TERRA.address":{"deprecatedKeyName":"ANC_TERRA","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.ANC.version.ERC20.address":{"deprecatedKeyName":"ANC_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.IQ.version.ERC20.address":{"deprecatedKeyName":"IQ_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.IQ.version.BEP20.address":{"deprecatedKeyName":"IQ_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.IQ.version.MATIC.address":{"deprecatedKeyName":"IQ_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.SUSD.version.ERC20.address":{"deprecatedKeyName":"SUSD_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SUSD.version.FANTOM.address":{"deprecatedKeyName":"SUSD_FANTOM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.KLV.address":{"deprecatedKeyName":"KLV","validationRegex":"^[T][a-zA-HJ-NP-Z0-9]{33}$","deprecated":false},"crypto.BTCST.address":{"deprecatedKeyName":"BTCST","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.TLM.address":{"deprecatedKeyName":"TLM","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.AKT.address":{"deprecatedKeyName":"AKT","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.STMX.address":{"deprecatedKeyName":"STMX","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.PROM.address":{"deprecatedKeyName":"PROM","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.XPRT.address":{"deprecatedKeyName":"XPRT","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.SRM.version.ERC20.address":{"deprecatedKeyName":"SRM_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SRM.version.SOLANA.address":{"deprecatedKeyName":"SRM_SOLANA","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.RPL.address":{"deprecatedKeyName":"RPL","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.AGIX.address":{"deprecatedKeyName":"AGIX","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CELR.address":{"deprecatedKeyName":"CELR","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.FET.address":{"deprecatedKeyName":"FET","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.OXT.address":{"deprecatedKeyName":"OXT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.ARDR.address":{"deprecatedKeyName":"ARDR","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.MATH.address":{"deprecatedKeyName":"MATH","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.10SET.address":{"deprecatedKeyName":"10SET","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.POLY.address":{"deprecatedKeyName":"POLY","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.GUSD.address":{"deprecatedKeyName":"GUSD","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.NKN.address":{"deprecatedKeyName":"NKN","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CVC.address":{"deprecatedKeyName":"CVC","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.GTC.address":{"deprecatedKeyName":"GTC","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.STEEM.address":{"deprecatedKeyName":"STEEM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.ORN.address":{"deprecatedKeyName":"ORN","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.KEEP.version.ERC20.address":{"deprecatedKeyName":"KEEP_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.KEEP.version.HRC20.address":{"deprecatedKeyName":"KEEP_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.HXRO.address":{"deprecatedKeyName":"HXRO","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.ORBS.address":{"deprecatedKeyName":"ORBS","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.ALPHA.version.ERC20.address":{"deprecatedKeyName":"ALPHA_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.ALPHA.version.BEP20.address":{"deprecatedKeyName":"ALPHA_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.DODO.version.ERC20.address":{"deprecatedKeyName":"DODO_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.DODO.version.BEP20.address":{"deprecatedKeyName":"DODO_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.OGN.address":{"deprecatedKeyName":"OGN","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.KNCL.version.ERC20.address":{"deprecatedKeyName":"KNCL_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.KNCL.version.FANTOM.address":{"deprecatedKeyName":"KNCL_FANTOM","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.KNCL.version.HRC20.address":{"deprecatedKeyName":"KNCL_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MED.address":{"deprecatedKeyName":"MED","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.XAUT.address":{"deprecatedKeyName":"XAUT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.VLX.address":{"deprecatedKeyName":"VLX","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.PHA.address":{"deprecatedKeyName":"PHA","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.KOBE.address":{"deprecatedKeyName":"KOBE","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.PERP.address":{"deprecatedKeyName":"PERP","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.XHV.address":{"deprecatedKeyName":"XHV","validationRegex":"^hv[a-zA-Z0-9]*$","deprecated":false},"crypto.META.address":{"deprecatedKeyName":"META","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SEUR.address":{"deprecatedKeyName":"SEUR","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.MONA.address":{"deprecatedKeyName":"MONA","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.ANT.address":{"deprecatedKeyName":"ANT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.HYDRA.address":{"deprecatedKeyName":"HYDRA","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.ZKS.address":{"deprecatedKeyName":"ZKS","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SXP.version.ERC20.address":{"deprecatedKeyName":"SXP_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SXP.version.BEP20.address":{"deprecatedKeyName":"SXP_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.SXP.version.HRC20.address":{"deprecatedKeyName":"SXP_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.CSPR.address":{"deprecatedKeyName":"CSPR","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.MTL.address":{"deprecatedKeyName":"MTL","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.NU.address":{"deprecatedKeyName":"NU","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.ZMT.address":{"deprecatedKeyName":"ZMT","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.LOC.address":{"deprecatedKeyName":"LOC","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.TKO.address":{"deprecatedKeyName":"TKO","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.ETN.address":{"deprecatedKeyName":"ETN","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.UBT.version.ERC20.address":{"deprecatedKeyName":"UBT_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.UBT.version.MATIC.address":{"deprecatedKeyName":"UBT_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.EXRD.address":{"deprecatedKeyName":"EXRD","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.NMX.address":{"deprecatedKeyName":"NMX","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.RIF.address":{"deprecatedKeyName":"RIF","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.STORJ.version.ERC20.address":{"deprecatedKeyName":"STORJ_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.STORJ.version.HRC20.address":{"deprecatedKeyName":"STORJ_HRC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.AVA.address":{"deprecatedKeyName":"AVA","validationRegex":"^(bnb|tbnb)[a-zA-HJ-NP-Z0-9]{39}$","deprecated":false},"crypto.DPI.version.ERC20.address":{"deprecatedKeyName":"DPI_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.DPI.version.MATIC.address":{"deprecatedKeyName":"DPI_MATIC","validationRegex":"^[a-zA-Z0-9]*$","deprecated":false},"crypto.DOG.version.MATIC.address":{"deprecatedKeyName":"DOG_MATIC","validationRegex":null,"deprecated":false},"crypto.DOG.version.BEP20.address":{"deprecatedKeyName":"DOG_BEP20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.DOG.version.ERC20.address":{"deprecatedKeyName":"DOG_ERC20","validationRegex":"^0x[a-fA-F0-9]{40}$","deprecated":false},"crypto.DOG.version.AETH.address":{"deprecatedKeyName":"DOG_AETH","validationRegex":null,"deprecated":false},"crypto.DOG.version.OP.address":{"deprecatedKeyName":"DOG_OP","validationRegex":null,"deprecated":false},"crypto.GALA.version.ERC20.address":{"deprecatedKeyName":"GALA_ERC20","validationRegex":"^0x[a-zA-Z0-9]{40}$","deprecated":false},"crypto.GALA.version.BEP20.address":{"deprecatedKeyName":"GALA_BEP20","validationRegex":"^0x[a-zA-Z0-9]{40}$","deprecated":false}} + }; + \ No newline at end of file diff --git a/shared/lib/error-utils.js b/shared/lib/error-utils.js index c0baad2c1874..0dc11e91c61a 100644 --- a/shared/lib/error-utils.js +++ b/shared/lib/error-utils.js @@ -32,7 +32,7 @@ const getLocaleContext = (currentLocaleMessages, enLocaleMessages) => { }; }; -export async function getErrorHtml(supportLink, metamaskState) { +export async function getErrorHtml(errorKey, supportLink, metamaskState) { let response, preferredLocale; if (metamaskState?.currentLocale) { preferredLocale = metamaskState.currentLocale; @@ -50,26 +50,40 @@ export async function getErrorHtml(supportLink, metamaskState) { const { currentLocaleMessages, enLocaleMessages } = response; const t = getLocaleContext(currentLocaleMessages, enLocaleMessages); + /** + * The pattern ${errorKey === 'troubleStarting' ? t('troubleStarting') : ''} + * is neccessary because we we need linter to see the string + * of the locale keys. If we use the variable directly, the linter will not + * see the string and will not be able to check if the locale key exists. + */ return `
    -
    -

    - ${t('troubleStarting')} +

    + + + +
    +
    +
    +

    + ${errorKey === 'troubleStarting' ? t('troubleStarting') : ''} + ${errorKey === 'somethingIsWrong' ? t('somethingIsWrong') : ''} +

    + + ${t('restartMetamask')} + +
    +

    + ${t('stillGettingMessage')} + + ${t('sendBugReport')} +

    -
    -

    - ${t('stillGettingMessage')} - - ${t('sendBugReport')} - -

    `; } diff --git a/shared/lib/error-utils.test.js b/shared/lib/error-utils.test.js index e1a121d7f6d0..de846aa8bc41 100644 --- a/shared/lib/error-utils.test.js +++ b/shared/lib/error-utils.test.js @@ -33,7 +33,11 @@ describe('Error utils Tests', function () { }; fetchLocale.mockReturnValue(mockStore.localeMessages.current); - const errorHtml = await getErrorHtml(SUPPORT_LINK, mockStore.metamask); + const errorHtml = await getErrorHtml( + 'troubleStarting', + SUPPORT_LINK, + mockStore.metamask, + ); const currentLocale = mockStore.localeMessages.current; const troubleStartingMessage = currentLocale.troubleStarting.message; const restartMetamaskMessage = currentLocale.restartMetamask.message; diff --git a/shared/lib/swaps-utils.js b/shared/lib/swaps-utils.js index 6981ef25548d..c1393abe30f5 100644 --- a/shared/lib/swaps-utils.js +++ b/shared/lib/swaps-utils.js @@ -146,7 +146,6 @@ export const getBaseApi = function (type, chainId = CHAIN_IDS.MAINNET) { // eslint-disable-next-line no-param-reassign chainId = TEST_CHAIN_IDS.includes(chainId) ? CHAIN_IDS.MAINNET : chainId; const baseUrl = getBaseUrlForNewSwapsApi(type, chainId); - const chainIdDecimal = chainId && parseInt(chainId, 16); if (!baseUrl) { throw new Error(`Swaps API calls are disabled for chainId: ${chainId}`); } @@ -164,8 +163,7 @@ export const getBaseApi = function (type, chainId = CHAIN_IDS.MAINNET) { case 'gasPrices': return `${baseUrl}/gasPrices`; case 'network': - // Only use v2 for this endpoint. - return `${SWAPS_API_V2_BASE_URL}/networks/${chainIdDecimal}`; + return baseUrl; default: throw new Error('getBaseApi requires an api call type'); } diff --git a/shared/lib/switch-direction.js b/shared/lib/switch-direction.js index efda544f2149..5675a17255f0 100644 --- a/shared/lib/switch-direction.js +++ b/shared/lib/switch-direction.js @@ -9,17 +9,17 @@ const switchDirection = async (direction) => { // eslint-disable-next-line no-param-reassign direction = 'ltr'; } + let updatedLink; - Array.from(document.getElementsByTagName('link')) - .filter((link) => link.rel === 'stylesheet') - .forEach((link) => { - if (link.title === direction && link.disabled) { - link.disabled = false; - updatedLink = link; - } else if (link.title !== direction && !link.disabled) { - link.disabled = true; - } - }); + [...document.querySelectorAll('link[rel=stylesheet]')].forEach((link) => { + if (link.title === direction && link.disabled) { + link.disabled = false; + updatedLink = link; + } else if (link.title !== direction && !link.disabled) { + link.disabled = true; + } + }); + if (updatedLink) { return new Promise((resolve, reject) => { updatedLink.onload = () => { diff --git a/shared/modules/browser-runtime.utils.js b/shared/modules/browser-runtime.utils.js new file mode 100644 index 000000000000..8f7b2afe71e8 --- /dev/null +++ b/shared/modules/browser-runtime.utils.js @@ -0,0 +1,55 @@ +/** + * Utility Functions to support browser.runtime JavaScript API + */ + +import browser from 'webextension-polyfill'; +import log from 'loglevel'; + +/** + * Returns an Error if extension.runtime.lastError is present + * this is a workaround for the non-standard error object that's used + * + * According to the docs, we are expected to check lastError in runtime API callbacks: + * " + * If you call an asynchronous function that may set lastError, you are expected to + * check for the error when you handle the result of the function. If lastError has been + * set and you don't check it within the callback function, then an error will be raised. + * " + * + * @see {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/lastError} + * @returns {Error|undefined} + */ +export function checkForLastError() { + const { lastError } = browser.runtime; + if (!lastError) { + return undefined; + } + // if it quacks like an Error, its an Error + if (lastError.stack && lastError.message) { + return lastError; + } + // repair incomplete error object (eg chromium v77) + return new Error(lastError.message); +} + +/** @returns {Error|undefined} */ +export function checkForLastErrorAndLog() { + const error = checkForLastError(); + + if (error) { + log.error(error); + } + + return error; +} + +/** @returns {Error|undefined} */ +export function checkForLastErrorAndWarn() { + const error = checkForLastError(); + + if (error) { + console.warn(error); + } + + return error; +} diff --git a/shared/modules/browser-runtime.utils.test.js b/shared/modules/browser-runtime.utils.test.js new file mode 100644 index 000000000000..b116f2d7caf3 --- /dev/null +++ b/shared/modules/browser-runtime.utils.test.js @@ -0,0 +1,54 @@ +import sinon from 'sinon'; +import browser from 'webextension-polyfill'; +import log from 'loglevel'; +import * as BrowserRuntimeUtil from './browser-runtime.utils'; + +const mockLastError = { message: 'error', stack: [] }; + +describe('Browser Runtime Utils', () => { + beforeAll(() => { + sinon.replace(browser, 'runtime', { + lastError: undefined, + }); + }); + + describe('checkForLastError', () => { + it('should return undefined if no lastError found', () => { + expect(BrowserRuntimeUtil.checkForLastError()).toBeUndefined(); + }); + + it('should return the lastError (Error object) if lastError is found', () => { + sinon.stub(browser.runtime, 'lastError').value(mockLastError); + + expect(BrowserRuntimeUtil.checkForLastError()).toStrictEqual( + mockLastError, + ); + }); + + it('should return an Error object if the lastError is found with no stack', () => { + sinon + .stub(browser.runtime, 'lastError') + .value({ message: mockLastError.message }); + + const result = BrowserRuntimeUtil.checkForLastError(); + + expect(result).toStrictEqual(expect.any(Error)); + expect(result).toHaveProperty('stack'); + expect(result.message).toBe(mockLastError.message); + }); + }); + + describe('checkForLastErrorAndLog', () => { + it('should log and return error if error was found', () => { + sinon.stub(browser.runtime, 'lastError').value({ ...mockLastError }); + sinon.stub(log, 'error'); + + const result = BrowserRuntimeUtil.checkForLastErrorAndLog(); + + expect(log.error.calledWith(result)).toBeTruthy(); + expect(result).toStrictEqual(mockLastError); + + log.error.restore(); + }); + }); +}); diff --git a/shared/modules/conversion.utils.js b/shared/modules/conversion.utils.js index b973f8436ed7..e2a37deb2c3f 100644 --- a/shared/modules/conversion.utils.js +++ b/shared/modules/conversion.utils.js @@ -24,7 +24,9 @@ import BigNumber from 'bignumber.js'; -import { stripHexPrefix, BN } from 'ethereumjs-util'; +import { BN } from 'ethereumjs-util'; + +import { stripHexPrefix } from './hexstring-utils'; // Big Number Constants const BIG_NUMBER_WEI_MULTIPLIER = new BigNumber('1000000000000000000'); diff --git a/shared/modules/hexstring-utils.js b/shared/modules/hexstring-utils.js index 50b8a75d45f4..9890b433aa31 100644 --- a/shared/modules/hexstring-utils.js +++ b/shared/modules/hexstring-utils.js @@ -5,6 +5,7 @@ import { addHexPrefix, toChecksumAddress, zeroAddress, + isHexPrefixed, } from 'ethereumjs-util'; export const BURN_ADDRESS = zeroAddress(); @@ -73,3 +74,10 @@ export function toChecksumHexAddress(address) { } return toChecksumAddress(hexPrefixed); } + +export function stripHexPrefix(str) { + if (typeof str !== 'string') { + return str; + } + return isHexPrefixed(str) ? str.slice(2) : str; +} diff --git a/shared/modules/provider-injection.js b/shared/modules/provider-injection.js index c2ce0ef7e5cd..c4d74182347c 100644 --- a/shared/modules/provider-injection.js +++ b/shared/modules/provider-injection.js @@ -71,7 +71,6 @@ function blockedDomainCheck() { 'cdn.shopify.com/s/javascripts/tricorder/xtld-read-only-frame.html', 'adyen.com', 'gravityforms.com', - 'docs.google.com', 'harbourair.com', 'ani.gamer.com.tw', 'blueskybooking.com', diff --git a/shared/modules/siwe.js b/shared/modules/siwe.js index 4fa99457a448..6edbc7d7592b 100644 --- a/shared/modules/siwe.js +++ b/shared/modules/siwe.js @@ -1,6 +1,6 @@ -import { stripHexPrefix } from 'ethereumjs-util'; import { ParsedMessage } from '@spruceid/siwe-parser'; import log from 'loglevel'; +import { stripHexPrefix } from './hexstring-utils'; const msgHexToText = (hex) => { try { diff --git a/shared/modules/transaction.utils.js b/shared/modules/transaction.utils.js index 1cf471ed7556..d7fd45801faa 100644 --- a/shared/modules/transaction.utils.js +++ b/shared/modules/transaction.utils.js @@ -259,7 +259,7 @@ export async function determineTransactionAssetType( assetType: details.standard === TOKEN_STANDARDS.ERC20 ? ASSET_TYPES.TOKEN - : ASSET_TYPES.COLLECTIBLE, + : ASSET_TYPES.NFT, tokenStandard: details.standard, }; } diff --git a/shared/notifications/index.js b/shared/notifications/index.js index 9a3cb03517fc..099350364ee5 100644 --- a/shared/notifications/index.js +++ b/shared/notifications/index.js @@ -78,6 +78,10 @@ export const UI_NOTIFICATIONS = { id: 15, date: '2022-09-15', }, + 16: { + id: 16, + date: null, + }, }; export const getTranslatedUINotifications = (t, locale) => { @@ -224,5 +228,16 @@ export const getTranslatedUINotifications = (t, locale) => { ) : '', }, + 16: { + ...UI_NOTIFICATIONS[16], + title: t('notifications16Title'), + description: t('notifications16Description'), + actionText: t('notifications16ActionText'), + date: UI_NOTIFICATIONS[16].date + ? new Intl.DateTimeFormat(formattedLocale).format( + new Date(UI_NOTIFICATIONS[16].date), + ) + : '', + }, }; }; diff --git a/test/data/mock-pending-transaction-data.json b/test/data/mock-pending-transaction-data.json index 62f072c10965..26ce780eb027 100644 --- a/test/data/mock-pending-transaction-data.json +++ b/test/data/mock-pending-transaction-data.json @@ -5,8 +5,8 @@ "id": 6854191329910881, "time": 1631558469046, "status": "approved", - "metamaskNetworkId": "42", - "chainId": "0x2a", + "metamaskNetworkId": "5", + "chainId": "0x5", "loadingDefaults": false, "dappSuggestedGasFees": null, "txParams": { @@ -25,8 +25,8 @@ "id": 6854191329910881, "time": 1631558469046, "status": "unapproved", - "metamaskNetworkId": "42", - "chainId": "0x2a", + "metamaskNetworkId": "5", + "chainId": "0x5", "loadingDefaults": true, "dappSuggestedGasFees": null, "txParams": { @@ -81,8 +81,8 @@ "id": 6854191329910881, "time": 1631558469046, "status": "approved", - "metamaskNetworkId": "42", - "chainId": "0x2a", + "metamaskNetworkId": "5", + "chainId": "0x5", "loadingDefaults": false, "dappSuggestedGasFees": null, "txParams": { @@ -101,8 +101,8 @@ "id": 6854191329910881, "time": 1631558469046, "status": "unapproved", - "metamaskNetworkId": "42", - "chainId": "0x2a", + "metamaskNetworkId": "5", + "chainId": "0x5", "loadingDefaults": true, "dappSuggestedGasFees": null, "txParams": { @@ -158,8 +158,8 @@ "id": 6854191329910881, "time": 1631558469046, "status": "approved", - "metamaskNetworkId": "42", - "chainId": "0x2a", + "metamaskNetworkId": "5", + "chainId": "0x5", "loadingDefaults": false, "dappSuggestedGasFees": null, "txParams": { @@ -178,8 +178,8 @@ "id": 6854191329910881, "time": 1631558469046, "status": "unapproved", - "metamaskNetworkId": "42", - "chainId": "0x2a", + "metamaskNetworkId": "5", + "chainId": "0x5", "loadingDefaults": true, "dappSuggestedGasFees": null, "txParams": { diff --git a/test/data/mock-state.json b/test/data/mock-state.json index b378b37c4559..a83d6bb87cd9 100644 --- a/test/data/mock-state.json +++ b/test/data/mock-state.json @@ -1,44 +1,56 @@ { "appState": { - "isLoading": false, + "networkDropdownOpen": false, "gasIsLoading": false, - "currentView": { - "name": "accountDetail", - "detailView": null, - "context": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" - } + "isLoading": false, + "modal": { + "open": false, + "modalState": { + "name": null, + "props": {} + }, + "previousModalState": { + "name": null + } + }, + "warning": null }, "history": { - "mostRecentOverviewPage": "/" + "mostRecentOverviewPage": "/mostRecentOverviewPage" }, "metamask": { + "usePhishDetect": true, + "participateInMetaMetrics": false, + "gasEstimateType": "fee-market", + "showBetaHeader": false, "gasFeeEstimates": { "low": { - "suggestedMaxPriorityFeePerGas": "1.233864249", - "suggestedMaxFeePerGas": "19.308202033", - "minWaitTimeEstimate": 15000, - "maxWaitTimeEstimate": 30000 + "minWaitTimeEstimate": 180000, + "maxWaitTimeEstimate": 300000, + "suggestedMaxPriorityFeePerGas": "3", + "suggestedMaxFeePerGas": "53" }, "medium": { - "suggestedMaxPriorityFeePerGas": "1.5", - "suggestedMaxFeePerGas": "25.900356008", "minWaitTimeEstimate": 15000, - "maxWaitTimeEstimate": 45000 + "maxWaitTimeEstimate": 60000, + "suggestedMaxPriorityFeePerGas": "7", + "suggestedMaxFeePerGas": "70" }, "high": { - "suggestedMaxPriorityFeePerGas": "2", - "suggestedMaxFeePerGas": "32.726374232", - "minWaitTimeEstimate": 15000, - "maxWaitTimeEstimate": 60000 + "minWaitTimeEstimate": 0, + "maxWaitTimeEstimate": 15000, + "suggestedMaxPriorityFeePerGas": "10", + "suggestedMaxFeePerGas": "100" }, - "estimatedBaseFee": "18.074337783", - "historicalBaseFeeRange": ["10.621659703", "19.673392581"], + "estimatedBaseFee": "50", + "historicalBaseFeeRange": ["28.533098435", "70.351148354"], "baseFeeTrend": "up", - "latestPriorityFeeRange": ["1.5", "17.536644176"], - "historicalPriorityFeeRange": ["0.110624865", "718.303816711"], - "priorityFeeTrend": "up", - "networkCongestion": 0.87115 + "latestPriorityFeeRange": ["1", "40"], + "historicalPriorityFeeRange": ["0.1458417", "700.156384646"], + "priorityFeeTrend": "down", + "networkCongestion": 0.90625 }, + "snaps": [{}], "preferences": { "hideZeroBalanceTokens": false, "showFiatInTestnets": false, @@ -46,17 +58,34 @@ "useNativeCurrencyAsPrimaryCurrency": true }, "ensResolutionsByAddress": {}, + "isAccountMenuOpen": false, + "isUnlocked": true, + "alertEnabledness": { + "unconnectedAccount": true + }, "featureFlags": { "showIncomingTransactions": true }, - "network": "4", + "network": "5", "provider": { - "chainId": "0x4" + "type": "rpc", + "chainId": "0x5" }, "keyrings": [ + { + "type": "HD Key Tree", + "accounts": [ + "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", + "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b" + ] + }, { "type": "Ledger Hardware", - "accounts": ["0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc"] + "accounts": ["0xc42edfcc21ed14dda456aa0756c153f7985d8813"] + }, + { + "type": "Simple Key Pair", + "accounts": ["0xeb9e64b93097bc15f01f13eae97015c57ab64823"] } ], "identities": { @@ -64,9 +93,17 @@ "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", "name": "Test Account" }, + "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { + "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b", + "name": "Test Account 2" + }, "0xc42edfcc21ed14dda456aa0756c153f7985d8813": { "address": "0xc42edfcc21ed14dda456aa0756c153f7985d8813", - "name": "Test Account 2" + "name": "Test Ledger 1" + }, + "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { + "name": "Test Account 3", + "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823" } }, "networkDetails": { @@ -150,9 +187,17 @@ "balance": "0x0", "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc" }, + "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b": { + "address": "0xec1adf982415d2ef5ec55899b9bfb8bc0f29251b", + "balance": "0x0" + }, "0xc42edfcc21ed14dda456aa0756c153f7985d8813": { "address": "0xc42edfcc21ed14dda456aa0756c153f7985d8813", "balance": "0x0" + }, + "0xeb9e64b93097bc15f01f13eae97015c57ab64823": { + "address": "0xeb9e64b93097bc15f01f13eae97015c57ab64823", + "balance": "0x0" } }, "tokens": [ @@ -181,10 +226,10 @@ "nativeCurrency": "ETH", "conversionRate": 556.12, "addressBook": { - "0x4": { + "0x5": { "0xc42edfcc21ed14dda456aa0756c153f7985d8813": { "address": "0xc42edfcc21ed14dda456aa0756c153f7985d8813", - "chainId": "0x4", + "chainId": "0x5", "isEns": false, "memo": "", "name": "Address Book Account 1" @@ -201,20 +246,6 @@ "unapprovedEncryptionPublicKeyMsgCount": 0, "unapprovedTypedMessages": {}, "unapprovedTypedMessagesCount": 0, - "send": { - "gasLimit": "0x5208", - "gasPrice": "0xee6b2800", - "gasTotal": "0x4c65c6294000", - "tokenBalance": null, - "from": "0xc42edfcc21ed14dda456aa0756c153f7985d8813", - "to": "", - "amount": "1bc16d674ec80000", - "memo": "", - "errors": {}, - "maxModeOn": false, - "editingTransactionId": null, - "toNickname": "" - }, "useTokenDetection": true, "advancedGasFee": { "maxBaseFee": "75", @@ -1244,5 +1275,24 @@ "origin": "tmashuang.github.io" } ] + }, + "send": { + "amountMode": "INPUT", + "currentTransactionUUID": null, + "draftTransactions": {}, + "eip1559support": false, + "gasEstimateIsLoading": true, + "gasEstimatePollToken": null, + "gasIsSetInModal": false, + "gasPriceEstimate": "0x0", + "gasLimitMinimum": "0x5208", + "gasTotalForLayer1": "0x0", + "recipientMode": "CONTACT_LIST", + "recipientInput": "", + "selectedAccount": { + "address": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc", + "balance": "0x0" + }, + "stage": "INACTIVE" } } diff --git a/test/data/mock-tx-history.json b/test/data/mock-tx-history.json index 5a78af315065..790dd44fae5d 100644 --- a/test/data/mock-tx-history.json +++ b/test/data/mock-tx-history.json @@ -5,21 +5,21 @@ "id": 6616756286038869, "time": 1502438908445, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "value": "0x0", "gasPrice": "0x3b9aca00", "gas": "0x7b0d", - "chainId": 3 + "chainId": 5 }, "history": [ { "id": 6616756286038869, "time": 1502438908445, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -32,7 +32,7 @@ "id": 6616756286038869, "time": 1502438908445, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -45,7 +45,7 @@ "id": 6616756286038869, "time": 1502438908445, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -58,7 +58,7 @@ "id": 6616756286038869, "time": 1502438908445, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -71,7 +71,7 @@ "id": 6616756286038869, "time": 1502438908445, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -91,7 +91,7 @@ "id": 6616756286038869, "time": 1502438908445, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -111,14 +111,14 @@ "id": 6616756286038869, "time": 1502438908445, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "value": "0x0", "gasPrice": "0x3b9aca00", "gas": "0x7b0d", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16643c", @@ -131,14 +131,14 @@ "id": 6616756286038869, "time": 1502438908445, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "value": "0x0", "gasPrice": "0x3b9aca00", "gas": "0x7b0d", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16643c", @@ -151,14 +151,14 @@ "id": 6616756286038869, "time": 1502438908445, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "value": "0x0", "gasPrice": "0x3b9aca00", "gas": "0x7b0d", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16643c", @@ -172,14 +172,14 @@ "id": 6616756286038869, "time": 1502438908445, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "value": "0x0", "gasPrice": "0x3b9aca00", "gas": "0x7b0d", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16643c", @@ -193,14 +193,14 @@ "id": 6616756286038869, "time": 1502438908445, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "value": "0x0", "gasPrice": "0x3b9aca00", "gas": "0x7b0d", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16643c", @@ -215,14 +215,14 @@ "id": 6616756286038869, "time": 1502438908445, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "value": "0x0", "gasPrice": "0x3b9aca00", "gas": "0x7b0d", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16643c", @@ -237,14 +237,14 @@ "id": 6616756286038869, "time": 1502438908445, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "value": "0x0", "gasPrice": "0x3b9aca00", "gas": "0x7b0d", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16643c", @@ -259,14 +259,14 @@ "id": 6616756286038869, "time": 1502438908445, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "value": "0x0", "gasPrice": "0x3b9aca00", "gas": "0x7b0d", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16643c", @@ -281,14 +281,14 @@ "id": 6616756286038869, "time": 1502438908445, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "value": "0x0", "gasPrice": "0x3b9aca00", "gas": "0x7b0d", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16643c", @@ -304,14 +304,14 @@ "id": 6616756286038869, "time": 1502438908445, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "value": "0x0", "gasPrice": "0x3b9aca00", "gas": "0x7b0d", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16643c", @@ -338,7 +338,7 @@ "id": 6616756286038870, "time": 1502573153664, "status": "rejected", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -351,7 +351,7 @@ "id": 6616756286038870, "time": 1502573153664, "status": "rejected", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -364,7 +364,7 @@ "id": 6616756286038870, "time": 1502573153664, "status": "rejected", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -379,7 +379,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -387,14 +387,14 @@ "gasPrice": "0x28fa6ae00", "gas": "0x7b0d", "nonce": "0x01", - "chainId": 3 + "chainId": 5 }, "history": [ { "id": 6616756286038871, "time": 1502573157128, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -407,7 +407,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -420,7 +420,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -433,7 +433,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -446,7 +446,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -466,7 +466,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -486,7 +486,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -494,7 +494,7 @@ "gasPrice": "0x28fa6ae00", "gas": "0x7b0d", "nonce": "0x01", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x168739", @@ -507,7 +507,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -515,7 +515,7 @@ "gasPrice": "0x28fa6ae00", "gas": "0x7b0d", "nonce": "0x01", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x168739", @@ -528,7 +528,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -536,7 +536,7 @@ "gasPrice": "0x28fa6ae00", "gas": "0x7b0d", "nonce": "0x01", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x168739", @@ -550,7 +550,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -558,7 +558,7 @@ "gasPrice": "0x28fa6ae00", "gas": "0x7b0d", "nonce": "0x01", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x168739", @@ -572,7 +572,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -580,7 +580,7 @@ "gasPrice": "0x28fa6ae00", "gas": "0x7b0d", "nonce": "0x01", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x168739", @@ -595,7 +595,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -603,7 +603,7 @@ "gasPrice": "0x28fa6ae00", "gas": "0x7b0d", "nonce": "0x01", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x168739", @@ -618,7 +618,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -626,7 +626,7 @@ "gasPrice": "0x28fa6ae00", "gas": "0x7b0d", "nonce": "0x01", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x168739", @@ -641,7 +641,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -649,7 +649,7 @@ "gasPrice": "0x28fa6ae00", "gas": "0x7b0d", "nonce": "0x01", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x168739", @@ -664,7 +664,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -672,7 +672,7 @@ "gasPrice": "0x28fa6ae00", "gas": "0x7b0d", "nonce": "0x01", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x168739", @@ -688,7 +688,7 @@ "id": 6616756286038871, "time": 1502573157128, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -696,7 +696,7 @@ "gasPrice": "0x28fa6ae00", "gas": "0x7b0d", "nonce": "0x01", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x168739", @@ -723,7 +723,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -731,14 +731,14 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x02", - "chainId": 3 + "chainId": 5 }, "history": [ { "id": 6616756286038872, "time": 1502734903652, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -751,7 +751,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -764,7 +764,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -777,7 +777,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -790,7 +790,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -810,7 +810,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -830,7 +830,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -838,7 +838,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x02", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b066", @@ -851,7 +851,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -859,7 +859,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x02", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b066", @@ -872,7 +872,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -880,7 +880,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x02", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b066", @@ -894,7 +894,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -902,7 +902,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x02", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b066", @@ -916,7 +916,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -924,7 +924,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x02", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b066", @@ -939,7 +939,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -947,7 +947,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x02", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b066", @@ -962,7 +962,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -970,7 +970,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x02", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b066", @@ -985,7 +985,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -993,7 +993,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x02", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b066", @@ -1008,7 +1008,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1016,7 +1016,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x02", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b066", @@ -1032,7 +1032,7 @@ "id": 6616756286038872, "time": 1502734903652, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1040,7 +1040,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x02", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b066", @@ -1067,7 +1067,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1075,14 +1075,14 @@ "gasPrice": "0x3b9aca00", "gas": "0x7b0d", "nonce": "0x03", - "chainId": 3 + "chainId": 5 }, "history": [ { "id": 6616756286038873, "time": 1502734910224, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1095,7 +1095,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1108,7 +1108,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1121,7 +1121,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1134,7 +1134,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1154,7 +1154,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1174,7 +1174,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1182,7 +1182,7 @@ "gasPrice": "0x3b9aca00", "gas": "0x7b0d", "nonce": "0x03", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1195,7 +1195,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1203,7 +1203,7 @@ "gasPrice": "0x3b9aca00", "gas": "0x7b0d", "nonce": "0x03", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1216,7 +1216,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1224,7 +1224,7 @@ "gasPrice": "0x3b9aca00", "gas": "0x7b0d", "nonce": "0x03", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1238,7 +1238,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1246,7 +1246,7 @@ "gasPrice": "0x3b9aca00", "gas": "0x7b0d", "nonce": "0x03", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1260,7 +1260,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1268,7 +1268,7 @@ "gasPrice": "0x3b9aca00", "gas": "0x7b0d", "nonce": "0x03", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1283,7 +1283,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1291,7 +1291,7 @@ "gasPrice": "0x3b9aca00", "gas": "0x7b0d", "nonce": "0x03", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1306,7 +1306,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1314,7 +1314,7 @@ "gasPrice": "0x3b9aca00", "gas": "0x7b0d", "nonce": "0x03", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1329,7 +1329,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1337,7 +1337,7 @@ "gasPrice": "0x3b9aca00", "gas": "0x7b0d", "nonce": "0x03", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1352,7 +1352,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1360,7 +1360,7 @@ "gasPrice": "0x3b9aca00", "gas": "0x7b0d", "nonce": "0x03", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1376,7 +1376,7 @@ "id": 6616756286038873, "time": 1502734910224, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1384,7 +1384,7 @@ "gasPrice": "0x3b9aca00", "gas": "0x7b0d", "nonce": "0x03", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1411,7 +1411,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1419,14 +1419,14 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x04", - "chainId": 3 + "chainId": 5 }, "history": [ { "id": 6616756286038874, "time": 1502734917414, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1439,7 +1439,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1452,7 +1452,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1465,7 +1465,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1478,7 +1478,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1498,7 +1498,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1518,7 +1518,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1526,7 +1526,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x04", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1539,7 +1539,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1547,7 +1547,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x04", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1560,7 +1560,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1568,7 +1568,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x04", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1582,7 +1582,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1590,7 +1590,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x04", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1604,7 +1604,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1612,7 +1612,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x04", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1627,7 +1627,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1635,7 +1635,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x04", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1650,7 +1650,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1658,7 +1658,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x04", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1673,7 +1673,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1681,7 +1681,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x04", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1696,7 +1696,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1704,7 +1704,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x04", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1720,7 +1720,7 @@ "id": 6616756286038874, "time": 1502734917414, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1728,7 +1728,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x04", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b067", @@ -1755,7 +1755,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1763,14 +1763,14 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x05", - "chainId": 3 + "chainId": 5 }, "history": [ { "id": 6616756286038875, "time": 1502734922745, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1783,7 +1783,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "unapproved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1796,7 +1796,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1809,7 +1809,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1822,7 +1822,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1842,7 +1842,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "approved", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1862,7 +1862,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1870,7 +1870,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x05", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b068", @@ -1883,7 +1883,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1891,7 +1891,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x05", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b068", @@ -1904,7 +1904,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1912,7 +1912,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x05", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b068", @@ -1926,7 +1926,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1934,7 +1934,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x05", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b068", @@ -1948,7 +1948,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1956,7 +1956,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x05", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b068", @@ -1971,7 +1971,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "signed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -1979,7 +1979,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x05", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b068", @@ -1994,7 +1994,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -2002,7 +2002,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x05", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b068", @@ -2017,7 +2017,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "submitted", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -2025,7 +2025,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x05", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b068", @@ -2040,7 +2040,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -2048,7 +2048,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x05", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b068", @@ -2064,7 +2064,7 @@ "id": 6616756286038875, "time": 1502734922745, "status": "confirmed", - "metamaskNetworkId": "3", + "metamaskNetworkId": "5", "txParams": { "from": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", "to": "0x3ae39e89dc7e736cce53091057a45bf44b1a566c", @@ -2072,7 +2072,7 @@ "gasPrice": "0x4a817c800", "gas": "0x7b0d", "nonce": "0x05", - "chainId": 3 + "chainId": 5 }, "nonceDetails": { "blockNumber": "0x16b068", diff --git a/test/data/transaction-data.json b/test/data/transaction-data.json index b3f2b05c5fe8..24d1deaf7ac7 100644 --- a/test/data/transaction-data.json +++ b/test/data/transaction-data.json @@ -864,10 +864,10 @@ "id": 1441203963845330, "time": 1652206763566, "status": "confirmed", - "metamaskNetworkId": "4", + "metamaskNetworkId": "5", "originalGasEstimate": "0x118e0", "userEditedGasLimit": false, - "chainId": "0x4", + "chainId": "0x5", "loadingDefaults": false, "dappSuggestedGasFees": { "maxPriorityFeePerGas": "0x3B9ACA00", @@ -884,7 +884,7 @@ "maxFeePerGas": "0x7be830aec", "maxPriorityFeePerGas": "0x3B9ACA00" }, - "origin": "https://rinkeby.etherscan.io", + "origin": "https://goerli.etherscan.io", "type": "safetransferfrom", "userFeeLevel": "dappSuggested", "defaultGasEstimates": { @@ -980,10 +980,10 @@ "id": 1441203963845330, "time": 1652206763566, "status": "confirmed", - "metamaskNetworkId": "4", + "metamaskNetworkId": "5", "originalGasEstimate": "0x118e0", "userEditedGasLimit": false, - "chainId": "0x4", + "chainId": "0x5", "loadingDefaults": false, "dappSuggestedGasFees": { "maxPriorityFeePerGas": "0x3B9ACA00", @@ -1000,7 +1000,7 @@ "maxFeePerGas": "0x7be830aec", "maxPriorityFeePerGas": "0x3B9ACA00" }, - "origin": "https://rinkeby.etherscan.io", + "origin": "https://goerli.etherscan.io", "type": "safetransferfrom", "userFeeLevel": "dappSuggested", "defaultGasEstimates": { @@ -1095,10 +1095,10 @@ "id": 1441203963845330, "time": 1652206763566, "status": "confirmed", - "metamaskNetworkId": "4", + "metamaskNetworkId": "5", "originalGasEstimate": "0x118e0", "userEditedGasLimit": false, - "chainId": "0x4", + "chainId": "0x5", "loadingDefaults": false, "dappSuggestedGasFees": { "maxPriorityFeePerGas": "0x3B9ACA00", @@ -1115,7 +1115,7 @@ "maxFeePerGas": "0x7be830aec", "maxPriorityFeePerGas": "0x3B9ACA00" }, - "origin": "https://rinkeby.etherscan.io", + "origin": "https://goerli.etherscan.io", "type": "safetransferfrom", "userFeeLevel": "dappSuggested", "defaultGasEstimates": { diff --git a/test/e2e/benchmark.js b/test/e2e/benchmark.js index df4c957568a7..760f4f70b8a2 100755 --- a/test/e2e/benchmark.js +++ b/test/e2e/benchmark.js @@ -13,22 +13,26 @@ const { } = require('../helpers/file'); const { withFixtures, tinyDelayMs } = require('./helpers'); const { PAGES } = require('./webdriver/driver'); +const FixtureBuilder = require('./fixture-builder'); const DEFAULT_NUM_SAMPLES = 20; const ALL_PAGES = Object.values(PAGES); async function measurePage(pageName) { let metrics; - await withFixtures({ fixtures: 'imported-account' }, async ({ driver }) => { - await driver.delay(tinyDelayMs); - await driver.navigate(); - await driver.fill('#password', 'correct horse battery staple'); - await driver.press('#password', driver.Key.ENTER); - await driver.findElement('.selected-account__name'); - await driver.navigate(pageName); - await driver.delay(1000); - metrics = await driver.collectMetrics(); - }); + await withFixtures( + { fixtures: new FixtureBuilder().build() }, + async ({ driver }) => { + await driver.delay(tinyDelayMs); + await driver.navigate(); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + await driver.findElement('.selected-account__name'); + await driver.navigate(pageName); + await driver.delay(1000); + metrics = await driver.collectMetrics(); + }, + ); return metrics; } diff --git a/test/e2e/fixture-builder.js b/test/e2e/fixture-builder.js new file mode 100644 index 000000000000..7717a8a9acab --- /dev/null +++ b/test/e2e/fixture-builder.js @@ -0,0 +1,1108 @@ +const { merge } = require('lodash'); + +function defaultFixture() { + return { + data: { + AlertController: { + alertEnabledness: { + unconnectedAccount: true, + web3ShimUsage: true, + }, + unconnectedAccountAlertShownOrigins: {}, + web3ShimUsageOrigins: {}, + }, + AnnouncementController: { + announcements: { + 1: { + date: '2021-03-17', + id: 1, + image: { + height: '230px', + placeImageBelowDescription: true, + src: 'images/mobile-link-qr.svg', + width: '230px', + }, + isShown: false, + }, + 3: { + date: '2021-03-08', + id: 3, + isShown: false, + }, + 4: { + date: '2021-05-11', + id: 4, + image: { + src: 'images/source-logos-bsc.svg', + width: '100%', + }, + isShown: false, + }, + 5: { + date: '2021-06-09', + id: 5, + isShown: false, + }, + 6: { + date: '2021-05-26', + id: 6, + isShown: false, + }, + 7: { + date: '2021-09-17', + id: 7, + isShown: false, + }, + 8: { + date: '2021-11-01', + id: 8, + isShown: false, + }, + 9: { + date: '2021-12-07', + id: 9, + image: { + src: 'images/txinsights.png', + width: '80%', + }, + isShown: false, + }, + 10: { + date: '2022-09-15', + id: 10, + image: { + src: 'images/token-detection.svg', + width: '100%', + }, + isShown: false, + }, + 11: { + date: '2022-09-15', + id: 11, + isShown: false, + }, + 12: { + date: '2022-05-18', + id: 12, + image: { + src: 'images/darkmode-banner.png', + width: '100%', + }, + isShown: false, + }, + 13: { + date: '2022-09-15', + id: 13, + isShown: false, + }, + 14: { + date: '2022-09-15', + id: 14, + isShown: false, + }, + 15: { + date: '2022-09-15', + id: 15, + isShown: false, + }, + 16: { + date: null, + id: 16, + isShown: true, + }, + }, + }, + AppStateController: { + browserEnvironment: {}, + collectiblesDetectionNoticeDismissed: false, + collectiblesDropdownState: {}, + connectedStatusPopoverHasBeenShown: true, + defaultHomeActiveTabName: null, + enableEIP1559V2NoticeDismissed: false, + fullScreenGasPollTokens: [], + notificationGasPollTokens: [], + popupGasPollTokens: [], + qrHardware: {}, + recoveryPhraseReminderHasBeenShown: true, + recoveryPhraseReminderLastShown: + '__FIXTURE_SUBSTITUTION__currentDateInMilliseconds', + showPortfolioTooltip: false, + showTestnetMessageInDropdown: true, + trezorModel: null, + usedNetworks: { + '0x1': true, + '0x5': true, + '0x539': true, + }, + }, + CachedBalancesController: { + cachedBalances: { + '0x539': {}, + }, + }, + CurrencyController: { + conversionDate: 1665507600.0, + conversionRate: 1300.0, + currentCurrency: 'usd', + nativeCurrency: 'ETH', + usdConversionRate: 1300.0, + }, + GasFeeController: { + estimatedGasFeeTimeBounds: {}, + gasEstimateType: 'none', + gasFeeEstimates: {}, + }, + IncomingTransactionsController: { + incomingTransactions: {}, + incomingTxLastFetchedBlockByChainId: { + '0x1': null, + '0x5': null, + '0xaa36a7': null, + }, + }, + KeyringController: { + vault: + '{"data":"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT","iv":"FbeHDAW5afeWNORfNJBR0Q==","salt":"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8="}', + }, + MetaMetricsController: { + eventsBeforeMetricsOptIn: [], + fragments: {}, + metaMetricsId: null, + participateInMetaMetrics: false, + traits: {}, + }, + NetworkController: { + network: '1337', + provider: { + chainId: '0x539', + nickname: 'Localhost 8545', + rpcPrefs: {}, + rpcUrl: 'http://localhost:8545', + ticker: 'ETH', + type: 'rpc', + }, + }, + OnboardingController: { + completedOnboarding: true, + firstTimeFlowType: 'import', + onboardingTabs: {}, + seedPhraseBackedUp: true, + }, + PermissionController: { + subjects: {}, + }, + PreferencesController: { + advancedGasFee: null, + currentLocale: 'en', + dismissSeedBackUpReminder: true, + featureFlags: { + showIncomingTransactions: true, + }, + forgottenPassword: false, + frequentRpcListDetail: [ + { + chainId: '0x539', + nickname: 'Localhost 8545', + rpcPrefs: {}, + rpcUrl: 'http://localhost:8545', + ticker: 'ETH', + }, + ], + identities: { + '0x5cfe73b6021e818b776b421b1c4db2474086a7e1': { + address: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + lastSelected: 1665507600000, + name: 'Account 1', + }, + }, + infuraBlocked: false, + ipfsGateway: 'dweb.link', + knownMethodData: {}, + ledgerTransportType: 'webhid', + lostIdentities: {}, + openSeaEnabled: false, + preferences: { + hideZeroBalanceTokens: false, + showFiatInTestnets: false, + showTestNetworks: false, + useNativeCurrencyAsPrimaryCurrency: true, + }, + selectedAddress: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + theme: 'light', + useBlockie: false, + useNftDetection: false, + useNonceField: false, + usePhishDetect: true, + useTokenDetection: false, + }, + SmartTransactionsController: { + smartTransactionsState: { + fees: {}, + liveness: true, + smartTransactions: { + '0x1': [], + }, + }, + }, + SubjectMetadataController: { + subjectMetadata: { + 'https://metamask.github.io': { + extensionId: null, + iconUrl: null, + name: 'MetaMask < = > Ledger Bridge', + origin: 'https://metamask.github.io', + subjectType: 'website', + }, + }, + }, + TokensController: { + allDetectedTokens: {}, + allIgnoredTokens: {}, + allTokens: {}, + detectedTokens: [], + ignoredTokens: [], + suggestedAssets: [], + tokens: [], + }, + TransactionController: { + transactions: {}, + }, + config: {}, + firstTimeInfo: { + date: 1665507600000, + version: '10.21.0', + }, + }, + }; +} +function onboardingFixture() { + return { + data: { + AppStateController: { + browserEnvironment: {}, + collectiblesDetectionNoticeDismissed: false, + collectiblesDropdownState: {}, + connectedStatusPopoverHasBeenShown: true, + defaultHomeActiveTabName: null, + enableEIP1559V2NoticeDismissed: false, + fullScreenGasPollTokens: [], + notificationGasPollTokens: [], + popupGasPollTokens: [], + qrHardware: {}, + recoveryPhraseReminderHasBeenShown: false, + recoveryPhraseReminderLastShown: + '__FIXTURE_SUBSTITUTION__currentDateInMilliseconds', + showPortfolioTooltip: true, + showTestnetMessageInDropdown: true, + trezorModel: null, + usedNetworks: { + '0x1': true, + '0x5': true, + '0x539': true, + }, + }, + NetworkController: { + network: '1337', + provider: { + ticker: 'ETH', + type: 'rpc', + rpcUrl: 'http://localhost:8545', + chainId: '0x539', + nickname: 'Localhost 8545', + }, + }, + PreferencesController: { + advancedGasFee: null, + currentLocale: 'en', + dismissSeedBackUpReminder: false, + featureFlags: { + showIncomingTransactions: true, + }, + forgottenPassword: false, + frequentRpcListDetail: [ + { + chainId: '0x539', + nickname: 'Localhost 8545', + rpcPrefs: {}, + rpcUrl: 'http://localhost:8545', + ticker: 'ETH', + }, + ], + identities: {}, + infuraBlocked: false, + ipfsGateway: 'dweb.link', + knownMethodData: {}, + ledgerTransportType: 'webhid', + lostIdentities: {}, + openSeaEnabled: false, + preferences: { + hideZeroBalanceTokens: false, + showFiatInTestnets: false, + showTestNetworks: false, + useNativeCurrencyAsPrimaryCurrency: true, + }, + theme: 'light', + useBlockie: false, + useNftDetection: false, + useNonceField: false, + usePhishDetect: true, + useTokenDetection: false, + }, + SmartTransactionsController: { + smartTransactionsState: { + fees: {}, + liveness: true, + smartTransactions: { + '0x1': [], + }, + }, + }, + TokensController: { + allDetectedTokens: {}, + allIgnoredTokens: {}, + allTokens: {}, + detectedTokens: [], + ignoredTokens: [], + suggestedAssets: [], + tokens: [], + }, + config: {}, + firstTimeInfo: { + date: 1665507600000, + version: '10.21.0', + }, + }, + }; +} + +class FixtureBuilder { + constructor({ onboarding = false } = {}) { + this.fixture = onboarding === true ? onboardingFixture() : defaultFixture(); + } + + withAddressBookController(data) { + merge( + this.fixture.data.AddressBookController + ? this.fixture.data.AddressBookController + : (this.fixture.data.AddressBookController = {}), + data, + ); + return this; + } + + withAlertController(data) { + merge(this.fixture.data.AlertController, data); + return this; + } + + withAnnouncementController(data) { + merge(this.fixture.data.AnnouncementController, data); + return this; + } + + withAppStateController(data) { + merge(this.fixture.data.AppStateController, data); + return this; + } + + withCachedBalancesController(data) { + merge(this.fixture.data.CachedBalancesController, data); + return this; + } + + withCollectiblesController(data) { + merge( + this.fixture.data.NftController + ? this.fixture.data.NftController + : (this.fixture.data.NftController = {}), + data, + ); + return this; + } + + withCurrencyController(data) { + merge(this.fixture.data.CurrencyController, data); + return this; + } + + withGasFeeController(data) { + merge(this.fixture.data.GasFeeController, data); + return this; + } + + withIncomingTransactionsController(data) { + merge( + this.fixture.data.IncomingTransactionsController + ? this.fixture.data.IncomingTransactionsController + : (this.fixture.data.IncomingTransactionsController = {}), + data, + ); + return this; + } + + withKeyringController(data) { + merge(this.fixture.data.KeyringController, data); + return this; + } + + withKeyringControllerImportedAccountVault() { + return this.withKeyringController({ + vault: + '{"data":"Ot+BTtJPag0xubdiv1nO9bsSvTHivHCd6CD7Lxgb1McYw3VqMjgp5rPMZmblJ1lscuMxyiqp99G52uXO9S0em6F9htpa+t/wn6qubRKTTNG9fxNzQrKXRDNhdgfYckVk5VAZ4fgl2iMZcRDvS8H/+gucVKJ33Sl6mXyPofdexXhWDCU6uR2YecnfaIum9cL2u/GqOMPE3jxzy0Wip0x2Jyp3QOKhvu8A3GIjzagLOaQ7a1APdl8=","iv":"lbsyPeGYWU6U1+jvmW9UHg==","salt":"Zmbhpskwxe4rYfXtELBvlcvW4HISPBATRmMqzsnZPMg="}', + }); + } + + withMetaMetricsController(data) { + merge(this.fixture.data.MetaMetricsController, data); + return this; + } + + withNetworkController(data) { + merge(this.fixture.data.NetworkController, data); + return this; + } + + withOnboardingController(data) { + merge(this.fixture.data.OnboardingController, data); + return this; + } + + withPermissionController(data) { + merge(this.fixture.data.PermissionController, data); + return this; + } + + withPermissionControllerConnectedToTestDapp() { + return this.withPermissionController({ + subjects: { + 'http://127.0.0.1:8080': { + origin: 'http://127.0.0.1:8080', + permissions: { + eth_accounts: { + id: 'ZaqPEWxyhNCJYACFw93jE', + parentCapability: 'eth_accounts', + invoker: 'http://127.0.0.1:8080', + caveats: [ + { + type: 'restrictReturnedAccounts', + value: ['0x5cfe73b6021e818b776b421b1c4db2474086a7e1'], + }, + ], + date: 1664388714636, + }, + }, + }, + }, + }); + } + + withPermissionControllerConnectedToSnapDapp() { + return this.withPermissionController({ + subjects: { + 'https://metamask.github.io': { + origin: 'https://metamask.github.io', + permissions: { + 'wallet_snap_npm:@metamask/test-snap-bip32': { + id: 'CwdJq0x8N_b9FNxn6dVuP', + parentCapability: 'wallet_snap_npm:@metamask/test-snap-bip32', + invoker: 'https://metamask.github.io', + caveats: null, + date: 1664388714636, + }, + 'wallet_snap_npm:@metamask/test-snap-bip44': { + id: '8zH-0opWuZhvJew41FMVh', + parentCapability: 'wallet_snap_npm:@metamask/test-snap-bip44', + invoker: 'https://metamask.github.io', + caveats: null, + date: 1664388714636, + }, + 'wallet_snap_npm:@metamask/test-snap-confirm': { + id: 'Wb_1c9toBggBQWfOJwjMg', + parentCapability: 'wallet_snap_npm:@metamask/test-snap-confirm', + invoker: 'https://metamask.github.io', + caveats: null, + date: 1664388714636, + }, + 'wallet_snap_npm:@metamask/test-snap-error': { + id: '5FUZoCyimOWKTbuLCEOWa', + parentCapability: 'wallet_snap_npm:@metamask/test-snap-error', + invoker: 'https://metamask.github.io', + caveats: null, + date: 1664388714636, + }, + 'wallet_snap_npm:@metamask/test-snap-managestate': { + id: 'Z6XPdyuCHCf1pyqSiU7nh', + parentCapability: + 'wallet_snap_npm:@metamask/test-snap-managestate', + invoker: 'https://metamask.github.io', + caveats: null, + date: 1664388714636, + }, + 'wallet_snap_npm:@metamask/test-snap-notification': { + id: '_xfRMXzq0bs8QcXRcvjcP', + parentCapability: + 'wallet_snap_npm:@metamask/test-snap-notification', + invoker: 'https://metamask.github.io', + caveats: null, + date: 1664388714636, + }, + }, + }, + }, + }); + } + + withPermissionLogController(data) { + merge( + this.fixture.data.PermissionLogController + ? this.fixture.data.PermissionLogController + : (this.fixture.data.PermissionLogController = {}), + data, + ); + return this; + } + + withPreferencesController(data) { + merge(this.fixture.data.PreferencesController, data); + return this; + } + + withPreferencesControllerImportedAccountIdentities() { + return this.withPreferencesController({ + identities: { + '0x0cc5261ab8ce458dc977078a3623e2badd27afd3': { + name: 'Account 1', + address: '0x0cc5261ab8ce458dc977078a3623e2badd27afd3', + lastSelected: 1665507600000, + }, + '0x3ed0ee22e0685ebbf07b2360a8331693c413cc59': { + name: 'Account 2', + address: '0x3ed0ee22e0685ebbf07b2360a8331693c413cc59', + }, + '0xd38d853771fb546bd8b18b2f3638491bc0b0e906': { + name: 'Account 3', + address: '0xd38d853771fb546bd8b18b2f3638491bc0b0e906', + }, + }, + selectedAddress: '0x0cc5261ab8ce458dc977078a3623e2badd27afd3', + }); + } + + withSmartTransactionsController(data) { + merge(this.fixture.data.SmartTransactionsController, data); + return this; + } + + withSubjectMetadataController(data) { + merge(this.fixture.data.SubjectMetadataController, data); + return this; + } + + withTokenListController(data) { + merge( + this.fixture.data.TokenListController + ? this.fixture.data.TokenListController + : (this.fixture.data.TokenListController = {}), + data, + ); + return this; + } + + withTokensController(data) { + merge(this.fixture.data.TokensController, data); + return this; + } + + withTransactionController(data) { + merge( + this.fixture.data.TransactionController + ? this.fixture.data.TransactionController + : (this.fixture.data.TransactionController = {}), + data, + ); + return this; + } + + withTransactionControllerMultipleTransactions() { + return this.withTransactionController({ + transactions: { + 7911313280012623: { + chainId: '0x539', + dappSuggestedGasFees: { + gas: '0x5208', + gasPrice: '0x4a817c800', + }, + history: [ + { + chainId: '0x539', + dappSuggestedGasFees: { + gas: '0x5208', + gasPrice: '0x4a817c800', + }, + id: 7911313280012623, + loadingDefaults: true, + metamaskNetworkId: '1337', + origin: 'https://metamask.github.io', + status: 'unapproved', + time: 1631545991949, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x5208', + gasPrice: '0x4a817c800', + to: '0x2f318c334780961fb129d2a6c30d0763d9a5c970', + value: '0x29a2241af62c0000', + }, + type: 'simpleSend', + }, + [ + { + note: 'Added new unapproved transaction.', + op: 'replace', + path: '/loadingDefaults', + timestamp: 1631545992244, + value: false, + }, + ], + ], + id: 7911313280012623, + loadingDefaults: false, + metamaskNetworkId: '1337', + origin: 'https://metamask.github.io', + status: 'unapproved', + time: 1631545991949, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x5208', + gasPrice: '0x4a817c800', + to: '0x2f318c334780961fb129d2a6c30d0763d9a5c970', + value: '0x29a2241af62c0000', + }, + type: 'simpleSend', + }, + 7911313280012624: { + chainId: '0x539', + dappSuggestedGasFees: { + gas: '0x5208', + gasPrice: '0x4a817c800', + }, + history: [ + { + chainId: '0x539', + dappSuggestedGasFees: { + gas: '0x5208', + gasPrice: '0x4a817c800', + }, + id: 7911313280012624, + loadingDefaults: true, + metamaskNetworkId: '1337', + origin: 'https://metamask.github.io', + status: 'unapproved', + time: 1631545994578, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x5208', + gasPrice: '0x4a817c800', + to: '0x2f318c334780961fb129d2a6c30d0763d9a5c970', + value: '0x29a2241af62c0000', + }, + type: 'simpleSend', + }, + [ + { + note: 'Added new unapproved transaction.', + op: 'replace', + path: '/loadingDefaults', + timestamp: 1631545994695, + value: false, + }, + ], + ], + id: 7911313280012624, + loadingDefaults: false, + metamaskNetworkId: '1337', + origin: 'https://metamask.github.io', + status: 'unapproved', + time: 1631545994578, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x5208', + gasPrice: '0x4a817c800', + to: '0x2f318c334780961fb129d2a6c30d0763d9a5c970', + value: '0x29a2241af62c0000', + }, + type: 'simpleSend', + }, + 7911313280012625: { + chainId: '0x539', + dappSuggestedGasFees: { + gas: '0x5208', + gasPrice: '0x4a817c800', + }, + history: [ + { + chainId: '0x539', + dappSuggestedGasFees: { + gas: '0x5208', + gasPrice: '0x4a817c800', + }, + id: 7911313280012625, + loadingDefaults: true, + metamaskNetworkId: '1337', + origin: 'https://metamask.github.io', + status: 'unapproved', + time: 1631545996673, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x5208', + gasPrice: '0x4a817c800', + to: '0x2f318c334780961fb129d2a6c30d0763d9a5c970', + value: '0x29a2241af62c0000', + }, + type: 'simpleSend', + }, + [ + { + note: 'Added new unapproved transaction.', + op: 'replace', + path: '/loadingDefaults', + timestamp: 1631545996678, + value: false, + }, + ], + ], + id: 7911313280012625, + loadingDefaults: false, + metamaskNetworkId: '1337', + origin: 'https://metamask.github.io', + status: 'unapproved', + time: 1631545996673, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x5208', + gasPrice: '0x4a817c800', + to: '0x2f318c334780961fb129d2a6c30d0763d9a5c970', + value: '0x29a2241af62c0000', + }, + type: 'simpleSend', + }, + 7911313280012626: { + chainId: '0x539', + dappSuggestedGasFees: { + gas: '0x5208', + gasPrice: '0x4a817c800', + }, + history: [ + { + chainId: '0x539', + dappSuggestedGasFees: { + gas: '0x5208', + gasPrice: '0x4a817c800', + }, + id: 7911313280012626, + loadingDefaults: true, + metamaskNetworkId: '1337', + origin: 'https://metamask.github.io', + status: 'unapproved', + time: 1631545998675, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x5208', + gasPrice: '0x4a817c800', + to: '0x2f318c334780961fb129d2a6c30d0763d9a5c970', + value: '0x29a2241af62c0000', + }, + type: 'simpleSend', + }, + [ + { + note: 'Added new unapproved transaction.', + op: 'replace', + path: '/loadingDefaults', + timestamp: 1631545998677, + value: false, + }, + ], + ], + id: 7911313280012626, + loadingDefaults: false, + metamaskNetworkId: '1337', + origin: 'https://metamask.github.io', + status: 'unapproved', + time: 1631545998675, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x5208', + gasPrice: '0x4a817c800', + to: '0x2f318c334780961fb129d2a6c30d0763d9a5c970', + value: '0x29a2241af62c0000', + }, + type: 'simpleSend', + }, + }, + }); + } + + withTransactionControllerTypeOneTransaction() { + return this.withTransactionController({ + transactions: { + 4046084157914634: { + chainId: '0x539', + history: [ + { + chainId: '0x539', + id: 4046084157914634, + loadingDefaults: true, + metamaskNetworkId: '1337', + origin: 'metamask', + status: 'unapproved', + time: 1617228030067, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x61a8', + gasPrice: '0x2540be400', + to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + value: '0xde0b6b3a7640000', + }, + type: 'simpleSend', + }, + [ + { + note: 'Added new unapproved transaction.', + op: 'replace', + path: '/loadingDefaults', + timestamp: 1617228030069, + value: false, + }, + ], + ], + id: 4046084157914634, + loadingDefaults: false, + metamaskNetworkId: '1337', + origin: 'metamask', + primaryTransaction: { + chainId: '0x539', + id: 4046084157914634, + loadingDefaults: true, + metamaskNetworkId: '1337', + origin: 'metamask', + status: 'unapproved', + time: 1617228030067, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x61a8', + gasPrice: '0x2540be400', + to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + value: '0xde0b6b3a7640000', + }, + type: 'sentEther', + }, + status: 'unapproved', + time: 1617228030067, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x61a8', + gasPrice: '0x2540be400', + to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + value: '0xde0b6b3a7640000', + }, + type: 'simpleSend', + }, + }, + }); + } + + withTransactionControllerTypeTwoTransaction() { + return this.withTransactionController({ + transactions: { + 4046084157914634: { + chainId: '0x539', + history: [ + { + chainId: '0x539', + id: 4046084157914634, + loadingDefaults: true, + metamaskNetworkId: '1337', + origin: 'metamask', + status: 'unapproved', + time: 1617228030067, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x61a8', + maxFeePerGas: '0x59682f0c', + maxPriorityFeePerGas: '0x59682f00', + to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + type: '0x2', + value: '0xde0b6b3a7640000', + }, + type: 'simpleSend', + }, + [ + { + note: 'Added new unapproved transaction.', + op: 'replace', + path: '/loadingDefaults', + timestamp: 1617228030069, + value: false, + }, + ], + ], + id: 4046084157914634, + loadingDefaults: false, + metamaskNetworkId: '1337', + origin: 'metamask', + primaryTransaction: { + chainId: '0x539', + id: 4046084157914634, + loadingDefaults: true, + metamaskNetworkId: '1337', + origin: 'metamask', + status: 'unapproved', + time: 1617228030067, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x61a8', + maxFeePerGas: '0x59682f0c', + maxPriorityFeePerGas: '0x59682f00', + to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + type: '0x2', + value: '0xde0b6b3a7640000', + }, + type: 'sentEther', + }, + status: 'unapproved', + time: 1617228030067, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x61a8', + maxFeePerGas: '0x59682f0c', + maxPriorityFeePerGas: '0x59682f00', + to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + type: '0x2', + value: '0xde0b6b3a7640000', + }, + type: 'simpleSend', + }, + }, + }); + } + + withTransactionControllerApprovedTransaction() { + return this.withTransactionController({ + transactions: { + 4046084157914634: { + chainId: '0x539', + history: [ + { + chainId: '0x539', + id: 4046084157914634, + loadingDefaults: true, + metamaskNetworkId: '1337', + origin: 'metamask', + status: 'unapproved', + time: 1617228030067, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x61a8', + maxFeePerGas: '0x59682f0c', + maxPriorityFeePerGas: '0x59682f00', + to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + type: '0x2', + value: '0xde0b6b3a7640000', + }, + type: 'simpleSend', + }, + [ + { + note: 'Added new unapproved transaction.', + op: 'replace', + path: '/loadingDefaults', + timestamp: 1617228030069, + value: false, + }, + ], + [ + { + op: 'add', + path: '/txParams/nonce', + value: '0x0', + note: 'transactions#approveTransaction', + timestamp: 1617228031069, + }, + { + op: 'add', + path: '/nonceDetails', + value: { + params: { + highestLocallyConfirmed: 0, + highestSuggested: 0, + nextNetworkNonce: 0, + }, + local: { + name: 'local', + nonce: 0, + details: { + startPoint: 0, + highest: 0, + }, + }, + network: { + name: 'network', + nonce: 0, + details: { + blockNumber: '0x0', + baseCount: 0, + }, + }, + }, + }, + ], + ], + id: 4046084157914634, + loadingDefaults: false, + metamaskNetworkId: '1337', + origin: 'metamask', + primaryTransaction: { + chainId: '0x539', + id: 4046084157914634, + loadingDefaults: true, + metamaskNetworkId: '1337', + origin: 'metamask', + status: 'approved', + time: 1617228030067, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x61a8', + maxFeePerGas: '0x59682f0c', + maxPriorityFeePerGas: '0x59682f00', + to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + type: '0x2', + value: '0xde0b6b3a7640000', + }, + type: 'sentEther', + }, + status: 'approved', + time: 1617228030067, + txParams: { + from: '0x5cfe73b6021e818b776b421b1c4db2474086a7e1', + gas: '0x61a8', + maxFeePerGas: '0x59682f0c', + maxPriorityFeePerGas: '0x59682f00', + to: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + type: '0x2', + value: '0xde0b6b3a7640000', + }, + type: 'simpleSend', + }, + }, + }); + } + + build() { + this.fixture.meta = { + version: 74, + }; + return this.fixture; + } +} + +module.exports = FixtureBuilder; diff --git a/test/e2e/fixture-server.js b/test/e2e/fixture-server.js index e27f0cfa2638..bad4bc165a52 100644 --- a/test/e2e/fixture-server.js +++ b/test/e2e/fixture-server.js @@ -1,5 +1,3 @@ -const { promises: fs } = require('fs'); -const path = require('path'); const Koa = require('koa'); const { isObject, mapValues } = require('lodash'); @@ -57,7 +55,6 @@ class FixtureServer { constructor() { this._app = new Koa(); this._stateMap = new Map([[DEFAULT_STATE_KEY, Object.create(null)]]); - this._initialStateCache = new Map(); this._app.use(async (ctx) => { // Firefox is _super_ strict about needing CORS headers @@ -94,19 +91,8 @@ class FixtureServer { }); } - async loadState(directory) { - const statePath = path.resolve(__dirname, directory, 'state.json'); - - let state; - if (this._initialStateCache.has(statePath)) { - state = this._initialStateCache.get(statePath); - } else { - const data = await fs.readFile(statePath); - const rawState = JSON.parse(data.toString('utf-8')); - state = performStateSubstitutions(rawState); - this._initialStateCache.set(statePath, state); - } - + loadJsonState(rawState) { + const state = performStateSubstitutions(rawState); this._stateMap.set(CURRENT_STATE_KEY, state); } diff --git a/test/e2e/fixtures/address-entry/state.json b/test/e2e/fixtures/address-entry/state.json deleted file mode 100644 index 5fbf10276bc8..000000000000 --- a/test/e2e/fixtures/address-entry/state.json +++ /dev/null @@ -1,174 +0,0 @@ -{ - "data": { - "AddressBookController": { - "addressBook": { - "0x539": { - "0x2f318C334780961FB129D2a6c30D0763d9a5C970": { - "address": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", - "chainId": "0x539", - "isEns": false, - "memo": "", - "name": "Test Name 1" - } - } - } - }, - "AppStateController": { - "mkrMigrationReminderTimestamp": null, - "swapsWelcomeMessageHasBeenShown": true, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {} - } - }, - "CurrencyController": { - "conversionDate": 1575697244.188, - "conversionRate": 149.61, - "currentCurrency": "usd", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "network": "1337", - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - } - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "domainMetadata": { - "metamask.github.io": { - "icon": null, - "name": "M E T A M A S K M E S H T E S T" - } - }, - "permissionsHistory": {}, - "permissionsLog": [ - { - "id": 746677923, - "method": "eth_accounts", - "methodType": "restricted", - "origin": "metamask.github.io", - "request": { - "id": 746677923, - "jsonrpc": "2.0", - "method": "eth_accounts", - "origin": "metamask.github.io", - "params": [] - }, - "requestTime": 1575697241368, - "response": { - "id": 746677923, - "jsonrpc": "2.0", - "result": [] - }, - "responseTime": 1575697241370, - "success": true - } - ] - }, - "PreferencesController": { - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "completedOnboarding": true, - "currentLocale": "en", - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "firstTimeFlowType": "create", - "forgottenPassword": false, - "frequentRpcListDetail": [], - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "knownMethodData": {}, - "lostIdentities": {}, - "metaMetricsId": null, - "participateInMetaMetrics": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "suggestedTokens": {}, - "tokens": [], - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - } - }, - "meta": { - "version": 40 - } -} diff --git a/test/e2e/fixtures/connected-state/state.json b/test/e2e/fixtures/connected-state/state.json deleted file mode 100644 index 28a20607193f..000000000000 --- a/test/e2e/fixtures/connected-state/state.json +++ /dev/null @@ -1,205 +0,0 @@ -{ - "data": { - "AppStateController": { - "connectedStatusPopoverHasBeenShown": false, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {}, - "1337": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": "0x15af1d78b58c40000" - } - } - }, - "CurrencyController": { - "conversionDate": 1594348502.519, - "conversionRate": 240.09, - "currentCurrency": "usd", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536, - "localhost": 98 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - }, - "network": "1337" - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "permissionsLog": [ - { - "id": 1764280960, - "method": "eth_requestAccounts", - "methodType": "restricted", - "origin": "http://127.0.0.1:8080", - "request": { - "method": "eth_requestAccounts", - "jsonrpc": "2.0", - "id": 1764280960, - "origin": "http://127.0.0.1:8080", - "tabId": 2 - }, - "requestTime": 1594348329232, - "response": { - "id": 1764280960, - "jsonrpc": "2.0", - "result": ["0x5cfe73b6021e818b776b421b1c4db2474086a7e1"] - }, - "responseTime": 1594348332276, - "success": true - } - ], - "permissionsHistory": { - "http://127.0.0.1:8080": { - "eth_accounts": { - "accounts": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": 1594348332276 - }, - "lastApproved": 1594348332276 - } - } - }, - "domainMetadata": { - "http://127.0.0.1:8080": { - "name": "E2E Test Dapp", - "icon": "http://127.0.0.1:8080/metamask-fox.svg", - "lastUpdated": 1594348323811, - "host": "127.0.0.1:8080" - } - } - }, - "PreferencesController": { - "frequentRpcListDetail": [], - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "tokens": [], - "suggestedTokens": {}, - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true, - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "knownMethodData": {}, - "participateInMetaMetrics": false, - "firstTimeFlowType": "create", - "currentLocale": "en", - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "lostIdentities": {}, - "forgottenPassword": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "completedOnboarding": true, - "metaMetricsId": null, - "ipfsGateway": "dweb.link", - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1" - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - }, - "PermissionsController": { - "permissionsRequests": [], - "permissionsDescriptions": {}, - "domains": { - "http://127.0.0.1:8080": { - "permissions": [ - { - "@context": ["https://github.com/MetaMask/rpc-cap"], - "parentCapability": "eth_accounts", - "id": "f55a1c15-ea48-4088-968e-63be474d42fa", - "date": 1594348332268, - "invoker": "http://127.0.0.1:8080", - "caveats": [ - { - "type": "limitResponseLength", - "value": 1, - "name": "primaryAccountOnly" - }, - { - "type": "filterResponse", - "value": ["0x5cfe73b6021e818b776b421b1c4db2474086a7e1"], - "name": "exposedAccounts" - } - ] - } - ] - } - } - } - }, - "meta": { - "version": 47 - } -} diff --git a/test/e2e/fixtures/custom-rpc/state.json b/test/e2e/fixtures/custom-rpc/state.json deleted file mode 100644 index 8088a1799dc1..000000000000 --- a/test/e2e/fixtures/custom-rpc/state.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "data": { - "AppStateController": { - "mkrMigrationReminderTimestamp": null, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {} - } - }, - "CurrencyController": { - "conversionDate": 1575697244.188, - "conversionRate": 149.61, - "currentCurrency": "usd", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "network": "1337", - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - } - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "domainMetadata": { - "metamask.github.io": { - "icon": null, - "name": "M E T A M A S K M E S H T E S T" - } - }, - "permissionsHistory": {}, - "permissionsLog": [ - { - "id": 746677923, - "method": "eth_accounts", - "methodType": "restricted", - "origin": "metamask.github.io", - "request": { - "id": 746677923, - "jsonrpc": "2.0", - "method": "eth_accounts", - "origin": "metamask.github.io", - "params": [] - }, - "requestTime": 1575697241368, - "response": { - "id": 746677923, - "jsonrpc": "2.0", - "result": [] - }, - "responseTime": 1575697241370, - "success": true - } - ] - }, - "PreferencesController": { - "frequentRpcListDetail": [ - { - "rpcUrl": "http://127.0.0.1:8545/1", - "chainId": "0x539", - "ticker": "ETH", - "nickname": "http://127.0.0.1:8545/1", - "rpcPrefs": {} - }, - { - "rpcUrl": "http://127.0.0.1:8545/2", - "chainId": "0x539", - "ticker": "ETH", - "nickname": "http://127.0.0.1:8545/2", - "rpcPrefs": {} - } - ], - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "completedOnboarding": true, - "currentLocale": "en", - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "firstTimeFlowType": "create", - "forgottenPassword": false, - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "knownMethodData": {}, - "lostIdentities": {}, - "metaMetricsId": null, - "participateInMetaMetrics": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "suggestedTokens": {}, - "tokens": [], - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - } - }, - "meta": { - "version": 40 - } -} diff --git a/test/e2e/fixtures/custom-token/state.json b/test/e2e/fixtures/custom-token/state.json deleted file mode 100644 index 5f447420b251..000000000000 --- a/test/e2e/fixtures/custom-token/state.json +++ /dev/null @@ -1,184 +0,0 @@ -{ - "data": { - "AlertController": { - "alertEnabledness": { - "unconnectedAccount": true, - "web3ShimUsage": true - }, - "unconnectedAccountAlertShownOrigins": {}, - "web3ShimUsageOrigins": {} - }, - "AppStateController": { - "connectedStatusPopoverHasBeenShown": true, - "defaultHomeActiveTabName": null, - "recoveryPhraseReminderHasBeenShown": true, - "recoveryPhraseReminderLastShown": "__FIXTURE_SUBSTITUTION__currentDateInMilliseconds", - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "0x4": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": "0x0" - } - } - }, - "CurrencyController": { - "conversionDate": 1626907353.891, - "conversionRate": 1968.5, - "currentCurrency": "usd", - "nativeCurrency": "ETH", - "pendingCurrentCurrency": null, - "pendingNativeCurrency": null, - "usdConversionRate": 1968.5 - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlockByChainId": { - "0x1": null, - "0x2a": null, - "0x3": null, - "0x4": 8977934, - "0x5": null - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "MetaMetricsController": { - "metaMetricsId": "0xff3e952b9f5a27ffcab42b0b4abf689e77dcc1f9f441871dc962d622b089fb51", - "participateInMetaMetrics": true - }, - "NetworkController": { - "network": "1337", - "networkDetails": { - "EIPS": {} - }, - "previousProviderStore": { - "chainId": "0x4", - "ticker": "ETH", - "type": "rinkeby" - }, - "provider": { - "chainId": "0x539", - "nickname": "Localhost 8545", - "rpcPrefs": {}, - "rpcUrl": "http://localhost:8545", - "ticker": "ETH", - "type": "rpc" - } - }, - "NotificationController": { - "notifications": { - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": true - }, - "PermissionsController": { - "domains": {}, - "permissionsDescriptions": {}, - "permissionsRequests": [] - }, - "PreferencesController": { - "completedOnboarding": true, - "currentLocale": "en", - "dismissSeedBackUpReminder": true, - "featureFlags": { - "showIncomingTransactions": true - }, - "firstTimeFlowType": "import", - "forgottenPassword": false, - "frequentRpcListDetail": [ - { - "chainId": "0x539", - "nickname": "Localhost 8545", - "rpcPrefs": {}, - "rpcUrl": "http://localhost:8545", - "ticker": "ETH" - } - ], - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "lastSelected": 1626907346643, - "name": "Account 1" - } - }, - "infuraBlocked": false, - "ipfsGateway": "dweb.link", - "knownMethodData": {}, - "lostIdentities": {}, - "preferences": { - "hideZeroBalanceTokens": false, - "showFiatInTestnets": false, - "useNativeCurrencyAsPrimaryCurrency": true - }, - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "useBlockie": false, - "useLedgerLive": false, - "useNonceField": false, - "usePhishDetect": true, - "useStaticTokenList": false - }, - "TokensController": { - "allTokens": { - "0x539": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": [ - { - "address": "0x86002be4cdd922de1ccb831582bf99284b99ac12", - "decimals": 4, - "image": null, - "isERC721": false, - "symbol": "TST" - } - ] - } - }, - "ignoredTokens": [], - "suggestedAssets": [], - "allIgnoredTokens": {}, - "tokens": [ - { - "address": "0x86002be4cdd922de1ccb831582bf99284b99ac12", - "decimals": 4, - "image": null, - "isERC721": false, - "symbol": "TST" - } - ] - }, - "TransactionController": { - "transactions": {} - }, - "config": {}, - "firstTimeInfo": { - "date": 1626907328205, - "version": "9.8.1" - } - }, - "meta": { - "version": 63 - } -} diff --git a/test/e2e/fixtures/eip-1559-v2-dapp/state.json b/test/e2e/fixtures/eip-1559-v2-dapp/state.json deleted file mode 100644 index 1b01bc0778c9..000000000000 --- a/test/e2e/fixtures/eip-1559-v2-dapp/state.json +++ /dev/null @@ -1,165 +0,0 @@ -{ - "data": { - "AppStateController": { - "mkrMigrationReminderTimestamp": null, - "swapsWelcomeMessageHasBeenShown": true, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {} - } - }, - "CurrencyController": { - "conversionDate": 1575697244.188, - "conversionRate": 149.61, - "currentCurrency": "usd", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "network": "1337", - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - } - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "domainMetadata": { - "metamask.github.io": { - "icon": null, - "name": "M E T A M A S K M E S H T E S T" - } - }, - "permissionsHistory": {}, - "permissionsLog": [ - { - "id": 746677923, - "method": "eth_accounts", - "methodType": "restricted", - "origin": "metamask.github.io", - "request": { - "id": 746677923, - "jsonrpc": "2.0", - "method": "eth_accounts", - "origin": "metamask.github.io", - "params": [] - }, - "requestTime": 1575697241368, - "response": { - "id": 746677923, - "jsonrpc": "2.0", - "result": [] - }, - "responseTime": 1575697241370, - "success": true - } - ] - }, - "PreferencesController": { - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "completedOnboarding": true, - "eip1559V2Enabled": true, - "currentLocale": "en", - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "firstTimeFlowType": "create", - "forgottenPassword": false, - "frequentRpcListDetail": [], - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "knownMethodData": {}, - "lostIdentities": {}, - "metaMetricsId": null, - "participateInMetaMetrics": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "suggestedTokens": {}, - "tokens": [], - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true - }, - "TransactionController": { - "transactions": {} - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - } - }, - "meta": { - "version": 40 - } -} diff --git a/test/e2e/fixtures/eip-1559-v2/state.json b/test/e2e/fixtures/eip-1559-v2/state.json deleted file mode 100644 index 0341d4ecbaa0..000000000000 --- a/test/e2e/fixtures/eip-1559-v2/state.json +++ /dev/null @@ -1,234 +0,0 @@ -{ - "data": { - "AppStateController": { - "mkrMigrationReminderTimestamp": null, - "swapsWelcomeMessageHasBeenShown": true, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {} - } - }, - "CurrencyController": { - "conversionDate": 1575697244.188, - "conversionRate": 149.61, - "currentCurrency": "usd", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "network": "1337", - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - } - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "domainMetadata": { - "metamask.github.io": { - "icon": null, - "name": "M E T A M A S K M E S H T E S T" - } - }, - "permissionsHistory": {}, - "permissionsLog": [ - { - "id": 746677923, - "method": "eth_accounts", - "methodType": "restricted", - "origin": "metamask.github.io", - "request": { - "id": 746677923, - "jsonrpc": "2.0", - "method": "eth_accounts", - "origin": "metamask.github.io", - "params": [] - }, - "requestTime": 1575697241368, - "response": { - "id": 746677923, - "jsonrpc": "2.0", - "result": [] - }, - "responseTime": 1575697241370, - "success": true - } - ] - }, - "PreferencesController": { - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "completedOnboarding": true, - "eip1559V2Enabled": true, - "currentLocale": "en", - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "firstTimeFlowType": "create", - "forgottenPassword": false, - "frequentRpcListDetail": [], - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "knownMethodData": {}, - "lostIdentities": {}, - "metaMetricsId": null, - "participateInMetaMetrics": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "suggestedTokens": {}, - "tokens": [], - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true - }, - "TransactionController": { - "transactions": { - "4046084157914634": { - "chainId": "0x539", - "primaryTransaction": { - "chainId": "0x539", - "id": 4046084157914634, - "loadingDefaults": true, - "metamaskNetworkId": "1337", - "origin": "metamask", - "status": "unapproved", - "time": 1617228030067, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x61a8", - "maxFeePerGas": "0x59682f0c", - "maxPriorityFeePerGas": "0x59682f00", - "type": "0x2", - "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", - "value": "0x1e87F85809dc0000" - }, - "type": "sentEther" - }, - "history": [ - { - "chainId": "0x539", - "id": 4046084157914634, - "loadingDefaults": true, - "metamaskNetworkId": "1337", - "origin": "metamask", - "status": "unapproved", - "time": 1617228030067, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x61a8", - "maxFeePerGas": "0x59682f0c", - "maxPriorityFeePerGas": "0x59682f00", - "type": "0x2", - "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", - "value": "0x1e87F85809dc0000" - }, - "type": "simpleSend" - }, - [ - { - "note": "Added new unapproved transaction.", - "op": "replace", - "path": "/loadingDefaults", - "timestamp": 1617228030069, - "value": false - } - ] - ], - "id": 4046084157914634, - "loadingDefaults": false, - "metamaskNetworkId": "1337", - "origin": "metamask", - "status": "unapproved", - "time": 1617228030067, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x61a8", - "maxFeePerGas": "0x59682f0c", - "maxPriorityFeePerGas": "0x59682f00", - "type": "0x2", - "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", - "value": "0x1e87F85809dc0000" - }, - "type": "simpleSend" - } - } - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - } - }, - "meta": { - "version": 40 - } -} diff --git a/test/e2e/fixtures/import-ui/state.json b/test/e2e/fixtures/import-ui/state.json deleted file mode 100644 index 9de1f31ff467..000000000000 --- a/test/e2e/fixtures/import-ui/state.json +++ /dev/null @@ -1,275 +0,0 @@ -{ - "data": { - "config": {}, - "PreferencesController": { - "frequentRpcListDetail": [ - { - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "nickname": "Localhost 8545", - "rpcPrefs": {} - } - ], - "accountTokens": { - "0x0cc5261ab8ce458dc977078a3623e2badd27afd3": { - "0x539": [] - }, - "0x3ed0ee22e0685ebbf07b2360a8331693c413cc59": {}, - "0xd38d853771fb546bd8b18b2f3638491bc0b0e906": { - "0x539": [] - } - }, - "accountHiddenTokens": { - "0x0cc5261ab8ce458dc977078a3623e2badd27afd3": { - "0x539": [] - }, - "0x3ed0ee22e0685ebbf07b2360a8331693c413cc59": {}, - "0xd38d853771fb546bd8b18b2f3638491bc0b0e906": { - "0x539": [] - } - }, - "assetImages": {}, - "tokens": [], - "hiddenTokens": [], - "suggestedTokens": {}, - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true, - "featureFlags": { - "showIncomingTransactions": true - }, - "knownMethodData": {}, - "firstTimeFlowType": "import", - "currentLocale": "en", - "identities": { - "0x0cc5261ab8ce458dc977078a3623e2badd27afd3": { - "name": "Account 1", - "address": "0x0cc5261ab8ce458dc977078a3623e2badd27afd3", - "lastSelected": 1618940443499 - }, - "0x3ed0ee22e0685ebbf07b2360a8331693c413cc59": { - "name": "Account 2", - "address": "0x3ed0ee22e0685ebbf07b2360a8331693c413cc59" - }, - "0xd38d853771fb546bd8b18b2f3638491bc0b0e906": { - "name": "2nd account", - "address": "0xd38d853771fb546bd8b18b2f3638491bc0b0e906", - "lastSelected": 1618940443010 - } - }, - "lostIdentities": {}, - "forgottenPassword": false, - "preferences": { - "showFiatInTestnets": false, - "useNativeCurrencyAsPrimaryCurrency": true, - "hideZeroBalanceTokens": false - }, - "completedOnboarding": true, - "ipfsGateway": "dweb.link", - "infuraBlocked": false, - "selectedAddress": "0x0cc5261ab8ce458dc977078a3623e2badd27afd3" - }, - "firstTimeInfo": { - "version": "9.3.0", - "date": 1617927806790 - }, - "NetworkController": { - "provider": { - "ticker": "ETH", - "type": "rpc", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "nickname": "Localhost 8545" - }, - "previousProviderStore": { - "ticker": "ETH", - "type": "rpc", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "nickname": "Localhost 8545" - }, - "network": "1337" - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "CurrencyController": { - "conversionDate": 1618940438.187, - "conversionRate": 2254.54, - "currentCurrency": "usd", - "nativeCurrency": "ETH", - "usdConversionRate": 2254.54 - }, - "CachedBalancesController": { - "cachedBalances": { - "0x539": { - "0x0cc5261ab8ce458dc977078a3623e2badd27afd3": "0x14cffbeaf5a7d3000", - "0x3ed0ee22e0685ebbf07b2360a8331693c413cc59": "0x0", - "0xd38d853771fb546bd8b18b2f3638491bc0b0e906": "0x0" - } - } - }, - "MetaMetricsController": { - "participateInMetaMetrics": false, - "metaMetricsId": null - }, - "PermissionsController": { - "permissionsRequests": [], - "permissionsDescriptions": {}, - "domains": {} - }, - "TransactionController": { - "transactions": { - "1374812123920442": { - "id": 1374812123920442, - "time": 1618940444708, - "status": "confirmed", - "metamaskNetworkId": "1337", - "chainId": "0x539", - "loadingDefaults": false, - "txParams": { - "from": "0x0cc5261ab8ce458dc977078a3623e2badd27afd3", - "to": "0x2f318c334780961fb129d2a6c30d0763d9a5c970", - "nonce": "0x0", - "value": "0xde0b6b3a7640000", - "gas": "0x5208", - "gasPrice": "0x363fe1da00" - }, - "origin": "metamask", - "type": "simpleSend", - "history": [], - "nonceDetails": { - "params": { - "highestLocallyConfirmed": 0, - "highestSuggested": 0, - "nextNetworkNonce": 0 - }, - "local": { - "name": "local", - "nonce": 0, - "details": { - "startPoint": 0, - "highest": 0 - } - }, - "network": { - "name": "network", - "nonce": 0, - "details": { - "blockNumber": "0x5", - "baseCount": 0 - } - } - }, - "r": "0x035de1d588f67547bd9c7bb9b34a8330c10085155e42af0017986911ca922e61", - "s": "0x36c3c12a323121afe6d63bc8c5929766d385e2e7b7fc892ecd0f10a7ec4ab59e", - "v": "0x0a95", - "rawTx": "0xf86e8085363fe1da00825208942f318c334780961fb129d2a6c30d0763d9a5c970880de0b6b3a764000080820a95a0035de1d588f67547bd9c7bb9b34a8330c10085155e42af0017986911ca922e61a036c3c12a323121afe6d63bc8c5929766d385e2e7b7fc892ecd0f10a7ec4ab59e", - "hash": "0xaba403a1dff459d7549b57369cfdd323c70fc79a307ed8f9cae811ddd6883a74", - "submittedTime": 1618940445208, - "txReceipt": { - "transactionHash": "0xaba403a1dff459d7549b57369cfdd323c70fc79a307ed8f9cae811ddd6883a74", - "transactionIndex": { - "negative": 0, - "words": [0, null], - "length": 1, - "red": null - }, - "blockHash": "0x734618e63369e7ea10872e68cec4d400d77c55ed525cbc295802d00d7b4bd1d2", - "blockNumber": { - "negative": 0, - "words": [6, null], - "length": 1, - "red": null - }, - "from": "0x0cc5261ab8ce458dc977078a3623e2badd27afd3", - "to": "0x2f318c334780961fb129d2a6c30d0763d9a5c970", - "gasUsed": "5208", - "cumulativeGasUsed": { - "negative": 0, - "words": [21000, null], - "length": 1, - "red": null - }, - "contractAddress": null, - "logs": [], - "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - } - } - } - }, - "KeyringController": { - "vault": "{\"data\":\"Ot+BTtJPag0xubdiv1nO9bsSvTHivHCd6CD7Lxgb1McYw3VqMjgp5rPMZmblJ1lscuMxyiqp99G52uXO9S0em6F9htpa+t/wn6qubRKTTNG9fxNzQrKXRDNhdgfYckVk5VAZ4fgl2iMZcRDvS8H/+gucVKJ33Sl6mXyPofdexXhWDCU6uR2YecnfaIum9cL2u/GqOMPE3jxzy0Wip0x2Jyp3QOKhvu8A3GIjzagLOaQ7a1APdl8=\",\"iv\":\"lbsyPeGYWU6U1+jvmW9UHg==\",\"salt\":\"Zmbhpskwxe4rYfXtELBvlcvW4HISPBATRmMqzsnZPMg=\"}" - }, - "AlertController": { - "alertEnabledness": { - "unconnectedAccount": true, - "web3ShimUsage": true - }, - "unconnectedAccountAlertShownOrigins": {}, - "web3ShimUsageOrigins": {} - }, - "OnboardingController": { - "seedPhraseBackedUp": true, - "onboardingTabs": {} - }, - "AddressBookController": { - "addressBook": { - "0x539": { - "0x2f318C334780961FB129D2a6c30D0763d9a5C970": { - "address": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", - "chainId": "0x539", - "isEns": false, - "memo": "", - "name": "" - } - } - } - }, - "AppStateController": { - "connectedStatusPopoverHasBeenShown": true, - "swapsWelcomeMessageHasBeenShown": false, - "defaultHomeActiveTabName": "Activity", - "showPortfolioTooltip": false - } - }, - "meta": { - "version": 57 - } -} diff --git a/test/e2e/fixtures/imported-account/state.json b/test/e2e/fixtures/imported-account/state.json deleted file mode 100644 index d89d6e2cf7b2..000000000000 --- a/test/e2e/fixtures/imported-account/state.json +++ /dev/null @@ -1,162 +0,0 @@ -{ - "data": { - "AppStateController": { - "mkrMigrationReminderTimestamp": null, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {} - } - }, - "CurrencyController": { - "conversionDate": 1575697244.188, - "conversionRate": 149.61, - "currentCurrency": "usd", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "network": "1337", - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - } - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "domainMetadata": { - "metamask.github.io": { - "icon": null, - "name": "M E T A M A S K M E S H T E S T" - } - }, - "permissionsHistory": {}, - "permissionsLog": [ - { - "id": 746677923, - "method": "eth_accounts", - "methodType": "restricted", - "origin": "metamask.github.io", - "request": { - "id": 746677923, - "jsonrpc": "2.0", - "method": "eth_accounts", - "origin": "metamask.github.io", - "params": [] - }, - "requestTime": 1575697241368, - "response": { - "id": 746677923, - "jsonrpc": "2.0", - "result": [] - }, - "responseTime": 1575697241370, - "success": true - } - ] - }, - "PreferencesController": { - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "completedOnboarding": true, - "dismissSeedBackUpReminder": true, - "currentLocale": "en", - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "firstTimeFlowType": "create", - "forgottenPassword": false, - "frequentRpcListDetail": [], - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "knownMethodData": {}, - "lostIdentities": {}, - "metaMetricsId": null, - "participateInMetaMetrics": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "suggestedTokens": {}, - "tokens": [], - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true, - "useTokenDetection": true - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - } - }, - "meta": { - "version": 40 - } -} diff --git a/test/e2e/fixtures/localization/state.json b/test/e2e/fixtures/localization/state.json deleted file mode 100644 index d5ba38d28493..000000000000 --- a/test/e2e/fixtures/localization/state.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "data": { - "AppStateController": { - "mkrMigrationReminderTimestamp": null, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {} - } - }, - "CurrencyController": { - "conversionDate": 1594323667.203, - "conversionRate": 14205.88, - "currentCurrency": "php", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "network": "1337", - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - } - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "domainMetadata": { - "metamask.github.io": { - "icon": null, - "name": "M E T A M A S K M E S H T E S T" - } - }, - "permissionsHistory": {}, - "permissionsLog": [ - { - "id": 746677923, - "method": "eth_accounts", - "methodType": "restricted", - "origin": "metamask.github.io", - "request": { - "id": 746677923, - "jsonrpc": "2.0", - "method": "eth_accounts", - "origin": "metamask.github.io", - "params": [] - }, - "requestTime": 1575697241368, - "response": { - "id": 746677923, - "jsonrpc": "2.0", - "result": [] - }, - "responseTime": 1575697241370, - "success": true - } - ] - }, - "PreferencesController": { - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "completedOnboarding": true, - "currentLocale": "en", - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "firstTimeFlowType": "create", - "forgottenPassword": false, - "frequentRpcListDetail": [], - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "knownMethodData": {}, - "lostIdentities": {}, - "metaMetricsId": null, - "participateInMetaMetrics": false, - "preferences": { - "showFiatInTestnets": true, - "useNativeCurrencyAsPrimaryCurrency": true - }, - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "suggestedTokens": {}, - "tokens": [], - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - } - }, - "meta": { - "version": 40 - } -} diff --git a/test/e2e/fixtures/metrics-enabled/state.json b/test/e2e/fixtures/metrics-enabled/state.json deleted file mode 100644 index 683f6cda6d4f..000000000000 --- a/test/e2e/fixtures/metrics-enabled/state.json +++ /dev/null @@ -1,205 +0,0 @@ -{ - "data": { - "AppStateController": { - "connectedStatusPopoverHasBeenShown": false, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {}, - "1337": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": "0x15af1d78b58c40000" - } - } - }, - "CurrencyController": { - "conversionDate": 1594348502.519, - "conversionRate": 240.09, - "currentCurrency": "usd", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536, - "localhost": 98 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - }, - "network": "1337" - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "permissionsLog": [ - { - "id": 1764280960, - "method": "eth_requestAccounts", - "methodType": "restricted", - "origin": "http://127.0.0.1:8080", - "request": { - "method": "eth_requestAccounts", - "jsonrpc": "2.0", - "id": 1764280960, - "origin": "http://127.0.0.1:8080", - "tabId": 2 - }, - "requestTime": 1594348329232, - "response": { - "id": 1764280960, - "jsonrpc": "2.0", - "result": ["0x5cfe73b6021e818b776b421b1c4db2474086a7e1"] - }, - "responseTime": 1594348332276, - "success": true - } - ], - "permissionsHistory": { - "http://127.0.0.1:8080": { - "eth_accounts": { - "accounts": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": 1594348332276 - }, - "lastApproved": 1594348332276 - } - } - }, - "domainMetadata": { - "http://127.0.0.1:8080": { - "name": "E2E Test Dapp", - "icon": "http://127.0.0.1:8080/metamask-fox.svg", - "lastUpdated": 1594348323811, - "host": "127.0.0.1:8080" - } - } - }, - "PreferencesController": { - "frequentRpcListDetail": [], - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "tokens": [], - "suggestedTokens": {}, - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true, - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "knownMethodData": {}, - "participateInMetaMetrics": true, - "firstTimeFlowType": "create", - "currentLocale": "en", - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "lostIdentities": {}, - "forgottenPassword": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "completedOnboarding": true, - "metaMetricsId": "fake-metrics-id", - "ipfsGateway": "dweb.link", - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1" - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - }, - "PermissionsController": { - "permissionsRequests": [], - "permissionsDescriptions": {}, - "domains": { - "http://127.0.0.1:8080": { - "permissions": [ - { - "@context": ["https://github.com/MetaMask/rpc-cap"], - "parentCapability": "eth_accounts", - "id": "f55a1c15-ea48-4088-968e-63be474d42fa", - "date": 1594348332268, - "invoker": "http://127.0.0.1:8080", - "caveats": [ - { - "type": "limitResponseLength", - "value": 1, - "name": "primaryAccountOnly" - }, - { - "type": "filterResponse", - "value": ["0x5cfe73b6021e818b776b421b1c4db2474086a7e1"], - "name": "exposedAccounts" - } - ] - } - ] - } - } - } - }, - "meta": { - "version": 47 - } -} diff --git a/test/e2e/fixtures/navigate-transactions/state.json b/test/e2e/fixtures/navigate-transactions/state.json deleted file mode 100644 index 8d4734d54e08..000000000000 --- a/test/e2e/fixtures/navigate-transactions/state.json +++ /dev/null @@ -1,447 +0,0 @@ -{ - "data": { - "AppStateController": { - "mkrMigrationReminderTimestamp": null, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {} - } - }, - "CurrencyController": { - "conversionDate": 1575697244.188, - "conversionRate": 149.61, - "currentCurrency": "usd", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "network": "1337", - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - } - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "domainMetadata": { - "metamask.github.io": { - "icon": null, - "name": "M E T A M A S K M E S H T E S T" - } - }, - "permissionsHistory": {}, - "permissionsLog": [ - { - "id": 746677923, - "method": "eth_accounts", - "methodType": "restricted", - "origin": "metamask.github.io", - "request": { - "id": 746677923, - "jsonrpc": "2.0", - "method": "eth_accounts", - "origin": "metamask.github.io", - "params": [] - }, - "requestTime": 1575697241368, - "response": { - "id": 746677923, - "jsonrpc": "2.0", - "result": [] - }, - "responseTime": 1575697241370, - "success": true - } - ] - }, - "PreferencesController": { - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "completedOnboarding": true, - "dismissSeedBackUpReminder": true, - "currentLocale": "en", - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "firstTimeFlowType": "create", - "forgottenPassword": false, - "frequentRpcListDetail": [], - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "knownMethodData": {}, - "lostIdentities": {}, - "metaMetricsId": null, - "participateInMetaMetrics": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "suggestedTokens": {}, - "tokens": [], - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true, - "useTokenDetection": true - }, - "MetaMetricsController": { - "fragments": { - "transaction-added-7911313280012623": { - "category": "Transactions", - "initialEvent": "Transaction Added", - "successEvent": "Transaction Approved", - "failureEvent": "Transaction Rejected", - "properties": {}, - "persist": true, - "uniqueIdentifier": "transaction-added-7911313280012623" - }, - "transaction-added-7911313280012624": { - "category": "Transactions", - "initialEvent": "Transaction Added", - "successEvent": "Transaction Approved", - "failureEvent": "Transaction Rejected", - "properties": {}, - "persist": true, - "uniqueIdentifier": "transaction-added-7911313280012624" - }, - "transaction-added-7911313280012625": { - "category": "Transactions", - "initialEvent": "Transaction Added", - "successEvent": "Transaction Approved", - "failureEvent": "Transaction Rejected", - "properties": {}, - "persist": true, - "uniqueIdentifier": "transaction-added-7911313280012625" - }, - "transaction-added-7911313280012626": { - "category": "Transactions", - "initialEvent": "Transaction Added", - "successEvent": "Transaction Approved", - "failureEvent": "Transaction Rejected", - "properties": {}, - "persist": true, - "uniqueIdentifier": "transaction-added-7911313280012626" - } - } - }, - "TransactionController": { - "transactions": { - "7911313280012623": { - "chainId": "0x539", - "dappSuggestedGasFees": { - "gas": "0x5208", - "gasPrice": "0x4a817c800" - }, - "history": [ - { - "chainId": "0x539", - "dappSuggestedGasFees": { - "gas": "0x5208", - "gasPrice": "0x4a817c800" - }, - "id": 7911313280012623, - "loadingDefaults": true, - "metamaskNetworkId": "1337", - "origin": "https://metamask.github.io", - "status": "unapproved", - "time": 1631545991949, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x5208", - "gasPrice": "0x4a817c800", - "to": "0x2f318c334780961fb129d2a6c30d0763d9a5c970", - "value": "0x29a2241af62c0000" - }, - "type": "sentEther" - }, - [ - { - "note": "Added new unapproved transaction.", - "op": "replace", - "path": "/loadingDefaults", - "timestamp": 1631545992244, - "value": false - } - ] - ], - "id": 7911313280012623, - "loadingDefaults": false, - "metamaskNetworkId": "1337", - "origin": "https://metamask.github.io", - "status": "unapproved", - "time": 1631545991949, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x5208", - "gasPrice": "0x4a817c800", - "to": "0x2f318c334780961fb129d2a6c30d0763d9a5c970", - "value": "0x29a2241af62c0000" - }, - "type": "sentEther" - }, - "7911313280012624": { - "chainId": "0x539", - "dappSuggestedGasFees": { - "gas": "0x5208", - "gasPrice": "0x4a817c800" - }, - "history": [ - { - "chainId": "0x539", - "dappSuggestedGasFees": { - "gas": "0x5208", - "gasPrice": "0x4a817c800" - }, - "id": 7911313280012624, - "loadingDefaults": true, - "metamaskNetworkId": "1337", - "origin": "https://metamask.github.io", - "status": "unapproved", - "time": 1631545994578, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x5208", - "gasPrice": "0x4a817c800", - "to": "0x2f318c334780961fb129d2a6c30d0763d9a5c970", - "value": "0x29a2241af62c0000" - }, - "type": "sentEther" - }, - [ - { - "note": "Added new unapproved transaction.", - "op": "replace", - "path": "/loadingDefaults", - "timestamp": 1631545994695, - "value": false - } - ] - ], - "id": 7911313280012624, - "loadingDefaults": false, - "metamaskNetworkId": "1337", - "origin": "https://metamask.github.io", - "status": "unapproved", - "time": 1631545994578, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x5208", - "gasPrice": "0x4a817c800", - "to": "0x2f318c334780961fb129d2a6c30d0763d9a5c970", - "value": "0x29a2241af62c0000" - }, - "type": "sentEther" - }, - "7911313280012625": { - "chainId": "0x539", - "dappSuggestedGasFees": { - "gas": "0x5208", - "gasPrice": "0x4a817c800" - }, - "history": [ - { - "chainId": "0x539", - "dappSuggestedGasFees": { - "gas": "0x5208", - "gasPrice": "0x4a817c800" - }, - "id": 7911313280012625, - "loadingDefaults": true, - "metamaskNetworkId": "1337", - "origin": "https://metamask.github.io", - "status": "unapproved", - "time": 1631545996673, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x5208", - "gasPrice": "0x4a817c800", - "to": "0x2f318c334780961fb129d2a6c30d0763d9a5c970", - "value": "0x29a2241af62c0000" - }, - "type": "sentEther" - }, - [ - { - "note": "Added new unapproved transaction.", - "op": "replace", - "path": "/loadingDefaults", - "timestamp": 1631545996678, - "value": false - } - ] - ], - "id": 7911313280012625, - "loadingDefaults": false, - "metamaskNetworkId": "1337", - "origin": "https://metamask.github.io", - "status": "unapproved", - "time": 1631545996673, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x5208", - "gasPrice": "0x4a817c800", - "to": "0x2f318c334780961fb129d2a6c30d0763d9a5c970", - "value": "0x29a2241af62c0000" - }, - "type": "sentEther" - }, - "7911313280012626": { - "chainId": "0x539", - "dappSuggestedGasFees": { - "gas": "0x5208", - "gasPrice": "0x4a817c800" - }, - "history": [ - { - "chainId": "0x539", - "dappSuggestedGasFees": { - "gas": "0x5208", - "gasPrice": "0x4a817c800" - }, - "id": 7911313280012626, - "loadingDefaults": true, - "metamaskNetworkId": "1337", - "origin": "https://metamask.github.io", - "status": "unapproved", - "time": 1631545998675, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x5208", - "gasPrice": "0x4a817c800", - "to": "0x2f318c334780961fb129d2a6c30d0763d9a5c970", - "value": "0x29a2241af62c0000" - }, - "type": "sentEther" - }, - [ - { - "note": "Added new unapproved transaction.", - "op": "replace", - "path": "/loadingDefaults", - "timestamp": 1631545998677, - "value": false - } - ] - ], - "id": 7911313280012626, - "loadingDefaults": false, - "metamaskNetworkId": "1337", - "origin": "https://metamask.github.io", - "status": "unapproved", - "time": 1631545998675, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x5208", - "gasPrice": "0x4a817c800", - "to": "0x2f318c334780961fb129d2a6c30d0763d9a5c970", - "value": "0x29a2241af62c0000" - }, - "type": "sentEther" - } - } - }, - "PermissionsController": { - "permissionsRequests": [], - "permissionsDescriptions": {}, - "domains": { - "http://127.0.0.1:8080": { - "permissions": [ - { - "@context": ["https://github.com/MetaMask/rpc-cap"], - "parentCapability": "eth_accounts", - "id": "f55a1c15-ea48-4088-968e-63be474d42fa", - "date": 1594348332268, - "invoker": "http://127.0.0.1:8080", - "caveats": [ - { - "type": "limitResponseLength", - "value": 1, - "name": "primaryAccountOnly" - }, - { - "type": "filterResponse", - "value": ["0x5cfe73b6021e818b776b421b1c4db2474086a7e1"], - "name": "exposedAccounts" - } - ] - } - ] - } - } - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - } - }, - "meta": { - "version": 40 - } -} diff --git a/test/e2e/fixtures/onboarding/state.json b/test/e2e/fixtures/onboarding/state.json deleted file mode 100644 index 9bd17bc72679..000000000000 --- a/test/e2e/fixtures/onboarding/state.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "data": { - "config": {}, - "PreferencesController": { - "frequentRpcListDetail": [ - { - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "nickname": "Localhost 8545", - "rpcPrefs": {} - } - ] - }, - "firstTimeInfo": { - "version": "9.3.0", - "date": 1617927806790 - }, - "NetworkController": { - "provider": { - "ticker": "ETH", - "type": "rpc", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "nickname": "Localhost 8545" - }, - "network": "1337" - }, - "NotificationController": { - "notifications": { - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "CurrencyController": { - "conversionDate": 1617927806.941, - "conversionRate": 2084.64, - "currentCurrency": "usd", - "nativeCurrency": "ETH", - "usdConversionRate": 2084.64 - } - }, - "meta": { - "version": 57 - } -} diff --git a/test/e2e/fixtures/send-edit-v2/state.json b/test/e2e/fixtures/send-edit-v2/state.json deleted file mode 100644 index b414cf8d3a0b..000000000000 --- a/test/e2e/fixtures/send-edit-v2/state.json +++ /dev/null @@ -1,234 +0,0 @@ -{ - "data": { - "AppStateController": { - "mkrMigrationReminderTimestamp": null, - "swapsWelcomeMessageHasBeenShown": true, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {} - } - }, - "CurrencyController": { - "conversionDate": 1575697244.188, - "conversionRate": 149.61, - "currentCurrency": "usd", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "network": "1337", - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - } - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "domainMetadata": { - "metamask.github.io": { - "icon": null, - "name": "M E T A M A S K M E S H T E S T" - } - }, - "permissionsHistory": {}, - "permissionsLog": [ - { - "id": 746677923, - "method": "eth_accounts", - "methodType": "restricted", - "origin": "metamask.github.io", - "request": { - "id": 746677923, - "jsonrpc": "2.0", - "method": "eth_accounts", - "origin": "metamask.github.io", - "params": [] - }, - "requestTime": 1575697241368, - "response": { - "id": 746677923, - "jsonrpc": "2.0", - "result": [] - }, - "responseTime": 1575697241370, - "success": true - } - ] - }, - "PreferencesController": { - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "completedOnboarding": true, - "eip1559V2Enabled": true, - "currentLocale": "en", - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "firstTimeFlowType": "create", - "forgottenPassword": false, - "frequentRpcListDetail": [], - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "knownMethodData": {}, - "lostIdentities": {}, - "metaMetricsId": null, - "participateInMetaMetrics": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "suggestedTokens": {}, - "tokens": [], - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true - }, - "TransactionController": { - "transactions": { - "4046084157914634": { - "chainId": "0x539", - "primaryTransaction": { - "chainId": "0x539", - "id": 4046084157914634, - "loadingDefaults": true, - "metamaskNetworkId": "1337", - "origin": "metamask", - "status": "unapproved", - "time": 1617228030067, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x61a8", - "maxFeePerGas": "0x59682f0c", - "maxPriorityFeePerGas": "0x59682f00", - "type": "0x2", - "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", - "value": "0xde0b6b3a7640000" - }, - "type": "sentEther" - }, - "history": [ - { - "chainId": "0x539", - "id": 4046084157914634, - "loadingDefaults": true, - "metamaskNetworkId": "1337", - "origin": "metamask", - "status": "unapproved", - "time": 1617228030067, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x61a8", - "maxFeePerGas": "0x59682f0c", - "maxPriorityFeePerGas": "0x59682f00", - "type": "0x2", - "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", - "value": "0xde0b6b3a7640000" - }, - "type": "simpleSend" - }, - [ - { - "note": "Added new unapproved transaction.", - "op": "replace", - "path": "/loadingDefaults", - "timestamp": 1617228030069, - "value": false - } - ] - ], - "id": 4046084157914634, - "loadingDefaults": false, - "metamaskNetworkId": "1337", - "origin": "metamask", - "status": "unapproved", - "time": 1617228030067, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x61a8", - "maxFeePerGas": "0x59682f0c", - "maxPriorityFeePerGas": "0x59682f00", - "type": "0x2", - "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", - "value": "0xde0b6b3a7640000" - }, - "type": "simpleSend" - } - } - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - } - }, - "meta": { - "version": 40 - } -} diff --git a/test/e2e/fixtures/send-edit/state.json b/test/e2e/fixtures/send-edit/state.json deleted file mode 100644 index 30eee4e908a8..000000000000 --- a/test/e2e/fixtures/send-edit/state.json +++ /dev/null @@ -1,240 +0,0 @@ -{ - "data": { - "AppStateController": { - "mkrMigrationReminderTimestamp": null, - "swapsWelcomeMessageHasBeenShown": true, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {} - } - }, - "CurrencyController": { - "conversionDate": 1575697244.188, - "conversionRate": 149.61, - "currentCurrency": "usd", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "network": "1337", - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - } - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "domainMetadata": { - "metamask.github.io": { - "icon": null, - "name": "M E T A M A S K M E S H T E S T" - } - }, - "permissionsHistory": {}, - "permissionsLog": [ - { - "id": 746677923, - "method": "eth_accounts", - "methodType": "restricted", - "origin": "metamask.github.io", - "request": { - "id": 746677923, - "jsonrpc": "2.0", - "method": "eth_accounts", - "origin": "metamask.github.io", - "params": [] - }, - "requestTime": 1575697241368, - "response": { - "id": 746677923, - "jsonrpc": "2.0", - "result": [] - }, - "responseTime": 1575697241370, - "success": true - } - ] - }, - "PreferencesController": { - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "completedOnboarding": true, - "currentLocale": "en", - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "firstTimeFlowType": "create", - "forgottenPassword": false, - "frequentRpcListDetail": [], - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "knownMethodData": {}, - "lostIdentities": {}, - "metaMetricsId": null, - "participateInMetaMetrics": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "suggestedTokens": {}, - "tokens": [], - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true - }, - "MetaMetricsController": { - "fragments": { - "transaction-added-4046084157914634": { - "category": "Transactions", - "initialEvent": "Transaction Added", - "successEvent": "Transaction Approved", - "failureEvent": "Transaction Rejected", - "properties": {}, - "persist": true, - "uniqueIdentifier": "transaction-added-4046084157914634" - } - } - }, - "TransactionController": { - "transactions": { - "4046084157914634": { - "chainId": "0x539", - "primaryTransaction": { - "chainId": "0x539", - "id": 4046084157914634, - "loadingDefaults": true, - "metamaskNetworkId": "1337", - "origin": "metamask", - "status": "unapproved", - "time": 1617228030067, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x61a8", - "gasPrice": "0x2540be400", - "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", - "value": "0xde0b6b3a7640000" - }, - "type": "sentEther" - }, - "history": [ - { - "chainId": "0x539", - "id": 4046084157914634, - "loadingDefaults": true, - "metamaskNetworkId": "1337", - "origin": "metamask", - "status": "unapproved", - "time": 1617228030067, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x61a8", - "gasPrice": "0x2540be400", - "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", - "value": "0xde0b6b3a7640000" - }, - "type": "simpleSend" - }, - [ - { - "note": "Added new unapproved transaction.", - "op": "replace", - "path": "/loadingDefaults", - "timestamp": 1617228030069, - "value": false - } - ] - ], - "id": 4046084157914634, - "loadingDefaults": false, - "metamaskNetworkId": "1337", - "origin": "metamask", - "status": "unapproved", - "time": 1617228030067, - "txParams": { - "from": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "gas": "0x61a8", - "gasPrice": "0x2540be400", - "to": "0x2f318C334780961FB129D2a6c30D0763d9a5C970", - "value": "0xde0b6b3a7640000" - }, - "type": "simpleSend" - } - } - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - } - }, - "meta": { - "version": 40 - } -} diff --git a/test/e2e/fixtures/special-settings/state.json b/test/e2e/fixtures/special-settings/state.json deleted file mode 100644 index 57a4cd2c9dc8..000000000000 --- a/test/e2e/fixtures/special-settings/state.json +++ /dev/null @@ -1,157 +0,0 @@ -{ - "data": { - "AppStateController": { - "mkrMigrationReminderTimestamp": null, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "4": {} - } - }, - "CurrencyController": { - "conversionDate": 1575697244.188, - "conversionRate": 149.61, - "currentCurrency": "usd", - "nativeCurrency": "ETH" - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlocksByNetwork": { - "goerli": null, - "kovan": null, - "mainnet": null, - "sepolia": null, - "rinkeby": 5570536 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "network": "1337", - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - } - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": false - }, - "PermissionsMetadata": { - "domainMetadata": { - "metamask.github.io": { - "icon": null, - "name": "M E T A M A S K M E S H T E S T" - } - }, - "permissionsHistory": {}, - "permissionsLog": [ - { - "id": 746677923, - "method": "eth_accounts", - "methodType": "restricted", - "origin": "metamask.github.io", - "request": { - "id": 746677923, - "jsonrpc": "2.0", - "method": "eth_accounts", - "origin": "metamask.github.io", - "params": [] - }, - "requestTime": 1575697241368, - "response": { - "id": 746677923, - "jsonrpc": "2.0", - "result": [] - }, - "responseTime": 1575697241370, - "success": true - } - ] - }, - "PreferencesController": { - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "rinkeby": [], - "ropsten": [] - } - }, - "assetImages": {}, - "completedOnboarding": true, - "dismissSeedBackUpReminder": true, - "currentLocale": "en", - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false, - "sendHexData": true - }, - "firstTimeFlowType": "create", - "forgottenPassword": false, - "frequentRpcListDetail": [], - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "knownMethodData": {}, - "lostIdentities": {}, - "metaMetricsId": null, - "participateInMetaMetrics": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "suggestedTokens": {}, - "tokens": [], - "useBlockie": false, - "useNonceField": false, - "usePhishDetect": true, - "useTokenDetection": false - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - } - }, - "meta": { - "version": 40 - } -} diff --git a/test/e2e/fixtures/threebox-enabled/state.json b/test/e2e/fixtures/threebox-enabled/state.json deleted file mode 100644 index e7b7d10a42b9..000000000000 --- a/test/e2e/fixtures/threebox-enabled/state.json +++ /dev/null @@ -1,159 +0,0 @@ -{ - "data": { - "AppStateController": { - "swapsWelcomeMessageHasBeenShown": true, - "connectedStatusPopoverHasBeenShown": false, - "showPortfolioTooltip": false - }, - "CachedBalancesController": { - "cachedBalances": { - "0x539": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": "0x15af1d78b58c40000" - } - } - }, - "CurrencyController": { - "conversionDate": 1617897791.928, - "conversionRate": 2072.49, - "currentCurrency": "usd", - "nativeCurrency": "ETH", - "usdConversionRate": 2072.49 - }, - "IncomingTransactionsController": { - "incomingTransactions": {}, - "incomingTxLastFetchedBlockByChainId": { - "0x5": null, - "0x2a": null, - "0x1": null, - "0x4": 5570536 - } - }, - "KeyringController": { - "vault": "{\"data\":\"s6TpYjlUNsn7ifhEFTkuDGBUM1GyOlPrim7JSjtfIxgTt8/6MiXgiR/CtFfR4dWW2xhq85/NGIBYEeWrZThGdKGarBzeIqBfLFhw9n509jprzJ0zc2Rf+9HVFGLw+xxC4xPxgCS0IIWeAJQ+XtGcHmn0UZXriXm8Ja4kdlow6SWinB7sr/WM3R0+frYs4WgllkwggDf2/Tv6VHygvLnhtzp6hIJFyTjh+l/KnyJTyZW1TkZhDaNDzX3SCOHT\",\"iv\":\"FbeHDAW5afeWNORfNJBR0Q==\",\"salt\":\"TxZ+WbCW6891C9LK/hbMAoUsSEW1E8pyGLVBU6x5KR8=\"}" - }, - "NetworkController": { - "provider": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - }, - "previousProviderStore": { - "nickname": "Localhost 8545", - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "type": "rpc" - }, - "network": "1337" - }, - "NotificationController": { - "notifications": { - "1": { - "isShown": true - }, - "3": { - "isShown": true - }, - "5": { - "isShown": true - }, - "6": { - "isShown": true - }, - "8": { - "isShown": true - }, - "10": { - "isShown": true - }, - "11": { - "isShown": true - }, - "12": { - "isShown": true - }, - "13": { - "isShown": true - }, - "14": { - "isShown": true - }, - "15": { - "isShown": true - } - } - }, - "OnboardingController": { - "onboardingTabs": {}, - "seedPhraseBackedUp": true - }, - "PreferencesController": { - "frequentRpcListDetail": [ - { - "rpcUrl": "http://localhost:8545", - "chainId": "0x539", - "ticker": "ETH", - "nickname": "Localhost 8545", - "rpcPrefs": {} - } - ], - "accountTokens": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "0x4": [], - "0x3": [] - } - }, - "accountHiddenTokens": {}, - "assetImages": {}, - "tokens": [], - "hiddenTokens": [], - "suggestedTokens": {}, - "useBlockie": true, - "useNonceField": false, - "usePhishDetect": true, - "featureFlags": { - "showIncomingTransactions": true, - "transactionTime": false - }, - "knownMethodData": {}, - "firstTimeFlowType": "create", - "currentLocale": "en", - "identities": { - "0x5cfe73b6021e818b776b421b1c4db2474086a7e1": { - "address": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1", - "name": "Account 1" - } - }, - "lostIdentities": {}, - "forgottenPassword": false, - "preferences": { - "useNativeCurrencyAsPrimaryCurrency": true - }, - "completedOnboarding": true, - "ipfsGateway": "dweb.link", - "selectedAddress": "0x5cfe73b6021e818b776b421b1c4db2474086a7e1" - }, - "config": {}, - "firstTimeInfo": { - "date": 1575697234195, - "version": "7.7.0" - }, - "MetaMetricsController": { - "metaMetricsId": null, - "participateInMetaMetrics": false - }, - "ThreeBoxController": { - "threeBoxSyncingAllowed": true, - "showRestorePrompt": true, - "threeBoxLastUpdated": 0, - "threeBoxAddress": "0x64480aa2768ef12f3f19c5a01206ceb0f82d06b9", - "threeBoxSynced": true, - "threeBoxDisabled": false - } - }, - "meta": { - "version": 57 - } -} diff --git a/test/e2e/helpers.js b/test/e2e/helpers.js index 6dadb1e2351f..d950f0c0582d 100644 --- a/test/e2e/helpers.js +++ b/test/e2e/helpers.js @@ -51,6 +51,8 @@ async function withFixtures(options, testSuite) { const phishingPageServer = new PhishingWarningPageServer(); let webDriver; + let driver; + const errors = []; let failed = false; try { await ganacheServer.start(ganacheOptions); @@ -73,7 +75,7 @@ async function withFixtures(options, testSuite) { }); } await fixtureServer.start(); - await fixtureServer.loadState(path.join(__dirname, 'fixtures', fixtures)); + fixtureServer.loadJsonState(fixtures); await phishingPageServer.start(); if (dapp) { if (dappOptions?.numberOfDapps) { @@ -110,8 +112,12 @@ async function withFixtures(options, testSuite) { ) { await ensureXServerIsRunning(); } - const { driver } = await buildWebDriver(driverOptions); - webDriver = driver; + driver = (await buildWebDriver(driverOptions)).driver; + webDriver = driver.driver; + + if (process.env.SELENIUM_BROWSER === 'chrome') { + await driver.checkBrowserForExceptions(); + } await testSuite({ driver, @@ -120,7 +126,7 @@ async function withFixtures(options, testSuite) { }); if (process.env.SELENIUM_BROWSER === 'chrome') { - const errors = await driver.checkBrowserForConsoleErrors(driver); + errors.concat(await driver.checkBrowserForConsoleErrors(driver)); if (errors.length) { const errorReports = errors.map((err) => err.message); const errorMessage = `Errors found in browser console:\n${errorReports.join( @@ -137,10 +143,20 @@ async function withFixtures(options, testSuite) { failed = true; if (webDriver) { try { - await webDriver.verboseReportOnFailure(title); + await driver.verboseReportOnFailure(title); } catch (verboseReportError) { console.error(verboseReportError); } + if ( + errors.length === 0 && + driver.exceptions.length > 0 && + failOnConsoleError + ) { + const errorMessage = `Errors found in browser console:\n${driver.exceptions.join( + '\n', + )}`; + throw Error(errorMessage); + } } throw error; } finally { @@ -151,7 +167,7 @@ async function withFixtures(options, testSuite) { await secondaryGanacheServer.quit(); } if (webDriver) { - await webDriver.quit(); + await driver.quit(); } if (dapp) { for (let i = 0; i < numberOfDapps; i++) { @@ -198,26 +214,6 @@ const getWindowHandles = async (driver, handlesCount) => { return { extension, dapp, popup }; }; -const connectDappWithExtensionPopup = async (driver) => { - await driver.openNewPage(`http://127.0.0.1:${dappBasePort}/`); - await driver.delay(regularDelayMs); - await driver.clickElement({ text: 'Connect', tag: 'button' }); - await driver.delay(regularDelayMs); - - const windowHandles = await getWindowHandles(driver, 3); - - // open extension popup and confirm connect - await driver.switchToWindow(windowHandles.popup); - await driver.delay(largeDelayMs); - await driver.clickElement({ text: 'Next', tag: 'button' }); - await driver.clickElement({ text: 'Connect', tag: 'button' }); - - // send from dapp - await driver.waitUntilXWindowHandles(2); - await driver.switchToWindow(windowHandles.dapp); - await driver.delay(regularDelayMs); -}; - const completeImportSRPOnboardingFlow = async ( driver, seedPhrase, @@ -333,7 +329,6 @@ module.exports = { largeDelayMs, veryLargeDelayMs, withFixtures, - connectDappWithExtensionPopup, completeImportSRPOnboardingFlow, completeImportSRPOnboardingFlowWordByWord, createDownloadFolder, diff --git a/test/e2e/fixtures/import-utc-json/test-json-import-account-file.json b/test/e2e/import-utc-json/test-json-import-account-file.json similarity index 100% rename from test/e2e/fixtures/import-utc-json/test-json-import-account-file.json rename to test/e2e/import-utc-json/test-json-import-account-file.json diff --git a/test/e2e/lavamoat-stats.js b/test/e2e/lavamoat-stats.js index 4abf00a686b7..2dcf83ac2fc0 100755 --- a/test/e2e/lavamoat-stats.js +++ b/test/e2e/lavamoat-stats.js @@ -7,41 +7,45 @@ const yargs = require('yargs/yargs'); const { hideBin } = require('yargs/helpers'); const { exitWithError } = require('../../development/lib/exit-with-error'); const { withFixtures, tinyDelayMs } = require('./helpers'); +const FixtureBuilder = require('./fixture-builder'); async function measurePage() { let metrics; try { - await withFixtures({ fixtures: 'imported-account' }, async ({ driver }) => { - await driver.delay(tinyDelayMs); - await driver.navigate(); - await driver.findElement('#password'); - await driver.delay(1000); - const logs = await driver.checkBrowserForLavamoatLogs(); - - let logString = ''; - let inObject = false; - - const parsedLogs = []; - - logs.forEach((log) => { - if (log.indexOf('"version": 1') >= 0) { - logString += log; - parsedLogs.push(`{${logString}}`); - logString = ''; - inObject = false; - } else if (inObject) { - logString += log; - } else if ( - log.search(/"name": ".*app\/scripts\/background.js",/u) >= 0 || - log.search(/"name": ".*app\/scripts\/ui.js",/u) >= 0 - ) { - logString += log; - inObject = true; - } - }); - - metrics = parsedLogs.map((pl) => JSON.parse(pl)); - }); + await withFixtures( + { fixtures: new FixtureBuilder().build() }, + async ({ driver }) => { + await driver.delay(tinyDelayMs); + await driver.navigate(); + await driver.findElement('#password'); + await driver.delay(1000); + const logs = await driver.checkBrowserForLavamoatLogs(); + + let logString = ''; + let inObject = false; + + const parsedLogs = []; + + logs.forEach((log) => { + if (log.indexOf('"version": 1') >= 0) { + logString += log; + parsedLogs.push(`{${logString}}`); + logString = ''; + inObject = false; + } else if (inObject) { + logString += log; + } else if ( + log.search(/"name": ".*app\/scripts\/background.js",/u) >= 0 || + log.search(/"name": ".*app\/scripts\/ui.js",/u) >= 0 + ) { + logString += log; + inObject = true; + } + }); + + metrics = parsedLogs.map((pl) => JSON.parse(pl)); + }, + ); } catch (error) { // do nothing } diff --git a/test/e2e/metamask-ui.spec.js b/test/e2e/metamask-ui.spec.js index 2a2f16dfb658..f4e6457bcd66 100644 --- a/test/e2e/metamask-ui.spec.js +++ b/test/e2e/metamask-ui.spec.js @@ -337,7 +337,7 @@ describe('MetaMask', function () { await driver.delay(regularDelayMs); await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', '0x2f318C334780961FB129D2a6c30D0763d9a5C970', ); @@ -458,10 +458,10 @@ describe('MetaMask', function () { await driver.delay(veryLargeDelayMs); await driver.clickElement({ text: 'Edit', tag: 'button' }); await driver.delay(veryLargeDelayMs); - await driver.clickElement( - { text: 'Edit suggested gas fee', tag: 'button' }, - 10000, - ); + await driver.clickElement({ + text: 'Edit suggested gas fee', + tag: 'button', + }); await driver.delay(veryLargeDelayMs); const inputs = await driver.findElements('input[type="number"]'); const gasLimitInput = inputs[0]; @@ -576,10 +576,10 @@ describe('MetaMask', function () { it('customizes gas', async function () { await driver.clickElement('.confirm-approve-content__small-blue-text'); await driver.delay(regularDelayMs); - await driver.clickElement( - { text: 'Edit suggested gas fee', tag: 'button' }, - 10000, - ); + await driver.clickElement({ + text: 'Edit suggested gas fee', + tag: 'button', + }); await driver.delay(regularDelayMs); const [gasLimitInput, gasPriceInput] = await driver.findElements( diff --git a/test/e2e/mock-3box/threebox-mock-server.js b/test/e2e/mock-3box/threebox-mock-server.js deleted file mode 100644 index e6308badac95..000000000000 --- a/test/e2e/mock-3box/threebox-mock-server.js +++ /dev/null @@ -1,57 +0,0 @@ -const http = require('http'); - -const PORT = 8889; - -class ThreeboxMockServer { - constructor() { - this.server = http.createServer(this.requestHandler); - this.database = {}; - } - - async start() { - return new Promise((resolve, reject) => { - this.server = this.server.listen(PORT); - this.server.once('error', reject); - this.server.once('listening', resolve); - }); - } - - async stop() { - if (!this.server) { - return; - } - - await new Promise((resolve, reject) => { - this.server.close(); - this.server.once('error', reject); - this.server.once('close', resolve); - }); - } - - requestHandler = (request, response) => { - response.setHeader('Content-Type', 'application/json'); - if (request.method === 'POST') { - let body = ''; - request.on('data', (chunk) => { - body += chunk.toString(); // convert Buffer to string - }); - request.on('end', () => { - const { key, data } = JSON.parse(body); - this.database[key] = data; - response.setHeader('Access-Control-Allow-Headers', '*'); - response.end('ok'); - }); - } else if (request.method === 'GET') { - const key = new URL(request.url, 'https://example.org/').searchParams.get( - 'key', - ); - - response.setHeader('Access-Control-Allow-Headers', '*'); - response.end(JSON.stringify(this.database[key] || '')); - } else { - response.end('unknown request'); - } - }; -} - -module.exports = ThreeboxMockServer; diff --git a/test/e2e/mock-e2e.js b/test/e2e/mock-e2e.js index 785ec4c00b98..b7249812681c 100644 --- a/test/e2e/mock-e2e.js +++ b/test/e2e/mock-e2e.js @@ -1,9 +1,6 @@ const blacklistedHosts = [ 'goerli.infura.io', - 'kovan.infura.io', 'mainnet.infura.io', - 'rinkeby.infura.io', - 'ropsten.infura.io', 'sepolia.infura.io', ]; @@ -79,6 +76,23 @@ async function setupMocking(server, testSpecificMock) { }; }); + await server + .forGet('https://swap.metaswap.codefi.network/networks/1/token') + .withQuery({ address: '0x72c9Fb7ED19D3ce51cea5C56B3e023cd918baaDf' }) + .thenCallback(() => { + return { + statusCode: 200, + json: { + symbol: 'AGLT', + type: 'erc20', + decimals: '18', + address: '0x72c9fb7ed19d3ce51cea5c56b3e023cd918baadf', + occurences: 1, + aggregators: ['dynamic'], + }, + }; + }); + await server .forGet( 'https://gas-api.metaswap.codefi.network/networks/1/suggestedGasFees', @@ -124,37 +138,25 @@ async function setupMocking(server, testSpecificMock) { json: [ { ethereum: { - mobile_active: true, - extension_active: true, - fallback_to_v1: false, + fallbackToV1: false, mobileActive: true, extensionActive: true, }, bsc: { - mobile_active: true, - extension_active: true, - fallback_to_v1: false, + fallbackToV1: false, mobileActive: true, extensionActive: true, }, polygon: { - mobile_active: true, - extension_active: true, - fallback_to_v1: false, + fallbackToV1: false, mobileActive: true, extensionActive: true, }, avalanche: { - mobile_active: true, - extension_active: true, - fallback_to_v1: false, + fallbackToV1: false, mobileActive: true, extensionActive: true, }, - smart_transactions: { - mobile_active: false, - extension_active: false, - }, smartTransactions: { mobileActive: false, extensionActive: false, @@ -196,27 +198,128 @@ async function setupMocking(server, testSpecificMock) { }); await server - .forGet('https://token-api.metaswap.codefi.network/token/0x539') + .forGet('https://swap.metaswap.codefi.network/networks/1/tokens') .thenCallback(() => { return { statusCode: 200, - json: {}, + json: [ + { + name: 'Ethereum', + symbol: 'ETH', + decimals: 18, + type: 'native', + iconUrl: + 'https://token.metaswap.codefi.network/assets/nativeCurrencyLogos/ethereum.svg', + coingeckoId: 'ethereum', + address: '0x0000000000000000000000000000000000000000', + occurrences: 100, + aggregators: [], + }, + { + address: '0x6b175474e89094c44da98b954eedeac495271d0f', + symbol: 'DAI', + decimals: 18, + name: 'Dai Stablecoin', + iconUrl: + 'https://crypto.com/price/coin-data/icon/DAI/color_icon.png', + type: 'erc20', + aggregators: [ + 'aave', + 'bancor', + 'cmc', + 'cryptocom', + 'coinGecko', + 'oneInch', + 'pmm', + 'zerion', + 'lifi', + ], + occurrences: 9, + fees: { + '0xb0da5965d43369968574d399dbe6374683773a65': 0, + }, + storage: { + balance: 2, + }, + }, + { + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + symbol: 'USDC', + decimals: 6, + name: 'USD Coin', + iconUrl: + 'https://crypto.com/price/coin-data/icon/USDC/color_icon.png', + type: 'erc20', + aggregators: [ + 'aave', + 'bancor', + 'cryptocom', + 'coinGecko', + 'oneInch', + 'pmm', + 'zerion', + 'lifi', + ], + occurrences: 8, + fees: {}, + storage: { + balance: 9, + }, + }, + { + address: '0xc6bdb96e29c38dc43f014eed44de4106a6a8eb5f', + symbol: 'INUINU', + decimals: 18, + name: 'Inu Inu', + iconUrl: + 'https://assets.coingecko.com/coins/images/26391/thumb/logo_square_200.png?1657752596', + type: 'erc20', + aggregators: ['coinGecko'], + occurrences: 1, + }, + ], }; }); await server - .forGet( - 'https://static.metaswap.codefi.network/api/v1/tokenIcons/1337/0x0d8775f648430679a709e98d2b0cb6250d2887ef.png', - ) + .forGet('https://swap.metaswap.codefi.network/networks/1/topAssets') .thenCallback(() => { return { statusCode: 200, + json: [ + { + address: '0x0000000000000000000000000000000000000000', + symbol: 'ETH', + }, + { + address: '0x6b175474e89094c44da98b954eedeac495271d0f', + symbol: 'DAI', + }, + { + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + symbol: 'USDC', + }, + { + address: '0xdac17f958d2ee523a2206206994597c13d831ec7', + symbol: 'USDT', + }, + ], + }; + }); + + await server + .forGet('https://token-api.metaswap.codefi.network/token/0x539') + .thenCallback(() => { + return { + statusCode: 200, + json: {}, }; }); + // It disables loading of token icons, e.g. this URL: https://static.metaswap.codefi.network/api/v1/tokenIcons/1337/0x0000000000000000000000000000000000000000.png await server .forGet( - 'https://static.metaswap.codefi.network/api/v1/tokenIcons/1337/0x2efa2cb29c2341d8e5ba7d3262c9e9d6f1bf3711.png', + /^https:\/\/static\.metaswap\.codefi\.network\/api\/v1\/tokenIcons\/1337\/.*\.png/u, ) .thenCallback(() => { return { diff --git a/test/e2e/mv3-perf-stats/init-load-stats.js b/test/e2e/mv3-perf-stats/init-load-stats.js index de51940318e1..f9975557d3af 100755 --- a/test/e2e/mv3-perf-stats/init-load-stats.js +++ b/test/e2e/mv3-perf-stats/init-load-stats.js @@ -12,6 +12,7 @@ const { getFirstParentDirectoryThatExists, } = require('../../helpers/file'); const { withFixtures, tinyDelayMs } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); /** * The e2e test case is used to capture load and initialisation time statistics for extension in MV3 environment. @@ -20,42 +21,45 @@ const { withFixtures, tinyDelayMs } = require('../helpers'); async function profilePageLoad() { const parsedLogs = {}; try { - await withFixtures({ fixtures: 'imported-account' }, async ({ driver }) => { - await driver.delay(tinyDelayMs); - await driver.navigate(); - await driver.delay(1000); - const logs = await driver.checkBrowserForLavamoatLogs(); + await withFixtures( + { fixtures: new FixtureBuilder().build() }, + async ({ driver }) => { + await driver.delay(tinyDelayMs); + await driver.navigate(); + await driver.delay(1000); + const logs = await driver.checkBrowserForLavamoatLogs(); - let logString = ''; - let logType = ''; + let logString = ''; + let logType = ''; - logs.forEach((log) => { - if (log.indexOf('"version": 1') >= 0) { - // log end here - logString += log; - parsedLogs[logType] = JSON.parse(`{${logString}}`); - logString = ''; - logType = ''; - } else if (logType) { - // log string continues - logString += log; - } else if ( - log.search(/"name": ".*app\/scripts\/background.js",/u) >= 0 - ) { - // background log starts - logString += log; - logType = 'background'; - } else if (log.search(/"name": ".*app\/scripts\/ui.js",/u) >= 0) { - // ui log starts - logString += log; - logType = 'ui'; - } else if (log.search(/"name": "Total"/u) >= 0) { - // load time log starts - logString += log; - logType = 'loadTime'; - } - }); - }); + logs.forEach((log) => { + if (log.indexOf('"version": 1') >= 0) { + // log end here + logString += log; + parsedLogs[logType] = JSON.parse(`{${logString}}`); + logString = ''; + logType = ''; + } else if (logType) { + // log string continues + logString += log; + } else if ( + log.search(/"name": ".*app\/scripts\/background.js",/u) >= 0 + ) { + // background log starts + logString += log; + logType = 'background'; + } else if (log.search(/"name": ".*app\/scripts\/ui.js",/u) >= 0) { + // ui log starts + logString += log; + logType = 'ui'; + } else if (log.search(/"name": "Total"/u) >= 0) { + // load time log starts + logString += log; + logType = 'loadTime'; + } + }); + }, + ); } catch (error) { console.log('Error in trying to parse logs.'); } diff --git a/test/e2e/mv3-stats.js b/test/e2e/mv3-stats.js index 8e8180e024a9..2dd24791e9a5 100755 --- a/test/e2e/mv3-stats.js +++ b/test/e2e/mv3-stats.js @@ -12,6 +12,7 @@ const { getFirstParentDirectoryThatExists, } = require('../helpers/file'); const { withFixtures, tinyDelayMs } = require('./helpers'); +const FixtureBuilder = require('./fixture-builder'); /** * The e2e test case is used to capture load and initialisation time statistics for extension in MV3 environment. @@ -20,42 +21,45 @@ const { withFixtures, tinyDelayMs } = require('./helpers'); async function profilePageLoad() { const parsedLogs = {}; try { - await withFixtures({ fixtures: 'imported-account' }, async ({ driver }) => { - await driver.delay(tinyDelayMs); - await driver.navigate(); - await driver.delay(1000); - const logs = await driver.checkBrowserForLavamoatLogs(); + await withFixtures( + { fixtures: new FixtureBuilder().build() }, + async ({ driver }) => { + await driver.delay(tinyDelayMs); + await driver.navigate(); + await driver.delay(1000); + const logs = await driver.checkBrowserForLavamoatLogs(); - let logString = ''; - let logType = ''; + let logString = ''; + let logType = ''; - logs.forEach((log) => { - if (log.indexOf('"version": 1') >= 0) { - // log end here - logString += log; - parsedLogs[logType] = JSON.parse(`{${logString}}`); - logString = ''; - logType = ''; - } else if (logType) { - // log string continues - logString += log; - } else if ( - log.search(/"name": ".*app\/scripts\/background.js",/u) >= 0 - ) { - // background log starts - logString += log; - logType = 'background'; - } else if (log.search(/"name": ".*app\/scripts\/ui.js",/u) >= 0) { - // ui log starts - logString += log; - logType = 'ui'; - } else if (log.search(/"name": "Total"/u) >= 0) { - // load time log starts - logString += log; - logType = 'loadTime'; - } - }); - }); + logs.forEach((log) => { + if (log.indexOf('"version": 1') >= 0) { + // log end here + logString += log; + parsedLogs[logType] = JSON.parse(`{${logString}}`); + logString = ''; + logType = ''; + } else if (logType) { + // log string continues + logString += log; + } else if ( + log.search(/"name": ".*app\/scripts\/background.js",/u) >= 0 + ) { + // background log starts + logString += log; + logType = 'background'; + } else if (log.search(/"name": ".*app\/scripts\/ui.js",/u) >= 0) { + // ui log starts + logString += log; + logType = 'ui'; + } else if (log.search(/"name": "Total"/u) >= 0) { + // load time log starts + logString += log; + logType = 'loadTime'; + } + }); + }, + ); } catch (error) { console.log('Error in trying to parse logs.'); } diff --git a/test/e2e/restore/MetaMaskUserData.json b/test/e2e/restore/MetaMaskUserData.json new file mode 100644 index 000000000000..cb9dffefb50b --- /dev/null +++ b/test/e2e/restore/MetaMaskUserData.json @@ -0,0 +1,50 @@ +{ + "addressBook": { + "addressBook": { + "0x539": { + "0x0c54FcCd2e384b4BB6f2E405Bf5Cbc15a017AaFb": { + "address": "0x0c54FcCd2e384b4BB6f2E405Bf5Cbc15a017AaFb", + "chainId": "0x539", + "isEns": false, + "memo": "", + "name": "Test Account" + } + } + } + }, + "preferences": { + "advancedGasFee": null, + "currentLocale": "en", + "dismissSeedBackUpReminder": true, + "featureFlags": { + "showIncomingTransactions": true + }, + "forgottenPassword": false, + "frequentRpcListDetail": [ + { + "chainId": "0x539", + "nickname": "Localhost 8545", + "rpcPrefs": {}, + "rpcUrl": "http://localhost:8545", + "ticker": "ETH" + } + ], + "infuraBlocked": false, + "ipfsGateway": "dweb.link", + "knownMethodData": {}, + "ledgerTransportType": "webhid", + "openSeaEnabled": false, + "preferences": { + "hideZeroBalanceTokens": false, + "showFiatInTestnets": false, + "showTestNetworks": false, + "useNativeCurrencyAsPrimaryCurrency": true + }, + "theme": "light", + "useBlockie": false, + "useNftDetection": false, + "useNonceField": false, + "usePhishDetect": true, + "useTokenDetection": false + } +} diff --git a/test/e2e/run-all.js b/test/e2e/run-all.js index 70e18465269b..27b754750297 100644 --- a/test/e2e/run-all.js +++ b/test/e2e/run-all.js @@ -5,6 +5,22 @@ const { hideBin } = require('yargs/helpers'); const { runInShell } = require('../../development/lib/run-command'); const { exitWithError } = require('../../development/lib/exit-with-error'); +const getTestPathsForTestDir = async (testDir) => { + const testFilenames = await fs.readdir(testDir); + const testPaths = testFilenames.map((filename) => + path.join(testDir, filename), + ); + return testPaths; +}; + +function chunk(array, chunkSize) { + const result = []; + for (let i = 0; i < array.length; i += chunkSize) { + result.push(array.slice(i, i + chunkSize)); + } + return result; +} + async function main() { const { argv } = yargs(hideBin(process.argv)) .usage( @@ -38,13 +54,14 @@ async function main() { testDir = path.join(__dirname, 'snaps'); } - const testFilenames = await fs.readdir(testDir); - const testPaths = testFilenames.map((filename) => - path.join(testDir, filename), - ); + let testPaths = await getTestPathsForTestDir(testDir); if (!snaps) { - testPaths.push(path.join(__dirname, 'metamask-ui.spec.js')); + testPaths = [ + ...testPaths, + ...(await getTestPathsForTestDir(path.join(__dirname, 'swaps'))), + path.join(__dirname, 'metamask-ui.spec.js'), + ]; } const runE2eTestPath = path.join(__dirname, 'run-e2e-test.js'); @@ -57,7 +74,14 @@ async function main() { args.push('--retries', retries); } - for (const testPath of testPaths) { + // For running E2Es in parallel in CI + const currentChunkIndex = process.env.CIRCLE_NODE_INDEX ?? 0; + const totalChunks = process.env.CIRCLE_NODE_TOTAL ?? 1; + const chunkSize = Math.ceil(testPaths.length / totalChunks); + const chunks = chunk(testPaths, chunkSize); + const currentChunk = chunks[currentChunkIndex]; + + for (const testPath of currentChunk) { await runInShell('node', [...args, testPath]); } } diff --git a/test/e2e/snaps/enums.js b/test/e2e/snaps/enums.js index 5787056e8155..a940e21b92f3 100644 --- a/test/e2e/snaps/enums.js +++ b/test/e2e/snaps/enums.js @@ -1,3 +1,3 @@ module.exports = { - TEST_SNAPS_WEBSITE_URL: 'https://metamask.github.io/test-snaps/2.0.0', + TEST_SNAPS_WEBSITE_URL: 'https://metamask.github.io/test-snaps/4.0.2/', }; diff --git a/test/e2e/snaps/test-snap-bip-32.spec.js b/test/e2e/snaps/test-snap-bip-32.spec.js new file mode 100644 index 000000000000..63573b68bd32 --- /dev/null +++ b/test/e2e/snaps/test-snap-bip-32.spec.js @@ -0,0 +1,188 @@ +const { strict: assert } = require('assert'); +const { withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); +const { TEST_SNAPS_WEBSITE_URL } = require('./enums'); + +describe('Test Snap bip-32', function () { + it('tests various functions of bip-32', async function () { + const ganacheOptions = { + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + }, + ], + }; + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions, + failOnConsoleError: false, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + + // enter pw into extension + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + // navigate to test snaps page and connect + await driver.driver.get(TEST_SNAPS_WEBSITE_URL); + await driver.delay(1000); + + // find and scroll to the bip32 test and connect + const snapButton1 = await driver.findElement('#connectBip32'); + await driver.scrollToElement(snapButton1); + await driver.delay(1000); + await driver.clickElement('#connectBip32'); + + // switch to metamask extension and click connect + let windowHandles = await driver.waitUntilXWindowHandles( + 2, + 1000, + 10000, + ); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement( + { + text: 'Connect', + tag: 'button', + }, + 10000, + ); + + await driver.delay(2000); + + // switch to metamask extension + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); + + // approve install of snap + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement({ + text: 'Approve & install', + tag: 'button', + }); + + // wait for permissions popover, click checkboxes and confirm + await driver.delay(1000); + await driver.clickElement('#key-access-bip32-m-44h-0h-secp256k1-0'); + await driver.clickElement('#key-access-bip32-m-44h-0h-ed25519-0'); + await driver.clickElement({ + text: 'Confirm', + tag: 'button', + }); + + // switch back to test-snaps window + windowHandles = await driver.waitUntilXWindowHandles(1, 1000, 10000); + await driver.switchToWindowWithTitle('Test Snaps', windowHandles); + + // scroll to and click get public key + await driver.delay(1000); + const snapButton2 = await driver.findElement('#bip32GetPublic'); + await driver.scrollToElement(snapButton2); + await driver.delay(1000); + await driver.clickElement('#bip32GetPublic'); + + // check for proper public key response + await driver.delay(1000); + const retrievePublicKeyResult1 = await driver.findElement( + '#bip32PublicKeyResult', + ); + assert.equal( + await retrievePublicKeyResult1.getText(), + '"0x043e98d696ae15caef75fa8dd204a7c5c08d1272b2218ba3c20feeb4c691eec366606ece56791c361a2320e7fad8bcbb130f66d51c591fc39767ab2856e93f8dfb"', + ); + + // scroll to and click get compressed public key + await driver.delay(1000); + const snapButton3 = await driver.findElement( + '#bip32GetCompressedPublic', + ); + await driver.scrollToElement(snapButton3); + await driver.delay(1000); + await driver.clickElement('#bip32GetCompressedPublic'); + + // check for proper public key response + await driver.delay(1000); + const retrievePublicKeyResult2 = await driver.findElement( + '#bip32PublicKeyResult', + ); + assert.equal( + await retrievePublicKeyResult2.getText(), + '"0x033e98d696ae15caef75fa8dd204a7c5c08d1272b2218ba3c20feeb4c691eec366"', + ); + + // wait then run SECP256K1 test + await driver.delay(1000); + await driver.fill('#bip32Message-secp256k1', 'foo bar'); + await driver.clickElement('#sendBip32-secp256k1'); + + // hit 'approve' on the custom confirm + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement({ + text: 'Approve', + tag: 'button', + }); + + windowHandles = await driver.waitUntilXWindowHandles(1, 1000, 10000); + await driver.switchToWindowWithTitle('Test Snaps', windowHandles); + + // check result + await driver.delay(1000); + const secp256k1Result = await driver.findElement( + '#bip32MessageResult-secp256k1', + ); + assert.equal( + await secp256k1Result.getText(), + '"0x3045022100b3ade2992ea3e5eb58c7550e9bddad356e9554233c8b099ebc3cb418e9301ae2022064746e15ae024808f0ba5d860e44dc4c97e65c8cba6f5ef9ea2e8c819930d2dc"', + ); + + // scroll further into messages section + await driver.delay(1000); + const snapButton4 = await driver.findElement('#bip32Message-ed25519'); + await driver.scrollToElement(snapButton4); + await driver.delay(1000); + + // wait then run ed25519 test + await driver.delay(1000); + await driver.fill('#bip32Message-ed25519', 'foo bar'); + await driver.clickElement('#sendBip32-ed25519'); + + // hit 'approve' on the custom confirm + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement({ + text: 'Approve', + tag: 'button', + }); + + windowHandles = await driver.waitUntilXWindowHandles(1, 1000, 10000); + await driver.switchToWindowWithTitle('Test Snaps', windowHandles); + + // check result + await driver.delay(1000); + const ed25519Result = await driver.findElement( + '#bip32MessageResult-ed25519', + ); + assert.equal( + await ed25519Result.getText(), + '"0xf3215b4d6c59aac7e01b4ceef530d1e2abf4857926b85a81aaae3894505699243768a887b7da4a8c2e0f25196196ba290b6531050db8dc15c252bdd508532a0a"', + ); + }, + ); + }); +}); diff --git a/test/e2e/snaps/test-snap-bip-44.spec.js b/test/e2e/snaps/test-snap-bip-44.spec.js index 1db055b3a979..d57cf831d7a5 100644 --- a/test/e2e/snaps/test-snap-bip-44.spec.js +++ b/test/e2e/snaps/test-snap-bip-44.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); const { TEST_SNAPS_WEBSITE_URL } = require('./enums'); describe('Test Snap bip-44', function () { @@ -15,8 +16,9 @@ describe('Test Snap bip-44', function () { }; await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, + failOnConsoleError: false, title: this.test.title, }, async ({ driver }) => { @@ -28,20 +30,17 @@ describe('Test Snap bip-44', function () { // navigate to test snaps page and connect await driver.driver.get(TEST_SNAPS_WEBSITE_URL); + const snapButton1 = await driver.findElement('#connectBip44Snap'); + await driver.scrollToElement(snapButton1); await driver.delay(1000); - await driver.fill('#snapId3', 'npm:@metamask/test-snap-bip44'); - - // reveal snapId3 by finding and scrolling to #snapId4 - const snapButton = await driver.findElement('#snapId4'); - await driver.scrollToElement(snapButton); - await driver.delay(500); - - // connect the snap - await driver.clickElement('#connectBip44'); + await driver.clickElement('#connectBip44Snap'); // switch to metamask extension and click connect - await driver.waitUntilXWindowHandles(2, 5000, 10000); - let windowHandles = await driver.getAllWindowHandles(); + let windowHandles = await driver.waitUntilXWindowHandles( + 2, + 1000, + 10000, + ); await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -56,9 +55,10 @@ describe('Test Snap bip-44', function () { await driver.delay(2000); + // switch to metamask extension + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); + // approve install of snap - await driver.waitUntilXWindowHandles(2, 5000, 10000); - windowHandles = await driver.getAllWindowHandles(); await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -67,27 +67,58 @@ describe('Test Snap bip-44', function () { text: 'Approve & install', tag: 'button', }); + // deal with permissions popover await driver.delay(1000); - await driver.press('#key-access-bip44-legacy-0', driver.Key.SPACE); + await driver.clickElement('#key-access-bip44-1-0'); await driver.clickElement({ text: 'Confirm', tag: 'button', }); // click send inputs on test snap page - await driver.waitUntilXWindowHandles(1, 5000, 10000); - windowHandles = await driver.getAllWindowHandles(); + windowHandles = await driver.waitUntilXWindowHandles(1, 1000, 10000); await driver.switchToWindowWithTitle('Test Snaps', windowHandles); await driver.delay(1000); - await driver.clickElement('#sendBip44'); + await driver.clickElement('#sendBip44Test'); // check the results of the public key test - await driver.delay(2000); + await driver.delay(1000); const bip44Result = await driver.findElement('#bip44Result'); assert.equal( await bip44Result.getText(), - 'Public key: "0x86debb44fb3a984d93f326131d4c1db0bc39644f1a67b673b3ab45941a1cea6a385981755185ac4594b6521e4d1e8d1"', + '"0x86debb44fb3a984d93f326131d4c1db0bc39644f1a67b673b3ab45941a1cea6a385981755185ac4594b6521e4d1e08d1"', + ); + + // enter a message to sign + await driver.fill('#bip44Message', '1234'); + await driver.delay(1000); + const snapButton3 = await driver.findElement('#signBip44Message'); + await driver.scrollToElement(snapButton3); + await driver.delay(1000); + await driver.clickElement('#signBip44Message'); + + // Switch to approve signature message window and approve + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement({ + text: 'Approve', + tag: 'button', + }); + + // switch back to test-snaps page + windowHandles = await driver.waitUntilXWindowHandles(1, 1000, 10000); + await driver.switchToWindowWithTitle('Test Snaps', windowHandles); + await driver.delay(1000); + + // check the results of the message signature + const bip44SignResult = await driver.findElement('#bip44SignResult'); + assert.equal( + await bip44SignResult.getText(), + '"0xa41ab87ca50606eefd47525ad90294bbe44c883f6bc53655f1b8a55aa8e1e35df216f31be62e52c7a1faa519420e20810162e07dedb0fde2a4d997ff7180a78232ecd8ce2d6f4ba42ccacad33c5e9e54a8c4d41506bdffb2bb4c368581d8b086"', ); }, ); diff --git a/test/e2e/snaps/test-snap-confirm.spec.js b/test/e2e/snaps/test-snap-confirm.spec.js index c6a35657a403..3b87cb4a2786 100644 --- a/test/e2e/snaps/test-snap-confirm.spec.js +++ b/test/e2e/snaps/test-snap-confirm.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); const { TEST_SNAPS_WEBSITE_URL } = require('./enums'); describe('Test Snap Confirm', function () { @@ -15,8 +16,9 @@ describe('Test Snap Confirm', function () { }; await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, + failOnConsoleError: false, title: this.test.title, }, async ({ driver }) => { @@ -28,12 +30,17 @@ describe('Test Snap Confirm', function () { // navigate to test snaps page and connect await driver.driver.get(TEST_SNAPS_WEBSITE_URL); - await driver.fill('#snapId1', 'npm:@metamask/test-snap-confirm'); - await driver.clickElement('#connectHello'); + const snapButton1 = await driver.findElement('#connectConfirmSnap'); + await driver.scrollToElement(snapButton1); + await driver.delay(1000); + await driver.clickElement('#connectConfirmSnap'); // switch to metamask extension and click connect - await driver.waitUntilXWindowHandles(2, 5000, 10000); - let windowHandles = await driver.getAllWindowHandles(); + let windowHandles = await driver.waitUntilXWindowHandles( + 2, + 1000, + 10000, + ); await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -49,8 +56,7 @@ describe('Test Snap Confirm', function () { await driver.delay(2000); // approve install of snap - await driver.waitUntilXWindowHandles(2, 5000, 10000); - windowHandles = await driver.getAllWindowHandles(); + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -60,16 +66,18 @@ describe('Test Snap Confirm', function () { tag: 'button', }); - // click send inputs on test snap page - await driver.waitUntilXWindowHandles(1, 5000, 10000); - windowHandles = await driver.getAllWindowHandles(); + // switch back to test snaps page + windowHandles = await driver.waitUntilXWindowHandles(1, 1000, 10000); await driver.switchToWindowWithTitle('Test Snaps', windowHandles); + + // click send inputs on test snap page + const snapButton2 = await driver.findElement('#sendConfirmButton'); + await driver.scrollToElement(snapButton2); await driver.delay(1000); await driver.clickElement('#sendConfirmButton'); // hit 'approve' on the custom confirm - await driver.waitUntilXWindowHandles(2, 5000, 10000); - windowHandles = await driver.getAllWindowHandles(); + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -80,8 +88,7 @@ describe('Test Snap Confirm', function () { }); // check the results of the custom confirm - await driver.waitUntilXWindowHandles(1, 5000, 10000); - windowHandles = await driver.getAllWindowHandles(); + windowHandles = await driver.waitUntilXWindowHandles(1, 1000, 10000); await driver.switchToWindowWithTitle('Test Snaps', windowHandles); const confirmResult = await driver.findElement('#confirmResult'); assert.equal(await confirmResult.getText(), 'true'); diff --git a/test/e2e/snaps/test-snap-error.spec.js b/test/e2e/snaps/test-snap-error.spec.js index 177184727617..949c69316995 100644 --- a/test/e2e/snaps/test-snap-error.spec.js +++ b/test/e2e/snaps/test-snap-error.spec.js @@ -1,6 +1,6 @@ const { strict: assert } = require('assert'); const { withFixtures } = require('../helpers'); -const { PAGES } = require('../webdriver/driver'); +const FixtureBuilder = require('../fixture-builder'); const { TEST_SNAPS_WEBSITE_URL } = require('./enums'); describe('Test Snap Error', function () { @@ -16,8 +16,9 @@ describe('Test Snap Error', function () { }; await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, + failOnConsoleError: false, title: this.test.title, }, async ({ driver }) => { @@ -28,13 +29,19 @@ describe('Test Snap Error', function () { await driver.press('#password', driver.Key.ENTER); // navigate to test snaps page and connect - await driver.driver.get(TEST_SNAPS_WEBSITE_URL); - await driver.fill('#snapId2', 'npm:@metamask/test-snap-error'); - await driver.clickElement('#connectError'); + await driver.openNewPage(TEST_SNAPS_WEBSITE_URL); + const snapButton = await driver.findElement('#connectErrorSnap'); + await driver.scrollToElement(snapButton); + await driver.delay(1000); + await driver.clickElement('#connectErrorSnap'); // switch to metamask extension and click connect - await driver.waitUntilXWindowHandles(2, 5000, 10000); - let windowHandles = await driver.getAllWindowHandles(); + let windowHandles = await driver.waitUntilXWindowHandles( + 3, + 1000, + 10000, + ); + const extensionPage = windowHandles[0]; await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -50,7 +57,7 @@ describe('Test Snap Error', function () { await driver.delay(2000); // approve install of snap - windowHandles = await driver.getAllWindowHandles(); + windowHandles = await driver.waitUntilXWindowHandles(3, 1000, 10000); await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -61,14 +68,18 @@ describe('Test Snap Error', function () { }); // click send inputs on test snap page - await driver.waitUntilXWindowHandles(1, 5000, 10000); - windowHandles = await driver.getAllWindowHandles(); + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); await driver.switchToWindowWithTitle('Test Snaps', windowHandles); await driver.delay(1000); + + // find and click on send error await driver.clickElement('#sendError'); - await driver.navigate(PAGES.HOME); + // switch back to the extension page + await driver.switchToWindow(extensionPage); + await driver.delay(1000); + // look for the actual error and check if it is correct const error = await driver.findElement( '.home-notification__content-container', ); @@ -79,6 +90,12 @@ describe('Test Snap Error', function () { ), true, ); + + // try to click on the dismiss button and pass test if it works + await driver.clickElement({ + text: 'Dismiss', + tag: 'button', + }); }, ); }); diff --git a/test/e2e/snaps/test-snap-installed.spec.js b/test/e2e/snaps/test-snap-installed.spec.js new file mode 100644 index 000000000000..67a61df2be93 --- /dev/null +++ b/test/e2e/snaps/test-snap-installed.spec.js @@ -0,0 +1,118 @@ +const { strict: assert } = require('assert'); +const { withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); +const { TEST_SNAPS_WEBSITE_URL } = require('./enums'); + +describe('Test Snap Installed', function () { + it('can tell if a snap is installed', async function () { + const ganacheOptions = { + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: 25000000000000000000, + }, + ], + }; + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions, + failOnConsoleError: false, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + + // enter pw into extension + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + // navigate to test snaps page and connect + await driver.openNewPage(TEST_SNAPS_WEBSITE_URL); + await driver.delay(1000); + const confirmButton = await driver.findElement('#connectConfirmSnap'); + await driver.scrollToElement(confirmButton); + await driver.clickElement('#connectConfirmSnap'); + + // switch to metamask extension and click connect + let windowHandles = await driver.waitUntilXWindowHandles( + 3, + 1000, + 10000, + ); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement( + { + text: 'Connect', + tag: 'button', + }, + 10000, + ); + + await driver.delay(2000); + + // approve install of snap + windowHandles = await driver.waitUntilXWindowHandles(3, 1000, 10000); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement({ + text: 'Approve & install', + tag: 'button', + }); + + // click send inputs on test snap page + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); + await driver.switchToWindowWithTitle('Test Snaps', windowHandles); + + const errorButton = await driver.findElement('#connectErrorSnap'); + await driver.scrollToElement(errorButton); + await driver.delay(1000); + await driver.clickElement('#connectErrorSnap'); + + // switch to metamask extension and click connect + windowHandles = await driver.waitUntilXWindowHandles(3, 1000, 10000); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement( + { + text: 'Connect', + tag: 'button', + }, + 10000, + ); + + await driver.delay(2000); + + // approve install of snap + windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement({ + text: 'Approve & install', + tag: 'button', + }); + + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); + await driver.switchToWindowWithTitle('Test Snaps', windowHandles); + + const result = await driver.findElement('#installedSnapsResult'); + await driver.scrollToElement(result); + await driver.delay(1000); + assert.equal( + await result.getText(), + 'npm:@metamask/test-snap-confirm, npm:@metamask/test-snap-error', + ); + }, + ); + }); +}); diff --git a/test/e2e/snaps/test-snap-managestate.spec.js b/test/e2e/snaps/test-snap-managestate.spec.js index 06fddda59528..3bd925a77137 100644 --- a/test/e2e/snaps/test-snap-managestate.spec.js +++ b/test/e2e/snaps/test-snap-managestate.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); const { TEST_SNAPS_WEBSITE_URL } = require('./enums'); describe('Test Snap manageState', function () { @@ -16,8 +17,9 @@ describe('Test Snap manageState', function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, + failOnConsoleError: false, title: this.test.title, }, async ({ driver }) => { @@ -28,21 +30,21 @@ describe('Test Snap manageState', function () { await driver.press('#password', driver.Key.ENTER); // navigate to test snaps page, then fill in the snapId - await driver.driver.get(TEST_SNAPS_WEBSITE_URL); + await driver.openNewPage(TEST_SNAPS_WEBSITE_URL); await driver.delay(1000); - await driver.fill('#snapId4', 'npm:@metamask/test-snap-managestate'); - // find and scroll to the rest of the card - const snapButton = await driver.findElement('#snapId4'); - await driver.scrollToElement(snapButton); - await driver.delay(500); - - // connect the snap + // find and scroll to the connect button and click it + const snapButton1 = await driver.findElement('#connectManageState'); + await driver.scrollToElement(snapButton1); + await driver.delay(1000); await driver.clickElement('#connectManageState'); // switch to metamask extension and click connect - await driver.waitUntilXWindowHandles(2, 5000, 10000); - let windowHandles = await driver.getAllWindowHandles(); + let windowHandles = await driver.waitUntilXWindowHandles( + 3, + 1000, + 10000, + ); await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -57,8 +59,7 @@ describe('Test Snap manageState', function () { await driver.delay(2000); // approve install of snap - await driver.waitUntilXWindowHandles(2, 5000, 10000); - windowHandles = await driver.getAllWindowHandles(); + windowHandles = await driver.waitUntilXWindowHandles(3, 1000, 10000); await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -69,54 +70,47 @@ describe('Test Snap manageState', function () { }); // fill and click send inputs on test snap page - await driver.waitUntilXWindowHandles(1, 5000, 10000); - windowHandles = await driver.getAllWindowHandles(); + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); await driver.switchToWindowWithTitle('Test Snaps', windowHandles); await driver.fill('#dataManageState', '23'); await driver.delay(1000); await driver.clickElement('#sendManageState'); // check the results of the public key test - await driver.delay(500); + await driver.delay(1000); const manageStateResult = await driver.findElement( '#sendManageStateResult', ); assert.equal(await manageStateResult.getText(), 'true'); - // click get results - await driver.clickElement('#retrieveManageState'); - // check the results - await driver.delay(500); + await driver.delay(1000); const retrieveManageStateResult = await driver.findElement( '#retrieveManageStateResult', ); assert.equal( await retrieveManageStateResult.getText(), - '{"testState":["23"]}', + '{ "testState": [ "23" ] }', ); // click clear results await driver.clickElement('#clearManageState'); // check if true - await driver.delay(500); + await driver.delay(1000); const clearManageStateResult = await driver.findElement( '#clearManageStateResult', ); assert.equal(await clearManageStateResult.getText(), 'true'); - // click get results again - await driver.clickElement('#retrieveManageState'); - // check result array is empty - await driver.delay(500); + await driver.delay(1000); const retrieveManageStateResult2 = await driver.findElement( '#retrieveManageStateResult', ); assert.equal( await retrieveManageStateResult2.getText(), - '{"testState":[]}', + '{ "testState": [] }', ); }, ); diff --git a/test/e2e/snaps/test-snap-notification.spec.js b/test/e2e/snaps/test-snap-notification.spec.js index 25f7cbe3435d..3ca05a868a34 100644 --- a/test/e2e/snaps/test-snap-notification.spec.js +++ b/test/e2e/snaps/test-snap-notification.spec.js @@ -1,6 +1,6 @@ const { strict: assert } = require('assert'); const { withFixtures } = require('../helpers'); -const { PAGES } = require('../webdriver/driver'); +const FixtureBuilder = require('../fixture-builder'); const { TEST_SNAPS_WEBSITE_URL } = require('./enums'); describe('Test Snap Notification', function () { @@ -16,8 +16,9 @@ describe('Test Snap Notification', function () { }; await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, + failOnConsoleError: false, title: this.test.title, }, async ({ driver }) => { @@ -28,21 +29,22 @@ describe('Test Snap Notification', function () { await driver.press('#password', driver.Key.ENTER); // navigate to test snaps page - await driver.driver.get(TEST_SNAPS_WEBSITE_URL); + await driver.openNewPage(TEST_SNAPS_WEBSITE_URL); await driver.delay(1000); - // find and scroll down to snapId5 - const snapButton = await driver.findElement('#snapId5'); + // find and scroll down to snapId5 and connect + const snapButton = await driver.findElement('#connectNotification'); await driver.scrollToElement(snapButton); await driver.delay(500); - await driver.fill('#snapId5', 'npm:@metamask/test-snap-notification'); - - // connect the snap await driver.clickElement('#connectNotification'); // switch to metamask extension and click connect - await driver.waitUntilXWindowHandles(2, 5000, 10000); - let windowHandles = await driver.getAllWindowHandles(); + let windowHandles = await driver.waitUntilXWindowHandles( + 3, + 1000, + 10000, + ); + const extensionPage = windowHandles[0]; await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -57,8 +59,7 @@ describe('Test Snap Notification', function () { await driver.delay(2000); // approve install of snap - await driver.waitUntilXWindowHandles(2, 5000, 10000); - windowHandles = await driver.getAllWindowHandles(); + windowHandles = await driver.waitUntilXWindowHandles(3, 1000, 10000); await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -69,14 +70,13 @@ describe('Test Snap Notification', function () { }); // click send inputs on test snap page - await driver.waitUntilXWindowHandles(1, 5000, 10000); - windowHandles = await driver.getAllWindowHandles(); + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); await driver.switchToWindowWithTitle('Test Snaps', windowHandles); await driver.delay(1000); await driver.clickElement('#sendInAppNotification'); - // try to go to the MM pages - await driver.navigate(PAGES.HOME); + // switch back to the extension page + await driver.switchToWindow(extensionPage); await driver.delay(1500); // check to see that there is one notification @@ -87,14 +87,14 @@ describe('Test Snap Notification', function () { // try to click on the account menu icon (via xpath) await driver.clickElement('.account-menu__icon'); - await driver.delay(500); + await driver.delay(1000); // try to click on the notification item (via xpath) await driver.clickElement({ text: 'Notifications', tag: 'div', }); - await driver.delay(500); + await driver.delay(1000); // look for the correct text in notifications (via xpath) const notificationResultMessage = await driver.findElement( diff --git a/test/e2e/snaps/test-snap-update.spec.js b/test/e2e/snaps/test-snap-update.spec.js new file mode 100644 index 000000000000..bc78e10cfb25 --- /dev/null +++ b/test/e2e/snaps/test-snap-update.spec.js @@ -0,0 +1,109 @@ +const { strict: assert } = require('assert'); +const { withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); +const { TEST_SNAPS_WEBSITE_URL } = require('./enums'); + +describe('Test Snap update', function () { + it('can install an old and then updated version', async function () { + const ganacheOptions = { + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: 25000000000000000000, + }, + ], + }; + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions, + failOnConsoleError: false, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + + // enter pw into extension + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + // open a new tab and navigate to test snaps page and connect + await driver.openNewPage(TEST_SNAPS_WEBSITE_URL); + + // find and scroll to the correct card and click first + const snapButton = await driver.findElement('#connectUpdateNew'); + await driver.scrollToElement(snapButton); + await driver.delay(1000); + await driver.clickElement('#connectUpdate'); + + await driver.delay(2000); + + // switch to metamask extension and click connect + let windowHandles = await driver.waitUntilXWindowHandles( + 3, + 1000, + 10000, + ); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement( + { + text: 'Connect', + tag: 'button', + }, + 10000, + ); + await driver.delay(2000); + + // approve install of snap + windowHandles = await driver.waitUntilXWindowHandles(3, 1000, 10000); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement({ + text: 'Approve & install', + tag: 'button', + }); + + // navigate to test snap page + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); + await driver.switchToWindowWithTitle('Test Snaps', windowHandles); + await driver.delay(1000); + + // find and scroll to the correct card and click first + const snapButton2 = await driver.findElement('#connectUpdateNew'); + await driver.scrollToElement(snapButton2); + await driver.delay(1000); + await driver.clickElement('#connectUpdateNew'); + + // switch to metamask extension and click connect + await driver.waitUntilXWindowHandles(3, 1000, 10000); + await driver.delay(1000); + + // approve update of snap + windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.clickElement({ + text: 'Approve & update', + tag: 'button', + }); + + // navigate to test snap page + windowHandles = await driver.waitUntilXWindowHandles(2, 1000, 10000); + await driver.switchToWindowWithTitle('Test Snaps', windowHandles); + + // look for the correct version text + const versionResult = await driver.findElement('#updateSnapVersion'); + await driver.delay(1000); + assert.equal(await versionResult.getText(), '"2.0.0"'); + }, + ); + }); +}); diff --git a/test/e2e/swaps/shared.js b/test/e2e/swaps/shared.js new file mode 100644 index 000000000000..4a2d4d124cf7 --- /dev/null +++ b/test/e2e/swaps/shared.js @@ -0,0 +1,70 @@ +const FixtureBuilder = require('../fixture-builder'); +const { veryLargeDelayMs } = require('../helpers'); + +const ganacheOptions = { + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: 25000000000000000000, + }, + ], +}; + +const withFixturesOptions = { + fixtures: new FixtureBuilder().build(), + ganacheOptions, +}; + +const loadSwaps = async (driver) => { + await driver.navigate(); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + await driver.clickElement( + '.wallet-overview__buttons .icon-button:nth-child(3)', + ); +}; + +const buildQuote = async (driver, options) => { + await driver.fill('input[placeholder*="0"]', options.amount); + await driver.delay(veryLargeDelayMs); // Need an extra delay after typing an amount. + await driver.clickElement( + '[class="dropdown-search-list__closed-primary-label dropdown-search-list__select-default"]', + ); + await driver.wait(async () => { + const tokens = await driver.findElements('.searchable-item-list__item'); + return tokens.length > 1; + }); + await driver.clickElement('.searchable-item-list__labels'); + await driver.clickElement('.dropdown-input-pair__to'); + await driver.clickElement('input[data-testid="search-list-items"]'); + await driver.fill( + 'input[data-testid="search-list-items"]', + options.swapTo || options.swapToContractAddress, + ); + if (options.swapTo) { + await driver.wait(async () => { + const tokenNames = await driver.findElements( + '.searchable-item-list__primary-label', + ); + if (tokenNames.length === 0) { + return false; + } + const tokenName = await tokenNames[0].getText(); + return tokenName === options.swapTo; + }); + } + if (options.swapToContractAddress) { + await driver.waitForSelector({ + css: '.searchable-item-list__item button.btn-primary', + text: 'Import', + }); + } + await driver.clickElement('.searchable-item-list__primary-label'); +}; + +module.exports = { + withFixturesOptions, + loadSwaps, + buildQuote, +}; diff --git a/test/e2e/tests/swap-eth.spec.js b/test/e2e/swaps/swap-eth.spec.js similarity index 59% rename from test/e2e/tests/swap-eth.spec.js rename to test/e2e/swaps/swap-eth.spec.js index 771a5e050ba4..d67c258d819c 100644 --- a/test/e2e/tests/swap-eth.spec.js +++ b/test/e2e/swaps/swap-eth.spec.js @@ -1,57 +1,21 @@ const { strict: assert } = require('assert'); + const { withFixtures } = require('../helpers'); +const { withFixturesOptions, loadSwaps, buildQuote } = require('./shared'); describe('Swap Eth for another Token', function () { - const ganacheOptions = { - accounts: [ - { - secretKey: - '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', - balance: 25000000000000000000, - }, - ], - }; it('Completes a Swap between Eth and Matic', async function () { await withFixtures( { - fixtures: 'special-settings', - ganacheOptions, + ...withFixturesOptions, title: this.test.title, - failOnConsoleError: false, - driverOptions: { - timeOut: 20000, - }, }, async ({ driver }) => { - await driver.navigate(); - await driver.fill('#password', 'correct horse battery staple'); - await driver.press('#password', driver.Key.ENTER); - await driver.clickElement( - '.wallet-overview__buttons .icon-button:nth-child(3)', - ); - await driver.clickElement( - '[class*="dropdown-search-list"] + div[class*="MuiFormControl-root MuiTextField-root"]', - ); - await driver.fill('input[placeholder*="0"]', '2'); - await driver.clickElement( - '[class*="dropdown-search-list"] + div[class*="MuiFormControl-root MuiTextField-root"]', - ); - await driver.clickElement( - '[class="dropdown-search-list__closed-primary-label dropdown-search-list__select-default"]', - ); - await driver.clickElement( - '[placeholder="Search name or paste address"]', - ); - await driver.fill( - '[placeholder="Search name or paste address"]', - 'DAI', - ); - await driver.waitForSelector( - '[class="searchable-item-list__primary-label"]', - ); - await driver.clickElement( - '[class="searchable-item-list__primary-label"]', - ); + await loadSwaps(driver); + await buildQuote(driver, { + amount: 2, + swapTo: 'DAI', + }); await driver.clickElement({ text: 'Review swap', tag: 'button' }); await driver.waitForSelector('[class*="box--align-items-center"]'); const estimatedEth = await driver.waitForSelector({ diff --git a/test/e2e/swaps/swaps-notifications.spec.js b/test/e2e/swaps/swaps-notifications.spec.js new file mode 100644 index 000000000000..07c845f98a49 --- /dev/null +++ b/test/e2e/swaps/swaps-notifications.spec.js @@ -0,0 +1,130 @@ +const { strict: assert } = require('assert'); + +const { withFixtures } = require('../helpers'); + +const { withFixturesOptions, loadSwaps, buildQuote } = require('./shared'); + +describe('Swaps - notifications', function () { + it('tests notifications for verified token on 1 source and price difference', async function () { + await withFixtures( + { + ...withFixturesOptions, + title: this.test.title, + }, + async ({ driver }) => { + await loadSwaps(driver); + await buildQuote(driver, { + amount: 2, + swapTo: 'INUINU', + }); + const reviewSwapButton = await driver.findElement( + '[data-testid="page-container-footer-next"]', + ); + assert.equal(await reviewSwapButton.getText(), 'Review swap'); + assert.equal(await reviewSwapButton.isEnabled(), false); + const continueButton = await driver.findClickableElement( + '.actionable-message__action-warning', + ); + assert.equal(await continueButton.getText(), 'Continue'); + await continueButton.click(); + assert.equal(await reviewSwapButton.isEnabled(), true); + await reviewSwapButton.click(); + await driver.waitForSelector({ + css: '[class*="box--align-items-center"]', + text: 'Estimated gas fee', + }); + const swapButton = await driver.findElement( + '[data-testid="page-container-footer-next"]', + ); + assert.equal(await swapButton.isEnabled(), false); + await driver.clickElement({ text: 'I understand', tag: 'button' }); + assert.equal(await swapButton.getText(), 'Swap'); + assert.equal(await swapButton.isEnabled(), true); + }, + ); + }); + + it('tests a notification for not enough balance', async function () { + await withFixtures( + { + ...withFixturesOptions, + title: this.test.title, + }, + async ({ driver }) => { + await loadSwaps(driver); + await buildQuote(driver, { + amount: 50, + swapTo: 'USDC', + }); + const reviewSwapButton = await driver.findElement( + '[data-testid="page-container-footer-next"]', + ); + assert.equal(await reviewSwapButton.getText(), 'Review swap'); + assert.equal(await reviewSwapButton.isEnabled(), true); + await reviewSwapButton.click(); + await driver.waitForSelector({ + css: '[class*="box--align-items-center"]', + text: 'Estimated gas fee', + }); + await driver.waitForSelector({ + css: '[class*="actionable-message__message"]', + text: 'You need 43.4467 more TESTETH to complete this swap', + }); + const swapButton = await driver.findElement( + '[data-testid="page-container-footer-next"]', + ); + assert.equal(await swapButton.getText(), 'Swap'); + assert.equal(await swapButton.isEnabled(), false); + }, + ); + }); + + it('tests notifications for verified token on 0 sources and high slippage', async function () { + await withFixtures( + { + ...withFixturesOptions, + title: this.test.title, + }, + async ({ driver }) => { + await loadSwaps(driver); + await buildQuote(driver, { + amount: 2, + swapToContractAddress: '0x72c9Fb7ED19D3ce51cea5C56B3e023cd918baaDf', + }); + await driver.waitForSelector({ + css: '.popover-header__title', + text: 'Import token?', + }); + await driver.clickElement( + '[data-testid="page-container__import-button"]', + ); + const reviewSwapButton = await driver.findElement( + '[data-testid="page-container-footer-next"]', + ); + assert.equal(await reviewSwapButton.isEnabled(), false); + const continueButton = await driver.findClickableElement( + '.actionable-message__action-danger', + ); + assert.equal(await continueButton.getText(), 'Continue'); + await continueButton.click(); + assert.equal(await reviewSwapButton.isEnabled(), true); + await driver.clickElement('[class="slippage-buttons__header-text"]'); + await driver.clickElement({ text: 'custom', tag: 'button' }); + await driver.fill( + 'input[data-testid="slippage-buttons__custom-slippage"]', + '20', + ); + await driver.waitForSelector({ + css: '[class*="slippage-buttons__error-text"]', + text: 'Slippage amount is too high and will result in a bad rate. Please reduce your slippage tolerance to a value below 15%.', + }); + assert.equal(await reviewSwapButton.isEnabled(), false); + await driver.fill( + 'input[data-testid="slippage-buttons__custom-slippage"]', + '4', + ); + assert.equal(await reviewSwapButton.isEnabled(), true); + }, + ); + }); +}); diff --git a/test/e2e/tests/account-details.spec.js b/test/e2e/tests/account-details.spec.js index cfdbdf2384e2..8b8c990f0500 100644 --- a/test/e2e/tests/account-details.spec.js +++ b/test/e2e/tests/account-details.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Show account details', function () { const ganacheOptions = { @@ -14,7 +15,7 @@ describe('Show account details', function () { it('should show the QR code for the account', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/add-account.spec.js b/test/e2e/tests/add-account.spec.js index ca9415ac39c2..5e1c15bd0f6c 100644 --- a/test/e2e/tests/add-account.spec.js +++ b/test/e2e/tests/add-account.spec.js @@ -6,6 +6,7 @@ const { completeImportSRPOnboardingFlow, } = require('../helpers'); const enLocaleMessages = require('../../../app/_locales/en/messages.json'); +const FixtureBuilder = require('../fixture-builder'); describe('Add account', function () { const testSeedPhrase = @@ -24,7 +25,7 @@ describe('Add account', function () { it('should display correct new account name after create', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -50,7 +51,7 @@ describe('Add account', function () { it('should add the same account addresses when a secret recovery phrase is imported, the account is locked, and the same secret recovery phrase is imported again', async function () { await withFixtures( { - fixtures: 'onboarding', + fixtures: new FixtureBuilder({ onboarding: true }).build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, @@ -205,7 +206,7 @@ describe('Add account', function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/add-hide-token.spec.js b/test/e2e/tests/add-hide-token.spec.js index 8722bcfb0e54..68882308159c 100644 --- a/test/e2e/tests/add-hide-token.spec.js +++ b/test/e2e/tests/add-hide-token.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Hide token', function () { const ganacheOptions = { @@ -14,7 +15,32 @@ describe('Hide token', function () { it('hides the token when clicked', async function () { await withFixtures( { - fixtures: 'custom-token', + fixtures: new FixtureBuilder() + .withTokensController({ + allTokens: { + '0x539': { + '0x5cfe73b6021e818b776b421b1c4db2474086a7e1': [ + { + address: '0x86002be4cdd922de1ccb831582bf99284b99ac12', + decimals: 4, + image: null, + isERC721: false, + symbol: 'TST', + }, + ], + }, + }, + tokens: [ + { + address: '0x86002be4cdd922de1ccb831582bf99284b99ac12', + decimals: 4, + image: null, + isERC721: false, + symbol: 'TST', + }, + ], + }) + .build(), ganacheOptions, title: this.test.title, }, @@ -69,12 +95,11 @@ describe('Add existing token using search', function () { it('renders the balance for the chosen token', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder() + .withPreferencesController({ useTokenDetection: true }) + .build(), ganacheOptions, title: this.test.title, - driverOptions: { - timeOut: 20000, - }, }, async ({ driver }) => { await driver.navigate(); diff --git a/test/e2e/tests/address-book.spec.js b/test/e2e/tests/address-book.spec.js index b0121bcab2d7..5b47d455d60b 100644 --- a/test/e2e/tests/address-book.spec.js +++ b/test/e2e/tests/address-book.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Address Book', function () { const ganacheOptions = { @@ -14,7 +15,7 @@ describe('Address Book', function () { it('Adds an entry to the address book and sends eth to that address', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -26,7 +27,7 @@ describe('Address Book', function () { await driver.clickElement('[data-testid="eth-overview-send"]'); await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', '0x2f318C334780961FB129D2a6c30D0763d9a5C970', ); @@ -77,7 +78,21 @@ describe('Address Book', function () { it('Sends to an address book entry', async function () { await withFixtures( { - fixtures: 'address-entry', + fixtures: new FixtureBuilder() + .withAddressBookController({ + addressBook: { + '0x539': { + '0x2f318C334780961FB129D2a6c30D0763d9a5C970': { + address: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + chainId: '0x539', + isEns: false, + memo: '', + name: 'Test Name 1', + }, + }, + }, + }) + .build(), ganacheOptions, title: this.test.title, }, @@ -90,6 +105,7 @@ describe('Address Book', function () { const recipientRowTitle = await driver.findElement( '.send__select-recipient-wrapper__group-item__title', ); + const recipientRowTitleString = await recipientRowTitle.getText(); assert.equal(recipientRowTitleString, 'Test Name 1'); await driver.clickElement( @@ -120,4 +136,107 @@ describe('Address Book', function () { }, ); }); + it('Edit entry in address book', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withAddressBookController({ + addressBook: { + '0x539': { + '0x2f318C334780961FB129D2a6c30D0763d9a5C970': { + address: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + chainId: '0x539', + isEns: false, + memo: '', + name: 'Test Name 1', + }, + }, + }, + }) + .build(), + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + await driver.clickElement('.identicon__address-wrapper'); + await driver.clickElement({ text: 'Settings', tag: 'div' }); + await driver.clickElement({ text: 'Contacts', tag: 'div' }); + await driver.clickElement('[data-testid="recipient"]'); + + await driver.clickElement({ text: 'Edit', tag: 'button' }); + const inputUsername = await driver.findElement('#nickname'); + await inputUsername.fill('Test Name Edit'); + + const inputAddress = await driver.findElement('#address'); + await inputAddress.fill('0x74cE91B75935D6Bedc27eE002DeFa566c5946f74'); + + await driver.clickElement('[data-testid="page-container-footer-next"]'); + + const recipientUsername = await driver.findElement({ + text: 'Test Name Edit', + tag: 'div', + }); + assert.equal( + await recipientUsername.getText(), + 'Test Name Edit', + 'Username is not edited correctly', + ); + + const recipientAddress = await driver.findElement( + '.send__select-recipient-wrapper__group-item__subtitle', + ); + assert.equal( + await recipientAddress.getText(), + '0x74cE...6f74', + 'Recipient address is not edited correctly', + ); + }, + ); + }); + it('Deletes existing entry from address book', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder() + .withAddressBookController({ + addressBook: { + '0x539': { + '0x2f318C334780961FB129D2a6c30D0763d9a5C970': { + address: '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + chainId: '0x539', + isEns: false, + memo: '', + name: 'Test Name 1', + }, + }, + }, + }) + .build(), + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + await driver.clickElement('.identicon__address-wrapper'); + await driver.clickElement({ text: 'Settings', tag: 'div' }); + await driver.clickElement({ text: 'Contacts', tag: 'div' }); + + await driver.clickElement({ text: 'Test Name 1', tag: 'div' }); + await driver.clickElement({ text: 'Edit', tag: 'button' }); + await driver.clickElement({ text: 'Delete account', tag: 'a' }); + // it checks if account is deleted + const contact = await driver.findElement( + '.send__select-recipient-wrapper__group-item', + ); + const exists = await driver.isElementPresent(contact); + assert.equal(exists, false, 'Contact is not deleted'); + }, + ); + }); }); diff --git a/test/e2e/tests/advanced-settings.spec.js b/test/e2e/tests/advanced-settings.spec.js index b0d1eea35519..88a4a7f27e86 100644 --- a/test/e2e/tests/advanced-settings.spec.js +++ b/test/e2e/tests/advanced-settings.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Advanced Settings', function () { const ganacheOptions = { @@ -16,7 +17,7 @@ describe('Advanced Settings', function () { await withFixtures( { dapp: true, - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -53,7 +54,7 @@ describe('Advanced Settings', function () { await withFixtures( { dapp: true, - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/auto-lock.spec.js b/test/e2e/tests/auto-lock.spec.js index 7401540ac4d6..c49680f0d17b 100644 --- a/test/e2e/tests/auto-lock.spec.js +++ b/test/e2e/tests/auto-lock.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Auto-Lock Timer', function () { const ganacheOptions = { @@ -15,7 +16,7 @@ describe('Auto-Lock Timer', function () { it('should automatically lock the wallet once the idle time has elapsed', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/backup.spec.js b/test/e2e/tests/backup-restore.spec.js similarity index 56% rename from test/e2e/tests/backup.spec.js rename to test/e2e/tests/backup-restore.spec.js index 99b3a43ea397..1310abd5302e 100644 --- a/test/e2e/tests/backup.spec.js +++ b/test/e2e/tests/backup-restore.spec.js @@ -1,10 +1,12 @@ const { strict: assert } = require('assert'); const { promises: fs } = require('fs'); +const path = require('path'); const { convertToHexValue, withFixtures, createDownloadFolder, } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); const downloadsFolder = `${process.cwd()}/test-artifacts/downloads`; @@ -35,7 +37,14 @@ const backupExists = async () => { } }; -describe('Backup', function () { +const restoreFile = path.join( + __dirname, + '..', + 'restore', + 'MetaMaskUserData.json', +); + +describe('Backup and Restore', function () { const ganacheOptions = { accounts: [ { @@ -45,10 +54,10 @@ describe('Backup', function () { }, ], }; - it('should create backup for the account', async function () { + it('should backup the account settings', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, @@ -78,4 +87,40 @@ describe('Backup', function () { }, ); }); + + it('should restore the account settings', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + // Restore + await driver.clickElement('.account-menu__icon'); + await driver.clickElement({ text: 'Settings', tag: 'div' }); + await driver.clickElement({ text: 'Advanced', tag: 'div' }); + const restore = await driver.findElement('#restore-file'); + await restore.sendKeys(restoreFile); + + // Dismiss success message + await driver.waitForSelector({ + css: '.actionable-message__message', + text: 'Your data has been restored successfully', + }); + await driver.clickElement({ text: 'Dismiss', tag: 'button' }); + + // Verify restore + await driver.clickElement({ text: 'Contacts', tag: 'div' }); + const recipient = await driver.findElement('[data-testid="recipient"]'); + assert.ok( + /Test\sAccount\s*0x0c54...AaFb/u.test(await recipient.getText()), + ); + }, + ); + }); }); diff --git a/test/e2e/tests/chain-interactions.spec.js b/test/e2e/tests/chain-interactions.spec.js index c95d3d211aec..42feb39131f2 100644 --- a/test/e2e/tests/chain-interactions.spec.js +++ b/test/e2e/tests/chain-interactions.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Chain Interactions', function () { const port = 8546; @@ -18,7 +19,7 @@ describe('Chain Interactions', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -70,7 +71,7 @@ describe('Chain Interactions', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -99,7 +100,9 @@ describe('Chain Interactions', function () { await driver.switchToWindow(extension); // verify current network - const networkDisplay = await driver.findElement('.network-display'); + const networkDisplay = await driver.findElement( + '[data-testid="network-display"]', + ); assert.equal(await networkDisplay.getText(), `Localhost ${port}`); }, ); diff --git a/test/e2e/tests/collectibles.spec.js b/test/e2e/tests/collectibles.spec.js index 8687d0ffc942..55424d36a69a 100644 --- a/test/e2e/tests/collectibles.spec.js +++ b/test/e2e/tests/collectibles.spec.js @@ -1,10 +1,7 @@ const { strict: assert } = require('assert'); -const { - convertToHexValue, - withFixtures, - veryLargeDelayMs, -} = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); const { SMART_CONTRACTS } = require('../seeder/smart-contracts'); +const FixtureBuilder = require('../fixture-builder'); describe('Collectibles', function () { const smartContract = SMART_CONTRACTS.COLLECTIBLES; @@ -21,7 +18,9 @@ describe('Collectibles', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, smartContract, title: this.test.title, @@ -33,18 +32,16 @@ describe('Collectibles', function () { await driver.fill('#password', 'correct horse battery staple'); await driver.press('#password', driver.Key.ENTER); - // Click transfer + // Open Dapp and wait for deployed contract await driver.openNewPage(`http://127.0.0.1:8080/?contract=${contract}`); - await driver.waitForSelector({ - css: '#collectiblesStatus', - text: 'Deployed', - }); - await driver.delay(veryLargeDelayMs); + await driver.findClickableElement('#deployButton'); + + // Click Transer await driver.fill('#transferTokenInput', '1'); await driver.clickElement('#transferFromButton'); await driver.waitUntilXWindowHandles(3); const windowHandles = await driver.getAllWindowHandles(); - const extension = windowHandles[0]; + const [extension] = windowHandles; await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -75,7 +72,9 @@ describe('Collectibles', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, smartContract, title: this.test.title, @@ -87,18 +86,16 @@ describe('Collectibles', function () { await driver.fill('#password', 'correct horse battery staple'); await driver.press('#password', driver.Key.ENTER); - // Click approve + // Open Dapp and wait for deployed contract await driver.openNewPage(`http://127.0.0.1:8080/?contract=${contract}`); - await driver.waitForSelector({ - css: '#collectiblesStatus', - text: 'Deployed', - }); - await driver.delay(veryLargeDelayMs); + await driver.findClickableElement('#deployButton'); + + // Click Approve await driver.fill('#approveTokenInput', '1'); await driver.clickElement('#approveButton'); await driver.waitUntilXWindowHandles(3); const windowHandles = await driver.getAllWindowHandles(); - const extension = windowHandles[0]; + const [extension] = windowHandles; await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -112,14 +109,14 @@ describe('Collectibles', function () { text: 'View full transaction details', css: '.confirm-approve-content__small-blue-text', }); - const data = await driver.findElements( + const [func] = await driver.findElements( '.confirm-approve-content__data .confirm-approve-content__small-text', ); assert.equal( await title.getText(), 'Give permission to access your TestDappCollectibles (#1)?', ); - assert.equal(await data[0].getText(), 'Function: Approve'); + assert.equal(await func.getText(), 'Function: Approve'); // Confirm approval await driver.clickElement({ text: 'Confirm', tag: 'button' }); @@ -138,11 +135,13 @@ describe('Collectibles', function () { }, ); }); - it('should approve an address to transfer all NFTs', async function () { + it('should enable approval for a third party address to manage all NFTs', async function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, smartContract, title: this.test.title, @@ -154,17 +153,15 @@ describe('Collectibles', function () { await driver.fill('#password', 'correct horse battery staple'); await driver.press('#password', driver.Key.ENTER); - // Click set approval for all + // Open Dapp and wait for deployed contract await driver.openNewPage(`http://127.0.0.1:8080/?contract=${contract}`); - await driver.waitForSelector({ - css: '#collectiblesStatus', - text: 'Deployed', - }); - await driver.delay(veryLargeDelayMs); + await driver.findClickableElement('#deployButton'); + + // Enable Set approval for all await driver.clickElement('#setApprovalForAllButton'); await driver.waitUntilXWindowHandles(3); const windowHandles = await driver.getAllWindowHandles(); - const extension = windowHandles[0]; + const [extension] = windowHandles; await driver.switchToWindowWithTitle( 'MetaMask Notification', windowHandles, @@ -178,17 +175,92 @@ describe('Collectibles', function () { text: 'View full transaction details', css: '.confirm-approve-content__small-blue-text', }); - const data = await driver.findElements( + const [func, params] = await driver.findElements( '.confirm-approve-content__data .confirm-approve-content__small-text', ); + const proceedWithCautionIsDisplayed = await driver.isElementPresent( + '.dialog--error', + ); assert.equal( await title.getText(), 'Allow access to and transfer of all your TestDappCollectibles?', ); - assert.equal(await data[0].getText(), 'Function: SetApprovalForAll'); - assert.equal(await data[1].getText(), 'Parameters: true'); + assert.equal(await func.getText(), 'Function: SetApprovalForAll'); + assert.equal(await params.getText(), 'Parameters: true'); + assert.equal(proceedWithCautionIsDisplayed, true); + + // Confirm enabling set approval for all + await driver.clickElement({ text: 'Confirm', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + await driver.switchToWindow(extension); + await driver.clickElement('[data-testid="home__activity-tab"]'); + await driver.waitForSelector( + '.transaction-list__completed-transactions .transaction-list-item:nth-of-type(1)', + { timeout: 10000 }, + ); + + // Verify transaction + const completedTx = await driver.findElement('.list-item__title'); + const completedTxText = await completedTx.getText(); + assert.equal(completedTxText, 'Approve Token with no spend limit'); + }, + ); + }); + it('should disable approval for a third party address to manage all NFTs', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions, + smartContract, + title: this.test.title, + failOnConsoleError: false, + }, + async ({ driver, _, contractRegistry }) => { + const contract = contractRegistry.getContractAddress(smartContract); + await driver.navigate(); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + // Open Dapp and wait for deployed contract + await driver.openNewPage(`http://127.0.0.1:8080/?contract=${contract}`); + await driver.findClickableElement('#deployButton'); + + // Disable Set approval for all + await driver.clickElement('#revokeButton'); + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + const [extension] = windowHandles; + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + + // Verify dialog + const title = await driver.findElement( + '[data-testid="confirm-approve-title"]', + ); + await driver.clickElement({ + text: 'View full transaction details', + css: '.confirm-approve-content__small-blue-text', + }); + const [func, params] = await driver.findElements( + '.confirm-approve-content__data .confirm-approve-content__small-text', + ); + const proceedWithCautionIsDisplayed = await driver.isElementPresent( + '.dialog--error', + ); + assert.equal( + await title.getText(), + 'Revoke permission to access all of your TestDappCollectibles?', + ); + assert.equal(await func.getText(), 'Function: SetApprovalForAll'); + assert.equal(await params.getText(), 'Parameters: false'); + assert.equal(proceedWithCautionIsDisplayed, false); - // Confirmation set approval for all + // Confirm disabling set approval for all await driver.clickElement({ text: 'Confirm', tag: 'button' }); await driver.waitUntilXWindowHandles(2); await driver.switchToWindow(extension); diff --git a/test/e2e/tests/contract-interactions.spec.js b/test/e2e/tests/contract-interactions.spec.js index d50ac6cb96bd..71c5962cb343 100644 --- a/test/e2e/tests/contract-interactions.spec.js +++ b/test/e2e/tests/contract-interactions.spec.js @@ -1,6 +1,7 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); const { SMART_CONTRACTS } = require('../seeder/smart-contracts'); +const FixtureBuilder = require('../fixture-builder'); describe('Deploy contract and call contract methods', function () { const ganacheOptions = { @@ -17,7 +18,9 @@ describe('Deploy contract and call contract methods', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, smartContract, title: this.test.title, diff --git a/test/e2e/tests/custom-rpc-history.spec.js b/test/e2e/tests/custom-rpc-history.spec.js index 9907090d798d..23d5fb330bbb 100644 --- a/test/e2e/tests/custom-rpc-history.spec.js +++ b/test/e2e/tests/custom-rpc-history.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures, largeDelayMs } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Stores custom RPC history', function () { const ganacheOptions = { @@ -17,7 +18,7 @@ describe('Stores custom RPC history', function () { const symbol = 'TEST'; await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions: { ...ganacheOptions, concurrent: { port, chainId } }, title: this.test.title, }, @@ -35,7 +36,14 @@ describe('Stores custom RPC history', function () { await driver.clickElement({ text: 'Add network', tag: 'button' }); - await driver.findElement('.networks-tab__sub-header-text'); + await driver.findElement('.add-network__networks-container'); + + await driver.clickElement({ + text: 'Add a network manually', + tag: 'h6', + }); + + await driver.findElement('.networks-tab__subheader'); const customRpcInputs = await driver.findElements('input[type="text"]'); const networkNameInput = customRpcInputs[1]; @@ -67,7 +75,7 @@ describe('Stores custom RPC history', function () { it('warns user when they enter url for an already configured network', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -85,7 +93,14 @@ describe('Stores custom RPC history', function () { await driver.clickElement({ text: 'Add network', tag: 'button' }); - await driver.findElement('.networks-tab__sub-header-text'); + await driver.findElement('.add-network__networks-container'); + + await driver.clickElement({ + text: 'Add a network manually', + tag: 'h6', + }); + + await driver.findElement('.networks-tab__subheader'); const customRpcInputs = await driver.findElements('input[type="text"]'); const rpcUrlInput = customRpcInputs[2]; @@ -103,7 +118,7 @@ describe('Stores custom RPC history', function () { it('warns user when they enter chainId for an already configured network', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, @@ -115,7 +130,7 @@ describe('Stores custom RPC history', function () { // duplicate network const newRpcUrl = 'http://localhost:8544'; - const duplicateChainId = '0x539'; + const duplicateChainId = '1'; await driver.delay(largeDelayMs); @@ -123,7 +138,14 @@ describe('Stores custom RPC history', function () { await driver.clickElement({ text: 'Add network', tag: 'button' }); - await driver.findElement('.networks-tab__sub-header-text'); + await driver.findElement('.add-network__networks-container'); + + await driver.clickElement({ + text: 'Add a network manually', + tag: 'h6', + }); + + await driver.findElement('.networks-tab__subheader'); const customRpcInputs = await driver.findElements('input[type="text"]'); const rpcUrlInput = customRpcInputs[2]; @@ -132,7 +154,7 @@ describe('Stores custom RPC history', function () { await chainIdInput.clear(); await chainIdInput.sendKeys(duplicateChainId); await driver.findElement({ - text: 'This Chain ID is currently used by the Localhost 8545 network.', + text: 'This Chain ID is currently used by the mainnet network.', tag: 'h6', }); @@ -150,7 +172,7 @@ describe('Stores custom RPC history', function () { it('selects another provider', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -171,7 +193,26 @@ describe('Stores custom RPC history', function () { it('finds all recent RPCs in history', async function () { await withFixtures( { - fixtures: 'custom-rpc', + fixtures: new FixtureBuilder() + .withPreferencesController({ + frequentRpcListDetail: [ + { + rpcUrl: 'http://127.0.0.1:8545/1', + chainId: '0x539', + ticker: 'ETH', + nickname: 'http://127.0.0.1:8545/1', + rpcPrefs: {}, + }, + { + rpcUrl: 'http://127.0.0.1:8545/2', + chainId: '0x539', + ticker: 'ETH', + nickname: 'http://127.0.0.1:8545/2', + rpcPrefs: {}, + }, + ], + }) + .build(), ganacheOptions, title: this.test.title, }, @@ -200,7 +241,26 @@ describe('Stores custom RPC history', function () { it('deletes a custom RPC', async function () { await withFixtures( { - fixtures: 'custom-rpc', + fixtures: new FixtureBuilder() + .withPreferencesController({ + frequentRpcListDetail: [ + { + rpcUrl: 'http://127.0.0.1:8545/1', + chainId: '0x539', + ticker: 'ETH', + nickname: 'http://127.0.0.1:8545/1', + rpcPrefs: {}, + }, + { + rpcUrl: 'http://127.0.0.1:8545/2', + chainId: '0x539', + ticker: 'ETH', + nickname: 'http://127.0.0.1:8545/2', + rpcPrefs: {}, + }, + ], + }) + .build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, @@ -215,7 +275,13 @@ describe('Stores custom RPC history', function () { await driver.clickElement({ text: 'Add network', tag: 'button' }); - await driver.findVisibleElement('.settings-page__content'); + await driver.findElement('.add-network__networks-container'); + + await driver.clickElement({ + text: 'Add a network manually', + tag: 'h6', + }); + // // cancel new custom rpc await driver.clickElement( '.networks-tab__add-network-form-footer button.btn-secondary', @@ -239,8 +305,10 @@ describe('Stores custom RPC history', function () { '.button.btn-danger-primary.modal-container__footer-button', ); - // wait for confirm delete modal to be removed from DOM. - await confirmDeleteModal.waitForElementState('hidden'); + if (await driver.isElementPresent('span .modal')) { + // wait for confirm delete modal to be removed from DOM. + await confirmDeleteModal.waitForElementState('hidden'); + } const newNetworkListItems = await driver.findElements( '.networks-tab__networks-list-name', diff --git a/test/e2e/tests/custom-token-add-approve.spec.js b/test/e2e/tests/custom-token-add-approve.spec.js index 7b68e093eded..2815f49a4db7 100644 --- a/test/e2e/tests/custom-token-add-approve.spec.js +++ b/test/e2e/tests/custom-token-add-approve.spec.js @@ -6,6 +6,7 @@ const { withFixtures, getWindowHandles, } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe.skip('Create token, approve token and approve token without gas', function () { describe('Add a custom token from a dapp', function () { @@ -23,7 +24,9 @@ describe.skip('Create token, approve token and approve token without gas', funct await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, @@ -114,7 +117,9 @@ describe.skip('Create token, approve token and approve token without gas', funct await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, @@ -182,7 +187,9 @@ describe.skip('Create token, approve token and approve token without gas', funct await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, @@ -214,10 +221,10 @@ describe.skip('Create token, approve token and approve token without gas', funct await driver.clickElement( '.confirm-approve-content__small-blue-text', ); - await driver.clickElement( - { text: 'Edit suggested gas fee', tag: 'button' }, - 10000, - ); + await driver.clickElement({ + text: 'Edit suggested gas fee', + tag: 'button', + }); const [gasLimitInput, gasPriceInput] = await driver.findElements( 'input[type="number"]', ); @@ -292,7 +299,9 @@ describe.skip('Create token, approve token and approve token without gas', funct await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/dapp-interactions.spec.js b/test/e2e/tests/dapp-interactions.spec.js index 40cef1b18a91..652f28c1ee83 100644 --- a/test/e2e/tests/dapp-interactions.spec.js +++ b/test/e2e/tests/dapp-interactions.spec.js @@ -1,9 +1,6 @@ const { strict: assert } = require('assert'); -const { - convertToHexValue, - withFixtures, - connectDappWithExtensionPopup, -} = require('../helpers'); +const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Dapp interactions', function () { let windowHandles; @@ -22,7 +19,7 @@ describe('Dapp interactions', function () { await withFixtures( { dapp: true, - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions: { ...ganacheOptions, concurrent: { port: 8546, chainId: 1338 }, @@ -34,8 +31,7 @@ describe('Dapp interactions', function () { await driver.fill('#password', 'correct horse battery staple'); await driver.press('#password', driver.Key.ENTER); - // Connect to Dapp0 - await connectDappWithExtensionPopup(driver, 0); + await driver.openNewPage('http://127.0.0.1:8080/'); windowHandles = await driver.getAllWindowHandles(); extension = windowHandles[0]; @@ -68,7 +64,9 @@ describe('Dapp interactions', function () { await withFixtures( { dapp: true, - fixtures: 'imported-account', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, dappOptions: { numberOfDapps: 2 }, title: this.test.title, @@ -78,8 +76,7 @@ describe('Dapp interactions', function () { await driver.fill('#password', 'correct horse battery staple'); await driver.press('#password', driver.Key.ENTER); - // Connect to Dapp0 - await connectDappWithExtensionPopup(driver, 0); + await driver.openNewPage('http://127.0.0.1:8080/'); windowHandles = await driver.getAllWindowHandles(); extension = windowHandles[0]; @@ -91,7 +88,7 @@ describe('Dapp interactions', function () { // Connect to Dapp1 await driver.openNewPage('http://127.0.0.1:8081/'); await driver.clickElement({ text: 'Connect', tag: 'button' }); - + await driver.waitUntilXWindowHandles(4); windowHandles = await driver.getAllWindowHandles(); popup = await driver.switchToWindowWithTitle( @@ -115,11 +112,11 @@ describe('Dapp interactions', function () { await driver.clickElement({ text: 'Connected sites', tag: 'span' }); const connectedDapp1 = await driver.isElementPresent({ text: 'http://127.0.0.1:8080', - tag: 'span', + tag: 'bdi', }); const connectedDapp2 = await driver.isElementPresent({ text: 'http://127.0.0.1:8081', - tag: 'span', + tag: 'bdi', }); assert.ok(connectedDapp1, 'Account not connected to Dapp1'); diff --git a/test/e2e/tests/dapp-tx-edit.spec.js b/test/e2e/tests/dapp-tx-edit.spec.js new file mode 100644 index 000000000000..3b937f4eaa8e --- /dev/null +++ b/test/e2e/tests/dapp-tx-edit.spec.js @@ -0,0 +1,107 @@ +const { strict: assert } = require('assert'); +const { convertToHexValue, withFixtures } = require('../helpers'); +const { SMART_CONTRACTS } = require('../seeder/smart-contracts'); +const FixtureBuilder = require('../fixture-builder'); + +describe('Editing confirmations of dapp initiated contract interactions', function () { + const ganacheOptions = { + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), + }, + ], + }; + const smartContract = SMART_CONTRACTS.PIGGYBANK; + it('should NOT show an edit button on a contract interaction confirmation iniated by a dapp', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions, + smartContract, + title: this.test.title, + }, + async ({ driver, contractRegistry }) => { + const contractAddress = await contractRegistry.getContractAddress( + smartContract, + ); + await driver.navigate(); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + // deploy contract + await driver.openNewPage( + `http://127.0.0.1:8080/?contract=${contractAddress}`, + ); + + // wait for deployed contract, calls and confirms a contract method where ETH is sent + await driver.findClickableElement('#deployButton'); + await driver.clickElement('#depositButton'); + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.waitForSelector({ + css: '.confirm-page-container-summary__action__name', + text: 'Deposit', + }); + const editTransactionButton = await driver.isElementPresentAndVisible( + '[data-testid="confirm-page-back-edit-button"]', + ); + assert.equal( + editTransactionButton, + false, + `Edit transaction button should not be visible on a contract interaction created by a dapp`, + ); + }, + ); + }); + + it('should show an edit button on a simple ETH send iniated by a dapp', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions, + smartContract, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + await driver.openNewPage(`http://127.0.0.1:8080/`); + await driver.clickElement('#sendButton'); + await driver.waitUntilXWindowHandles(3); + const windowHandles = await driver.getAllWindowHandles(); + + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.waitForSelector({ + css: '.confirm-page-container-summary__action__name', + text: 'Sending ETH', + }); + const editTransactionButton = await driver.isElementPresentAndVisible( + '[data-testid="confirm-page-back-edit-button"]', + ); + assert.equal( + editTransactionButton, + true, + `Edit transaction button should be visible on a contract interaction created by a dapp`, + ); + }, + ); + }); +}); diff --git a/test/e2e/tests/edit-gas-fee.spec.js b/test/e2e/tests/edit-gas-fee.spec.js index 368cc712b597..db1da859b536 100644 --- a/test/e2e/tests/edit-gas-fee.spec.js +++ b/test/e2e/tests/edit-gas-fee.spec.js @@ -1,10 +1,10 @@ const { strict: assert } = require('assert'); const { convertToHexValue, - connectDappWithExtensionPopup, getWindowHandles, withFixtures, } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Editing Confirm Transaction', function () { it('allows selecting high, medium, low gas estimates on edit gas fee popover', async function () { @@ -20,7 +20,12 @@ describe('Editing Confirm Transaction', function () { }; await withFixtures( { - fixtures: 'eip-1559-v2', + fixtures: new FixtureBuilder() + .withPreferencesController({ + eip1559V2Enabled: true, + }) + .withTransactionControllerTypeTwoTransaction() + .build(), ganacheOptions, title: this.test.title, }, @@ -34,7 +39,7 @@ describe('Editing Confirm Transaction', function () { '.currency-display-component__text', ); const transactionAmount = transactionAmounts[0]; - assert.equal(await transactionAmount.getText(), '2.2'); + assert.equal(await transactionAmount.getText(), '1'); // update estimates to high await driver.clickElement('[data-testid="edit-gas-fee-button"]'); @@ -80,7 +85,7 @@ describe('Editing Confirm Transaction', function () { '.transaction-list-item__primary-currency', ); assert.equal(txValues.length, 1); - assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + assert.ok(/-1\s*ETH/u.test(await txValues[0].getText())); }, ); }); @@ -98,7 +103,12 @@ describe('Editing Confirm Transaction', function () { }; await withFixtures( { - fixtures: 'eip-1559-v2', + fixtures: new FixtureBuilder() + .withPreferencesController({ + eip1559V2Enabled: true, + }) + .withTransactionControllerTypeTwoTransaction() + .build(), ganacheOptions, title: this.test.title, }, @@ -112,7 +122,7 @@ describe('Editing Confirm Transaction', function () { '.currency-display-component__text', ); const transactionAmount = transactionAmounts[0]; - assert.equal(await transactionAmount.getText(), '2.2'); + assert.equal(await transactionAmount.getText(), '1'); // update estimates to high await driver.clickElement('[data-testid="edit-gas-fee-button"]'); @@ -123,10 +133,10 @@ describe('Editing Confirm Transaction', function () { await driver.clickElement('[data-testid="edit-gas-fee-item-custom"]'); // enter max fee - await driver.fill('[data-testid="base-fee-input"]', '8'); + await driver.fill('[data-testid="base-fee-input"]', '8.5'); // enter priority fee - await driver.fill('[data-testid="priority-fee-input"]', '8'); + await driver.fill('[data-testid="priority-fee-input"]', '8.5'); // save default values await driver.clickElement('input[type="checkbox"]'); @@ -141,11 +151,11 @@ describe('Editing Confirm Transaction', function () { // has correct updated value on the confirm screen the transaction await driver.waitForSelector({ css: '.transaction-detail-item:nth-of-type(1) h6:nth-of-type(2)', - text: '0.0008 ETH', + text: '0.00085 ETH', }); await driver.waitForSelector({ css: '.transaction-detail-item:nth-of-type(2) h6:nth-of-type(2)', - text: '2.2008 ETH', + text: '1.00085 ETH', }); // confirms the transaction @@ -163,7 +173,7 @@ describe('Editing Confirm Transaction', function () { '.transaction-list-item__primary-currency', ); assert.equal(txValues.length, 1); - assert.ok(/-2.2\s*ETH/u.test(await txValues[0].getText())); + assert.ok(/-1\s*ETH/u.test(await txValues[0].getText())); }, ); }); @@ -181,7 +191,12 @@ describe('Editing Confirm Transaction', function () { }; await withFixtures( { - fixtures: 'eip-1559-v2-dapp', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withPreferencesController({ + eip1559V2Enabled: true, + }) + .build(), ganacheOptions, title: this.test.title, dapp: true, @@ -194,7 +209,7 @@ describe('Editing Confirm Transaction', function () { await driver.press('#password', driver.Key.ENTER); // open dapp and connect - await connectDappWithExtensionPopup(driver); + await driver.openNewPage('http://127.0.0.1:8080/'); await driver.clickElement({ text: 'Send EIP 1559 Transaction', tag: 'button', diff --git a/test/e2e/tests/encrypt-decrypt.spec.js b/test/e2e/tests/encrypt-decrypt.spec.js new file mode 100644 index 000000000000..e34908117643 --- /dev/null +++ b/test/e2e/tests/encrypt-decrypt.spec.js @@ -0,0 +1,93 @@ +const { strict: assert } = require('assert'); +const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); + +describe('Encrypt Decrypt', function () { + const ganacheOptions = { + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), + }, + ], + }; + const encryptionKey = 'fxYXfCbun026g5zcCQh7Ia+O0urAEVZWLG8H4Jzu7Xs='; + const message = 'Hello, Bob!'; + it('should decrypt an encrypted message', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + await driver.openNewPage('http://127.0.0.1:8080'); + + // Get Encryption key + await driver.clickElement('#getEncryptionKeyButton'); + await driver.waitUntilXWindowHandles(3); + let windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.waitForSelector({ + css: '.request-encryption-public-key__header__text', + text: 'Request encryption public key', + }); + await driver.clickElement({ text: 'Provide', tag: 'button' }); + await driver.waitUntilXWindowHandles(2); + windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); + const encryptionKeyLabel = await driver.findElement( + '#encryptionKeyDisplay', + ); + assert.equal(await encryptionKeyLabel.getText(), encryptionKey); + + // Encrypt + await driver.fill('#encryptMessageInput', message); + await driver.clickElement('#encryptButton'); + await driver.waitForSelector({ + css: '#ciphertextDisplay', + text: '0x', + }); + + // Decrypt + await driver.clickElement('#decryptButton'); + await driver.waitUntilXWindowHandles(3); + windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle( + 'MetaMask Notification', + windowHandles, + ); + await driver.waitForSelector({ + css: '.request-decrypt-message__header__text', + text: 'Decrypt request', + }); + + // Verify message in MetaMask Notification + await driver.clickElement({ text: 'Decrypt message', tag: 'div' }); + const notificationMessage = await driver.isElementPresent({ + text: message, + tag: 'div', + }); + assert.equal(notificationMessage, true); + await driver.clickElement({ text: 'Decrypt', tag: 'button' }); + + // Verify message in Test Dapp + await driver.waitUntilXWindowHandles(2); + windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); + const clearTextLabel = await driver.findElement('#cleartextDisplay'); + assert.equal(await clearTextLabel.getText(), message); + }, + ); + }); +}); diff --git a/test/e2e/tests/errors.spec.js b/test/e2e/tests/errors.spec.js index 880844386f2a..70b9467f9765 100644 --- a/test/e2e/tests/errors.spec.js +++ b/test/e2e/tests/errors.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Sentry errors', function () { async function mockSegment(mockServer) { @@ -26,7 +27,12 @@ describe('Sentry errors', function () { it('should send error events', async function () { await withFixtures( { - fixtures: 'metrics-enabled', + fixtures: new FixtureBuilder() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, @@ -39,7 +45,7 @@ describe('Sentry errors', function () { // Trigger error await driver.clickElement('[data-testid="eth-overview-send"]'); await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', '0x2f318C334780961FB129D2a6c30D0763d9a5C970', ); await driver.fill('input[placeholder="0"]', `-01`); diff --git a/test/e2e/tests/eth-sign.spec.js b/test/e2e/tests/eth-sign.spec.js index cf685726a62a..5bd90cea64a0 100644 --- a/test/e2e/tests/eth-sign.spec.js +++ b/test/e2e/tests/eth-sign.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Eth sign', function () { it('can initiate and confirm a eth sign', async function () { @@ -19,7 +20,9 @@ describe('Eth sign', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/failing-contract.spec.js b/test/e2e/tests/failing-contract.spec.js index bdeb6373b41d..6b15c6a05a07 100644 --- a/test/e2e/tests/failing-contract.spec.js +++ b/test/e2e/tests/failing-contract.spec.js @@ -1,6 +1,7 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); const { SMART_CONTRACTS } = require('../seeder/smart-contracts'); +const FixtureBuilder = require('../fixture-builder'); describe('Failing contract interaction ', function () { const smartContract = SMART_CONTRACTS.FAILING; @@ -18,7 +19,9 @@ describe('Failing contract interaction ', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, smartContract, title: this.test.title, diff --git a/test/e2e/tests/from-import-ui.spec.js b/test/e2e/tests/from-import-ui.spec.js index 74298956c887..f65131ffc0f2 100644 --- a/test/e2e/tests/from-import-ui.spec.js +++ b/test/e2e/tests/from-import-ui.spec.js @@ -8,6 +8,7 @@ const { completeImportSRPOnboardingFlow, completeImportSRPOnboardingFlowWordByWord, } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('MetaMask Import UI', function () { it('Importing wallet using Secret Recovery Phrase', async function () { @@ -27,7 +28,7 @@ describe('MetaMask Import UI', function () { await withFixtures( { - fixtures: 'onboarding', + fixtures: new FixtureBuilder({ onboarding: true }).build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, @@ -99,7 +100,7 @@ describe('MetaMask Import UI', function () { // starts a send transaction await driver.clickElement('[data-testid="eth-overview-send"]'); await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', '0x2f318C334780961FB129D2a6c30D0763d9a5C970', ); await driver.fill('.unit-input__input', '1'); @@ -145,7 +146,7 @@ describe('MetaMask Import UI', function () { await withFixtures( { - fixtures: 'onboarding', + fixtures: new FixtureBuilder({ onboarding: true }).build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, @@ -192,7 +193,10 @@ describe('MetaMask Import UI', function () { await withFixtures( { - fixtures: 'import-ui', + fixtures: new FixtureBuilder() + .withKeyringControllerImportedAccountVault() + .withPreferencesControllerImportedAccountIdentities() + .build(), ganacheOptions, title: this.test.title, }, @@ -295,7 +299,10 @@ describe('MetaMask Import UI', function () { await withFixtures( { - fixtures: 'import-ui', + fixtures: new FixtureBuilder() + .withKeyringControllerImportedAccountVault() + .withPreferencesControllerImportedAccountIdentities() + .build(), ganacheOptions, title: this.test.title, }, @@ -315,7 +322,6 @@ describe('MetaMask Import UI', function () { const importJsonFile = path.join( __dirname, '..', - 'fixtures', 'import-utc-json', 'test-json-import-account-file.json', ); @@ -368,7 +374,10 @@ describe('MetaMask Import UI', function () { await withFixtures( { - fixtures: 'import-ui', + fixtures: new FixtureBuilder() + .withKeyringControllerImportedAccountVault() + .withPreferencesControllerImportedAccountIdentities() + .build(), ganacheOptions, title: this.test.title, }, @@ -407,7 +416,7 @@ describe('MetaMask Import UI', function () { await withFixtures( { - fixtures: 'import-ui', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/gas-api-fallback.spec.js b/test/e2e/tests/gas-api-fallback.spec.js new file mode 100644 index 000000000000..9ccc023e546d --- /dev/null +++ b/test/e2e/tests/gas-api-fallback.spec.js @@ -0,0 +1,70 @@ +const { strict: assert } = require('assert'); +const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); + +describe('Gas API fallback', function () { + async function mockGasApiDown(mockServer) { + await mockServer + .forGet( + 'https://gas-api.metaswap.codefi.network/networks/1/suggestedGasFees', + ) + .thenCallback(() => { + return { + statusCode: 500, + json: {}, + }; + }); + } + + const ganacheOptions = { + hardfork: 'london', + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), + }, + ], + }; + + it('error message is displayed but gas recommendation is not displayed', async function () { + await withFixtures( + { + fixtures: new FixtureBuilder().build(), + testSpecificMock: mockGasApiDown, + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + await driver.clickElement('[data-testid="eth-overview-send"]'); + + await driver.fill( + 'input[placeholder="Search, public address (0x), or ENS"]', + '0x2f318C334780961FB129D2a6c30D0763d9a5C970', + ); + + const inputAmount = await driver.findElement('.unit-input__input'); + await inputAmount.fill('1'); + + await driver.clickElement({ text: 'Next', tag: 'button' }); + await driver.clickElement({ text: 'Edit', tag: 'button' }); + + const error = await driver.isElementPresent('.error-message__text'); + const gasRecommendation = await driver.isElementPresent( + '[data-testid="gas-recommendation"]', + ); + + assert.equal(error, true, 'Error message is not displayed'); + assert.equal( + gasRecommendation, + false, + 'Gas recommendation is displayed', + ); + }, + ); + }); +}); diff --git a/test/e2e/tests/incremental-security.spec.js b/test/e2e/tests/incremental-security.spec.js index d7ba9e0b7336..f54f9563a9ed 100644 --- a/test/e2e/tests/incremental-security.spec.js +++ b/test/e2e/tests/incremental-security.spec.js @@ -1,6 +1,7 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures, tinyDelayMs } = require('../helpers'); const enLocaleMessages = require('../../../app/_locales/en/messages.json'); +const FixtureBuilder = require('../fixture-builder'); describe('Incremental Security', function () { const ganacheOptions = { @@ -21,7 +22,7 @@ describe('Incremental Security', function () { await withFixtures( { dapp: true, - fixtures: 'onboarding', + fixtures: new FixtureBuilder({ onboarding: true }).build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, @@ -130,6 +131,7 @@ describe('Incremental Security', function () { const revealedSeedPhrase = await driver.findElement( '.reveal-seed-phrase__secret-words', ); + await driver.waitForNonEmptyElement(revealedSeedPhrase); const seedPhrase = await revealedSeedPhrase.getText(); assert.equal(seedPhrase.split(' ').length, 12); diff --git a/test/e2e/tests/localization.spec.js b/test/e2e/tests/localization.spec.js index a4859de6836c..0e41d1d71069 100644 --- a/test/e2e/tests/localization.spec.js +++ b/test/e2e/tests/localization.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Localization', function () { it('can correctly display Philippine peso symbol and code', async function () { @@ -13,7 +14,20 @@ describe('Localization', function () { ], }; await withFixtures( - { fixtures: 'localization', ganacheOptions, title: this.test.title }, + { + fixtures: new FixtureBuilder() + .withCurrencyController({ + currentCurrency: 'php', + }) + .withPreferencesController({ + preferences: { + showFiatInTestnets: true, + }, + }) + .build(), + ganacheOptions, + title: this.test.title, + }, async ({ driver }) => { await driver.navigate(); await driver.fill('#password', 'correct horse battery staple'); diff --git a/test/e2e/tests/lock-account.spec.js b/test/e2e/tests/lock-account.spec.js index 345a6ec78b8c..1fd2910a622a 100644 --- a/test/e2e/tests/lock-account.spec.js +++ b/test/e2e/tests/lock-account.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Lock and unlock', function () { const ganacheOptions = { @@ -14,7 +15,7 @@ describe('Lock and unlock', function () { it('successfully unlocks after lock', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/lockdown.spec.js b/test/e2e/tests/lockdown.spec.js index cb38725aa4d5..f49baa331df9 100644 --- a/test/e2e/tests/lockdown.spec.js +++ b/test/e2e/tests/lockdown.spec.js @@ -6,6 +6,7 @@ const { } = require('../../helpers/protect-intrinsics-helpers'); const { convertToHexValue, withFixtures } = require('../helpers'); const { PAGES } = require('../webdriver/driver'); +const FixtureBuilder = require('../fixture-builder'); const isFirefox = process.env.SELENIUM_BROWSER === Browser.FIREFOX; @@ -65,7 +66,7 @@ describe('lockdown', function () { await withFixtures( { // The fixtures used here is arbitrary. Any fixture would do. - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/metamask-responsive-ui.spec.js b/test/e2e/tests/metamask-responsive-ui.spec.js index d0f6906db465..5d7b04b5c7aa 100644 --- a/test/e2e/tests/metamask-responsive-ui.spec.js +++ b/test/e2e/tests/metamask-responsive-ui.spec.js @@ -1,6 +1,7 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures, tinyDelayMs } = require('../helpers'); const enLocaleMessages = require('../../../app/_locales/en/messages.json'); +const FixtureBuilder = require('../fixture-builder'); describe('MetaMask Responsive UI', function () { it('Creating a new wallet', async function () { @@ -8,7 +9,7 @@ describe('MetaMask Responsive UI', function () { await withFixtures( { - fixtures: 'onboarding', + fixtures: new FixtureBuilder({ onboarding: true }).build(), driverOptions, title: this.test.title, failOnConsoleError: false, @@ -154,7 +155,7 @@ describe('MetaMask Responsive UI', function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), driverOptions, title: this.test.title, failOnConsoleError: false, @@ -200,7 +201,7 @@ describe('MetaMask Responsive UI', function () { }; await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), driverOptions, ganacheOptions, title: this.test.title, @@ -215,7 +216,7 @@ describe('MetaMask Responsive UI', function () { await driver.clickElement('[data-testid="eth-overview-send"]'); await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', '0x2f318C334780961FB129D2a6c30D0763d9a5C970', ); diff --git a/test/e2e/tests/metrics.spec.js b/test/e2e/tests/metrics.spec.js index d00abd78850f..21ee6c0fd473 100644 --- a/test/e2e/tests/metrics.spec.js +++ b/test/e2e/tests/metrics.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Segment metrics', function () { async function mockSegment(mockServer) { @@ -27,7 +28,12 @@ describe('Segment metrics', function () { it('should send first three Page metric events upon fullscreen page load', async function () { await withFixtures( { - fixtures: 'metrics-enabled', + fixtures: new FixtureBuilder() + .withMetaMetricsController({ + metaMetricsId: 'fake-metrics-id', + participateInMetaMetrics: true, + }) + .build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, diff --git a/test/e2e/tests/navigate-transactions.spec.js b/test/e2e/tests/navigate-transactions.spec.js index 3e1eca68ae1e..d2f964b8ea54 100644 --- a/test/e2e/tests/navigate-transactions.spec.js +++ b/test/e2e/tests/navigate-transactions.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Navigate transactions', function () { const ganacheOptions = { @@ -14,7 +15,9 @@ describe('Navigate transactions', function () { it('should navigate the unapproved transactions', async function () { await withFixtures( { - fixtures: 'navigate-transactions', + fixtures: new FixtureBuilder() + .withTransactionControllerMultipleTransactions() + .build(), ganacheOptions, title: this.test.title, }, @@ -102,7 +105,10 @@ describe('Navigate transactions', function () { await withFixtures( { dapp: true, - fixtures: 'navigate-transactions', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .withTransactionControllerMultipleTransactions() + .build(), ganacheOptions, title: this.test.title, }, @@ -149,7 +155,9 @@ describe('Navigate transactions', function () { it('should reject and remove an unapproved transaction', async function () { await withFixtures( { - fixtures: 'navigate-transactions', + fixtures: new FixtureBuilder() + .withTransactionControllerMultipleTransactions() + .build(), ganacheOptions, title: this.test.title, }, @@ -180,7 +188,9 @@ describe('Navigate transactions', function () { it('should confirm and remove an unapproved transaction', async function () { await withFixtures( { - fixtures: 'navigate-transactions', + fixtures: new FixtureBuilder() + .withTransactionControllerMultipleTransactions() + .build(), ganacheOptions, title: this.test.title, }, @@ -211,7 +221,9 @@ describe('Navigate transactions', function () { it('should reject and remove all unapproved transactions', async function () { await withFixtures( { - fixtures: 'navigate-transactions', + fixtures: new FixtureBuilder() + .withTransactionControllerMultipleTransactions() + .build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/permissions.spec.js b/test/e2e/tests/permissions.spec.js index 16f786718a78..3ebcbf117e59 100644 --- a/test/e2e/tests/permissions.spec.js +++ b/test/e2e/tests/permissions.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Permissions', function () { it('sets permissions and connect to Dapp', async function () { @@ -16,7 +17,7 @@ describe('Permissions', function () { await withFixtures( { dapp: true, - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/personal-sign.spec.js b/test/e2e/tests/personal-sign.spec.js index 040cde6095fe..65f669e4c63d 100644 --- a/test/e2e/tests/personal-sign.spec.js +++ b/test/e2e/tests/personal-sign.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Personal sign', function () { it('can initiate and confirm a personal sign', async function () { @@ -16,7 +17,9 @@ describe('Personal sign', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/phishing-detection.spec.js b/test/e2e/tests/phishing-detection.spec.js index ccad1dd4aa52..897ad66acc4d 100644 --- a/test/e2e/tests/phishing-detection.spec.js +++ b/test/e2e/tests/phishing-detection.spec.js @@ -1,14 +1,15 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); const PHISHFORT_CDN_URL = - 'https://cdn.jsdelivr.net/gh/phishfort/phishfort-lists@master/blacklists/hotlist.json'; + 'https://static.metafi.codefi.network/api/v1/lists/phishfort_hotlist.json'; describe('Phishing Detection', function () { async function mockPhishingDetection(mockServer) { await mockServer .forGet( - 'https://cdn.jsdelivr.net/gh/MetaMask/eth-phishing-detect@master/src/config.json', + 'https://static.metafi.codefi.network/api/v1/lists/eth_phishing_detect_config.json', ) .thenCallback(() => { return { @@ -43,7 +44,7 @@ describe('Phishing Detection', function () { it('should display the MetaMask Phishing Detection page and take the user to the blocked page if they continue', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, testSpecificMock: mockPhishingDetection, @@ -67,7 +68,7 @@ describe('Phishing Detection', function () { it('should display the MetaMask Phishing Detection page in an iframe and take the user to the blocked page if they continue', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, testSpecificMock: mockPhishingDetection, @@ -103,7 +104,7 @@ describe('Phishing Detection', function () { it('should display the MetaMask Phishing Detection page in an iframe but should NOT take the user to the blocked page if it is not an accessible resource', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, testSpecificMock: mockPhishingDetection, @@ -142,7 +143,7 @@ describe('Phishing Detection', function () { it('should display the MetaMask Phishing Detection page with the correct new issue link if the issue was detected from the phishfort list', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, testSpecificMock: mockPhishfortPhishingDetection, diff --git a/test/e2e/tests/portfolio-site.spec.js b/test/e2e/tests/portfolio-site.spec.js new file mode 100644 index 000000000000..06b47ce4bc09 --- /dev/null +++ b/test/e2e/tests/portfolio-site.spec.js @@ -0,0 +1,42 @@ +const { strict: assert } = require('assert'); +const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); + +describe('Portfolio site', function () { + const ganacheOptions = { + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), + }, + ], + }; + it('should link to the portfolio site', async function () { + await withFixtures( + { + dapp: true, + fixtures: new FixtureBuilder().build(), + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + // Click Portfolio site + await driver.clickElement('[data-testid="home__portfolio-site"]'); + await driver.waitUntilXWindowHandles(2); + const windowHandles = await driver.getAllWindowHandles(); + await driver.switchToWindowWithTitle('E2E Test Dapp', windowHandles); + + // Verify site + assert.equal( + await driver.getCurrentUrl(), + 'http://127.0.0.1:8080/?metamaskEntry=ext', + ); + }, + ); + }); +}); diff --git a/test/e2e/tests/provider-api.spec.js b/test/e2e/tests/provider-api.spec.js index b85b4fb32f19..449f894bd1c4 100644 --- a/test/e2e/tests/provider-api.spec.js +++ b/test/e2e/tests/provider-api.spec.js @@ -1,6 +1,7 @@ const { strict: assert } = require('assert'); const { errorCodes } = require('eth-rpc-errors'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('MetaMask', function () { const ganacheOptions = { @@ -17,7 +18,9 @@ describe('MetaMask', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, @@ -70,7 +73,9 @@ describe('MetaMask', function () { { dapp: true, failOnConsoleError: false, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/send-edit.spec.js b/test/e2e/tests/send-edit.spec.js index 8060392f2876..bd3c7120d76f 100644 --- a/test/e2e/tests/send-edit.spec.js +++ b/test/e2e/tests/send-edit.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Editing Confirm Transaction', function () { it('goes back from confirm page to edit eth value, gas price and gas limit', async function () { @@ -14,7 +15,9 @@ describe('Editing Confirm Transaction', function () { }; await withFixtures( { - fixtures: 'send-edit', + fixtures: new FixtureBuilder() + .withTransactionControllerTypeOneTransaction() + .build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, @@ -92,7 +95,12 @@ describe('Editing Confirm Transaction', function () { }; await withFixtures( { - fixtures: 'send-edit-v2', + fixtures: new FixtureBuilder() + .withPreferencesController({ + eip1559V2Enabled: true, + }) + .withTransactionControllerTypeTwoTransaction() + .build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, diff --git a/test/e2e/tests/send-eth.spec.js b/test/e2e/tests/send-eth.spec.js index f14bb1bc52ad..075a6b01d891 100644 --- a/test/e2e/tests/send-eth.spec.js +++ b/test/e2e/tests/send-eth.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Send ETH from inside MetaMask using default gas', function () { const ganacheOptions = { @@ -14,7 +15,7 @@ describe('Send ETH from inside MetaMask using default gas', function () { it('finds the transaction in the transactions list', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -26,7 +27,7 @@ describe('Send ETH from inside MetaMask using default gas', function () { await driver.clickElement('[data-testid="eth-overview-send"]'); await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', '0x2f318C334780961FB129D2a6c30D0763d9a5C970', ); @@ -105,7 +106,13 @@ describe('Send ETH non-contract address with data that matches ERC20 transfer da it('renders the correct recipient on the confirmation screen', async function () { await withFixtures( { - fixtures: 'special-settings', + fixtures: new FixtureBuilder() + .withPreferencesController({ + featureFlags: { + sendHexData: true, + }, + }) + .build(), ganacheOptions, title: this.test.title, }, @@ -117,7 +124,7 @@ describe('Send ETH non-contract address with data that matches ERC20 transfer da await driver.clickElement('[data-testid="eth-overview-send"]'); await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', '0xc427D562164062a23a5cFf596A4a3208e72Acd28', ); @@ -128,7 +135,7 @@ describe('Send ETH non-contract address with data that matches ERC20 transfer da await driver.clickElement({ text: 'Next', tag: 'button' }); - await driver.clickElement({ text: '0xc42...cd28' }); + await driver.clickElement({ text: 'New contract' }); const recipientAddress = await driver.findElements({ text: '0xc427D562164062a23a5cFf596A4a3208e72Acd28', @@ -154,7 +161,7 @@ describe('Send ETH from inside MetaMask using advanced gas modal', function () { it('finds the transaction in the transactions list', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -166,7 +173,7 @@ describe('Send ETH from inside MetaMask using advanced gas modal', function () { await driver.clickElement('[data-testid="eth-overview-send"]'); await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', '0x2f318C334780961FB129D2a6c30D0763d9a5C970', ); @@ -221,7 +228,9 @@ describe('Send ETH from dapp using advanced gas controls', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, @@ -230,23 +239,6 @@ describe('Send ETH from dapp using advanced gas controls', function () { await driver.fill('#password', 'correct horse battery staple'); await driver.press('#password', driver.Key.ENTER); - // goes to the settings screen - await driver.clickElement('.account-menu__icon'); - await driver.clickElement({ text: 'Settings', tag: 'div' }); - await driver.clickElement({ text: 'Advanced', tag: 'div' }); - await driver.clickElement( - '[data-testid="advanced-setting-show-testnet-conversion"] .settings-page__content-item-col > label > div', - ); - const advancedGasTitle = await driver.findElement({ - text: 'Advanced gas controls', - tag: 'span', - }); - await driver.scrollToElement(advancedGasTitle); - await driver.clickElement( - '[data-testid="advanced-setting-advanced-gas-inline"] .settings-page__content-item-col > label > div', - ); - await driver.clickElement('.app-header__logo-container'); - // initiates a send from the dapp await driver.openNewPage('http://127.0.0.1:8080/'); await driver.clickElement({ text: 'Send', tag: 'button' }); @@ -263,10 +255,10 @@ describe('Send ETH from dapp using advanced gas controls', function () { css: '.transaction-total-banner', text: '0.00021 ETH', }); - await driver.clickElement( - { text: 'Edit suggested gas fee', tag: 'button' }, - 10000, - ); + await driver.clickElement({ + text: 'Edit suggested gas fee', + tag: 'button', + }); await driver.waitForSelector({ css: '.transaction-total-banner', text: '0.00021 ETH', diff --git a/test/e2e/tests/send-hex-address.spec.js b/test/e2e/tests/send-hex-address.spec.js index 5c5bbf0a9e6e..10eeeb3398cc 100644 --- a/test/e2e/tests/send-hex-address.spec.js +++ b/test/e2e/tests/send-hex-address.spec.js @@ -1,6 +1,7 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); const { SMART_CONTRACTS } = require('../seeder/smart-contracts'); +const FixtureBuilder = require('../fixture-builder'); const hexPrefixedAddress = '0x2f318C334780961FB129D2a6c30D0763d9a5C970'; const nonHexPrefixedAddress = hexPrefixedAddress.substring(2); @@ -18,7 +19,7 @@ describe('Send ETH to a 40 character hexadecimal address', function () { it('should ensure the address is prefixed with 0x when pasted and should send ETH to a valid hexadecimal address', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, @@ -33,11 +34,11 @@ describe('Send ETH to a 40 character hexadecimal address', function () { // Paste address without hex prefix await driver.pasteIntoField( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', nonHexPrefixedAddress, ); await driver.waitForSelector({ - css: '.ens-input__selected-input__title', + css: '.domain-input__selected-input__title', text: hexPrefixedAddress, }); await driver.wait(async () => { @@ -56,7 +57,7 @@ describe('Send ETH to a 40 character hexadecimal address', function () { ); await sendTransactionListItem.click(); await driver.clickElement({ text: 'Activity log', tag: 'summary' }); - await driver.clickElement('.sender-to-recipient__name:nth-of-type(2)'); + await driver.clickElement('[data-testid="sender-to-recipient__name"]'); // Verify address in activity log const publicAddress = await driver.findElement( @@ -69,7 +70,7 @@ describe('Send ETH to a 40 character hexadecimal address', function () { it('should ensure the address is prefixed with 0x when typed and should send ETH to a valid hexadecimal address', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, @@ -84,11 +85,11 @@ describe('Send ETH to a 40 character hexadecimal address', function () { // Type address without hex prefix await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', nonHexPrefixedAddress, ); await driver.waitForSelector({ - css: '.ens-input__selected-input__title', + css: '.domain-input__selected-input__title', text: hexPrefixedAddress, }); await driver.wait(async () => { @@ -107,7 +108,7 @@ describe('Send ETH to a 40 character hexadecimal address', function () { ); await sendTransactionListItem.click(); await driver.clickElement({ text: 'Activity log', tag: 'summary' }); - await driver.clickElement('.sender-to-recipient__name:nth-of-type(2)'); + await driver.clickElement('[data-testid="sender-to-recipient__name"]'); // Verify address in activity log const publicAddress = await driver.findElement( @@ -134,7 +135,9 @@ describe('Send ERC20 to a 40 character hexadecimal address', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, smartContract, title: this.test.title, @@ -177,11 +180,11 @@ describe('Send ERC20 to a 40 character hexadecimal address', function () { // Paste address without hex prefix await driver.pasteIntoField( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', nonHexPrefixedAddress, ); await driver.waitForSelector({ - css: '.ens-input__selected-input__title', + css: '.domain-input__selected-input__title', text: hexPrefixedAddress, }); await driver.wait(async () => { @@ -209,7 +212,7 @@ describe('Send ERC20 to a 40 character hexadecimal address', function () { ); await sendTransactionListItem.click(); await driver.clickElement({ text: 'Activity log', tag: 'summary' }); - await driver.clickElement('.sender-to-recipient__name:nth-of-type(2)'); + await driver.clickElement('[data-testid="sender-to-recipient__name"]'); // Verify address in activity log const publicAddress = await driver.findElement( @@ -223,7 +226,9 @@ describe('Send ERC20 to a 40 character hexadecimal address', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, smartContract, title: this.test.title, @@ -265,11 +270,11 @@ describe('Send ERC20 to a 40 character hexadecimal address', function () { // Type address without hex prefix await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', nonHexPrefixedAddress, ); await driver.waitForSelector({ - css: '.ens-input__selected-input__title', + css: '.domain-input__selected-input__title', text: hexPrefixedAddress, }); await driver.wait(async () => { @@ -297,7 +302,7 @@ describe('Send ERC20 to a 40 character hexadecimal address', function () { ); await sendTransactionListItem.click(); await driver.clickElement({ text: 'Activity log', tag: 'summary' }); - await driver.clickElement('.sender-to-recipient__name:nth-of-type(2)'); + await driver.clickElement('[data-testid="sender-to-recipient__name"]'); // Verify address in activity log const publicAddress = await driver.findElement( diff --git a/test/e2e/tests/send-to-contract.spec.js b/test/e2e/tests/send-to-contract.spec.js index 1cdb47e43ac1..4c35e460a450 100644 --- a/test/e2e/tests/send-to-contract.spec.js +++ b/test/e2e/tests/send-to-contract.spec.js @@ -1,6 +1,7 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); const { SMART_CONTRACTS } = require('../seeder/smart-contracts'); +const FixtureBuilder = require('../fixture-builder'); describe('Send ERC20 token to contract address', function () { const smartContract = SMART_CONTRACTS.HST; @@ -17,7 +18,9 @@ describe('Send ERC20 token to contract address', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, smartContract, title: this.test.title, @@ -58,7 +61,7 @@ describe('Send ERC20 token to contract address', function () { // Type contract address await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', contractAddress, ); diff --git a/test/e2e/tests/settings-general.spec.js b/test/e2e/tests/settings-general.spec.js index e264f3771b9b..bf4a1954df39 100644 --- a/test/e2e/tests/settings-general.spec.js +++ b/test/e2e/tests/settings-general.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Settings', function () { const ganacheOptions = { @@ -15,7 +16,7 @@ describe('Settings', function () { it('checks jazzicon and blockies icons', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/settings-search.spec.js b/test/e2e/tests/settings-search.spec.js index 69ac23ec085a..b4c3ab2788ec 100644 --- a/test/e2e/tests/settings-search.spec.js +++ b/test/e2e/tests/settings-search.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Settings Search', function () { const ganacheOptions = { @@ -25,7 +26,7 @@ describe('Settings Search', function () { it('should find element inside the General tab', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -51,7 +52,7 @@ describe('Settings Search', function () { it('should find element inside the Advanced tab', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -78,7 +79,7 @@ describe('Settings Search', function () { it('should find element inside the Contacts tab', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -105,7 +106,7 @@ describe('Settings Search', function () { it('should find element inside the Security tab', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -132,7 +133,7 @@ describe('Settings Search', function () { it('should find element inside the Alerts tab', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -159,7 +160,7 @@ describe('Settings Search', function () { it('should find element inside the Networks tab', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -186,7 +187,7 @@ describe('Settings Search', function () { it('should find element inside the Experimental tab', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -213,7 +214,7 @@ describe('Settings Search', function () { it('should find element inside the About tab', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, @@ -240,7 +241,7 @@ describe('Settings Search', function () { it('should display "Element not found" for a non-existing element', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/signature-request.spec.js b/test/e2e/tests/signature-request.spec.js index 1de8409a1e4c..9fa2a08d4940 100644 --- a/test/e2e/tests/signature-request.spec.js +++ b/test/e2e/tests/signature-request.spec.js @@ -4,6 +4,7 @@ const { withFixtures, regularDelayMs, } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Sign Typed Data V4 Signature Request', function () { it('can initiate and confirm a Signature Request', async function () { @@ -20,7 +21,9 @@ describe('Sign Typed Data V4 Signature Request', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, @@ -53,7 +56,7 @@ describe('Sign Typed Data V4 Signature Request', function () { const origin = content[0]; const address = content[1]; const message = await driver.findElement( - '.signature-request-message--node-value', + '.signature-request-data__node__value', ); assert.equal(await title.getText(), 'Signature request'); assert.equal(await name.getText(), 'Ether Mail'); @@ -102,7 +105,9 @@ describe('Sign Typed Data V3 Signature Request', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, @@ -135,7 +140,7 @@ describe('Sign Typed Data V3 Signature Request', function () { const origin = content[0]; const address = content[1]; const messages = await driver.findElements( - '.signature-request-message--node-value', + '.signature-request-data__node__value', ); assert.equal(await title.getText(), 'Signature request'); assert.equal(await name.getText(), 'Ether Mail'); @@ -149,6 +154,10 @@ describe('Sign Typed Data V3 Signature Request', function () { assert.equal(await messages[4].getText(), 'Hello, Bob!'); // Approve signing typed data + await driver.clickElement( + '[data-testid="signature-request-scroll-button"]', + ); + await driver.delay(regularDelayMs); await driver.clickElement({ text: 'Sign', tag: 'button' }); await driver.waitUntilXWindowHandles(2); windowHandles = await driver.getAllWindowHandles(); @@ -180,7 +189,9 @@ describe('Sign Typed Data Signature Request', function () { await withFixtures( { dapp: true, - fixtures: 'connected-state', + fixtures: new FixtureBuilder() + .withPermissionControllerConnectedToTestDapp() + .build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/tests/simple-send.spec.js b/test/e2e/tests/simple-send.spec.js index 2d26a187155d..ff6c67df6c1f 100644 --- a/test/e2e/tests/simple-send.spec.js +++ b/test/e2e/tests/simple-send.spec.js @@ -1,4 +1,5 @@ const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Simple send', function () { it('can send a simple transaction from one account to another', async function () { @@ -12,14 +13,18 @@ describe('Simple send', function () { ], }; await withFixtures( - { fixtures: 'imported-account', ganacheOptions, title: this.test.title }, + { + fixtures: new FixtureBuilder().build(), + ganacheOptions, + title: this.test.title, + }, async ({ driver }) => { await driver.navigate(); await driver.fill('#password', 'correct horse battery staple'); await driver.press('#password', driver.Key.ENTER); await driver.clickElement('[data-testid="eth-overview-send"]'); await driver.fill( - '[data-testid="ens-input"]', + '[data-testid="domain-input"]', '0x985c30949c92df7a0bd42e0f3e3d539ece98db24', ); await driver.fill('.unit-input__input', '1'); diff --git a/test/e2e/tests/state-logs.spec.js b/test/e2e/tests/state-logs.spec.js index ae42abfc1ede..9b82b0a00568 100644 --- a/test/e2e/tests/state-logs.spec.js +++ b/test/e2e/tests/state-logs.spec.js @@ -5,6 +5,7 @@ const { withFixtures, createDownloadFolder, } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); const downloadsFolder = `${process.cwd()}/test-artifacts/downloads`; @@ -31,7 +32,7 @@ describe('State logs', function () { it('should download state logs for the account', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, failOnConsoleError: false, diff --git a/test/e2e/tests/stuck-approved-transaction.spec.js b/test/e2e/tests/stuck-approved-transaction.spec.js new file mode 100644 index 000000000000..daf73265dc52 --- /dev/null +++ b/test/e2e/tests/stuck-approved-transaction.spec.js @@ -0,0 +1,47 @@ +const { strict: assert } = require('assert'); +const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); + +describe('Editing Confirm Transaction', function () { + it('approves a transaction stuck in approved state on boot', async function () { + const ganacheOptions = { + hardfork: 'london', + accounts: [ + { + secretKey: + '0x7C9529A67102755B7E6102D6D950AC5D5863C98713805CEC576B945B15B71EAC', + balance: convertToHexValue(25000000000000000000), + }, + ], + }; + await withFixtures( + { + fixtures: new FixtureBuilder() + .withTransactionControllerApprovedTransaction() + .build(), + ganacheOptions, + title: this.test.title, + }, + async ({ driver }) => { + await driver.navigate(); + + await driver.fill('#password', 'correct horse battery staple'); + await driver.press('#password', driver.Key.ENTER); + + await driver.clickElement('[data-testid="home__activity-tab"]'); + await driver.wait(async () => { + const confirmedTxes = await driver.findElements( + '.transaction-list__completed-transactions .transaction-list-item', + ); + return confirmedTxes.length === 1; + }, 10000); + + const txValues = await driver.findElements( + '.transaction-list-item__primary-currency', + ); + assert.equal(txValues.length, 1); + assert.ok(/-1\s*ETH/u.test(await txValues[0].getText())); + }, + ); + }); +}); diff --git a/test/e2e/tests/threebox.spec.js b/test/e2e/tests/threebox.spec.js index 162108e80849..2a68a4aee749 100644 --- a/test/e2e/tests/threebox.spec.js +++ b/test/e2e/tests/threebox.spec.js @@ -19,7 +19,6 @@ describe('Threebox', function () { after(async function () { await threeboxServer.stop(); }); - it('Set up data to be restored by 3box', async function () { await withFixtures( { @@ -55,7 +54,7 @@ describe('Threebox', function () { await driver.clickElement('.address-book__link'); await driver.fill('#nickname', 'Test User Name 11'); await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', '0x2f318C334780961FB129D2a6c30D0763d9a5C970', ); await driver.delay(largeDelayMs * 2); diff --git a/test/e2e/tests/token-details.spec.js b/test/e2e/tests/token-details.spec.js index fd93d7d0f03a..56372bc0a560 100644 --- a/test/e2e/tests/token-details.spec.js +++ b/test/e2e/tests/token-details.spec.js @@ -1,5 +1,6 @@ const { strict: assert } = require('assert'); const { convertToHexValue, withFixtures } = require('../helpers'); +const FixtureBuilder = require('../fixture-builder'); describe('Token Details', function () { const ganacheOptions = { @@ -14,7 +15,7 @@ describe('Token Details', function () { it('should show token details for an imported token', async function () { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, title: this.test.title, }, diff --git a/test/e2e/user-actions-benchmark.js b/test/e2e/user-actions-benchmark.js index f91f6c318f36..72a54ac243d2 100644 --- a/test/e2e/user-actions-benchmark.js +++ b/test/e2e/user-actions-benchmark.js @@ -8,6 +8,7 @@ const { getFirstParentDirectoryThatExists, } = require('../helpers/file'); const { convertToHexValue, withFixtures } = require('./helpers'); +const FixtureBuilder = require('./fixture-builder'); const ganacheOptions = { accounts: [ @@ -24,7 +25,7 @@ async function loadNewAccount() { await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, }, async ({ driver }) => { @@ -52,7 +53,7 @@ async function confirmTx() { let loadingTimes; await withFixtures( { - fixtures: 'imported-account', + fixtures: new FixtureBuilder().build(), ganacheOptions, }, async ({ driver }) => { @@ -63,7 +64,7 @@ async function confirmTx() { await driver.clickElement('[data-testid="eth-overview-send"]'); await driver.fill( - 'input[placeholder="Search, public address (0x), or ENS"]', + 'input[placeholder="Search, public address (0x), ENS, or UNS"]', '0x2f318C334780961FB129D2a6c30D0763d9a5C970', ); diff --git a/test/e2e/webdriver/driver.js b/test/e2e/webdriver/driver.js index 59416becb075..acc96d948e1f 100644 --- a/test/e2e/webdriver/driver.js +++ b/test/e2e/webdriver/driver.js @@ -49,6 +49,7 @@ class Driver { this.browser = browser; this.extensionUrl = extensionUrl; this.timeout = timeout; + this.exceptions = []; // The following values are found in // https://github.com/SeleniumHQ/selenium/blob/trunk/javascript/node/selenium-webdriver/lib/input.js#L50-L110 // These should be replaced with string constants 'Enter' etc for playwright. @@ -161,6 +162,14 @@ class Driver { return wrapElementWithAPI(element, this); } + async waitForNonEmptyElement(element) { + await this.driver.wait(async () => { + const elemText = await element.getText(); + const empty = elemText === ''; + return !empty; + }, this.timeout); + } + async quit() { await this.driver.quit(); } @@ -254,9 +263,18 @@ class Driver { assert.ok(!dataTab, 'Found element that should not be present'); } - async isElementPresent(element) { + async isElementPresent(rawLocator) { + try { + await this.findElement(rawLocator); + return true; + } catch (err) { + return false; + } + } + + async isElementPresentAndVisible(rawLocator) { try { - await this.findElement(element); + await this.findVisibleElement(rawLocator); return true; } catch (err) { return false; @@ -289,6 +307,10 @@ class Driver { return await this.driver.get(`${this.extensionUrl}/${page}.html`); } + async getCurrentUrl() { + return await this.driver.getCurrentUrl(); + } + // Metrics async collectMetrics() { @@ -393,7 +415,9 @@ class Driver { const htmlSource = await this.driver.getPageSource(); await fs.writeFile(`${filepathBase}-dom.html`, htmlSource); const uiState = await this.driver.executeScript( - () => window.getCleanAppState && window.getCleanAppState(), + () => + window.stateHooks?.getCleanAppState && + window.stateHooks.getCleanAppState(), ); await fs.writeFile( `${filepathBase}-state.json`, @@ -415,6 +439,15 @@ class Driver { return browserLogs; } + async checkBrowserForExceptions() { + const { exceptions } = this; + const cdpConnection = await this.driver.createCDPConnection('page'); + await this.driver.onLogException(cdpConnection, function (exception) { + const { description } = exception.exceptionDetails.exception; + exceptions.push(description); + }); + } + async checkBrowserForConsoleErrors() { const ignoredLogTypes = ['WARNING']; const ignoredErrorMessages = [ diff --git a/test/helpers/setup-helper.js b/test/helpers/setup-helper.js index 2c7a8299fe50..4aac6a02db22 100644 --- a/test/helpers/setup-helper.js +++ b/test/helpers/setup-helper.js @@ -1,3 +1,5 @@ +/* eslint-disable-next-line */ +import { TextEncoder, TextDecoder } from 'util'; import nock from 'nock'; import Enzyme from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; @@ -12,6 +14,12 @@ global.chrome = { nock.disableNetConnect(); nock.enableNetConnect('localhost'); +if (typeof beforeEach === 'function') { + /* eslint-disable-next-line jest/require-top-level-describe */ + beforeEach(() => { + nock.cleanAll(); + }); +} // catch rejections that are still unhandled when tests exit const unhandledRejections = new Map(); @@ -96,6 +104,10 @@ if (!window.crypto.getRandomValues) { window.crypto.getRandomValues = require('polyfill-crypto.getrandomvalues'); } +// TextEncoder/TextDecoder +window.TextEncoder = TextEncoder; +window.TextDecoder = TextDecoder; + // Used to test `clearClipboard` function if (!window.navigator.clipboard) { window.navigator.clipboard = {}; diff --git a/test/jest/env.js b/test/jest/env.js new file mode 100644 index 000000000000..c272b98394d8 --- /dev/null +++ b/test/jest/env.js @@ -0,0 +1,9 @@ +// jest specific env vars that break mocha tests +import { generateIconNames } from '../../development/generate-icon-names'; + +/** + * Used for testing components that use the Icon component + * 'ui/components/component-library/icon/icon.js' + */ + +process.env.ICON_NAMES = generateIconNames(); diff --git a/test/jest/index.js b/test/jest/index.js index 9e6510ca8877..1b4174afa8b0 100644 --- a/test/jest/index.js +++ b/test/jest/index.js @@ -1,4 +1,4 @@ -export { screen, fireEvent } from '@testing-library/react'; +export { screen, fireEvent, waitFor } from '@testing-library/react'; export { createSwapsMockStore } from './mock-store'; export { renderWithProvider } from './rendering'; export { setBackgroundConnection } from './background'; diff --git a/test/jest/mock-store.js b/test/jest/mock-store.js index 54345e831b93..a447124a4f35 100644 --- a/test/jest/mock-store.js +++ b/test/jest/mock-store.js @@ -1,4 +1,5 @@ import { CHAIN_IDS } from '../../shared/constants/network'; +import { KEYRING_TYPES } from '../../shared/constants/keyrings'; const createGetSmartTransactionFeesApiResponse = () => { return { @@ -103,6 +104,9 @@ const createGetSmartTransactionFeesApiResponse = () => { export const createSwapsMockStore = () => { return { + confirmTransaction: { + txData: {}, + }, swaps: { customGas: { limit: '0x0', @@ -120,6 +124,13 @@ export const createSwapsMockStore = () => { }, }, fromToken: 'ETH', + toToken: { + symbol: 'USDC', + address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', + occurances: 4, + }, + currentSmartTransactionsErrorMessageDismissed: false, + swapsSTXLoading: false, }, metamask: { networkDetails: { @@ -137,6 +148,76 @@ export const createSwapsMockStore = () => { showFiatInTestnets: true, }, currentCurrency: 'ETH', + currentNetworkTxList: [ + { + id: 6571648590592143, + time: 1667403993369, + status: 'confirmed', + metamaskNetworkId: '5', + originalGasEstimate: '0x7548', + userEditedGasLimit: false, + chainId: '0x5', + loadingDefaults: false, + dappSuggestedGasFees: null, + sendFlowHistory: null, + txParams: { + from: '0x806627172af48bd5b0765d3449a7def80d6576ff', + to: '0x881d40237659c251811cec9c364ef91dc08d300c', + nonce: '0x30', + value: '0x5af3107a4000', + gas: '0x7548', + maxFeePerGas: '0x19286f704d', + maxPriorityFeePerGas: '0x77359400', + }, + origin: 'metamask', + actionId: 1667403993358.877, + type: 'swap', + userFeeLevel: 'medium', + defaultGasEstimates: { + estimateType: 'medium', + gas: '0x7548', + maxFeePerGas: '0x19286f704d', + maxPriorityFeePerGas: '0x77359400', + }, + sourceTokenSymbol: 'ETH', + destinationTokenSymbol: 'USDC', + destinationTokenDecimals: 6, + destinationTokenAddress: '0xdac17f958d2ee523a2206206994597c13d831ec7', + swapMetaData: { + token_from: 'ETH', + token_from_amount: '0.0001', + token_to: 'USDC', + token_to_amount: '0.15471500', + slippage: 2, + custom_slippage: false, + best_quote_source: 'pmm', + other_quote_selected: false, + other_quote_selected_source: '', + gas_fees: '3.016697', + estimated_gas: '30024', + used_gas_price: '0', + is_hardware_wallet: false, + stx_enabled: false, + current_stx_enabled: false, + stx_user_opt_in: false, + reg_tx_fee_in_usd: 3.02, + reg_tx_fee_in_eth: 0.00193, + reg_tx_max_fee_in_usd: 5.06, + reg_tx_max_fee_in_eth: 0.00324, + max_fee_per_gas: '19286f704d', + max_priority_fee_per_gas: '77359400', + base_and_priority_fee_per_gas: 'efd93d95a', + }, + swapTokenValue: '0.0001', + estimatedBaseFee: 'e865e455a', + hash: '0x8216e3696e7deb7ca794703015f17d5114a09362ae98f6a1611203e4c9509243', + submittedTime: 1667403996143, + firstRetryBlockNumber: '0x7838fe', + baseFeePerGas: '0xe0ef7d207', + blockTimestamp: '636290e8', + postTxBalance: '19a61aaaf06e4bd1', + }, + ], conversionRate: 1, contractExchangeRates: { '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48': 2, @@ -171,10 +252,10 @@ export const createSwapsMockStore = () => { }, }, selectedAddress: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', - keyringTypes: ['Simple Key Pair', 'HD Key Tree'], + keyringTypes: [KEYRING_TYPES.IMPORTED, KEYRING_TYPES.HD_KEY_TREE], keyrings: [ { - type: 'HD Key Tree', + type: KEYRING_TYPES.HD_KEY_TREE, accounts: [ '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', 'c5b8dbac4c1d3f152cdeb400e2313f309c410acb', @@ -182,7 +263,7 @@ export const createSwapsMockStore = () => { ], }, { - type: 'Simple Key Pair', + type: KEYRING_TYPES.IMPORTED, accounts: ['0xd85a4b6a394794842887b8284293d69163007bbb'], }, ], @@ -314,10 +395,10 @@ export const createSwapsMockStore = () => { fetchParams: { metaData: { sourceTokenInfo: { - symbol: 'BAT', + symbol: 'ETH', }, destinationTokenInfo: { - symbol: 'ETH', + symbol: 'USDC', }, }, }, @@ -326,6 +407,10 @@ export const createSwapsMockStore = () => { quotesLastFetched: 1519211809934, swapsQuoteRefreshTime: 60000, swapsQuotePrefetchingRefreshTime: 60000, + swapsStxBatchStatusRefreshTime: 5000, + swapsStxGetTransactionsRefreshTime: 5000, + swapsStxMaxFeeMultiplier: 1.5, + swapsStxStatusDeadline: 150000, customMaxGas: '', customGasPrice: null, selectedAggId: 'TEST_AGG_2', @@ -412,6 +497,7 @@ export const createSwapsMockStore = () => { { uuid: 'uuid2', status: 'success', + cancellable: false, statusMetadata: { cancellationFeeWei: 36777567771000, cancellationReason: 'not_cancelled', @@ -424,6 +510,7 @@ export const createSwapsMockStore = () => { { uuid: 'uuid2', status: 'pending', + cancellable: true, statusMetadata: { cancellationFeeWei: 36777567771000, cancellationReason: 'not_cancelled', diff --git a/test/jest/mocks.js b/test/jest/mocks.js index 47c8a1f99ccd..bec4b41556ea 100644 --- a/test/jest/mocks.js +++ b/test/jest/mocks.js @@ -68,19 +68,19 @@ export const TOKENS_GET_RESPONSE = [ export const createFeatureFlagsResponse = () => { return { bsc: { - mobile_active: false, - extension_active: true, - fallback_to_v1: true, + mobileActive: false, + extensionActive: true, + fallbackToV1: true, }, ethereum: { - mobile_active: false, - extension_active: true, - fallback_to_v1: true, + mobileActive: false, + extensionActive: true, + fallbackToV1: true, }, polygon: { - mobile_active: false, - extension_active: true, - fallback_to_v1: false, + mobileActive: false, + extensionActive: true, + fallbackToV1: false, }, }; }; diff --git a/test/jest/setup.js b/test/jest/setup.js index ae49888e5e9a..c0852092041c 100644 --- a/test/jest/setup.js +++ b/test/jest/setup.js @@ -1,4 +1,6 @@ // This file is for Jest-specific setup only and runs before our Jest tests. + +import nock from 'nock'; import '@testing-library/jest-dom'; jest.mock('webextension-polyfill', () => { @@ -8,3 +10,8 @@ jest.mock('webextension-polyfill', () => { }, }; }); + +/* eslint-disable-next-line jest/require-top-level-describe */ +beforeEach(() => { + nock.cleanAll(); +}); diff --git a/test/lib/render-helpers.js b/test/lib/render-helpers.js index 0291df0f8625..27ac3f80e643 100644 --- a/test/lib/render-helpers.js +++ b/test/lib/render-helpers.js @@ -1,6 +1,7 @@ -import React, { useMemo } from 'react'; +import React, { useMemo, useState } from 'react'; import { Provider } from 'react-redux'; import { render } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import { mount, shallow } from 'enzyme'; import { Router, MemoryRouter } from 'react-router-dom'; import PropTypes from 'prop-types'; @@ -122,3 +123,17 @@ export function renderWithLocalization(component) { return render(component, { wrapper: Wrapper }); } + +export function renderControlledInput(InputComponent, props) { + const ControlledWrapper = () => { + const [value, setValue] = useState(''); + return ( + setValue(e.target.value)} + {...props} + /> + ); + }; + return { user: userEvent.setup(), ...render() }; +} diff --git a/test/stub/tx-meta-stub.js b/test/stub/tx-meta-stub.js index c33ab758c152..8640998f4275 100644 --- a/test/stub/tx-meta-stub.js +++ b/test/stub/tx-meta-stub.js @@ -11,7 +11,7 @@ export const txMetaStub = { { id: 405984854664302, loadingDefaults: true, - metamaskNetworkId: '4', + metamaskNetworkId: '5', status: TRANSACTION_STATUSES.UNAPPROVED, time: 1572395156620, type: TRANSACTION_TYPES.SIMPLE_SEND, @@ -56,7 +56,7 @@ export const txMetaStub = { op: 'add', path: '/txParams/nonce', timestamp: 1572395158261, - value: '0x4', + value: '0x5', }, { op: 'add', @@ -163,7 +163,7 @@ export const txMetaStub = { ], id: 405984854664302, loadingDefaults: false, - metamaskNetworkId: '4', + metamaskNetworkId: '5', nonceDetails: { local: { details: { @@ -200,7 +200,7 @@ export const txMetaStub = { from: '0xf231d46dd78806e1dd93442cf33c7671f8538748', gas: GAS_LIMITS.SIMPLE, gasPrice: '0x1e8480', - nonce: '0x4', + nonce: '0x5', to: '0xf231d46dd78806e1dd93442cf33c7671f8538748', value: '0x0', }, diff --git a/ui/components/app/account-menu/account-menu.test.js b/ui/components/app/account-menu/account-menu.test.js index 86bfcf66df89..4366556b677d 100644 --- a/ui/components/app/account-menu/account-menu.test.js +++ b/ui/components/app/account-menu/account-menu.test.js @@ -3,6 +3,7 @@ import sinon from 'sinon'; import configureMockStore from 'redux-mock-store'; import { fireEvent, screen } from '@testing-library/react'; import { renderWithProvider } from '../../../../test/lib/render-helpers'; +import { KEYRING_TYPES } from '../../../../shared/constants/keyrings'; import AccountMenu from '.'; describe('Account Menu', () => { @@ -36,11 +37,11 @@ describe('Account Menu', () => { ], keyrings: [ { - type: 'HD Key Tree', + type: KEYRING_TYPES.HD_KEY_TREE, accounts: ['0xAdress'], }, { - type: 'Simple Key Pair', + type: KEYRING_TYPES.IMPORTED, accounts: ['0x1'], }, ], diff --git a/ui/components/app/account-menu/index.scss b/ui/components/app/account-menu/index.scss index d3b79532a59f..96113a57cf58 100644 --- a/ui/components/app/account-menu/index.scss +++ b/ui/components/app/account-menu/index.scss @@ -45,11 +45,11 @@ cursor: pointer; &:hover { - background-color: var(--color-background-alternative); + background-color: var(--color-background-default-hover); } &:active { - background-color: var(--color-background-alternative); + background-color: var(--color-background-default-hover); } } diff --git a/ui/components/app/account-menu/keyring-label.js b/ui/components/app/account-menu/keyring-label.js index 65007390ce26..3549a95b4551 100644 --- a/ui/components/app/account-menu/keyring-label.js +++ b/ui/components/app/account-menu/keyring-label.js @@ -2,10 +2,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import { useI18nContext } from '../../../hooks/useI18nContext'; -import { - KEYRING_NAMES, - KEYRING_TYPES, -} from '../../../../shared/constants/hardware-wallets'; +import { KEYRING_TYPES } from '../../../../shared/constants/keyrings'; +import { KEYRING_NAMES } from '../../../../shared/constants/hardware-wallets'; export default function KeyRingLabel({ keyring }) { const t = useI18nContext(); diff --git a/ui/components/app/add-network/add-network.js b/ui/components/app/add-network/add-network.js index c6d5fe06e497..ec457a3a1177 100644 --- a/ui/components/app/add-network/add-network.js +++ b/ui/components/app/add-network/add-network.js @@ -49,7 +49,7 @@ const AddNetwork = () => { const infuraRegex = /infura.io/u; const nets = FEATURED_RPCS.sort((a, b) => - a.ticker > b.ticker ? 1 : -1, + a.nickname > b.nickname ? 1 : -1, ).slice(0, FEATURED_RPCS.length); const notFrequentRpcNetworks = nets.filter( @@ -258,6 +258,7 @@ const AddNetwork = () => { > +
    + + + +`; diff --git a/ui/components/app/app-header/app-header.component.js b/ui/components/app/app-header/app-header.component.js index 7355af677eee..f5e7d57c5bea 100644 --- a/ui/components/app/app-header/app-header.component.js +++ b/ui/components/app/app-header/app-header.component.js @@ -7,6 +7,10 @@ import { DEFAULT_ROUTE } from '../../../helpers/constants/routes'; import { EVENT, EVENT_NAMES } from '../../../../shared/constants/metametrics'; import NetworkDisplay from '../network-display'; +///: BEGIN:ONLY_INCLUDE_IN(beta) +import BetaHeader from '../beta-header'; +///: END:ONLY_INCLUDE_IN(beta) + export default class AppHeader extends PureComponent { static propTypes = { history: PropTypes.object, @@ -23,6 +27,9 @@ export default class AppHeader extends PureComponent { ///: BEGIN:ONLY_INCLUDE_IN(flask) unreadNotificationsCount: PropTypes.number, ///: END:ONLY_INCLUDE_IN + ///: BEGIN:ONLY_INCLUDE_IN(beta) + showBetaHeader: PropTypes.bool, + ///: END:ONLY_INCLUDE_IN onClick: PropTypes.func, }; @@ -74,6 +81,7 @@ export default class AppHeader extends PureComponent { return ( isUnlocked && ( + + )} + {showEdit && showAdvanceGasFeeOptions && supportsEIP1559V2 && ( + + )} + + )} + + {renderTransactionDetailsContent && + (!isMultiLayerFeeNetwork && supportsEIP1559V2 ? ( + + ) : ( + + {isMultiLayerFeeNetwork ? ( + + + + {t('transactionDetailLayer2GasHeading')} + {`${ethTransactionTotal} ${nativeCurrency}`} + + + + + ) : ( + <> + + + {t('feeAssociatedRequest')} + + + + + + {formatCurrency(fiatTransactionTotal, currentCurrency)} + + + + + {`${ethTransactionTotal} ${nativeCurrency}`} + + + + + )} + + ))} + {renderDataContent && ( + + + + {isSetApproveForAll + ? t('functionSetApprovalForAll') + : t('functionApprove')} + + + {isSetApproveForAll && isApprovalOrRejection !== undefined ? ( + + + {`${t('parameters')}: ${isApprovalOrRejection}`} + + + ) : null} + + + {data} + + + + )} + + {footer} + + ); +} + +ApproveContentCard.propTypes = { + /** + * Whether to show header including icon, transaction fee text and edit button + */ + showHeader: PropTypes.bool, + /** + * Symbol icon + */ + symbol: PropTypes.node, + /** + * Title to be included in the header + */ + title: PropTypes.string, + /** + * Whether to show edit button or not + */ + showEdit: PropTypes.bool, + /** + * Whether to show advanced gas fee options or not + */ + showAdvanceGasFeeOptions: PropTypes.bool, + /** + * Should open customize gas modal when edit button is clicked + */ + onEditClick: PropTypes.func, + /** + * Footer to be shown + */ + footer: PropTypes.node, + /** + * Whether to include border-bottom or not + */ + noBorder: PropTypes.bool, + /** + * Is enhanced gas fee enabled or not + */ + supportsEIP1559V2: PropTypes.bool, + /** + * Whether to render transaction details content or not + */ + renderTransactionDetailsContent: PropTypes.bool, + /** + * Whether to render data content or not + */ + renderDataContent: PropTypes.bool, + /** + * Is multi-layer fee network or not + */ + isMultiLayerFeeNetwork: PropTypes.bool, + /** + * Total sum of the transaction in native currency + */ + ethTransactionTotal: PropTypes.string, + /** + * Current native currency + */ + nativeCurrency: PropTypes.string, + /** + * Current transaction + */ + fullTxData: PropTypes.object, + /** + * Total sum of the transaction converted to hex value + */ + hexTransactionTotal: PropTypes.string, + /** + * Total sum of the transaction in fiat currency + */ + fiatTransactionTotal: PropTypes.string, + /** + * Current fiat currency + */ + currentCurrency: PropTypes.string, + /** + * Is set approve for all or not + */ + isSetApproveForAll: PropTypes.bool, + /** + * Whether a current set approval for all transaction will approve or revoke access + */ + isApprovalOrRejection: PropTypes.bool, + /** + * Current transaction data + */ + data: PropTypes.string, +}; diff --git a/ui/components/app/approve-content-card/approve-content-card.stories.js b/ui/components/app/approve-content-card/approve-content-card.stories.js new file mode 100644 index 000000000000..113b35384576 --- /dev/null +++ b/ui/components/app/approve-content-card/approve-content-card.stories.js @@ -0,0 +1,196 @@ +import React from 'react'; +import ApproveContentCard from './approve-content-card'; + +export default { + title: 'Components/App/ApproveContentCard', + id: __filename, + argTypes: { + showHeader: { + control: 'boolean', + }, + symbol: { + control: 'array', + }, + title: { + control: 'text', + }, + showEdit: { + control: 'boolean', + }, + showAdvanceGasFeeOptions: { + control: 'boolean', + }, + footer: { + control: 'array', + }, + noBorder: { + control: 'boolean', + }, + supportsEIP1559V2: { + control: 'boolean', + }, + renderTransactionDetailsContent: { + control: 'boolean', + }, + renderDataContent: { + control: 'boolean', + }, + isMultiLayerFeeNetwork: { + control: 'boolean', + }, + ethTransactionTotal: { + control: 'text', + }, + nativeCurrency: { + control: 'text', + }, + fullTxData: { + control: 'object', + }, + hexTransactionTotal: { + control: 'text', + }, + fiatTransactionTotal: { + control: 'text', + }, + currentCurrency: { + control: 'text', + }, + isSetApproveForAll: { + control: 'boolean', + }, + isApprovalOrRejection: { + control: 'boolean', + }, + data: { + control: 'text', + }, + onEditClick: { + control: 'onEditClick', + }, + }, + args: { + showHeader: true, + symbol: , + title: 'Transaction fee', + showEdit: true, + showAdvanceGasFeeOptions: true, + noBorder: true, + supportsEIP1559V2: false, + renderTransactionDetailsContent: true, + renderDataContent: false, + isMultiLayerFeeNetwork: false, + ethTransactionTotal: '0.0012', + nativeCurrency: 'GoerliETH', + hexTransactionTotal: '0x44364c5bb0000', + fiatTransactionTotal: '1.54', + currentCurrency: 'usd', + isSetApproveForAll: false, + isApprovalOrRejection: false, + data: '', + fullTxData: { + id: 3049568294499567, + time: 1664449552289, + status: 'unapproved', + metamaskNetworkId: '3', + originalGasEstimate: '0xea60', + userEditedGasLimit: false, + chainId: '0x3', + loadingDefaults: false, + dappSuggestedGasFees: { + gasPrice: '0x4a817c800', + gas: '0xea60', + }, + sendFlowHistory: [], + txParams: { + from: '0xdd34b35ca1de17dfcdc07f79ff1f8f94868c40a1', + to: '0x55797717b9947b31306f4aac7ad1365c6e3923bd', + value: '0x0', + data: '0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170', + gas: '0xea60', + maxFeePerGas: '0x4a817c800', + maxPriorityFeePerGas: '0x4a817c800', + }, + origin: 'https://metamask.github.io', + type: 'approve', + history: [ + { + id: 3049568294499567, + time: 1664449552289, + status: 'unapproved', + metamaskNetworkId: '3', + originalGasEstimate: '0xea60', + userEditedGasLimit: false, + chainId: '0x3', + loadingDefaults: true, + dappSuggestedGasFees: { + gasPrice: '0x4a817c800', + gas: '0xea60', + }, + sendFlowHistory: [], + txParams: { + from: '0xdd34b35ca1de17dfcdc07f79ff1f8f94868c40a1', + to: '0x55797717b9947b31306f4aac7ad1365c6e3923bd', + value: '0x0', + data: '0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170', + gas: '0xea60', + gasPrice: '0x4a817c800', + }, + origin: 'https://metamask.github.io', + type: 'approve', + }, + [ + { + op: 'remove', + path: '/txParams/gasPrice', + note: 'Added new unapproved transaction.', + timestamp: 1664449553939, + }, + { + op: 'add', + path: '/txParams/maxFeePerGas', + value: '0x4a817c800', + }, + { + op: 'add', + path: '/txParams/maxPriorityFeePerGas', + value: '0x4a817c800', + }, + { + op: 'replace', + path: '/loadingDefaults', + value: false, + }, + { + op: 'add', + path: '/userFeeLevel', + value: 'custom', + }, + { + op: 'add', + path: '/defaultGasEstimates', + value: { + estimateType: 'custom', + gas: '0xea60', + maxFeePerGas: '0x4a817c800', + maxPriorityFeePerGas: '0x4a817c800', + }, + }, + ], + ], + userFeeLevel: 'custom', + defaultGasEstimates: { + estimateType: 'custom', + gas: '0xea60', + maxFeePerGas: '0x4a817c800', + maxPriorityFeePerGas: '0x4a817c800', + }, + }, + }, +}; + +export const DefaultStory = (args) => { + return ; +}; + +DefaultStory.storyName = 'Default'; diff --git a/ui/components/app/approve-content-card/index.js b/ui/components/app/approve-content-card/index.js new file mode 100644 index 000000000000..02838ddb5ab0 --- /dev/null +++ b/ui/components/app/approve-content-card/index.js @@ -0,0 +1 @@ +export { default } from './approve-content-card'; diff --git a/ui/components/app/approve-content-card/index.scss b/ui/components/app/approve-content-card/index.scss new file mode 100644 index 000000000000..8dd9badc1d5d --- /dev/null +++ b/ui/components/app/approve-content-card/index.scss @@ -0,0 +1,51 @@ +.approve-content-card-container { + &__card, + &__card--no-border { + border-bottom: 1px solid var(--color-border-default); + position: relative; + padding-inline-start: 24px; + padding-inline-end: 24px; + } + + &__card--no-border { + border-bottom: none; + } + + &__card-header { + position: relative; + + &__symbol { + width: auto; + } + + &__symbol--aligned { + width: 100%; + } + + &__title { + width: 100%; + } + + &__title--aligned { + margin-inline-start: 27px; + position: absolute; + width: auto; + } + } + + &__card-content--aligned { + margin-inline-start: 42px; + } + + &__transaction-details-extra-content { + width: 100%; + } + + &__data { + width: 100%; + + &__data-block { + overflow-wrap: break-word; + } + } +} diff --git a/ui/components/app/asset-list-item/asset-list-item.js b/ui/components/app/asset-list-item/asset-list-item.js index bc19aff878c8..f05992bb4e85 100644 --- a/ui/components/app/asset-list-item/asset-list-item.js +++ b/ui/components/app/asset-list-item/asset-list-item.js @@ -111,6 +111,7 @@ const AssetListItem = ({ title={ + + +`; diff --git a/ui/components/app/beta-header/beta-header.stories.js b/ui/components/app/beta-header/beta-header.stories.js new file mode 100644 index 000000000000..4a448009034b --- /dev/null +++ b/ui/components/app/beta-header/beta-header.stories.js @@ -0,0 +1,24 @@ +import React from 'react'; +import { Provider } from 'react-redux'; +import testData from '../../../../.storybook/test-data'; +import configureStore from '../../../store/store'; +import BetaHeader from '.'; + +const store = configureStore({ + ...testData, + metamask: { ...testData.metamask, isUnlocked: true, showBetaHeader: true }, +}); + +export default { + title: 'Components/App/BetaHeader', + decorators: [(story) => {story()}], + id: __filename, +}; + +export const DefaultStory = () => ( + <> + + +); + +DefaultStory.storyName = 'Default'; diff --git a/ui/components/app/beta-header/beta-header.test.js b/ui/components/app/beta-header/beta-header.test.js new file mode 100644 index 000000000000..2036b23e0dd2 --- /dev/null +++ b/ui/components/app/beta-header/beta-header.test.js @@ -0,0 +1,45 @@ +import React from 'react'; +import { fireEvent } from '@testing-library/react'; +import configureMockStore from 'redux-mock-store'; +import thunk from 'redux-thunk'; +import mockState from '../../../../test/data/mock-state.json'; +import { renderWithProvider } from '../../../../test/lib/render-helpers'; +import BetaHeader from '.'; + +const mockHideBetaHeader = jest.fn(); + +jest.mock('../../../store/actions', () => { + return { + hideBetaHeader: () => { + mockHideBetaHeader(); + }, + }; +}); + +describe('Beta Header', () => { + let store; + + beforeEach(() => { + store = configureMockStore([thunk])(mockState); + }); + + afterEach(() => { + mockHideBetaHeader.mockClear(); + }); + + it('should match snapshot', () => { + const { container } = renderWithProvider(, store); + expect(container).toMatchSnapshot(); + }); + + describe('Beta Header', () => { + it('gets hidden when close button is clicked', () => { + const { queryByTestId } = renderWithProvider(, store); + + const closeButton = queryByTestId('beta-header-close'); + fireEvent.click(closeButton); + + expect(mockHideBetaHeader).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/ui/components/app/beta-header/index.js b/ui/components/app/beta-header/index.js new file mode 100644 index 000000000000..dd1884339439 --- /dev/null +++ b/ui/components/app/beta-header/index.js @@ -0,0 +1,59 @@ +import React from 'react'; +import { useI18nContext } from '../../../hooks/useI18nContext'; + +import Box from '../../ui/box/box'; +import Typography from '../../ui/typography/typography'; +import { + TYPOGRAPHY, + COLORS, + BLOCK_SIZES, + DISPLAY, +} from '../../../helpers/constants/design-system'; +import { BETA_BUGS_URL } from '../../../helpers/constants/beta'; + +import { hideBetaHeader } from '../../../store/actions'; + +const BetaHeader = () => { + const t = useI18nContext(); + + return ( + + + {t('betaHeaderText', [ + + {t('here')} + , + ])} + + + + ); +}; + +export default BetaHeader; diff --git a/ui/components/app/beta-header/index.scss b/ui/components/app/beta-header/index.scss new file mode 100644 index 000000000000..6d143af97db2 --- /dev/null +++ b/ui/components/app/beta-header/index.scss @@ -0,0 +1,16 @@ +.beta-header { + &__message { + text-align: center; + flex-grow: 1; + } + + &__button { + background: transparent; + padding: 0 6px; + margin: 0; + + i { + color: var(--color-warning-inverse); + } + } +} diff --git a/ui/components/app/collectible-details/collectible-details.js b/ui/components/app/collectible-details/collectible-details.js index f824a3814e89..213eeb353706 100644 --- a/ui/components/app/collectible-details/collectible-details.js +++ b/ui/components/app/collectible-details/collectible-details.js @@ -30,8 +30,8 @@ import Copy from '../../ui/icon/copy-icon.component'; import { getCollectibleContracts } from '../../../ducks/metamask/metamask'; import { DEFAULT_ROUTE, SEND_ROUTE } from '../../../helpers/constants/routes'; import { - checkAndUpdateSingleCollectibleOwnershipStatus, - removeAndIgnoreCollectible, + checkAndUpdateSingleNftOwnershipStatus, + removeAndIgnoreNft, } from '../../../store/actions'; import { CHAIN_IDS } from '../../../../shared/constants/network'; import { getEnvironmentType } from '../../../../app/scripts/lib/util'; @@ -79,14 +79,14 @@ export default function CollectibleDetails({ collectible }) { ); const onRemove = () => { - dispatch(removeAndIgnoreCollectible(address, tokenId)); + dispatch(removeAndIgnoreNft(address, tokenId)); history.push(DEFAULT_ROUTE); }; const prevCollectible = usePrevious(collectible); useEffect(() => { if (!isEqual(prevCollectible, collectible)) { - checkAndUpdateSingleCollectibleOwnershipStatus(collectible); + checkAndUpdateSingleNftOwnershipStatus(collectible); } }, [collectible, prevCollectible]); @@ -97,9 +97,6 @@ export default function CollectibleDetails({ collectible }) { case CHAIN_IDS.POLYGON: return `https://opensea.io/assets/matic/${address}/${tokenId}`; case CHAIN_IDS.GOERLI: - case CHAIN_IDS.KOVAN: - case CHAIN_IDS.ROPSTEN: - case CHAIN_IDS.RINKEBY: case CHAIN_IDS.SEPOLIA: return `https://testnets.opensea.io/assets/${address}/${tokenId}`; default: @@ -114,7 +111,7 @@ export default function CollectibleDetails({ collectible }) { const onSend = async () => { await dispatch( startNewDraftTransaction({ - type: ASSET_TYPES.COLLECTIBLE, + type: ASSET_TYPES.NFT, details: collectible, }), ); diff --git a/ui/components/app/collectibles-tab/collectibles-tab.js b/ui/components/app/collectibles-tab/collectibles-tab.js index 6b7c748433cf..3f228f0abde9 100644 --- a/ui/components/app/collectibles-tab/collectibles-tab.js +++ b/ui/components/app/collectibles-tab/collectibles-tab.js @@ -18,17 +18,17 @@ import { } from '../../../helpers/constants/design-system'; import { useI18nContext } from '../../../hooks/useI18nContext'; import { getCollectiblesDetectionNoticeDismissed } from '../../../ducks/metamask/metamask'; -import { getIsMainnet, getUseCollectibleDetection } from '../../../selectors'; +import { getIsMainnet, getUseNftDetection } from '../../../selectors'; import { EXPERIMENTAL_ROUTE } from '../../../helpers/constants/routes'; import { - checkAndUpdateAllCollectiblesOwnershipStatus, - detectCollectibles, + checkAndUpdateAllNftsOwnershipStatus, + detectNfts, } from '../../../store/actions'; import { useCollectiblesCollections } from '../../../hooks/useCollectiblesCollections'; import ZENDESK_URLS from '../../../helpers/constants/zendesk-url'; export default function CollectiblesTab({ onAddNFT }) { - const useCollectibleDetection = useSelector(getUseCollectibleDetection); + const useNftDetection = useSelector(getUseNftDetection); const isMainnet = useSelector(getIsMainnet); const collectibleDetectionNoticeDismissed = useSelector( getCollectiblesDetectionNoticeDismissed, @@ -46,9 +46,9 @@ export default function CollectiblesTab({ onAddNFT }) { const onRefresh = () => { if (isMainnet) { - dispatch(detectCollectibles()); + dispatch(detectNfts()); } - checkAndUpdateAllCollectiblesOwnershipStatus(); + checkAndUpdateAllNftsOwnershipStatus(); }; if (collectiblesLoading) { @@ -66,7 +66,7 @@ export default function CollectiblesTab({ onAddNFT }) { ) : ( <> {isMainnet && - !useCollectibleDetection && + !useNftDetection && !collectibleDetectionNoticeDismissed ? ( ) : null} @@ -123,7 +123,7 @@ export default function CollectiblesTab({ onAddNFT }) { className="collectibles-tab__link" justifyContent={JUSTIFY_CONTENT.FLEX_END} > - {isMainnet && !useCollectibleDetection ? ( + {isMainnet && !useNftDetection ? ( diff --git a/ui/components/app/collectibles-tab/collectibles-tab.test.js b/ui/components/app/collectibles-tab/collectibles-tab.test.js index 4d9494b88ed9..e9d10278d68f 100644 --- a/ui/components/app/collectibles-tab/collectibles-tab.test.js +++ b/ui/components/app/collectibles-tab/collectibles-tab.test.js @@ -150,17 +150,17 @@ const render = ({ selectedAddress, chainId = '0x1', collectiblesDetectionNoticeDismissed = false, - useCollectibleDetection, + useNftDetection, onAddNFT = jest.fn(), }) => { const store = configureStore({ metamask: { - allCollectibles: { + allNfts: { [ACCOUNT_1]: { [chainId]: collectibles, }, }, - allCollectibleContracts: { + allNftContracts: { [ACCOUNT_1]: { [chainId]: collectibleContracts, }, @@ -168,7 +168,7 @@ const render = ({ provider: { chainId }, selectedAddress, collectiblesDetectionNoticeDismissed, - useCollectibleDetection, + useNftDetection, collectiblesDropdownState, }, }); @@ -184,9 +184,9 @@ describe('Collectible Items', () => { setBackgroundConnection({ setCollectiblesDetectionNoticeDismissed: setCollectiblesDetectionNoticeDismissedStub, - detectCollectibles: detectCollectiblesStub, + detectNfts: detectCollectiblesStub, getState: getStateStub, - checkAndUpdateAllCollectiblesOwnershipStatus: + checkAndUpdateAllNftsOwnershipStatus: checkAndUpdateAllCollectiblesOwnershipStatusStub, updateCollectibleDropDownState: updateCollectibleDropDownStateStub, }); @@ -231,7 +231,7 @@ describe('Collectible Items', () => { render({ selectedAddress: ACCOUNT_1, collectibles: COLLECTIBLES, - useCollectibleDetection: true, + useNftDetection: true, }); expect(screen.queryByText('New! NFT detection')).not.toBeInTheDocument(); }); @@ -284,7 +284,7 @@ describe('Collectible Items', () => { render({ selectedAddress: ACCOUNT_1, collectibles: COLLECTIBLES, - useCollectibleDetection: true, + useNftDetection: true, }); expect(detectCollectiblesStub).not.toHaveBeenCalled(); expect( @@ -299,10 +299,10 @@ describe('Collectible Items', () => { it('should render a link "Refresh list" when some collectibles are present on a non-mainnet chain, which, when clicked calls a method checkAndUpdateCollectiblesOwnershipStatus', () => { render({ - chainId: '0x4', + chainId: '0x5', selectedAddress: ACCOUNT_1, collectibles: COLLECTIBLES, - useCollectibleDetection: true, + useNftDetection: true, }); expect( checkAndUpdateAllCollectiblesOwnershipStatusStub, diff --git a/ui/components/app/confirm-page-container/confirm-detail-row/confirm-detail-row.component.test.js b/ui/components/app/confirm-page-container/confirm-detail-row/confirm-detail-row.component.test.js index be68c56d905a..52c795265bc6 100644 --- a/ui/components/app/confirm-page-container/confirm-detail-row/confirm-detail-row.component.test.js +++ b/ui/components/app/confirm-page-container/confirm-detail-row/confirm-detail-row.component.test.js @@ -9,7 +9,7 @@ describe('Confirm Detail Row Component', () => { metamask: { provider: { type: 'rpc', - chainId: '0x4', + chainId: '0x5', }, preferences: { useNativeCurrencyAsPrimaryCurrency: true, diff --git a/ui/components/app/confirm-page-container/confirm-page-container-container.test.js b/ui/components/app/confirm-page-container/confirm-page-container-container.test.js index 32a8a46ca050..7964f06455b3 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-container.test.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-container.test.js @@ -32,7 +32,7 @@ describe('Confirm Page Container Container Test', () => { id: 8783053010106567, time: 1656448479005, status: 'unapproved', - metamaskNetworkId: '4', + metamaskNetworkId: '5', originalGasEstimate: '0x5208', userEditedGasLimit: false, loadingDefaults: false, @@ -92,7 +92,7 @@ describe('Confirm Page Container Container Test', () => { expect(senderRecipient).toBeInTheDocument(); }); it('should render recipient as address', () => { - const recipientName = screen.queryByText(shortenAddress(props.toAddress)); + const recipientName = screen.queryByText('New contract'); expect(recipientName).toBeInTheDocument(); }); @@ -118,13 +118,13 @@ describe('Confirm Page Container Container Test', () => { describe('Contact/AddressBook name should appear in recipient header', () => { it('should not show add to address dialog if recipient is in contact list and should display contact name', () => { - const addressBookName = 'test save name'; + const addressBookName = 'New contract'; const addressBook = { - '0x4': { + '0x5': { '0x7a1A4Ad9cc746a70ee58568466f7996dD0aCE4E8': { address: '0x7a1A4Ad9cc746a70ee58568466f7996dD0aCE4E8', - chainId: '0x4', + chainId: '054', isEns: false, memo: '', name: addressBookName, diff --git a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js index be48015a56fc..98b0f91abc98 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-content/confirm-page-container-content.component.js @@ -9,7 +9,7 @@ import ErrorMessage from '../../../ui/error-message'; import { INSUFFICIENT_FUNDS_ERROR_KEY } from '../../../../helpers/constants/error-keys'; import Typography from '../../../ui/typography'; import { TYPOGRAPHY } from '../../../../helpers/constants/design-system'; -import { TRANSACTION_TYPES } from '../../../../../shared/constants/transaction'; +import DepositPopover from '../../deposit-popover/deposit-popover'; import { ConfirmPageContainerSummary, ConfirmPageContainerWarning } from '.'; @@ -50,15 +50,17 @@ export default class ConfirmPageContainerContent extends Component { hideTitle: PropTypes.bool, supportsEIP1559V2: PropTypes.bool, hasTopBorder: PropTypes.bool, - currentTransaction: PropTypes.object, nativeCurrency: PropTypes.string, networkName: PropTypes.string, - showBuyModal: PropTypes.func, toAddress: PropTypes.string, transactionType: PropTypes.string, isBuyableChain: PropTypes.bool, }; + state = { + setShowDepositPopover: false, + }; + renderContent() { const { detailsComponent, dataComponent } = this.props; @@ -102,9 +104,11 @@ export default class ConfirmPageContainerContent extends Component { > {detailsComponent} - - {dataComponent} - + {dataComponent && ( + + {dataComponent} + + )} {dataHexComponent && ( {this.renderContent()} - {!supportsEIP1559V2 && - (errorKey || errorMessage) && - currentTransaction.type !== TRANSACTION_TYPES.SIMPLE_SEND && ( -
    - -
    - )} + {!supportsEIP1559V2 && (errorKey || errorMessage) && ( +
    + +
    + )} {showInsuffienctFundsError && (
    + this.setState({ setShowDepositPopover: true }) + } key={`${nativeCurrency}-buy-button`} > {t('buyAsset', [nativeCurrency])} @@ -239,7 +243,11 @@ export default class ConfirmPageContainerContent extends Component { />
    )} - + {setShowDepositPopover && ( + this.setState({ setShowDepositPopover: false })} + /> + )} { metamask: { provider: { type: 'test', - chainId: '0x3', + chainId: '0x5', }, eip1559V2Enabled: false, addressBook: { - '0x3': { + '0x5': { '0x06195827297c7A80a443b6894d3BDB8824b43896': { address: '0x06195827297c7A80a443b6894d3BDB8824b43896', name: 'Address Book Account 1', - chainId: '0x3', + chainId: '0x5', }, }, }, diff --git a/ui/components/app/confirm-page-container/confirm-page-container-header/__snapshots__/confirm-page-container-header.component.test.js.snap b/ui/components/app/confirm-page-container/confirm-page-container-header/__snapshots__/confirm-page-container-header.component.test.js.snap index 9129dba7e844..80aeb929fb86 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-header/__snapshots__/confirm-page-container-header.component.test.js.snap +++ b/ui/components/app/confirm-page-container/confirm-page-container-header/__snapshots__/confirm-page-container-header.component.test.js.snap @@ -26,6 +26,7 @@ exports[`Confirm Detail Row Component should match snapshot 1`] = ` Edit diff --git a/ui/components/app/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.js b/ui/components/app/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.js index 1477e309bee8..40a9f35194a9 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.js @@ -56,6 +56,7 @@ export default function ConfirmPageContainerHeader({ > onEdit()} > diff --git a/ui/components/app/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.test.js b/ui/components/app/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.test.js index 8096c85810e0..6f06f540cac7 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.test.js +++ b/ui/components/app/confirm-page-container/confirm-page-container-header/confirm-page-container-header.component.test.js @@ -17,7 +17,7 @@ describe('Confirm Detail Row Component', () => { metamask: { provider: { type: 'rpc', - chainId: '0x4', + chainId: '0x5', }, }, }; diff --git a/ui/components/app/confirm-page-container/confirm-page-container.component.js b/ui/components/app/confirm-page-container/confirm-page-container.component.js index 35905c940676..c43233232328 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container.component.js +++ b/ui/components/app/confirm-page-container/confirm-page-container.component.js @@ -28,6 +28,7 @@ import Typography from '../../ui/typography'; import { TYPOGRAPHY } from '../../../helpers/constants/design-system'; import NetworkAccountBalanceHeader from '../network-account-balance-header/network-account-balance-header'; +import DepositPopover from '../deposit-popover/deposit-popover'; import EnableEIP1559V2Notice from './enableEIP1559V2-notice'; import { ConfirmPageContainerHeader, @@ -38,6 +39,7 @@ import { export default class ConfirmPageContainer extends Component { state = { showNicknamePopovers: false, + setShowDepositPopover: false, }; static contextTypes = { @@ -63,6 +65,7 @@ export default class ConfirmPageContainer extends Component { fromName: PropTypes.string, toAddress: PropTypes.string, toName: PropTypes.string, + toMetadataName: PropTypes.string, toEns: PropTypes.string, toNickname: PropTypes.string, // Content @@ -106,9 +109,8 @@ export default class ConfirmPageContainer extends Component { isOwnedAccount: PropTypes.bool, supportsEIP1559V2: PropTypes.bool, nativeCurrency: PropTypes.string, - showBuyModal: PropTypes.func, isBuyableChain: PropTypes.bool, - setApproveForAllArg: PropTypes.bool, + isApprovalOrRejection: PropTypes.bool, }; render() { @@ -118,6 +120,7 @@ export default class ConfirmPageContainer extends Component { fromName, fromAddress, toName, + toMetadataName, toEns, toNickname, toAddress, @@ -162,10 +165,9 @@ export default class ConfirmPageContainer extends Component { isOwnedAccount, supportsEIP1559V2, nativeCurrency, - showBuyModal, isBuyableChain, networkIdentifier, - setApproveForAllArg, + isApprovalOrRejection, ///: BEGIN:ONLY_INCLUDE_IN(flask) insightComponent, ///: END:ONLY_INCLUDE_IN @@ -191,6 +193,8 @@ export default class ConfirmPageContainer extends Component { currentTransaction.type === TRANSACTION_TYPES.TOKEN_METHOD_SET_APPROVAL_FOR_ALL; + const { setShowDepositPopover } = this.state; + const { t } = this.context; return ( @@ -217,6 +221,7 @@ export default class ConfirmPageContainer extends Component { tokenName={nativeCurrency} accountAddress={fromAddress} networkName={networkName} + chainId={currentTransaction.chainId} /> ) : ( + this.setState({ setShowDepositPopover: true }) + } key={`${nativeCurrency}-buy-button`} > {t('buyAsset', [nativeCurrency])} @@ -334,12 +341,17 @@ export default class ConfirmPageContainer extends Component { /> )} + {setShowDepositPopover && ( + this.setState({ setShowDepositPopover: false })} + /> + )} {shouldDisplayWarning && errorKey !== INSUFFICIENT_FUNDS_ERROR_KEY && (
    )} - {isSetApproveForAll && setApproveForAllArg && ( + {isSetApproveForAll && isApprovalOrRejection && ( {/* TODO: https://github.com/MetaMask/metamask-extension/issues/15745 diff --git a/ui/components/app/confirm-page-container/confirm-page-container.container.js b/ui/components/app/confirm-page-container/confirm-page-container.container.js index 567192cb1645..0ce2790fc55b 100644 --- a/ui/components/app/confirm-page-container/confirm-page-container.container.js +++ b/ui/components/app/confirm-page-container/confirm-page-container.container.js @@ -5,8 +5,10 @@ import { getIsBuyableChain, getNetworkIdentifier, getSwapsDefaultToken, + getMetadataContractName, + getAccountName, + getMetaMaskIdentities, } from '../../../selectors'; -import { showModal } from '../../../store/actions'; import ConfirmPageContainer from './confirm-page-container.component'; function mapStateToProps(state, ownProps) { @@ -16,11 +18,15 @@ function mapStateToProps(state, ownProps) { const networkIdentifier = getNetworkIdentifier(state); const defaultToken = getSwapsDefaultToken(state); const accountBalance = defaultToken.string; + const identities = getMetaMaskIdentities(state); + const toName = getAccountName(identities, to); + const toMetadataName = getMetadataContractName(state, to); return { isBuyableChain, contact, - toName: contact?.name || ownProps.toName, + toName, + toMetadataName, isOwnedAccount: getAccountsWithLabels(state) .map((accountWithLabel) => accountWithLabel.address) .includes(to), @@ -30,13 +36,4 @@ function mapStateToProps(state, ownProps) { }; } -const mapDispatchToProps = (dispatch) => { - return { - showBuyModal: () => dispatch(showModal({ name: 'DEPOSIT_ETHER' })), - }; -}; - -export default connect( - mapStateToProps, - mapDispatchToProps, -)(ConfirmPageContainer); +export default connect(mapStateToProps)(ConfirmPageContainer); diff --git a/ui/components/app/confirm-page-container/flask/index.scss b/ui/components/app/confirm-page-container/flask/index.scss index cd027f79c5eb..aff8fd2a482c 100644 --- a/ui/components/app/confirm-page-container/flask/index.scss +++ b/ui/components/app/confirm-page-container/flask/index.scss @@ -1,3 +1,8 @@ .snap-insight { word-wrap: break-word; + + &__container__data__json { + word-wrap: break-word; + overflow-x: auto; + } } diff --git a/ui/components/app/confirm-page-container/flask/snap-insight.js b/ui/components/app/confirm-page-container/flask/snap-insight.js index 1567763dd1db..30c21776dd33 100644 --- a/ui/components/app/confirm-page-container/flask/snap-insight.js +++ b/ui/components/app/confirm-page-container/flask/snap-insight.js @@ -15,10 +15,15 @@ import { useI18nContext } from '../../../../hooks/useI18nContext'; import { useTransactionInsightSnap } from '../../../../hooks/flask/useTransactionInsightSnap'; import SnapContentFooter from '../../flask/snap-content-footer/snap-content-footer'; import Box from '../../../ui/box/box'; +import ActionableMessage from '../../../ui/actionable-message/actionable-message'; export const SnapInsight = ({ transaction, chainId, selectedSnap }) => { const t = useI18nContext(); - const response = useTransactionInsightSnap({ + const { + data: response, + error, + loading, + } = useTransactionInsightSnap({ transaction, chainId, snapId: selectedSnap.id, @@ -26,8 +31,8 @@ export const SnapInsight = ({ transaction, chainId, selectedSnap }) => { const data = response?.insights; - const hasNoData = !data || !Object.keys(data).length; - + const hasNoData = + !error && (loading || !data || (data && Object.keys(data).length === 0)); return ( { textAlign={hasNoData && TEXT_ALIGN.CENTER} className="snap-insight" > - {data ? ( + {!loading && !error && ( - {Object.keys(data).length ? ( + {data && Object.keys(data).length > 0 ? ( <> { > {key} - {data[key]} + + {typeof data[key] === 'string' ? ( + + {data[key]} + + ) : ( + + +
    {JSON.stringify(data[key], null, 2)}
    +
    +
    + )} ))}
    @@ -79,7 +99,29 @@ export const SnapInsight = ({ transaction, chainId, selectedSnap }) => { )}
    - ) : ( + )} + + {!loading && error && ( + + + + )} + + {loading && ( <> +
    +
    +
    + +
    + USD +
    +
    +
    + + + 0.00432788 + + + ETH + +
    +
    + +
    + +`; + +exports[`CurrencyInput Component rendering should render properly with a native value when hideSecondary is true 1`] = ` +
    +
    +
    +
    + +
    + ETH +
    +
    +
    + No conversion rate available +
    +
    + +
    +
    +`; + +exports[`CurrencyInput Component rendering should render properly with an ETH value 1`] = ` +
    +
    +
    +
    + +
    + ETH +
    +
    +
    + + + $231.06 + + + USD + +
    +
    + +
    +
    +`; + +exports[`CurrencyInput Component rendering should render properly without a suffix 1`] = ` +
    +
    +
    +
    + +
    + ETH +
    +
    +
    + + + $0.00 + + + USD + +
    +
    + +
    +
    +`; diff --git a/ui/components/app/currency-input/currency-input.js b/ui/components/app/currency-input/currency-input.js index df8e85660512..a822a9db9336 100644 --- a/ui/components/app/currency-input/currency-input.js +++ b/ui/components/app/currency-input/currency-input.js @@ -146,11 +146,16 @@ export default function CurrencyInput({ onChange, onPreferenceToggle, }} + dataTestId="currency-input" suffix={shouldUseFiat ? secondarySuffix : primarySuffix} onChange={handleChange} value={initialDecimalValue} actionComponent={ - } diff --git a/ui/components/app/currency-input/currency-input.test.js b/ui/components/app/currency-input/currency-input.test.js index 0b452307d194..3fd1c9cf2db3 100644 --- a/ui/components/app/currency-input/currency-input.test.js +++ b/ui/components/app/currency-input/currency-input.test.js @@ -1,344 +1,160 @@ import React from 'react'; -import PropTypes from 'prop-types'; -import { mount } from 'enzyme'; -import sinon from 'sinon'; -import { Provider } from 'react-redux'; import configureMockStore from 'redux-mock-store'; -import UnitInput from '../../ui/unit-input'; -import CurrencyDisplay from '../../ui/currency-display'; -import CurrencyInput from './currency-input'; +import { fireEvent, waitFor } from '@testing-library/react'; +import { renderWithProvider } from '../../../../test/lib/render-helpers'; +import CurrencyInput from '.'; describe('CurrencyInput Component', () => { + const mockStore = { + metamask: { + nativeCurrency: 'ETH', + currentCurrency: 'usd', + conversionRate: 231.06, + provider: { + chainId: '0x5', + }, + preferences: { + showFiatInTestnets: true, + }, + }, + }; describe('rendering', () => { it('should render properly without a suffix', () => { - const mockStore = { - metamask: { - nativeCurrency: 'ETH', - currentCurrency: 'usd', - conversionRate: 231.06, - provider: { - chainId: '0x4', - }, - preferences: { - showFiatInTestnets: true, - }, - }, - }; - const store = configureMockStore()(mockStore); - const wrapper = mount( - - - , - ); - - expect(wrapper).toHaveLength(1); - expect(wrapper.find(UnitInput)).toHaveLength(1); - }); - - it('should render properly with a suffix', () => { - const mockStore = { - metamask: { - nativeCurrency: 'ETH', - currentCurrency: 'usd', - conversionRate: 231.06, - provider: { - chainId: '0x4', - }, - preferences: { - showFiatInTestnets: true, - }, - }, - }; const store = configureMockStore()(mockStore); - const wrapper = mount( - - - , - ); + const { container } = renderWithProvider(, store); - expect(wrapper).toHaveLength(1); - expect(wrapper.find('.unit-input__suffix')).toHaveLength(1); - expect(wrapper.find('.unit-input__suffix').text()).toStrictEqual('ETH'); - expect(wrapper.find(CurrencyDisplay)).toHaveLength(1); + expect(container).toMatchSnapshot(); }); it('should render properly with an ETH value', () => { - const mockStore = { - metamask: { - nativeCurrency: 'ETH', - currentCurrency: 'usd', - conversionRate: 231.06, - provider: { - chainId: '0x4', - }, - preferences: { - showFiatInTestnets: true, - }, - }, - }; const store = configureMockStore()(mockStore); - const wrapper = mount( - - - , - ); + const props = { + hexValue: 'de0b6b3a7640000', + }; - expect(wrapper).toHaveLength(1); - expect(wrapper.find('.unit-input__suffix')).toHaveLength(1); - expect(wrapper.find('.unit-input__suffix').text()).toStrictEqual('ETH'); - expect(wrapper.find('.unit-input__input').props().value).toStrictEqual(1); - expect(wrapper.find('.currency-display-component').text()).toStrictEqual( - '$231.06USD', + const { container } = renderWithProvider( + , + store, ); + + expect(container).toMatchSnapshot(); }); it('should render properly with a fiat value', () => { - const mockStore = { - metamask: { - nativeCurrency: 'ETH', - currentCurrency: 'usd', - conversionRate: 231.06, - provider: { - chainId: '0x4', - }, - preferences: { - showFiatInTestnets: true, - }, - }, - }; const store = configureMockStore()(mockStore); - const handleChangeSpy = sinon.spy(); - - const wrapper = mount( - - - , - ); - expect(wrapper).toHaveLength(1); - expect(wrapper.find('.unit-input__suffix')).toHaveLength(1); - expect(wrapper.find('.unit-input__suffix').text()).toStrictEqual('USD'); - expect(wrapper.find('.unit-input__input').props().value).toStrictEqual(1); - expect(wrapper.find('.currency-display-component').text()).toStrictEqual( - '0.00432788ETH', + const props = { + onChange: jest.fn(), + hexValue: 'f602f2234d0ea', + featureSecondary: true, + }; + + const { container } = renderWithProvider( + , + store, ); + + expect(container).toMatchSnapshot(); }); it('should render properly with a native value when hideSecondary is true', () => { - const mockStore = { + const hideSecondaryState = { metamask: { - nativeCurrency: 'ETH', - currentCurrency: 'usd', - conversionRate: 231.06, - provider: { - chainId: '0x4', - }, + ...mockStore.metamask, preferences: { showFiatInTestnets: false, }, + hideSecondary: true, }, - hideSecondary: true, }; - const store = configureMockStore()(mockStore); - const handleChangeSpy = sinon.spy(); - - const wrapper = mount( - - - , - { - context: { t: (str) => `${str}_t` }, - childContextTypes: { t: PropTypes.func }, - }, - ); - expect(wrapper).toHaveLength(1); - expect(wrapper.find('.unit-input__suffix')).toHaveLength(1); - expect(wrapper.find('.unit-input__suffix').text()).toStrictEqual('ETH'); - expect(wrapper.find('.unit-input__input').props().value).toStrictEqual( - 0.00432788, + const store = configureMockStore()(hideSecondaryState); + + const props = { + onChange: jest.fn(), + hexValue: 'f602f2234d0ea', + featureSecondary: true, + }; + + const { container } = renderWithProvider( + , + store, ); - expect( - wrapper.find('.currency-input__conversion-component').text(), - ).toStrictEqual('[noConversionRateAvailable]'); + + expect(container).toMatchSnapshot(); }); }); describe('handling actions', () => { - const handleChangeSpy = sinon.spy(); - const handleBlurSpy = sinon.spy(); - const handleChangeToggle = sinon.spy(); - - afterEach(() => { - handleChangeSpy.resetHistory(); - handleBlurSpy.resetHistory(); - handleChangeToggle.resetHistory(); - }); - it('should call onChange on input changes with the hex value for ETH', () => { - const mockStore = { - metamask: { - nativeCurrency: 'ETH', - currentCurrency: 'usd', - conversionRate: 231.06, - provider: { - chainId: '0x4', - }, - preferences: { - showFiatInTestnets: true, - }, - }, - }; const store = configureMockStore()(mockStore); - const wrapper = mount( - - - , + + const props = { + onChange: jest.fn(), + hexValue: 'f602f2234d0ea', + }; + + const { queryByTestId, queryByTitle } = renderWithProvider( + , + store, ); - expect(wrapper).toHaveLength(1); - expect(handleChangeSpy.callCount).toStrictEqual(0); - expect(handleBlurSpy.callCount).toStrictEqual(0); + const currencyInput = queryByTestId('currency-input'); - const input = wrapper.find('input'); - expect(input.props().value).toStrictEqual(0.00432788); + fireEvent.change(currencyInput, { target: { value: 1 } }); - input.simulate('change', { target: { value: 1 } }); - expect(handleChangeSpy.callCount).toStrictEqual(1); - expect(handleChangeSpy.calledWith('de0b6b3a7640000')).toStrictEqual(true); - expect(wrapper.find('.currency-display-component').text()).toStrictEqual( - '$231.06USD', - ); + expect(props.onChange).toHaveBeenCalledWith('de0b6b3a7640000'); + expect(queryByTitle('$231.06 USD')).toBeInTheDocument(); }); it('should call onChange on input changes with the hex value for fiat', () => { - const mockStore = { - metamask: { - nativeCurrency: 'ETH', - currentCurrency: 'usd', - conversionRate: 231.06, - provider: { - chainId: '0x4', - }, - preferences: { - showFiatInTestnets: true, - }, - }, - }; const store = configureMockStore()(mockStore); - const wrapper = mount( - - - , - ); - expect(wrapper).toHaveLength(1); - expect(handleChangeSpy.callCount).toStrictEqual(1); - expect(handleBlurSpy.callCount).toStrictEqual(0); + const props = { + onChange: jest.fn(), + hexValue: 'f602f2234d0ea', + featureSecondary: true, + }; - expect(wrapper.find('.currency-display-component').text()).toStrictEqual( - '0ETH', - ); - const input = wrapper.find('input'); - expect(input.props().value).toStrictEqual(0); - - input.simulate('change', { target: { value: 1 } }); - expect(handleChangeSpy.callCount).toStrictEqual(2); - expect(handleChangeSpy.calledWith('f602f2234d0ea')).toStrictEqual(true); - expect(wrapper.find('.currency-display-component').text()).toStrictEqual( - '0.00432788ETH', + const { queryByTestId, queryByTitle } = renderWithProvider( + , + store, ); - }); - it('should change the state and pass in a new decimalValue when props.value changes', () => { - const mockStore = { - metamask: { - nativeCurrency: 'ETH', - currentCurrency: 'usd', - conversionRate: 231.06, - provider: { - chainId: '0x4', - }, - preferences: { - showFiatInTestnets: true, - }, - }, - }; - const store = configureMockStore()(mockStore); - const wrapper = mount( - - - , - ); + const currencyInput = queryByTestId('currency-input'); - expect(wrapper).toHaveLength(1); - const input = wrapper.find('input'); - expect(input.props().value).toStrictEqual(0); + fireEvent.change(currencyInput, { target: { value: 1 } }); - wrapper.setProps({ hexValue: '1ec05e43e72400' }); - input.update(); - expect(input.props().value).toStrictEqual(0); + expect(props.onChange).toHaveBeenCalledWith('f602f2234d0ea'); + expect(queryByTitle('0.00432788 ETH')).toBeInTheDocument(); }); - it('should swap selected currency when swap icon is clicked', () => { - const mockStore = { - metamask: { - nativeCurrency: 'ETH', - currentCurrency: 'usd', - conversionRate: 231.06, - provider: { - chainId: '0x4', - }, - preferences: { - showFiatInTestnets: true, - }, - }, - }; + it('should swap selected currency when swap icon is clicked', async () => { const store = configureMockStore()(mockStore); - const wrapper = mount( - - - , + const props = { + onChange: jest.fn(), + onPreferenceToggle: jest.fn(), + featureSecondary: true, + }; + + const { queryByTestId, queryByTitle } = renderWithProvider( + , + store, ); - expect(wrapper).toHaveLength(1); - expect(handleChangeSpy.callCount).toStrictEqual(1); - expect(handleBlurSpy.callCount).toStrictEqual(0); + const currencyInput = queryByTestId('currency-input'); + fireEvent.change(currencyInput, { target: { value: 1 } }); - expect(wrapper.find('.currency-display-component').text()).toStrictEqual( - '0ETH', - ); - const input = wrapper.find('input'); - expect(input.props().value).toStrictEqual(0); + expect(queryByTitle('0.00432788 ETH')).toBeInTheDocument(); - input.simulate('change', { target: { value: 1 } }); - expect(handleChangeSpy.callCount).toStrictEqual(2); - expect(handleChangeSpy.calledWith('de0b6b3a7640000')).toStrictEqual( - false, - ); - expect(wrapper.find('.currency-display-component').text()).toStrictEqual( - '0.00432788ETH', - ); + const currencySwap = queryByTestId('currency-swap'); + fireEvent.click(currencySwap); - const swap = wrapper.find('.currency-input__swap-component'); - swap.simulate('click'); - expect(wrapper.find('.currency-display-component').text()).toStrictEqual( - '0.00432788ETH', - ); + await waitFor(() => { + expect(queryByTitle('$1.00 USD')).toBeInTheDocument(); + }); }); }); }); diff --git a/ui/components/app/custom-spending-cap/custom-spending-cap-tooltip.js b/ui/components/app/custom-spending-cap/custom-spending-cap-tooltip.js new file mode 100644 index 000000000000..438b66d01d33 --- /dev/null +++ b/ui/components/app/custom-spending-cap/custom-spending-cap-tooltip.js @@ -0,0 +1,43 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Box from '../../ui/box'; +import Typography from '../../ui/typography'; +import Tooltip from '../../ui/tooltip'; +import { + COLORS, + DISPLAY, + TYPOGRAPHY, +} from '../../../helpers/constants/design-system'; + +export const CustomSpendingCapTooltip = ({ + tooltipContentText, + tooltipIcon, +}) => ( + + + {tooltipContentText} +
    + } + > + {tooltipIcon ? ( + + ) : ( + tooltipIcon !== '' && + )} + +
    +); + +CustomSpendingCapTooltip.propTypes = { + tooltipContentText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), + tooltipIcon: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), +}; diff --git a/ui/components/app/custom-spending-cap/custom-spending-cap.js b/ui/components/app/custom-spending-cap/custom-spending-cap.js new file mode 100644 index 000000000000..9afedc0b5851 --- /dev/null +++ b/ui/components/app/custom-spending-cap/custom-spending-cap.js @@ -0,0 +1,228 @@ +import React, { useState, useContext, useEffect } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import PropTypes from 'prop-types'; +import { I18nContext } from '../../../contexts/i18n'; +import Box from '../../ui/box'; +import FormField from '../../ui/form-field'; +import Typography from '../../ui/typography'; +import { + ALIGN_ITEMS, + COLORS, + DISPLAY, + FLEX_DIRECTION, + TEXT_ALIGN, + FONT_WEIGHT, + TYPOGRAPHY, + JUSTIFY_CONTENT, + SIZES, +} from '../../../helpers/constants/design-system'; +import { getCustomTokenAmount } from '../../../selectors'; +import { setCustomTokenAmount } from '../../../ducks/app/app'; +import { CustomSpendingCapTooltip } from './custom-spending-cap-tooltip'; + +export default function CustomSpendingCap({ + tokenName, + currentTokenBalance, + dappProposedValue, + siteOrigin, + passTheErrorText, +}) { + const t = useContext(I18nContext); + const dispatch = useDispatch(); + + const value = useSelector(getCustomTokenAmount); + + const [error, setError] = useState(''); + const [showUseDefaultButton, setShowUseDefaultButton] = useState( + value !== String(dappProposedValue) && true, + ); + const inputLogicEmptyStateText = t('inputLogicEmptyState'); + + const getInputTextLogic = (inputNumber) => { + if (inputNumber <= currentTokenBalance) { + return { + className: 'custom-spending-cap__lowerValue', + description: t('inputLogicEqualOrSmallerNumber', [ + + {inputNumber} {tokenName} + , + ]), + }; + } else if (inputNumber > currentTokenBalance) { + return { + className: 'custom-spending-cap__higherValue', + description: t('inputLogicHigherNumber'), + }; + } + return { + className: 'custom-spending-cap__emptyState', + description: t('inputLogicEmptyState'), + }; + }; + + const [customSpendingCapText, setCustomSpendingCapText] = useState( + getInputTextLogic(value).description, + ); + + const handleChange = (valueInput) => { + let spendingCapError = ''; + const inputTextLogic = getInputTextLogic(valueInput); + const inputTextLogicDescription = inputTextLogic.description; + + if (valueInput < 0 || isNaN(valueInput)) { + spendingCapError = t('spendingCapError'); + setCustomSpendingCapText(t('spendingCapErrorDescription', [siteOrigin])); + setError(spendingCapError); + } else { + setCustomSpendingCapText(inputTextLogicDescription); + setError(''); + } + + dispatch(setCustomTokenAmount(String(valueInput))); + }; + + useEffect(() => { + if (value !== String(dappProposedValue)) { + setShowUseDefaultButton(true); + } + }, [value, dappProposedValue]); + + useEffect(() => { + passTheErrorText(error); + }, [error, passTheErrorText]); + + const chooseTooltipContentText = + value > currentTokenBalance + ? t('warningTooltipText', [ + + {t('beCareful')} + , + ]) + : t('inputLogicEmptyState'); + + return ( + <> + + + + + + + + + + ); +} + +CustomSpendingCap.propTypes = { + /** + * Displayed the token name currently tracked in description related to the input state + */ + tokenName: PropTypes.string, + /** + * The current token balance of the token + */ + currentTokenBalance: PropTypes.number, + /** + * The dapp suggested amount + */ + dappProposedValue: PropTypes.number, + /** + * The origin of the site generally the URL + */ + siteOrigin: PropTypes.string, + /** + * Parent component's callback function passed in order to get the error text + */ + passTheErrorText: PropTypes.func, +}; diff --git a/ui/components/app/custom-spending-cap/custom-spending-cap.stories.js b/ui/components/app/custom-spending-cap/custom-spending-cap.stories.js new file mode 100644 index 000000000000..5c30a32e75cd --- /dev/null +++ b/ui/components/app/custom-spending-cap/custom-spending-cap.stories.js @@ -0,0 +1,36 @@ +import React from 'react'; +import CustomSpendingCap from './custom-spending-cap'; + +export default { + title: 'Components/App/CustomSpendingCap', + id: __filename, + argTypes: { + tokenName: { + control: { type: 'text' }, + }, + currentTokenBalance: { + control: { type: 'number' }, + }, + dappProposedValue: { + control: { type: 'number' }, + }, + siteOrigin: { + control: { type: 'text' }, + }, + passTheErrorText: { + action: 'passTheErrorText', + }, + }, + args: { + tokenName: 'DAI', + currentTokenBalance: 200.12, + dappProposedValue: 7, + siteOrigin: 'Uniswap.org', + }, +}; + +export const DefaultStory = (args) => { + return ; +}; + +DefaultStory.storyName = 'Default'; diff --git a/ui/components/app/custom-spending-cap/index.js b/ui/components/app/custom-spending-cap/index.js new file mode 100644 index 000000000000..de5e462b683d --- /dev/null +++ b/ui/components/app/custom-spending-cap/index.js @@ -0,0 +1 @@ +export { default } from './custom-spending-cap'; diff --git a/ui/components/app/custom-spending-cap/index.scss b/ui/components/app/custom-spending-cap/index.scss new file mode 100644 index 000000000000..e2ab68851d98 --- /dev/null +++ b/ui/components/app/custom-spending-cap/index.scss @@ -0,0 +1,38 @@ +.custom-spending-cap { + &__input-value-and-token-name { + display: contents; + } + + &__max-button { + position: relative; + } + + &__input { + width: 100%; + + &--button { + background: none; + color: var(--color-primary-default); + } + + &--max-button { + color: var(--color-text-alternative); + background: none; + position: absolute; + margin-top: 55px; + margin-inline-start: -75px; + z-index: 1; + } + } + + #custom-spending-cap-input-value { + color: var(--color-error-default); + padding-inline-end: 60px; + } + + input[type='number']::-webkit-inner-spin-button, + input[type='number']:hover::-webkit-inner-spin-button { + -webkit-appearance: none; + display: none; + } +} diff --git a/ui/components/app/deposit-popover/deposit-popover.js b/ui/components/app/deposit-popover/deposit-popover.js index 0a0a814bae27..81f1715dcfe7 100644 --- a/ui/components/app/deposit-popover/deposit-popover.js +++ b/ui/components/app/deposit-popover/deposit-popover.js @@ -28,6 +28,8 @@ import { getIsBuyableCoinbasePayChain, getIsBuyableCoinbasePayToken, getIsBuyableTransakToken, + getIsBuyableMoonpayToken, + getIsBuyableWyreToken, } from '../../../selectors/selectors'; import OnRampItem from './on-ramp-item'; @@ -53,6 +55,12 @@ const DepositPopover = ({ onClose, token }) => { const isTokenBuyableTransak = useSelector((state) => getIsBuyableTransakToken(state, token?.symbol), ); + const isTokenBuyableMoonpay = useSelector((state) => + getIsBuyableMoonpayToken(state, token?.symbol), + ); + const isTokenBuyableWyre = useSelector((state) => + getIsBuyableWyreToken(state, token?.symbol), + ); const networkName = NETWORK_TO_NAME_MAP[chainId]; const symbol = token @@ -77,10 +85,12 @@ const DepositPopover = ({ onClose, token }) => { ); }; const toMoonPay = () => { - dispatch(buy({ service: 'moonpay', address, chainId })); + dispatch( + buy({ service: 'moonpay', address, chainId, symbol: token?.symbol }), + ); }; const toWyre = () => { - dispatch(buy({ service: 'wyre', address, chainId })); + dispatch(buy({ service: 'wyre', address, chainId, symbol: token?.symbol })); }; const toFaucet = () => dispatch(buy({ chainId })); @@ -95,113 +105,123 @@ const DepositPopover = ({ onClose, token }) => { title={t('depositCrypto', [symbol])} subtitle={isTokenDeposit ? '' : t('needCryptoInWallet', [symbol])} onClose={onClose} + className="deposit-popover" > - } - title={t('buyCryptoWithCoinbasePay', [symbol])} - text={t('buyCryptoWithCoinbasePayDescription', [symbol])} - buttonLabel={t('continueToCoinbasePay')} - onButtonClick={() => { - trackEvent({ - category: EVENT.CATEGORIES.ACCOUNTS, - event: EVENT_NAMES.ONRAMP_PROVIDER_SELECTED, - properties: { - onramp_provider_type: EVENT.ONRAMP_PROVIDER_TYPES.COINBASE, - }, - }); - toCoinbasePay(); - }} - hide={ - isTokenDeposit - ? !isBuyableCoinbasePayChain || !isTokenBuyableCoinbasePay - : !isBuyableCoinbasePayChain - } - /> - } - title={t('buyCryptoWithTransak', [symbol])} - text={t('buyCryptoWithTransakDescription', [symbol])} - buttonLabel={t('continueToTransak')} - onButtonClick={() => { - trackEvent({ - category: EVENT.CATEGORIES.ACCOUNTS, - event: EVENT_NAMES.ONRAMP_PROVIDER_SELECTED, - properties: { - onramp_provider_type: EVENT.ONRAMP_PROVIDER_TYPES.TRANSAK, - }, - }); - toTransak(); - }} - hide={ - isTokenDeposit - ? !isBuyableTransakChain || !isTokenBuyableTransak - : !isBuyableTransakChain - } - /> - } - title={t('buyCryptoWithMoonPay', [symbol])} - text={t('buyCryptoWithMoonPayDescription', [symbol])} - buttonLabel={t('continueToMoonPay')} - onButtonClick={() => { - trackEvent({ - category: EVENT.CATEGORIES.ACCOUNTS, - event: EVENT_NAMES.ONRAMP_PROVIDER_SELECTED, - properties: { - onramp_provider_type: EVENT.ONRAMP_PROVIDER_TYPES.MOONPAY, - }, - }); - toMoonPay(); - }} - hide={isTokenDeposit || !isBuyableMoonPayChain} - /> - - } - title={t('buyWithWyre', [symbol])} - text={t('buyWithWyreDescription', [symbol])} - buttonLabel={t('continueToWyre')} - onButtonClick={() => { - trackEvent({ - category: EVENT.CATEGORIES.ACCOUNTS, - event: EVENT_NAMES.ONRAMP_PROVIDER_SELECTED, - properties: { - onramp_provider_type: EVENT.ONRAMP_PROVIDER_TYPES.WYRE, - }, - }); - toWyre(); - }} - hide={isTokenDeposit || !isBuyableWyreChain} - /> - - } - title={t('directDepositCrypto', [symbol])} - text={t('directDepositCryptoExplainer', [symbol])} - buttonLabel={t('viewAccount')} - onButtonClick={() => { - trackEvent({ - category: EVENT.CATEGORIES.ACCOUNTS, - event: EVENT_NAMES.ONRAMP_PROVIDER_SELECTED, - properties: { - onramp_provider_type: EVENT.ONRAMP_PROVIDER_TYPES.SELF_DEPOSIT, - }, - }); - goToAccountDetailsModal(); - }} - hide={isTokenDeposit || !isBuyableWyreChain} - /> - - {networkName && ( +
      + } + title={t('buyCryptoWithCoinbasePay', [symbol])} + text={t('buyCryptoWithCoinbasePayDescription', [symbol])} + buttonLabel={t('continueToCoinbasePay')} + onButtonClick={() => { + trackEvent({ + category: EVENT.CATEGORIES.ACCOUNTS, + event: EVENT_NAMES.ONRAMP_PROVIDER_SELECTED, + properties: { + onramp_provider_type: EVENT.ONRAMP_PROVIDER_TYPES.COINBASE, + }, + }); + toCoinbasePay(); + }} + hide={ + isTokenDeposit + ? !isBuyableCoinbasePayChain || !isTokenBuyableCoinbasePay + : !isBuyableCoinbasePayChain + } + /> + } + title={t('buyCryptoWithTransak', [symbol])} + text={t('buyCryptoWithTransakDescription', [symbol])} + buttonLabel={t('continueToTransak')} + onButtonClick={() => { + trackEvent({ + category: EVENT.CATEGORIES.ACCOUNTS, + event: EVENT_NAMES.ONRAMP_PROVIDER_SELECTED, + properties: { + onramp_provider_type: EVENT.ONRAMP_PROVIDER_TYPES.TRANSAK, + }, + }); + toTransak(); + }} + hide={ + isTokenDeposit + ? !isBuyableTransakChain || !isTokenBuyableTransak + : !isBuyableTransakChain + } + /> + } + title={t('buyCryptoWithMoonPay', [symbol])} + text={t('buyCryptoWithMoonPayDescription', [symbol])} + buttonLabel={t('continueToMoonPay')} + onButtonClick={() => { + trackEvent({ + category: EVENT.CATEGORIES.ACCOUNTS, + event: EVENT_NAMES.ONRAMP_PROVIDER_SELECTED, + properties: { + onramp_provider_type: EVENT.ONRAMP_PROVIDER_TYPES.MOONPAY, + }, + }); + toMoonPay(); + }} + hide={ + isTokenDeposit + ? !isBuyableMoonPayChain || !isTokenBuyableMoonpay + : !isBuyableMoonPayChain + } + /> } - title={t('testFaucet')} - text={t('getEtherFromFaucet', [networkName])} - buttonLabel={t('getEther')} - onButtonClick={() => toFaucet()} - hide={!isTestnet} + logo={} + title={t('buyWithWyre', [symbol])} + text={t('buyWithWyreDescription', [symbol])} + buttonLabel={t('continueToWyre')} + onButtonClick={() => { + trackEvent({ + category: EVENT.CATEGORIES.ACCOUNTS, + event: EVENT_NAMES.ONRAMP_PROVIDER_SELECTED, + properties: { + onramp_provider_type: EVENT.ONRAMP_PROVIDER_TYPES.WYRE, + }, + }); + toWyre(); + }} + hide={ + isTokenDeposit + ? !isBuyableWyreChain || !isTokenBuyableWyre + : !isBuyableWyreChain + } /> - )} + + } + title={t('directDepositCrypto', [symbol])} + text={t('directDepositCryptoExplainer', [symbol])} + buttonLabel={t('viewAccount')} + onButtonClick={() => { + trackEvent({ + category: EVENT.CATEGORIES.ACCOUNTS, + event: EVENT_NAMES.ONRAMP_PROVIDER_SELECTED, + properties: { + onramp_provider_type: EVENT.ONRAMP_PROVIDER_TYPES.SELF_DEPOSIT, + }, + }); + goToAccountDetailsModal(); + }} + hide={isTokenDeposit || !isBuyableWyreChain} + /> + + {networkName && ( + } + title={t('testFaucet')} + text={t('getEtherFromFaucet', [networkName])} + buttonLabel={t('getEther')} + onButtonClick={() => toFaucet()} + hide={!isTestnet} + /> + )} +
    ); }; diff --git a/ui/components/app/deposit-popover/index.scss b/ui/components/app/deposit-popover/index.scss new file mode 100644 index 000000000000..df0d11320197 --- /dev/null +++ b/ui/components/app/deposit-popover/index.scss @@ -0,0 +1,16 @@ +.deposit-popover { + min-width: 328px; + max-width: 850px; + + @include screen-md-min { + width: 100% !important; + } + + &__on-ramp-item { + border-bottom: 1px solid var(--color-border-muted); + + &:last-child { + border-bottom: none; + } + } +} diff --git a/ui/components/app/deposit-popover/on-ramp-item.js b/ui/components/app/deposit-popover/on-ramp-item.js index 505253592df2..c80d121e4bb1 100644 --- a/ui/components/app/deposit-popover/on-ramp-item.js +++ b/ui/components/app/deposit-popover/on-ramp-item.js @@ -1,11 +1,19 @@ import React from 'react'; import PropTypes from 'prop-types'; +import classnames from 'classnames'; import Button from '../../ui/button'; import Box from '../../ui/box'; import Typography from '../../ui/typography'; -import { COLORS, FRACTIONS } from '../../../helpers/constants/design-system'; +import { + ALIGN_ITEMS, + DISPLAY, + FLEX_WRAP, + BLOCK_SIZES, + JUSTIFY_CONTENT, +} from '../../../helpers/constants/design-system'; const OnRampItem = ({ + className, logo, title, text, @@ -17,35 +25,50 @@ const OnRampItem = ({ return null; } return ( - + - {logo} - - {title} - - + + + {title} + + {text} + + - {text} - - @@ -56,6 +79,7 @@ const OnRampItem = ({ }; OnRampItem.propTypes = { + className: PropTypes.string, logo: PropTypes.node.isRequired, title: PropTypes.string.isRequired, text: PropTypes.string.isRequired, diff --git a/ui/components/app/dropdowns/__snapshots__/dropdown.test.js.snap b/ui/components/app/dropdowns/__snapshots__/dropdown.test.js.snap new file mode 100644 index 000000000000..3ba2ca611861 --- /dev/null +++ b/ui/components/app/dropdowns/__snapshots__/dropdown.test.js.snap @@ -0,0 +1,12 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Dropdown should matchsnapshot 1`] = ` +
    +
    +`; diff --git a/ui/components/app/dropdowns/dropdown.js b/ui/components/app/dropdowns/dropdown.js index de296034b8c2..46de91aeb18c 100644 --- a/ui/components/app/dropdowns/dropdown.js +++ b/ui/components/app/dropdowns/dropdown.js @@ -36,7 +36,7 @@ export class Dropdown extends Component { {` li.dropdown-menu-item:hover { color:var(--color-text-default); - background-color: var(--color-background-alternative); + background-color: var(--color-background-default-hover); border-radius: 4px; } `} @@ -68,6 +68,7 @@ export class DropdownMenuItem extends Component { return (
  • { onClick(); closeMenu(); diff --git a/ui/components/app/dropdowns/dropdown.test.js b/ui/components/app/dropdowns/dropdown.test.js index be01c89af0db..9dc4b1421141 100644 --- a/ui/components/app/dropdowns/dropdown.test.js +++ b/ui/components/app/dropdowns/dropdown.test.js @@ -1,34 +1,31 @@ import React from 'react'; -import sinon from 'sinon'; -import { shallow } from 'enzyme'; +import { fireEvent } from '@testing-library/react'; +import { renderWithProvider } from '../../../../test/lib/render-helpers'; import { DropdownMenuItem } from './dropdown'; describe('Dropdown', () => { - let wrapper; - const onClickSpy = sinon.spy(); - const closeMenuSpy = sinon.spy(); + const props = { + onClick: jest.fn(), + closeMenu: jest.fn(), + style: { test: 'style' }, + }; - beforeEach(() => { - wrapper = shallow( - , - ); - }); - - it('renders li with dropdown-menu-item class', () => { - expect(wrapper.find('li.dropdown-menu-item')).toHaveLength(1); - }); + it('should matchsnapshot', () => { + const { container } = renderWithProvider(); - it('adds style based on props passed', () => { - expect(wrapper.prop('style').test).toStrictEqual('style'); + expect(container).toMatchSnapshot(); }); it('simulates click event and calls onClick and closeMenu', () => { - wrapper.prop('onClick')(); - expect(onClickSpy.callCount).toStrictEqual(1); - expect(closeMenuSpy.callCount).toStrictEqual(1); + const { queryByTestId } = renderWithProvider( + , + ); + + const dropdownItem = queryByTestId('dropdown-menu-item'); + + fireEvent.click(dropdownItem); + + expect(props.onClick).toHaveBeenCalledTimes(1); + expect(props.closeMenu).toHaveBeenCalledTimes(1); }); }); diff --git a/ui/components/app/dropdowns/network-dropdown.js b/ui/components/app/dropdowns/network-dropdown.js index abb1eca04871..e231251112e5 100644 --- a/ui/components/app/dropdowns/network-dropdown.js +++ b/ui/components/app/dropdowns/network-dropdown.js @@ -19,7 +19,6 @@ import { getEnvironmentType } from '../../../../app/scripts/lib/util'; import { ENVIRONMENT_TYPE_POPUP } from '../../../../shared/constants/app'; import { EVENT, EVENT_NAMES } from '../../../../shared/constants/metametrics'; import { - ADD_NETWORK_ROUTE, ADD_POPULAR_CUSTOM_NETWORK, ADVANCED_ROUTE, } from '../../../helpers/constants/routes'; @@ -50,7 +49,6 @@ function mapStateToProps(state) { frequentRpcListDetail: state.metamask.frequentRpcListDetail || [], networkDropdownOpen: state.appState.networkDropdownOpen, showTestnetMessageInDropdown: state.metamask.showTestnetMessageInDropdown, - addPopularNetworkFeatureToggledOn: state.metamask.customNetworkListEnabled, }; } @@ -103,7 +101,6 @@ class NetworkDropdown extends Component { showTestnetMessageInDropdown: PropTypes.bool.isRequired, hideTestNetMessage: PropTypes.func.isRequired, history: PropTypes.object, - addPopularNetworkFeatureToggledOn: PropTypes.bool, }; handleClick(newProviderType) { @@ -130,13 +127,11 @@ class NetworkDropdown extends Component { - ); - } - - render() { - const { - gasButtonInfo, - defaultActiveButtonIndex = 1, - newActiveButtonIndex, - noButtonActiveByDefault = false, - buttonDataLoading, - ...buttonPropsAndFlags - } = this.props; - - return buttonDataLoading ? ( -
    - {this.context.t('loading')} -
    - ) : ( - - {gasButtonInfo.map((obj, index) => - this.renderButton(obj, buttonPropsAndFlags, index), - )} - - ); - } -} diff --git a/ui/components/app/gas-customization/gas-price-button-group/gas-price-button-group.stories.js b/ui/components/app/gas-customization/gas-price-button-group/gas-price-button-group.stories.js deleted file mode 100644 index 41db3bd8755c..000000000000 --- a/ui/components/app/gas-customization/gas-price-button-group/gas-price-button-group.stories.js +++ /dev/null @@ -1,47 +0,0 @@ -import React from 'react'; -import { GAS_ESTIMATE_TYPES } from '../../../../helpers/constants/common'; -import GasPriceButtonGroup from '.'; - -export default { - title: 'Components/App/GasCustomization/GasPriceButtonGroup', - id: __filename, - argTypes: { - handleGasPriceSelection: { - action: 'handleGasPriceSelection', - }, - }, - args: { - buttonDataLoading: false, - className: 'gas-price-button-group', - gasButtonInfo: [ - { - gasEstimateType: GAS_ESTIMATE_TYPES.SLOW, - feeInPrimaryCurrency: '$0.52', - feeInSecondaryCurrency: '0.0048 ETH', - timeEstimate: '~ 1 min 0 sec', - priceInHexWei: '0xa1b2c3f', - }, - { - gasEstimateType: GAS_ESTIMATE_TYPES.AVERAGE, - feeInPrimaryCurrency: '$0.39', - feeInSecondaryCurrency: '0.004 ETH', - timeEstimate: '~ 1 min 30 sec', - priceInHexWei: '0xa1b2c39', - }, - { - gasEstimateType: GAS_ESTIMATE_TYPES.FAST, - feeInPrimaryCurrency: '$0.30', - feeInSecondaryCurrency: '0.00354 ETH', - timeEstimate: '~ 2 min 1 sec', - priceInHexWei: '0xa1b2c30', - }, - ], - noButtonActiveByDefault: true, - defaultActiveButtonIndex: 2, - showCheck: true, - }, -}; - -export const DefaultStory = (args) => ; - -DefaultStory.storyName = 'Default'; diff --git a/ui/components/app/gas-customization/gas-price-button-group/index.js b/ui/components/app/gas-customization/gas-price-button-group/index.js deleted file mode 100644 index 23a9d8dd2724..000000000000 --- a/ui/components/app/gas-customization/gas-price-button-group/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './gas-price-button-group.component'; diff --git a/ui/components/app/gas-customization/gas-price-button-group/index.scss b/ui/components/app/gas-customization/gas-price-button-group/index.scss deleted file mode 100644 index 3ce7fca88eed..000000000000 --- a/ui/components/app/gas-customization/gas-price-button-group/index.scss +++ /dev/null @@ -1,251 +0,0 @@ -.gas-price-button-group { - margin-top: 22px; - display: flex; - justify-content: space-evenly; - width: 100%; - padding-left: 20px; - padding-right: 20px; - - &__primary-currency { - @include H4; - - height: 20.5px; - margin-bottom: 7.5px; - } - - &__time-estimate { - margin-top: 5.5px; - color: var(--color-text-alternative); - height: 15.4px; - } - - &__loading-container { - height: 130px; - } - - .button-group__button, - .button-group__button--active { - @include H7; - - height: 130px; - max-width: 108px; - flex-direction: column; - align-items: center; - display: flex; - padding-top: 17px; - border-radius: 4px; - border-color: var(--color-primary-muted); - background: var(--color-background-default); - color: var(--color-text-alternative); - - div { - display: flex; - flex-direction: column; - align-items: center; - } - - i { - &:last-child { - display: none; - } - } - } - - .button-group__button--active { - border-color: var(--color-primary-default); - color: var(--color-text-alternative); - - i { - &:last-child { - display: flex; - color: var(--color-primary-default); - margin-top: 8px; - } - } - } -} - -.gas-price-button-group--small { - display: flex; - justify-content: stretch; - min-height: 54px; - - @include screen-sm-max { - max-width: 260px; - } - - &__button-fiat-price { - @include H6; - } - - &__button-label { - @include Paragraph; - } - - &__label { - font-weight: 500; - line-height: 16px; - padding-bottom: 4px; - } - - &__primary-currency { - @include H7; - - padding-bottom: 2px; - - @include screen-sm-max { - @include H8; - } - } - - &__secondary-currency { - @include H7; - - padding-bottom: 2px; - - @include screen-sm-max { - @include H8; - } - } - - &__loading-container { - height: 54px; - } - - .button-group__button, - .button-group__button--active { - background: var(--color-background-default); - color: var(--color-text-alternative); - padding: 4px; - - div { - display: flex; - flex-flow: column; - align-items: flex-start; - justify-content: flex-start; - } - - i { - &:last-child { - display: none; - } - } - } - - .button-group__button--active { - color: var(--color-background-default); - background: var(--color-primary-muted); - - i { - &:last-child { - display: flex; - color: var(--color-primary-default); - margin-top: 10px; - } - } - } -} - -.gas-price-button-group--alt { - display: flex; - justify-content: stretch; - width: 95%; - - &__button-fiat-price { - @include H6; - } - - &__button-label { - @include Paragraph; - } - - &__label { - @include H8; - - font-weight: 500; - text-transform: capitalize; - } - - &__primary-currency { - @include H7; - - margin-top: 3px; - } - - &__secondary-currency { - @include H7; - } - - &__loading-container { - height: 78px; - } - - &__time-estimate { - @include H7; - - font-weight: 500; - margin-top: 4px; - color: var(--color-text-default); - } - - .button-group__button, - .button-group__button--active { - height: 78px; - background: var(--color-background-default); - color: var(--color-text-default); - width: 108px; - height: 97px; - box-shadow: var(--shadow-size-sm) var(--color-shadow-default); - border-radius: 6px; - border: none; - - div { - display: flex; - flex-flow: column; - align-items: flex-start; - justify-content: flex-start; - position: relative; - } - - .button-check-wrapper { - display: none; - } - - &:first-child { - margin-right: 6px; - } - - &:last-child { - margin-left: 6px; - } - } - - .button-group__button--active { - background: var(--color-background-alternative); - border-color: var(--color-primary-default); - - &:first-child { - border-color: var(--color-primary-default); - } - - .button-check-wrapper { - height: 16px; - width: 16px; - border-radius: 8px; - position: absolute; - top: -11px; - right: -10px; - background: var(--color-background-alternative); - display: flex; - flex-flow: row; - justify-content: center; - align-items: center; - } - - i { - display: flex; - color: var(--color-primary-default); - font-weight: 900; - } - } -} diff --git a/ui/components/app/gas-customization/gas-slider/gas-slider.component.js b/ui/components/app/gas-customization/gas-slider/gas-slider.component.js deleted file mode 100644 index 89f4dbd36dec..000000000000 --- a/ui/components/app/gas-customization/gas-slider/gas-slider.component.js +++ /dev/null @@ -1,40 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; - -export default class GasSlider extends Component { - static propTypes = { - onChange: PropTypes.func, - lowLabel: PropTypes.string, - highLabel: PropTypes.string, - value: PropTypes.number, - step: PropTypes.number, - max: PropTypes.number, - min: PropTypes.number, - }; - - render() { - const { onChange, lowLabel, highLabel, value, step, max, min } = this.props; - - return ( -
    - onChange(event.target.value)} - /> -
    -
    -
    -
    - {lowLabel} - {highLabel} -
    -
    - ); - } -} diff --git a/ui/components/app/gas-customization/gas-slider/gas-slider.stories.js b/ui/components/app/gas-customization/gas-slider/gas-slider.stories.js deleted file mode 100644 index a2c0a3b56c20..000000000000 --- a/ui/components/app/gas-customization/gas-slider/gas-slider.stories.js +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import GasSlider from '.'; - -export default { - title: 'Components/App/GasCustomization/GasSlider', - id: __filename, - argTypes: { - onChange: { - action: 'onChange', - }, - lowLabel: { - control: 'text', - }, - highLabel: { - control: 'text', - }, - value: { - control: 'number', - }, - step: { - control: 'number', - }, - max: { - control: 'number', - }, - min: { - control: 'number', - }, - }, -}; - -export const DefaultStory = () => ; - -DefaultStory.storyName = 'Default'; diff --git a/ui/components/app/gas-customization/gas-slider/index.js b/ui/components/app/gas-customization/gas-slider/index.js deleted file mode 100644 index 663e578787d8..000000000000 --- a/ui/components/app/gas-customization/gas-slider/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default } from './gas-slider.component'; diff --git a/ui/components/app/gas-customization/gas-slider/index.scss b/ui/components/app/gas-customization/gas-slider/index.scss deleted file mode 100644 index e3d3ac45565a..000000000000 --- a/ui/components/app/gas-customization/gas-slider/index.scss +++ /dev/null @@ -1,54 +0,0 @@ -.gas-slider { - position: relative; - width: 322px; - - &__input { - width: 322px; - margin-left: -2px; - z-index: 2; - } - - input[type=range] { - -webkit-appearance: none !important; - } - - input[type=range]::-webkit-slider-thumb { - -webkit-appearance: none !important; - height: 34px; - width: 34px; - background-color: var(--color-primary-default); - border-radius: 50%; - position: relative; - z-index: 10; - } - - &__bar { - height: 6px; - width: 322px; - background: var(--color-background-alternative); - display: flex; - justify-content: space-between; - position: absolute; - top: 16px; - z-index: 0; - border-radius: 4px; - } - - &__colored { - height: 6px; - border-radius: 4px; - margin-left: 102px; - width: 322px; - z-index: 1; - background-color: var(--color-primary-muted); - } - - &__labels { - @include H7; - - display: flex; - justify-content: space-between; - margin-top: -6px; - color: var(--color-text-alternative); - } -} diff --git a/ui/components/app/gas-customization/index.scss b/ui/components/app/gas-customization/index.scss deleted file mode 100644 index fa8954bab1fb..000000000000 --- a/ui/components/app/gas-customization/index.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import './gas-slider/index'; -@import './gas-modal-page-container/index'; -@import './advanced-gas-inputs/index'; diff --git a/ui/components/app/gas-timing/__snapshots__/gas-timing.component.test.js.snap b/ui/components/app/gas-timing/__snapshots__/gas-timing.component.test.js.snap new file mode 100644 index 000000000000..afe7a19156eb --- /dev/null +++ b/ui/components/app/gas-timing/__snapshots__/gas-timing.component.test.js.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Gas timing renders nothing when gas is loading 1`] = `
    `; diff --git a/ui/components/app/gas-timing/gas-timing.component.test.js b/ui/components/app/gas-timing/gas-timing.component.test.js index fd2a003f852b..a0042bad9de4 100644 --- a/ui/components/app/gas-timing/gas-timing.component.test.js +++ b/ui/components/app/gas-timing/gas-timing.component.test.js @@ -1,146 +1,81 @@ import React from 'react'; -import { useSelector } from 'react-redux'; -import { shallow } from 'enzyme'; -import sinon from 'sinon'; +import configureMockStore from 'redux-mock-store'; +import { waitFor } from '@testing-library/react'; +import { renderWithProvider } from '../../../../test/lib/render-helpers'; import { GAS_ESTIMATE_TYPES } from '../../../../shared/constants/gas'; - -import messages from '../../../../app/_locales/en/messages.json'; - -import { getMessage } from '../../../helpers/utils/i18n-helper'; - -import * as i18nhooks from '../../../hooks/useI18nContext'; - -import { checkNetworkAndAccountSupports1559 } from '../../../selectors'; -import { - getGasEstimateType, - getGasFeeEstimates, - getIsGasEstimatesLoading, -} from '../../../ducks/metamask/metamask'; +import mockState from '../../../../test/data/mock-state.json'; import GasTiming from '.'; -const MOCK_FEE_ESTIMATE = { - low: { - minWaitTimeEstimate: 180000, - maxWaitTimeEstimate: 300000, - suggestedMaxPriorityFeePerGas: '3', - suggestedMaxFeePerGas: '53', - }, - medium: { - minWaitTimeEstimate: 15000, - maxWaitTimeEstimate: 60000, - suggestedMaxPriorityFeePerGas: '7', - suggestedMaxFeePerGas: '70', - }, - high: { - minWaitTimeEstimate: 0, - maxWaitTimeEstimate: 15000, - suggestedMaxPriorityFeePerGas: '10', - suggestedMaxFeePerGas: '100', - }, - estimatedBaseFee: '50', -}; - -jest.mock('react-redux', () => { - const actual = jest.requireActual('react-redux'); - - return { - ...actual, - useSelector: jest.fn(), - }; -}); - -const DEFAULT_OPTS = { - gasEstimateType: GAS_ESTIMATE_TYPES.FEE_MARKET, - gasFeeEstimates: { - low: '10', - medium: '20', - high: '30', - }, - isGasEstimatesLoading: true, -}; - -const generateUseSelectorRouter = - (opts = DEFAULT_OPTS) => - (selector) => { - if (selector === checkNetworkAndAccountSupports1559) { - return true; - } - if (selector === getGasEstimateType) { - return opts.gasEstimateType ?? DEFAULT_OPTS.gasEstimateType; - } - if (selector === getGasFeeEstimates) { - return opts.gasFeeEstimates ?? DEFAULT_OPTS.gasFeeEstimates; - } - if (selector === getIsGasEstimatesLoading) { - return opts.isGasEstimatesLoading ?? DEFAULT_OPTS.isGasEstimatesLoading; - } - return undefined; - }; +jest.mock('../../../store/actions.js', () => ({ + getGasFeeTimeEstimate: jest.fn().mockImplementation(() => Promise.resolve()), +})); describe('Gas timing', () => { - beforeEach(() => { - const useI18nContext = sinon.stub(i18nhooks, 'useI18nContext'); - useI18nContext.returns((key, variables) => - getMessage('en', messages, key, variables), - ); - jest.clearAllMocks(); - useSelector.mockImplementation(generateUseSelectorRouter()); - }); - afterEach(() => { - sinon.restore(); - }); - it('renders nothing when gas is loading', () => { - useSelector.mockImplementation( - generateUseSelectorRouter({ - isGasEstimatesLoading: true, + // Fails the networkAndAccountSupports1559 check + const nullGasState = { + metamask: { gasFeeEstimates: null, gasEstimateType: GAS_ESTIMATE_TYPES.FEE_MARKET, - }), - ); + }, + }; - const wrapper = shallow(); - expect(wrapper.html()).toBeNull(); + const mockStore = configureMockStore()(nullGasState); + + const { container } = renderWithProvider(, mockStore); + expect(container).toMatchSnapshot(); }); - it('renders "very likely" when high estimate is chosen', () => { - useSelector.mockImplementation( - generateUseSelectorRouter({ - isGasEstimatesLoading: false, - gasFeeEstimates: MOCK_FEE_ESTIMATE, - gasEstimateType: GAS_ESTIMATE_TYPES.FEE_MARKET, - }), + it('renders "very likely" when high estimate is chosen', async () => { + const mockStore = configureMockStore()(mockState); + + const props = { + maxPriorityFeePerGas: '10', + }; + + const { queryByText } = renderWithProvider( + , + mockStore, ); - const wrapper = shallow(); - expect(wrapper.html()).toContain('gasTimingVeryPositive'); + await waitFor(() => { + expect(queryByText(/Very likely in/u)).toBeInTheDocument(); + }); }); - it('renders "likely" when medium estimate is chosen', () => { - useSelector.mockImplementation( - generateUseSelectorRouter({ - isGasEstimatesLoading: false, - gasFeeEstimates: MOCK_FEE_ESTIMATE, - gasEstimateType: GAS_ESTIMATE_TYPES.FEE_MARKET, - }), + it('renders "likely" when medium estimate is chosen', async () => { + const mockStore = configureMockStore()(mockState); + + const props = { + maxPriorityFeePerGas: '8', + }; + + const { queryByText } = renderWithProvider( + , + mockStore, ); - const wrapper = shallow(); - expect(wrapper.html()).toContain('gasTimingPositive'); + await waitFor(() => { + expect(queryByText(/Likely in/u)).toBeInTheDocument(); + }); }); - it('renders "maybe" when low estimate is chosen', () => { - useSelector.mockImplementation( - generateUseSelectorRouter({ - isGasEstimatesLoading: false, - gasFeeEstimates: MOCK_FEE_ESTIMATE, - gasEstimateType: GAS_ESTIMATE_TYPES.FEE_MARKET, - }), + it('renders "maybe" when low estimate is chosen', async () => { + const mockStore = configureMockStore()(mockState); + + const props = { + maxPriorityFeePerGas: '3', + }; + + const { queryByText } = renderWithProvider( + , + mockStore, ); - const wrapper = shallow(); - expect(wrapper.html()).toContain('gasTimingNegative'); + await waitFor(() => { + expect(queryByText(/Maybe in/u)).toBeInTheDocument(); + }); }); }); diff --git a/ui/components/app/import-token-link/__snapshots__/import-token-link.test.js.snap b/ui/components/app/import-token-link/__snapshots__/import-token-link.test.js.snap index a3d8b9e7d17f..37dab0c3ded5 100644 --- a/ui/components/app/import-token-link/__snapshots__/import-token-link.test.js.snap +++ b/ui/components/app/import-token-link/__snapshots__/import-token-link.test.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Import Token Link should match snapshot for mainnet chainId 1`] = ` +exports[`Import Token Link should match snapshot for goerli chainId 1`] = `