module Eth::Chain
def is_legacy?(v)
-
(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)
-
(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)
-
(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)
-
(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