Advertisement
nuringa

Untitled

Feb 9th, 2021
1,399
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 4.61 KB | None | 0 0
  1. module Worker
  2.   class EthClientToHot
  3.     attr_accessor :params, :rpc, :from_address, :fee
  4.  
  5.     def initialize
  6.       @logger = Logger.new("#{Rails.root}/log/check_erc20_to_huobi.log")
  7.     end
  8.  
  9.     def process(payload, metadata, delivery_info)
  10.       format_payload(payload)
  11.       params_data = create_from_payload(payload)
  12.       return nil unless params_data[:address]
  13.       process_transactions(params_data, payload)
  14.     rescue => error
  15.       ExceptionNotifier.notify_exception(error, data: {payload: payload})
  16.       raise $!
  17.     end
  18.  
  19.     def format_payload(payload)
  20.       payload.symbolize_keys!
  21.       @logger.info payload
  22.     end
  23.  
  24.     def create_from_payload(payload)
  25.       @rpc ||= Rpc.send(payload[:coin])
  26.       @from_address ||= payload[:from]
  27.       {
  28.         gas_price: get_gas_price,
  29.         amount: payload[:amount].to_d,
  30.         address: get_address(payload[:coin], amount),
  31.         gas_limit: get_gas_limit
  32.       }
  33.     end
  34.  
  35.     def get_gas_price
  36.       @logger.info rpc.get_gas_price
  37.     end
  38.  
  39.     def get_address(coin, amount)
  40.       @logger.info 'address'
  41.       @logger.info check_min_deposit(coin, amount)
  42.     end
  43.  
  44.     def check_min_deposit(coin, amount)
  45.       response = rpc.huobi_deposit_address
  46.  
  47.       if respose.blank? || insufficient_deposit?(coin, amount)
  48.         rpc.config['hot_wallet']
  49.       else
  50.         response['data']['address']
  51.       end
  52.     end
  53.  
  54.     def insufficient_deposit?(coin, amount)
  55.       asset = Asset.find(coin)
  56.       asset.min_deposit > amount
  57.     end
  58.  
  59.     def get_gas_limit
  60.       @logger.info rpc.get_gas_limit(params)
  61.     end
  62.  
  63.     def process_transactions(params_data, payload)
  64.       create_transaction_params(params_data)
  65.       insufficient_balance_transaction if balance_less_fee?
  66.       transfer_to_huobi_wallet(payload)
  67.     end
  68.  
  69.     def create_transaction_params(params_data)
  70.       create_params(params_data)
  71.       gas_limit = get_gas_limit
  72.       update_params(gas_limit)
  73.       create_fee(gas_limit, params_data)
  74.     end
  75.  
  76.     def create_params(params_data)
  77.       @params ||= rpc.params_for_transaction(
  78.         from_address,
  79.         params_data[:address],
  80.         params_data[:amount],
  81.         params_data[:gas_price]
  82.       )
  83.     end
  84.  
  85.     def update_params(gas_limit)
  86.       params[:gas] = "0x#{gas_limit.to_s(16)}"
  87.       @logger.info params
  88.     end
  89.  
  90.     def create_fee(gas_limit, params_data)
  91.       @fee ||= gas_limit * params_data[:gas_price] / 1e+18
  92.     end
  93.  
  94.     def balance_less_fee?
  95.       rpc_eth.get_balance(from_address) < fee
  96.     end
  97.  
  98.     def rpc_eth
  99.       @rpc_eth ||= Rpc.eth
  100.     end
  101.  
  102.     def insufficient_balance_transaction
  103.       @logger.info "balance < #{fee}"
  104.       from = get_from_address(fee)
  105.       @logger.info 'from address'
  106.       @logger.info from
  107.  
  108.       if from
  109.         create_rpc_transaction
  110.       else
  111.         withdraw_insufficient_funds
  112.       end
  113.     end
  114.  
  115.     def get_from_address(fee)
  116.       if rpc_eth.get_balance(CONFIG_ETH['erc20_fee_wallet']) > fee * 3
  117.         CONFIG_ETH['erc20_fee_wallet']
  118.       elsif rpc_eth.get_balance(CONFIG_ETH['hot_wallet']) > fee * 3
  119.         SystemMailer.not_enough_balance('ETH fee').deliver
  120.         CONFIG_ETH['hot_wallet']
  121.       end
  122.     end
  123.  
  124.     def create_rpc_transaction
  125.       @logger.info "create transaction amount: #{fee}"
  126.       @logger.info rpc_eth.create_transaction(from: from, to: from_address, amount: fee)
  127.     end
  128.  
  129.     def withdraw_insufficient_funds
  130.       SystemMailer.withdraw_insufficient_funds(
  131.         'Low balance to process Withdraw to huobi , amount < 0.006 ETH for erc20.'
  132.       ).deliver
  133.       # SystemMailer.not_enough_balance("ETH fee").deliver
  134.     end
  135.  
  136.     def transfer_to_huobi_wallet(payload, retry_count = 100)
  137.       log_retry(retry_count)
  138.       return if retry_count.zero?
  139.       sleep 1.minute
  140.  
  141.       if balance_less_fee?
  142.         @logger.info "balance < #{fee}"
  143.         transfer_to_huobi_wallet(payload, retry_count - 1)
  144.       else
  145.         rpc_send_transaction(payload, retry_count)
  146.       end
  147.     end
  148.  
  149.     def log_retry(retry_count)
  150.       @logger.info 'try transfer_to_huobi_wallet'
  151.       @logger.info retry_count
  152.     end
  153.  
  154.     def rpc_send_transaction(payload, retry_count)
  155.       @logger.info 'start transaction'
  156.       @logger.info 'create transaction'
  157.       txid = rpc.send_transaction(params)
  158.       @logger.info txid
  159.  
  160.       if txid
  161.         update_huobi_txid(payload)
  162.       else
  163.         sleep 1.minute
  164.         transfer_to_huobi_wallet(payload, retry_count - 1)
  165.       end
  166.     end
  167.  
  168.     def update_huobi_txid(payload)
  169.       PSIM::Deposit.find(payload[:deposit_id]).update(huobi_txid: txid)
  170.       @logger.info txid
  171.     end
  172.   end
  173. end
  174.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement