diff --git a/bin/get_available_addresses b/bin/get_available_addresses new file mode 100755 index 0000000000000000000000000000000000000000..38b4aee02f0ac9534fa43a9c613297294f8b2b2c --- /dev/null +++ b/bin/get_available_addresses @@ -0,0 +1,26 @@ +#!/usr/bin/ruby +# frozen_string_literal: true + +require "redis" +require "dhall" +require "set" +require_relative "../lib/redis_addresses" +require_relative "../lib/electrum" + +config = + Dhall::Coder + .new(safe: Dhall::Coder::JSON_LIKE + [Symbol, Proc]) + .load(ARGV[0], transform_keys: :to_sym) + +redis = Redis.new +electrum = Electrum.new(**config) + +addresses = Set.new(electrum.listaddresses) + +RedisBtcAddresses.each_user(redis) do |_, addrs| + addresses.subtract(addrs) +end + +unless addresses.empty? + redis.sadd("jmp_available_btc_addresses", addresses.to_a) +end diff --git a/lib/redis_addresses.rb b/lib/redis_addresses.rb index 17a5a1e10b273bef430b9597c102217350cc198f..156644043d8ddf8c30cd2f25c71bc8198fda371f 100644 --- a/lib/redis_addresses.rb +++ b/lib/redis_addresses.rb @@ -22,3 +22,16 @@ def get_addresses_with_users(redis) addrs end + +module RedisBtcAddresses + def self.each_user(redis) + # I picked 1000 because it made a relatively trivial case take 15 seconds + # instead of forever. + # Basically it's "how long does each command take" + # The lower it is (default is 10), it will go back and forth to the client a + # ton + redis.scan_each(match: "jmp_customer_btc_addresses-*", count: 1000) do |key| + yield key, redis.smembers(key) + end + end +end