diff --git a/src/logic/safe/transactions/offchainSigner/ethSigner.js b/src/logic/safe/transactions/offchainSigner/ethSigner.js index 42a772cb..2a2d1133 100644 --- a/src/logic/safe/transactions/offchainSigner/ethSigner.js +++ b/src/logic/safe/transactions/offchainSigner/ethSigner.js @@ -53,7 +53,28 @@ export const getEthSigner = async ({ 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)) }, ) })