btcruby 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@ require_relative 'spec_helper'
2
2
  describe BTC::TransactionBuilder do
3
3
 
4
4
  class SignerByKey
5
- include TransactionBuilder::Signer
5
+ include BTC::TransactionBuilder::Signer
6
6
  def initialize(&block)
7
7
  @block = block
8
8
  end
@@ -12,7 +12,7 @@ describe BTC::TransactionBuilder do
12
12
  end
13
13
 
14
14
  class SignerBySignatureScript
15
- include TransactionBuilder::Signer
15
+ include BTC::TransactionBuilder::Signer
16
16
  def initialize(&block)
17
17
  @block = block
18
18
  end
@@ -23,17 +23,17 @@ describe BTC::TransactionBuilder do
23
23
 
24
24
  describe "TransactionBuilder with no outputs" do
25
25
  before do
26
- @builder = TransactionBuilder.new
26
+ @builder = BTC::TransactionBuilder.new
27
27
  @all_utxos = self.mock_utxos
28
28
 
29
29
  @builder.input_addresses = self.mock_addresses
30
- @builder.provider = TransactionBuilder::Provider.new do |txb|
30
+ @builder.provider = BTC::TransactionBuilder::Provider.new do |txb|
31
31
  addrs = txb.public_addresses
32
32
  addrs.must_equal self.mock_addresses
33
33
  scripts = addrs.map{|a| a.script }.uniq
34
34
  @all_utxos.find_all{|utxo| scripts.include?(utxo.script) }
35
35
  end
36
- @builder.change_address = Address.parse("1CBtcGivXmHQ8ZqdPgeMfcpQNJrqTrSAcG")
36
+ @builder.change_address = BTC::Address.parse("1CBtcGivXmHQ8ZqdPgeMfcpQNJrqTrSAcG")
37
37
  end
38
38
 
39
39
  it "should fill unspent_outputs using Provider" do
@@ -41,12 +41,12 @@ describe BTC::TransactionBuilder do
41
41
  end
42
42
 
43
43
  it "should have a default fee rate" do
44
- @builder.fee_rate.must_equal Transaction::DEFAULT_FEE_RATE
44
+ @builder.fee_rate.must_equal BTC::Transaction::DEFAULT_FEE_RATE
45
45
  end
46
46
 
47
47
  it "should return a result" do
48
48
  result = @builder.build
49
- result.class.must_equal TransactionBuilder::Result
49
+ result.class.must_equal BTC::TransactionBuilder::Result
50
50
  end
51
51
 
52
52
  it "should compose a fully-spending transaction when no outputs are given" do
@@ -64,7 +64,7 @@ describe BTC::TransactionBuilder do
64
64
  it "should have a reasonable fee" do
65
65
  result = @builder.build
66
66
  size = result.transaction.data.bytesize # size of unsigned transaction
67
- result.fee.must_be :>=, (size / 1000)*Transaction::DEFAULT_FEE_RATE
67
+ result.fee.must_be :>=, (size / 1000)*BTC::Transaction::DEFAULT_FEE_RATE
68
68
  result.fee.must_be :<, 0.01 * BTC::COIN
69
69
  end
70
70
 
@@ -111,7 +111,7 @@ describe BTC::TransactionBuilder do
111
111
 
112
112
  it "should sign if signer provides a signature script" do
113
113
  @builder.signer = SignerBySignatureScript.new do |txin, txout|
114
- Script.new << "signature" << "pubkey"
114
+ BTC::Script.new << "signature" << "pubkey"
115
115
  end
116
116
  result = @builder.build
117
117
  result.unsigned_input_indexes.must_equal []
@@ -126,7 +126,7 @@ describe BTC::TransactionBuilder do
126
126
  it "should include all prepended unspents AND all normal unspents" do
127
127
  @builder.prepended_unspent_outputs = [ BTC::TransactionOutput.new(
128
128
  value: 6_666_666,
129
- script: Address.parse("3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX").script,
129
+ script: BTC::Address.parse("3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX").script,
130
130
  index: 0,
131
131
  transaction_hash: "some mock tx".hash256
132
132
  ) ]
