Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: replacing JsonRpcSharp with ElectrumSharp+StreamJsonRpc #290

Draft
wants to merge 20 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/GWallet.Backend.Tests/App.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.4.1" newVersion="4.0.4.1"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
164 changes: 77 additions & 87 deletions src/GWallet.Backend.Tests/Deserialization.fs
Original file line number Diff line number Diff line change
Expand Up @@ -96,83 +96,71 @@ type Deserialization() =
[<Test>]
member __.``signed btc transaction import``() =

let deserializedSignedTrans: SignedTransaction<IBlockchainFeeInfo> =
let deserializedSignedTrans: SignedTransaction =
Account.ImportSignedTransactionFromJson
MarshallingData.SignedBtcTransactionExampleInJson

// Validate deserialized SignedTranasction
Assert.That(deserializedSignedTrans, Is.Not.Null)

Assert.That(deserializedSignedTrans.Currency, Is.EqualTo Currency.BTC)
Assert.That(deserializedSignedTrans.FeeCurrency, Is.EqualTo Currency.BTC)
Assert.That(deserializedSignedTrans.RawTransaction,
Is.EqualTo "0200000000010111b6e0460bb810b05744f8d38262f95fbab02b168b070598a6f31fad438fced4000000001716001427c106013c0042da165c082b3870c31fb3ab4683feffffff0200ca9a3b0000000017a914d8b6fcc85a383261df05423ddf068a8987bf0287873067a3fa0100000017a914d5df0b9ca6c0e1ba60a9ff29359d2600d9c6659d870247304402203b85cb05b43cc68df72e2e54c6cb508aa324a5de0c53f1bbfe997cbd7509774d022041e1b1823bdaddcd6581d7cde6e6a4c4dbef483e42e59e04dbacbaf537c3e3e8012103fbbdb3b3fc3abbbd983b20a557445fb041d6f21cc5977d2121971cb1ce5298978c000000")

Assert.That(deserializedSignedTrans.TransactionInfo, Is.Not.Null)
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal, Is.Not.Null)
Assert.That(deserializedSignedTrans.TransactionInfo.Cache, Is.Not.Null)
Assert.That(deserializedSignedTrans.TransactionInfo.Metadata, Is.Not.Null)

Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.Amount.ValueToSend,
Is.EqualTo(10.01m))
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.Amount.BalanceAtTheMomentOfSending,
Is.EqualTo 12.02m)
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.Amount.Currency,
Is.EqualTo(Currency.BTC))
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.DestinationAddress,
Is.EqualTo("13jxHQDxGto46QhjFiMb78dZdys9ZD8vW5"))
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.OriginAddress,
Is.EqualTo("16pKBjGGZkUXo1afyBNf5ttFvV9hauS1kR"))

let btcTxMetadata = deserializedSignedTrans.TransactionInfo.Metadata :?> UtxoCoin.TransactionMetadata
Assert.That(btcTxMetadata.Fee.EstimatedFeeInSatoshis, Is.EqualTo 10)
Assert.That(btcTxMetadata.Inputs.Length, Is.EqualTo 1)
Assert.That(deserializedSignedTrans.TransactionInfo.Metadata.FeeEstimationTime,
Is.EqualTo MarshallingData.SomeDate)

Assert.That(deserializedSignedTrans.TransactionInfo.Cache.Balances.Count,
Is.EqualTo 5)
Assert.That(deserializedSignedTrans.TransactionInfo.Cache.UsdPrice.Count,
Is.EqualTo 5)

Is.EqualTo "01000000000102cd9e4c06746721fe5d0ecdeabe29a0f05cc22bd7013ff76132efe476d9346bdc0000000017160014618869483590d6c1afe51160f244982e055d213ffdffffffef2763e4690975dc9415d36c06361ddee8393e6d9d86edd748ca21f10788fbc30100000017160014618869483590d6c1afe51160f244982e055d213ffdffffff01ba89000000000000220020574712746ca1942b8f0e3d52e4c1fd9406c3e1b602b328a2a77a57c233fed4640247304402206e9359074007c597a8243d4e5bbfb18ccfd83c0206fcbd1fafc02eb4946852f90220566e0d719b48d11f193d5d6d80eccbaaf44ee1771bf9ea7fd3810d41c5cb429f012102b7326aff8f2e56a341c31fbf50d0ce1a641859d837daffd7bf03f1f80a8c5eaa0247304402202fdbb2ea123c1150b26835ecd54cd59a22bca6a47f32167b35f355fbfcc12d22022011b8314e51b229d6d5a5ee216c9e038b5e05d1b5123485b935a1f823f2bf2279012102b7326aff8f2e56a341c31fbf50d0ce1a641859d837daffd7bf03f1f80a8c5eaa00000000")

