lib/starcoin/helpers.ex

defmodule Web3SuiEx.Starcoin.Helpers do
  @moduledoc """
  Common helpers.
  """

  def sha3_256(bytes), do: :crypto.hash(:sha3_256, bytes)

  def normalize_bytes(input, size) do
    cond do
      is_binary(input) ->
        input_size = byte_size(input)

        cond do
          input_size == size ->
            {:ok, input}

          input_size == size * 2 ->
            from_hex(input)

          input_size == size * 2 + 2 ->
            from_hex(input)

          true ->
            {:error, :bad_format}
        end

      is_integer(input) ->
        cond do
          input < 0 ->
            {:error, :negtive_integer}

          input >= Bitwise.bsl(1, size * 8) ->
            {:error, :integer_too_big}

          true ->
            bits = size * 8
            {:ok, <<input::size(bits)>>}
        end

      true ->
        {:error, :bad_type}
    end
  end

  def from_hex("0x" <> bytes), do: from_hex(bytes)
  def from_hex(bytes), do: Base.decode16(bytes, case: :mixed)

  def to_hex(bytes, format \\ nil) do
    case format do
      :bare ->
        Base.encode16(bytes, case: :lower)

      :address ->
        "0x" <> String.trim_leading(Base.encode16(bytes, case: :lower), "0")

      _ ->
        "0x" <> Base.encode16(bytes, case: :lower)
    end
  end

  def normalize_address(address), do: normalize_bytes(address, 16)

  def normalize_key(key), do: normalize_bytes(key, 32)
end