@@ -141,18 +141,18 @@ describe BTC::TransactionBuilder do
141
141
 
142
142
  describe "TransactionBuilder with some outputs" do
143
143
  before do
144
- @builder = TransactionBuilder.new
144
+ @builder = BTC::TransactionBuilder.new
145
145
  @all_utxos = self.mock_utxos
146
146
  @builder.input_addresses = self.mock_addresses
147
- @builder.provider = TransactionBuilder::Provider.new do |txb|
147
+ @builder.provider = BTC::TransactionBuilder::Provider.new do |txb|
148
148
  addrs = txb.public_addresses
149
149
  addrs.must_equal self.mock_addresses
150
150
  scripts = addrs.map{|a| a.script }.uniq
151
151
  @all_utxos.find_all{|utxo| scripts.include?(utxo.script) }
152
152
  end
153
- @builder.change_address = Address.parse("1CBtcGivXmHQ8ZqdPgeMfcpQNJrqTrSAcG")
154
- @builder.outputs = [ TransactionOutput.new(value: 1000_500,
155
- script: Address.parse("1TipsuQ7CSqfQsjA9KU5jarSB1AnrVLLo").script) ]
153
+ @builder.change_address = BTC::Address.parse("1CBtcGivXmHQ8ZqdPgeMfcpQNJrqTrSAcG")
154
+ @builder.outputs = [ BTC::TransactionOutput.new(value: 1000_500,
155
+ script: BTC::Address.parse("1TipsuQ7CSqfQsjA9KU5jarSB1AnrVLLo").script) ]
156
156
  end
157
157
 
158
158
  it "should fill unspent_outputs using provider" do
@@ -160,7 +160,7 @@ describe BTC::TransactionBuilder do
160
160
  end
161
161
 
162
162
  it "should have a default fee rate" do
163
- @builder.fee_rate.must_equal Transaction::DEFAULT_FEE_RATE
163
+ @builder.fee_rate.must_equal BTC::Transaction::DEFAULT_FEE_RATE
164
164
  end
165
165
 
166
166
  it "should compose a minimal transaction to pay necessary amount" do
@@ -186,7 +186,7 @@ describe BTC::TransactionBuilder do
186
186
  it "should have a reasonable fee" do
187
187
  result = @builder.build
188
188
  size = result.transaction.data.bytesize # size of unsigned transaction
189
- result.fee.must_be :>=, (size / 1000)*Transaction::DEFAULT_FEE_RATE
189
+ result.fee.must_be :>=, (size / 1000)*BTC::Transaction::DEFAULT_FEE_RATE
190
190
  result.fee.must_be :<, 0.01 * BTC::COIN
191
191
  end
192
192
 
@@ -219,7 +219,7 @@ describe BTC::TransactionBuilder do
219
219
  it "should include all prepended unspents and none of normal unspents if amount is covered" do
220
220
  @builder.prepended_unspent_outputs = [ BTC::TransactionOutput.new(
221
221
  value: 6_666_666,
222
- script: Address.parse("3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX").script,
222
+ script: BTC::Address.parse("3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX").script,
223
223
  index: 0,
224
224
  transaction_hash: "some mock tx".hash256
225
225
  ) ]
@@ -231,7 +231,7 @@ describe BTC::TransactionBuilder do
231
231
  it "should include all prepended unspents and just enough of normal unspents" do
232
232
  @builder.prepended_unspent_outputs = [ BTC::TransactionOutput.new(
233
233
  value: @builder.outputs.first.value - (self.mock_utxos.first.value / 2),
234
- script: Address.parse("3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX").script,
234
+ script: BTC::Address.parse("3EktnHQD7RiAE6uzMj2ZifT9YgRrkSgzQX").script,
235
235
  index: 0,
236
236
  transaction_hash: "some mock tx".hash256
237
237
  ) ]
@@ -243,54 +243,54 @@ describe BTC::TransactionBuilder do
243
243
 
244
244
  describe "TransactionBuilder edge cases" do
245
245
  before do