// Can't validate proposal because of "unknown origin account" error

let btcTxMetadata =
Account.GetTransactionMetadata deserializedSignedTrans
|> Async.RunSynchronously
:?> UtxoCoin.TransactionMetadata

Assert.That(btcTxMetadata.Fee.EstimatedFeeInSatoshis, Is.EqualTo 980)
Assert.That(btcTxMetadata.Inputs.Length, Is.EqualTo 2)

[<Test>]
member __.``signed ether transaction import``() =

let deserializedSignedTrans: SignedTransaction<IBlockchainFeeInfo> =
let deserializedSignedTrans: SignedTransaction =
Account.ImportSignedTransactionFromJson
MarshallingData.SignedEtherTransactionExampleInJson

// Validate deserialized SignedTransaction
Assert.That(deserializedSignedTrans, Is.Not.Null)

Assert.That(deserializedSignedTrans.RawTransaction,
Is.EqualTo("doijfsoifjdosisdjfomirmjosmi"))

Assert.That(deserializedSignedTrans.TransactionInfo, Is.Not.Null)
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal, Is.Not.Null)
Assert.That(deserializedSignedTrans.TransactionInfo.Cache, Is.Not.Null)
Assert.That(deserializedSignedTrans.TransactionInfo.Metadata, Is.Not.Null)
Is.EqualTo("f86b0185019d334a3482520894d2fdfa29d5ccbb8168ba248d59ded7a25396f84e87022a8ad81f98768026a06bb7c1f8f2b40ed2bc3a3b572cdde7fddb42a8d43c561c60580183b0ed8c2d9fa035183359feab8789642135a253371f80781f4a870f0cae8a7368c5d7e102a688"))

Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.Amount.ValueToSend,
Is.EqualTo(10.01m))
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.Amount.BalanceAtTheMomentOfSending,
Is.EqualTo 12.02m)
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.Amount.Currency,
Is.EqualTo(Currency.ETC))
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.DestinationAddress,
Is.EqualTo("0xf3j4m0rjxdddud9403j"))
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.OriginAddress,
Is.EqualTo("0xf3j4m0rjx94sushh03j"))
Assert.That(deserializedSignedTrans.Currency,
Is.EqualTo(Currency.ETH))

Assert.That(deserializedSignedTrans.FeeCurrency,
Is.EqualTo(Currency.ETH))

let etherTxMetadata = deserializedSignedTrans.TransactionInfo.Metadata :?> Ether.TransactionMetadata
Assert.That(etherTxMetadata.TransactionCount, Is.EqualTo(69))

// Validate generated proposal
let proposal = Account.GetTransactionProposal deserializedSignedTrans

Assert.That(proposal.Amount.ValueToSend,
Is.EqualTo(0.000609725773224054m))
Assert.That(proposal.Amount.Currency,
Is.EqualTo(Currency.ETH))
Assert.That(proposal.DestinationAddress,
Is.EqualTo("0xd2FDFA29D5ccbb8168Ba248D59dED7a25396f84E"))
Assert.That(proposal.OriginAddress,
Is.EqualTo("0xc295DDB9B89AFb7B0b23cFb76cb34ce33bc854D5"))

// Validate generated metadata
let etherTxMetadata =
Account.GetTransactionMetadata deserializedSignedTrans
|> Async.RunSynchronously
:?> Ether.TransactionMetadata

Assert.That(etherTxMetadata.TransactionCount, Is.EqualTo(1))
Assert.That(etherTxMetadata.Fee.Currency,
Is.EqualTo(Currency.ETC))
Is.EqualTo(Currency.ETH))
Assert.That(etherTxMetadata.Fee.GasPriceInWei,
Is.EqualTo(6969))
Assert.That(deserializedSignedTrans.TransactionInfo.Metadata.FeeEstimationTime,
Is.EqualTo MarshallingData.SomeDate)

Assert.That(deserializedSignedTrans.TransactionInfo.Cache.Balances.Count,
Is.EqualTo(2))
Assert.That(deserializedSignedTrans.TransactionInfo.Cache.UsdPrice.Count,
Is.EqualTo(2))
Is.EqualTo(6932351540UL))

[<Test>]
member __.``unsigned SAI transaction import``() =
Expand Down Expand Up @@ -205,46 +193,48 @@ type Deserialization() =
Assert.That(deserializedUnsignedTrans.Cache.UsdPrice.Count, Is.EqualTo(5))

[<Test>]
member __.``signed SAI transaction import``() =
member __.``signed DAI transaction import``() =

