mastercoin-wallet 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,12 +1,14 @@
1
1
  source "http://rubygems.org"
2
+ gem 'mastercoin-ruby',git: "https://github.com/maran/mastercoin-ruby.git", branch: "develop"
2
3
  gem 'qtbindings'
3
4
  gem 'httparty'
4
5
  gem 'active_support'
5
6
  gem 'bitcoin-ruby', '~> 0.0.1', git: "https://github.com/maran/bitcoin-ruby.git"
6
- gem 'mastercoin-ruby'
7
7
  gem 'ffi'
8
+ gem 'i18n'
8
9
 
9
10
  group :development do
11
+ gem 'releasy', git: "https://github.com/Spooner/releasy.git"
10
12
  gem "bundler", "~> 1.0"
11
- gem "jeweler", "~> 1.8.7"
13
+ gem "jeweler", "~> 1.8.8"
12
14
  end
data/Gemfile.lock CHANGED
@@ -1,9 +1,31 @@
1
+ GIT
2
+ remote: https://github.com/Spooner/releasy.git
3
+ revision: 1386fc1b439de45994919ddad5633b4ad1745817
4
+ specs:
5
+ releasy (0.2.3)
6
+ bundler (>= 1.2.1)
7
+ cri (~> 2.1.0)
8
+ ocra (~> 1.3.0)
9
+ rake (>= 0.9.2.2)
10
+ thor (~> 0.14.6)
11
+
1
12
  GIT
2
13
  remote: https://github.com/maran/bitcoin-ruby.git
3
14
  revision: b9baf584a509e89cca0a9e5dc879f225dd9aa529
4
15
  specs:
5
16
  bitcoin-ruby (0.0.1)
6
17
 
18
+ GIT
19
+ remote: https://github.com/maran/mastercoin-ruby.git
20
+ revision: 07437c33dba284e0e638dbd24245219e93b2462f
21
+ branch: develop
22
+ specs:
23
+ mastercoin-ruby (0.0.4)
24
+ activesupport (>= 3.0.0)
25
+ bitcoin-ruby (~> 0.0.1)
26
+ sequel (~> 4.1.1)
27
+ thor
28
+
7
29
  GEM
8
30
  remote: http://rubygems.org/
9
31
  specs:
@@ -12,9 +34,10 @@ GEM
12
34
  activesupport (3.0.0)
13
35
  addressable (2.3.5)
14
36
  builder (3.2.2)
37
+ cri (2.1.0)
15
38
  faraday (0.8.8)
16
39
  multipart-post (~> 1.2.0)
17
- ffi (1.9.0)
40
+ ffi (1.9.3)
18
41
  git (1.2.6)
19
42
  github_api (0.10.1)
20
43
  addressable
@@ -24,12 +47,13 @@ GEM
24
47
  nokogiri (~> 1.5.2)
25
48
  oauth2
26
49
  hashie (2.0.5)
27
- highline (1.6.19)
28
- httparty (0.11.0)
29
- multi_json (~> 1.0)
50
+ highline (1.6.20)
51
+ httparty (0.12.0)
52
+ json (~> 1.8)
30
53
  multi_xml (>= 0.5.2)
31
54
  httpauth (0.2.0)
32
- jeweler (1.8.7)
55
+ i18n (0.6.5)
56
+ jeweler (1.8.8)
33
57
  builder
34
58
  bundler (~> 1.0)
35
59
  git (>= 1.2.5)
@@ -38,14 +62,10 @@ GEM
38
62
  nokogiri (= 1.5.10)
39
63
  rake
40
64
  rdoc
41
- json (1.8.0)
65
+ json (1.8.1)
42
66
  jwt (0.1.8)
43
67
  multi_json (>= 1.5)
44
- mastercoin-ruby (0.0.2)
45
- bitcoin-ruby (~> 0.0.1)
46
- sequel (~> 4.1.1)
47
- thor
48
- multi_json (1.8.0)
68
+ multi_json (1.8.2)
49
69
  multi_xml (0.5.5)
50
70
  multipart-post (1.2.0)
51
71
  nokogiri (1.5.10)
