/// <summary> /// Gets the signed transaction data from the Trezor wallet. /// </summary> /// <param name="transaction"> The transaction to sign. </param> /// <param name="path"> The path of the address to sign the transaction with. </param> /// <param name="onSignatureRequestSent"> Action to call once the signature request has been sent. </param> /// <returns> Task returning the SignedTransactionDataHolder instance. </returns> protected override async Task <SignedTransactionDataHolder> GetSignedTransactionData(Transaction transaction, string path, Action onSignatureRequestSent) { var trezorManager = TrezorConnector.GetWindowsConnectedTrezor(GetSignedTransactionDataEnterPin); if (trezorManager == null) { return(null); } var signedTransactionResponse = (EthereumTxRequest)null; var signedTransactionRequest = new EthereumSignTx { Nonce = transaction.Nonce, AddressNs = KeyPath.Parse(path).Indexes, GasPrice = transaction.GasPrice, GasLimit = transaction.GasLimit, To = transaction.ReceiveAddress, Value = transaction.Value, DataInitialChunk = transaction.Data, DataLength = (uint)transaction.Data.Length, ChainId = (uint)ethereumNetworkSettings.networkType }; while (true) { try { signedTransactionResponse = await trezorManager.SendMessageAsync <EthereumTxRequest, EthereumSignTx>(signedTransactionRequest, onSignatureRequestSent) .ConfigureAwait(false); break; } catch (FailureException <Failure> ) { if (forceCancel) { forceCancel = false; break; } if (trezorManager.PinRequest.HasValue && trezorManager.PinRequest == false) { break; } } } if (signedTransactionResponse == null) { return(new SignedTransactionDataHolder()); } return(new SignedTransactionDataHolder { signed = true, v = signedTransactionResponse.SignatureV, r = signedTransactionResponse.SignatureR, s = signedTransactionResponse.SignatureS }); }
/// <summary> /// Gets the public key data from the Trezor wallet. /// </summary> /// <returns> Task returning the ExtendedPublicKeyDataHolder instance. </returns> protected override async Task <ExtendedPublicKeyDataHolder> GetExtendedPublicKeyData() { var trezorManager = TrezorConnector.GetWindowsConnectedTrezor(GetExtendedPublicKeyDataEnterPin); if (trezorManager == null) { return(null); } var publicKeyRequest = new GetPublicKey { AddressNs = KeyPath.Parse(EXTENDED_PUBLIC_KEY_PATH).Indexes, ShowDisplay = false }; var publicKeyResponse = (PublicKey)null; while (publicKeyResponse == null) { try { publicKeyResponse = await trezorManager.SendMessageAsync <PublicKey, GetPublicKey>(publicKeyRequest).ConfigureAwait(false); } catch (FailureException <Failure> ) { MainThreadExecutor.QueueAction(() => PINIncorrect?.Invoke()); publicKeyResponse = null; advance = false; } } if (publicKeyResponse == null) { return(null); } return(new ExtendedPublicKeyDataHolder { publicKeyData = publicKeyResponse.Node.PublicKey, chainCodeData = publicKeyResponse.Node.ChainCode }); }
/// <summary> /// Checks if the trezor is connected. /// </summary> /// <returns> Task returning the status of the trezor connection. </returns> protected override async Task <bool> IsHardwareWalletConnected() { var trezorManager = await Task <TrezorManager> .Factory.StartNew(() => TrezorConnector.GetWindowsConnectedTrezor(null)).ConfigureAwait(false); return(trezorManager != null); }