btcruby 1.1.5 → 1.1.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a64dd3f298bb55c7d1bc660b6318771030fa6e6f
4
- data.tar.gz: 6f9d6e72597bc798b2f025c3003d093f972a50ff
3
+ metadata.gz: e73f94175000adb419e6113bafc872a4ed2085fe
4
+ data.tar.gz: d77e81499ba58dcfbb3b46e3be208fc5680d60a4
5
5
  SHA512:
6
- metadata.gz: 38c83c30020fdc804fcd467bf20bd241709924c7b7708e8da72202c23717e9cb59b54c9916e6d5a09902b067107ebd8d4c14fa26b854495e4f1ac34693eb8ac7
7
- data.tar.gz: 7cbd2dc8332ae5e4756d813b207f592d541ff1d878b512bb902853b9b8fb6d626f28505cd1aea90f54706871544fcde1c45c9d1ccd81927aa85f2ff39e18e9ec
6
+ metadata.gz: 29ef9077eae00c04723693c7ca5ce068010f8f1c419344e89c6ca7272de4c4cc46c4ab3cd483104a8857ba131e8ecfbfcba99dff4060a2cda43471b762aecabf
7
+ data.tar.gz: 0bb1d1e596806f3700cdcb2869440d3432be01b95b19d8eddf86771785f5e605ea9a0160559287ccc1d10d2f8b58992a7ec9da78e5cfa9d2ca6d0ebfca88a68c
data/RELEASE_NOTES.md CHANGED
@@ -2,6 +2,13 @@
2
2
  BTCRuby Release Notes
3
3
  =====================
4
4
 
5
+ 1.1.6 (August 26, 2015)
6
+ -----------------------
7
+
8
+ * Re-defined Issuance ID to not include amount. Now it is defined purely by an outpoint.
9
+ * Fixed namespace issue with `BTC::ScriptError`.
10
+
11
+
5
12
  1.1.5 (August 20, 2015)
6
13
  -----------------------
7
14
 
@@ -13,11 +13,9 @@ module BTC
13
13
  125 # 's' prefix
14
14
  end
15
15
 
16
- def initialize(string: nil, hash: nil, network: nil, outpoint: nil, amount: nil, _raw_data: nil)
17
- if outpoint || amount
18
- raise ArgumentError, "Outpoint is missing" if !outpoint
19
- raise ArgumentError, "Amount is missing" if !amount || amount < 0
20
- data = outpoint.transaction_hash + WireFormat.encode_uint32be(outpoint.index) + WireFormat.encode_uint64le(amount)
16
+ def initialize(string: nil, hash: nil, network: nil, outpoint: nil, _raw_data: nil)
17
+ if outpoint
18
+ data = outpoint.transaction_hash + WireFormat.encode_uint32be(outpoint.index)
21
19
  super(hash: BTC.hash160(data), network: network)
22
20
  else
23
21
  super(string: string, hash: hash, network: network, _raw_data: _raw_data)
@@ -48,6 +48,7 @@ module BTC
48
48
  include ScriptErrors
49
49
 
50
50
  class ScriptError
51
+ include ScriptErrors
51
52
  attr_reader :code
52
53
  attr_reader :message
53
54
  attr_reader :description
@@ -145,110 +145,3 @@ module BTC
145
145
 
146
146
  end
147
147
  end
