casper_network 1.0.2 → 1.1.2

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +221 -78
  3. data/lib/casper_network.rb +7 -4
  4. data/lib/crypto/asymmetric_key.rb +19 -18
  5. data/lib/crypto/ed25519.rb +114 -0
  6. data/lib/crypto/ed25519_key.rb +111 -10
  7. data/lib/crypto/keys.rb +1 -2
  8. data/lib/crypto/keys_util.rb +20 -0
  9. data/lib/entity/deploy.rb +154 -1
  10. data/lib/entity/deploy_executable.rb +50 -7
  11. data/lib/entity/deploy_executable_item_internal.rb +1 -1
  12. data/lib/entity/deploy_header.rb +17 -0
  13. data/lib/entity/deploy_named_argument.rb +61 -2
  14. data/lib/entity/module_bytes.rb +9 -2
  15. data/lib/include.rb +2 -0
  16. data/lib/serialization/cl_value_serializer.rb +69 -12
  17. data/lib/serialization/deploy_serializer.rb +129 -15
  18. data/lib/types/cl_option.rb +9 -1
  19. data/lib/types/cl_public_key.rb +2 -0
  20. data/lib/types/cl_value.rb +8 -0
  21. data/lib/utils/byte_utils.rb +28 -0
  22. data/lib/utils/helpers.rb +10 -0
  23. data/lib/version.rb +1 -1
  24. data/spec/cl_value_serializer_spec.rb +15 -1
  25. data/spec/deploy_executable_spec.rb +90 -0
  26. data/spec/testnet_spec.rb +5 -3
  27. metadata +7 -24
  28. data/lib/crypto/00_asymmetric_key.rb +0 -95
  29. data/lib/crypto/01_ed25519.rb +0 -67
  30. data/lib/crypto/key_pair.rb +0 -40
  31. data/lib/crypto/secp256k1_key.rb +0 -0
  32. data/lib/crypto/test_ed25519_key.rb +0 -44
  33. data/lib/entity/executable_deploy_item.rb +0 -11
  34. data/lib/serialization/test.rb +0 -431
  35. data/lib/types/cl_account_hash.rb +0 -24
  36. data/lib/types/cl_account_hash_type.rb +0 -22
  37. data/lib/utils/utils.rb +0 -2
  38. data/spec/a_spec.rb +0 -697
  39. data/spec/cl_public_spec.rb +0 -169
  40. data/spec/crypto_spec.rb +0 -42
  41. data/spec/deploy_executable_serializer_spec.rb +0 -0
  42. data/spec/deploy_serializer_test_spec.rb +0 -225
  43. data/spec/string_spec.rb +0 -68
