mastercoin-wallet 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,60 @@
1
+ module MastercoinWallet
2
+ class PurchaseOfferWindow < Qt::Dialog
3
+ include Bitcoin::Builder
4
+ include MastercoinWallet::Builder
5
+
6
+ slots 'send_transaction()'
7
+
8
+ def initialize(parent=nil, options)
9
+ super(parent)
10
+
11
+ @ui = Ui_PurchaseOffer.new
12
+ @ui.setupUi(self)
13
+
14
+ @amount_input = findChild(Qt::LineEdit, "amount_input")
15
+ @password_input = findChild(Qt::LineEdit, "password_input")
16
+ @address_input = findChild(Qt::LineEdit, "address_input")
17
+ @fee_input = findChild(Qt::LineEdit, "fee_input")
18
+
19
+ @amount_input.text = options[:available] if options.has_key?(:available)
20
+ @address_input.text = options[:address] if options.has_key?(:address)
21
+ @fee_input.text = options[:fee] if options.has_key?(:fee)
22
+
23
+ @submit = findChild(Qt::PushButton, "submit_button")
24
+
25
+ @amount_input.validator = Qt::DoubleValidator.new(0.00000001, 10000,8, @amount_input)
26
+ @fee_input.validator = Qt::DoubleValidator.new(0.00000001, 10000,8, @fee_input)
27
+
28
+ @currency_select = findChild(Qt::ComboBox, "currency_box")
29
+ # Dont allow real coins for now
30
+ # @currency_select.addItem(tr("Mastercoin"))
31
+ @currency_select.addItem(tr("Test Mastercoin"))
32
+
33
+ @submit.enabled = true
34
+
35
+ connect(@submit, SIGNAL('clicked()'), self, SLOT('send_transaction()'))
36
+ end
37
+
38
+ def send_transaction
39
+ @amount = @amount_input.text()
40
+ @receiving_address = @address_input.text()
41
+ @password = @password_input.text()
42
+ @fee = @fee_input.text()
43
+
44
+ unless Bitcoin::valid_address?(@receiving_address)
45
+ Qt::MessageBox.critical(self, tr("Invalid address"),
46
+ tr("Please fill in a valid Bitcoin/Mastercoin address"))
47
+ end
48
+
49
+ unless @receiving_address.empty? || @amount.empty? || @password.empty? || @fee.empty?
50
+ data_keys = Mastercoin::PurchaseOffer.new(currency_id: 2, amount: (@amount.to_f * 1e8).to_i).encode_to_compressed_public_key(MastercoinWallet.config.address)
51
+ create_transaction_with_keys(data_keys, force_fee: @fee)
52
+ close()
53
+ else
54
+ Qt::MessageBox.critical(self, tr("Invalid form"),
55
+ tr("Please fill in all required inputs"))
56
+ end
57
+
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,142 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ui version="4.0">
3
+ <class>PurchaseOffer</class>
4
+ <widget class="QDialog" name="PurchaseOffer">
5
+ <property name="geometry">
6
+ <rect>
7
+ <x>0</x>
8
+ <y>0</y>
9
+ <width>534</width>
10
+ <height>238</height>
11
+ </rect>
12
+ </property>
13
+ <property name="windowTitle">
14
+ <string>New Purchase Offer</string>
15
+ </property>
16
+ <widget class="QWidget" name="verticalLayoutWidget">
17
+ <property name="geometry">
18
+ <rect>
19
+ <x>9</x>
20
+ <y>39</y>
21
+ <width>518</width>
22
+ <height>148</height>
23
+ </rect>
24
+ </property>
25
+ <layout class="QVBoxLayout" name="verticalLayout">
26
+ <item>
27
+ <layout class="QGridLayout" name="gridLayout">
28
+ <item row="4" column="1">
29
+ <widget class="QLineEdit" name="password_input">
30
+ <property name="echoMode">
31
+ <enum>QLineEdit::Password</enum>
32
+ </property>
33
+ </widget>
34
+ </item>
35
+ <item row="3" column="1">
36
+ <widget class="QComboBox" name="currency_box"/>
37
+ </item>
38
+ <item row="1" column="0">
39
+ <widget class="QLabel" name="label_3">
40
+ <property name="text">
41
+ <string>Amount</string>
42
+ </property>
43
+ </widget>
44
+ </item>
45
+ <item row="0" column="0">
46
+ <widget class="QLabel" name="label_2">
47
+ <property name="text">
48
+ <string>Masteroin address</string>
49
+ </property>
50
+ </widget>
51
+ </item>
52
+ <item row="1" column="1">
53
+ <widget class="QLineEdit" name="amount_input">
54
+ <property name="placeholderText">
55
+ <string/>
56
+ </property>
57
+ </widget>
58
+ </item>
59
+ <item row="3" column="0">
60
+ <widget class="QLabel" name="label_4">
61
+ <property name="text">
62
+ <string>Currency</string>
63
+ </property>
64
+ </widget>
65
+ </item>
66
+ <item row="0" column="1">
67
+ <widget class="QLineEdit" name="address_input">
68
+ <property name="minimumSize">
69
+ <size>
70
+ <width>300</width>
71
+ <height>0</height>
72
+ </size>
73
+ </property>
74
+ <property name="placeholderText">
75
+ <string/>
76
+ </property>
77
+ </widget>
78
+ </item>
79
+ <item row="4" column="0">
80
+ <widget class="QLabel" name="label_5">
81
+ <property name="text">
82
+ <string>Password</string>
83
+ </property>
84
+ </widget>
85
+ </item>
86
+ <item row="2" column="1">
87
+ <widget class="QLineEdit" name="fee_input"/>
88
+ </item>
89
+ <item row="2" column="0">
90
+ <widget class="QLabel" name="label_6">
91
+ <property name="text">
92
+ <string>Required fee</string>
93
+ </property>
94
+ </widget>
95
+ </item>
96
+ </layout>
97
+ </item>
98
+ </layout>
99
+ </widget>
100
+ <widget class="QLabel" name="label">
101
+ <property name="geometry">
102
+ <rect>
103
+ <x>20</x>
104
+ <y>10</y>
105
+ <width>161</width>
106
+ <height>21</height>
107
+ </rect>
108
+ </property>
109
+ <property name="text">
110
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:large; font-weight:600;&quot;&gt;New Purchase Offer&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
111
+ </property>
112
+ </widget>
113
+ <widget class="QPushButton" name="submit_button">
114
+ <property name="enabled">
115
+ <bool>false</bool>
116
+ </property>
117
+ <property name="geometry">
118
+ <rect>
119
+ <x>410</x>
120
+ <y>190</y>
121
+ <width>114</width>
122
+ <height>32</height>
123
+ </rect>
124
+ </property>
125
+ <property name="text">
126
+ <string>Send</string>
127
+ </property>
128
+ <property name="autoDefault">
129
+ <bool>false</bool>
130
+ </property>
131
+ </widget>
132
+ </widget>
133
+ <tabstops>
134
+ <tabstop>address_input</tabstop>
135
+ <tabstop>amount_input</tabstop>
136
+ <tabstop>currency_box</tabstop>
137
+ <tabstop>password_input</tabstop>
138
+ <tabstop>submit_button</tabstop>
139
+ </tabstops>
140
+ <resources/>
141
+ <connections/>
142
+ </ui>
@@ -0,0 +1,60 @@
1
+ module MastercoinWallet
2
+ class SellingOfferWindow < Qt::Dialog
3
+ include Bitcoin::Builder
4
+ include MastercoinWallet::Builder
5
+
6
+ slots 'send_transaction()'
7
+
8
+ def initialize(parent=nil)
9
+ super(parent)
10
+
11
+ @ui = Ui_SellingOffer.new
12
+ @ui.setupUi(self)
13
+
14
+ @amount_input = findChild(Qt::LineEdit, "amount_input")
15
+ @btc_input = findChild(Qt::LineEdit, "btc_amount_input")
16
+ @fee_input = findChild(Qt::LineEdit, "fee_input")
17
+ @time_input = findChild(Qt::LineEdit, "time_input")
18
+ @password_input = findChild(Qt::LineEdit, "password_input")
19
+
20
+ @submit = findChild(Qt::PushButton, "submit_button")
21
+
22
+ @amount_input.validator = Qt::DoubleValidator.new(0.00000001, 10000,8, @amount_input)
23
+ @btc_input.validator = Qt::DoubleValidator.new(0.00000001, 10000,8, @btc_input)
24
+ @fee_input.validator = Qt::DoubleValidator.new(0.00000001, 10000,8, @fee_input)
25
+ @fee_input.text = 0.0001
26
+ @time_input.validator = Qt::DoubleValidator.new(1, 100,1, @time_input)
27
+ @time_input.text = 6
28
+
29
+
30
+ @currency_select = findChild(Qt::ComboBox, "currency_box")
31
+ # Dont allow real coins for now
32
+ # @currency_select.addItem(tr("Mastercoin"))
33
+ @currency_select.addItem(tr("Test Mastercoin"))
34
+
35
+ @submit.enabled = true
36
+
37
+ connect(@submit, SIGNAL('clicked()'), self, SLOT('send_transaction()'))
38
+ end
39
+
40
+ def send_transaction
41
+ @amount = @amount_input.text()
42
+ @btc_amount = @btc_input.text()
43
+ @fee_amount = @fee_input.text()
44
+ @time = @time_input.text()
45
+ @password = @password_input.text()
46
+
47
+ unless @time.empty? || @fee_amount.empty? || @btc_amount.empty? || @amount.empty? || @password.empty?
48
+
49
+ data_keys = Mastercoin::SellingOffer.new(currency_id: 2, amount: (@amount.to_f * 1e8).to_i, bitcoin_amount: (@btc_amount.to_f * 1e8).to_i, time_limit: @time.to_i, transaction_fee: (@fee_amount.to_f * 1e8).to_i).encode_to_compressed_public_key(MastercoinWallet.config.address)
50
+
51
+ create_transaction_with_keys(data_keys)
52
+ close()
53
+ else
54
+ Qt::MessageBox.critical(self, tr("Invalid form"),
55
+ tr("Please fill in all required inputs"))
56
+ end
57
+
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,154 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ui version="4.0">
3
+ <class>SellingOffer</class>
4
+ <widget class="QDialog" name="SellingOffer">
5
+ <property name="geometry">
6
+ <rect>
7
+ <x>0</x>
8
+ <y>0</y>
9
+ <width>534</width>
10
+ <height>276</height>
11
+ </rect>
12
+ </property>
13
+ <property name="windowTitle">
14
+ <string>New Simple Send</string>
15
+ </property>
16
+ <widget class="QWidget" name="verticalLayoutWidget">
17
+ <property name="geometry">
18
+ <rect>
19
+ <x>9</x>
20
+ <y>39</y>
21
+ <width>518</width>
22
+ <height>179</height>
23
+ </rect>
24
+ </property>
25
+ <layout class="QVBoxLayout" name="verticalLayout">
26
+ <item>
27
+ <layout class="QGridLayout" name="gridLayout">
28
+ <item row="6" column="1">
29
+ <widget class="QLineEdit" name="fee_input">
30
+ <property name="minimumSize">
31
+ <size>
32
+ <width>300</width>
33
+ <height>0</height>
34
+ </size>
35
+ </property>
36
+ <property name="placeholderText">
37
+ <string/>
38
+ </property>
39
+ </widget>
40
+ </item>
41
+ <item row="7" column="1">
42
+ <widget class="QLineEdit" name="password_input">
43
+ <property name="echoMode">
44
+ <enum>QLineEdit::Password</enum>
45
+ </property>
46
+ </widget>
47
+ </item>
48
+ <item row="7" column="0">
49
+ <widget class="QLabel" name="label_5">
50
+ <property name="text">
51
+ <string>Password</string>
52
+ </property>
53
+ </widget>
54
+ </item>
55
+ <item row="5" column="0">
56
+ <widget class="QLabel" name="label_6">
57
+ <property name="text">
58
+ <string>Time (in blocks)</string>
59
+ </property>
60
+ </widget>
61
+ </item>
62
+ <item row="1" column="1">
63
+ <widget class="QLineEdit" name="amount_input">
64
+ <property name="placeholderText">
65
+ <string/>
66
+ </property>
67
+ </widget>
68
+ </item>
69
+ <item row="1" column="0">
70
+ <widget class="QLabel" name="label_3">
71
+ <property name="text">
72
+ <string>Amount to sell</string>
73
+ </property>
74
+ </widget>
75
+ </item>
76
+ <item row="3" column="0">
77
+ <widget class="QLabel" name="label_4">
78
+ <property name="text">
79
+ <string>Currency</string>
80
+ </property>
81
+ </widget>
82
+ </item>
83
+ <item row="3" column="1">
84
+ <widget class="QComboBox" name="currency_box"/>
85
+ </item>
86
+ <item row="6" column="0">
87
+ <widget class="QLabel" name="label_2">
88
+ <property name="text">
89
+ <string>Transaction fee</string>
90
+ </property>
91
+ </widget>
92
+ </item>
93
+ <item row="5" column="1">
94
+ <widget class="QLineEdit" name="time_input"/>
95
+ </item>
96
+ <item row="2" column="1">
97
+ <widget class="QLineEdit" name="btc_amount_input"/>
98
+ </item>
99
+ <item row="2" column="0">
100
+ <widget class="QLabel" name="label_7">
101
+ <property name="text">
102
+ <string>Total amount of BTC</string>
103
+ </property>
104
+ </widget>
105
+ </item>
106
+ </layout>
107
+ </item>
108
+ </layout>
109
+ </widget>
110
+ <widget class="QLabel" name="label">
111
+ <property name="geometry">
112
+ <rect>
113
+ <x>10</x>
114
+ <y>10</y>
115
+ <width>151</width>
116
+ <height>21</height>
117
+ </rect>
118
+ </property>
119
+ <property name="text">
120
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:large; font-weight:600;&quot;&gt;New Selling Offer&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
121
+ </property>
122
+ </widget>
123
+ <widget class="QPushButton" name="submit_button">
124
+ <property name="enabled">
125
+ <bool>false</bool>
126
+ </property>
127
+ <property name="geometry">
128
+ <rect>
129
+ <x>420</x>
130
+ <y>230</y>
131
+ <width>114</width>
132
+ <height>32</height>
133
+ </rect>
134
+ </property>
135
+ <property name="text">
136
+ <string>Send</string>
137
+ </property>
138
+ <property name="autoDefault">
139
+ <bool>false</bool>
140
+ </property>
141
+ </widget>
142
+ </widget>
143
+ <tabstops>
144
+ <tabstop>amount_input</tabstop>
145
+ <tabstop>btc_amount_input</tabstop>
146
+ <tabstop>currency_box</tabstop>
147
+ <tabstop>time_input</tabstop>
148
+ <tabstop>fee_input</tabstop>
149
+ <tabstop>password_input</tabstop>
150
+ <tabstop>submit_button</tabstop>
151
+ </tabstops>
152
+ <resources/>
153
+ <connections/>
154
+ </ui>
@@ -1,6 +1,7 @@
1
1
  module MastercoinWallet
