Script to create Redis key of BTC addresses available to the app

Stephen Paul Weber created

Change summary

bin/get_available_addresses | 26 ++++++++++++++++++++++++++
lib/redis_addresses.rb      | 13 +++++++++++++
2 files changed, 39 insertions(+)

Detailed changes

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

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