From 29be0a254631763e4c1ba79818507608eb4beafe Mon Sep 17 00:00:00 2001 From: moisses89 <7888669+moisses89@users.noreply.github.com> Date: Wed, 12 Jun 2024 12:37:04 +0200 Subject: [PATCH] Fix hw_wallet overwrites previous signatures --- .../operators/hw_wallets/hw_wallet_manager.py | 16 ++++++++++++---- .../operators/safe_tx_service_operator.py | 4 +++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/safe_cli/operators/hw_wallets/hw_wallet_manager.py b/src/safe_cli/operators/hw_wallets/hw_wallet_manager.py index 7bccae6..d53b4d1 100644 --- a/src/safe_cli/operators/hw_wallets/hw_wallet_manager.py +++ b/src/safe_cli/operators/hw_wallets/hw_wallet_manager.py @@ -114,7 +114,9 @@ def delete_accounts(self, addresses: List[ChecksumAddress]) -> Set: self.wallets = self.wallets.difference(accounts_to_remove) return accounts_to_remove - def sign_eip712(self, eip712_message: Dict, wallets: List[HwWallet]) -> HexBytes: + def sign_eip712( + self, eip712_message: Dict, wallets: List[HwWallet] + ) -> List[SafeSignature]: """ Sign an EIP712 message @@ -136,7 +138,7 @@ def sign_eip712(self, eip712_message: Dict, wallets: List[HwWallet]) -> HexBytes signature = wallet.sign_typed_hash(domain_hash, message_hash) safe_signatures.append(SafeSignatureEOA(signature, eip712_message_hash)) - return SafeSignature.export_signatures(safe_signatures) + return safe_signatures def sign_safe_tx(self, safe_tx: SafeTx, wallets: List[HwWallet]) -> SafeTx: """ @@ -146,8 +148,14 @@ def sign_safe_tx(self, safe_tx: SafeTx, wallets: List[HwWallet]) -> SafeTx: :param wallets: :return: SafeTx with signature. """ - signatures = self.sign_eip712(safe_tx.eip712_structured_data, wallets) - safe_tx.signatures = signatures + hw_wallet_signatures = self.sign_eip712(safe_tx.eip712_structured_data, wallets) + # Update signatures + signatures = ( + SafeSignature.parse_signature(safe_tx.signatures, safe_tx.safe_tx_hash) + + hw_wallet_signatures + ) + + safe_tx.signatures = SafeSignature.export_signatures(signatures) return safe_tx def execute_safe_tx( diff --git a/src/safe_cli/operators/safe_tx_service_operator.py b/src/safe_cli/operators/safe_tx_service_operator.py index 1724656..ccd8051 100644 --- a/src/safe_cli/operators/safe_tx_service_operator.py +++ b/src/safe_cli/operators/safe_tx_service_operator.py @@ -450,7 +450,9 @@ def remove_proposed_transaction(self, safe_tx_hash: bytes): if isinstance(signer, LocalAccount): signature = signer.signHash(message_hash).signature else: - signature = self.hw_wallet_manager.sign_eip712(eip712_message, [signer]) + signature = self.hw_wallet_manager.sign_eip712( + eip712_message, [signer] + )[0].signature if len(safe_tx.signers) >= self.safe.retrieve_threshold(): print_formatted_text(