casper_network 0.2.1 → 1.0.1

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 (135) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -4
  3. data/lib/casper_network.rb +62 -8
  4. data/lib/crypto/00_asymmetric_key.rb +95 -0
  5. data/lib/crypto/01_ed25519.rb +67 -0
  6. data/lib/crypto/asymmetric_key.rb +87 -0
  7. data/lib/crypto/ed25519_key.rb +44 -0
  8. data/lib/crypto/key_pair.rb +40 -0
  9. data/lib/crypto/keys.rb +7 -0
  10. data/lib/crypto/secp256k1_key.rb +0 -0
  11. data/lib/crypto/test_ed25519_key.rb +44 -0
  12. data/lib/entity/account.rb +45 -0
  13. data/lib/entity/action_thresholds.rb +25 -0
  14. data/lib/entity/associated_key.rb +24 -0
  15. data/lib/entity/auction_state.rb +1 -0
  16. data/lib/entity/bid.rb +1 -0
  17. data/lib/entity/bid_info.rb +1 -0
  18. data/lib/entity/contract.rb +47 -0
  19. data/lib/entity/contract_package.rb +41 -0
  20. data/lib/entity/contract_version.rb +33 -0
  21. data/lib/entity/delegator.rb +1 -0
  22. data/lib/entity/deploy.rb +1 -0
  23. data/lib/entity/deploy_approval.rb +8 -6
  24. data/lib/entity/deploy_executable.rb +155 -1
  25. data/lib/entity/deploy_executable_item_internal.rb +27 -0
  26. data/lib/entity/deploy_executable_transfer.rb +51 -0
  27. data/lib/entity/deploy_hash.rb +1 -0
  28. data/lib/entity/deploy_header.rb +18 -15
  29. data/lib/entity/deploy_info.rb +45 -0
  30. data/lib/entity/deploy_named_argument.rb +20 -0
  31. data/lib/entity/deploy_transfer.rb +11 -0
  32. data/lib/entity/disabled_version.rb +26 -0
  33. data/lib/entity/era_info.rb +18 -0
  34. data/lib/entity/era_summary.rb +1 -0
  35. data/lib/entity/era_validator.rb +1 -0
  36. data/lib/entity/executable_deploy_item.rb +11 -0
  37. data/lib/entity/group.rb +25 -0
  38. data/lib/entity/module_bytes.rb +51 -0
  39. data/lib/entity/peer.rb +1 -0
  40. data/lib/entity/seigniorage_allocation.rb +18 -0
  41. data/lib/entity/stored_contract_by_hash.rb +51 -0
  42. data/lib/entity/stored_contract_by_name.rb +52 -0
  43. data/lib/entity/stored_value.rb +57 -0
  44. data/lib/entity/stored_versioned_contract_by_hash.rb +63 -0
  45. data/lib/entity/stored_versioned_contract_by_name.rb +63 -0
  46. data/lib/entity/transfer.rb +66 -0
  47. data/lib/entity/validator_weight.rb +1 -0
  48. data/lib/entity/vesting_schedule.rb +22 -0
  49. data/lib/include.rb +18 -0
  50. data/lib/rpc/rpc.rb +227 -0
  51. data/lib/rpc/rpc_client.rb +45 -39
  52. data/lib/rpc/rpc_error.rb +1 -0
  53. data/lib/serialization/cl_type_serializer.rb +77 -0
  54. data/lib/serialization/cl_value_bytes_parsers.rb +498 -0
  55. data/lib/serialization/cl_value_serializer.rb +260 -0
  56. data/lib/serialization/deploy_approval_serializer.rb +16 -0
  57. data/lib/serialization/deploy_executable_serializer.rb +27 -0
  58. data/lib/serialization/deploy_header_serializer.rb +49 -0
  59. data/lib/serialization/deploy_named_arg_serializer.rb +20 -0
  60. data/lib/serialization/deploy_serializer.rb +269 -0
  61. data/lib/serialization/test.rb +431 -0
  62. data/lib/types/cl_account_hash.rb +24 -0
  63. data/lib/types/cl_account_hash_type.rb +22 -0
  64. data/lib/types/cl_any.rb +25 -0
  65. data/lib/types/cl_any_type.rb +22 -0
  66. data/lib/types/cl_bool.rb +32 -0
  67. data/lib/types/cl_bool_type.rb +35 -0
  68. data/lib/types/cl_byte_array.rb +25 -0
  69. data/lib/types/cl_byte_array_type.rb +27 -0
  70. data/lib/types/cl_i32.rb +26 -0
  71. data/lib/types/cl_i32_type.rb +26 -0
  72. data/lib/types/cl_i64.rb +26 -0
  73. data/lib/types/cl_i64_type.rb +27 -0
  74. data/lib/types/cl_key.rb +39 -0
  75. data/lib/types/cl_key_type.rb +27 -0
  76. data/lib/types/cl_list.rb +25 -0
  77. data/lib/types/cl_list_type.rb +26 -0
  78. data/lib/types/cl_map.rb +25 -0
  79. data/lib/types/cl_map_type.rb +26 -0
  80. data/lib/types/cl_option.rb +33 -0
  81. data/lib/types/cl_option_type.rb +52 -0
  82. data/lib/types/cl_public_key.rb +152 -0
  83. data/lib/types/cl_public_key_type.rb +26 -0
  84. data/lib/types/cl_result.rb +25 -0
  85. data/lib/types/cl_result_type.rb +26 -0
  86. data/lib/types/cl_string.rb +39 -0
  87. data/lib/types/cl_string_type.rb +32 -0
  88. data/lib/types/cl_tuple.rb +151 -0
  89. data/lib/types/cl_tuple_type.rb +108 -0
  90. data/lib/types/cl_type.rb +96 -0
  91. data/lib/types/cl_type_tag.rb +51 -0
  92. data/lib/types/cl_u128.rb +26 -0
  93. data/lib/types/cl_u128_type.rb +26 -0
  94. data/lib/types/cl_u256.rb +26 -0
  95. data/lib/types/cl_u256_type.rb +26 -0
  96. data/lib/types/cl_u32.rb +26 -0
  97. data/lib/types/cl_u32_type.rb +26 -0
  98. data/lib/types/cl_u512.rb +26 -0
  99. data/lib/types/cl_u512_type.rb +26 -0
  100. data/lib/types/cl_u64.rb +26 -0
  101. data/lib/types/cl_u64_type.rb +27 -0
  102. data/lib/types/cl_u8.rb +26 -0
  103. data/lib/types/cl_u8_type.rb +26 -0
  104. data/lib/types/cl_unit.rb +38 -0
  105. data/lib/types/cl_unit_type.rb +22 -0
  106. data/lib/types/cl_uref.rb +120 -0
  107. data/lib/types/cl_uref_type.rb +46 -0
  108. data/lib/types/cl_value.rb +11 -0
  109. data/lib/types/constants.rb +50 -0
  110. data/lib/types/error.rb +7 -0
  111. data/lib/utils/base_16.rb +18 -0
  112. data/lib/utils/byte_utils.rb +107 -0
  113. data/lib/utils/find_byte_parser_by_cl_type.rb +53 -0
  114. data/lib/utils/hash_utils.rb +19 -0
  115. data/lib/utils/hex_utils.rb +12 -0
  116. data/lib/utils/time_utils.rb +85 -0
  117. data/lib/utils/utils.rb +2 -0
  118. data/lib/version.rb +3 -0
  119. data/spec/a_spec.rb +697 -0
  120. data/spec/byte_utils_spec.rb +72 -0
  121. data/spec/cl_public_spec.rb +169 -0
  122. data/spec/cl_types_spec.rb +715 -0
  123. data/spec/cl_value_serializer_spec.rb +140 -0
  124. data/spec/crypto_spec.rb +42 -0
  125. data/spec/deploy_approval_serializer_spec.rb +26 -0
  126. data/spec/deploy_executable_serializer_spec.rb +0 -0
  127. data/spec/deploy_header_serializer_spec.rb +21 -0
  128. data/spec/deploy_named_arg_serializer_spec.rb +49 -0
  129. data/spec/deploy_serializer_spec.rb +77 -0
  130. data/spec/deploy_serializer_test_spec.rb +225 -0
  131. data/spec/mainnet_spec.rb +8 -8
  132. data/spec/string_spec.rb +68 -0
  133. data/spec/testnet_spec.rb +11 -11
  134. data/spec/time_utils_spec.rb +87 -0
  135. metadata +130 -2
