lib/eth.rb



require 'digest/sha3'
require 'ffi'
require 'money-tree'
require 'rlp'

module Eth
  BYTE_ZERO = "\x00".freeze
  UINT_MAX = 2**256 - 1

  autoload :Address, 'eth/address'
  autoload :Gas, 'eth/gas'
  autoload :Key, 'eth/key'
  autoload :OpenSsl, 'eth/open_ssl'
  autoload :Secp256k1, 'eth/secp256k1'
  autoload :Sedes, 'eth/sedes'
  autoload :Tx, 'eth/tx'
  autoload :Utils, 'eth/utils'

  class << self
    def configure
      yield(configuration)
    end

    def replayable_chain_id
      27
    end

    def chain_id
      configuration.chain_id
    end

    def v_base
      replayable_chain_id
    end

    def replayable_v?(v)
      [replayable_chain_id, replayable_chain_id + 1].include? v
    end

    def tx_data_hex?
      !!configuration.tx_data_hex
    end

    def chain_id_from_signature(signature)
      return nil if Eth.replayable_v?(signature[:v])

      cid = (signature[:v] - 35) / 2
      (cid < 1) ? nil : cid
    end

    private

    def configuration
      @configuration ||= Configuration.new
    end
  end

  class Configuration
    attr_accessor :chain_id, :tx_data_hex

    def initialize
      self.chain_id = nil
      self.tx_data_hex = true
    end
  end

  class ValidationError < StandardError; end
  class InvalidTransaction < ValidationError; end
end