diff --git a/.eslintrc b/.eslintrc
index c45adf39..b565138c 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -1,8 +1,5 @@
{
- "extends": [
- "airbnb",
- "plugin:flowtype/recommended"
- ],
+ "extends": ["airbnb", "plugin:flowtype/recommended"],
"parser": "babel-eslint",
"plugins": ["jest", "flowtype"],
"rules": {
@@ -27,19 +24,23 @@
"import/extensions": 0,
"import/prefer-default-export": 0,
"jsx-a11y/label-has-for": 0,
- "indent": ["error", 2],
+ "indent": ["error", 2, { "SwitchCase": 1 }],
"no-console": ["error", { "allow": ["warn", "error"] }],
"flowtype/require-valid-file-annotation": [
2,
- "always", {
+ "always",
+ {
"annotationStyle": "line"
}
],
- "jsx-a11y/anchor-is-valid": [ "error", {
- "components": [ "Link" ],
- "specialLink": [ "to", "hrefLeft", "hrefRight" ],
- "aspects": [ "noHref", "invalidHref", "preferButton" ]
- }],
+ "jsx-a11y/anchor-is-valid": [
+ "error",
+ {
+ "components": ["Link"],
+ "specialLink": ["to", "hrefLeft", "hrefRight"],
+ "aspects": ["noHref", "invalidHref", "preferButton"]
+ }
+ ],
"react/require-default-props": 0,
"react/no-array-index-key": 0
},
diff --git a/.github/ISSUE_TEMPLATE/epic.md b/.github/ISSUE_TEMPLATE/epic.md
new file mode 100644
index 00000000..a620a7a5
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/epic.md
@@ -0,0 +1,20 @@
+---
+name: Epic
+about: Create an epic for the Gnosis Safe
+
+---
+
+# What is this feature about? (1 sentence)
+
+
+# Why is it needed? What is the value? For whom do we build it?
+
+
+# High-level overview of the feature
+-
+
+# Screens
+- Link to Google docs with screens. Template can be found on [Google drive](https://drive.google.com/drive/u/0/folders/1d7LH762wUBCSf2Shmb-f2O5OdAaQcOAW)
+
+# Other things
+-
diff --git a/.gitignore b/.gitignore
index 021f4668..a75dc3eb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,5 @@ node_modules/
build_webpack/
build_storybook/
.DS_Store
-build/
\ No newline at end of file
+build/
+yarn-error.log
\ No newline at end of file
diff --git a/package.json b/package.json
index 13f26c75..7a8b575b 100644
--- a/package.json
+++ b/package.json
@@ -32,29 +32,31 @@
"dependencies": {
"@gnosis.pm/safe-contracts": "^1.0.0",
"@gnosis.pm/util-contracts": "2.0.1",
- "@material-ui/core": "4.1.3",
+ "@material-ui/core": "4.2.0",
"@material-ui/icons": "4.2.1",
+ "@testing-library/jest-dom": "^4.0.0",
"@welldone-software/why-did-you-render": "3.2.1",
"axios": "0.19.0",
"bignumber.js": "9.0.0",
- "connected-react-router": "^6.3.1",
- "final-form": "4.16.1",
+ "connected-react-router": "6.5.2",
+ "date-fns": "1.30.1",
+ "final-form": "4.18.2",
"history": "^4.7.2",
"immortal-db": "^1.0.2",
"immutable": "^4.0.0-rc.9",
"material-ui-search-bar": "^1.0.0-beta.13",
- "optimize-css-assets-webpack-plugin": "^5.0.1",
+ "optimize-css-assets-webpack-plugin": "5.0.3",
"qrcode.react": "^0.9.3",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"react-final-form": "6.3.0",
"react-final-form-listeners": "^1.0.2",
- "react-hot-loader": "4.12.3",
+ "react-hot-loader": "4.12.7",
"react-infinite-scroll-component": "^4.5.2",
"react-redux": "7.1.0",
"react-router-dom": "^4.3.1",
"recompose": "^0.30.0",
- "redux": "^4.0.1",
+ "redux": "4.0.4",
"redux-actions": "^2.3.0",
"redux-thunk": "^2.2.0",
"reselect": "^4.0.0",
@@ -62,27 +64,27 @@
},
"devDependencies": {
"@babel/cli": "7.5.0",
- "@babel/core": "7.5.0",
+ "@babel/core": "7.5.4",
"@babel/plugin-proposal-class-properties": "7.5.0",
"@babel/plugin-proposal-decorators": "7.4.4",
- "@babel/plugin-proposal-do-expressions": "^7.0.0",
- "@babel/plugin-proposal-export-default-from": "^7.0.0",
- "@babel/plugin-proposal-export-namespace-from": "^7.0.0",
+ "@babel/plugin-proposal-do-expressions": "7.5.0",
+ "@babel/plugin-proposal-export-default-from": "7.5.2",
+ "@babel/plugin-proposal-export-namespace-from": "7.5.2",
"@babel/plugin-proposal-function-bind": "^7.0.0",
- "@babel/plugin-proposal-function-sent": "^7.0.0",
+ "@babel/plugin-proposal-function-sent": "7.5.0",
"@babel/plugin-proposal-json-strings": "^7.0.0",
"@babel/plugin-proposal-logical-assignment-operators": "^7.0.0",
"@babel/plugin-proposal-nullish-coalescing-operator": "7.4.4",
"@babel/plugin-proposal-numeric-separator": "^7.0.0",
"@babel/plugin-proposal-optional-chaining": "^7.0.0",
- "@babel/plugin-proposal-pipeline-operator": "^7.0.0",
+ "@babel/plugin-proposal-pipeline-operator": "7.5.0",
"@babel/plugin-proposal-throw-expressions": "^7.0.0",
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
"@babel/plugin-syntax-import-meta": "^7.0.0",
"@babel/plugin-transform-member-expression-literals": "^7.2.0",
"@babel/plugin-transform-property-literals": "^7.2.0",
"@babel/polyfill": "7.4.4",
- "@babel/preset-env": "7.5.0",
+ "@babel/preset-env": "7.5.4",
"@babel/preset-flow": "^7.0.0-beta.40",
"@babel/preset-react": "^7.0.0-beta.40",
"@sambego/storybook-state": "^1.0.7",
@@ -90,8 +92,8 @@
"@storybook/addon-knobs": "5.1.9",
"@storybook/addon-links": "5.1.9",
"@storybook/react": "5.1.9",
- "@testing-library/react": "^8.0.1",
- "autoprefixer": "9.6.0",
+ "@testing-library/react": "8.0.5",
+ "autoprefixer": "9.6.1",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "10.0.2",
"babel-jest": "24.8.0",
@@ -102,12 +104,12 @@
"classnames": "^2.2.5",
"css-loader": "3.0.0",
"detect-port": "^1.2.2",
- "eslint": "^5.16.0",
- "eslint-config-airbnb": "^17.1.0",
+ "eslint": "6.0.1",
+ "eslint-config-airbnb": "17.1.1",
"eslint-plugin-flowtype": "3.11.1",
"eslint-plugin-import": "2.18.0",
- "eslint-plugin-jest": "22.7.2",
- "eslint-plugin-jsx-a11y": "^6.0.3",
+ "eslint-plugin-jest": "22.9.0",
+ "eslint-plugin-jsx-a11y": "6.2.3",
"eslint-plugin-react": "7.14.2",
"ethereumjs-abi": "^0.6.7",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
@@ -117,25 +119,25 @@
"html-loader": "^0.5.5",
"html-webpack-plugin": "^3.0.4",
"jest": "24.8.0",
- "jest-dom": "^3.4.0",
+ "jest-dom": "4.0.0",
"json-loader": "^0.5.7",
- "mini-css-extract-plugin": "0.7.0",
+ "mini-css-extract-plugin": "0.8.0",
"postcss-loader": "^3.0.0",
"postcss-mixins": "^6.2.0",
"postcss-simple-vars": "^5.0.2",
"pre-commit": "^1.2.2",
"prettier-eslint-cli": "5.0.0",
"run-with-testrpc": "0.3.1",
- "storybook-host": "^5.0.3",
+ "storybook-host": "5.1.0",
"storybook-router": "^0.3.3",
"style-loader": "^0.23.1",
- "truffle": "5.0.26",
- "truffle-contract": "4.0.23",
- "truffle-solidity-loader": "0.1.25",
+ "truffle": "5.0.27",
+ "truffle-contract": "4.0.24",
+ "truffle-solidity-loader": "0.1.26",
"uglifyjs-webpack-plugin": "2.1.3",
- "webpack": "4.35.2",
+ "webpack": "4.35.3",
"webpack-bundle-analyzer": "3.3.2",
- "webpack-cli": "3.3.5",
+ "webpack-cli": "3.3.6",
"webpack-dev-server": "3.7.2",
"webpack-manifest-plugin": "^2.0.0-rc.2"
}
diff --git a/src/components/EtherscanLink/index.jsx b/src/components/EtherscanLink/index.jsx
new file mode 100644
index 00000000..1e1e743e
--- /dev/null
+++ b/src/components/EtherscanLink/index.jsx
@@ -0,0 +1,31 @@
+// @flow
+import React from 'react'
+import { connect } from 'react-redux'
+import OpenInNew from '@material-ui/icons/OpenInNew'
+import { getEtherScanLink } from '~/logic/wallets/getWeb3'
+import { shortVersionOf } from '~/logic/wallets/ethAddresses'
+import { secondary } from '~/theme/variables'
+import { networkSelector } from '~/logic/wallets/store/selectors'
+
+const openIconStyle = {
+ height: '13px',
+ color: secondary,
+}
+
+type EtherscanLinkProps = {
+ type: 'tx' | 'address',
+ value: string,
+ currentNetwork: string,
+}
+
+const EtherscanLink = ({ type, value, currentNetwork }: EtherscanLinkProps) => (
+
+ {shortVersionOf(value, 4)}
+
+
+)
+
+export default connect