-
Notifications
You must be signed in to change notification settings - Fork 20
/
PushTxViewModel.cs
119 lines (100 loc) · 3.29 KB
/
PushTxViewModel.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Denovo
// Copyright (c) 2020 Autarkysoft
// Distributed under the MIT software license, see the accompanying
// file LICENCE or http://www.opensource.org/licenses/mit-license.php.
using Autarkysoft.Bitcoin;
using Autarkysoft.Bitcoin.Blockchain.Transactions;
using Autarkysoft.Bitcoin.Clients;
using Autarkysoft.Bitcoin.Encoders;
using Autarkysoft.Bitcoin.P2PNetwork.Messages;
using Autarkysoft.Bitcoin.P2PNetwork.Messages.MessagePayloads;
using Denovo.Models;
using Denovo.MVVM;
using System;
using System.Diagnostics;
namespace Denovo.ViewModels
{
public sealed class PushTxViewModel : VmWithSizeBase, IDisposable
{
public PushTxViewModel() : base(450, 650)
{
ConnectCommand = new BindableCommand(Connect, () => !IsConnected);
PushCommand = new BindableCommand(Push, () => IsConnected);
NetworkList = new NetworkType[] { NetworkType.MainNet, NetworkType.TestNet };
}
private MinimalClientSettings settings;
private MinimalClient client;
public NetworkType[] NetworkList { get; }
private NetworkType _SelNet;
public NetworkType SelectedNetwork
{
get => _SelNet;
set => SetField(ref _SelNet, value);
}
private bool _isConnected = false;
public bool IsConnected
{
get => _isConnected;
set
{
if (SetField(ref _isConnected, value))
{
ConnectCommand.RaiseCanExecuteChanged();
PushCommand.RaiseCanExecuteChanged();
}
}
}
private string _txHex;
public string TxHex
{
get => _txHex;
set => SetField(ref _txHex, value);
}
private string _res;
public string Result
{
get => _res;
set => SetField(ref _res, value);
}
public BindableCommand ConnectCommand { get; }
public void Connect()
{
settings = new(SelectedNetwork, 4, null)
{
DnsSeeds = SelectedNetwork == NetworkType.MainNet ? Constants.GetMainNetDnsSeeds() : Constants.GetTestNetDnsSeeds(),
UserAgent = "/Satoshi:0.22.0/",
};
client = new(settings);
client.Start();
IsConnected = true;
}
public BindableCommand PushCommand { get; }
public void Push()
{
Debug.Assert(IsConnected);
if (settings.AllNodes.Count < 1)
{
Result = "Not yet connected, please wait.";
return;
}
if (!Base16.TryDecode(TxHex, out byte[] ba))
{
Result = "Invalid hex.";
return;
}
Transaction tx = new();
if (!tx.TryDeserialize(new FastStreamReader(ba), out Errors error))
{
Result = $"Could not deserialize transaction hex. Error message: {error.Convert()}";
return;
}
Message msg = new(new TxPayload(tx), SelectedNetwork);
client.Send(msg);
Result = "Successfully sent.";
}
public void Dispose()
{
client?.Dispose();
}
}
}