148
-
149
- if $0 == __FILE__
150
- require 'btcruby'
151
-
152
- include BTC
153
- def run_tests
154
-
155
- # Decoding
156
-
157
- [-1000000000000000,-10000,-100,-1,0,1,10,1000,100000000000000].each do |i|
158
- should_equal(ScriptNumber.new(integer: i).to_i, i, "Must return integer as-is.")
159
- end
160
-
161
- should_equal(ScriptNumber.new(data: "").to_i, 0, "Must parse empty string as zero.")
162
- should_equal(ScriptNumber.new(data: "\x01").to_i, 1, "Must parse 0x01 as 1.")
163
- should_equal(ScriptNumber.new(data: "\xff").to_i, -127, "Must parse 0xff as -127.")
164
- should_equal(ScriptNumber.new(data: "\xff\x00").to_i, 255, "Must parse 0xff00 as 255.")
165
- should_equal(ScriptNumber.new(data: "\x81").to_i, -1, "Must parse 0x81 as -1.")
166
- should_equal(ScriptNumber.new(data: "\x8f").to_i, -15, "Must parse 0x8f as -0x0f.")
167
- should_equal(ScriptNumber.new(data: "\x00\x81").to_i, -256, "Must parse 0x0081 as -256.")
168
- should_equal(ScriptNumber.new(data: "\xff\x80").to_i, -255, "Must decode -255.")
169
-
170
- should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x00") }
171
- should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x80") }
172
- should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x00\x80") }
173
- should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x01\x80") }
174
- should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x00\x00\x80") }
175
- should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x00\x10\x80") }
176
- should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x10\x00\x80") }
177
- should_raise('script number overflow (3 > 2)') { ScriptNumber.new(data: "\x00\x00\x80", max_size: 2) }
178
-
179
- # Encoding
180
-
181
- should_equal(ScriptNumber.new(integer: 0).to_hex, "")
182
- should_equal(ScriptNumber.new(integer: 1).to_hex, "01")
183
- should_equal(ScriptNumber.new(integer: -1).to_hex, "81")
184
- should_equal(ScriptNumber.new(integer: 255).to_hex, "ff00")
185
- should_equal(ScriptNumber.new(integer: -255).to_hex, "ff80")
186
- should_equal(ScriptNumber.new(integer: 0xffff).to_hex, "ffff00")
187
- should_equal(ScriptNumber.new(integer: -0xffff).to_hex, "ffff80")
188
-
189
- # Back and forth test
190
-
191
- (-100000..10000).each do |i|
192
- d = ScriptNumber.new(integer: i).data
193
- #puts BTC.to_hex(d) if i % 16 == 0
194
- i2 = ScriptNumber.new(data: d).to_i
195
- should_equal(i, i2)
196
- end
197
-
198
- # Booleans
199
-
200
- should_equal(ScriptNumber.new(boolean: true), 1)
201
- should_equal(ScriptNumber.new(boolean: false), 0)
202
-
203
- # Equality
204
-
205
- should_equal(ScriptNumber.new(integer: 0) == 0, true)
206
- should_equal(ScriptNumber.new(integer: 1) == 1, true)
207
- should_equal(ScriptNumber.new(integer: -1) == -1, true)
208
-
209
- should_equal(ScriptNumber.new(integer: 0) == ScriptNumber.new(integer: 0), true)
210
- should_equal(ScriptNumber.new(integer: 1) == ScriptNumber.new(integer: 1), true)
211
- should_equal(ScriptNumber.new(integer: -1) == ScriptNumber.new(integer: -1), true)
212
-
213
- should_equal(ScriptNumber.new(integer: 0) != 0, false)
214
- should_equal(ScriptNumber.new(integer: 1) != 1, false)
215
- should_equal(ScriptNumber.new(integer: -1) != -1, false)
216
-
217
- should_equal(ScriptNumber.new(integer: 0) != ScriptNumber.new(integer: 0), false)
218
- should_equal(ScriptNumber.new(integer: 1) != ScriptNumber.new(integer: 1), false)
219
- should_equal(ScriptNumber.new(integer: -1) != ScriptNumber.new(integer: -1), false)
220
-
221
- # Arithmetic
222
-
223
- sn = ScriptNumber.new(integer: 123)
224
- sn -= 1
225
- should_equal(sn, 122)
226
-
227
- puts "All tests passed."
228
- end
229
-
230
- def should_equal(a, b, msg = 'Must equal')
231
- a == b or raise "#{msg} Expected #{b.inspect}, received #{a.inspect}."
232
- end
233
-
234
- def should_raise(message)
235
- raised = false
236
- begin
237
- yield
238
- rescue => e
239
- if e.message == message
240
- raised = true
241
- else
242
- raise "Raised unexpected exception: #{e}"
243
- end
244
- end
245
- if !raised
246
- raise "Should have raised #{message.inspect}!"
247
- end
248
- end
249
-
250
- run_tests
251
- end
252
-
253
-
254
-
@@ -1,3 +1,3 @@
1
1
  module BTC
2
- VERSION = "1.1.5".freeze
2
+ VERSION = "1.1.6".freeze
3
3
  end