246
- @builder = TransactionBuilder.new
246
+ @builder = BTC::TransactionBuilder.new
247
247
  @all_utxos = self.mock_utxos
248
248
  @builder.input_addresses = self.mock_addresses
249
- @builder.provider = TransactionBuilder::Provider.new do |txb|
249
+ @builder.provider = BTC::TransactionBuilder::Provider.new do |txb|
250
250
  addrs = txb.public_addresses
251
251
  addrs.must_equal self.mock_addresses
252
252
  scripts = addrs.map{|a| a.script }.uniq
253
253
  @all_utxos.find_all{|utxo| scripts.include?(utxo.script) }
254
254
  end
255
- @builder.change_address = Address.parse("1CBtcGivXmHQ8ZqdPgeMfcpQNJrqTrSAcG")
255
+ @builder.change_address = BTC::Address.parse("1CBtcGivXmHQ8ZqdPgeMfcpQNJrqTrSAcG")
256
256
  end
257
257
 
258
258
  it "should detect missing change address" do
259
259
  @builder.change_address = nil
260
260
  lambda do
261
261
  result = @builder.build
262
- end.must_raise TransactionBuilder::MissingChangeAddressError
262
+ end.must_raise BTC::TransactionBuilder::MissingChangeAddressError
263
263
  end
264
264
 
265
265
  it "should detect missing unspents" do
266
266
  @builder.provider = nil
267
267
  lambda do
268
268
  result = @builder.build
269
- end.must_raise TransactionBuilder::MissingUnspentOutputsError
269
+ end.must_raise BTC::TransactionBuilder::MissingUnspentOutputsError
270
270
  end
271
271
 
272
272
  it "should detect missing unspents" do
273
273
  @builder.unspent_outputs = [ ]
274
274
  lambda do
275
275
  result = @builder.build
276
- end.must_raise TransactionBuilder::MissingUnspentOutputsError
276
+ end.must_raise BTC::TransactionBuilder::MissingUnspentOutputsError
277
277
  end
278
278
 
279
279
  it "should detect not enough unspents" do
280
- @builder.outputs = [ TransactionOutput.new(value: 100*COIN, script: @builder.change_address.script) ]
280
+ @builder.outputs = [ BTC::TransactionOutput.new(value: 100*BTC::COIN, script: @builder.change_address.script) ]
281
281
  lambda do
282
282
  result = @builder.build
283
- end.must_raise TransactionBuilder::InsufficientFundsError
283
+ end.must_raise BTC::TransactionBuilder::InsufficientFundsError
284
284
  end
285
285
 
286
286
  it "should detect not enough unspents because of change constraints" do
287
287
  @builder.dust_change = 0 # no coins are allowed to be lost
288
288
  @builder.minimum_change = 10000
289
289
  @builder.unspent_outputs = mock_utxos[0, 1]
290
- @builder.outputs = [ TransactionOutput.new(value: 1000_00 - @builder.fee_rate - 10, script: @builder.change_address.script) ]
290
+ @builder.outputs = [ BTC::TransactionOutput.new(value: 1000_00 - @builder.fee_rate - 10, script: @builder.change_address.script) ]
291
291
  lambda do
292
292
  result = @builder.build
293
- end.must_raise TransactionBuilder::InsufficientFundsError
293
+ end.must_raise BTC::TransactionBuilder::InsufficientFundsError
294
294
  end
295
295
 
296
296
  it "should forgo change if it's below dust level" do
@@ -299,7 +299,7 @@ describe BTC::TransactionBuilder do
299
299
  @builder.unspent_outputs = mock_utxos[0, 1]
300
300
  assumed_fee = 2590 #@builder.fee_rate # we assume we'll have sub-1K transaction
301
301
  amount = 1000_00 - assumed_fee - @builder.dust_change
302
- @builder.outputs = [ TransactionOutput.new(value: amount, script: @builder.change_address.script) ]
302
+ @builder.outputs = [ BTC::TransactionOutput.new(value: amount, script: @builder.change_address.script) ]
303
303
 
304
304
  result = @builder.build
305
305
  result.fee.must_equal assumed_fee