let deserializedSignedTrans: SignedTransaction<IBlockchainFeeInfo> =
let deserializedSignedTrans: SignedTransaction =
Account.ImportSignedTransactionFromJson
MarshallingData.SignedSaiTransactionExampleInJson
MarshallingData.SignedDaiTransactionExampleInJson

// Validate deserialized SignedTransaction
Assert.That(deserializedSignedTrans, Is.Not.Null)

Assert.That(deserializedSignedTrans.RawTransaction,
Is.EqualTo("f8a80784c74d93708291b29489d24a6b4ccb1b6faa2625fe562bdd9a2326035980b844a9059cbb000000000000000000000000db0381b1a380d8db2724a9ca2d33e0c6c044be3b0000000000000000000000000000000000000000000000000de0b6b3a764000026a072cdeb03affd5977c76366efbc1405fbb4fa997ce72c1e4554ba9ec5ef772ddca069d522ea304efebd2537330870bc1ca9e9a6fe3eb5f8d8f66c1b82d9fc27a4bf"))
Is.EqualTo("f8a90185016c653675828792946b175474e89094c44da98b954eedeac495271d0f80b844a9059cbb000000000000000000000000d2fdfa29d5ccbb8168ba248d59ded7a25396f84e0000000000000000000000000000000000000000000000000de0b6b3a764000026a0d5c49133f38f3b60aa41747a4b7cc300a6dac87803b82ba23af9a97fd5994c3ea03122864fd6b294a3da2f3827e70fa861838a168f6533e03587358a6bdc594235"))

Assert.That(deserializedSignedTrans.TransactionInfo, Is.Not.Null)
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal, Is.Not.Null)
Assert.That(deserializedSignedTrans.TransactionInfo.Cache, Is.Not.Null)
Assert.That(deserializedSignedTrans.TransactionInfo.Metadata, Is.Not.Null)

Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.Amount.ValueToSend,
Is.EqualTo(1m))
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.Amount.BalanceAtTheMomentOfSending,
Is.EqualTo 7.08m)
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.Amount.Currency,
Is.EqualTo Currency.SAI)
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.DestinationAddress,
Is.EqualTo("0xDb0381B1a380d8db2724A9Ca2d33E0C6C044bE3b"))
Assert.That(deserializedSignedTrans.TransactionInfo.Proposal.OriginAddress,
Is.EqualTo("0xba766d6d13E2Cc921Bf6e896319D32502af9e37E"))

let etherTxMetadata = deserializedSignedTrans.TransactionInfo.Metadata :?> Ether.TransactionMetadata
Assert.That(etherTxMetadata.TransactionCount, Is.EqualTo(7))
Assert.That(deserializedSignedTrans.Currency,
Is.EqualTo Currency.DAI)

Assert.That(deserializedSignedTrans.FeeCurrency,
Is.EqualTo(Currency.ETH))

// Validate generated proposal
let proposal = Account.GetTransactionProposal deserializedSignedTrans

Assert.That(proposal.Amount.ValueToSend,
Is.EqualTo(1.0m))
Assert.That(proposal.Amount.Currency,
Is.EqualTo(Currency.DAI))
Assert.That(proposal.DestinationAddress,
Is.EqualTo("0xd2FDFA29D5ccbb8168Ba248D59dED7a25396f84E"))
Assert.That(proposal.OriginAddress,
Is.EqualTo("0xc295DDB9B89AFb7B0b23cFb76cb34ce33bc854D5"))

// Validate generated metadata
let etherTxMetadata =
Account.GetTransactionMetadata deserializedSignedTrans
|> Async.RunSynchronously
:?> Ether.TransactionMetadata

Assert.That(etherTxMetadata.TransactionCount, Is.EqualTo(1))
Assert.That(etherTxMetadata.Fee.Currency,
Is.EqualTo(Currency.ETH))
Assert.That(etherTxMetadata.Fee.GasPriceInWei,
Is.EqualTo(3343750000L))
Assert.That(deserializedSignedTrans.TransactionInfo.Metadata.FeeEstimationTime,
Is.EqualTo MarshallingData.SomeDate)
Is.EqualTo(6113539701UL))

Assert.That(deserializedSignedTrans.TransactionInfo.Cache.Balances.Count,
Is.EqualTo 5)
Assert.That(deserializedSignedTrans.TransactionInfo.Cache.UsdPrice.Count,
Is.EqualTo(5))

[<Test>]
member __.``can roundtrip currency``() =
Expand Down
21 changes: 11 additions & 10 deletions src/GWallet.Backend.Tests/ElectrumIntegrationTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ open System
open System.Linq

