Fix recover_transaction function in Ragger client for non-legacy transactions

This commit is contained in:
Alexandre Paillier
2024-02-26 15:09:42 +01:00
parent 42774650ac
commit 63da10e20e

View File

@@ -17,24 +17,22 @@ def recover_message(msg, vrs: tuple) -> bytes:
return bytes.fromhex(addr[2:]) return bytes.fromhex(addr[2:])
# TODO: Figure out why it doesn't work for non-legacy transactions
def recover_transaction(tx_params, vrs: tuple) -> bytes: def recover_transaction(tx_params, vrs: tuple) -> bytes:
raw_tx = Account.create().sign_transaction(tx_params).rawTransaction raw_tx = Account.create().sign_transaction(tx_params).rawTransaction
prefix = bytes() prefix = bytes()
if raw_tx[0] in [0x01, 0x02]: if raw_tx[0] in [0x01, 0x02]:
prefix = raw_tx[:1] prefix = raw_tx[:1]
raw_tx = raw_tx[len(prefix):] raw_tx = raw_tx[len(prefix):]
if prefix == bytes(): # v is returned on one byte only so it might have overflowed
# v is returned on one byte only so it might have overflowed # in that case, we will reconstruct it to its full value
# in that case, we will reconstruct it to its full value if "chainId" in tx_params:
if "chainId" in tx_params: trunc_chain_id = tx_params["chainId"]
trunc_chain_id = tx_params["chainId"] while trunc_chain_id.bit_length() > 32:
while trunc_chain_id.bit_length() > 32: trunc_chain_id >>= 8
trunc_chain_id >>= 8 target = tx_params["chainId"] * 2 + 35
target = tx_params["chainId"] * 2 + 35 trunc_target = trunc_chain_id * 2 + 35
trunc_target = trunc_chain_id * 2 + 35 diff = vrs[0][0] - (trunc_target & 0xff)
diff = vrs[0][0] - (trunc_target & 0xff) vrs = (target + diff, vrs[1], vrs[2])
vrs = (target + diff, vrs[1], vrs[2])
decoded = rlp.decode(raw_tx) decoded = rlp.decode(raw_tx)
reencoded = rlp.encode(decoded[:-3] + list(vrs)) reencoded = rlp.encode(decoded[:-3] + list(vrs))
addr = Account.recover_transaction(prefix + reencoded) addr = Account.recover_transaction(prefix + reencoded)