@@ -312,8 +312,8 @@ describe BTC::TransactionBuilder do
312
312
 
313
313
  def mock_keys
314
314
  @mock_keys ||= [
315
- Key.new(private_key: "Wallet1".sha256),
316
- Key.new(private_key: "Wallet2".sha256)
315
+ BTC::Key.new(private_key: "Wallet1".sha256),
316
+ BTC::Key.new(private_key: "Wallet2".sha256)
317
317
  ]
318
318
  end
319
319
 
@@ -328,7 +328,7 @@ describe BTC::TransactionBuilder do
328
328
  def mock_utxos
329
329
  scripts = mock_addresses.map{|a| a.script }
330
330
  (0...32).map do |i|
331
- TransactionOutput.new(value: 100_000,
331
+ BTC::TransactionOutput.new(value: 100_000,
332
332
  script: scripts[i % scripts.size],
333
333
  transaction_hash: ((16+i).to_s(16)*32).from_hex,
334
334
  index: i)
@@ -49,17 +49,17 @@ describe BTC::Transaction do
49
49
  raise "Bad test: input is an array of 3 items: #{test.inspect}" if input.size != 3
50
50
  previd, previndex, scriptstring = input
51
51
 
52
- outpoint = Outpoint.new(transaction_id: previd, index: previndex)
52
+ outpoint = BTC::Outpoint.new(transaction_id: previd, index: previndex)
53
53
 
54
54
  mapprevOutScriptPubKeys[outpoint] = parse_script(scriptstring)
55
55
  end
56
56
 
57
- tx = Transaction.new(hex: test[1])
57
+ tx = BTC::Transaction.new(hex: test[1])
58
58
  flags = parse_flags(test[2])
59
59
 
60
60
  if debug_filter(test)
61
61
  validation_proc = lambda do
62
- validation_passed = Validation.new.check_transaction(tx, ValidationState.new)
62
+ validation_passed = BTC::Validation.new.check_transaction(tx, BTC::ValidationState.new)
63
63
  if expected_result
64
64
  validation_passed.must_equal expected_result
65
65
  end
@@ -71,14 +71,14 @@ describe BTC::Transaction do
71
71
  raise "Bad test: output script not found: #{test.inspect}" if !output_script
72
72
  sig_script = txin.signature_script
73
73
  if !sig_script
74
- sig_script = Script.new(data: txin.coinbase_data)
74
+ sig_script = BTC::Script.new(data: txin.coinbase_data)
75
75
  end
76
76
 
77
- checker = TransactionSignatureChecker.new(transaction: tx, input_index: txin.index)
77
+ checker = BTC::TransactionSignatureChecker.new(transaction: tx, input_index: txin.index)
78
78
  plugins = []
79
- plugins << P2SHPlugin.new if (flags & ScriptFlags::SCRIPT_VERIFY_P2SH) != 0
80
- plugins << CLTVPlugin.new if (flags & ScriptFlags::SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY) != 0
81
- interpreter = ScriptInterpreter.new(
79
+ plugins << BTC::P2SHPlugin.new if (flags & BTC::ScriptFlags::SCRIPT_VERIFY_P2SH) != 0
80
+ plugins << BTC::CLTVPlugin.new if (flags & BTC::ScriptFlags::SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY) != 0
81
+ interpreter = BTC::ScriptInterpreter.new(
82
82
  flags: flags,
83
83
  plugins: plugins,
84
84
  signature_checker: checker,
@@ -190,7 +190,7 @@ describe BTC::Transaction do
190
190
  end
191
191
 
192
192
  it "should convert hash to/from id for TransactionOutput" do
193
- txout = TransactionOutput.new
193
+ txout = BTC::TransactionOutput.new
194
194
  txout.transaction_hash = @txhash
195
195
  txout.transaction_id.must_equal @txid
196
196
  txout.transaction_id = "deadbeef"
@@ -201,11 +201,11 @@ describe BTC::Transaction do
201
201
 
202
202
  describe "Amounts calculation" do
203
203
  before do
204
- @tx = Transaction.new
205
- @tx.add_input(TransactionInput.new)
206
- @tx.add_input(TransactionInput.new)
207
- @tx.add_output(TransactionOutput.new(value: 123))
208
- @tx.add_output(TransactionOutput.new(value: 50_000))
204
+ @tx = BTC::Transaction.new
205
+ @tx.add_input(BTC::TransactionInput.new)
206
+ @tx.add_input(BTC::TransactionInput.new)
207
+ @tx.add_output(BTC::TransactionOutput.new(value: 123))
208
+ @tx.add_output(BTC::TransactionOutput.new(value: 50_000))
209
209
  end
210
210
 
211
211
  it "should have good defaults" do
@@ -257,8 +257,8 @@ describe BTC::Transaction do
257
257
  "2ac0ba2afa7ada4660bd38e27585aac7d4e6e435ffffffff02c0791817000000" +
258
258
  "0017a914bd224370f93a2b0435ded92c7f609e71992008fc87ac7b4d1d000000" +
259
259
  "001976a914450c22770eebb00d376edabe7bb548aa64aa235688ac00000000").from_hex
260
- @tx = Transaction.new(hex: @txdata.to_hex)
261
- @tx = Transaction.new(data: @txdata)
260
+ @tx = BTC::Transaction.new(hex: @txdata.to_hex)
261
+ @tx = BTC::Transaction.new(data: @txdata)
262
262
  end
263
263
 
264
264
  it "should decode inputs and outputs correctly" do
@@ -291,7 +291,7 @@ describe BTC::Transaction do
291
291
  "043304596050ca119efccada1dd7ca8e511a76d8e1ddb7ad050298d208455b8bcd09593d823ca252355bf0b41c2ac0ba2afa7ada4660bd38e27585aac7d4e6e435"
292
292
  ]
293
293
 
294
- Diagnostics.current.trace do
294
+ BTC::Diagnostics.current.trace do
295
295
  BTC::Key.validate_script_signature(@tx.inputs.first.signature_script.to_a[0], verify_lower_s: true).must_equal true
296
296
  end
297
297
  end
@@ -304,7 +304,7 @@ describe BTC::Transaction do
304
304
  "0000000000ffffffff130301e6040654188d181202119700de00000fccffffff" +
305
305
  "ff0108230595000000001976a914ca6ecc7d4d671d8c5c964a48dbb0bc194407" +
306
306
  "a30688ac00000000").from_hex