@@ -56,13 +76,14 @@ GEM
56
76
  multi_json (~> 1.0)
57
77
  multi_xml (~> 0.5)
58
78
  rack (~> 1.2)
79
+ ocra (1.3.1)
59
80
  qtbindings (4.8.3.0)
60
81
  rack (1.5.2)
61
- rake (10.1.0)
82
+ rake (0.9.2.2)
62
83
  rdoc (4.0.1)
63
84
  json (~> 1.4)
64
85
  sequel (4.1.1)
65
- thor (0.18.1)
86
+ thor (0.14.6)
66
87
 
67
88
  PLATFORMS
68
89
  ruby
@@ -73,6 +94,8 @@ DEPENDENCIES
73
94
  bundler (~> 1.0)
74
95
  ffi
75
96
  httparty
76
- jeweler (~> 1.8.7)
77
- mastercoin-ruby
97
+ i18n
98
+ jeweler (~> 1.8.8)
99
+ mastercoin-ruby!
78
100
  qtbindings
101
+ releasy!
data/Makefile CHANGED
@@ -1,11 +1,23 @@
1
- all: lib/mastercoin-wallet/gui/ui_simple_send.rb lib/mastercoin-wallet/gui/ui_first_run.rb lib/mastercoin-wallet/gui/images.rb
1
+ all: lib/mastercoin-wallet/gui/ui_main.rb lib/mastercoin-wallet/gui/ui_bitcoin_offer.rb lib/mastercoin-wallet/gui/ui_purchase_offer.rb lib/mastercoin-wallet/gui/ui_selling_offer.rb lib/mastercoin-wallet/gui/ui_simple_send.rb lib/mastercoin-wallet/gui/ui_first_run.rb lib/mastercoin-wallet/gui/images.rb
2
2
 
3
3
  lib/mastercoin-wallet/gui/ui_simple_send.rb: lib/mastercoin-wallet/gui/simple_send_window.ui
4
4
  rbuic4 lib/mastercoin-wallet/gui/simple_send_window.ui -o lib/mastercoin-wallet/gui/ui_simple_send.rb
5
5
 
6
+ lib/mastercoin-wallet/gui/ui_selling_offer.rb: lib/mastercoin-wallet/gui/selling_offer_window.ui
7
+ rbuic4 lib/mastercoin-wallet/gui/selling_offer_window.ui -o lib/mastercoin-wallet/gui/ui_selling_offer.rb
8
+
9
+ lib/mastercoin-wallet/gui/ui_purchase_offer.rb: lib/mastercoin-wallet/gui/purchase_offer_window.ui
10
+ rbuic4 lib/mastercoin-wallet/gui/purchase_offer_window.ui -o lib/mastercoin-wallet/gui/ui_purchase_offer.rb
11
+
12
+ lib/mastercoin-wallet/gui/ui_bitcoin_offer.rb: lib/mastercoin-wallet/gui/bitcoin_offer_window.ui
13
+ rbuic4 lib/mastercoin-wallet/gui/bitcoin_offer_window.ui -o lib/mastercoin-wallet/gui/ui_bitcoin_offer.rb
14
+
6
15
  lib/mastercoin-wallet/gui/ui_first_run.rb: lib/mastercoin-wallet/gui/first_run_window.ui
7
16
  rbuic4 first_run_window.ui -o ui_first_run.rb
8
17
 
18
+ lib/mastercoin-wallet/gui/ui_main.rb: lib/mastercoin-wallet/gui/main_window.ui
19
+ rbuic4 lib/mastercoin-wallet/gui/main_window.ui -o lib/mastercoin-wallet/gui/ui_main.rb
20
+
9
21
  lib/mastercoin-wallet/gui/images.rb: resources/images.qrc
10
22
  rbrcc -name images resources/images.qrc -o lib/mastercoin-wallet/gui/images.rb
11
23
 
data/README.rdoc CHANGED
@@ -7,6 +7,8 @@ Mastercoin wallet implementation in Ruby using QT bindings.
7
7
  * Rubygems
8
8
  * QT 4
9
9
 
