keoken 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 910f95d9e5c38b7bd38a3931b31172285811a45d0dcfdbd280d0c9f86c177a8c
4
- data.tar.gz: f6d5dbc887a6bb374da47157dcede765a4f236f2d241058b9e9bd3e08b60e196
3
+ metadata.gz: 15695594d36a454d57720a31ba196856d28df82d10d2e9209ba436487458da64
4
+ data.tar.gz: e9f4b18afbad07bac82b0c2b5c001f186a2c5e2c13088c51f7a7369ff7d8f478
5
5
  SHA512:
6
- metadata.gz: a3b15901f51755d600d766fab2c96c4a0e42b2722368d763d27a4930761882060f5ab2d7f9f053e1639c3cc841bf862b6556c9cb0fd8214c0a0211a13bb8667c
7
- data.tar.gz: a0c828852eb3b6929c39b78e9454add080bb142b708bff5c60488eec17b5ffeb6f015f74a994e8aaf0e5ab2ae046bb43571e2343a2ea9fe31b5d75c4ed32c5b8
6
+ metadata.gz: 209f756479dce58ecbcc2754fdea37a0cff43018ffbcab3273e5660a466c8d058d03b7a364cba53c8b56a19dd944cb10adc01972a3953e7690acb057c8266fdf
7
+ data.tar.gz: e886697b6477af041787fa9152a998efaa08e3bd1c95087f2b5ea5665df37c68849599c259376f6938e58ae583082f94a541cbefd05e4d4cd60cc6e1f84496cf
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- keoken (0.1.1)
4
+ keoken (0.2.0)
5
5
  bitcoin-ruby (~> 0.0.18)
6
6
 
7
7
  GEM
data/lib/keoken/parser.rb CHANGED
@@ -6,26 +6,28 @@ module Keoken
6
6
  @data = binary.bytes
7
7
  end
8
8
 
9
+ protected
10
+
11
+ # rubocop:disable Metrics/AbcSize
9
12
  def prefix
10
- result = @data.slice!(0)
11
- raise Keoken::DataNotParsed, 'OP_RETURN missing' unless result == Bitcoin::Script::OP_RETURN.to_i
12
- result = @data.slice!(0)
13
- raise Keoken::DataNotParsed, 'Prefix size missing' unless result == Keoken::PREFIX_SIZE.to_i
13
+ raise Keoken::DataNotParsed, 'OP_RETURN missing' unless @data.slice!(0) == Bitcoin::Script::OP_RETURN.to_i
14
+ raise Keoken::DataNotParsed, 'Prefix size missing' unless @data.slice!(0) == Keoken::PREFIX_SIZE.to_i
14
15
  result = @data.slice!(0..Keoken::PREFIX.htb.bytes.length - 1)
15
16
  raise Keoken::DataNotParsed, 'Prefix not provided' unless result == Keoken::PREFIX.htb.bytes
16
- bytesize = @data.slice!(0)
17
- raise Keoken::DataNotParsed, 'Bytesize not provided' unless bytesize == @data.length
17
+ raise Keoken::DataNotParsed, 'Bytesize not provided' unless @data.slice!(0) == @data.length
18
18
  end
19
+ # rubocop:enable Metrics/AbcSize
19
20
 
20
21
  def set_transaction_type
21
22
  result = @data.slice!(0..3).join
22
- @transaction_type = if result == Keoken::TYPE_CREATE_ASSET
23
- :create
24
- elsif result == Keoken::TYPE_SEND_TOKEN
25
- :send
26
- else
27
- raise Keoken::DataNotParsed, 'Transaction type not valid'
28
- end
23
+ @transaction_type =
24
+ if result == Keoken::TYPE_CREATE_ASSET
25
+ :create
26
+ elsif result == Keoken::TYPE_SEND_TOKEN
27
+ :send
28
+ else
29
+ raise Keoken::DataNotParsed, 'Transaction type not valid'
30
+ end
29
31
  @transaction_type
30
32
  end
31
33
 
@@ -39,15 +41,21 @@ module Keoken
39
41
  break if tmp.zero? && end_of_name
40
42
  name.push tmp
41
43
  end
44
+ name_or_id_to_hex(name)
45
+ end
46
+
47
+ def set_amount
48
+ @data.map { |datum| datum.to_s(16) }.join.to_i(16)
49
+ end
50
+
51
+ private
52
+
53
+ def name_or_id_to_hex(name)
42
54
  if @transaction_type == :create
43
55
  name.map { |n| n.to_s(16).htb }.join
44
56
  elsif @transaction_type == :send