307
- @tx = Transaction.new(data: @txdata)
307
+ @tx = BTC::Transaction.new(data: @txdata)
308
308
  end
309
309
 
310
310
  it "should encode coinbase inputs correctly" do
@@ -299,16 +299,16 @@ describe BTC::WireFormat do
299
299
  it "should encode/decode varint-prefixed arrays" do
300
300
 
301
301
  txs = [
302
- Transaction.new,
303
- Transaction.new(inputs:[TransactionInput.new]),
304
- Transaction.new(outputs:[TransactionOutput.new])
302
+ BTC::Transaction.new,
303
+ BTC::Transaction.new(inputs:[BTC::TransactionInput.new]),
304
+ BTC::Transaction.new(outputs:[BTC::TransactionOutput.new])
305
305
  ]
306
- data = WireFormat.encode_array(txs) {|t|t.data}
306
+ data = BTC::WireFormat.encode_array(txs) {|t|t.data}
307
307
  data.bytes[0].must_equal txs.size
308
308
  data.must_equal txs.inject("\x03".b){|d,t| d+t.data}
309
309
 
310
310
  stream = StringIO.new(data)
311
- txs2 = WireFormat.read_array(stream: stream){ Transaction.new(stream: stream) }
311
+ txs2 = BTC::WireFormat.read_array(stream: stream){ BTC::Transaction.new(stream: stream) }
312
312
  txs2[0].data.must_equal txs[0].data
313
313
  txs2[1].data.must_equal txs[1].data
314
314
  txs2[2].data.must_equal txs[2].data
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: btcruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleg Andreev
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-08-18 00:00:00.000000000 Z
12
+ date: 2015-08-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi