Class: Peatio::Infura::Wallet
- Inherits:
-
Wallet::Abstract
- Object
- Wallet::Abstract
- Peatio::Infura::Wallet
- 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
- #configure(settings = {}) ⇒ Object
- #create_address!(options = {}) ⇒ Object
- #create_transaction!(transaction, options = {}) ⇒ Object
-
#initialize(settings = {}) ⇒ Wallet
constructor
A new instance of Wallet.
- #load_balance! ⇒ Object
- #prepare_deposit_collection!(transaction, deposit_spread, deposit_currency) ⇒ Object
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!( = {}) secret = .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, = {}) if @currency.dig(:options, :erc20_contract_address).present? create_erc20_transaction!(transaction) else create_eth_transaction!(transaction, ) 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? = 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(.fetch(:gas_limit).to_i * .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 |