Class: Peatio::Infura::Wallet

Inherits:
Wallet::Abstract
  • Object
show all
Defined in:
lib/peatio/infura/wallet.rb

Constant Summary collapse

DEFAULT_ETH_FEE =
{ gas_limit: 21_000, gas_price: 1_000_000_000 }.freeze
DEFAULT_ERC20_FEE =
{ gas_limit: 90_000, gas_price: 1_000_000_000 }.freeze

Instance Method Summary collapse

Constructor Details

#initialize(settings = {}) ⇒ Wallet

Returns a new instance of Wallet.



9
10
11
# File 'lib/peatio/infura/wallet.rb', line 9

def initialize(settings = {})
  @settings = settings
end

Instance Method Details

#configure(settings = {}) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/peatio/infura/wallet.rb', line 13

def configure(settings = {})
  # Clean client state during configure.
  @client = nil

  @settings.merge!(settings.slice(*SUPPORTED_SETTINGS))

  @wallet = @settings.fetch(:wallet) do
    raise Peatio::Wallet::MissingSettingError, :wallet
  end.slice(:uri, :address, :secret)

  @currency = @settings.fetch(:currency) do
    raise Peatio::Wallet::MissingSettingError, :currency
  end.slice(:id, :base_factor, :options)
end

#create_address!(options = {}) ⇒ Object



28
29
30
31
32
33
34
35
36
# File 'lib/peatio/infura/wallet.rb', line 28

def create_address!(options = {})
  secret = options.fetch(:secret) { PasswordGenerator.generate(64) }
  secret.yield_self do |password|
    { address: normalize_address(client.json_rpc(:personal_newAccount, [password])),
      secret:  password }
  end
rescue Infura::Client::Error => e
  raise Peatio::Wallet::ClientError, e
end

#create_transaction!(transaction, options = {}) ⇒ Object



38
39
40
41
42
43
44
45
46
# File 'lib/peatio/infura/wallet.rb', line 38

def create_transaction!(transaction, options = {})
  if @currency.dig(:options, :erc20_contract_address).present?
    create_erc20_transaction!(transaction)
  else
    create_eth_transaction!(transaction, options)
  end
rescue Infura::Client::Error => e
  raise Peatio::Wallet::ClientError, e
end

#load_balance!Object



65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/peatio/infura/wallet.rb', line 65

def load_balance!
  if @currency.dig(:options, :erc20_contract_address).present?
    load_erc20_balance(@wallet.fetch(:address))
  else
    client.json_rpc(:eth_getBalance, [normalize_address(@wallet.fetch(:address)), 'latest'])
        .hex
        .to_d
        .yield_self { |amount| convert_from_base_unit(amount) }
  end
rescue Infura::Client::Error => e
  raise Peatio::Wallet::ClientError, e
end

#prepare_deposit_collection!(transaction, deposit_spread, deposit_currency) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/peatio/infura/wallet.rb', line 48

def prepare_deposit_collection!(transaction, deposit_spread, deposit_currency)
  # TODO: Add spec for this behaviour.
  # Don't prepare for deposit_collection in case of eth deposit.
  return [] if deposit_currency.dig(:options, :erc20_contract_address).blank?

  options = DEFAULT_ERC20_FEE.merge(deposit_currency.fetch(:options).slice(:gas_limit, :gas_price))

  # We collect fees depending on the number of spread deposit size
  # Example: if deposit spreads on three wallets need to collect eth fee for 3 transactions
  fees = convert_from_base_unit(options.fetch(:gas_limit).to_i * options.fetch(:gas_price).to_i)
  transaction.amount = fees * deposit_spread.size

  [create_eth_transaction!(transaction)]
rescue Infura::Client::Error => e
  raise Peatio::Wallet::ClientError, e
end