Merge pull request #9021 from MetaMask/Version-v8.0.5
Version v8.0.5 RC
@ -19,9 +19,6 @@ workflows:
|
|||||||
- prep-build-storybook:
|
- prep-build-storybook:
|
||||||
requires:
|
requires:
|
||||||
- prep-deps
|
- prep-deps
|
||||||
- prep-scss:
|
|
||||||
requires:
|
|
||||||
- prep-deps
|
|
||||||
- test-lint:
|
- test-lint:
|
||||||
requires:
|
requires:
|
||||||
- prep-deps
|
- prep-deps
|
||||||
@ -45,14 +42,6 @@ workflows:
|
|||||||
requires:
|
requires:
|
||||||
- prep-deps
|
- prep-deps
|
||||||
- prep-build
|
- prep-build
|
||||||
- test-integration-flat-chrome:
|
|
||||||
requires:
|
|
||||||
- prep-deps
|
|
||||||
- prep-scss
|
|
||||||
- test-integration-flat-firefox:
|
|
||||||
requires:
|
|
||||||
- prep-deps
|
|
||||||
- prep-scss
|
|
||||||
- all-tests-pass:
|
- all-tests-pass:
|
||||||
requires:
|
requires:
|
||||||
- test-lint
|
- test-lint
|
||||||
@ -63,8 +52,6 @@ workflows:
|
|||||||
- test-mozilla-lint
|
- test-mozilla-lint
|
||||||
- test-e2e-chrome
|
- test-e2e-chrome
|
||||||
- test-e2e-firefox
|
- test-e2e-firefox
|
||||||
- test-integration-flat-chrome
|
|
||||||
- test-integration-flat-firefox
|
|
||||||
- benchmark:
|
- benchmark:
|
||||||
requires:
|
requires:
|
||||||
- prep-build-test
|
- prep-build-test
|
||||||
@ -176,25 +163,6 @@ jobs:
|
|||||||
paths:
|
paths:
|
||||||
- .out
|
- .out
|
||||||
|
|
||||||
prep-scss:
|
|
||||||
docker:
|
|
||||||
- image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- attach_workspace:
|
|
||||||
at: .
|
|
||||||
- run:
|
|
||||||
name: Get Scss Cache key
|
|
||||||
# this allows us to checksum against a whole directory
|
|
||||||
command: find ui/app/css -type f -exec md5sum {} \; | sort -k 2 > scss_checksum
|
|
||||||
- run:
|
|
||||||
name: Build for integration tests
|
|
||||||
command: yarn test:integration:build
|
|
||||||
- persist_to_workspace:
|
|
||||||
root: .
|
|
||||||
paths:
|
|
||||||
- ui/app/css/output
|
|
||||||
|
|
||||||
test-lint:
|
test-lint:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88
|
- image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88
|
||||||
@ -401,33 +369,6 @@ jobs:
|
|||||||
name: test:mozilla-lint
|
name: test:mozilla-lint
|
||||||
command: NODE_OPTIONS=--max_old_space_size=3072 yarn mozilla-lint
|
command: NODE_OPTIONS=--max_old_space_size=3072 yarn mozilla-lint
|
||||||
|
|
||||||
test-integration-flat-firefox:
|
|
||||||
docker:
|
|
||||||
- image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- attach_workspace:
|
|
||||||
at: .
|
|
||||||
- run:
|
|
||||||
name: Install Firefox
|
|
||||||
command: ./.circleci/scripts/firefox-install
|
|
||||||
- run:
|
|
||||||
name: test:integration:flat
|
|
||||||
command: yarn test:flat
|
|
||||||
|
|
||||||
test-integration-flat-chrome:
|
|
||||||
environment:
|
|
||||||
browsers: '["Chrome"]'
|
|
||||||
docker:
|
|
||||||
- image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- attach_workspace:
|
|
||||||
at: .
|
|
||||||
- run:
|
|
||||||
name: test:integration:flat
|
|
||||||
command: yarn test:flat
|
|
||||||
|
|
||||||
all-tests-pass:
|
all-tests-pass:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88
|
- image: circleci/node@sha256:e16740707de2ebed45c05d507f33ef204902349c7356d720610b5ec6a35d3d88
|
||||||
|
@ -7,17 +7,10 @@ test-builds/**
|
|||||||
docs/**
|
docs/**
|
||||||
coverage/
|
coverage/
|
||||||
|
|
||||||
development/bundle.js
|
|
||||||
development/states.js
|
|
||||||
|
|
||||||
app/scripts/lib/extension-instance.js
|
app/scripts/lib/extension-instance.js
|
||||||
app/scripts/chromereload.js
|
app/scripts/chromereload.js
|
||||||
app/vendor/**
|
app/vendor/**
|
||||||
|
|
||||||
ui/lib/blockies.js
|
ui/lib/blockies.js
|
||||||
|
|
||||||
test/integration/bundle.js
|
|
||||||
test/integration/jquery-3.1.0.min.js
|
|
||||||
test/integration/helpers.js
|
|
||||||
|
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
7
.gitignore
vendored
@ -32,13 +32,6 @@ dist
|
|||||||
builds/
|
builds/
|
||||||
builds.zip
|
builds.zip
|
||||||
|
|
||||||
development/bundle.js
|
|
||||||
development/states.js
|
|
||||||
test/integration/bundle.js
|
|
||||||
test/background.js
|
|
||||||
test/bundle.js
|
|
||||||
test/test-bundle.js
|
|
||||||
|
|
||||||
test-artifacts
|
test-artifacts
|
||||||
test-builds
|
test-builds
|
||||||
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
app/
|
/app
|
||||||
development/
|
/development
|
||||||
dist/
|
/dist
|
||||||
docs/
|
/docs
|
||||||
fonts/
|
/fonts
|
||||||
images/
|
/images
|
||||||
node_modules/
|
/node_modules
|
||||||
notices/
|
/notices
|
||||||
test/
|
/test
|
||||||
|
50
.stylelintrc
@ -1,50 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "stylelint-config-standard",
|
|
||||||
"rules": {
|
|
||||||
"color-named": "never",
|
|
||||||
"font-family-name-quotes": "always-where-recommended",
|
|
||||||
"font-weight-notation": "numeric",
|
|
||||||
"function-url-quotes": "always",
|
|
||||||
"number-leading-zero": "never",
|
|
||||||
"value-no-vendor-prefix": true,
|
|
||||||
"value-list-comma-newline-before": "never-multi-line",
|
|
||||||
"custom-property-empty-line-before": "never",
|
|
||||||
"property-no-unknown": [
|
|
||||||
true,
|
|
||||||
{
|
|
||||||
"ignoreProperties": [
|
|
||||||
"composes",
|
|
||||||
"all",
|
|
||||||
"-webkit-appearance"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"declaration-block-semicolon-newline-after": "always",
|
|
||||||
"block-opening-brace-newline-after": "always",
|
|
||||||
"selector-attribute-quotes": "always",
|
|
||||||
"selector-max-specificity": "0,5,2",
|
|
||||||
"selector-pseudo-class-no-unknown": [
|
|
||||||
true,
|
|
||||||
{
|
|
||||||
"ignorePseudoClasses": ["local", "global"]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"at-rule-empty-line-before": [
|
|
||||||
"always",
|
|
||||||
{
|
|
||||||
"ignore": [
|
|
||||||
"after-comment"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"indentation": [
|
|
||||||
2,
|
|
||||||
{
|
|
||||||
"indentInsideParens": "once-at-root-twice-in-block"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"max-nesting-depth": 3,
|
|
||||||
"no-duplicate-selectors": true,
|
|
||||||
"no-unknown-animations": true
|
|
||||||
}
|
|
||||||
}
|
|
12
CHANGELOG.md
@ -2,6 +2,18 @@
|
|||||||
|
|
||||||
## Current Develop Branch
|
## Current Develop Branch
|
||||||
|
|
||||||
|
## 8.0.5 Thu Jul 16 2020
|
||||||
|
- [#8942](https://github.com/MetaMask/metamask-extension/pull/8942): Fix display of incoming transactions (#8942)
|
||||||
|
- [#8998](https://github.com/MetaMask/metamask-extension/pull/8998): Fix `web3_clientVersion` method (#8998)
|
||||||
|
- [#9003](https://github.com/MetaMask/metamask-extension/pull/9003): @metamask/inpage-provider@6.0.1 (#9003)
|
||||||
|
- [#9006](https://github.com/MetaMask/metamask-extension/pull/9006): Hide loading indication after `personal_sign` (#9006)
|
||||||
|
- [#9011](https://github.com/MetaMask/metamask-extension/pull/9011): Display pending notifications after connect flow (#9011)
|
||||||
|
- [#9012](https://github.com/MetaMask/metamask-extension/pull/9012): Skip render when home page is closing or redirecting (#9012)
|
||||||
|
- [#9010](https://github.com/MetaMask/metamask-extension/pull/9010): Limit number of transactions passed outside of TransactionController (#9010)
|
||||||
|
- [#9023](https://github.com/MetaMask/metamask-extension/pull/9023): Clear AccountTracker accounts and CachedBalances on createNewVaultAndRestore (#9023)
|
||||||
|
- [#9025](https://github.com/MetaMask/metamask-extension/pull/9025): Catch gas estimate errors (#9025)
|
||||||
|
- [#9026](https://github.com/MetaMask/metamask-extension/pull/9026): Clear transactions on createNewVaultAndRestore (#9026)
|
||||||
|
|
||||||
## 8.0.4 Tue Jul 07 2020
|
## 8.0.4 Tue Jul 07 2020
|
||||||
- [#8934](https://github.com/MetaMask/metamask-extension/pull/8934): Fix transaction activity on custom networks
|
- [#8934](https://github.com/MetaMask/metamask-extension/pull/8934): Fix transaction activity on custom networks
|
||||||
- [#8936](https://github.com/MetaMask/metamask-extension/pull/8936): Fix account tracker optimization
|
- [#8936](https://github.com/MetaMask/metamask-extension/pull/8936): Fix account tracker optimization
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
# MetaMask Browser Extension
|
# MetaMask Browser Extension
|
||||||
|
|
||||||
[](https://circleci.com/gh/MetaMask/metamask-extension) [](https://coveralls.io/github/MetaMask/metamask-extension?branch=master)
|
|
||||||
|
|
||||||
You can find the latest version of MetaMask on [our official website](https://metamask.io/). For help using MetaMask, visit our [User Support Site](https://metamask.zendesk.com/hc/en-us).
|
You can find the latest version of MetaMask on [our official website](https://metamask.io/). For help using MetaMask, visit our [User Support Site](https://metamask.zendesk.com/hc/en-us).
|
||||||
|
|
||||||
MetaMask supports Firefox, Google Chrome, and Chromium-based browsers. We recommend using the latest available browser version.
|
MetaMask supports Firefox, Google Chrome, and Chromium-based browsers. We recommend using the latest available browser version.
|
||||||
|
@ -1,93 +0,0 @@
|
|||||||
Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato"
|
|
||||||
|
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
||||||
This license is copied below, and is also available with a FAQ at:
|
|
||||||
http://scripts.sil.org/OFL
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------
|
|
||||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
||||||
-----------------------------------------------------------
|
|
||||||
|
|
||||||
PREAMBLE
|
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
||||||
development of collaborative font projects, to support the font creation
|
|
||||||
efforts of academic and linguistic communities, and to provide a free and
|
|
||||||
open framework in which fonts may be shared and improved in partnership
|
|
||||||
with others.
|
|
||||||
|
|
||||||
The OFL allows the licensed fonts to be used, studied, modified and
|
|
||||||
redistributed freely as long as they are not sold by themselves. The
|
|
||||||
fonts, including any derivative works, can be bundled, embedded,
|
|
||||||
redistributed and/or sold with any software provided that any reserved
|
|
||||||
names are not used by derivative works. The fonts and derivatives,
|
|
||||||
however, cannot be released under any other type of license. The
|
|
||||||
requirement for fonts to remain under this license does not apply
|
|
||||||
to any document created using the fonts or their derivatives.
|
|
||||||
|
|
||||||
DEFINITIONS
|
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
|
||||||
Holder(s) under this license and clearly marked as such. This may
|
|
||||||
include source files, build scripts and documentation.
|
|
||||||
|
|
||||||
"Reserved Font Name" refers to any names specified as such after the
|
|
||||||
copyright statement(s).
|
|
||||||
|
|
||||||
"Original Version" refers to the collection of Font Software components as
|
|
||||||
distributed by the Copyright Holder(s).
|
|
||||||
|
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
|
||||||
Original Version, by changing formats or by porting the Font Software to a
|
|
||||||
new environment.
|
|
||||||
|
|
||||||
"Author" refers to any designer, engineer, programmer, technical
|
|
||||||
writer or other person who contributed to the Font Software.
|
|
||||||
|
|
||||||
PERMISSION & CONDITIONS
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
||||||
redistribute, and sell modified and unmodified copies of the Font
|
|
||||||
Software, subject to the following conditions:
|
|
||||||
|
|
||||||
1) Neither the Font Software nor any of its individual components,
|
|
||||||
in Original or Modified Versions, may be sold by itself.
|
|
||||||
|
|
||||||
2) Original or Modified Versions of the Font Software may be bundled,
|
|
||||||
redistributed and/or sold with any software, provided that each copy
|
|
||||||
contains the above copyright notice and this license. These can be
|
|
||||||
included either as stand-alone text files, human-readable headers or
|
|
||||||
in the appropriate machine-readable metadata fields within text or
|
|
||||||
binary files as long as those fields can be easily viewed by the user.
|
|
||||||
|
|
||||||
3) No Modified Version of the Font Software may use the Reserved Font
|
|
||||||
Name(s) unless explicit written permission is granted by the corresponding
|
|
||||||
Copyright Holder. This restriction only applies to the primary font name as
|
|
||||||
presented to the users.
|
|
||||||
|
|
||||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
||||||
Software shall not be used to promote, endorse or advertise any
|
|
||||||
Modified Version, except to acknowledge the contribution(s) of the
|
|
||||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
||||||
permission.
|
|
||||||
|
|
||||||
5) The Font Software, modified or unmodified, in part or in whole,
|
|
||||||
must be distributed entirely under this license, and must not be
|
|
||||||
distributed under any other license. The requirement for fonts to
|
|
||||||
remain under this license does not apply to any document created
|
|
||||||
using the Font Software.
|
|
||||||
|
|
||||||
TERMINATION
|
|
||||||
This license becomes null and void if any of the above conditions are
|
|
||||||
not met.
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
||||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
||||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@ -1,92 +0,0 @@
|
|||||||
Copyright (c) 2011-2012, Julieta Ulanovsky (julieta.ulanovsky@gmail.com), with Reserved Font Names 'Montserrat'
|
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
||||||
This license is copied below, and is also available with a FAQ at:
|
|
||||||
http://scripts.sil.org/OFL
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------
|
|
||||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
||||||
-----------------------------------------------------------
|
|
||||||
|
|
||||||
PREAMBLE
|
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
||||||
development of collaborative font projects, to support the font creation
|
|
||||||
efforts of academic and linguistic communities, and to provide a free and
|
|
||||||
open framework in which fonts may be shared and improved in partnership
|
|
||||||
with others.
|
|
||||||
|
|
||||||
The OFL allows the licensed fonts to be used, studied, modified and
|
|
||||||
redistributed freely as long as they are not sold by themselves. The
|
|
||||||
fonts, including any derivative works, can be bundled, embedded,
|
|
||||||
redistributed and/or sold with any software provided that any reserved
|
|
||||||
names are not used by derivative works. The fonts and derivatives,
|
|
||||||
however, cannot be released under any other type of license. The
|
|
||||||
requirement for fonts to remain under this license does not apply
|
|
||||||
to any document created using the fonts or their derivatives.
|
|
||||||
|
|
||||||
DEFINITIONS
|
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
|
||||||
Holder(s) under this license and clearly marked as such. This may
|
|
||||||
include source files, build scripts and documentation.
|
|
||||||
|
|
||||||
"Reserved Font Name" refers to any names specified as such after the
|
|
||||||
copyright statement(s).
|
|
||||||
|
|
||||||
"Original Version" refers to the collection of Font Software components as
|
|
||||||
distributed by the Copyright Holder(s).
|
|
||||||
|
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
|
||||||
Original Version, by changing formats or by porting the Font Software to a
|
|
||||||
new environment.
|
|
||||||
|
|
||||||
"Author" refers to any designer, engineer, programmer, technical
|
|
||||||
writer or other person who contributed to the Font Software.
|
|
||||||
|
|
||||||
PERMISSION & CONDITIONS
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
||||||
redistribute, and sell modified and unmodified copies of the Font
|
|
||||||
Software, subject to the following conditions:
|
|
||||||
|
|
||||||
1) Neither the Font Software nor any of its individual components,
|
|
||||||
in Original or Modified Versions, may be sold by itself.
|
|
||||||
|
|
||||||
2) Original or Modified Versions of the Font Software may be bundled,
|
|
||||||
redistributed and/or sold with any software, provided that each copy
|
|
||||||
contains the above copyright notice and this license. These can be
|
|
||||||
included either as stand-alone text files, human-readable headers or
|
|
||||||
in the appropriate machine-readable metadata fields within text or
|
|
||||||
binary files as long as those fields can be easily viewed by the user.
|
|
||||||
|
|
||||||
3) No Modified Version of the Font Software may use the Reserved Font
|
|
||||||
Name(s) unless explicit written permission is granted by the corresponding
|
|
||||||
Copyright Holder. This restriction only applies to the primary font name as
|
|
||||||
presented to the users.
|
|
||||||
|
|
||||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
||||||
Software shall not be used to promote, endorse or advertise any
|
|
||||||
Modified Version, except to acknowledge the contribution(s) of the
|
|
||||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
||||||
permission.
|
|
||||||
|
|
||||||
5) The Font Software, modified or unmodified, in part or in whole,
|
|
||||||
must be distributed entirely under this license, and must not be
|
|
||||||
distributed under any other license. The requirement for fonts to
|
|
||||||
remain under this license does not apply to any document created
|
|
||||||
using the Font Software.
|
|
||||||
|
|
||||||
TERMINATION
|
|
||||||
This license becomes null and void if any of the above conditions are
|
|
||||||
not met.
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
||||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
||||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 421 B |
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 12 KiB |
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "__MSG_appName__",
|
"name": "__MSG_appName__",
|
||||||
"short_name": "__MSG_appName__",
|
"short_name": "__MSG_appName__",
|
||||||
"version": "8.0.4",
|
"version": "8.0.5",
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"author": "https://metamask.io",
|
"author": "https://metamask.io",
|
||||||
"description": "__MSG_appDescription__",
|
"description": "__MSG_appDescription__",
|
||||||
|
@ -260,7 +260,7 @@ function setupController (initState, initLangCode) {
|
|||||||
createStreamSink(persistData),
|
createStreamSink(persistData),
|
||||||
(error) => {
|
(error) => {
|
||||||
log.error('MetaMask - Persistence pipeline failed', error)
|
log.error('MetaMask - Persistence pipeline failed', error)
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -454,7 +454,7 @@ async function openPopup () {
|
|||||||
resolve()
|
resolve()
|
||||||
}
|
}
|
||||||
}, 1000)
|
}, 1000)
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,13 +77,13 @@ async function setupStreams () {
|
|||||||
pageMux,
|
pageMux,
|
||||||
pageStream,
|
pageStream,
|
||||||
pageMux,
|
pageMux,
|
||||||
(err) => logStreamDisconnectWarning('MetaMask Inpage Multiplex', err)
|
(err) => logStreamDisconnectWarning('MetaMask Inpage Multiplex', err),
|
||||||
)
|
)
|
||||||
pump(
|
pump(
|
||||||
extensionMux,
|
extensionMux,
|
||||||
extensionStream,
|
extensionStream,
|
||||||
extensionMux,
|
extensionMux,
|
||||||
(err) => logStreamDisconnectWarning('MetaMask Background Multiplex', err)
|
(err) => logStreamDisconnectWarning('MetaMask Background Multiplex', err),
|
||||||
)
|
)
|
||||||
|
|
||||||
// forward communication across inpage-background for these channels only
|
// forward communication across inpage-background for these channels only
|
||||||
@ -102,7 +102,7 @@ function forwardTrafficBetweenMuxers (channelName, muxA, muxB) {
|
|||||||
channelA,
|
channelA,
|
||||||
channelB,
|
channelB,
|
||||||
channelA,
|
channelA,
|
||||||
(err) => logStreamDisconnectWarning(`MetaMask muxed traffic for channel "${channelName}" failed.`, err)
|
(err) => logStreamDisconnectWarning(`MetaMask muxed traffic for channel "${channelName}" failed.`, err),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ const defaultState = {
|
|||||||
alertEnabledness[alertType] = true
|
alertEnabledness[alertType] = true
|
||||||
return alertEnabledness
|
return alertEnabledness
|
||||||
},
|
},
|
||||||
{}
|
{},
|
||||||
),
|
),
|
||||||
unconnectedAccountAlertShownOrigins: {},
|
unconnectedAccountAlertShownOrigins: {},
|
||||||
}
|
}
|
||||||
@ -44,7 +44,7 @@ export default class AlertController {
|
|||||||
initState,
|
initState,
|
||||||
{
|
{
|
||||||
unconnectedAccountAlertShownOrigins: {},
|
unconnectedAccountAlertShownOrigins: {},
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
this.store = new ObservableStore(state)
|
this.store = new ObservableStore(state)
|
||||||
|
|
||||||
|
@ -65,6 +65,14 @@ export default class CachedBalancesController {
|
|||||||
return balancesToCache
|
return balancesToCache
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes cachedBalances
|
||||||
|
*/
|
||||||
|
|
||||||
|
clearCachedBalances () {
|
||||||
|
this.store.updateState({ cachedBalances: {} })
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets up listeners and subscriptions which should trigger an update of cached balances. These updates will
|
* Sets up listeners and subscriptions which should trigger an update of cached balances. These updates will
|
||||||
* happen when the current account changes. Which happens on block updates, as well as on network and account
|
* happen when the current account changes. Which happens on block updates, as well as on network and account
|
||||||
|
@ -33,23 +33,23 @@ function createNetworkAndChainIdMiddleware ({ network }) {
|
|||||||
|
|
||||||
switch (network) {
|
switch (network) {
|
||||||
case 'mainnet':
|
case 'mainnet':
|
||||||
netId = networkEnums.MAINNET_NETWORK_ID.toString()
|
netId = networkEnums.MAINNET_NETWORK_ID
|
||||||
chainId = '0x01'
|
chainId = '0x01'
|
||||||
break
|
break
|
||||||
case 'ropsten':
|
case 'ropsten':
|
||||||
netId = networkEnums.ROPSTEN_NETWORK_ID.toString()
|
netId = networkEnums.ROPSTEN_NETWORK_ID
|
||||||
chainId = '0x03'
|
chainId = '0x03'
|
||||||
break
|
break
|
||||||
case 'rinkeby':
|
case 'rinkeby':
|
||||||
netId = networkEnums.RINKEBY_NETWORK_ID.toString()
|
netId = networkEnums.RINKEBY_NETWORK_ID
|
||||||
chainId = '0x04'
|
chainId = '0x04'
|
||||||
break
|
break
|
||||||
case 'kovan':
|
case 'kovan':
|
||||||
netId = networkEnums.KOVAN_NETWORK_ID.toString()
|
netId = networkEnums.KOVAN_NETWORK_ID
|
||||||
chainId = networkEnums.KOVAN_CHAIN_ID
|
chainId = networkEnums.KOVAN_CHAIN_ID
|
||||||
break
|
break
|
||||||
case 'goerli':
|
case 'goerli':
|
||||||
netId = networkEnums.GOERLI_NETWORK_ID.toString()
|
netId = networkEnums.GOERLI_NETWORK_ID
|
||||||
chainId = '0x05'
|
chainId = '0x05'
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
|
@ -5,11 +5,11 @@ export const MAINNET = 'mainnet'
|
|||||||
export const GOERLI = 'goerli'
|
export const GOERLI = 'goerli'
|
||||||
export const LOCALHOST = 'localhost'
|
export const LOCALHOST = 'localhost'
|
||||||
|
|
||||||
export const MAINNET_NETWORK_ID = 1
|
export const MAINNET_NETWORK_ID = '1'
|
||||||
export const ROPSTEN_NETWORK_ID = 3
|
export const ROPSTEN_NETWORK_ID = '3'
|
||||||
export const RINKEBY_NETWORK_ID = 4
|
export const RINKEBY_NETWORK_ID = '4'
|
||||||
export const GOERLI_NETWORK_ID = 5
|
export const GOERLI_NETWORK_ID = '5'
|
||||||
export const KOVAN_NETWORK_ID = 42
|
export const KOVAN_NETWORK_ID = '42'
|
||||||
|
|
||||||
export const MAINNET_CHAIN_ID = '0x1'
|
export const MAINNET_CHAIN_ID = '0x1'
|
||||||
export const ROPSTEN_CHAIN_ID = '0x3'
|
export const ROPSTEN_CHAIN_ID = '0x3'
|
||||||
|
@ -100,7 +100,7 @@ export default class NetworkController extends EventEmitter {
|
|||||||
if (!type) {
|
if (!type) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
network = networks.networkList[type] && networks.networkList[type].chainId ? networks.networkList[type].chainId : network
|
network = networks.networkList[type]?.chainId || network
|
||||||
return this.networkStore.putState(network)
|
return this.networkStore.putState(network)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,7 +211,7 @@ export default class NetworkController extends EventEmitter {
|
|||||||
const networkClient = createJsonRpcClient({ rpcUrl })
|
const networkClient = createJsonRpcClient({ rpcUrl })
|
||||||
// hack to add a 'rpc' network with chainId
|
// hack to add a 'rpc' network with chainId
|
||||||
networks.networkList['rpc'] = {
|
networks.networkList['rpc'] = {
|
||||||
chainId: chainId,
|
chainId,
|
||||||
rpcUrl,
|
rpcUrl,
|
||||||
ticker: ticker || 'ETH',
|
ticker: ticker || 'ETH',
|
||||||
nickname,
|
nickname,
|
||||||
|
@ -36,6 +36,7 @@ export const LOG_LIMIT = 100
|
|||||||
|
|
||||||
export const SAFE_METHODS = [
|
export const SAFE_METHODS = [
|
||||||
'web3_sha3',
|
'web3_sha3',
|
||||||
|
'web3_clientVersion',
|
||||||
'net_listening',
|
'net_listening',
|
||||||
'net_peerCount',
|
'net_peerCount',
|
||||||
'net_version',
|
'net_version',
|
||||||
|
@ -102,7 +102,7 @@ export class PermissionsController {
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
engine.push(this.permissions.providerMiddlewareFunction.bind(
|
engine.push(this.permissions.providerMiddlewareFunction.bind(
|
||||||
this.permissions, { origin }
|
this.permissions, { origin },
|
||||||
))
|
))
|
||||||
|
|
||||||
return asMiddleware(engine)
|
return asMiddleware(engine)
|
||||||
@ -132,7 +132,7 @@ export class PermissionsController {
|
|||||||
const req = { method: 'eth_accounts' }
|
const req = { method: 'eth_accounts' }
|
||||||
const res = {}
|
const res = {}
|
||||||
this.permissions.providerMiddlewareFunction(
|
this.permissions.providerMiddlewareFunction(
|
||||||
{ origin }, req, res, () => {}, _end
|
{ origin }, req, res, () => {}, _end,
|
||||||
)
|
)
|
||||||
|
|
||||||
function _end () {
|
function _end () {
|
||||||
@ -187,7 +187,7 @@ export class PermissionsController {
|
|||||||
const res = {}
|
const res = {}
|
||||||
|
|
||||||
this.permissions.providerMiddlewareFunction(
|
this.permissions.providerMiddlewareFunction(
|
||||||
domain, req, res, () => {}, _end
|
domain, req, res, () => {}, _end,
|
||||||
)
|
)
|
||||||
|
|
||||||
function _end (_err) {
|
function _end (_err) {
|
||||||
@ -233,7 +233,7 @@ export class PermissionsController {
|
|||||||
// attempt to finalize the request and resolve it,
|
// attempt to finalize the request and resolve it,
|
||||||
// settings caveats as necessary
|
// settings caveats as necessary
|
||||||
approved.permissions = await this.finalizePermissionsRequest(
|
approved.permissions = await this.finalizePermissionsRequest(
|
||||||
approved.permissions, accounts
|
approved.permissions, accounts,
|
||||||
)
|
)
|
||||||
approval.resolve(approved.permissions)
|
approval.resolve(approved.permissions)
|
||||||
}
|
}
|
||||||
@ -295,7 +295,7 @@ export class PermissionsController {
|
|||||||
this.permissions.updateCaveatFor(
|
this.permissions.updateCaveatFor(
|
||||||
origin, 'eth_accounts',
|
origin, 'eth_accounts',
|
||||||
CAVEAT_NAMES.exposedAccounts,
|
CAVEAT_NAMES.exposedAccounts,
|
||||||
[...oldPermittedAccounts, account]
|
[...oldPermittedAccounts, account],
|
||||||
)
|
)
|
||||||
|
|
||||||
const permittedAccounts = await this.getAccounts(origin)
|
const permittedAccounts = await this.getAccounts(origin)
|
||||||
@ -459,7 +459,7 @@ export class PermissionsController {
|
|||||||
// update "last seen" time for the origin and account(s)
|
// update "last seen" time for the origin and account(s)
|
||||||
// exception: no accounts -> no times to update
|
// exception: no accounts -> no times to update
|
||||||
this.permissionsLog.updateAccountsHistory(
|
this.permissionsLog.updateAccountsHistory(
|
||||||
origin, newAccounts
|
origin, newAccounts,
|
||||||
)
|
)
|
||||||
|
|
||||||
// NOTE:
|
// NOTE:
|
||||||
@ -490,7 +490,7 @@ export class PermissionsController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return { parentCapability: methodName }
|
return { parentCapability: methodName }
|
||||||
})
|
}),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -642,8 +642,8 @@ export class PermissionsController {
|
|||||||
await Promise.all(
|
await Promise.all(
|
||||||
connectedDomains
|
connectedDomains
|
||||||
.map(
|
.map(
|
||||||
(origin) => this._handleConnectedAccountSelected(origin)
|
(origin) => this._handleConnectedAccountSelected(origin),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -675,7 +675,7 @@ export class PermissionsController {
|
|||||||
this.pendingApprovals.has(id)
|
this.pendingApprovals.has(id)
|
||||||
) {
|
) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Pending approval with id '${id}' or origin '${origin}' already exists.`
|
`Pending approval with id '${id}' or origin '${origin}' already exists.`,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -728,7 +728,7 @@ export class PermissionsController {
|
|||||||
|
|
||||||
if (this.pendingApprovalOrigins.has(origin)) {
|
if (this.pendingApprovalOrigins.has(origin)) {
|
||||||
throw ethErrors.rpc.resourceUnavailable(
|
throw ethErrors.rpc.resourceUnavailable(
|
||||||
'Permissions request already pending; please wait.'
|
'Permissions request already pending; please wait.',
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ export default function createMethodMiddleware ({
|
|||||||
|
|
||||||
if (isProcessingRequestAccounts) {
|
if (isProcessingRequestAccounts) {
|
||||||
res.error = ethErrors.rpc.resourceUnavailable(
|
res.error = ethErrors.rpc.resourceUnavailable(
|
||||||
'Already processing eth_requestAccounts. Please wait.'
|
'Already processing eth_requestAccounts. Please wait.',
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -68,7 +68,7 @@ export default function createMethodMiddleware ({
|
|||||||
// this should never happen, because it should be caught in the
|
// this should never happen, because it should be caught in the
|
||||||
// above catch clause
|
// above catch clause
|
||||||
res.error = ethErrors.rpc.internal(
|
res.error = ethErrors.rpc.internal(
|
||||||
'Accounts unexpectedly unavailable. Please report this bug.'
|
'Accounts unexpectedly unavailable. Please report this bug.',
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,7 +213,7 @@ export default class PermissionsLogController {
|
|||||||
*/
|
*/
|
||||||
logPermissionsHistory (
|
logPermissionsHistory (
|
||||||
requestedMethods, origin, result,
|
requestedMethods, origin, result,
|
||||||
time, isEthRequestAccounts
|
time, isEthRequestAccounts,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
let accounts, newEntries
|
let accounts, newEntries
|
||||||
@ -378,6 +378,6 @@ export default class PermissionsLogController {
|
|||||||
*/
|
*/
|
||||||
function getAccountToTimeMap (accounts, time) {
|
function getAccountToTimeMap (accounts, time) {
|
||||||
return accounts.reduce(
|
return accounts.reduce(
|
||||||
(acc, account) => ({ ...acc, [account]: time }), {}
|
(acc, account) => ({ ...acc, [account]: time }), {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ export default function getRestrictedMethods ({ getIdentities, getKeyringAccount
|
|||||||
(err) => {
|
(err) => {
|
||||||
res.error = err
|
res.error = err
|
||||||
end(err)
|
end(err)
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -482,7 +482,7 @@ export default class PreferencesController {
|
|||||||
* updates custom RPC details
|
* updates custom RPC details
|
||||||
*
|
*
|
||||||
* @param {string} url - The RPC url to add to frequentRpcList.
|
* @param {string} url - The RPC url to add to frequentRpcList.
|
||||||
* @param {number} chainId - Optional chainId of the selected network.
|
* @param {string} chainId - Optional chainId of the selected network.
|
||||||
* @param {string} ticker - Optional ticker symbol of the selected network.
|
* @param {string} ticker - Optional ticker symbol of the selected network.
|
||||||
* @param {string} nickname - Optional nickname of the selected network.
|
* @param {string} nickname - Optional nickname of the selected network.
|
||||||
* @returns {Promise<array>} - Promise resolving to updated frequentRpcList.
|
* @returns {Promise<array>} - Promise resolving to updated frequentRpcList.
|
||||||
@ -510,7 +510,7 @@ export default class PreferencesController {
|
|||||||
* Adds custom RPC url to state.
|
* Adds custom RPC url to state.
|
||||||
*
|
*
|
||||||
* @param {string} url - The RPC url to add to frequentRpcList.
|
* @param {string} url - The RPC url to add to frequentRpcList.
|
||||||
* @param {number} chainId - Optional chainId of the selected network.
|
* @param {string} chainId - Optional chainId of the selected network.
|
||||||
* @param {string} ticker - Optional ticker symbol of the selected network.
|
* @param {string} ticker - Optional ticker symbol of the selected network.
|
||||||
* @param {string} nickname - Optional nickname of the selected network.
|
* @param {string} nickname - Optional nickname of the selected network.
|
||||||
* @returns {Promise<array>} - Promise resolving to updated frequentRpcList.
|
* @returns {Promise<array>} - Promise resolving to updated frequentRpcList.
|
||||||
|
@ -25,7 +25,6 @@ import NonceTracker from 'nonce-tracker'
|
|||||||
import * as txUtils from './lib/util'
|
import * as txUtils from './lib/util'
|
||||||
import cleanErrorStack from '../../lib/cleanErrorStack'
|
import cleanErrorStack from '../../lib/cleanErrorStack'
|
||||||
import log from 'loglevel'
|
import log from 'loglevel'
|
||||||
import { throwIfAccountIsBlocked } from './lib/recipient-blocklist-checker'
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
TRANSACTION_TYPE_CANCEL,
|
TRANSACTION_TYPE_CANCEL,
|
||||||
@ -38,6 +37,7 @@ import { hexToBn, bnToHex, BnMultiplyByFraction } from '../../lib/util'
|
|||||||
import { TRANSACTION_NO_CONTRACT_ERROR_KEY } from '../../../../ui/app/helpers/constants/error-keys'
|
import { TRANSACTION_NO_CONTRACT_ERROR_KEY } from '../../../../ui/app/helpers/constants/error-keys'
|
||||||
|
|
||||||
const SIMPLE_GAS_COST = '0x5208' // Hex for 21000, cost of a simple send.
|
const SIMPLE_GAS_COST = '0x5208' // Hex for 21000, cost of a simple send.
|
||||||
|
const MAX_MEMSTORE_TX_LIST_SIZE = 100 // Number of transactions (by unique nonces) to keep in memory
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Transaction Controller is an aggregate of sub-controllers and trackers
|
Transaction Controller is an aggregate of sub-controllers and trackers
|
||||||
@ -125,14 +125,19 @@ export default class TransactionController extends EventEmitter {
|
|||||||
this._updatePendingTxsAfterFirstBlock()
|
this._updatePendingTxsAfterFirstBlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @returns {number} - the chainId*/
|
/**
|
||||||
|
* Gets the current chainId in the network store as a number, returning 0 if
|
||||||
|
* the chainId parses to NaN.
|
||||||
|
*
|
||||||
|
* @returns {number} The numerical chainId.
|
||||||
|
*/
|
||||||
getChainId () {
|
getChainId () {
|
||||||
const networkState = this.networkStore.getState()
|
const networkState = this.networkStore.getState()
|
||||||
const getChainId = parseInt(networkState)
|
const integerChainId = parseInt(networkState)
|
||||||
if (Number.isNaN(getChainId)) {
|
if (Number.isNaN(integerChainId)) {
|
||||||
return 0
|
return 0
|
||||||
} else {
|
} else {
|
||||||
return getChainId
|
return integerChainId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,7 +246,6 @@ export default class TransactionController extends EventEmitter {
|
|||||||
this.emit('newUnapprovedTx', txMeta)
|
this.emit('newUnapprovedTx', txMeta)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
throwIfAccountIsBlocked(txMeta.metamaskNetworkId, normalizedTxParams.to)
|
|
||||||
txMeta = await this.addTxGasDefaults(txMeta, getCodeResponse)
|
txMeta = await this.addTxGasDefaults(txMeta, getCodeResponse)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
log.warn(error)
|
log.warn(error)
|
||||||
@ -786,9 +790,8 @@ export default class TransactionController extends EventEmitter {
|
|||||||
*/
|
*/
|
||||||
_updateMemstore () {
|
_updateMemstore () {
|
||||||
const unapprovedTxs = this.txStateManager.getUnapprovedTxList()
|
const unapprovedTxs = this.txStateManager.getUnapprovedTxList()
|
||||||
const currentNetworkTxList = this.txStateManager.getFilteredTxList({
|
const currentNetworkTxList = this.txStateManager.getTxList(MAX_MEMSTORE_TX_LIST_SIZE)
|
||||||
metamaskNetworkId: this.getNetwork(),
|
|
||||||
})
|
|
||||||
this.memStore.updateState({ unapprovedTxs, currentNetworkTxList })
|
this.memStore.updateState({ unapprovedTxs, currentNetworkTxList })
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
import blocklist from './recipient-blocklist'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if a specified account on a specified network is blocked
|
|
||||||
* @param {number} networkId
|
|
||||||
* @param {string} account
|
|
||||||
* @throws {Error} if the account is blocked on mainnet
|
|
||||||
*/
|
|
||||||
export function throwIfAccountIsBlocked (networkId, account) {
|
|
||||||
const mainnetId = 1
|
|
||||||
if (networkId !== mainnetId) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const accountToCheck = account.toLowerCase()
|
|
||||||
if (blocklist.includes(accountToCheck)) {
|
|
||||||
throw new Error('Recipient is a public account')
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
const blocklist = [
|
|
||||||
// IDEX phisher
|
|
||||||
'0x9bcb0A9d99d815Bb87ee3191b1399b1Bcc46dc77',
|
|
||||||
// Ganache default seed phrases
|
|
||||||
'0x627306090abab3a6e1400e9345bc60c78a8bef57',
|
|
||||||
'0xf17f52151ebef6c7334fad080c5704d77216b732',
|
|
||||||
'0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef',
|
|
||||||
'0x821aea9a577a9b44299b9c15c88cf3087f3b5544',
|
|
||||||
'0x0d1d4e623d10f9fba5db95830f7d3839406c6af2',
|
|
||||||
'0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e',
|
|
||||||
'0x2191ef87e392377ec08e7c08eb105ef5448eced5',
|
|
||||||
'0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5',
|
|
||||||
'0x6330a553fc93768f612722bb8c2ec78ac90b3bbc',
|
|
||||||
'0x5aeda56215b167893e80b4fe645ba6d5bab767de',
|
|
||||||
]
|
|
||||||
|
|
||||||
export default blocklist
|
|
@ -243,7 +243,7 @@ export default class PendingTransactionTracker extends EventEmitter {
|
|||||||
// This is called while the transaction is in-flight, so it is possible that the
|
// This is called while the transaction is in-flight, so it is possible that the
|
||||||
// list of completed transactions now includes the transaction we were looking at
|
// list of completed transactions now includes the transaction we were looking at
|
||||||
// and if that is the case, don't consider the transaction to have taken its own nonce
|
// and if that is the case, don't consider the transaction to have taken its own nonce
|
||||||
!(other.id === txMeta.id) && other.txParams.nonce === txMeta.txParams.nonce
|
!(other.id === txMeta.id) && other.txParams.nonce === txMeta.txParams.nonce,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,12 +57,39 @@ export default class TransactionStateManager extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@returns {array} - of txMetas that have been filtered for only the current network
|
* Returns the full tx list for the current network
|
||||||
*/
|
*
|
||||||
getTxList () {
|
* The list is iterated backwards as new transactions are pushed onto it.
|
||||||
|
*
|
||||||
|
* @param {number} [limit] a limit for the number of transactions to return
|
||||||
|
* @returns {Object[]} The {@code txMeta}s, filtered to the current network
|
||||||
|
*/
|
||||||
|
getTxList (limit) {
|
||||||
const network = this.getNetwork()
|
const network = this.getNetwork()
|
||||||
const fullTxList = this.getFullTxList()
|
const fullTxList = this.getFullTxList()
|
||||||
return fullTxList.filter((txMeta) => txMeta.metamaskNetworkId === network)
|
|
||||||
|
const nonces = new Set()
|
||||||
|
const txs = []
|
||||||
|
for (let i = fullTxList.length - 1; i > -1; i--) {
|
||||||
|
const txMeta = fullTxList[i]
|
||||||
|
if (txMeta.metamaskNetworkId !== network) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (limit !== undefined) {
|
||||||
|
const { nonce } = txMeta.txParams
|
||||||
|
if (!nonces.has(nonce)) {
|
||||||
|
if (nonces.size < limit) {
|
||||||
|
nonces.add(nonce)
|
||||||
|
} else {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
txs.unshift(txMeta)
|
||||||
|
}
|
||||||
|
return txs
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -481,4 +508,14 @@ export default class TransactionStateManager extends EventEmitter {
|
|||||||
const transactionList = this.getFullTxList()
|
const transactionList = this.getFullTxList()
|
||||||
this._saveTxList(transactionList.filter((txMeta) => txMeta.id !== txId))
|
this._saveTxList(transactionList.filter((txMeta) => txMeta.id !== txId))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters out the unapproved transactions
|
||||||
|
*/
|
||||||
|
|
||||||
|
clearUnapprovedTxs () {
|
||||||
|
const transactions = this.getFullTxList()
|
||||||
|
const nonUnapprovedTxs = transactions.filter((tx) => tx.status !== 'unapproved')
|
||||||
|
this._saveTxList(nonUnapprovedTxs)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,6 +151,14 @@ export default class AccountTracker {
|
|||||||
this.store.updateState({ accounts })
|
this.store.updateState({ accounts })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes all addresses and associated balances
|
||||||
|
*/
|
||||||
|
|
||||||
|
clearAccounts () {
|
||||||
|
this.store.updateState({ accounts: {} })
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given a block, updates this AccountTracker's currentBlockGasLimit, and then updates each local account's balance
|
* Given a block, updates this AccountTracker's currentBlockGasLimit, and then updates each local account's balance
|
||||||
* via EthQuery
|
* via EthQuery
|
||||||
|
@ -62,11 +62,8 @@ function hexValueIsEmpty (value) {
|
|||||||
function getRegistryForChainId (chainId) {
|
function getRegistryForChainId (chainId) {
|
||||||
switch (chainId) {
|
switch (chainId) {
|
||||||
case 1:
|
case 1:
|
||||||
// falls through
|
|
||||||
case 3:
|
case 3:
|
||||||
// falls through
|
|
||||||
case 4:
|
case 4:
|
||||||
// falls through
|
|
||||||
case 5:
|
case 5:
|
||||||
// Mainnet, Ropsten, Rinkeby, and Goerli, respectively, use the same address
|
// Mainnet, Ropsten, Rinkeby, and Goerli, respectively, use the same address
|
||||||
return '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'
|
return '0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'
|
||||||
|
@ -4,7 +4,7 @@ import allLocales from '../../_locales/index.json'
|
|||||||
|
|
||||||
const getPreferredLocales = extension.i18n ? promisify(
|
const getPreferredLocales = extension.i18n ? promisify(
|
||||||
extension.i18n.getAcceptLanguages,
|
extension.i18n.getAcceptLanguages,
|
||||||
{ errorFirst: false }
|
{ errorFirst: false },
|
||||||
) : async () => []
|
) : async () => []
|
||||||
|
|
||||||
// mapping some browsers return hyphen instead underscore in locale codes (e.g. zh_TW -> zh-tw)
|
// mapping some browsers return hyphen instead underscore in locale codes (e.g. zh_TW -> zh-tw)
|
||||||
|
@ -8,10 +8,69 @@ const METAMASK_ENVIRONMENT = process.env.METAMASK_ENVIRONMENT
|
|||||||
const SENTRY_DSN_PROD = 'https://3567c198f8a8412082d32655da2961d0@sentry.io/273505'
|
const SENTRY_DSN_PROD = 'https://3567c198f8a8412082d32655da2961d0@sentry.io/273505'
|
||||||
const SENTRY_DSN_DEV = 'https://f59f3dd640d2429d9d0e2445a87ea8e1@sentry.io/273496'
|
const SENTRY_DSN_DEV = 'https://f59f3dd640d2429d9d0e2445a87ea8e1@sentry.io/273496'
|
||||||
|
|
||||||
export default function setupSentry ({ release }) {
|
// This describes the subset of Redux state attached to errors sent to Sentry
|
||||||
|
// These properties have some potential to be useful for debugging, and they do
|
||||||
|
// not contain any identifiable information.
|
||||||
|
export const SENTRY_STATE = {
|
||||||
|
gas: true,
|
||||||
|
history: true,
|
||||||
|
metamask: {
|
||||||
|
alertEnabledness: true,
|
||||||
|
completedOnboarding: true,
|
||||||
|
connectedStatusPopoverHasBeenShown: true,
|
||||||
|
conversionDate: true,
|
||||||
|
conversionRate: true,
|
||||||
|
currentBlockGasLimit: true,
|
||||||
|
currentCurrency: true,
|
||||||
|
currentLocale: true,
|
||||||
|
customNonceValue: true,
|
||||||
|
defaultHomeActiveTabName: true,
|
||||||
|
featureFlags: true,
|
||||||
|
firstTimeFlowType: true,
|
||||||
|
forgottenPassword: true,
|
||||||
|
incomingTxLastFetchedBlocksByNetwork: true,
|
||||||
|
ipfsGateway: true,
|
||||||
|
isAccountMenuOpen: true,
|
||||||
|
isInitialized: true,
|
||||||
|
isUnlocked: true,
|
||||||
|
metaMetricsId: true,
|
||||||
|
metaMetricsSendCount: true,
|
||||||
|
nativeCurrency: true,
|
||||||
|
network: true,
|
||||||
|
nextNonce: true,
|
||||||
|
participateInMetaMetrics: true,
|
||||||
|
preferences: true,
|
||||||
|
provider: {
|
||||||
|
nickname: true,
|
||||||
|
ticker: true,
|
||||||
|
type: true,
|
||||||
|
},
|
||||||
|
seedPhraseBackedUp: true,
|
||||||
|
settings: {
|
||||||
|
chainId: true,
|
||||||
|
ticker: true,
|
||||||
|
nickname: true,
|
||||||
|
},
|
||||||
|
showRestorePrompt: true,
|
||||||
|
threeBoxDisabled: true,
|
||||||
|
threeBoxLastUpdated: true,
|
||||||
|
threeBoxSynced: true,
|
||||||
|
threeBoxSyncingAllowed: true,
|
||||||
|
unapprovedDecryptMsgCount: true,
|
||||||
|
unapprovedEncryptionPublicKeyMsgCount: true,
|
||||||
|
unapprovedMsgCount: true,
|
||||||
|
unapprovedPersonalMsgCount: true,
|
||||||
|
unapprovedTypedMessagesCount: true,
|
||||||
|
useBlockie: true,
|
||||||
|
useNonceField: true,
|
||||||
|
usePhishDetect: true,
|
||||||
|
welcomeScreenSeen: true,
|
||||||
|
},
|
||||||
|
unconnectedAccount: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function setupSentry ({ release, getState }) {
|
||||||
let sentryTarget
|
let sentryTarget
|
||||||
// detect brave
|
|
||||||
const isBrave = Boolean(window.chrome.ipcRenderer)
|
|
||||||
|
|
||||||
if (METAMASK_DEBUG || process.env.IN_TEST) {
|
if (METAMASK_DEBUG || process.env.IN_TEST) {
|
||||||
console.log(`Setting up Sentry Remote Error Reporting for '${METAMASK_ENVIRONMENT}': SENTRY_DSN_DEV`)
|
console.log(`Setting up Sentry Remote Error Reporting for '${METAMASK_ENVIRONMENT}': SENTRY_DSN_DEV`)
|
||||||
@ -33,16 +92,17 @@ export default function setupSentry ({ release }) {
|
|||||||
beforeSend: (report) => rewriteReport(report),
|
beforeSend: (report) => rewriteReport(report),
|
||||||
})
|
})
|
||||||
|
|
||||||
Sentry.configureScope((scope) => {
|
|
||||||
scope.setExtra('isBrave', isBrave)
|
|
||||||
})
|
|
||||||
|
|
||||||
function rewriteReport (report) {
|
function rewriteReport (report) {
|
||||||
try {
|
try {
|
||||||
// simplify certain complex error messages (e.g. Ethjs)
|
// simplify certain complex error messages (e.g. Ethjs)
|
||||||
simplifyErrorMessages(report)
|
simplifyErrorMessages(report)
|
||||||
// modify report urls
|
// modify report urls
|
||||||
rewriteReportUrls(report)
|
rewriteReportUrls(report)
|
||||||
|
// append app state
|
||||||
|
if (getState) {
|
||||||
|
const appState = getState()
|
||||||
|
report.extra.appState = appState
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.warn(err)
|
console.warn(err)
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ export function setupMultiplex (connectionStream) {
|
|||||||
if (err) {
|
if (err) {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
return mux
|
return mux
|
||||||
}
|
}
|
||||||
|
@ -143,7 +143,7 @@ export default class TypedMessageManager extends EventEmitter {
|
|||||||
assert.ok('from' in params, 'Params must include a "from" field.')
|
assert.ok('from' in params, 'Params must include a "from" field.')
|
||||||
assert.ok(
|
assert.ok(
|
||||||
typeof params.from === 'string' && isValidAddress(params.from),
|
typeof params.from === 'string' && isValidAddress(params.from),
|
||||||
'"from" field must be a valid, lowercase, hexadecimal Ethereum address string.'
|
'"from" field must be a valid, lowercase, hexadecimal Ethereum address string.',
|
||||||
)
|
)
|
||||||
|
|
||||||
switch (params.version) {
|
switch (params.version) {
|
||||||
|
@ -267,7 +267,14 @@ export default class MetamaskController extends EventEmitter {
|
|||||||
})
|
})
|
||||||
|
|
||||||
this.networkController.on('networkDidChange', () => {
|
this.networkController.on('networkDidChange', () => {
|
||||||
this.setCurrentCurrency(this.currencyRateController.state.currentCurrency, function () {})
|
this.setCurrentCurrency(
|
||||||
|
this.currencyRateController.state.currentCurrency,
|
||||||
|
(error) => {
|
||||||
|
if (error) {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
this.networkController.lookupNetwork()
|
this.networkController.lookupNetwork()
|
||||||
@ -624,6 +631,15 @@ export default class MetamaskController extends EventEmitter {
|
|||||||
// clear permissions
|
// clear permissions
|
||||||
this.permissionsController.clearPermissions()
|
this.permissionsController.clearPermissions()
|
||||||
|
|
||||||
|
// clear accounts in accountTracker
|
||||||
|
this.accountTracker.clearAccounts()
|
||||||
|
|
||||||
|
// clear cachedBalances
|
||||||
|
this.cachedBalancesController.clearCachedBalances()
|
||||||
|
|
||||||
|
// clear unapproved transactions
|
||||||
|
this.txController.txStateManager.clearUnapprovedTxs()
|
||||||
|
|
||||||
// create new vault
|
// create new vault
|
||||||
const vault = await keyringController.createNewVaultAndRestore(password, seed)
|
const vault = await keyringController.createNewVaultAndRestore(password, seed)
|
||||||
|
|
||||||
@ -710,7 +726,7 @@ export default class MetamaskController extends EventEmitter {
|
|||||||
const tokenAddress = ethUtil.toChecksumAddress(address)
|
const tokenAddress = ethUtil.toChecksumAddress(address)
|
||||||
return contractMap[tokenAddress] ? contractMap[tokenAddress].erc20 : true
|
return contractMap[tokenAddress] ? contractMap[tokenAddress].erc20 : true
|
||||||
})
|
})
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -728,7 +744,7 @@ export default class MetamaskController extends EventEmitter {
|
|||||||
const simpleKeyPairKeyrings = this.keyringController.getKeyringsByType('Simple Key Pair')
|
const simpleKeyPairKeyrings = this.keyringController.getKeyringsByType('Simple Key Pair')
|
||||||
const hdAccounts = await hdKeyring.getAccounts()
|
const hdAccounts = await hdKeyring.getAccounts()
|
||||||
const simpleKeyPairKeyringAccounts = await Promise.all(
|
const simpleKeyPairKeyringAccounts = await Promise.all(
|
||||||
simpleKeyPairKeyrings.map((keyring) => keyring.getAccounts())
|
simpleKeyPairKeyrings.map((keyring) => keyring.getAccounts()),
|
||||||
)
|
)
|
||||||
const simpleKeyPairAccounts = simpleKeyPairKeyringAccounts.reduce((acc, accounts) => [...acc, ...accounts], [])
|
const simpleKeyPairAccounts = simpleKeyPairKeyringAccounts.reduce((acc, accounts) => [...acc, ...accounts], [])
|
||||||
const accounts = {
|
const accounts = {
|
||||||
@ -1516,7 +1532,7 @@ export default class MetamaskController extends EventEmitter {
|
|||||||
if (err) {
|
if (err) {
|
||||||
log.error(err)
|
log.error(err)
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
dnode.on('remote', (remote) => {
|
dnode.on('remote', (remote) => {
|
||||||
// push updates to popup
|
// push updates to popup
|
||||||
@ -1568,7 +1584,7 @@ export default class MetamaskController extends EventEmitter {
|
|||||||
if (err) {
|
if (err) {
|
||||||
log.error(err)
|
log.error(err)
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1643,7 +1659,7 @@ export default class MetamaskController extends EventEmitter {
|
|||||||
if (err) {
|
if (err) {
|
||||||
log.error(err)
|
log.error(err)
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1854,7 +1870,7 @@ export default class MetamaskController extends EventEmitter {
|
|||||||
/**
|
/**
|
||||||
* A method for selecting a custom URL for an ethereum RPC provider and updating it
|
* A method for selecting a custom URL for an ethereum RPC provider and updating it
|
||||||
* @param {string} rpcUrl - A URL for a valid Ethereum RPC API.
|
* @param {string} rpcUrl - A URL for a valid Ethereum RPC API.
|
||||||
* @param {number} chainId - The chainId of the selected network.
|
* @param {string} chainId - The chainId of the selected network.
|
||||||
* @param {string} ticker - The ticker symbol of the selected network.
|
* @param {string} ticker - The ticker symbol of the selected network.
|
||||||
* @param {string} nickname - Optional nickname of the selected network.
|
* @param {string} nickname - Optional nickname of the selected network.
|
||||||
* @returns {Promise<String>} - The RPC Target URL confirmed.
|
* @returns {Promise<String>} - The RPC Target URL confirmed.
|
||||||
@ -1870,7 +1886,7 @@ export default class MetamaskController extends EventEmitter {
|
|||||||
/**
|
/**
|
||||||
* A method for selecting a custom URL for an ethereum RPC provider.
|
* A method for selecting a custom URL for an ethereum RPC provider.
|
||||||
* @param {string} rpcTarget - A URL for a valid Ethereum RPC API.
|
* @param {string} rpcTarget - A URL for a valid Ethereum RPC API.
|
||||||
* @param {number} chainId - The chainId of the selected network.
|
* @param {string} chainId - The chainId of the selected network.
|
||||||
* @param {string} ticker - The ticker symbol of the selected network.
|
* @param {string} ticker - The ticker symbol of the selected network.
|
||||||
* @param {string} nickname - Optional nickname of the selected network.
|
* @param {string} nickname - Optional nickname of the selected network.
|
||||||
* @returns {Promise<String>} - The RPC Target URL confirmed.
|
* @returns {Promise<String>} - The RPC Target URL confirmed.
|
||||||
|
28
app/scripts/migrations/047.js
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
const version = 47
|
||||||
|
import { cloneDeep } from 'lodash'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stringify the `metamaskNetworkId` property of all transactions
|
||||||
|
*/
|
||||||
|
export default {
|
||||||
|
version,
|
||||||
|
migrate: async function (originalVersionedData) {
|
||||||
|
const versionedData = cloneDeep(originalVersionedData)
|
||||||
|
versionedData.meta.version = version
|
||||||
|
const state = versionedData.data
|
||||||
|
versionedData.data = transformState(state)
|
||||||
|
return versionedData
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
function transformState (state) {
|
||||||
|
const transactions = state?.TransactionController?.transactions
|
||||||
|
if (Array.isArray(transactions)) {
|
||||||
|
transactions.forEach((transaction) => {
|
||||||
|
if (typeof transaction.metamaskNetworkId === 'number') {
|
||||||
|
transaction.metamaskNetworkId = transaction.metamaskNetworkId.toString()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return state
|
||||||
|
}
|
@ -57,6 +57,7 @@ const migrations = [
|
|||||||
require('./044').default,
|
require('./044').default,
|
||||||
require('./045').default,
|
require('./045').default,
|
||||||
require('./046').default,
|
require('./046').default,
|
||||||
|
require('./047').default,
|
||||||
]
|
]
|
||||||
|
|
||||||
export default migrations
|
export default migrations
|
||||||
|
@ -36,7 +36,10 @@ async function start () {
|
|||||||
|
|
||||||
// setup sentry error reporting
|
// setup sentry error reporting
|
||||||
const release = global.platform.getVersion()
|
const release = global.platform.getVersion()
|
||||||
setupSentry({ release })
|
setupSentry({
|
||||||
|
release,
|
||||||
|
getState: () => window.getSentryState?.() || {},
|
||||||
|
})
|
||||||
|
|
||||||
// identify window type (popup, notification)
|
// identify window type (popup, notification)
|
||||||
const windowType = getEnvironmentType()
|
const windowType = getEnvironmentType()
|
||||||
|
@ -1,59 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>MetaMask</title>
|
|
||||||
</head>
|
|
||||||
<style>
|
|
||||||
*{
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
img{
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
html, body{
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
@keyframes logoAmin{
|
|
||||||
from {transform: scale(1);}
|
|
||||||
50%{transform: scale(1.1);}
|
|
||||||
to {transform: scale(1);}
|
|
||||||
}
|
|
||||||
.unsupport{
|
|
||||||
width: 80%;
|
|
||||||
height: auto;
|
|
||||||
overflow: hidden;
|
|
||||||
padding: 10px;
|
|
||||||
}
|
|
||||||
.unsupport > img{
|
|
||||||
margin: 0 auto 31px auto;
|
|
||||||
width: 136px;
|
|
||||||
height: auto;
|
|
||||||
animation: logoAmin 1s infinite linear;
|
|
||||||
}
|
|
||||||
.unsupport > h1{
|
|
||||||
text-align: center;
|
|
||||||
font-family: Gotham;
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 500;
|
|
||||||
font-style: normal;
|
|
||||||
font-stretch: normal;
|
|
||||||
line-height: normal;
|
|
||||||
letter-spacing: 1.3px;
|
|
||||||
color: #33559f;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
|
||||||
<body>
|
|
||||||
<div class="unsupport">
|
|
||||||
<img src="./images/cancel.png" alt="">
|
|
||||||
<h1>ENS resolver only support on Ethereum mainnet</h1>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,26 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
'confirm sig requests': {
|
|
||||||
signMessage: (_, cb) => {
|
|
||||||
const stateUpdate = {
|
|
||||||
unapprovedMsgs: {},
|
|
||||||
unapprovedMsgCount: 0,
|
|
||||||
}
|
|
||||||
return cb(null, stateUpdate)
|
|
||||||
},
|
|
||||||
signPersonalMessage: (_, cb) => {
|
|
||||||
const stateUpdate = {
|
|
||||||
unapprovedPersonalMsgs: {},
|
|
||||||
unapprovedPersonalMsgCount: 0,
|
|
||||||
}
|
|
||||||
return cb(null, stateUpdate)
|
|
||||||
},
|
|
||||||
signTypedMessage: (_, cb) => {
|
|
||||||
const stateUpdate = {
|
|
||||||
unapprovedTypedMessages: {},
|
|
||||||
unapprovedTypedMessagesCount: 0,
|
|
||||||
}
|
|
||||||
return cb(null, stateUpdate)
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -34,7 +34,7 @@ function setupTaskDisplay (taskEvents) {
|
|||||||
|
|
||||||
function displayChart (data) {
|
function displayChart (data) {
|
||||||
// sort tasks by start time
|
// sort tasks by start time
|
||||||
data.sort((a, b,) => a[1] - b[1])
|
data.sort((a, b) => a[1] - b[1])
|
||||||
|
|
||||||
// get bounds
|
// get bounds
|
||||||
const first = Math.min(...data.map((entry) => entry[1]))
|
const first = Math.min(...data.map((entry) => entry[1]))
|
||||||
|
@ -25,7 +25,7 @@ function createEtcTasks ({ browserPlatforms, livereload }) {
|
|||||||
|
|
||||||
// zip tasks for distribution
|
// zip tasks for distribution
|
||||||
const zip = createTask('zip', composeParallel(
|
const zip = createTask('zip', composeParallel(
|
||||||
...browserPlatforms.map((platform) => createZipTask(platform))
|
...browserPlatforms.map((platform) => createZipTask(platform)),
|
||||||
))
|
))
|
||||||
|
|
||||||
return { clean, reload, zip }
|
return { clean, reload, zip }
|
||||||
|
@ -39,9 +39,9 @@ function defineAllTasks () {
|
|||||||
scriptTasks.dev,
|
scriptTasks.dev,
|
||||||
staticTasks.dev,
|
staticTasks.dev,
|
||||||
manifestTasks.dev,
|
manifestTasks.dev,
|
||||||
reload
|
reload,
|
||||||
)
|
),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
// build for test development (livereload)
|
// build for test development (livereload)
|
||||||
@ -53,9 +53,9 @@ function defineAllTasks () {
|
|||||||
scriptTasks.testDev,
|
scriptTasks.testDev,
|
||||||
staticTasks.dev,
|
staticTasks.dev,
|
||||||
manifestTasks.testDev,
|
manifestTasks.testDev,
|
||||||
reload
|
reload,
|
||||||
)
|
),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
// build for prod release
|
// build for prod release
|
||||||
@ -69,7 +69,7 @@ function defineAllTasks () {
|
|||||||
manifestTasks.prod,
|
manifestTasks.prod,
|
||||||
),
|
),
|
||||||
zip,
|
zip,
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
// build for CI testing
|
// build for CI testing
|
||||||
@ -82,7 +82,7 @@ function defineAllTasks () {
|
|||||||
staticTasks.prod,
|
staticTasks.prod,
|
||||||
manifestTasks.test,
|
manifestTasks.test,
|
||||||
),
|
),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
// special build for minimal CI testing
|
// special build for minimal CI testing
|
||||||
|
@ -94,13 +94,13 @@ function createScriptTasks ({ browserPlatforms, livereload }) {
|
|||||||
|
|
||||||
const standardSubtasks = standardBundles.map((filename) => {
|
const standardSubtasks = standardBundles.map((filename) => {
|
||||||
return createTask(`${taskPrefix}:${filename}`,
|
return createTask(`${taskPrefix}:${filename}`,
|
||||||
createBundleTaskForBuildJsExtensionNormal({ filename, devMode, testing })
|
createBundleTaskForBuildJsExtensionNormal({ filename, devMode, testing }),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
// inpage must be built before contentscript
|
// inpage must be built before contentscript
|
||||||
// because inpage bundle result is included inside contentscript
|
// because inpage bundle result is included inside contentscript
|
||||||
const contentscriptSubtask = createTask(`${taskPrefix}:contentscript`,
|
const contentscriptSubtask = createTask(`${taskPrefix}:contentscript`,
|
||||||
createTaskForBuildJsExtensionContentscript({ devMode, testing })
|
createTaskForBuildJsExtensionContentscript({ devMode, testing }),
|
||||||
)
|
)
|
||||||
|
|
||||||
// task for initiating livereload
|
// task for initiating livereload
|
||||||
@ -156,7 +156,7 @@ function createScriptTasks ({ browserPlatforms, livereload }) {
|
|||||||
externalDependencies: devMode ? undefined : externalDependenciesMap[contentscript],
|
externalDependencies: devMode ? undefined : externalDependenciesMap[contentscript],
|
||||||
devMode,
|
devMode,
|
||||||
testing,
|
testing,
|
||||||
})
|
}),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
22
development/create-static-server.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
const http = require('http')
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
const serveHandler = require('serve-handler')
|
||||||
|
|
||||||
|
const createStaticServer = (rootDirectory) => {
|
||||||
|
return http.createServer((request, response) => {
|
||||||
|
if (request.url.startsWith('/node_modules/')) {
|
||||||
|
request.url = request.url.substr(14)
|
||||||
|
return serveHandler(request, response, {
|
||||||
|
directoryListing: false,
|
||||||
|
public: path.resolve('./node_modules'),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return serveHandler(request, response, {
|
||||||
|
directoryListing: false,
|
||||||
|
public: rootDirectory,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = createStaticServer
|
@ -1,27 +0,0 @@
|
|||||||
/* eslint-disable import/no-dynamic-require */
|
|
||||||
const fs = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
const promisify = require('pify')
|
|
||||||
const enLocaleMessages = require('../app/_locales/en/messages.json')
|
|
||||||
|
|
||||||
const writeFile = promisify(fs.writeFile)
|
|
||||||
|
|
||||||
start().catch(console.error)
|
|
||||||
|
|
||||||
async function start () {
|
|
||||||
const statesPath = path.join(__dirname, 'states')
|
|
||||||
const stateFilesNames = await promisify(fs.readdir)(statesPath)
|
|
||||||
const states = {}
|
|
||||||
await Promise.all(stateFilesNames.map(async (stateFileName) => {
|
|
||||||
const stateFilePath = path.join(__dirname, 'states', stateFileName)
|
|
||||||
const state = require(stateFilePath)
|
|
||||||
|
|
||||||
state.localeMessages = { en: enLocaleMessages, current: {} }
|
|
||||||
|
|
||||||
const stateName = stateFileName.split('.')[0].replace(/-/g, ' ', 'g')
|
|
||||||
states[stateName] = state
|
|
||||||
}))
|
|
||||||
const generatedFileContent = `module.exports = ${JSON.stringify(states)}`
|
|
||||||
const generatedFilePath = path.join(__dirname, 'states.js')
|
|
||||||
await writeFile(generatedFilePath, generatedFileContent)
|
|
||||||
}
|
|
@ -1,60 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>MetaMask</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<script src="./bundle.js" type="text/javascript" charset="utf-8"></script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
html, body, #test-container, .super-dev-container {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
position: relative;
|
|
||||||
background: white;
|
|
||||||
}
|
|
||||||
#app-content {
|
|
||||||
background: #F7F7F7;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
liveReloadCode(Date.now(), 300)
|
|
||||||
function liveReloadCode(lastUpdate, updateRate) {
|
|
||||||
setTimeout(iter, updateRate)
|
|
||||||
|
|
||||||
function iter() {
|
|
||||||
var xhr = new XMLHttpRequest()
|
|
||||||
|
|
||||||
xhr.open('GET', '/-/live-reload')
|
|
||||||
xhr.onreadystatechange = function() {
|
|
||||||
if(xhr.readyState !== 4) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
var change = JSON.parse(xhr.responseText).lastUpdate
|
|
||||||
|
|
||||||
if(lastUpdate < change) {
|
|
||||||
return reload()
|
|
||||||
}
|
|
||||||
} catch(err) {
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr =
|
|
||||||
xhr.onreadystatechange = null
|
|
||||||
setTimeout(iter, updateRate)
|
|
||||||
}
|
|
||||||
|
|
||||||
xhr.send(null)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function reload() {
|
|
||||||
window.location.reload()
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,156 +0,0 @@
|
|||||||
/* MOCK DEV
|
|
||||||
*
|
|
||||||
* This is a utility module.
|
|
||||||
* It initializes a minimalist browserifiable project
|
|
||||||
* that contains the Metamask UI, with a local background process.
|
|
||||||
*
|
|
||||||
* Includes a state reset button for restoring to initial state.
|
|
||||||
*
|
|
||||||
* This is a convenient way to develop and test the plugin
|
|
||||||
* without having to re-open the plugin or even re-build it.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import log from 'loglevel'
|
|
||||||
import React from 'react'
|
|
||||||
import { render } from 'react-dom'
|
|
||||||
import { createStore, applyMiddleware } from 'redux'
|
|
||||||
import thunkMiddleware from 'redux-thunk'
|
|
||||||
import * as qs from 'qs'
|
|
||||||
import Selector from './selector'
|
|
||||||
import * as actions from '../ui/app/store/actions'
|
|
||||||
import Root from '../ui/app/pages'
|
|
||||||
import rootReducer from '../ui/app/ducks'
|
|
||||||
import MetamaskController from '../app/scripts/metamask-controller'
|
|
||||||
import firstTimeState from '../app/scripts/first-time-state'
|
|
||||||
import ExtensionPlatform from '../app/scripts/platforms/extension'
|
|
||||||
|
|
||||||
const backGroundConnectionModifiers = require('./backGroundConnectionModifiers')
|
|
||||||
|
|
||||||
const noop = function () {}
|
|
||||||
|
|
||||||
// the states file is generated before this file is run, but after `lint` is run
|
|
||||||
const states = require('./states') /* eslint-disable-line import/no-unresolved */
|
|
||||||
|
|
||||||
window.log = log
|
|
||||||
log.setLevel('debug')
|
|
||||||
|
|
||||||
const routerPath = window.location.href.split('#')[1]
|
|
||||||
let queryString = {}
|
|
||||||
let selectedView
|
|
||||||
|
|
||||||
if (routerPath) {
|
|
||||||
queryString = qs.parse(routerPath.split('?')[1])
|
|
||||||
}
|
|
||||||
|
|
||||||
selectedView = queryString.view || 'confirm sig requests'
|
|
||||||
const firstState = states[selectedView]
|
|
||||||
updateQueryParams(selectedView)
|
|
||||||
|
|
||||||
function updateQueryParams (newView) {
|
|
||||||
queryString.view = newView
|
|
||||||
const params = qs.stringify(queryString)
|
|
||||||
const locationPaths = window.location.href.split('#')
|
|
||||||
const routerPath = locationPaths[1] || ''
|
|
||||||
const newPath = locationPaths[0] + '#' + routerPath.split('?')[0] + `?${params}`
|
|
||||||
|
|
||||||
if (window.location.href !== newPath) {
|
|
||||||
window.location.href = newPath
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// MetaMask Controller
|
|
||||||
//
|
|
||||||
|
|
||||||
// some extension platform APIs must be mocked
|
|
||||||
function mockPlatformApis () {
|
|
||||||
global.platform.getVersion = () => '0.0.0'
|
|
||||||
}
|
|
||||||
|
|
||||||
const controller = new MetamaskController({
|
|
||||||
// User confirmation callbacks:
|
|
||||||
showUnconfirmedMessage: noop,
|
|
||||||
showUnapprovedTx: noop,
|
|
||||||
platform: {},
|
|
||||||
// initial state
|
|
||||||
initState: firstTimeState,
|
|
||||||
})
|
|
||||||
global.metamaskController = controller
|
|
||||||
global.platform = new ExtensionPlatform()
|
|
||||||
mockPlatformApis()
|
|
||||||
|
|
||||||
//
|
|
||||||
// User Interface
|
|
||||||
//
|
|
||||||
|
|
||||||
actions._setBackgroundConnection(controller.getApi())
|
|
||||||
function updateState (stateName) {
|
|
||||||
selectedView = stateName
|
|
||||||
updateQueryParams(stateName)
|
|
||||||
const newState = states[selectedView]
|
|
||||||
return {
|
|
||||||
type: 'GLOBAL_FORCE_UPDATE',
|
|
||||||
value: newState,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function modifyBackgroundConnection (backgroundConnectionModifier) {
|
|
||||||
const modifiedBackgroundConnection = Object.assign({}, controller.getApi(), backgroundConnectionModifier)
|
|
||||||
actions._setBackgroundConnection(modifiedBackgroundConnection)
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse opts
|
|
||||||
const store = createStore(
|
|
||||||
(state, action) =>
|
|
||||||
(action.type === 'GLOBAL_FORCE_UPDATE'
|
|
||||||
? action.value
|
|
||||||
: rootReducer(state, action)),
|
|
||||||
firstState,
|
|
||||||
applyMiddleware(thunkMiddleware),
|
|
||||||
)
|
|
||||||
|
|
||||||
// start app
|
|
||||||
startApp()
|
|
||||||
|
|
||||||
function startApp () {
|
|
||||||
const body = document.body
|
|
||||||
const container = document.createElement('div')
|
|
||||||
container.id = 'test-container'
|
|
||||||
body.appendChild(container)
|
|
||||||
|
|
||||||
render(
|
|
||||||
<div className="super-dev-container">
|
|
||||||
<button
|
|
||||||
onClick={(ev) => {
|
|
||||||
ev.preventDefault()
|
|
||||||
store.dispatch(updateState('terms'))
|
|
||||||
}}
|
|
||||||
style={{
|
|
||||||
margin: '19px 19px 0px 19px',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Reset State
|
|
||||||
</button>
|
|
||||||
<Selector
|
|
||||||
states={states}
|
|
||||||
selectedKey={selectedView}
|
|
||||||
updateState={updateState}
|
|
||||||
store={store}
|
|
||||||
modifyBackgroundConnection={modifyBackgroundConnection}
|
|
||||||
backGroundConnectionModifiers={backGroundConnectionModifiers}
|
|
||||||
/>
|
|
||||||
<div
|
|
||||||
id="app-content"
|
|
||||||
style={{
|
|
||||||
height: '500px',
|
|
||||||
width: '360px',
|
|
||||||
boxShadow: 'grey 0px 2px 9px',
|
|
||||||
margin: '20px',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Root store={store} />
|
|
||||||
</div>
|
|
||||||
</div>,
|
|
||||||
container,
|
|
||||||
)
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
import PropTypes from 'prop-types'
|
|
||||||
import React, { Component } from 'react'
|
|
||||||
|
|
||||||
export default class Selector extends Component {
|
|
||||||
state = {}
|
|
||||||
|
|
||||||
render () {
|
|
||||||
const {
|
|
||||||
states,
|
|
||||||
selectedKey,
|
|
||||||
updateState,
|
|
||||||
store,
|
|
||||||
modifyBackgroundConnection,
|
|
||||||
backGroundConnectionModifiers,
|
|
||||||
} = this.props
|
|
||||||
const selected = this.state.selected || selectedKey
|
|
||||||
|
|
||||||
return (
|
|
||||||
<select
|
|
||||||
style={{ margin: '20px 20px 0px' }}
|
|
||||||
value={selected}
|
|
||||||
onChange={(event) => {
|
|
||||||
const selectedKey = event.target.value
|
|
||||||
const backgroundConnectionModifier = backGroundConnectionModifiers[selectedKey]
|
|
||||||
modifyBackgroundConnection(backgroundConnectionModifier || {})
|
|
||||||
store.dispatch(updateState(selectedKey))
|
|
||||||
this.setState({ selected: selectedKey })
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{Object.keys(states).map((stateName, index) => {
|
|
||||||
return (
|
|
||||||
<option key={index} value={stateName}>
|
|
||||||
{stateName}
|
|
||||||
</option>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</select>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Selector.propTypes = {
|
|
||||||
states: PropTypes.object.isRequired,
|
|
||||||
selectedKey: PropTypes.string.isRequired,
|
|
||||||
updateState: PropTypes.func.isRequired,
|
|
||||||
store: PropTypes.object.isRequired,
|
|
||||||
modifyBackgroundConnection: PropTypes.func.isRequired,
|
|
||||||
backGroundConnectionModifiers: PropTypes.object.isRequired,
|
|
||||||
}
|
|
@ -1,482 +0,0 @@
|
|||||||
{
|
|
||||||
"metamask": {
|
|
||||||
"completedOnboarding": true,
|
|
||||||
"isInitialized": true,
|
|
||||||
"isUnlocked": true,
|
|
||||||
"featureFlags": {"betaUI": true},
|
|
||||||
"rpcTarget": "https://rawtestrpc.metamask.io/",
|
|
||||||
"identities": {
|
|
||||||
"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": {
|
|
||||||
"address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
|
||||||
"name": "Send Account 1"
|
|
||||||
},
|
|
||||||
"0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": {
|
|
||||||
"address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb",
|
|
||||||
"name": "Send Account 2"
|
|
||||||
},
|
|
||||||
"0x2f8d4a878cfa04a6e60d46362f5644deab66572d": {
|
|
||||||
"address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d",
|
|
||||||
"name": "Send Account 3"
|
|
||||||
},
|
|
||||||
"0xd85a4b6a394794842887b8284293d69163007bbb": {
|
|
||||||
"address": "0xd85a4b6a394794842887b8284293d69163007bbb",
|
|
||||||
"name": "Send Account 4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"abTests": {
|
|
||||||
"fullScreenVsPopup": "control"
|
|
||||||
},
|
|
||||||
"cachedBalances": {},
|
|
||||||
"unapprovedTxs": {},
|
|
||||||
"conversionRate": 19855,
|
|
||||||
"conversionDate": 1489013762,
|
|
||||||
"noActiveNotices": true,
|
|
||||||
"frequentRpcList": [],
|
|
||||||
"network": "3",
|
|
||||||
"accounts": {
|
|
||||||
"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": {
|
|
||||||
"code": "0x",
|
|
||||||
"balance": "0x47c9d71831c76efe",
|
|
||||||
"nonce": "0x1b",
|
|
||||||
"address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825"
|
|
||||||
},
|
|
||||||
"0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": {
|
|
||||||
"code": "0x",
|
|
||||||
"balance": "0x37452b1315889f80",
|
|
||||||
"nonce": "0xa",
|
|
||||||
"address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb"
|
|
||||||
},
|
|
||||||
"0x2f8d4a878cfa04a6e60d46362f5644deab66572d": {
|
|
||||||
"code": "0x",
|
|
||||||
"balance": "0x30c9d71831c76efe",
|
|
||||||
"nonce": "0x1c",
|
|
||||||
"address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d"
|
|
||||||
},
|
|
||||||
"0xd85a4b6a394794842887b8284293d69163007bbb": {
|
|
||||||
"code": "0x",
|
|
||||||
"balance": "0x0",
|
|
||||||
"nonce": "0x0",
|
|
||||||
"address": "0xd85a4b6a394794842887b8284293d69163007bbb"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"addressBook": [
|
|
||||||
{
|
|
||||||
"address": "0x06195827297c7a80a443b6894d3bdb8824b43896",
|
|
||||||
"name": "Address Book Account 1"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"tokens": [],
|
|
||||||
"transactions": {},
|
|
||||||
"incomingTransactions": {},
|
|
||||||
"currentNetworkTxList": [],
|
|
||||||
"unapprovedMsgs": {},
|
|
||||||
"unapprovedMsgCount": 0,
|
|
||||||
"unapprovedPersonalMsgs": {},
|
|
||||||
"unapprovedPersonalMsgCount": 0,
|
|
||||||
"keyringTypes": [
|
|
||||||
"Simple Key Pair",
|
|
||||||
"HD Key Tree"
|
|
||||||
],
|
|
||||||
"keyrings": [
|
|
||||||
{
|
|
||||||
"type": "HD Key Tree",
|
|
||||||
"accounts": [
|
|
||||||
"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
|
||||||
"0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb",
|
|
||||||
"0x2f8d4a878cfa04a6e60d46362f5644deab66572d"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "Simple Key Pair",
|
|
||||||
"accounts": [
|
|
||||||
"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
|
||||||
"currentCurrency": "PHP",
|
|
||||||
"provider": {
|
|
||||||
"type": "testnet"
|
|
||||||
},
|
|
||||||
"send": {
|
|
||||||
"gasLimit": null,
|
|
||||||
"gasPrice": null,
|
|
||||||
"gasTotal": "0xb451dc41b578",
|
|
||||||
"tokenBalance": null,
|
|
||||||
"from": "",
|
|
||||||
"to": "",
|
|
||||||
"amount": "0x0",
|
|
||||||
"memo": "",
|
|
||||||
"errors": {},
|
|
||||||
"warnings": {},
|
|
||||||
"maxModeOn": false,
|
|
||||||
"editingTransactionId": null
|
|
||||||
},
|
|
||||||
"currentLocale": "en",
|
|
||||||
"preferences": {
|
|
||||||
"useNativeCurrencyAsPrimaryCurrency": true,
|
|
||||||
"showFiatInTestnets": true
|
|
||||||
},
|
|
||||||
"frequentRpcListDetail": []
|
|
||||||
},
|
|
||||||
"appState": {
|
|
||||||
"menuOpen": false,
|
|
||||||
"currentView": {
|
|
||||||
"name": "accountDetail",
|
|
||||||
"detailView": null,
|
|
||||||
"context": "0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc"
|
|
||||||
},
|
|
||||||
"accountDetail": {
|
|
||||||
"subview": "transactions"
|
|
||||||
},
|
|
||||||
"sidebar": {},
|
|
||||||
"modal": {
|
|
||||||
"modalState": {},
|
|
||||||
"previousModalState": {}
|
|
||||||
},
|
|
||||||
"isLoading": false,
|
|
||||||
"warning": null,
|
|
||||||
"scrollToBottom": false,
|
|
||||||
"forgottenPassword": null
|
|
||||||
},
|
|
||||||
"identities": {},
|
|
||||||
"confirmTransaction": {
|
|
||||||
"txData": {},
|
|
||||||
"tokenData": {},
|
|
||||||
"methodData": {},
|
|
||||||
"tokenProps": {
|
|
||||||
"tokenDecimals": "",
|
|
||||||
"tokenSymbol": ""
|
|
||||||
},
|
|
||||||
"fiatTransactionAmount": "",
|
|
||||||
"fiatTransactionFee": "",
|
|
||||||
"fiatTransactionTotal": "",
|
|
||||||
"ethTransactionAmount": "",
|
|
||||||
"ethTransactionFee": "",
|
|
||||||
"ethTransactionTotal": "",
|
|
||||||
"hexGasTotal": "",
|
|
||||||
"nonce": "",
|
|
||||||
"fetchingMethodData": false
|
|
||||||
},
|
|
||||||
"gas": {
|
|
||||||
"customData": {
|
|
||||||
"price": null,
|
|
||||||
"limit": "0x186a0"
|
|
||||||
},
|
|
||||||
"basicEstimates": {
|
|
||||||
"average": 73,
|
|
||||||
"avgWait": 10.6,
|
|
||||||
"blockTime": 13.871657754010695,
|
|
||||||
"blockNum": 6655504,
|
|
||||||
"fast": 160,
|
|
||||||
"fastest": 290,
|
|
||||||
"fastestWait": 0.5,
|
|
||||||
"fastWait": 0.6,
|
|
||||||
"safeLow": 50,
|
|
||||||
"safeLowWait": 16.1,
|
|
||||||
"speed": 0.6702462692280712
|
|
||||||
},
|
|
||||||
"basicEstimateIsLoading": false,
|
|
||||||
"gasEstimatesLoading": false,
|
|
||||||
"priceAndTimeEstimates": [
|
|
||||||
{
|
|
||||||
"expectedTime": "1374.1168296452973076627",
|
|
||||||
"expectedWait": 99.0593088449,
|
|
||||||
"gasprice": 4.1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "1280.88976972896682763716",
|
|
||||||
"expectedWait": 92.3386225672,
|
|
||||||
"gasprice": 4.4
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "1245.13314632680319175597",
|
|
||||||
"expectedWait": 89.7609477113,
|
|
||||||
"gasprice": 4.8
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "1227.99925007911014385881",
|
|
||||||
"expectedWait": 88.5257747744,
|
|
||||||
"gasprice": 4.9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "965.52572720362993349654",
|
|
||||||
"expectedWait": 69.6042062402,
|
|
||||||
"gasprice": 5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "917.466895447437420776",
|
|
||||||
"expectedWait": 66.1396721082,
|
|
||||||
"gasprice": 5.1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "915.81694044041496090521",
|
|
||||||
"expectedWait": 66.0207277804,
|
|
||||||
"gasprice": 5.2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "902.13145619709089691874",
|
|
||||||
"expectedWait": 65.034148924,
|
|
||||||
"gasprice": 5.3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "890.83591122200105749896",
|
|
||||||
"expectedWait": 64.2198594443,
|
|
||||||
"gasprice": 5.4
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "879.10469542971335712248",
|
|
||||||
"expectedWait": 63.3741627006,
|
|
||||||
"gasprice": 5.5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "876.99737395823100420974",
|
|
||||||
"expectedWait": 63.2222470818,
|
|
||||||
"gasprice": 5.6
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "865.96781957003849098957",
|
|
||||||
"expectedWait": 62.4271327138,
|
|
||||||
"gasprice": 5.7
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "865.44839472121496158482",
|
|
||||||
"expectedWait": 62.3896876688,
|
|
||||||
"gasprice": 5.8
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "802.16173170976255602161",
|
|
||||||
"expectedWait": 57.8273877524,
|
|
||||||
"gasprice": 6
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "780.79313908053047074843",
|
|
||||||
"expectedWait": 56.2869379368,
|
|
||||||
"gasprice": 6.1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "770.04888359616469549233",
|
|
||||||
"expectedWait": 55.5123906062,
|
|
||||||
"gasprice": 6.2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "745.01007965146736962697",
|
|
||||||
"expectedWait": 53.7073573226,
|
|
||||||
"gasprice": 6.3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "735.19921111598501681816",
|
|
||||||
"expectedWait": 53.0000973318,
|
|
||||||
"gasprice": 6.6
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "705.68767153912619368694",
|
|
||||||
"expectedWait": 50.8726270539,
|
|
||||||
"gasprice": 6.7
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "705.26438593445239690121",
|
|
||||||
"expectedWait": 50.8421126329,
|
|
||||||
"gasprice": 6.9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "652.51573119854865429742",
|
|
||||||
"expectedWait": 47.0394918019,
|
|
||||||
"gasprice": 7
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "635.51471669299464383162",
|
|
||||||
"expectedWait": 45.813898235,
|
|
||||||
"gasprice": 7.1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "634.37181911960854759036",
|
|
||||||
"expectedWait": 45.7315073922,
|
|
||||||
"gasprice": 7.2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "633.23097691113902888918",
|
|
||||||
"expectedWait": 45.6492647195,
|
|
||||||
"gasprice": 7.3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "112.7753456245379663928",
|
|
||||||
"expectedWait": 8.1299111919,
|
|
||||||
"gasprice": 7.6
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "102.9665314468898381829",
|
|
||||||
"expectedWait": 7.4227992986,
|
|
||||||
"gasprice": 8
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "100.94784507024919649891",
|
|
||||||
"expectedWait": 7.2772733339,
|
|
||||||
"gasprice": 8.1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "100.46445647447807351078",
|
|
||||||
"expectedWait": 7.2424261221,
|
|
||||||
"gasprice": 8.8
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "84.91686745986737853339",
|
|
||||||
"expectedWait": 6.1216091808,
|
|
||||||
"gasprice": 9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "80.39566429296684383503",
|
|
||||||
"expectedWait": 5.7956781892,
|
|
||||||
"gasprice": 9.1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "78.24522052614759252715",
|
|
||||||
"expectedWait": 5.6406539084,
|
|
||||||
"gasprice": 9.2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "77.1685119880459882636",
|
|
||||||
"expectedWait": 5.5630345959,
|
|
||||||
"gasprice": 9.5
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "72.43649507646737870178",
|
|
||||||
"expectedWait": 5.2219061601,
|
|
||||||
"gasprice": 9.8
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "71.48259532351443753818",
|
|
||||||
"expectedWait": 5.1531400638,
|
|
||||||
"gasprice": 9.9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "58.23892805162994573827",
|
|
||||||
"expectedWait": 4.1984115442,
|
|
||||||
"gasprice": 10
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "53.13065124862245917617",
|
|
||||||
"expectedWait": 3.8301587446,
|
|
||||||
"gasprice": 10.1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "53.03510209647058751971",
|
|
||||||
"expectedWait": 3.82327066,
|
|
||||||
"gasprice": 10.3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "49.06846157804491912403",
|
|
||||||
"expectedWait": 3.5373177776,
|
|
||||||
"gasprice": 11
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "48.30893330101818116637",
|
|
||||||
"expectedWait": 3.4825638116,
|
|
||||||
"gasprice": 11.1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "48.25099734861818116715",
|
|
||||||
"expectedWait": 3.4783872414,
|
|
||||||
"gasprice": 11.3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "47.64416885027272662988",
|
|
||||||
"expectedWait": 3.4346413165,
|
|
||||||
"gasprice": 11.9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "46.76354741392085498401",
|
|
||||||
"expectedWait": 3.3711578128,
|
|
||||||
"gasprice": 12.6
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "44.99427448545882292232",
|
|
||||||
"expectedWait": 3.2436119232,
|
|
||||||
"gasprice": 13
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "44.61790554199251276697",
|
|
||||||
"expectedWait": 3.2164796979,
|
|
||||||
"gasprice": 13.1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "42.87832690973048070488",
|
|
||||||
"expectedWait": 3.0910744534,
|
|
||||||
"gasprice": 14
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "42.21224091308663044649",
|
|
||||||
"expectedWait": 3.0430566888,
|
|
||||||
"gasprice": 14.9
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "41.15715335111336842864",
|
|
||||||
"expectedWait": 2.9669960203,
|
|
||||||
"gasprice": 15
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "40.9600723880876999821",
|
|
||||||
"expectedWait": 2.9527885646,
|
|
||||||
"gasprice": 15.1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "38.89138450301711177472",
|
|
||||||
"expectedWait": 2.8036580193,
|
|
||||||
"gasprice": 15.8
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "37.89655640860213852611",
|
|
||||||
"expectedWait": 2.7319414219,
|
|
||||||
"gasprice": 16
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "37.35265517364705831954",
|
|
||||||
"expectedWait": 2.692731888,
|
|
||||||
"gasprice": 17.4
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "36.79447683873796741798",
|
|
||||||
"expectedWait": 2.652493126,
|
|
||||||
"gasprice": 17.8
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "36.11439350850802090309",
|
|
||||||
"expectedWait": 2.6034663015,
|
|
||||||
"gasprice": 19
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "31.32676199432192471101",
|
|
||||||
"expectedWait": 2.2583286403,
|
|
||||||
"gasprice": 20
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "30.76792490132192471855",
|
|
||||||
"expectedWait": 2.2180423888,
|
|
||||||
"gasprice": 20.1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "29.94493658520962526441",
|
|
||||||
"expectedWait": 2.1587136243,
|
|
||||||
"gasprice": 25
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "29.53287347625561457478",
|
|
||||||
"expectedWait": 2.1290082267,
|
|
||||||
"gasprice": 29
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"expectedTime": "29.09318627175614934008",
|
|
||||||
"expectedWait": 2.0973114236,
|
|
||||||
"gasprice": 47
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"priceAndTimeEstimatesLastRetrieved": 1541527901281,
|
|
||||||
"errors": {}
|
|
||||||
},
|
|
||||||
"unconnectedAccount": {
|
|
||||||
"state": "CLOSED"
|
|
||||||
},
|
|
||||||
"history": {
|
|
||||||
"mostRecentOverviewPage": "/"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,10 +1,10 @@
|
|||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const http = require('http')
|
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
|
||||||
const chalk = require('chalk')
|
const chalk = require('chalk')
|
||||||
const pify = require('pify')
|
const pify = require('pify')
|
||||||
const serveHandler = require('serve-handler')
|
|
||||||
|
const createStaticServer = require('./create-static-server')
|
||||||
|
|
||||||
const fsStat = pify(fs.stat)
|
const fsStat = pify(fs.stat)
|
||||||
const DEFAULT_PORT = 9080
|
const DEFAULT_PORT = 9080
|
||||||
@ -24,19 +24,7 @@ const onRequest = (request, response) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const startServer = ({ port, rootDirectory }) => {
|
const startServer = ({ port, rootDirectory }) => {
|
||||||
const server = http.createServer((request, response) => {
|
const server = createStaticServer(rootDirectory)
|
||||||
if (request.url.startsWith('/node_modules/')) {
|
|
||||||
request.url = request.url.substr(14)
|
|
||||||
return serveHandler(request, response, {
|
|
||||||
directoryListing: false,
|
|
||||||
public: path.resolve('./node_modules'),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return serveHandler(request, response, {
|
|
||||||
directoryListing: false,
|
|
||||||
public: rootDirectory,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
server.on('request', onRequest)
|
server.on('request', onRequest)
|
||||||
|
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>MetaMask</title>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
window.METAMASK_DEBUG = true
|
|
||||||
window.TEST_MODE = true
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<!-- app content -->
|
|
||||||
<div id="app-content" style="height: 100%"></div>
|
|
||||||
<script src="./bundle.js" type="text/javascript" charset="utf-8"></script>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
html, body, #test-container, .super-dev-container {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
position: relative;
|
|
||||||
background: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
#app-content {
|
|
||||||
background: #F7F7F7;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</html>
|
|
50
package.json
@ -15,15 +15,12 @@
|
|||||||
"dapp-chain": "GANACHE_ARGS='-b 2' concurrently -k -n ganache,dapp -p '[{time}][{name}]' 'yarn ganache:start' 'sleep 5 && yarn dapp'",
|
"dapp-chain": "GANACHE_ARGS='-b 2' concurrently -k -n ganache,dapp -p '[{time}][{name}]' 'yarn ganache:start' 'sleep 5 && yarn dapp'",
|
||||||
"forwarder": "node ./development/static-server.js ./node_modules/@metamask/forwarder/dist/ --port 9010",
|
"forwarder": "node ./development/static-server.js ./node_modules/@metamask/forwarder/dist/ --port 9010",
|
||||||
"dapp-forwarder": "concurrently -k -n forwarder,dapp -p '[{time}][{name}]' 'yarn forwarder' 'yarn dapp'",
|
"dapp-forwarder": "concurrently -k -n forwarder,dapp -p '[{time}][{name}]' 'yarn forwarder' 'yarn dapp'",
|
||||||
"watch:test:unit": "nodemon --exec \"yarn test:unit\" ./test ./app ./ui",
|
|
||||||
"sendwithprivatedapp": "node development/static-server.js test/e2e/send-eth-with-private-key-test --port 8080",
|
"sendwithprivatedapp": "node development/static-server.js test/e2e/send-eth-with-private-key-test --port 8080",
|
||||||
"test:unit": "mocha --exit --require test/env.js --require test/setup.js --recursive \"test/unit/**/*.js\" \"ui/app/**/*.test.js\"",
|
"test:unit": "mocha --exit --require test/env.js --require test/setup.js --recursive \"test/unit/**/*.js\" \"ui/app/**/*.test.js\"",
|
||||||
"test:unit:global": "mocha --exit --require test/env.js --require test/setup.js --recursive mocha test/unit-global/*",
|
"test:unit:global": "mocha --exit --require test/env.js --require test/setup.js --recursive mocha test/unit-global/*",
|
||||||
"test:unit:lax": "mocha --exit --require test/env.js --require test/setup.js --recursive \"test/unit/{,**/!(permissions)}/*.js\" \"ui/app/**/*.test.js\"",
|
"test:unit:lax": "mocha --exit --require test/env.js --require test/setup.js --recursive \"test/unit/{,**/!(permissions)}/*.js\" \"ui/app/**/*.test.js\"",
|
||||||
"test:unit:strict": "mocha --exit --require test/env.js --require test/setup.js --recursive \"test/unit/**/permissions/*.js\"",
|
"test:unit:strict": "mocha --exit --require test/env.js --require test/setup.js --recursive \"test/unit/**/permissions/*.js\"",
|
||||||
"test:unit:path": "mocha --exit --require test/env.js --require test/setup.js --recursive",
|
"test:unit:path": "mocha --exit --require test/env.js --require test/setup.js --recursive",
|
||||||
"test:integration": "yarn test:integration:build && yarn test:flat",
|
|
||||||
"test:integration:build": "yarn build styles",
|
|
||||||
"test:e2e:chrome": "SELENIUM_BROWSER=chrome test/e2e/run-all.sh",
|
"test:e2e:chrome": "SELENIUM_BROWSER=chrome test/e2e/run-all.sh",
|
||||||
"test:web3:chrome": "SELENIUM_BROWSER=chrome test/e2e/run-web3.sh",
|
"test:web3:chrome": "SELENIUM_BROWSER=chrome test/e2e/run-web3.sh",
|
||||||
"test:web3:firefox": "SELENIUM_BROWSER=firefox test/e2e/run-web3.sh",
|
"test:web3:firefox": "SELENIUM_BROWSER=firefox test/e2e/run-web3.sh",
|
||||||
@ -31,19 +28,14 @@
|
|||||||
"test:coverage": "nyc --silent --check-coverage yarn test:unit:strict && nyc --silent --no-clean yarn test:unit:lax && nyc report --reporter=text --reporter=html",
|
"test:coverage": "nyc --silent --check-coverage yarn test:unit:strict && nyc --silent --no-clean yarn test:unit:lax && nyc report --reporter=text --reporter=html",
|
||||||
"test:coverage:strict": "nyc --check-coverage yarn test:unit:strict",
|
"test:coverage:strict": "nyc --check-coverage yarn test:unit:strict",
|
||||||
"test:coveralls-upload": "if [ \"$COVERALLS_REPO_TOKEN\" ]; then nyc report --reporter=text-lcov | coveralls; fi",
|
"test:coveralls-upload": "if [ \"$COVERALLS_REPO_TOKEN\" ]; then nyc report --reporter=text-lcov | coveralls; fi",
|
||||||
"test:flat": "yarn test:flat:build && karma start test/flat.conf.js",
|
|
||||||
"test:flat:build": "yarn test:flat:build:ui && yarn test:flat:build:tests && yarn test:flat:build:locales",
|
|
||||||
"test:flat:build:tests": "node test/integration/index.js",
|
|
||||||
"test:flat:build:states": "node development/genStates.js",
|
|
||||||
"test:flat:build:locales": "mkdir -p dist/chrome && cp -R app/_locales dist/chrome/_locales",
|
|
||||||
"test:flat:build:ui": "yarn test:flat:build:states && browserify --transform babelify --transform brfs ./development/mock-dev.js -o ./development/bundle.js",
|
|
||||||
"ganache:start": "./development/run-ganache",
|
"ganache:start": "./development/run-ganache",
|
||||||
"sentry:publish": "node ./development/sentry-publish.js",
|
"sentry:publish": "node ./development/sentry-publish.js",
|
||||||
"lint": "eslint . --ext js,json",
|
"lint": "eslint . --ext js,json && yarn lint:styles",
|
||||||
"lint:fix": "eslint . --ext js,json --fix",
|
"lint:fix": "eslint . --ext js,json --fix",
|
||||||
"lint:changed": "{ git ls-files --others --exclude-standard ; git diff-index --name-only --diff-filter=d HEAD ; } | grep --regexp='[.]js$' --regexp='[.]json$' | tr '\\n' '\\0' | xargs -0 eslint",
|
"lint:changed": "{ git ls-files --others --exclude-standard ; git diff-index --name-only --diff-filter=d HEAD ; } | grep --regexp='[.]js$' --regexp='[.]json$' | tr '\\n' '\\0' | xargs -0 eslint",
|
||||||
"lint:changed:fix": "{ git ls-files --others --exclude-standard ; git diff-index --name-only --diff-filter=d HEAD ; } | grep --regexp='[.]js$' --regexp='[.]json$' | tr '\\n' '\\0' | xargs -0 eslint --fix",
|
"lint:changed:fix": "{ git ls-files --others --exclude-standard ; git diff-index --name-only --diff-filter=d HEAD ; } | grep --regexp='[.]js$' --regexp='[.]json$' | tr '\\n' '\\0' | xargs -0 eslint --fix",
|
||||||
"lint:shellcheck": "./development/shellcheck.sh",
|
"lint:shellcheck": "./development/shellcheck.sh",
|
||||||
|
"lint:styles": "stylelint '*/**/*.scss'",
|
||||||
"lint:lockfile": "lockfile-lint --path yarn.lock --allowed-hosts npm yarn github.com codeload.github.com --empty-hostname false --allowed-schemes \"https:\" \"git+https:\"",
|
"lint:lockfile": "lockfile-lint --path yarn.lock --allowed-hosts npm yarn github.com codeload.github.com --empty-hostname false --allowed-schemes \"https:\" \"git+https:\"",
|
||||||
"verify-locales": "node ./development/verify-locale-strings.js",
|
"verify-locales": "node ./development/verify-locale-strings.js",
|
||||||
"verify-locales:fix": "node ./development/verify-locale-strings.js --fix",
|
"verify-locales:fix": "node ./development/verify-locale-strings.js --fix",
|
||||||
@ -60,12 +52,11 @@
|
|||||||
"generate:migration": "./development/generate-migration.sh"
|
"generate:migration": "./development/generate-migration.sh"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"**/gonzales-pe/minimist": "^1.2.5",
|
|
||||||
"**/knex/minimist": "^1.2.5",
|
"**/knex/minimist": "^1.2.5",
|
||||||
"**/mkdirp/minimist": "^1.2.5",
|
|
||||||
"**/optimist/minimist": "^1.2.5",
|
"**/optimist/minimist": "^1.2.5",
|
||||||
"**/socketcluster/minimist": "^1.2.5",
|
"**/socketcluster/minimist": "^1.2.5",
|
||||||
"3box/ipfs/ipld-zcash/zcash-bitcore-lib/lodash": "^4.17.15"
|
"3box/ipfs/ipld-zcash/zcash-bitcore-lib/lodash": "^4.17.19",
|
||||||
|
"ganache-core/lodash": "^4.17.19"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"3box": "^1.10.2",
|
"3box": "^1.10.2",
|
||||||
@ -73,19 +64,19 @@
|
|||||||
"@download/blockies": "^1.0.3",
|
"@download/blockies": "^1.0.3",
|
||||||
"@formatjs/intl-relativetimeformat": "^5.2.6",
|
"@formatjs/intl-relativetimeformat": "^5.2.6",
|
||||||
"@fortawesome/fontawesome-free": "^5.13.0",
|
"@fortawesome/fontawesome-free": "^5.13.0",
|
||||||
"@material-ui/core": "1.0.0",
|
"@material-ui/core": "^4.11.0",
|
||||||
"@metamask/controllers": "^2.0.1",
|
"@metamask/controllers": "^2.0.1",
|
||||||
"@metamask/eth-ledger-bridge-keyring": "^0.2.6",
|
"@metamask/eth-ledger-bridge-keyring": "^0.2.6",
|
||||||
"@metamask/eth-token-tracker": "^2.0.0",
|
"@metamask/eth-token-tracker": "^2.0.0",
|
||||||
"@metamask/etherscan-link": "^1.1.0",
|
"@metamask/etherscan-link": "^1.1.0",
|
||||||
"@metamask/inpage-provider": "^6.0.0",
|
"@metamask/inpage-provider": "^6.0.1",
|
||||||
"@popperjs/core": "^2.4.0",
|
"@popperjs/core": "^2.4.0",
|
||||||
"@reduxjs/toolkit": "^1.3.2",
|
"@reduxjs/toolkit": "^1.3.2",
|
||||||
"@sentry/browser": "^5.11.1",
|
"@sentry/browser": "^5.11.1",
|
||||||
"@sentry/integrations": "^5.11.1",
|
"@sentry/integrations": "^5.11.1",
|
||||||
"@zxing/library": "^0.8.0",
|
"@zxing/library": "^0.8.0",
|
||||||
"abi-decoder": "^1.2.0",
|
"abi-decoder": "^1.2.0",
|
||||||
"abortcontroller-polyfill": "^1.3.0",
|
"abortcontroller-polyfill": "^1.4.0",
|
||||||
"await-semaphore": "^0.1.1",
|
"await-semaphore": "^0.1.1",
|
||||||
"bignumber.js": "^4.1.0",
|
"bignumber.js": "^4.1.0",
|
||||||
"bip39": "^2.2.0",
|
"bip39": "^2.2.0",
|
||||||
@ -131,7 +122,7 @@
|
|||||||
"json-rpc-engine": "^5.1.8",
|
"json-rpc-engine": "^5.1.8",
|
||||||
"json-rpc-middleware-stream": "^2.1.1",
|
"json-rpc-middleware-stream": "^2.1.1",
|
||||||
"jsonschema": "^1.2.4",
|
"jsonschema": "^1.2.4",
|
||||||
"lodash": "^4.17.15",
|
"lodash": "^4.17.19",
|
||||||
"loglevel": "^1.4.1",
|
"loglevel": "^1.4.1",
|
||||||
"luxon": "^1.23.0",
|
"luxon": "^1.23.0",
|
||||||
"metamask-logo": "^2.1.4",
|
"metamask-logo": "^2.1.4",
|
||||||
@ -148,7 +139,6 @@
|
|||||||
"pump": "^3.0.0",
|
"pump": "^3.0.0",
|
||||||
"punycode": "^2.1.1",
|
"punycode": "^2.1.1",
|
||||||
"qrcode-generator": "1.4.1",
|
"qrcode-generator": "1.4.1",
|
||||||
"ramda": "^0.24.1",
|
|
||||||
"react": "^16.12.0",
|
"react": "^16.12.0",
|
||||||
"react-dnd": "^3.0.2",
|
"react-dnd": "^3.0.2",
|
||||||
"react-dnd-html5-backend": "^7.4.4",
|
"react-dnd-html5-backend": "^7.4.4",
|
||||||
@ -163,7 +153,6 @@
|
|||||||
"react-tippy": "^1.2.2",
|
"react-tippy": "^1.2.2",
|
||||||
"react-toggle-button": "^2.2.0",
|
"react-toggle-button": "^2.2.0",
|
||||||
"react-transition-group": "^1.2.1",
|
"react-transition-group": "^1.2.1",
|
||||||
"react-trigger-change": "^1.0.2",
|
|
||||||
"readable-stream": "^2.3.3",
|
"readable-stream": "^2.3.3",
|
||||||
"redux": "^4.0.5",
|
"redux": "^4.0.5",
|
||||||
"redux-thunk": "^2.3.0",
|
"redux-thunk": "^2.3.0",
|
||||||
@ -190,7 +179,7 @@
|
|||||||
"@babel/register": "^7.5.5",
|
"@babel/register": "^7.5.5",
|
||||||
"@metamask/eslint-config": "^1.1.0",
|
"@metamask/eslint-config": "^1.1.0",
|
||||||
"@metamask/forwarder": "^1.1.0",
|
"@metamask/forwarder": "^1.1.0",
|
||||||
"@metamask/test-dapp": "3.0.0",
|
"@metamask/test-dapp": "^3.1.0",
|
||||||
"@sentry/cli": "^1.49.0",
|
"@sentry/cli": "^1.49.0",
|
||||||
"@storybook/addon-actions": "^5.3.14",
|
"@storybook/addon-actions": "^5.3.14",
|
||||||
"@storybook/addon-backgrounds": "^5.3.14",
|
"@storybook/addon-backgrounds": "^5.3.14",
|
||||||
@ -200,7 +189,7 @@
|
|||||||
"@storybook/storybook-deployer": "^2.8.6",
|
"@storybook/storybook-deployer": "^2.8.6",
|
||||||
"@testing-library/react-hooks": "^3.2.1",
|
"@testing-library/react-hooks": "^3.2.1",
|
||||||
"addons-linter": "1.14.0",
|
"addons-linter": "1.14.0",
|
||||||
"babel-eslint": "^10.0.2",
|
"babel-eslint": "^10.1.0",
|
||||||
"babel-loader": "^8.0.6",
|
"babel-loader": "^8.0.6",
|
||||||
"babelify": "^10.0.0",
|
"babelify": "^10.0.0",
|
||||||
"brfs": "^1.6.1",
|
"brfs": "^1.6.1",
|
||||||
@ -219,11 +208,11 @@
|
|||||||
"envify": "^4.1.0",
|
"envify": "^4.1.0",
|
||||||
"enzyme": "^3.10.0",
|
"enzyme": "^3.10.0",
|
||||||
"enzyme-adapter-react-16": "^1.15.1",
|
"enzyme-adapter-react-16": "^1.15.1",
|
||||||
"eslint": "^6.0.1",
|
"eslint": "^6.8.0",
|
||||||
"eslint-plugin-babel": "^5.3.0",
|
"eslint-plugin-babel": "^5.3.0",
|
||||||
"eslint-plugin-import": "^2.19.1",
|
"eslint-plugin-import": "^2.22.0",
|
||||||
"eslint-plugin-json": "^1.2.0",
|
"eslint-plugin-json": "^1.2.0",
|
||||||
"eslint-plugin-mocha": "^6.2.2",
|
"eslint-plugin-mocha": "^6.3.0",
|
||||||
"eslint-plugin-react": "^7.18.3",
|
"eslint-plugin-react": "^7.18.3",
|
||||||
"eslint-plugin-react-hooks": "^4.0.4",
|
"eslint-plugin-react-hooks": "^4.0.4",
|
||||||
"fancy-log": "^1.3.3",
|
"fancy-log": "^1.3.3",
|
||||||
@ -246,16 +235,11 @@
|
|||||||
"gulp-rtlcss": "^1.4.0",
|
"gulp-rtlcss": "^1.4.0",
|
||||||
"gulp-sass": "^4.0.0",
|
"gulp-sass": "^4.0.0",
|
||||||
"gulp-sourcemaps": "^2.6.0",
|
"gulp-sourcemaps": "^2.6.0",
|
||||||
"gulp-stylelint": "^7.0.0",
|
"gulp-stylelint": "^13.0.0",
|
||||||
"gulp-terser-js": "^5.0.0",
|
"gulp-terser-js": "^5.0.0",
|
||||||
"gulp-watch": "^5.0.1",
|
"gulp-watch": "^5.0.1",
|
||||||
"gulp-zip": "^4.0.0",
|
"gulp-zip": "^4.0.0",
|
||||||
"jsdom": "^11.2.0",
|
"jsdom": "^11.2.0",
|
||||||
"karma": "^4.1.0",
|
|
||||||
"karma-chrome-launcher": "^2.2.0",
|
|
||||||
"karma-cli": "^1.0.1",
|
|
||||||
"karma-firefox-launcher": "^1.0.1",
|
|
||||||
"karma-qunit": "^1.2.1",
|
|
||||||
"koa": "^2.7.0",
|
"koa": "^2.7.0",
|
||||||
"lockfile-lint": "^4.0.0",
|
"lockfile-lint": "^4.0.0",
|
||||||
"mocha": "^7.2.0",
|
"mocha": "^7.2.0",
|
||||||
@ -265,8 +249,6 @@
|
|||||||
"nyc": "^15.0.0",
|
"nyc": "^15.0.0",
|
||||||
"polyfill-crypto.getrandomvalues": "^1.0.0",
|
"polyfill-crypto.getrandomvalues": "^1.0.0",
|
||||||
"proxyquire": "^2.1.3",
|
"proxyquire": "^2.1.3",
|
||||||
"qs": "^6.2.0",
|
|
||||||
"qunitjs": "^2.4.1",
|
|
||||||
"randomcolor": "^0.5.4",
|
"randomcolor": "^0.5.4",
|
||||||
"rc": "^1.2.8",
|
"rc": "^1.2.8",
|
||||||
"react-devtools": "^4.4.0",
|
"react-devtools": "^4.4.0",
|
||||||
@ -287,9 +269,7 @@
|
|||||||
"source-map-explorer": "^2.0.1",
|
"source-map-explorer": "^2.0.1",
|
||||||
"string.prototype.matchall": "^4.0.2",
|
"string.prototype.matchall": "^4.0.2",
|
||||||
"style-loader": "^0.21.0",
|
"style-loader": "^0.21.0",
|
||||||
"stylelint": "^9.10.1",
|
"stylelint": "^13.6.1",
|
||||||
"stylelint-config-standard": "^18.2.0",
|
|
||||||
"testem": "^2.16.0",
|
|
||||||
"through2": "^2.0.3",
|
"through2": "^2.0.3",
|
||||||
"ttest": "^2.1.1",
|
"ttest": "^2.1.1",
|
||||||
"vinyl-buffer": "^1.0.1",
|
"vinyl-buffer": "^1.0.1",
|
||||||
|
122
stylelint.config.js
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
module.exports = {
|
||||||
|
rules: {
|
||||||
|
// stylelint-config-standard
|
||||||
|
|
||||||
|
'at-rule-empty-line-before': [
|
||||||
|
'always',
|
||||||
|
{
|
||||||
|
except: ['blockless-after-same-name-blockless', 'first-nested'],
|
||||||
|
ignore: ['after-comment'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'at-rule-name-case': 'lower',
|
||||||
|
'at-rule-name-space-after': 'always-single-line',
|
||||||
|
'at-rule-semicolon-newline-after': 'always',
|
||||||
|
'block-closing-brace-empty-line-before': 'never',
|
||||||
|
'block-closing-brace-newline-after': 'always',
|
||||||
|
'block-closing-brace-newline-before': 'always-multi-line',
|
||||||
|
'block-closing-brace-space-before': 'always-single-line',
|
||||||
|
'block-opening-brace-newline-after': 'always-multi-line',
|
||||||
|
'block-opening-brace-space-after': 'always-single-line',
|
||||||
|
'block-opening-brace-space-before': 'always',
|
||||||
|
'color-hex-case': 'lower',
|
||||||
|
'color-hex-length': 'short',
|
||||||
|
'comment-empty-line-before': [
|
||||||
|
'always',
|
||||||
|
{
|
||||||
|
except: ['first-nested'],
|
||||||
|
ignore: ['stylelint-commands'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
// 'comment-whitespace-inside': 'always',
|
||||||
|
'custom-property-empty-line-before': [
|
||||||
|
'always',
|
||||||
|
{
|
||||||
|
except: ['after-custom-property', 'first-nested'],
|
||||||
|
ignore: ['after-comment', 'inside-single-line-block'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'declaration-bang-space-after': 'never',
|
||||||
|
'declaration-bang-space-before': 'always',
|
||||||
|
'declaration-block-semicolon-newline-after': 'always-multi-line',
|
||||||
|
'declaration-block-semicolon-space-after': 'always-single-line',
|
||||||
|
'declaration-block-semicolon-space-before': 'never',
|
||||||
|
'declaration-block-single-line-max-declarations': 1,
|
||||||
|
'declaration-block-trailing-semicolon': 'always',
|
||||||
|
'declaration-colon-newline-after': 'always-multi-line',
|
||||||
|
'declaration-colon-space-after': 'always-single-line',
|
||||||
|
'declaration-colon-space-before': 'never',
|
||||||
|
'declaration-empty-line-before': [
|
||||||
|
'always',
|
||||||
|
{
|
||||||
|
except: ['after-declaration', 'first-nested'],
|
||||||
|
ignore: ['after-comment', 'inside-single-line-block'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'function-comma-newline-after': 'always-multi-line',
|
||||||
|
'function-comma-space-after': 'always-single-line',
|
||||||
|
'function-comma-space-before': 'never',
|
||||||
|
'function-max-empty-lines': 0,
|
||||||
|
'function-name-case': 'lower',
|
||||||
|
'function-parentheses-newline-inside': 'always-multi-line',
|
||||||
|
'function-parentheses-space-inside': 'never-single-line',
|
||||||
|
'function-whitespace-after': 'always',
|
||||||
|
indentation: 2,
|
||||||
|
'length-zero-no-unit': true,
|
||||||
|
// 'max-empty-lines': 1,
|
||||||
|
'media-feature-colon-space-after': 'always',
|
||||||
|
'media-feature-colon-space-before': 'never',
|
||||||
|
'media-feature-name-case': 'lower',
|
||||||
|
'media-feature-parentheses-space-inside': 'never',
|
||||||
|
'media-feature-range-operator-space-after': 'always',
|
||||||
|
'media-feature-range-operator-space-before': 'always',
|
||||||
|
'media-query-list-comma-newline-after': 'always-multi-line',
|
||||||
|
'media-query-list-comma-space-after': 'always-single-line',
|
||||||
|
'media-query-list-comma-space-before': 'never',
|
||||||
|
'no-eol-whitespace': true,
|
||||||
|
'no-missing-end-of-source-newline': true,
|
||||||
|
'number-leading-zero': 'always',
|
||||||
|
'number-no-trailing-zeros': true,
|
||||||
|
'property-case': 'lower',
|
||||||
|
'rule-empty-line-before': [
|
||||||
|
'always-multi-line',
|
||||||
|
{
|
||||||
|
except: ['first-nested'],
|
||||||
|
ignore: ['after-comment'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'selector-attribute-brackets-space-inside': 'never',
|
||||||
|
'selector-attribute-operator-space-after': 'never',
|
||||||
|
'selector-attribute-operator-space-before': 'never',
|
||||||
|
'selector-combinator-space-after': 'always',
|
||||||
|
'selector-combinator-space-before': 'always',
|
||||||
|
'selector-descendant-combinator-no-non-space': true,
|
||||||
|
'selector-list-comma-newline-after': 'always',
|
||||||
|
'selector-list-comma-space-before': 'never',
|
||||||
|
'selector-max-empty-lines': 0,
|
||||||
|
'selector-pseudo-class-case': 'lower',
|
||||||
|
'selector-pseudo-class-parentheses-space-inside': 'never',
|
||||||
|
'selector-pseudo-element-case': 'lower',
|
||||||
|
'selector-pseudo-element-colon-notation': 'double',
|
||||||
|
'selector-type-case': 'lower',
|
||||||
|
'unit-case': 'lower',
|
||||||
|
// 'value-keyword-case': 'lower',
|
||||||
|
'value-list-comma-newline-after': 'always-multi-line',
|
||||||
|
'value-list-comma-space-after': 'always-single-line',
|
||||||
|
'value-list-comma-space-before': 'never',
|
||||||
|
'value-list-max-empty-lines': 0,
|
||||||
|
|
||||||
|
// custom rules
|
||||||
|
|
||||||
|
// 'color-named': 'never',
|
||||||
|
// 'font-family-name-quotes': 'always-where-recommended',
|
||||||
|
// 'font-weight-notation': 'numeric',
|
||||||
|
// 'function-url-quotes': 'always',
|
||||||
|
'value-no-vendor-prefix': true,
|
||||||
|
'value-list-comma-newline-before': 'never-multi-line',
|
||||||
|
// 'selector-attribute-quotes': 'always',
|
||||||
|
// 'selector-max-specificity': '0,5,2',
|
||||||
|
// 'max-nesting-depth': 3,
|
||||||
|
'no-unknown-animations': true,
|
||||||
|
},
|
||||||
|
}
|
@ -1,68 +0,0 @@
|
|||||||
// Karma configuration
|
|
||||||
// Generated on Mon Sep 11 2017 18:45:48 GMT-0700 (PDT)
|
|
||||||
|
|
||||||
module.exports = function (config) {
|
|
||||||
return {
|
|
||||||
// base path that will be used to resolve all patterns (eg. files, exclude)
|
|
||||||
basePath: process.cwd(),
|
|
||||||
|
|
||||||
// Uncomment to allow for longer timeouts
|
|
||||||
// browserNoActivityTimeout: 100000000,
|
|
||||||
|
|
||||||
browserConsoleLogOptions: {
|
|
||||||
terminal: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
// frameworks to use
|
|
||||||
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
|
|
||||||
frameworks: ['qunit'],
|
|
||||||
|
|
||||||
// list of files / patterns to load in the browser
|
|
||||||
files: [
|
|
||||||
'test/integration/jquery-3.1.0.min.js',
|
|
||||||
{ pattern: 'dist/chrome/images/**/*.*', watched: false, included: false, served: true },
|
|
||||||
{ pattern: 'dist/chrome/fonts/**/*.*', watched: false, included: false, served: true },
|
|
||||||
{ pattern: 'dist/chrome/_locales/**/*.*', watched: false, included: false, served: true },
|
|
||||||
],
|
|
||||||
|
|
||||||
proxies: {
|
|
||||||
'/images/': '/base/dist/chrome/images/',
|
|
||||||
'/fonts/': '/base/dist/chrome/fonts/',
|
|
||||||
'/_locales/': '/base/dist/chrome/_locales/',
|
|
||||||
},
|
|
||||||
|
|
||||||
// test results reporter to use
|
|
||||||
// possible values: 'dots', 'progress'
|
|
||||||
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
|
|
||||||
reporters: ['progress'],
|
|
||||||
|
|
||||||
// web server port
|
|
||||||
port: 9876,
|
|
||||||
|
|
||||||
// enable / disable colors in the output (reporters and logs)
|
|
||||||
colors: true,
|
|
||||||
|
|
||||||
// level of logging
|
|
||||||
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
|
|
||||||
logLevel: config.LOG_INFO,
|
|
||||||
|
|
||||||
// enable / disable watching file and executing tests whenever any file changes
|
|
||||||
autoWatch: false,
|
|
||||||
|
|
||||||
// start these browsers
|
|
||||||
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
|
|
||||||
browsers: process.env.browsers ?
|
|
||||||
JSON.parse(process.env.browsers)
|
|
||||||
: ['Chrome', 'Firefox'],
|
|
||||||
|
|
||||||
// Continuous Integration mode
|
|
||||||
// if true, Karma captures browsers, runs the tests and exits
|
|
||||||
singleRun: true,
|
|
||||||
|
|
||||||
// Concurrency level
|
|
||||||
// how many browser should be started simultaneous
|
|
||||||
concurrency: 1,
|
|
||||||
|
|
||||||
nocache: true,
|
|
||||||
}
|
|
||||||
}
|
|
@ -43,7 +43,7 @@ describe('MetaMask', function () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.currentTest.state === 'failed') {
|
if (this.currentTest.state === 'failed') {
|
||||||
await driver.verboseReportOnFailure(this.currentTest)
|
await driver.verboseReportOnFailure(this.currentTest.title)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ describe('MetaMask', function () {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.currentTest.state === 'failed') {
|
if (this.currentTest.state === 'failed') {
|
||||||
await driver.verboseReportOnFailure(this.currentTest)
|
await driver.verboseReportOnFailure(this.currentTest.title)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|