open NUnit.Framework
open ElectrumSharp

open GWallet.Backend
open GWallet.Backend.UtxoCoin
Expand Down Expand Up @@ -50,7 +51,7 @@ type ElectrumIntegrationTests() =

let CheckServerIsReachable (electrumServer: ServerDetails)
(currency: Currency)
(query: Async<StratumClient>->Async<'T>)
(query: Async<ElectrumClient>->Async<'T>)
(assertion: 'T->unit)
(maybeFilter: Option<ServerDetails -> bool>)
: Async<Option<ServerDetails>> = async {
Expand All @@ -61,7 +62,7 @@ type ElectrumIntegrationTests() =
// because we want the server incompatibilities to show up here (even if GWallet clients bypass
// them in order not to crash)
try
let stratumClient = ElectrumClient.StratumServer server
let stratumClient = Electrum.CreateClientFor server
let result = query stratumClient
|> Async.RunSynchronously

Expand Down Expand Up @@ -92,7 +93,7 @@ type ElectrumIntegrationTests() =

}

let BalanceAssertion (balance: BlockchainScriptHashGetBalanceInnerResult) =
let BalanceAssertion (balance: BlockchainScriptHashGetBalanceResult) =
// if these ancient addresses get withdrawals it would be interesting in the crypto space...
// so let's make the test check a balance like this which is unlikely to change
Assert.That(balance.Confirmed, Is.Not.LessThan 998292)
Expand All @@ -115,7 +116,7 @@ type ElectrumIntegrationTests() =

let TestElectrumServersConnections (electrumServers: seq<_>)
currency
(query: Async<StratumClient>->Async<'T>)
(query: Async<ElectrumClient>->Async<'T>)
(assertion: 'T->unit)
(atLeast: uint32)
=
Expand Down Expand Up @@ -157,7 +158,7 @@ type ElectrumIntegrationTests() =
(fun server -> rebelBtcServerHostnames.Any(fun rebel -> server.ServerInfo.NetworkPath = rebel))
ElectrumServerSeedList.DefaultBtcList

let UtxosAssertion (utxos: array<BlockchainScriptHashListUnspentInnerResult>) =
let UtxosAssertion (utxos: array<BlockchainScriptHashListUnspentResult>) =
// if these ancient addresses get withdrawals it would be interesting in the crypto space...
// so let's make the test check a balance like this which is unlikely to change
Assert.That(utxos.Length, Is.GreaterThan 1)
Expand All @@ -176,21 +177,21 @@ type ElectrumIntegrationTests() =
let currency = Currency.BTC
let argument = GetScriptHash currency
CheckElectrumServersConnection ElectrumServerSeedList.DefaultBtcList currency
(ElectrumClient.GetBalance argument) BalanceAssertion
(Electrum.GetBalance argument) BalanceAssertion

[<Test>]
member __.``can connect (just check balance) to some electrum LTC servers``() =
let currency = Currency.LTC
let argument = GetScriptHash currency
CheckElectrumServersConnection ElectrumServerSeedList.DefaultLtcList currency
(ElectrumClient.GetBalance argument) BalanceAssertion
(Electrum.GetBalance argument) BalanceAssertion

[<Test>]
member __.``can get list UTXOs of an address from some electrum BTC servers``() =
let currency = Currency.BTC
let argument = GetScriptHash currency
CheckElectrumServersConnection btcNonRebelServers currency
(ElectrumClient.GetUnspentTransactionOutputs argument) UtxosAssertion
(Electrum.GetUnspentTransactionOutputs argument) UtxosAssertion

[<Test>]
// to make sure the workaround for https://github.com/nblockchain/JsonRpcSharp/issues/9 works
Expand All @@ -201,7 +202,7 @@ type ElectrumIntegrationTests() =
let argument = "2f309ef555110ab4e9c920faa2d43e64f195aa027e80ec28e1d243bd8929a2fc"

CheckElectrumServersConnection btcNonRebelServers currency
(ElectrumClient.GetBlockchainTransaction argument) TxAssertion
(Electrum.GetBlockchainTransaction argument) TxAssertion

[<Test>]
// to make sure the workaround for https://github.com/nblockchain/JsonRpcSharp/issues/9 works
Expand All @@ -212,5 +213,5 @@ type ElectrumIntegrationTests() =
let argument = "2f309ef555110ab4e9c920faa2d43e64f195aa027e80ec28e1d243bd8929a2fc"

CheckElectrumServersConnection btcRebelServers currency
(ElectrumClient.GetBlockchainTransaction argument) TxAssertion
(Electrum.GetBlockchainTransaction argument) TxAssertion

Loading