Use fixed data types for some basic structures
[novacoin.git] / src / qt / multisiginputentry.cpp
1 #include <QApplication>
2 #include <QClipboard>
3 #include <string>
4 #include <vector>
5
6 #include "base58.h"
7 #include "multisiginputentry.h"
8 #include "ui_multisiginputentry.h"
9 #include "main.h"
10 #include "script.h"
11 #include "util.h"
12 #include "wallet.h"
13 #include "walletmodel.h"
14
15
16 MultisigInputEntry::MultisigInputEntry(QWidget *parent) : QFrame(parent), ui(new Ui::MultisigInputEntry), model(0)
17 {
18     ui->setupUi(this);
19 }
20
21 MultisigInputEntry::~MultisigInputEntry()
22 {
23     delete ui;
24 }
25
26 void MultisigInputEntry::setModel(WalletModel *model)
27 {
28     this->model = model;
29     clear();
30 }
31
32 void MultisigInputEntry::clear()
33 {
34     ui->transactionId->clear();
35     ui->transactionOutput->clear();
36     ui->redeemScript->clear();
37 }
38
39 bool MultisigInputEntry::validate()
40 {
41     return (ui->transactionOutput->count() > 0);
42 }
43
44 CTxIn MultisigInputEntry::getInput()
45 {
46     unsigned int nOutput = ui->transactionOutput->currentIndex();
47     CTxIn input(COutPoint(txHash, nOutput));
48
49     return input;
50 }
51
52 int64_t MultisigInputEntry::getAmount()
53 {
54     int64_t amount = 0;
55     unsigned int nOutput = ui->transactionOutput->currentIndex();
56     CTransaction tx;
57     uint256 blockHash = 0;
58
59     if(GetTransaction(txHash, tx, blockHash))
60     {
61         if(nOutput < tx.vout.size())
62         {
63             const CTxOut& txOut = tx.vout[nOutput];
64             amount = txOut.nValue;
65         }
66     }
67
68     return amount;
69 }
70
71 QString MultisigInputEntry::getRedeemScript()
72 {
73     return ui->redeemScript->text();
74 }
75
76 void MultisigInputEntry::setTransactionId(QString transactionId)
77 {
78     ui->transactionId->setText(transactionId);
79 }
80
81 void MultisigInputEntry::setTransactionOutputIndex(int index)
82 {
83     ui->transactionOutput->setCurrentIndex(index);
84 }
85
86 void MultisigInputEntry::setRemoveEnabled(bool enabled)
87 {
88     ui->deleteButton->setEnabled(enabled);
89 }
90
91 void MultisigInputEntry::on_pasteTransactionIdButton_clicked()
92 {
93     ui->transactionId->setText(QApplication::clipboard()->text());
94 }
95
96 void MultisigInputEntry::on_deleteButton_clicked()
97 {
98     emit removeEntry(this);
99 }
100
101 void MultisigInputEntry::on_pasteRedeemScriptButton_clicked()
102 {
103     ui->redeemScript->setText(QApplication::clipboard()->text());
104 }
105
106 void MultisigInputEntry::on_transactionId_textChanged(const QString &transactionId)
107 {
108     ui->transactionOutput->clear();
109     if(transactionId.isEmpty())
110         return;
111
112     // Make list of transaction outputs
113     txHash.SetHex(transactionId.toStdString().c_str());
114     CTransaction tx;
115     uint256 blockHash = 0;
116     if(!GetTransaction(txHash, tx, blockHash))
117         return;
118     for(unsigned int i = 0; i < tx.vout.size(); i++)
119     {
120         QString idStr;
121         idStr.setNum(i);
122         const CTxOut& txOut = tx.vout[i];
123         int64_t amount = txOut.nValue;
124         QString amountStr;
125         amountStr.sprintf("%.6f", (double) amount / COIN);
126         CScript script = txOut.scriptPubKey;
127         CTxDestination addr;
128         if(ExtractDestination(script, addr))
129         {
130             CBitcoinAddress address(addr);
131             QString addressStr(address.ToString().c_str());
132             ui->transactionOutput->addItem(idStr + QString(" - ") + addressStr + QString(" - ") + amountStr + QString(" NVC"));
133         }
134         else
135             ui->transactionOutput->addItem(idStr + QString(" - ") + amountStr + QString(" NVC"));
136     }
137 }
138
139 void MultisigInputEntry::on_transactionOutput_currentIndexChanged(int index)
140 {
141     if(ui->transactionOutput->itemText(index).isEmpty())
142         return;
143
144     CTransaction tx;
145     uint256 blockHash = 0;
146     if(!GetTransaction(txHash, tx, blockHash))
147         return;
148     const CTxOut& txOut = tx.vout[index];
149     CScript script = txOut.scriptPubKey;
150
151     if(script.IsPayToScriptHash())
152     {
153         ui->redeemScript->setEnabled(true);
154
155         if(model)
156         {
157              // Try to find the redeem script
158              CTxDestination dest;
159             if(ExtractDestination(script, dest))
160             {
161                 CScriptID scriptID = boost::get<CScriptID>(dest);
162                 CScript redeemScript;
163                 if(model->getWallet()->GetCScript(scriptID, redeemScript))
164                     ui->redeemScript->setText(HexStr(redeemScript.begin(), redeemScript.end()).c_str());
165             }
166         }
167     }
168     else
169     {
170         ui->redeemScript->setEnabled(false);
171     }
172
173     emit updateAmount();
174 }