@@ -3,14 +3,14 @@ require_relative '../spec_helper'
3
3
  describe BTC::IssuanceID do
4
4
  it "should encode script to a correct address" do
5
5
  key = BTC::Key.new(private_key: "18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725".from_hex, public_key_compressed: false)
6
- issuance_id = BTC::IssuanceID.new(outpoint: BTC::Outpoint.new(transaction_hash: BTC.hash256("tx1"), index:1), amount:100, network: BTC::Network.mainnet)
7
- issuance_id.hash.to_hex.must_equal "29d2765469a299d1219a1cbf7561534eae4595f7"
8
- issuance_id.to_s.must_equal "SR78rsv5RCMMay22D3ZUZmMgPkRGpqphnQ"
6
+ issuance_id = BTC::IssuanceID.new(outpoint: BTC::Outpoint.new(transaction_hash: BTC.hash256("tx1"), index:1), network: BTC::Network.mainnet)
7
+ issuance_id.hash.to_hex.must_equal "601a635e4f95178e999b9957cc8cea255e988a4f"
8
+ issuance_id.to_s.must_equal "SW49WjotbWmG4GMWXZmpP3bdCrABmC8LRG"
9
9
  issuance_id.is_a?(BTC::IssuanceID).must_equal true
10
10
  end
11
11
  it "should decode an asset address" do
12
- issuance_id = BTC::Address.parse("SR78rsv5RCMMay22D3ZUZmMgPkRGpqphnQ")
12
+ issuance_id = BTC::Address.parse("SW49WjotbWmG4GMWXZmpP3bdCrABmC8LRG")
13
13
  issuance_id.is_a?(BTC::IssuanceID).must_equal true
14
- issuance_id.hash.to_hex.must_equal "29d2765469a299d1219a1cbf7561534eae4595f7"
14
+ issuance_id.hash.to_hex.must_equal "601a635e4f95178e999b9957cc8cea255e988a4f"
15
15
  end
16
16
  end