45
57
  name.map { |n| n.to_s(16) }.join
46
58
  end
47
59
  end
48
-
49
- def amount
50
- @data.map { |byte| byte.zero? ? "#{byte}0" : byte.to_s }.join.to_i
51
- end
52
60
  end
53
61
  end
data/lib/keoken/token.rb CHANGED
@@ -1,16 +1,20 @@
1
1
  module Keoken
2
- class Token
3
- attr_accessor :data_script, :name, :id, :amount, :transaction_type
2
+ class Token < Parser
3
+ attr_accessor :data_script, :id
4
4
 
5
5
  # Creates a new token object.
6
6
  #
7
7
  # @param options [Hash] options parameters to create the token.
8
8
  # @option options [String] :name The name of token to create.
9
9
  # @option options [Number] :id The id of token to obtain an amount to send to another address.
10
+ # @option options [String] :script An hexadecimal script intended to be parsed.
10
11
  #
11
12
  def initialize(options = {})
12
13
  @name = options[:name]
13
14
  @id = options[:id]
15
+ return unless options[:script]
16
+ super(options[:script])
17
+ parse_script
14
18
  end
15
19
 
16
20
  # Generate the script to create a token.
@@ -26,7 +30,7 @@ module Keoken
26
30
  Keoken::VERSION_NODE,
27
31
  Keoken::TYPE_CREATE_ASSET,
28
32
  name_to_hex(@name),
29
- Keoken::PREFIX_BYTE_AMOUNT[0..prefix_length(amount)] + amount.to_s
33
+ Keoken::PREFIX_BYTE_AMOUNT[0..prefix_length(amount)] + amount.to_s(16)
30
34
  ].flatten.join
31
35
  self
32
36
  end
@@ -45,7 +49,7 @@ module Keoken
45
49
  Keoken::VERSION_NODE,
46
50
  Keoken::TYPE_SEND_TOKEN,
47
51
  Keoken::PREFIX_BYTE_ASSET_ID[0..asset_length] + @id.to_s,
48
- Keoken::PREFIX_BYTE_AMOUNT[0..prefix_length(amount)] + amount.to_s
52
+ Keoken::PREFIX_BYTE_AMOUNT[0..prefix_length(amount)] + amount.to_s(16)
49
53
  ].flatten.join
50
54
  self
51
55
  end
@@ -86,18 +90,6 @@ module Keoken
86
90
  }
87
91
  end
88
92
 
89
- def parse_script(script)
90
- parser = Keoken::Parser.new(script)
91
- parser.prefix
92
- @transaction_type = parser.set_transaction_type
93
- if @transaction_type == :create
94
- @name = parser.name_or_id
95
- else
96
- @id = parser.name_or_id
97
- end
98
- @amount = parser.amount
99
- end
100
-
101
93
  private
102
94
 
103
95
  def data_length
@@ -112,5 +104,17 @@ module Keoken
112
104
  asset_bytes = name.bytes.map { |n| n.to_s(16) }
113
105
  asset_bytes + ['00']
114
106
  end
107
+
108
+ def parse_script
109
+ prefix
110
+ @transaction_type = set_transaction_type
111
+ if @transaction_type == :create
112
+ @name = name_or_id
113
+ else
114
+ @id = name_or_id
115
+ end
116
+ @amount = set_amount
117
+ self
118
+ end
115
119
  end
116
120
  end
@@ -1,3 +1,3 @@
1
1
  module Keoken
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.2.1'.freeze
3
3
  end
data/lib/keoken.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require 'bitcoin'
2
2
 
3
3
  require 'keoken/extensions/bitcoin/script'
4
- require 'keoken/token'
5
4
  require 'keoken/parser'
5
+ require 'keoken/token'
6
6
  require 'keoken/backend/base'
7
7
  require 'keoken/backend/bitcoin_ruby/transaction'
8
8
  require 'keoken/bitprim/transaction'
data/spec/keoken_spec.rb CHANGED
@@ -21,21 +21,19 @@ describe Keoken do
21
21
  token = Keoken::Token.new(name: 'test-keoken')
22
22
  token.create(1_000_000)
23
23
  expect(token.hex).to(
24
- eq('6a0400004b501800000000746573742d6b656f6b656e000000000001000000')
24
+ eq('6a0400004b501700000000746573742d6b656f6b656e00000000000f4240')
25
25
  )
26
26
  end
27
27
 
28
28
  it 'serialize the test-keoken token' do
