Fix: Ledger should have correct signature v value for chains with large chain ID (#1204)
* fix: Ledger should have correct signature v value * format code Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>
This commit is contained in:
parent
d5de795382
commit
da38083013
|
@ -124,7 +124,34 @@ impl LedgerEthereum {
|
|||
}
|
||||
let mut payload = Self::path_to_bytes(&self.derivation);
|
||||
payload.extend_from_slice(tx_with_chain.rlp().as_ref());
|
||||
self.sign_payload(INS::SIGN, payload).await
|
||||
|
||||
let mut signature = self.sign_payload(INS::SIGN, payload).await?;
|
||||
|
||||
// modify `v` value of signature to match EIP-155 for chains with large chain ID
|
||||
// The logic is derived from Ledger's library
|
||||
// https://github.com/LedgerHQ/ledgerjs/blob/e78aac4327e78301b82ba58d63a72476ecb842fc/packages/hw-app-eth/src/Eth.ts#L300
|
||||
let eip155_chain_id = self.chain_id * 2 + 35;
|
||||
if eip155_chain_id + 1 > 255 {
|
||||
let one_byte_chain_id = eip155_chain_id % 256;
|
||||
let ecc_parity = if signature.v > one_byte_chain_id {
|
||||
signature.v - one_byte_chain_id
|
||||
} else {
|
||||
one_byte_chain_id - signature.v
|
||||
};
|
||||
|
||||
signature.v = match tx {
|
||||
TypedTransaction::Eip2930(_) | TypedTransaction::Eip1559(_) => {
|
||||
if ecc_parity % 2 == 1 {
|
||||
0
|
||||
} else {
|
||||
1
|
||||
}
|
||||
}
|
||||
TypedTransaction::Legacy(_) => eip155_chain_id + ecc_parity,
|
||||
};
|
||||
}
|
||||
|
||||
Ok(signature)
|
||||
}
|
||||
|
||||
/// Signs an ethereum personal message
|
||||
|
|
Loading…
Reference in New Issue