@@ -0,0 +1,128 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe BTC::ScriptNumber do
4
+
5
+ [-1000000000000000,-10000,-100,-1,0,1,10,1000,100000000000000].each do |i|
6
+ it "should return integer #{i} as-is after a round-trip" do
7
+ BTC::ScriptNumber.new(integer: i).to_i.must_equal i
8
+ end
9
+ end
10
+
11
+ it "should validate a range of back-and-forth conversions" do
12
+ (-100000..10000).each do |i|
13
+ BTC::ScriptNumber.new(integer: i).to_i.must_equal i
14
+ end
15
+ end
16
+
17
+ it "should parse empty string as zero" do
18
+ BTC::ScriptNumber.new(data: "").to_i.must_equal 0
19
+ end
20
+
21
+ it "should parse 0x01 as 1" do
22
+ BTC::ScriptNumber.new(data: "\x01").to_i.must_equal 1
23
+ end
24
+
25
+ it "should parse 0xff as -127" do
26
+ BTC::ScriptNumber.new(data: "\xff").to_i.must_equal -127
27
+ end
28
+
29
+ it "should parse 0xff00 as 255." do
30
+ BTC::ScriptNumber.new(data: "\xff\x00").to_i.must_equal 255
31
+ end
32
+
33
+ it "should parse 0x81 as -1." do
34
+ BTC::ScriptNumber.new(data: "\x81").to_i.must_equal -1
35
+ end
36
+
37
+ it "should parse 0x8f as -0x0f." do
38
+ BTC::ScriptNumber.new(data: "\x8f").to_i.must_equal -15
39
+ end
40
+
41
+ it "should parse 0x0081 as -256." do
42
+ BTC::ScriptNumber.new(data: "\x00\x81").to_i.must_equal -256
43
+ end
44
+
45
+ it "should decode -255." do
46
+ BTC::ScriptNumber.new(data: "\xff\x80").to_i.must_equal -255
47
+ end
48
+
49
+ it "should raise exception for non-minimally-encoded data" do
50
+ should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x00") }
51
+ should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x80") }
52
+ should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x00\x80") }
53
+ should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x01\x80") }
54
+ should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x00\x00\x80") }
55
+ should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x00\x10\x80") }
56
+ should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x10\x00\x80") }
57
+ end
58
+
59
+ it "should raise exception for invalid encoding" do
60
+ should_raise('script number overflow (3 > 2)') { BTC::ScriptNumber.new(data: "\x00\x00\x80", max_size: 2) }
61
+ end
62
+
63
+ it "should encode booleans" do
64
+ BTC::ScriptNumber.new(boolean: true).must_equal 1
65
+ BTC::ScriptNumber.new(boolean: true).data.must_equal "\x01"
66
+ BTC::ScriptNumber.new(boolean: false).must_equal 0
67
+ BTC::ScriptNumber.new(boolean: false).data.must_equal ""
68
+ end
69
+
70
+ it "should check equality checks" do
71
+ (BTC::ScriptNumber.new(integer: 0) == 0).must_equal true
72
+ (BTC::ScriptNumber.new(integer: 1) == 1).must_equal true
73
+ (BTC::ScriptNumber.new(integer: -1) == -1).must_equal true
74
+
75
+ (BTC::ScriptNumber.new(integer: 0) == BTC::ScriptNumber.new(integer: 0)).must_equal true
76
+ (BTC::ScriptNumber.new(integer: 1) == BTC::ScriptNumber.new(integer: 1)).must_equal true
77
+ (BTC::ScriptNumber.new(integer: -1) == BTC::ScriptNumber.new(integer: -1)).must_equal true
78
+
79
+ (BTC::ScriptNumber.new(integer: 0) != 0).must_equal false
80
+ (BTC::ScriptNumber.new(integer: 1) != 1).must_equal false
81
+ (BTC::ScriptNumber.new(integer: -1) != -1).must_equal false
82
+ (BTC::ScriptNumber.new(integer: 0) != BTC::ScriptNumber.new(integer: 0)).must_equal false
83
+ (BTC::ScriptNumber.new(integer: 1) != BTC::ScriptNumber.new(integer: 1)).must_equal false
84
+ (BTC::ScriptNumber.new(integer: -1) != BTC::ScriptNumber.new(integer: -1)).must_equal false
85
+ end
86
+
87
+ it "should support #-" do
88
+ sn = BTC::ScriptNumber.new(integer: 123)
89
+ sn = sn - 20
90
+ sn -= 3
91
+ sn.must_equal 100
92
+ end
93
+
94
+ it "should support #+" do
95
+ sn = BTC::ScriptNumber.new(integer: 123)
96
+ sn = sn + 20
97
+ sn += 7
98
+ sn.must_equal 150
99
+ end
100
+
101
+ it "should support unary minus operator" do
102
+ sn = BTC::ScriptNumber.new(integer: 123)
103
+ sn = -sn
104
+ sn.must_equal -123
105
+ end
106
+
107
+ it "should support unary plus operator" do
108
+ sn = BTC::ScriptNumber.new(integer: 123)
109
+ sn = +sn
110
+ sn.must_equal 123
111
+ end
112
+
113
+ def should_raise(message)
114
+ raised = false
115
+ begin
116
+ yield
117
+ rescue => e
118
+ if e.message == message
119
+ raised = true
120
+ else
121
+ raise "Raised unexpected exception: #{e}"
122
+ end
123
+ end
124
+ if !raised
125
+ raise "Should have raised #{message.inspect}!"
126
+ end
127
+ end
128
+ end
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.5
4
+ version: 1.1.6
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-20 00:00:00.000000000 Z
12
+ date: 2015-08-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -156,6 +156,7 @@ files:
156
156
  - spec/open_assets/issuance_id_spec.rb
157
157
  - spec/proof_of_work_spec.rb
158
158
  - spec/script_interpreter_spec.rb
159
+ - spec/script_number_spec.rb
159
160
  - spec/script_spec.rb
160
161
  - spec/secp256k1_spec.rb
161
162
  - spec/spec_helper.rb
@@ -207,6 +208,7 @@ test_files:
207
208
  - spec/open_assets/issuance_id_spec.rb
208
209
  - spec/proof_of_work_spec.rb
209
210
  - spec/script_interpreter_spec.rb
211
+ - spec/script_number_spec.rb
210
212
  - spec/script_spec.rb
211
213
  - spec/secp256k1_spec.rb
212
214
  - spec/transaction_builder_spec.rb