* Bug: Invalid V in signature with eth_sign (#728)

* Fix invalid V with metamask/ledger

* DONT FORGET TO REVERT BEFORE MERGING: test deployment

* DONT FORGET TO REVERT BEFORE MERGING 2: test deployment

* Revert "DONT FORGET TO REVERT BEFORE MERGING 2: test deployment"

This reverts commit 8331f2a78f7fc8f53eb893899f16edd8238c68ff.

* Revert "DONT FORGET TO REVERT BEFORE MERGING: test deployment"

This reverts commit 03b81e31820ce4fe078a7131c2f0caa2af4870ac.

* BUG: Only injected providers are cached as last used provider (#733)

* cache every used provider, not only injected one

* package json update
This commit is contained in:
Mikhail Mikheev 2020-04-03 20:01:43 +04:00 committed by GitHub
parent 40375585eb
commit 3942347b5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 11 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "safe-react", "name": "safe-react",
"version": "1.9.1", "version": "1.9.2",
"description": "Allowing crypto users manage funds in a safer way", "description": "Allowing crypto users manage funds in a safer way",
"homepage": "https://github.com/gnosis/safe-react#readme", "homepage": "https://github.com/gnosis/safe-react#readme",
"bugs": { "bugs": {

View File

@ -13,7 +13,6 @@ import selector, { type SelectorProps } from './selector'
import { onboard } from '~/components/ConnectButton' import { onboard } from '~/components/ConnectButton'
import { NOTIFICATIONS, showSnackbar } from '~/logic/notifications' import { NOTIFICATIONS, showSnackbar } from '~/logic/notifications'
import { INJECTED_PROVIDERS } from '~/logic/wallets/getWeb3'
import { loadLastUsedProvider } from '~/logic/wallets/store/middlewares/providerWatcher' import { loadLastUsedProvider } from '~/logic/wallets/store/middlewares/providerWatcher'
import { type Info, logComponentStack } from '~/utils/logBoundaries' import { type Info, logComponentStack } from '~/utils/logBoundaries'
@ -38,7 +37,7 @@ class HeaderComponent extends React.PureComponent<Props, State> {
async componentDidMount() { async componentDidMount() {
const lastUsedProvider = await loadLastUsedProvider() const lastUsedProvider = await loadLastUsedProvider()
if (INJECTED_PROVIDERS.includes(lastUsedProvider.toUpperCase()) || process.env.NODE_ENV === 'test') { if (lastUsedProvider) {
const hasSelectedWallet = await onboard.walletSelect(lastUsedProvider) const hasSelectedWallet = await onboard.walletSelect(lastUsedProvider)
if (hasSelectedWallet) { if (hasSelectedWallet) {
await onboard.walletCheck() await onboard.walletCheck()

View File

@ -53,7 +53,28 @@ export const getEthSigner = async ({
return return
} }
resolve(signature.result.replace(EMPTY_DATA, '')) const sig = signature.result.replace(EMPTY_DATA, '')
let sigV = parseInt(sig.slice(-2), 16)
// Metamask with ledger returns v = 01, this is not valid for ethereum
// For ethereum valid V is 27 or 28
// In case V = 0 or 01 we add it to 27 and then add 4
// Adding 4 is required to make signature valid for safe contracts:
// https://gnosis-safe.readthedocs.io/en/latest/contracts/signatures.html#eth-sign-signature
switch (sigV) {
case 0:
case 1:
sigV += 31
break
case 27:
case 28:
sigV += 4
break
default:
throw new Error('Invalid signature')
}
resolve(sig.slice(0, -2) + sigV.toString(16))
}, },
) )
}) })

View File

@ -34,13 +34,6 @@ export const WALLET_PROVIDER = {
TREZOR: 'TREZOR', TREZOR: 'TREZOR',
} }
export const INJECTED_PROVIDERS = [
WALLET_PROVIDER.SAFE,
WALLET_PROVIDER.METAMASK,
WALLET_PROVIDER.OPERA,
WALLET_PROVIDER.DAPPER,
]
export const ETHEREUM_NETWORK_IDS = { export const ETHEREUM_NETWORK_IDS = {
// $FlowFixMe // $FlowFixMe
1: ETHEREUM_NETWORK.MAINNET, 1: ETHEREUM_NETWORK.MAINNET,