2
2
  class SimpleSendWindow < Qt::Dialog
3
3
  include Bitcoin::Builder
4
+ include MastercoinWallet::Builder
4
5
 
5
6
  slots 'on_amount_input_textChanged(const QString&)',
6
7
  'on_address_input_textChanged(const QString&)',
@@ -19,10 +20,6 @@ module MastercoinWallet
19
20
 
20
21
  @submit = findChild(Qt::PushButton, "submit_button")
21
22
 
22
- @amount_input.setText("1.337")
23
- @address_input.setText("1J2svn2GxYx9LPrpCLFikmzn9kkrXBrk8B")
24
-
25
-
26
23
  @amount_input.validator = Qt::DoubleValidator.new(0.00000001, 10000,8, @amount_input)
27
24
 
28
25
 
@@ -40,7 +37,7 @@ module MastercoinWallet
40
37
  end
41
38
 
42
39
  def on_address_input_textChanged(address)
43
- @address = address
40
+ @receiving_address = address
44
41
  check_valid
45
42
  end
46
43
 
@@ -50,124 +47,13 @@ module MastercoinWallet
50
47
  end
51
48
 
52
49
  def send_payment
53
- data_key = Mastercoin::SimpleSend.new(currency_id: 2, amount: @amount.to_f * 1e8).encode_to_compressed_public_key
54
-
55
- fee = BigDecimal.new("0.0001")
56
- tx_amount = BigDecimal.new("0.00006")
57
- mastercoin_tx = (4 * tx_amount)
58
-
59
- result = MastercoinWallet.config.spendable_outputs.find{|x| BigDecimal.new(x[:value]) > (fee + mastercoin_tx)}
60
-
61
- if result.is_a?(Array)
62
- output = result[0]
63
- else
64
- output = result
65
- end
66
-
67
- unless output
68
- Qt::MessageBox.critical(self, tr("Could not send transaction"),
69
- tr("It appears there are no spendable outputs for this address that are big enough to transmit this transaction. Please consolidate some coins and send them to your Mastercoin address."))
70
- return
71
- end
72
-
73
- change_amount = BigDecimal.new(output["value"]) - fee - mastercoin_tx
74
-
75
- tx = MastercoinWallet.config.bitcoin_transactions.find{|x| x["hash"] == output["prev_out"]["hash"]}
76
- if tx.is_a?(Array)
77
- tx = tx[0]
78
- end
79
-
80
- begin
81
- priv_key = MastercoinWallet.config.get_encrypted_key(:private_key, @password)
82
- rescue ArgumentError
83
- Qt::MessageBox.information(self, tr("Could not send payment."),
84
- tr("Could not send payment, wrong password."))
85
- return
86
- end
87
- begin
88
- key = Bitcoin::Key.from_base58(priv_key)
89
- rescue ArgumentError
90
- begin
91
- key = Bitcoin::Key.new(priv_key)
92
- rescue ArgumentError, OpenSSL::BNError
93
- Qt::MessageBox.information(self, tr("Could not send payment."),
94
- tr("Could not send payment, wrong password."))
95
- return
96
- end
97
- end
98
-
99
- tx = build_tx do |t|
100
- t.input do |i|
101
- i.prev_out Bitcoin::Protocol::Tx.from_hash(tx)
102
- i.prev_out_index output["prev_out"]["n"]
103
- i.signature_key key
104
- end
105
-
106
- # Change address
107
- t.output do |o|
108
- o.value change_amount * 1e8
109
-
110
- o.script do |s|
111
- s.type :address
112
- s.recipient MastercoinWallet.config.address
113
- end
114
- end
115
-
116
- # Receiving address
117
- t.output do |o|
118
- o.value tx_amount * 1e8
119
-
120
- o.script do |s|
121
- s.type :address
122
- s.recipient @address
123
- end
124
- end
125
-
126
- # Exodus address
127
- t.output do |o|
128
- o.value tx_amount * 1e8
129
-
130
- o.script do |s|
131
- s.type :address
132
- s.recipient Mastercoin::EXODUS_ADDRESS
133
- end
134
- end
135
-
136
- # Data address
137
- t.output do |o|
138
- o.value (tx_amount) * 2 * 1e8
139
-
140
- o.script do |s|
141
- s.type :multisig
142
- s.recipient 1, key.pub_uncompressed, data_key
143
- end
144
- end
145
- end
146
-
147
- tx = Bitcoin::Protocol::Tx.new( tx.to_payload )
148
-
149
- MastercoinWallet.log.debug("TX Made: #{tx.to_hash}")
150
-
151
- transaction_hash = tx.to_payload.unpack("H*").first
152
-
153
- MastercoinWallet.log.debug("If you want to send it by Bitcoind use this")
154
- MastercoinWallet.log.debug(transaction_hash)
155
-
156
- remote_transaction = Transaction.new(tx.to_hash["hash"], tx.to_json)
157
- response = remote_transaction.create!
158
- if response.parsed_response.keys.include?("error")
159
- Qt::MessageBox.critical(self, tr("Could not relay transaction"),
160
- tr("The remote server could not transmit your transaction at this moment."))
161
- return
162
- else
163
- Qt::MessageBox.information(self, tr("Transaction send"),
164
- tr("Your transaction has been offered to the relay server, it should show up within 10 minutes."))
165
- end
166
- close()
50
+ data_key = Mastercoin::SimpleSend.new(currency_id: 2, amount: (@amount.to_f * 1e8).to_i).encode_to_compressed_public_key(MastercoinWallet.config.address)
51
+ create_transaction_with_keys(data_key)
52
+ close()
167
53
  end
168
54
 
169
55
  def check_valid
170
- unless Bitcoin::valid_address?(@address)
56
+ unless Bitcoin::valid_address?(@receiving_address)
171
57
  invalid!
172
58
  return
173
59
  end