diff --git a/lib/ckb/serializers/arg_serializer.rb b/lib/ckb/serializers/arg_serializer.rb index a4645f22..2635279f 100644 --- a/lib/ckb/serializers/arg_serializer.rb +++ b/lib/ckb/serializers/arg_serializer.rb @@ -7,7 +7,8 @@ class ArgSerializer # @param arg [String] def initialize(arg) - @bytes_serializer = BytesSerializer.new(arg) + items = arg.delete_prefix("0x").scan(/../) + @bytes_serializer = FixVecSerializer.new(items, ByteSerializer) end private diff --git a/lib/ckb/serializers/byte32_serializer.rb b/lib/ckb/serializers/byte32_serializer.rb index 0058b297..69db1adf 100644 --- a/lib/ckb/serializers/byte32_serializer.rb +++ b/lib/ckb/serializers/byte32_serializer.rb @@ -19,7 +19,8 @@ def layout end def body - value + items = value.delete_prefix("0x").scan(/../) + items.map { |item| ByteSerializer.new(item).serialize }.join("") end end end diff --git a/lib/ckb/serializers/bytes_serializer.rb b/lib/ckb/serializers/byte_serializer.rb similarity index 65% rename from lib/ckb/serializers/bytes_serializer.rb rename to lib/ckb/serializers/byte_serializer.rb index da229648..d991098c 100644 --- a/lib/ckb/serializers/bytes_serializer.rb +++ b/lib/ckb/serializers/byte_serializer.rb @@ -2,8 +2,8 @@ module CKB module Serializers - class BytesSerializer - include FixVecSerializer + class ByteSerializer + include BaseSerializer # @param value [String] def initialize(value) @@ -13,11 +13,13 @@ def initialize(value) private - attr_reader :value, :items_count + attr_reader :value - def item_layouts - return "" if value.nil? + def layout + body + end + def body value end end diff --git a/lib/ckb/serializers/fix_vec_serializer.rb b/lib/ckb/serializers/fix_vec_serializer.rb index f9434f4b..0bb87bbc 100644 --- a/lib/ckb/serializers/fix_vec_serializer.rb +++ b/lib/ckb/serializers/fix_vec_serializer.rb @@ -1,10 +1,18 @@ module CKB module Serializers - module FixVecSerializer + class FixVecSerializer include BaseSerializer + def initialize(items, item_serializer) + @items = items + @items_count = items.count + @item_serializer = item_serializer + end + private + attr_reader :items, :items_count, :item_serializer + def layout header + body end @@ -20,6 +28,12 @@ def body def body_capacity [body].pack("H*").bytesize end + + def item_layouts + return "" if items_count == 0 + + items.map { |item| item_serializer.new(item).serialize }.join("") + end end end end diff --git a/lib/ckb/serializers/header_deps_serializer.rb b/lib/ckb/serializers/header_deps_serializer.rb deleted file mode 100644 index 2e304d60..00000000 --- a/lib/ckb/serializers/header_deps_serializer.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -module CKB - module Serializers - class HeaderDepsSerializer - include FixVecSerializer - - # @param header_deps [String[]] - def initialize(header_deps) - @header_deps = header_deps - @items_count = header_deps.count - end - - private - - attr_reader :header_deps, :items_count - - def item_layouts - return "" if items_count == 0 - - header_deps.map { |header_dep| HeaderDepSerializer.new(header_dep).serialize }.join("") - end - end - end -end diff --git a/lib/ckb/serializers/output_data_serializer.rb b/lib/ckb/serializers/output_data_serializer.rb index 91b1efdc..a6aa525e 100644 --- a/lib/ckb/serializers/output_data_serializer.rb +++ b/lib/ckb/serializers/output_data_serializer.rb @@ -7,7 +7,8 @@ class OutputDataSerializer # @param output_data [String] def initialize(output_data) - @bytes_serializer = BytesSerializer.new(output_data) + items = output_data.delete_prefix("0x").scan(/../) + @bytes_serializer = FixVecSerializer.new(items, ByteSerializer) end private diff --git a/lib/ckb/serializers/raw_transaction_serializer.rb b/lib/ckb/serializers/raw_transaction_serializer.rb index 7c467c75..3d7a701e 100644 --- a/lib/ckb/serializers/raw_transaction_serializer.rb +++ b/lib/ckb/serializers/raw_transaction_serializer.rb @@ -9,7 +9,7 @@ class RawTransactionSerializer def initialize(transaction) @version_serializer = VersionSerializer.new(transaction.version) @cell_deps_serializer = DynVecSerializer.new(transaction.cell_deps, CellDepSerializer) - @header_deps_serializer = HeaderDepsSerializer.new(transaction.header_deps) + @header_deps_serializer = FixVecSerializer.new(transaction.header_deps, HeaderDepSerializer) @inputs_serializer = DynVecSerializer.new(transaction.inputs, InputSerializer) @outputs_serializer = DynVecSerializer.new(transaction.outputs, OutputSerializer) @outputs_data_serializer = DynVecSerializer.new(transaction.outputs_data, OutputDataSerializer) diff --git a/lib/ckb/serializers/serializers.rb b/lib/ckb/serializers/serializers.rb index 648b5586..282d92ee 100644 --- a/lib/ckb/serializers/serializers.rb +++ b/lib/ckb/serializers/serializers.rb @@ -7,14 +7,13 @@ require_relative "uint32_serializer" require_relative "uint64_serializer" require_relative "byte32_serializer" -require_relative "bytes_serializer" +require_relative "byte_serializer" require_relative "code_hash_serializer" require_relative "hash_type_serializer" require_relative "arg_serializer" require_relative "script_serializer" require_relative "version_serializer" require_relative "header_dep_serializer" -require_relative "header_deps_serializer" require_relative "dep_type_serializer" require_relative "cell_dep_serializer" require_relative "since_serializer"