@@ -0,0 +1,260 @@
1
+ require_relative '../types/cl_type.rb'
2
+ require_relative '../types/cl_bool.rb'
3
+ require_relative '../types/cl_i32.rb'
4
+ require_relative '../types/cl_i64.rb'
5
+ require_relative '../types/cl_u8.rb'
6
+ require_relative '../types/cl_u32.rb'
7
+ require_relative '../types/cl_u64.rb'
8
+ require_relative '../types/cl_u128.rb'
9
+ require_relative '../types/cl_u256.rb'
10
+ require_relative '../types/cl_u512.rb'
11
+ require_relative '../types/cl_unit.rb'
12
+ require_relative '../types/cl_tuple.rb'
13
+ require_relative '../types/cl_uref.rb'
14
+ require_relative '../types/cl_option.rb'
15
+ require_relative '../types/cl_string.rb'
16
+ # require_relative '../types/cl_key.rb'
17
+ require_relative '../types/cl_uref.rb'
18
+ require_relative '../types/cl_tuple.rb'
19
+ require_relative '../types/cl_public_key.rb'
20
+ require_relative '../types/constants.rb'
21
+ require_relative '../serialization/cl_value_bytes_parsers.rb'
22
+
23
+ # Byte serializer for CLValue
24
+ class CLValueSerializer
25
+
26
+ def to_bytes(clvalue)
27
+ type = clvalue.get_cl_type
28
+ value = clvalue.get_value
29
+ 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*")
35
+ serialized = ""
36
+ if type == "Bool"
37
+ [1].pack("L<*").unpack1("H*") + [value.to_i].pack("C*").unpack1("H*") + [tag].pack("C*").unpack1("H*")
38
+ elsif type == "I32"
39
+ [4].pack("L<*").unpack1("H*") + [value].pack("l<*").unpack1("H*") + [tag].pack("C*").unpack1("H*")
40
+ elsif type == "I64"
41
+ [8].pack("L<*").unpack1("H*") + [value].pack("q<*").unpack1("H*") + [tag].pack("C*").unpack1("H*")
42
+ elsif type == "U8"
43
+ [1].pack("L<*").unpack1("H*") + [value].pack("C*").unpack1("H*") + [tag].pack("C*").unpack1("H*")
44
+ elsif type == "U32"
45
+ serialized += [4].pack("L<*").unpack1("H*") + [value].pack("L<*").unpack1("H*") + [tag].pack("C*").unpack1("H*")
46
+ elsif type == "U64"
47
+ [8].pack("L<*").unpack1("H*") + [value].pack("Q<*").unpack1("H*") + [tag].pack("C*").unpack1("H*")
48
+ elsif type == "U128"
49
+ [8].pack("L<*").unpack1("H*")
50
+ elsif type == "U256"
51
+ [8].pack("L<*").unpack1("H*")
52
+ elsif type == "U512"
53
+ [8].pack("L<*").unpack1("H*")
54
+ elsif type == "Unit"
55
+ [0].pack("L<*").unpack1("H*") + [tag].pack("C*").unpack1("H*")
56
+ elsif type == "String"
57
+ length = CLValueBytesParsers::CLStringBytesParser.to_bytes(value).length
58
+ [length/2].pack("L<*").unpack1("H*") + CLValueBytesParsers::CLStringBytesParser.to_bytes(value) + [tag].pack("C*").unpack1("H*")
59
+ elsif type == "Key"
60
+ [11].pack("C*").unpack1("H*")
61
+ elsif type == "URef"
62
+ uref = clvalue.get_value
63
+ size = clvalue.to_bytes(uref).length/2
64
+ [size].pack("L<*").unpack1("H*") + clvalue.to_bytes(uref) + [tag].pack("C*").unpack1("H*")
65
+ elsif type == "Option"
66
+ [0].pack("L<*").unpack1("H*")
67
+ elsif type == "List"
68
+ [0].pack("L<*").unpack1("H*")
69
+ elsif type == "ByteArray"
70
+ [0].pack("L<*").unpack1("H*")
71
+ elsif type == "Result"
72
+ [0].pack("L<*").unpack1("H*")
73
+ elsif type == "Map"
74
+ [0].pack("L<*").unpack1("H*")
75
+ elsif type == "Tuple1"
76
+ clvalue1 = clvalue.get_value[0]
77
+ type1 = clvalue1.get_cl_type
78
+ value1 = clvalue1.get_value
79
+ tag1 = CLType::TAGS[type1.to_sym]
80
+ 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
+ elsif type == "Tuple2"
83
+ clvalue1 = clvalue.get_value[0]
84
+ type1 = clvalue1.get_cl_type
85
+ value1 = clvalue1.get_value
86
+ tag1 = CLType::TAGS[type1.to_sym]
87
+
88
+ clvalue2 = clvalue.get_value[1]
89
+ type2 = clvalue2.get_cl_type
90
+ value2 = clvalue2.get_value
91
+ tag2 = CLType::TAGS[type2.to_sym]
92
+
93
+ len = only_length(clvalue.get_value[0]) + only_length(clvalue.get_value[1])
94
+ [len].pack("L<*").unpack1("H*") + only_value(clvalue.get_value[0]) + only_value(clvalue.get_value[1]) +
95
+ [tag].pack("C*").unpack1("H*") + [tag1].pack("C*").unpack1("H*") + [tag2].pack("C*").unpack1("H*")
96
+ elsif type == "Tuple3"
97
+ clvalue1 = clvalue.get_value[0]
98
+ type1 = clvalue1.get_cl_type
99
+ value1 = clvalue1.get_value
100
+ tag1 = CLType::TAGS[type1.to_sym]
101
+
102
+ clvalue2 = clvalue.get_value[1]
103
+ type2 = clvalue2.get_cl_type
104
+ value2 = clvalue2.get_value
105
+ tag2 = CLType::TAGS[type2.to_sym]
106
+
107
+ clvalue3 = clvalue.get_value[2]
108
+ type3 = clvalue3.get_cl_type
109
+ value3 = clvalue3.get_value
110
+ tag3 = CLType::TAGS[type3.to_sym]
111
+
112
+ len = only_length(clvalue.get_value[0]) + only_length(clvalue.get_value[1]) + only_length(clvalue.get_value[2])
113
+ [len].pack("L<*").unpack1("H*") + only_value(clvalue.get_value[0]) + only_value(clvalue.get_value[1]) + only_value(clvalue.get_value[2]) +
114
+ [tag].pack("C*").unpack1("H*") + [tag1].pack("C*").unpack1("H*") + [tag2].pack("C*").unpack1("H*") + [tag3].pack("C*").unpack1("H*")
115
+ elsif type == "Any"
116
+ [0].pack("L<*").unpack1("H*")
117
+ elsif type == "PublicKey"
118
+ [clvalue.to_hex.length/2].pack("L<*").unpack1("H*") + clvalue.to_hex + [tag].pack("C*").unpack1("H*")
119
+ else
120
+ "Undefined"
121
+ end
122
+ end
123
+
124
+ def helper(clvalue)
125
+ type = clvalue.get_cl_type
126
+ value = clvalue.get_value
127
+ serialized = ""
128
+ if type == "Bool"
129
+ [1].pack("L<*").unpack1("H*") + [value.to_i].pack("C*").unpack1("H*")
130
+ elsif type == "I32"
131
+ [4].pack("L<*").unpack1("H*") + [value].pack("l<*").unpack1("H*")
132
+ elsif type == "I64"
133
+ [8].pack("L<*").unpack1("H*") + [value].pack("q<*").unpack1("H*")
134
+ elsif type == "U8"
135
+ [1].pack("L<*").unpack1("H*") + [value].pack("C*").unpack1("H*")
136
+ elsif type == "U32"
137
+ serialized += [4].pack("L<*").unpack1("H*") + [value].pack("L<*").unpack1("H*")
138
+ elsif type == "U64"
139
+ [8].pack("L<*").unpack1("H*") + [value].pack("Q<*").unpack1("H*")
140
+ elsif type == "U128"
141
+ [8].pack("L<*").unpack1("H*")
142
+ elsif type == "U256"
143
+ [8].pack("L<*").unpack1("H*")
144
+ elsif type == "U512"
145
+ [8].pack("L<*").unpack1("H*")
146
+ elsif type == "Unit"
147
+ [9].pack("C*").unpack1("H*")
148
+ elsif type == "String"
149
+ length = CLValueBytesParsers::CLStringBytesParser.to_bytes(value).length
150
+ [length/2].pack("L<*").unpack1("H*") + CLValueBytesParsers::CLStringBytesParser.to_bytes(value)
151
+ elsif type == "Key"
152
+ [11].pack("C*").unpack1("H*")
153
+ elsif type == "URef"
154
+ uref = clvalue.get_value
155
+ size = clvalue.to_bytes(uref).length/2
156
+ [size].pack("L<*").unpack1("H*") + clvalue.to_bytes(uref)
157
+ elsif type == "Option"
158
+ [0].pack("L<*").unpack1("H*")
159
+ elsif type == "List"
160
+ [0].pack("L<*").unpack1("H*")
161
+ elsif type == "ByteArray"
162
+ [0].pack("L<*").unpack1("H*")
163
+ elsif type == "Result"
164
+ [0].pack("L<*").unpack1("H*")
165
+ elsif type == "Map"
166
+ [0].pack("L<*").unpack1("H*")
167
+ else
168
+ "Undefined"
169
+ end
170
+ end
171
+
172
+ def only_length(clvalue)
173
+ type = clvalue.get_cl_type
174
+ value = clvalue.get_value
175
+ if type == "Bool"
176
+ 1
177
+ elsif type == "I32"
178
+ 4
179
+ elsif type == "I64"
180
+ 8
181
+ elsif type == "U8"
182
+ 1
183
+ elsif type == "U32"
184
+ 4
185
+ elsif type == "U64"
186
+ 8
187
+ elsif type == "U128"
188
+ 8
189
+ elsif type == "U256"
190
+ 8
191
+ elsif type == "U512"
192
+ 8
193
+ elsif type == "Unit"
194
+ 8
195
+ elsif type == "String"
196
+ 4 + value.length
197
+ elsif type == "Key"
198
+ 32
199
+ elsif type == "URef"
200
+ uref = clvalue.get_value
201
+ size = clvalue.to_bytes(uref).length/2
202
+ elsif type == "Option"
203
+ 8
204
+ elsif type == "List"
205
+ 8
206
+ elsif type == "ByteArray"
207
+ 8
208
+ elsif type == "Result"
209
+ 8
210
+ elsif type == "Map"
211
+ 8
212
+ else
213
+ 0
214
+ end
215
+ end
216
+ def only_value(clvalue)
217
+ type = clvalue.get_cl_type
218
+ value = clvalue.get_value
219
+ if type == "Bool"
220
+ [value.to_i].pack("C*").unpack1("H*")
221
+ elsif type == "I32"
222
+ [value].pack("l<*").unpack1("H*")
223
+ elsif type == "I64"
224
+ [value].pack("q<*").unpack1("H*")
225
+ elsif type == "U8"
226
+ [value].pack("C*").unpack1("H*")
227
+ elsif type == "U32"
228
+ [value].pack("L<*").unpack1("H*")
229
+ elsif type == "U64"
230
+ [value].pack("Q<*").unpack1("H*")
231
+ elsif type == "U128"
232
+ [value].pack("Q<*").unpack1("H*")
233
+ elsif type == "U256"
234
+ [value].pack("Q<*").unpack1("H*")
235
+ elsif type == "U512"
236
+ [value].pack("Q<*").unpack1("H*")
237
+ elsif type == "Unit"
238
+ [value].pack("C*").unpack1("H*")
239
+ elsif type == "String"
240
+ CLValueBytesParsers::CLStringBytesParser.to_bytes(value)
241
+ elsif type == "Key"
242
+ [value].pack("C*").unpack1("H*")
243
+ elsif type == "URef"
244
+ uref = clvalue.get_value
245
+ clvalue.to_bytes(uref)
246
+ elsif type == "Option"
247
+ [0].pack("L<*").unpack1("H*")
248
+ elsif type == "List"
249
+ [0].pack("L<*").unpack1("H*")
250
+ elsif type == "ByteArray"
251
+ [0].pack("L<*").unpack1("H*")
252
+ elsif type == "Result"
253
+ [0].pack("L<*").unpack1("H*")
254
+ elsif type == "Map"
255
+ [0].pack("L<*").unpack1("H*")
256
+ else
257
+ "Undefined"
258
+ end
259
+ end
260
+ end
@@ -0,0 +1,16 @@
1
+ require_relative '../entity/deploy_approval.rb'
2
+ require_relative '../serialization/cl_value_bytes_parsers.rb'
3
+ require_relative '../utils/time_utils.rb'
4
+ require_relative '../utils/byte_utils.rb'
5
+
6
+ # Byte serializer for DeployApproval object
7
+ class DeployApprovalSerializer
8
+ def to_bytes(deploy_approval)
9
+ @approval_serializer = ""
10
+ @signer = deploy_approval.get_signer
11
+ @approval_serializer << @signer
12
+
13
+ @signature = deploy_approval.get_signature
14
+ @approval_serializer << @signature
15
+ end
16
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../entity/deploy_executable.rb'
2
+
3
+ # Byte serializer for DeployExecutable object
4
+ class DeployExecutableSerializer
5
+
6
+ def initialize
7
+ @deploy_executable = Casper::Entity::DeployExecutable.new
8
+ end
9
+
10
+ # @param [DeployExecutable] deploy_executable
11
+ def to_bytes(deploy_executable)
12
+ if deploy_executable.module_bytes?
13
+ deploy_executable.get_module_bytes.to_bytes
14
+ elsif deploy_executable.stored_contract_by_hash?
15
+ deploy_executable.stored_contract_by_hash.to_bytes
16
+ elsif deploy_executable.stored_contract_by_name?
17
+ deploy_executable.stored_contract_by_name.to_bytes
18
+ elsif deploy_executable.stored_versioned_contract_by_hash?
19
+ deploy_executable.stored_versioned_contract_by_hash.to_bytes
20
+ elsif deploy_executable.stored_versioned_contract_by_name?
21
+ deploy_executable.stored_versioned_contract_by_name.to_bytes
22
+ elsif deploy_executable.transfer?
23
+ deploy_executable.transfer.to_bytes
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,49 @@
1
+ require_relative '../entity/deploy_header.rb'
2
+ require_relative '../serialization/cl_value_bytes_parsers.rb'
3
+ require_relative '../utils/time_utils.rb'
4
+ require_relative '../utils/byte_utils.rb'
5
+
6
+ # Byte serializer for DeployHeader object
7
+ class DeployHeaderSerializer
8
+
9
+ # @param [DeployerHeader] deploy_header
10
+ # @return [String] serialized_header
11
+ def to_bytes(deploy_header)
12
+ @serialized_header = ""
13
+
14
+ @account = deploy_header.get_account
15
+ @serialized_account = @account
16
+ @serialized_header << @serialized_account
17
+
18
+ @timestamp = deploy_header.get_timestamp
19
+ timestamp_ms = Utils::TimeUtils.to_epoc_ms(@timestamp)
20
+ @serialized_timestamp = Utils::ByteUtils.to_u64(timestamp_ms)
21
+ @serialized_header << @serialized_timestamp
22
+
23
+ @ttl = deploy_header.get_ttl
24
+ ttl_ms = Utils::TimeUtils.ttl_to_milliseconds(@ttl)
25
+ @serialized_ttl = Utils::ByteUtils.to_u64(ttl_ms)
26
+ @serialized_header << @serialized_ttl
27
+
28
+ @gas_price = deploy_header.get_gas_price
29
+ @serialized_gas_price = Utils::ByteUtils.to_u64(@gas_price)
30
+ @serialized_header << @serialized_gas_price
31
+
32
+ @body_hash = deploy_header.get_body_hash
33
+ @serialized_body_hash = @body_hash
34
+ @serialized_header << @serialized_body_hash
35
+
36
+ @dependencies = deploy_header.get_dependencies
37
+ @serialized_dependencies = Utils::ByteUtils.to_u32(@dependencies.size) + @dependencies.join("")
38
+ @serialized_header << @serialized_dependencies
39
+
40
+ # @chain_name = CLString.new(deploy_header.get_chain_name)
41
+ # @serialized_chain_name = @chain_name.to_bytes(deploy_header.get_chain_name)
42
+ @chain_name = deploy_header.get_chain_name
43
+ @serialized_chain_name = CLValueBytesParsers::CLStringBytesParser.to_bytes(@chain_name)
44
+
45
+ @serialized_header << @serialized_chain_name
46
+ @serialized_header
47
+ end
48
+ end
49
+
@@ -0,0 +1,20 @@
1
+ require_relative '../entity/deploy_named_argument.rb'
2
+ require_relative '../utils/find_byte_parser_by_cl_type.rb'
3
+ require_relative '../utils/byte_utils.rb'
4
+ require_relative './cl_type_serializer.rb'
5
+ require_relative './cl_value_serializer.rb'
6
+
7
+ # Byte serializer for DeployNamedArg object
8
+ class DeployNamedArgSerializer
9
+
10
+ def to_bytes(arg)
11
+ name = arg.get_name
12
+ serialized_name = CLValueBytesParsers::CLStringBytesParser.to_bytes(name)
13
+ clvalue = arg.get_value
14
+ type = clvalue.get_cl_type
15
+
16
+ serializer = CLValueSerializer.new
17
+ serialized_value = serializer.to_bytes(clvalue)
18
+ serialized_name + serialized_value
19
+ end
20
+ end
@@ -0,0 +1,269 @@
1
+ require_relative './deploy_header_serializer'
2
+ require_relative './deploy_approval_serializer'
3
+ require_relative './deploy_executable_serializer'
4
+ require_relative './deploy_named_arg_serializer'
5
+ require_relative '../utils/byte_utils.rb'
6
+
7
+ # Byte serializer for Deploy object
8
+ class DeploySerializer
9
+
10
+ def to_bytes(deploy)
11
+ result = ""
12
+ deploy_header = Casper::Entity::DeployHeader.new(deploy.get_header)
13
+ result += DeployHeaderSerializer.new().to_bytes(deploy_header)
14
+
15
+ deploy_hash = Casper::Entity::DeployHash.new(deploy.get_hash)
16
+ result += deploy_hash.get_hash
17
+
18
+ payment = deploy.get_payment
19
+ session = deploy.get_session
20
+ if payment.keys[0] == :ModuleBytes
21
+ temp_args = []
22
+ module_bytes = payment[:ModuleBytes][:module_bytes]
23
+ args = payment[:ModuleBytes][:args]
24
+ module_bytes = Casper::Entity::ModuleBytes.new(module_bytes, args)
25
+ args.each do |arg|
26
+ name1 = arg[0]
27
+ clvalue_hash = arg[1]
28
+ clvalue = build_cl_value(arg[1])
29
+ # puts clvalue
30
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
31
+ end
32
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::ModuleBytes.new(module_bytes, temp_args).to_bytes)
33
+ result += temp
34
+ temp = nil
35
+ elsif payment.keys[0] == :StoredContractByHash
36
+ temp_args = []
37
+ hash = payment[:StoredContractByHash][:hash]
38
+ entry_point = payment[:StoredContractByHash][:entry_point]
39
+ args = payment[:StoredContractByHash][:args]
40
+ stored_contract_by_hash = Casper::Entity::StoredContractByHash.new(hash, entry_point, args)
41
+
42
+ args.each do |arg|
43
+ name1 = arg[0] # => "quantity"
44
+ clvalue_hash = arg[1] # => {:cl_type=>"I32", :bytes=>"e8030000", :parsed=>1000}
45
+ clvalue = build_cl_value(arg[1])
46
+ # puts clvalue
47
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
48
+ end
49
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::StoredContractByHash.new(name, entry_point, temp_args).to_bytes)
50
+ result += temp
51
+ temp = nil
52
+ elsif payment.keys[0] == :StoredContractByName
53
+ temp_args = []
54
+ name = payment[:StoredContractByName][:name]
55
+ entry_point = payment[:StoredContractByName][:entry_point]
56
+ args = payment[:StoredContractByName][:args]
57
+
58
+ stored_contract_by_name = Casper::Entity::StoredContractByName.new(name, entry_point, args)
59
+ args.each do |arg|
60
+ name1 = arg[0] # => "quantity"
61
+ clvalue_hash = arg[1] # => {:cl_type=>"I32", :bytes=>"e8030000", :parsed=>1000}
62
+ clvalue = build_cl_value(arg[1])
63
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
64
+ end
65
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::StoredContractByName.new(name, entry_point, temp_args).to_bytes)
66
+ result += temp
67
+ temp = nil
68
+ elsif payment.keys[0] == :StoredVersionedContractByHash
69
+ temp_args = []
70
+ hash = payment[:StoredVersionedContractByHash][:name]
71
+ version = payment[:StoredVersionedContractByHash][:version]
72
+ entry_point = payment[:StoredVersionedContractByHash][:entry_point]
73
+ args = payment[:StoredVersionedContractByHash][:args]
74
+
75
+ stored_versioned_contract_by_hash = Casper::Entity::StoredVersionedContractByHash.new(hash, version, entry_point, args)
76
+ args.each do |arg|
77
+ name1 = arg[0]
78
+ clvalue_hash = arg[1]
79
+ clvalue = build_cl_value(arg[1])
80
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
81
+ end
82
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::StoredVersionedContractByHash.new(name, version,entry_point, temp_args).to_bytes)
83
+ result += temp
84
+ temp = nil
85
+ elsif payment.keys[0] == :StoredVersionedContractByName
86
+ temp_args = []
87
+ name = payment[:StoredVersionedContractByName][:name]
88
+ version = payment[:StoredVersionedContractByName][:version]
89
+ entry_point = payment[:StoredVersionedContractByName][:entry_point]
90
+ args = payment[:StoredVersionedContractByName][:args]
91
+
92
+ stored_versioned_contract_by_name = Casper::Entity::StoredVersionedContractByName.new(name, version, entry_point, args)
93
+ args.each do |arg|
94
+ name1 = arg[0]
95
+ clvalue_hash = arg[1]
96
+ clvalue = build_cl_value(arg[1])
97
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
98
+ end
99
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::StoredVersionedContractByName.new(name, version,entry_point, temp_args).to_bytes)
100
+ result += temp
101
+ temp = nil
102
+ elsif payment.keys[0] == :Transfer
103
+ temp_args = []
104
+ args = payment[:Transfer][:args]
105
+
106
+ transfer = Casper::Entity::DeployExecutableTransfer.new(args)
107
+ args.each do |arg|
108
+ name1 = arg[0] # => "amount"
109
+ clvalue_hash = arg[1] # => {:cl_type=>"I32", :bytes=>"e8030000", :parsed=>1000}
110
+ clvalue = build_cl_value(arg[1])
111
+ # puts clvalue
112
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
113
+ end
114
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::DeployExecutableTransfer.new(temp_args).to_bytes)
115
+ result += temp
116
+ temp = nil
117
+ end
118
+
119
+ if session.keys[0] == :ModuleBytes
120
+ temp_args = []
121
+ module_bytes = session[:ModuleBytes][:module_bytes]
122
+ args = session[:ModuleBytes][:args]
123
+ module_bytes = Casper::Entity::ModuleBytes.new(module_bytes, args)
124
+ args.each do |arg|
125
+ name1 = arg[0]
126
+ clvalue_hash = arg[1]
127
+ clvalue = build_cl_value(arg[1])
128
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
129
+ end
130
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::ModuleBytes.new(module_bytes, temp_args).to_bytes)
131
+ result += temp
132
+ temp = nil
133
+ elsif session.keys[0] == :StoredContractByHash
134
+ temp_args = []
135
+ hash = session[:StoredContractByHash][:hash]
136
+ entry_point = session[:StoredContractByHash][:entry_point]
137
+ args = session[:StoredContractByHash][:args]
138
+ stored_contract_by_hash = Casper::Entity::StoredContractByHash.new(hash, entry_point, args)
139
+
140
+ args.each do |arg|
141
+ name1 = arg[0] # => "quantity"
142
+ clvalue_hash = arg[1] # => {:cl_type=>"I32", :bytes=>"e8030000", :parsed=>1000}
143
+ clvalue = build_cl_value(arg[1])
144
+ # puts clvalue
145
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
146
+ end
147
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::StoredContractByHash.new(name, entry_point, temp_args).to_bytes)
148
+ result += temp
149
+ temp = nil
150
+ elsif session.keys[0] == :StoredContractByName
151
+ temp_args = []
152
+ name = session[:StoredContractByName][:name]
153
+ entry_point = session[:StoredContractByName][:entry_point]
154
+ args = session[:StoredContractByName][:args]
155
+
156
+ stored_contract_by_name = Casper::Entity::StoredContractByName.new(name, entry_point, args)
157
+ args.each do |arg|
158
+ name1 = arg[0] # => "quantity"
159
+ clvalue_hash = arg[1] # => {:cl_type=>"I32", :bytes=>"e8030000", :parsed=>1000}
160
+ clvalue = build_cl_value(arg[1])
161
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
162
+ end
163
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::StoredContractByName.new(name, entry_point, temp_args).to_bytes)
164
+ result += temp
165
+ temp = nil
166
+ elsif session.keys[0] == :StoredVersionedContractByHash
167
+ temp_args = []
168
+ hash = session[:StoredVersionedContractByHash][:name]
169
+ version = session[:StoredVersionedContractByHash][:version]
170
+ entry_point = session[:StoredVersionedContractByHash][:entry_point]
171
+ args = session[:StoredVersionedContractByHash][:args]
172
+
173
+ stored_versioned_contract_by_hash = Casper::Entity::StoredVersionedContractByHash.new(hash, version, entry_point, args)
174
+ args.each do |arg|
175
+ name1 = arg[0]
176
+ clvalue_hash = arg[1]
177
+ clvalue = build_cl_value(arg[1])
178
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
179
+ end
180
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::StoredVersionedContractByHash.new(name, version,entry_point, temp_args).to_bytes)
181
+ result += temp
182
+ temp = nil
183
+ elsif session.keys[0] == :StoredVersionedContractByName
184
+ temp_args = []
185
+ name = session[:StoredVersionedContractByName][:name]
186
+ version = session[:StoredVersionedContractByName][:version]
187
+ entry_point = session[:StoredVersionedContractByName][:entry_point]
188
+ args = session[:StoredVersionedContractByName][:args]
189
+
190
+ stored_versioned_contract_by_name = Casper::Entity::StoredVersionedContractByName.new(name, version, entry_point, args)
191
+ args.each do |arg|
192
+ name1 = arg[0]
193
+ clvalue_hash = arg[1]
194
+ clvalue = build_cl_value(arg[1])
195
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
196
+ end
197
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::StoredVersionedContractByName.new(name, version,entry_point, temp_args).to_bytes)
198
+ result += temp
199
+ temp = nil
200
+
201
+ elsif session.keys[0] == :Transfer
202
+ temp_args = []
203
+ args = session[:Transfer][:args]
204
+
205
+ transfer = Casper::Entity::DeployExecutableTransfer.new(args)
206
+ args.each do |arg|
207
+ name1 = arg[0] # => "amount"
208
+ clvalue_hash = arg[1] # => {:cl_type=>"I32", :bytes=>"e8030000", :parsed=>1000}
209
+ clvalue = build_cl_value(arg[1])
210
+ # puts clvalue
211
+ temp_args << [Casper::Entity::DeployNamedArgument.new(name1, clvalue)]
212
+ end
213
+ temp = Utils::ByteUtils.byte_array_to_hex(Casper::Entity::DeployExecutableTransfer.new(temp_args).to_bytes)
214
+ result += temp
215
+ temp = nil
216
+ end
217
+
218
+ approvals = deploy.get_approvals
219
+ num_of_approvals = approvals.size
220
+ deploy_approval_serializer = DeployApprovalSerializer.new
221
+ result += Utils::ByteUtils.to_u32(num_of_approvals)
222
+ for approval in approvals
223
+ deploy_approval = Casper::Entity::DeployApproval.new(approval)
224
+ result += deploy_approval_serializer.to_bytes(deploy_approval)
225
+ end
226
+ # result
227
+ Utils::ByteUtils.hex_to_byte_array(result)
228
+ end
229
+
230
+ def build_cl_value(h = {})
231
+ cl_type = h[:cl_type]
232
+ bytes = h[:bytes]
233
+ parsed = h[:parsed]
234
+ if cl_type == "Bool"
235
+ CLValueBytesParsers::CLBoolBytesParser.from_bytes([bytes])
236
+ elsif cl_type == "I32"
237
+ value = Utils::ByteUtils.hex_to_integer(bytes)
238
+ CLi32.new(value)
239
+ elsif cl_type == "I64"
240
+ value = Utils::ByteUtils.hex_to_i64_value(bytes)
241
+ CLi64.new(value)
242
+ elsif cl_type == "U8"
243
+ value = Utils::ByteUtils.hex_to_u8_value(bytes)
244
+ CLu8.new(value)
245
+ elsif cl_type == "U32"
246
+ value = Utils::ByteUtils.hex_to_u32_value(bytes)
247
+ CLu32.new(value)
248
+ elsif cl_type == "U64"
249
+ value = Utils::ByteUtils.hex_to_u64_value(bytes)
250
+ CLu32.new(value)
251
+ elsif cl_type == "Unit"
252
+ # value = CLValueBytesParsers::CLUnitBytesParser.from_bytes(bytes)
253
+ if bytes == ""
254
+ value = nil
255
+ CLUnit.new(value)
256
+ end
257
+ elsif cl_type == "String"
258
+ value = CLValueBytesParsers::CLStringBytesParser.from_bytes(bytes)
259
+ CLString.new(value)
260
+ elsif cl_type == "URef"
261
+ value = Utils::ByteUtils.hex_to_byte_array(bytes)
262
+ CLValueBytesParsers::CLURefBytesParser.from_bytes(value)
263
+ elsif cl_type == "PublicKey"
264
+ CLPublicKey.from_hex(bytes)
265
+ end
266
+
267
+
268
+ end
269
+ end