29
- token = Keoken::Token.new
30
- token.parse_script('6a0400004b501800000000746573742d6b656f6b656e000000000001000000')
29
+ token = Keoken::Token.new(script: '6a0400004b501800000000746573742d6b656f6b656e0000000000000f4240')
31
30
  expect(token.to_json).to(
32
31
  eq('{"id":null,"name":"test-keoken","amount":1000000,"transaction_type":"create"}')
33
32
  )
34
33
  end
35
34
 
36
35
  it 'deserialize the test-keoken token' do
37
- token = Keoken::Token.new
38
- token.parse_script('6a0400004b501800000000746573742d6b656f6b656e000000000001000000')
36
+ token = Keoken::Token.new(script: '6a0400004b501800000000746573742d6b656f6b656e0000000000000f4240')
39
37
  expect(token.to_hash).to(
40
38
  eq(
41
39
  amount: 1_000_000,
@@ -47,8 +45,7 @@ describe Keoken do
47
45
  end
48
46
 
49
47
  it 'deserialize the token with id' do
50
- token = Keoken::Token.new
51
- token.parse_script('6a0400004b501000000001000000340000000001000000')
48
+ token = Keoken::Token.new(script: '6a0400004b5010000000010000003400000000000f4240')
52
49
  expect(token.to_hash).to(
53
50
  eq(
54
51
  amount: 1_000_000,
@@ -59,6 +56,18 @@ describe Keoken do
59
56
  )
60
57
  end
61
58
 
59
+ it 'deserialize the Bitprim token' do
60
+ token = Keoken::Token.new(script: '6a0400004b5014000000004269747072696d0000000000000f4240')
61
+ expect(token.to_hash).to(
62
+ eq(
63
+ amount: 1_000_000,
64
+ name: 'Bitprim',
65
+ id: nil,
66
+ transaction_type: :create
67
+ )
68
+ )
69
+ end
70
+
62
71
  it 'raise an error when name is not provided' do
63
72
  token = Keoken::Token.new
64
73
  expect { token.create(1_000_000) }.to raise_error(Keoken::NameNotFound)
@@ -73,7 +82,7 @@ describe Keoken do
73
82
  token = Keoken::Token.new(id: 34)
74
83
  token.send_amount(1_000_000)
75
84
  expect(token.hex).to(
76
- eq('6a0400004b501000000001000000340000000001000000')
85
+ eq('6a0400004b50f0000000100000034000000000f4240')
77
86
  )
78
87
  end
79
88
 
@@ -100,7 +109,7 @@ describe Keoken do
100
109
  },
101
110
  {
102
111
  "value" => "0.00000000",
103
- "scriptPubKey" => "OP_RETURN 00004b50 00000000746573742d6b656f6b656e000000000001000000",
112
+ "scriptPubKey" => "OP_RETURN 00004b50 00000000746573742d6b656f6b656e00000000000f4240",
104
113
  },
105
114
  ]
106
115
  )
@@ -110,7 +119,7 @@ describe Keoken do
110
119
  it 'raw transaction' do
111
120
  raw = @transaction_token.raw
112
121
  expect(raw).to start_with('0100000001dae8143d5422d5e1018c43732baa74ac3114d4399a1f58a9ea7e31f656938a44010000006')
113
- expect(raw).to end_with('6a0400004b501800000000746573742d6b656f6b656e00000000000100000000000000')
122
+ expect(raw).to end_with('6a0400004b501700000000746573742d6b656f6b656e00000000000f424000000000')
114
123
  end
115
124
 
116
125
  it 'broadcast transaction' do
@@ -162,17 +171,17 @@ describe Keoken do
162
171
  },
163
172
  {
164
173
  "value" => "0.00000000",
165
- "scriptPubKey" => "OP_RETURN 00004b50 00000001000001230000000000500000",
174
+ "scriptPubKey" => "OP_RETURN 00004b50 000000010000012300000000007a1200",
166
175
  },
167
176
  ]
168
177
  )
169
178
  )
170
179
  end
171
180
 
172
- it "raw transaction" do
181
+ it 'raw transaction' do
173
182
  raw = @transaction_token.raw
174
- expect(raw).to start_with("0100000001dae8143d5422d5e1018c43732baa74ac3114d4399a1f58a9ea7e31f656938a4401000000")
175
- expect(raw).to end_with("6a0400004b50100000000100000123000000000050000000000000")
183
+ expect(raw).to start_with('0100000001dae8143d5422d5e1018c43732baa74ac3114d4399a1f58a9ea7e31f656938a4401000000')
184
+ expect(raw).to end_with('6a0400004b5010000000010000012300000000007a120000000000')
176
185
  end
177
186
  end
178
187
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keoken
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bitex