Files
Dena/app/workers/daemons/deposit.rb
2026-08-13 19:50:53 +03:30

95 lines
3.5 KiB
Ruby

# frozen_string_literal: true
module Workers
module Daemons
class Deposit < Base
self.sleep_time = 60
def process
# Process deposits with `processing` state each minute
::Deposit.processing.each do |deposit|
Rails.logger.info { "Starting processing coin deposit with id: #{deposit.id}." }
wallet = Wallet.deposit_wallet(deposit.currency_id)
unless wallet
Rails.logger.warn { "Can't find active deposit wallet for currency with code: #{deposit.currency_id}."}
next
end
service = WalletService.new(wallet)
# Check if adapter has prepare_deposit_collection! implementation
if service.adapter.class.instance_methods(false).include?(:prepare_deposit_collection!)
begin
# Process fee collection for tokens
collect_fee(deposit)
# Will be processed after fee collection
next if deposit.fee_processing?
rescue StandardError => e
Rails.logger.error { "Failed to collect deposit fee #{deposit.id}. See exception details below." }
report_exception(e)
raise e if is_db_connection_error?(e)
next
end
end
process_deposit(deposit)
end
# Process deposits with `fee_processing` state that already collected fees for collection
::Deposit.fee_processing.where('updated_at < ?', 5.minute.ago).each do |deposit|
Rails.logger.info { "Starting processing token deposit with id: #{deposit.id}." }
process_deposit(deposit)
end
end
def process_deposit(deposit)
if deposit.spread.blank?
deposit.spread_between_wallets!
Rails.logger.warn { "The deposit was spreaded in the next way: #{deposit.spread}"}
end
wallet = Wallet.deposit_wallet(deposit.currency_id)
service = WalletService.new(wallet)
transactions = service.collect_deposit!(deposit, deposit.spread_to_transactions)
if transactions.present?
# Save txids in deposit spread.
deposit.update!(spread: transactions.map(&:as_json))
Rails.logger.warn { "The API accepted deposit collection and assigned transaction ID: #{transactions.map(&:as_json)}." }
deposit.dispatch!
else
deposit.skip!
"Skipped deposit with txid: #{deposit.txid} with amount: #{deposit.amount}"\
" to #{deposit.address}"
end
rescue StandardError => e
Rails.logger.error { "Failed to collect deposit #{deposit.id}. See exception details below." }
report_exception(e)
raise e if is_db_connection_error?(e)
end
def collect_fee(deposit)
if deposit.spread.blank?
deposit.spread_between_wallets!
Rails.logger.warn { "The deposit was spreaded in the next way: #{deposit.spread}"}
end
fee_wallet = Wallet.active.fee.find_by(blockchain_key: deposit.currency.blockchain_key)
unless fee_wallet
Rails.logger.warn { "Can't find active fee wallet for currency with code: #{deposit.currency_id}." }
return
end
transactions = WalletService.new(fee_wallet).deposit_collection_fees!(deposit, deposit.spread_to_transactions)
deposit.fee_process! if transactions.present?
Rails.logger.warn { "The API accepted token deposit collection fee and assigned transaction ID: #{transactions.map(&:as_json)}." }
end
end
end
end