Merge pull request #543 from LedgerHQ/fix/apa/client_non_legacy_recover_transaction
Fix recover_transaction function in Ragger client
This commit is contained in:
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- Increased the delay between `autonext` callback calls for EIP-712 on Stax
|
- Increased the delay between `autonext` callback calls for EIP-712 on Stax
|
||||||
|
- `recover_transaction` util function for non-legacy transactions
|
||||||
|
|
||||||
## [0.2.1] - 2023-12-01
|
## [0.2.1] - 2023-12-01
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user