Esempio n. 1
0
    /// <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
        });
    }
Esempio n. 2
0
    /// <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
        });
    }
Esempio n. 3
0
    /// <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);
    }