10
+ Check your ruby version using ruby -v. If the version is lower then 1.9.2 or not installed yet, install {rvm}[http://rvm.io/] and ruby 1.9.3.
11
+
10
12
  Dependencies will differ based on your operating system.
11
13
 
12
14
  === OS X
@@ -14,9 +16,12 @@ Install {homebrew}[http://brew.sh/] if you haven't got it yet.
14
16
 
15
17
  * brew install qt
16
18
 
17
- Check your ruby version using ruby -v. If the version is lower then 1.9.2 install {rvm}[http://rvm.io/] and ruby 1.9.3.
19
+ === Debian/Ubuntu
20
+ These instructions might not be complete. Additional instructions welcome.
21
+
22
+ * apt-get install libqt4-gui libqt4-dev cake
18
23
 
19
- == Installation ==
24
+ == Installation
20
25
  Once the depencies are installed you can just do gem install mastercoin-wallet to install the wallet. Start it by issuing mastercoin-wallet from a terminal.
21
26
 
22
27
  == First run configuration
data/Rakefile CHANGED
@@ -34,3 +34,22 @@ Rake::RDocTask.new do |rdoc|
34
34
  rdoc.rdoc_files.include('README*')
35
35
  rdoc.rdoc_files.include('lib/**/*.rb')
36
36
  end
37
+
38
+ require 'releasy'
39
+ Releasy::Project.new do
40
+ name "Mastercoin Wallet"
41
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
42
+ verbose # Can be removed if you don't want to see all build messages.
43
+ executable "bin/mastercoin-wallet"
44
+ files ["lib/**/*.*", "bin/*.*", "resources/*.*"]
45
+
46
+ exclude_encoding
47
+ # Create a variety of releases, for all platforms.
48
+ add_build :osx_app do
49
+ url "com.maran.mastercoin_wallet"
50
+ wrapper "../wrappers/gosu-mac-wrapper-0.7.47.tar.gz"
51
+ icon "resources/logo.icns"
52
+ end
53
+
54
+ add_deploy :local # Only deploy locally.
55
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
@@ -8,7 +8,7 @@ app.setWindowIcon(Qt::Icon.new(":/logo.svg"))
8
8
 
9
9
  if MastercoinWallet.config.has_key?(:private_key)
10
10
  dialog = MastercoinWallet::MainWindow.new
11
- dialog.setMinimumSize(570, 300)
11
+ dialog.setMinimumSize(746,469)
12
12
  dialog.exec
13
13
  else
14
14
  dialog = MastercoinWallet::FirstRunWindow.new
@@ -0,0 +1,254 @@
1
+ module MastercoinWallet
2
+ module Builder
3
+ attr_accessor :fee, :tx_amount, :mastercoin_tx, :btc_amount
4
+
5
+ def set_fee(force_fee = nil)
6
+ self.fee = force_fee || BigDecimal.new("0.0001")
7
+
8
+ if self.fee < 0.0001
9
+ self.fee = BigDecimal.new("0.0001")
10
+ end
11
+
12
+ self.tx_amount = BigDecimal.new("0.00006")
13
+ if @receiving_address
14
+ output_counter = 4
15
+ else
16
+ output_counter = 3
17
+ end
18
+ self.mastercoin_tx = (output_counter * tx_amount)
19
+ end
20
+
21
+ def create_bitcoin_transaction_for(amount)
22
+ self.btc_amount = BigDecimal.new(amount)
23
+ self.fee = BigDecimal.new("0.0001")
24
+ self.tx_amount = BigDecimal.new("0.00006")
25
+
26
+ # TODO REFACTOR AND DRY IT
27
+ valid_output = MastercoinWallet.config.spendable_outputs.find{|x| BigDecimal.new(x[:value]) > (self.fee + self.tx_amount + self.btc_amount)}
28
+
29
+ if valid_output.is_a?(Array)
30
+ ouput = valid_output[0]
31
+ else
32
+ output = valid_output
33
+ end
34
+
35
+ unless output
36
+ Qt::MessageBox.critical(self, tr("Could not send transaction"),
37
+ 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."))
38
+ return
39
+ end
40
+
41
+ change_amount = BigDecimal.new(output["value"]) - self.fee - self.btc_amount - self.tx_amount
42
+
43
+ tx = MastercoinWallet.config.bitcoin_transactions.find{|x| x["hash"] == output["prev_out"]["hash"]}
44
+ if tx.is_a?(Array)
45
+ tx = tx[0]
46
+ end
47
+
48
+ # DRY THIS AS WELL SHOULD BE IS OWN METHOD
49
+ begin
50
+ priv_key = MastercoinWallet.config.get_encrypted_key(:private_key, @password)
51
+ rescue ArgumentError
52
+ Qt::MessageBox.information(self, tr("Could not send payment."),
53
+ tr("Could not send payment, wrong password."))
54
+ return
55
+ end
56
+ begin
57
+ key = Bitcoin::Key.from_base58(priv_key)
58
+ rescue ArgumentError
59
+ begin
60
+ key = Bitcoin::Key.new(priv_key)
61
+ rescue ArgumentError, OpenSSL::BNError
62
+ Qt::MessageBox.information(self, tr("Could not send payment."),
63
+ tr("Could not send payment, wrong password."))
64
+ return
65
+ end
66
+ end
67
+
68
+ tx = build_tx do |t|
69
+ t.input do |i|
70
+ i.prev_out Bitcoin::Protocol::Tx.from_hash(tx)
71
+ i.prev_out_index output["prev_out"]["n"]
72
+ i.signature_key key
73
+ end
74
+
75
+ # Change address
76
+ t.output do |o|
77
+ o.value change_amount * 1e8
78
+
79
+ o.script do |s|
80
+ s.type :address
81
+ s.recipient MastercoinWallet.config.address
82
+ end
83
+ end
84
+
85
+ # Receiving address
86
+ t.output do |o|
87
+ o.value self.btc_amount * 1e8
88
+
89
+ o.script do |s|
90
+ s.type :address
91
+ s.recipient @receiving_address
92
+ end
93
+ end
94
+
95
+ # Exodus address
96
+ t.output do |o|
97
+ o.value self.tx_amount * 1e8
98
+
99
+ o.script do |s|
100
+ s.type :address
101
+ s.recipient Mastercoin::EXODUS_ADDRESS
102
+ end
103
+ end
104
+ end
105
+
106
+ tx = Bitcoin::Protocol::Tx.new( tx.to_payload )
107
+
108
+ MastercoinWallet.log.debug("TX Made: #{tx.to_hash}")
109
+
110
+ transaction_hash = tx.to_payload.unpack("H*").first
111
+
112
+ MastercoinWallet.log.debug("If you want to send it by Bitcoind use this")
113
+ MastercoinWallet.log.debug(transaction_hash)
114
+ MastercoinWallet.log.debug("Required fee: #{tx.calculate_minimum_fee} - Multisig size: #{tx.outputs.last.script.bytesize}")
115
+
116
+ remote_transaction = Transaction.new(tx.to_hash["hash"], tx.to_json)
117
+ response = remote_transaction.create!
118
+ if response.parsed_response.keys.include?("error")
119
+ Qt::MessageBox.critical(self, tr("Could not relay transaction"),
120
+ tr("The remote server could not transmit your transaction at this moment. #{response.parsed_response}"))
121
+ return
122
+ else
123
+ Qt::MessageBox.information(self, tr("Transaction send"),
124
+ tr("Your transaction with hash #{tx.to_hash["hash"]} has been offered to the relay server, it should show up within 10 minutes."))
125
+ end
126
+ end
127
+
128
+ def create_transaction_with_keys(data_keys, options = {})
129
+ public_keys = []
130
+ public_keys << data_keys
131
+ public_keys.flatten!
132
+
133
+ if options.has_key?(:force_fee)
134
+ self.set_fee(BigDecimal.new(options[:force_fee]))
135
+ else
136
+ self.set_fee
137
+ end
138
+
139
+ valid_output = MastercoinWallet.config.spendable_outputs.find{|x| BigDecimal.new(x[:value]) > (self.fee + self.mastercoin_tx)}
140
+
141
+ if valid_output.is_a?(Array)
142
+ ouput = valid_output[0]
143
+ else
144
+ output = valid_output
145
+ end
146
+
147
+ unless output
148
+ Qt::MessageBox.critical(self, tr("Could not send transaction"),
149
+ 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."))
150
+ return
151
+ end
152
+
153
+ change_amount = BigDecimal.new(output["value"]) - fee - mastercoin_tx
154
+
155
+ tx = MastercoinWallet.config.bitcoin_transactions.find{|x| x["hash"] == output["prev_out"]["hash"]}
156
+ if tx.is_a?(Array)
157
+ tx = tx[0]
158
+ end
159
+
160
+ begin
161
+ priv_key = MastercoinWallet.config.get_encrypted_key(:private_key, @password)
162
+ rescue ArgumentError
163
+ Qt::MessageBox.information(self, tr("Could not send payment."),
164
+ tr("Could not send payment, wrong password."))
165
+ return
166
+ end
167
+ begin
168
+ key = Bitcoin::Key.from_base58(priv_key)
169
+ rescue ArgumentError
170
+ begin
171
+ key = Bitcoin::Key.new(priv_key)
172
+ rescue ArgumentError, OpenSSL::BNError
173
+ Qt::MessageBox.information(self, tr("Could not send payment."),
174
+ tr("Could not send payment, wrong password."))
175
+ return
176
+ end
177
+ end
178
+ public_keys.insert(0, key.pub_compressed)
179
+
180
+
181
+ tx = build_tx do |t|
182
+ t.input do |i|
183
+ i.prev_out Bitcoin::Protocol::Tx.from_hash(tx)
184
+ i.prev_out_index output["prev_out"]["n"]
185
+ i.signature_key key
186
+ end
187
+
188
+ # Change address
189
+ t.output do |o|
190
+ o.value change_amount * 1e8
191
+
192
+ o.script do |s|
193
+ s.type :address
194
+ s.recipient MastercoinWallet.config.address
195
+ end
196
+ end
197
+
198
+ if @receiving_address
199
+ # Receiving address
200
+ t.output do |o|
201
+ o.value tx_amount * 1e8
202
+
203
+ o.script do |s|
204
+ s.type :address
205
+ s.recipient @receiving_address
206
+ end
207
+ end
208
+ end
209
+
210
+ # Exodus address
211
+ t.output do |o|
212
+ o.value tx_amount * 1e8
213
+
214
+ o.script do |s|
215
+ s.type :address
216
+ s.recipient Mastercoin::EXODUS_ADDRESS
217
+ end
218
+ end
219
+
220
+ # Data address
221
+ t.output do |o|
222
+ o.value (tx_amount) * 1e8 * 2
223
+
224
+ o.script do |s|
225
+ s.type :multisig
226
+ s.recipient 1, *public_keys
227
+ end
228
+ end
229
+ end
230
+
231
+ tx = Bitcoin::Protocol::Tx.new( tx.to_payload )
232
+
233
+ MastercoinWallet.log.debug("TX Made: #{tx.to_hash}")
234
+
235
+ transaction_hash = tx.to_payload.unpack("H*").first
236
+
237
+ MastercoinWallet.log.debug("If you want to send it by Bitcoind use this")
238
+ MastercoinWallet.log.debug(transaction_hash)
239
+ MastercoinWallet.log.debug("Required fee: #{tx.calculate_minimum_fee} - Multisig size: #{tx.outputs.last.script.bytesize}")
240
+
241
+ remote_transaction = Transaction.new(tx.to_hash["hash"], tx.to_json)
242
+ response = remote_transaction.create!
243
+ if response.parsed_response.keys.include?("error")
244
+ Qt::MessageBox.critical(self, tr("Could not relay transaction"),
245
+ tr("The remote server could not transmit your transaction at this moment. #{response.parsed_response}"))
246
+ return
247
+ else
248
+ Qt::MessageBox.information(self, tr("Transaction send"),
249
+ tr("Your transaction with hash #{tx.to_hash["hash"]} has been offered to the relay server, it should show up within 10 minutes."))
250
+ end
251
+ end
252
+
253
+ end
254
+ end