Module: RailsCryptoPayment

Defined in:
lib/rails_crypto_payment.rb,
lib/rails_crypto_payment/evm_rpc.rb,
lib/rails_crypto_payment/exchange_clients.rb

Defined Under Namespace

Classes: BinanceDepositClient, BybitDepositClient, Error, EvmRpc

Constant Summary collapse

MAX_UNIQUE_CODE =
9999
CODE_UNIT =
BigDecimal("0.000001")

Class Method Summary collapse

Class Method Details

.amount(base:, code:) ⇒ Object

Raises:

  • (ArgumentError)


18
19
20
21
22
23
# File 'lib/rails_crypto_payment.rb', line 18

def self.amount(base:, code:)
  number = Integer(code)
  raise ArgumentError, "code must be between 1 and #{MAX_UNIQUE_CODE}" unless (1..MAX_UNIQUE_CODE).cover?(number)

  BigDecimal(base.to_s) + number * CODE_UNIT
end

.available_codes(base:, reserved_amounts:) ⇒ Object



25
26
27
28
29
30
31
32
# File 'lib/rails_crypto_payment.rb', line 25

def self.available_codes(base:, reserved_amounts:)
  baseline = BigDecimal(base.to_s)
  reserved = reserved_amounts.each_with_object({}) do |value, codes|
    code = (BigDecimal(value.to_s) - baseline) / CODE_UNIT
    codes[code.to_i] = true if code.frac.zero? && (1..MAX_UNIQUE_CODE).cover?(code.to_i)
  end
  (1..MAX_UNIQUE_CODE).reject { |code| reserved.key?(code) }
end

.base_amount(idr:, rate:) ⇒ Object

Raises:

  • (ArgumentError)


11
12
13
14
15
16
# File 'lib/rails_crypto_payment.rb', line 11

def self.base_amount(idr:, rate:)
  exchange_rate = BigDecimal(rate.to_s)
  raise ArgumentError, "rate must be positive" unless exchange_rate.positive?

  (BigDecimal(idr.to_s) / exchange_rate).ceil(2)
end