module Eth::Chain

def is_legacy?(v)

Returns:
  • (Boolean) - true if legacy value.

Parameters:
  • v (Integer) -- the signature's `v` value.
def is_legacy?(v)
  [27, 28].include? v
end

def to_chain_id(v)

Returns:
  • (Integer) - the chain id as per EIP-155 or `nil` if there is no replay protection.

Parameters:
  • v (Integer) -- the signature's `v` value.
def to_chain_id(v)
  return nil if v < 36
  chain_id = (v - 35) / 2
  return nil if chain_id < 1
  return chain_id
end

def to_recovery_id(v, chain_id = ETHEREUM)

Raises:
  • (ReplayProtectionError) - if the given `v` is invalid.

Returns:
  • (Integer) - the recovery id corresponding to `v`.

Parameters:
  • chain_id (Integer) -- the chain id the signature was generated on.
  • v (Integer) -- the signature's `v` value.
def to_recovery_id(v, chain_id = ETHEREUM)
  e = 0 + 2 * chain_id + 35
  i = 1 + 2 * chain_id + 35
  if [0, 1].include? v
    # some wallets are using a `v` of 0 or 1 (ledger)
    return v
  elsif is_legacy? v
    # this is the pre-EIP-155 legacy case
    return v - 27
  elsif [e, i].include? v
    # this is the EIP-155 case
    return v - 35 - 2 * chain_id
  else
    raise ReplayProtectionError, "Invalid v #{v} value for chain ID #{chain_id}. Invalid chain ID?"
  end
end

def to_v(recovery_id, chain_id = nil)

Returns:
  • (Integer) - the signature's `v` value.

Parameters:
  • chain_id (Integer) -- the chain id the signature was generated on.
  • recovery_id (Integer) -- signature recovery id.
def to_v(recovery_id, chain_id = nil)
  if chain_id.nil? or chain_id < 1
    v = 27 + recovery_id
  else
    v = 2 * chain_id + 35 + recovery_id
  end
  return v
end