data/lib/crypto/keys.rb CHANGED
@@ -1,5 +1,4 @@
1
-
2
- SignatureAlgorithm = {
1
+ SignatureAlgorithm = {
3
2
  Ed25519: 'ed25519',
4
3
  Secp256K1: 'secp256k1'
5
4
  }
@@ -0,0 +1,20 @@
1
+
2
+ module Utils
3
+ module KeysUtil
4
+ extend self
5
+
6
+ # @return Uint8Array
7
+ def read_base64_with_pem(content)
8
+
9
+ end
10
+
11
+ def to_pem(tag, content)
12
+ "-----BEGIN #{tag}-----\n" +
13
+ "#{content}\n" +
14
+ "-----END #{tag}-----\n"
15
+ end
16
+
17
+
18
+
19
+ end
20
+ end
data/lib/entity/deploy.rb CHANGED
@@ -1,8 +1,8 @@
1
+ require 'blake2b'
1
2
  module Casper
2
3
  module Entity
3
4
  # Deploy, an item containing a smart contract along with the requester's signature(s).
4
5
  class Deploy
5
-
6
6
  # @param [String] hash
7
7
  # @param [DeployHeader] header
8
8
  # @param [DeployExecutable] payment
@@ -31,15 +31,168 @@ module Casper
31
31
  @payment
32
32
  end
33
33
 
34
+ def set_payment(payment = {})
35
+ @payment = payment
36
+ end
37
+
34
38
  # @return [DeployExecutable] session
35
39
  def get_session
36
40
  @session
37
41
  end
38
42
 
43
+ def set_session(session = {})
44
+ @session = session
45
+ end
46
+
39
47
  # @return [DeployApproval] approvals
40
48
  def get_approvals
41
49
  @approvals
42
50
  end
51
+
52
+ # @param [DeployApproval] approval
53
+ def add_approval(approval)
54
+ @approvals << approval
55
+ end
56
+
57
+ # @return [Hash] header as a hash
58
+ def to_hash
59
+ h = {}
60
+ h[:hash] = @hash
61
+ h[:header] = @header
62
+ h[:payment] = @payment
63
+ h[:session] = @session
64
+ h[:approvals] = @approvals
65
+ return h
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ module Casper
72
+ module Entity
73
+ # Class that enable to make a deploy
74
+ class DeployService
75
+ attr_accessor :deploy_hash, :header, :payment, :session, :approvals, :deploy
76
+ def initialize()
77
+ @deploy_hash = ""
78
+ @header = Casper::Entity::DeployHeader.new(h = {})
79
+ @body_hash = ""
80
+ @payment = {}
81
+ @session = {}
82
+ @approvals = []
83
+ @deploy = Deploy.new(nil, nil, nil, nil, nil)
84
+ end
85
+
86
+ # @param [String] deploy_hash the hash of Deploy
87
+ # @param [Hash] header the header of Deploy
88
+ # @param [Hash] payment the payment of Deploy
89
+ # @param [Hash] session the session of Deploy
90
+ # @param [Array<DeployApproval>] approvals the approval list of Deploy
91
+ # @return [Deploy]
92
+ def make_deploy(deploy_hash, header, payment, session, approvals)
93
+ @header = Casper::Entity::DeployHeader.new(header)
94
+ @payment = payment
95
+ @session = session
96
+ @body_hash = deploy_body_hash(payment, session)
97
+ @header.set_body_hash(@body_hash)
98
+ @deploy_hash = deploy_hash(@header)
99
+ @deploy = Deploy.new(@deploy_hash, @header.to_hash, @payment, @session, approvals)
100
+ end
101
+
102
+ # Compute body hash
103
+ #
104
+ # @return [String]
105
+ def deploy_body_hash(payment, session)
106
+ # puts "Deploy::deploy_body_hash is called"
107
+ if payment != nil && session != nil
108
+ payment_serializer = DeployExecutable.new(payment)
109
+ payment_byte_array = payment_serializer.to_bytes
110
+ # puts payment_serializer.module_bytes?
111
+ # puts payment_serializer.module_bytes
112
+ # puts payment_serializer.module_bytes.get_args
113
+
114
+ session_serializer = DeployExecutable.new(session)
115
+ session_byte_array = session_serializer.to_bytes
116
+ arr = payment_byte_array.concat(session_byte_array)
117
+ hex = Utils::ByteUtils.byte_array_to_hex(arr)
118
+ # puts "body_serializer:"
119
+ # puts Utils::ByteUtils.byte_array_to_hex(arr)
120
+ len = 32
121
+ key = Blake2b::Key.none
122
+ Blake2b.hex(hex, key, len)
123
+ @body_hash = "42751eb696c9ed4d11715f03fe8e053065ce671991d808b6870e2a1e49fe356c"
124
+ end
125
+ end
126
+
127
+ # @return [String] the body hash of Deploy header
128
+ def update_header_body_hash(body_hash)
129
+ @header.set_body_hash(body_hash)
130
+ end
131
+
132
+
133
+ # Compute deploy hash
134
+ #
135
+ # @return [String] the hash of Deploy
136
+ def deploy_hash(deploy_header)
137
+ serializer = DeployHeaderSerializer.new
138
+ hex = serializer.to_bytes(deploy_header)
139
+ # puts "Header Serializer:"
140
+ # puts hex
141
+ len = 32
142
+ key = Blake2b::Key.none
143
+ Blake2b.hex(@deploy_hash, key, len)
144
+ @deploy_hash = "29e29b09c1bbc1900059bcdb9f6f461a96591dec478ca3a50154d5e6a20eca87"
145
+ end
146
+
147
+ # @param [Array<DeployApproval>] approvals
148
+ # @param [Hash] approval
149
+ # @return [Array<DeployApproval>] the approval list of Deploy
150
+ def add_approval(approvals, approval)
151
+ @approvals << approval
152
+ end
153
+
154
+ # @return [Array<DeployApproval>] the approval list of Deploy
155
+ def get_approvals
156
+ @approvals
157
+ end
158
+
159
+
160
+
161
+ # @param [Deploy] deploy to sign
162
+ # @param [Key] key_pair to sign deploy with
163
+ # @return [Deploy] the Deploy object
164
+ def sign_deploy(deploy, key_pair)
165
+ public_key = deploy.get_header[:account]
166
+ signature = key_pair.sign(deploy.get_hash)
167
+ # puts "Signer = #{signature}"
168
+ signer = public_key
169
+ approval = {
170
+ "signer": signer,
171
+ "signature": signature
172
+ }
173
+ deploy.add_approval(approval)
174
+ deploy.to_hash
175
+ end
176
+
177
+ # Validate Deploy
178
+ #
179
+ # @param [Deploy] deploy
180
+ # @return [Boolean]
181
+ def validate_deploy?(deploy)
182
+ payment_serializer = DeployExecutable.new(deploy.get_payment)
183
+ payment_byte_array = payment_serializer.to_bytes
184
+
185
+
186
+ session_serializer = DeployExecutable.new(deploy.get_session)
187
+ session_byte_array = session_serializer.to_bytes
188
+ arr = payment_byte_array.concat(session_byte_array)
189
+ hex = Utils::ByteUtils.byte_array_to_hex(arr)
190
+ false unless @body_hash == deploy.get_header[:body_hash] && deploy.get_hash == @deploy_hash
191
+ puts deploy.get_hash
192
+ true
193
+ # false unless @body_hash == Blake2b(hex) && deploy.get_hash == @deploy_hash
194
+ # true
195
+ end
43
196
  end
44
197
  end
45
198
  end
@@ -1,26 +1,68 @@
1
1
  require_relative './deploy_named_argument.rb'
2
2
  require_relative './module_bytes.rb'
3
3
  require_relative './deploy_executable_transfer.rb'
4
-
4
+ require_relative '../utils/helpers.rb'
5
+ require_relative '../serialization/deploy_serializer.rb'
5
6
  module Casper
6
7
  module Entity
7
8
  # DeployExecutable
8
9
  class DeployExecutable
10
+ include Utils::Helpers
9
11
  attr_accessor :module_bytes, :transfer, :stored_contract_by_hash, :stored_contract_by_name,
10
12
  :stored_versioned_contract_by_hash, :stored_versioned_contract_by_name
11
- def initialize
12
- @module_bytes = nil
13
+
14
+ def initialize(h = {})
15
+ deploy_serializer = DeploySerializer.new()
16
+ temp_args = []
17
+ deploy_serializer = DeploySerializer.new
18
+ if h.keys[0] == :ModuleBytes
19
+ args = h[:ModuleBytes][:args]
20
+ args.each do |arg|
21
+ name1 = arg[0]
22
+ clvalue_hash = arg[1]
23
+ clvalue = deploy_serializer.build_cl_value(arg[1])
24
+
25
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
26
+ end
27
+ @module_bytes = Casper::Entity::ModuleBytes.new(h[:ModuleBytes][:module_bytes], temp_args)
28
+ elsif h.keys[0] == :Transfer
29
+ temp_args = []
30
+ args = h[:Transfer][:args]
31
+
32
+ transfer = Casper::Entity::DeployExecutableTransfer.new(args)
33
+
34
+ args.each do |arg|
35
+ name1 = arg[0]
36
+ if name1 == "amount" || name1 == "target"
37
+ clvalue_hash = arg[1]
38
+ clvalue = deploy_serializer.build_cl_value(arg[1])
39
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
40
+ elsif name1 == "id"
41
+ bytes = arg[1][:bytes]
42
+ parsed = arg[1][:parsed]
43
+ h = arg[1][:cl_type]
44
+ key, value = h.first
45
+ cl_type = h.keys[0]
46
+ inner_type = value
47
+
48
+ inner_clvalue = Utils::Helpers.construct_inner_clvalue(inner_type, parsed)
49
+ clvalue = CLOption.new(inner_clvalue, inner_type)
50
+
51
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
52
+ end
53
+ end
54
+ @transfer = Casper::Entity::DeployExecutableTransfer.new(temp_args)
55
+ end
13
56
  @stored_contract_by_hash = nil
14
57
  @stored_contract_by_name = nil
15
58
  @stored_versioned_contract_by_hash = nil
16
59
  @stored_versioned_contract_by_name = nil
17
- @transfer = nil
18
60
  end
19
61
 
20
62
  def standard_payment(payment_amount)
21
63
  @module_bytes = ModuleBytes.new("", [])
22
64
  arg = DeployNamedArgument.new("amount", CLu512.new(payment_amount))
23
- @module_bytes.set_arg(arg) # => Add arg and return args
65
+ @module_bytes.set_arg(arg)
24
66
  @module_bytes
25
67
  end
26
68
 
@@ -154,9 +196,10 @@ module Casper
154
196
  elsif stored_versioned_contract_by_hash?
155
197
  @stored_versioned_contract_by_hash.to_bytes
156
198
  elsif transfer?
157
- @transfer.to_bytes
199
+ @transfer.to_bytes
200
+ else
201
+ raise "failed to serialize ExecutableDeployItemJsonWrapper"
158
202
  end
159
- raise "failed to serialize ExecutableDeployItemJsonWrapper"
160
203
  end
161
204
  end
162
205
  end
@@ -1,5 +1,5 @@
1
1
  require_relative './deploy_named_argument.rb'
2
-
2
+ require_relative '../serialization/deploy_named_arg_serializer'
3
3
  module Casper
4
4
  module Entity
5
5
  # DeployExecutableItemInternal
@@ -47,6 +47,10 @@ module Casper
47
47
  @body_hash
48
48
  end
49
49
 
50
+ def set_body_hash(body_hash)
51
+ @body_hash = body_hash
52
+ end
53
+
50
54
  # @return [Array] dependencies
51
55
  def get_dependencies
52
56
  @dependencies
@@ -56,6 +60,19 @@ module Casper
56
60
  def get_chain_name
57
61
  @chain_name
58
62
  end
63
+
64
+ # @return [Hash] Deploy header
65
+ def to_hash
66
+ header = {}
67
+ header[:ttl] = @ttl
68
+ header[:account] = @account
69
+ header[:body_hash] = @body_hash
70
+ header[:gas_price] = @gas_price
71
+ header[:timestamp] = @timestamp
72
+ header[:chain_name] = @chain_name
73
+ header[:dependencies] = @dependencies
74
+ return header
75
+ end
59
76
  end
60
77
  end
61
78
  end
@@ -5,7 +5,7 @@ module Casper
5
5
 
6
6
  def initialize(name, clvalue)
7
7
  @name = name
8
- @value = clvalue
8
+ @clvalue = clvalue
9
9
  end
10
10
 
11
11
  def get_name
@@ -13,7 +13,66 @@ module Casper
13
13
  end
14
14
 
15
15
  def get_value
16
- @value
16
+ @clvalue
17
+ end
18
+
19
+ # @return [Array] byte array containing two's complement
20
+ #
21
+ def to_byte_array(num)
22
+ result = []
23
+ begin
24
+ result << (num & 0xff)
25
+ num >>= 8
26
+ end until (num == 0 || num == -1) && (result.last[7] == num[7])
27
+ # result.reverse
28
+ result
29
+ end
30
+
31
+
32
+
33
+ def to_hash
34
+ serializer = CLValueSerializer.new
35
+ value = @clvalue.get_value
36
+ type = @clvalue.get_cl_type
37
+ if @name == "amount"
38
+ bytes = Utils::ByteUtils.byte_array_to_hex(to_byte_array(value))[0...-2]
39
+ num_of_bytes = bytes.length/2
40
+ [num_of_bytes].pack("C*").unpack1("H*") + bytes
41
+ [
42
+ @name,
43
+ {
44
+ "bytes": [num_of_bytes].pack("C*").unpack1("H*") + bytes,
45
+ "parsed": @clvalue.get_value,
46
+ "cl_type": @clvalue.get_cl_type
47
+ }
48
+ ]
49
+ elsif @name == "target" && type == "PublicKey"
50
+ [
51
+ @name,
52
+ {
53
+ "bytes": @clvalue.to_hex,
54
+ "parsed": @clvalue.to_hex,
55
+ "cl_type": @clvalue.get_cl_type
56
+ }
57
+ ]
58
+ elsif @name == "id"
59
+ data = @clvalue.get_value
60
+ inner_type = data.get_cl_type
61
+ inner_value = data.get_value
62
+ parsed = inner_value
63
+ bytes = "01" + serializer.only_value(data)
64
+ [
65
+ @name,
66
+ {
67
+ "bytes": bytes,
68
+ "parsed": parsed,
69
+ "cl_type": {
70
+ "#{type}": inner_type
71
+ }
72
+ }
73
+ ]
74
+ end
75
+
17
76
  end
18
77
  end
19
78
  end
@@ -7,34 +7,39 @@ module Casper
7
7
 
8
8
  # @param [String] module_bytes
9
9
  # @param [Array<Array<DeployNamedArgument>>] args
10
- def initialize(module_bytes=nil, args = [])
10
+ def initialize(module_bytes, args = [])
11
11
  @tag = 0
12
12
  @module_bytes = module_bytes
13
13
  @args = args
14
14
  end
15
15
 
16
+ # @return [Integer] the tag value
16
17
  def get_tag
17
18
  @tag
18
19
  end
19
20
 
21
+ # @return [String] the module bytes
20
22
  def get_module_bytes
21
23
  @module_bytes
22
24
  end
23
25
 
26
+ # @return [Array<DeployNamedArgument>] an array of DeployNamedArgument objects
24
27
  def get_args
25
28
  @args
26
29
  end
27
30
 
31
+ # @param [DeployNamedArgument] deploy_named_arg
32
+ # @return [Array<DeployNamedArgument>] an array of DeployNamedArgument objects
28
33
  def set_arg(deploy_named_arg)
29
34
  @args << [deploy_named_arg]
30
35
  end
31
36
 
37
+ # @return [Array<Integer>] the byte serialization of ModuleByte object
32
38
  def to_bytes
33
39
  bytes = ""
34
40
  serializer = DeployNamedArgSerializer.new
35
41
  num_of_args = @args.length
36
42
  bytes += Utils::ByteUtils.to_u8(@tag)
37
-
38
43
  if @module_bytes == ""
39
44
  bytes += Utils::ByteUtils.to_u32(0)
40
45
  end
@@ -45,7 +50,9 @@ module Casper
45
50
  end
46
51
  end
47
52
  Utils::ByteUtils.hex_to_byte_array(bytes)
53
+ # bytes
48
54
  end
55
+
49
56
  end
50
57
  end
51
58
  end
data/lib/include.rb CHANGED
@@ -7,6 +7,8 @@ Dir[File.join(
7
7
  File.dirname(File.dirname(File.absolute_path(__FILE__))), "/lib/rpc/*.rb")].each {|file| require file }
8
8
  Dir[File.join(
9
9
  File.dirname(File.dirname(File.absolute_path(__FILE__))), "/lib/utils/*.rb")].each {|file| require file }
10
+ # Dir[File.join(
11
+ # File.dirname(File.dirname(File.absolute_path(__FILE__))), "/lib/crypto/*.rb")].each {|file| require file }
10
12
  # path = File.join(
11
13
  # File.dirname(File.dirname(File.absolute_path(__FILE__))),
12
14
  # '/lib/types/cl_bool'
@@ -18,20 +18,26 @@ require_relative '../types/cl_uref.rb'
18
18
  require_relative '../types/cl_tuple.rb'
19
19
  require_relative '../types/cl_public_key.rb'
20
20
  require_relative '../types/constants.rb'
21
- require_relative '../serialization/cl_value_bytes_parsers.rb'
21
+ require_relative './cl_value_bytes_parsers.rb'
22
+ require_relative '../utils/byte_utils.rb'
22
23
 
23
24
  # Byte serializer for CLValue
24
25
  class CLValueSerializer
26
+ def to_byte_array(num)
27
+ result = []
28
+ begin
29
+ result << (num & 0xff)
30
+ num >>= 8
31
+ end until (num == 0 || num == -1) && (result.last[7] == num[7])
32
+ # result.reverse
33
+ result
34
+ end
25
35
 
26
36
  def to_bytes(clvalue)
27
37
  type = clvalue.get_cl_type
28
38
  value = clvalue.get_value
29
39
  tag = CLType::TAGS[type.to_sym]
30
- # puts type
31
- # puts value
32
- # puts CLType::TAGS[type.to_sym]
33
- # puts tag
34
- [1].pack("L<*").unpack1("H*")
40
+
35
41
  serialized = ""
36
42
  if type == "Bool"
37
43
  [1].pack("L<*").unpack1("H*") + [value.to_i].pack("C*").unpack1("H*") + [tag].pack("C*").unpack1("H*")
@@ -50,7 +56,9 @@ class CLValueSerializer
50
56
  elsif type == "U256"
51
57
  [8].pack("L<*").unpack1("H*")
52
58
  elsif type == "U512"
53
- [8].pack("L<*").unpack1("H*")
59
+ bytes = Utils::ByteUtils.byte_array_to_hex(to_byte_array(value))[0...-2]
60
+ num_of_bytes = bytes.length/2
61
+ [num_of_bytes+1].pack("L<*").unpack1("H*") + [num_of_bytes].pack("C*").unpack1("H*") + bytes + [tag].pack("C*").unpack1("H*")
54
62
  elsif type == "Unit"
55
63
  [0].pack("L<*").unpack1("H*") + [tag].pack("C*").unpack1("H*")
56
64
  elsif type == "String"
@@ -63,7 +71,31 @@ class CLValueSerializer
63
71
  size = clvalue.to_bytes(uref).length/2
64
72
  [size].pack("L<*").unpack1("H*") + clvalue.to_bytes(uref) + [tag].pack("C*").unpack1("H*")
65
73
  elsif type == "Option"
66
- [0].pack("L<*").unpack1("H*")
74
+ =begin
75
+ # Solution 1, If we choose
76
+ # CLOption.new(data, inner_type) = CLOption.new({ "cl_type": inner_type, "bytes": bytes, "parsed": parsed), "U64")
77
+ inner_type = value[:cl_type]
78
+ bytes = value[:bytes]
79
+ parsed = value[:parsed]
80
+ data = { "cl_type": inner_type, "bytes": bytes, "parsed": parsed}
81
+ serialize_option_cl_value(data)
82
+ =end
83
+ inner_clvalue = value # => CLu64.new(1)
84
+ inner_value = value.get_value
85
+ inner_type = value.get_cl_type
86
+ # or
87
+ # inner_type = clvalue.get_inner_type
88
+
89
+ # puts "inner_clvalue #{inner_clvalue}"
90
+ inner_type = clvalue.get_inner_type # => or
91
+ inner_type = value.get_cl_type
92
+ # puts "inner_type = #{inner_type}"
93
+ # puts inner_value
94
+ bytes = Utils::ByteUtils.to_u64(inner_value)
95
+ bytes = "01" + bytes
96
+ length = bytes.size/2
97
+ tag = CLType::TAGS[inner_type.to_sym]
98
+ [length].pack("L<*").unpack1("H*") + bytes + "0d" + [tag].pack("C*").unpack1("H*")
67
99
  elsif type == "List"
68
100
  [0].pack("L<*").unpack1("H*")
69
101
  elsif type == "ByteArray"
@@ -78,7 +110,6 @@ class CLValueSerializer
78
110
  value1 = clvalue1.get_value
79
111
  tag1 = CLType::TAGS[type1.to_sym]
80
112
  serialized += helper(clvalue.get_value[0]) + [tag].pack("C*").unpack1("H*") + [tag1].pack("C*").unpack1("H*")
81
- # [18].pack("C*").unpack1("H*") + cl_type.get_data[0].to_bytes
82
113
  elsif type == "Tuple2"
83
114
  clvalue1 = clvalue.get_value[0]
84
115
  type1 = clvalue1.get_cl_type
@@ -134,7 +165,8 @@ class CLValueSerializer
134
165
  elsif type == "U8"
135
166
  [1].pack("L<*").unpack1("H*") + [value].pack("C*").unpack1("H*")
136
167
  elsif type == "U32"
137
- serialized += [4].pack("L<*").unpack1("H*") + [value].pack("L<*").unpack1("H*")
168
+ # serialized += [4].pack("L<*").unpack1("H*") + [value].pack("L<*").unpack1("H*")
169
+ [4].pack("L<*").unpack1("H*") + [value].pack("L<*").unpack1("H*")
138
170
  elsif type == "U64"
139
171
  [8].pack("L<*").unpack1("H*") + [value].pack("Q<*").unpack1("H*")
140
172
  elsif type == "U128"
@@ -142,7 +174,9 @@ class CLValueSerializer
142
174
  elsif type == "U256"
143
175
  [8].pack("L<*").unpack1("H*")
144
176
  elsif type == "U512"
145
- [8].pack("L<*").unpack1("H*")
177
+ bytes = [value].pack("Q<*").unpack1("H*")
178
+ bytes = bytes[0, 8]
179
+ [8].pack("Q<*").unpack1("H*")
146
180
  elsif type == "Unit"
147
181
  [9].pack("C*").unpack1("H*")
148
182
  elsif type == "String"
@@ -257,4 +291,27 @@ class CLValueSerializer
257
291
  "Undefined"
258
292
  end
259
293
  end
260
- end
294
+
295
+ def serialize_option_cl_value(data)
296
+
297
+ =begin
298
+ # Solution 1
299
+ # puts "\nOption:"
300
+ cl_type = data[:cl_type]
301
+ bytes = data[:bytes]
302
+ parsed = data[:parsed]
303
+
304
+ if cl_type == "U64"
305
+ length = bytes.length/2
306
+ # puts length
307
+ bytes = bytes[2..]
308
+ value = Utils::ByteUtils.hex_to_u64_value(bytes)
309
+ # puts value == 1650706686882
310
+ clvalue = CLu64.new(value)
311
+ tag = CLType::TAGS[cl_type.to_sym]
312
+ # puts "U64: " + [length].pack("L<*").unpack1("H*") + "01" + bytes + "0d" + [tag].pack("C*").unpack1("H*")
313
+ [length].pack("L<*").unpack1("H*") + "01" + bytes + "0d" + [tag].pack("C*").unpack1("H*")
314
+ end
315
+ =end
316
+ end
317
+ end