From 2b5665540ed87f3a68eb67006b280fad307a84cc Mon Sep 17 00:00:00 2001
From: Damian Orzepowski <damian.orzepowski@4chain.studio>
Date: Wed, 14 Feb 2024 07:44:26 +0100
Subject: [PATCH] feat(BUX-417): remove code related to monitor agent that is
 not used and depends on centrifuge.

---
 chainstate/interface.go      |  20 ---
 chainstate/processor.go      | 269 -----------------------------------
 chainstate/processor_test.go | 244 -------------------------------
 go.mod                       |  11 --
 go.sum                       |  29 ----
 5 files changed, 573 deletions(-)
 delete mode 100644 chainstate/processor.go
 delete mode 100644 chainstate/processor_test.go

diff --git a/chainstate/interface.go b/chainstate/interface.go
index d64787d4..473b4c1c 100644
--- a/chainstate/interface.go
+++ b/chainstate/interface.go
@@ -7,7 +7,6 @@ import (
 
 	"github.com/BuxOrg/bux/utils"
 	"github.com/bitcoin-sv/go-broadcast-client/broadcast"
-	"github.com/centrifugal/centrifuge-go"
 	"github.com/tonicpow/go-minercraft/v2"
 )
 
@@ -53,22 +52,3 @@ type ClientInterface interface {
 	QueryTimeout() time.Duration
 	FeeUnit() *utils.FeeUnit
 }
-
-// SocketHandler is composite interface of centrifuge handlers interfaces
-type SocketHandler interface {
-	OnConnect(*centrifuge.Client, centrifuge.ConnectEvent)
-	OnDisconnect(*centrifuge.Client, centrifuge.DisconnectEvent)
-	OnError(*centrifuge.Client, centrifuge.ErrorEvent)
-	OnJoin(*centrifuge.Subscription, centrifuge.JoinEvent)
-	OnLeave(*centrifuge.Subscription, centrifuge.LeaveEvent)
-	OnMessage(*centrifuge.Client, centrifuge.MessageEvent)
-	OnPublish(*centrifuge.Subscription, centrifuge.PublishEvent)
-	OnServerJoin(*centrifuge.Client, centrifuge.ServerJoinEvent)
-	OnServerLeave(*centrifuge.Client, centrifuge.ServerLeaveEvent)
-	OnServerPublish(*centrifuge.Client, centrifuge.ServerPublishEvent)
-	OnServerSubscribe(*centrifuge.Client, centrifuge.ServerSubscribeEvent)
-	OnServerUnsubscribe(*centrifuge.Client, centrifuge.ServerUnsubscribeEvent)
-	OnSubscribeError(*centrifuge.Subscription, centrifuge.SubscribeErrorEvent)
-	OnSubscribeSuccess(*centrifuge.Subscription, centrifuge.SubscribeSuccessEvent)
-	OnUnsubscribe(*centrifuge.Subscription, centrifuge.UnsubscribeEvent)
-}
diff --git a/chainstate/processor.go b/chainstate/processor.go
deleted file mode 100644
index 618bf86f..00000000
--- a/chainstate/processor.go
+++ /dev/null
@@ -1,269 +0,0 @@
-package chainstate
-
-import (
-	"bytes"
-	"crypto/sha256"
-	"encoding/hex"
-	"encoding/json"
-	"errors"
-	"regexp"
-	"strings"
-
-	"github.com/rs/zerolog"
-	boom "github.com/tylertreat/BoomFilters"
-)
-
-// BloomProcessor bloom filter processor
-type BloomProcessor struct {
-	debug             bool
-	falsePositiveRate float64
-	filters           map[string]*BloomProcessorFilter
-	logger            *zerolog.Logger
-	maxCells          uint
-}
-
-// BloomProcessorFilter struct
-type BloomProcessorFilter struct {
-	Filter *boom.StableBloomFilter
-	regex  *regexp.Regexp
-}
-
-// NewBloomProcessor initialize a new bloom processor
-func NewBloomProcessor(maxCells uint, falsePositiveRate float64) *BloomProcessor {
-	return &BloomProcessor{
-		filters:           make(map[string]*BloomProcessorFilter),
-		maxCells:          maxCells,
-		falsePositiveRate: falsePositiveRate,
-	}
-}
-
-// Debug set debugging
-func (p *BloomProcessor) Debug(debug bool) {
-	p.debug = debug
-}
-
-// IsDebug return whether debugging is on/off
-func (p *BloomProcessor) IsDebug() bool {
-	return p.debug
-}
-
-// SetLogger set the logger
-func (p *BloomProcessor) SetLogger(logger *zerolog.Logger) {
-	p.logger = logger
-}
-
-// Logger return the logger
-func (p *BloomProcessor) Logger() *zerolog.Logger {
-	return p.logger
-}
-
-// GetHash get the hash of the current filter
-func (p *BloomProcessor) GetHash() string {
-	h := sha256.New()
-	for _, f := range p.filters {
-		if _, err := f.Filter.WriteTo(h); err != nil {
-			return ""
-		}
-	}
-	hash := h.Sum(nil)
-	return hex.EncodeToString(hash)
-}
-
-// GetFilters get all filters from the bloom processor
-func (p *BloomProcessor) GetFilters() map[string]*BloomProcessorFilter {
-	return p.filters
-}
-
-// SetFilter replace and set a filter
-func (p *BloomProcessor) SetFilter(regex string, filter []byte) error {
-	filterBuffer := bytes.NewBuffer(filter)
-	r, err := regexp.Compile(regex)
-	if err != nil {
-		return err
-	}
-
-	bloomFilter := &BloomProcessorFilter{
-		Filter: boom.NewDefaultStableBloomFilter(p.maxCells, p.falsePositiveRate),
-		regex:  r,
-	}
-	_, err = bloomFilter.Filter.ReadFrom(filterBuffer)
-	if err != nil {
-		return err
-	}
-
-	p.filters[regex] = bloomFilter
-	return nil
-}
-
-// Add a new item to the bloom filter
-func (p *BloomProcessor) Add(regexString, item string) error {
-
-	// check whether this regex filter already exists, otherwise initialize it
-	if p.filters[regexString] == nil {
-		r, err := regexp.Compile(regexString)
-		if err != nil {
-			return err
-		}
-		p.filters[regexString] = &BloomProcessorFilter{
-			Filter: boom.NewDefaultStableBloomFilter(p.maxCells, p.falsePositiveRate),
-			regex:  r,
-		}
-	}
-	p.filters[regexString].Filter.Add([]byte(item))
-
-	return nil
-}
-
-// Test checks whether the item is in the bloom filter
-func (p *BloomProcessor) Test(regexString, item string) bool {
-	if p.filters[regexString] == nil {
-		return false
-	}
-	return p.filters[regexString].Filter.Test([]byte(item))
-}
-
-// Reload the bloom filter from the DB
-func (p *BloomProcessor) Reload(regexString string, items []string) (err error) {
-	for _, item := range items {
-		if err = p.Add(regexString, item); err != nil {
-			return
-		}
-	}
-
-	return
-}
-
-// FilterTransactionPublishEvent check whether a filter matches a tx event
-func (p *BloomProcessor) FilterTransactionPublishEvent(eData []byte) (string, error) {
-	transaction := TxInfo{}
-	if err := json.Unmarshal(eData, &transaction); err != nil {
-		return "", err
-	}
-
-	if transaction.Error != "" {
-		return "", errors.New(transaction.Error)
-	}
-
-	for _, f := range p.filters {
-		lockingScripts := f.regex.FindAllString(string(eData), -1)
-		for _, ls := range lockingScripts {
-			if passes := f.Filter.Test([]byte(ls)); passes {
-				return transaction.Hex, nil
-			}
-		}
-	}
-
-	return "", nil
-}
-
-// FilterTransaction check whether a filter matches a tx event
-func (p *BloomProcessor) FilterTransaction(txHex string) (string, error) {
-
-	for _, f := range p.filters {
-		lockingScripts := f.regex.FindAllString(txHex, -1)
-		for _, ls := range lockingScripts {
-			if passes := f.Filter.Test([]byte(ls)); passes {
-				return txHex, nil
-			}
-		}
-	}
-
-	return "", nil
-}
-
-// RegexProcessor simple regex processor
-// This processor just uses regex checks to see if a raw hex string exists in a tx
-// This is bound to have some false positives but is somewhat performant when filter set is small
-type RegexProcessor struct {
-	debug  bool
-	filter []string
-	logger *zerolog.Logger
-}
-
-// NewRegexProcessor initialize a new regex processor
-func NewRegexProcessor() *RegexProcessor {
-	return &RegexProcessor{
-		filter: []string{},
-	}
-}
-
-// Debug set debugging
-func (p *RegexProcessor) Debug(debug bool) {
-	p.debug = debug
-}
-
-// IsDebug return whether debugging is on/off
-func (p *RegexProcessor) IsDebug() bool {
-	return p.debug
-}
-
-// SetLogger set the logger
-func (p *RegexProcessor) SetLogger(logger *zerolog.Logger) {
-	p.logger = logger
-}
-
-// Logger return the logger
-func (p *RegexProcessor) Logger() *zerolog.Logger {
-	return p.logger
-}
-
-// Add a new item to the processor
-func (p *RegexProcessor) Add(regex string, _ string) error {
-	p.filter = append(p.filter, regex)
-	return nil
-}
-
-// Test checks whether the item matches an item in the processor
-func (p *RegexProcessor) Test(_ string, item string) bool {
-	for _, f := range p.filter {
-		if strings.Contains(item, f) {
-			return true
-		}
-	}
-	return false
-}
-
-// Reload the items of the processor to match against
-func (p *RegexProcessor) Reload(_ string, items []string) (err error) {
-	for _, i := range items {
-		if err = p.Add(i, ""); err != nil {
-			return
-		}
-	}
-	return
-}
-
-// FilterTransactionPublishEvent check whether a filter matches a tx event
-func (p *RegexProcessor) FilterTransactionPublishEvent(eData []byte) (string, error) {
-	transaction := TxInfo{}
-	if err := json.Unmarshal(eData, &transaction); err != nil {
-		return "", err
-	}
-	if passes := p.Test("", transaction.Hex); !passes {
-		return "", nil
-	}
-	return transaction.Hex, nil
-}
-
-// FilterTransaction filters transaction
-func (p *RegexProcessor) FilterTransaction(hex string) (string, error) {
-	if passes := p.Test("", hex); passes {
-		return hex, nil
-	}
-	return "", nil
-}
-
-// GetHash get the hash of the filter
-func (p *RegexProcessor) GetHash() string {
-	return ""
-}
-
-// GetFilters get all filters from the bloom processor
-func (p *RegexProcessor) GetFilters() map[string]*BloomProcessorFilter {
-	return nil
-}
-
-// SetFilter replace and set a filter
-func (p *RegexProcessor) SetFilter(_ string, _ []byte) error {
-	return nil
-}
diff --git a/chainstate/processor_test.go b/chainstate/processor_test.go
deleted file mode 100644
index 366906eb..00000000
--- a/chainstate/processor_test.go
+++ /dev/null
@@ -1,244 +0,0 @@
-package chainstate
-
-import (
-	"fmt"
-	"testing"
-
-	"github.com/BuxOrg/bux/utils"
-	"github.com/bitcoinschema/go-bitcoin/v2"
-	"github.com/centrifugal/centrifuge-go"
-	"github.com/libsv/go-bt/v2/bscript"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	boom "github.com/tylertreat/BoomFilters"
-)
-
-const testTransactionHex = `0100000001979f9f1033357ab26d71381d40d94069fe2e795aed3b1bc9f28de57c57b278ed030000006a47304402207122f4592d4ddae3214bbafa9b25dd86516bc25698228a3ec1caf8d7b5fabf23022054c1347b421c55cc362227e00c5d18660271b670f2af2484ca1cb31f0ac405f2412102069a1aa13ed2c8f2d1bb7b4c3bee2e8333594ee0c0e2e9188157e8d08b8ceac9ffffffff0123020000000000001976a914a9041707efa4c2edea3e3b93c83330b55c6497d088ac00000000`
-
-// const testTransactionID = `512a47f5cfd2e7e22e3d440d3e8c445e41eba55b23ff5f3f696c7f106c22eab3`
-const testTransaction = `{
-    "txid": "512a47f5cfd2e7e22e3d440d3e8c445e41eba55b23ff5f3f696c7f106c22eab3",
-    "hash": "512a47f5cfd2e7e22e3d440d3e8c445e41eba55b23ff5f3f696c7f106c22eab3",
-    "hex": "0100000001979f9f1033357ab26d71381d40d94069fe2e795aed3b1bc9f28de57c57b278ed030000006a47304402207122f4592d4ddae3214bbafa9b25dd86516bc25698228a3ec1caf8d7b5fabf23022054c1347b421c55cc362227e00c5d18660271b670f2af2484ca1cb31f0ac405f2412102069a1aa13ed2c8f2d1bb7b4c3bee2e8333594ee0c0e2e9188157e8d08b8ceac9ffffffff0123020000000000001976a914a9041707efa4c2edea3e3b93c83330b55c6497d088ac00000000",
-    "size": 191,
-    "version": 1,
-    "locktime": 0,
-    "vin": [
-        {
-            "n": 0,
-            "txid": "ed78b2577ce58df2c91b3bed5a792efe6940d9401d38716db27a3533109f9f97",
-            "vout": 3,
-            "scriptSig": {
-                "asm": "304402207122f4592d4ddae3214bbafa9b25dd86516bc25698228a3ec1caf8d7b5fabf23022054c1347b421c55cc362227e00c5d18660271b670f2af2484ca1cb31f0ac405f241 02069a1aa13ed2c8f2d1bb7b4c3bee2e8333594ee0c0e2e9188157e8d08b8ceac9",
-                "hex": "47304402207122f4592d4ddae3214bbafa9b25dd86516bc25698228a3ec1caf8d7b5fabf23022054c1347b421c55cc362227e00c5d18660271b670f2af2484ca1cb31f0ac405f2412102069a1aa13ed2c8f2d1bb7b4c3bee2e8333594ee0c0e2e9188157e8d08b8ceac9"
-            },
-            "sequence": 4294967295,
-            "voutDetails": {
-                "value": 0.000007,
-                "n": 3,
-                "scriptPubKey": {
-                    "asm": "OP_DUP OP_HASH160 c98e4e2e5ee8ebcd3aad180dd1a95c464e56461f OP_EQUALVERIFY OP_CHECKSIG",
-                    "hex": "76a914c98e4e2e5ee8ebcd3aad180dd1a95c464e56461f88ac",
-                    "reqSigs": 1,
-                    "type": "pubkeyhash",
-                    "addresses": [
-                        "1KNjJ7PPYT4hjtT19H3dezLgFp6wWSqab5"
-                    ],
-                    "isTruncated": false
-                },
-                "scripthash": "8fa0ad201f31ef61df517873040da99b696bceb49c0f519a656c3c51c0e8bcb9"
-            }
-        }
-    ],
-    "vout": [
-        {
-            "value": 0.00000547,
-            "n": 0,
-            "scriptPubKey": {
-                "asm": "OP_DUP OP_HASH160 a9041707efa4c2edea3e3b93c83330b55c6497d0 OP_EQUALVERIFY OP_CHECKSIG",
-                "hex": "76a914a9041707efa4c2edea3e3b93c83330b55c6497d088ac",
-                "reqSigs": 1,
-                "type": "pubkeyhash",
-                "addresses": [
-                    "1GQg6bWrJyBtdsi34eByLMvu4iRNvJsyxX"
-                ],
-                "isTruncated": false
-            },
-            "scripthash": "58fe5b3fbca38ce38e5a1aeba202af70c39c2da7f8899812d5a5e42cf43ece83"
-        }
-    ],
-    "blockhash": "0000000000000000075e74d06bddd5a92cd64c738fe2e4ee71a09fc52bdce984",
-    "confirmations": 74,
-    "time": 1649037156,
-    "blocktime": 1649037156,
-    "blockheight": 733617,
-    "vincount": 1,
-    "voutcount": 1,
-    "vinvalue": 0.000007,
-    "voutvalue": 0.00000547
-}`
-
-func TestBloomProcessor(t *testing.T) {
-	type fields struct {
-		filter     *boom.StableBloomFilter
-		filterType string
-	}
-	type args struct {
-		item   string
-		txJSON string
-		passes bool
-	}
-	tests := []struct {
-		name   string
-		fields fields
-		args   args
-	}{
-		{
-			name: "valid address locking script with proper tx",
-			fields: fields{
-				filter:     boom.NewDefaultStableBloomFilter(uint(1000), float64(0.001)),
-				filterType: utils.P2PKHRegexpString,
-			},
-			args: args{
-				item:   "76a914a9041707efa4c2edea3e3b93c83330b55c6497d088ac",
-				txJSON: testTransaction,
-				passes: true,
-			},
-		},
-		{
-			name: "bad address locking script with tx",
-			fields: fields{
-				filter:     boom.NewDefaultStableBloomFilter(uint(1000), float64(0.001)),
-				filterType: utils.P2PKHRegexpString,
-			},
-			args: args{
-				item:   "efefefefefef",
-				txJSON: testTransaction,
-				passes: false,
-			},
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			m := &BloomProcessor{
-				filters: map[string]*BloomProcessorFilter{
-					tt.fields.filterType: {
-						Filter: tt.fields.filter,
-						regex:  utils.P2PKHSubstringRegexp,
-					},
-				},
-			}
-			err := m.Add(utils.P2PKHRegexpString, tt.args.item)
-			require.NoError(t, err)
-			event := centrifuge.ServerPublishEvent{
-				Publication: centrifuge.Publication{
-					Data: []byte(tt.args.txJSON),
-				},
-			}
-			var tx string
-			tx, err = m.FilterTransactionPublishEvent(event.Data)
-			assert.NoError(t, err, "%s - mempool Filter unexpectedly failed", tt.name)
-			if tt.args.passes {
-				assert.NotEqualf(t, tx, "", "%s - expected tx to pass processor and didn't", tt.name)
-			} else {
-				assert.Equalf(t, tx, "", "%s - expected tx to not pass processor and did", tt.name)
-			}
-		})
-	}
-}
-
-// BENCHMARKS
-
-func setupBenchmarkData() *BloomProcessor {
-	m := NewBloomProcessor(100000, 0.001)
-
-	for i := 0; i < 100000; i++ {
-		priv, _ := bitcoin.CreatePrivateKey()
-		p2pkh, _ := bscript.NewP2PKHFromPubKeyEC(priv.PubKey())
-		_ = m.Add(utils.P2PKHRegexpString, p2pkh.String())
-	}
-
-	return m
-}
-
-func getEvent(i int) centrifuge.ServerPublishEvent {
-	return centrifuge.ServerPublishEvent{
-		Publication: centrifuge.Publication{
-			Data: []byte(testTransactionHex + string(rune(i))),
-		},
-	}
-}
-
-// always record the result of the function call to prevent the compiler eliminating it
-var txResult []int
-
-func BenchmarkBloomProcessor(b *testing.B) {
-	m := setupBenchmarkData()
-	b.ResetTimer()
-
-	for i := 0; i < b.N; i++ {
-		tx, _ := m.FilterTransactionPublishEvent(getEvent(i).Data)
-		txResult = append(txResult, len(tx))
-	}
-}
-
-func TestBloomProcessor_FilterMempoolTx(t *testing.T) {
-	txHex := "01000000013c78aba57467f8cdb6270f171ab0c67df0ecfe65dfce7a0aeeaa5774f6e0f6e3040000006a473044022064b81316db2fe23c598fd6ace8e11ce5668f1006bbdf1a660acf8773852ece29022014a31aee48f007fb4c78014a01e9595dd81f6cae39591901921f30465c2149764121022d6799224389f3764f7610080f06745d87c7296d27db034a98923242cdb280cfffffffff0750c30000000000001976a91481c80d970b24fb03362be1c65145544892cebe5688ac8d160000000000001976a91447f73f8a7807d8ab2e321c76e321d69598343fb188ac400d0300000000001976a914b1a1ffb7a9a78aae58940c73cd2a6c7c170c44f188ac400d0300000000001976a914b762ca8682f2110a540ea8795a2e72c608b6606288ac204e0000000000001976a914455525dda77e409082c691deee061c1fb6b0082088ac204e0000000000001976a914087e1729fe365716080a452bec0103bd7204021c88acbc0f0000000000001976a914f063c2a5c290c525abba30d8085cd9c661ba091288ac00000000"
-
-	type fields struct {
-		maxCells          uint
-		falsePositiveRate float64
-	}
-	type args struct {
-		txHex string
-	}
-	tests := []struct {
-		name    string
-		fields  fields
-		args    args
-		want    string
-		wantErr assert.ErrorAssertionFunc
-	}{
-		{
-			name: "Real tx",
-			fields: fields{
-				maxCells:          100,
-				falsePositiveRate: 0.01,
-			},
-			args: args{
-				txHex: txHex,
-			},
-			want:    txHex,
-			wantErr: assert.NoError,
-		},
-		{
-			name: "No match",
-			fields: fields{
-				maxCells:          100,
-				falsePositiveRate: 0.01,
-			},
-			args: args{
-				txHex: "test string",
-			},
-			want:    "",
-			wantErr: assert.NoError,
-		},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			p := NewBloomProcessor(
-				tt.fields.maxCells,
-				tt.fields.falsePositiveRate,
-			)
-			err := p.Add(utils.P2PKHRegexpString, "76a91481c80d970b24fb03362be1c65145544892cebe5688ac")
-			require.NoError(t, err)
-
-			var got string
-			got, err = p.FilterTransaction(tt.args.txHex)
-			if !tt.wantErr(t, err, fmt.Sprintf("FilterMempoolTx(%v)", tt.args.txHex)) {
-				return
-			}
-			assert.Equalf(t, tt.want, got, "FilterMempoolTx(%v)", tt.args.txHex)
-		})
-	}
-}
diff --git a/go.mod b/go.mod
index d6f7d27b..e3b8ac12 100644
--- a/go.mod
+++ b/go.mod
@@ -8,7 +8,6 @@ require (
 	github.com/bitcoin-sv/go-paymail v0.12.1
 	github.com/bitcoinschema/go-bitcoin/v2 v2.0.5
 	github.com/bitcoinschema/go-map v0.1.0
-	github.com/centrifugal/centrifuge-go v0.10.2
 	github.com/coocood/freecache v1.2.4
 	github.com/dolthub/go-mysql-server v0.17.0
 	github.com/fergusstrange/embedded-postgres v1.25.0
@@ -32,7 +31,6 @@ require (
 	github.com/stretchr/testify v1.8.4
 	github.com/tonicpow/go-minercraft/v2 v2.0.8
 	github.com/tryvium-travels/memongo v0.11.0
-	github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43
 	github.com/vmihailenco/taskq/v3 v3.2.9
 	go.elastic.co/ecszerolog v0.2.0
 	go.mongodb.org/mongo-driver v1.13.1
@@ -48,10 +46,8 @@ require (
 	github.com/bitcoinsv/bsvutil v0.0.0-20181216182056-1d77cf353ea9 // indirect
 	github.com/bsm/redislock v0.9.4 // indirect
 	github.com/capnm/sysinfo v0.0.0-20130621111458-5909a53897f3 // indirect
-	github.com/centrifugal/protocol v0.11.0 // indirect
 	github.com/cespare/xxhash v1.1.0 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
-	github.com/d4l3k/messagediff v1.2.1 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
@@ -68,7 +64,6 @@ require (
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
 	github.com/google/uuid v1.6.0 // indirect
-	github.com/gorilla/websocket v1.5.1 // indirect
 	github.com/hashicorp/golang-lru v1.0.2 // indirect
 	github.com/iancoleman/strcase v0.3.0 // indirect
 	github.com/jackc/pgpassfile v1.0.0 // indirect
@@ -78,14 +73,11 @@ require (
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/jmoiron/sqlx v1.3.5 // indirect
-	github.com/josharian/intern v1.0.0 // indirect
-	github.com/jpillora/backoff v1.0.0 // indirect
 	github.com/julienschmidt/httprouter v1.3.0 // indirect
 	github.com/klauspost/compress v1.17.6 // indirect
 	github.com/lestrrat-go/strftime v1.0.6 // indirect
 	github.com/lib/pq v1.10.9 // indirect
 	github.com/libsv/go-p2p v0.1.5 // indirect
-	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/mattn/go-colorable v0.1.13 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/mattn/go-sqlite3 v1.14.22 // indirect
@@ -101,8 +93,6 @@ require (
 	github.com/prometheus/client_model v0.5.0 // indirect
 	github.com/prometheus/common v0.45.0 // indirect
 	github.com/prometheus/procfs v0.12.0 // indirect
-	github.com/segmentio/asm v1.2.0 // indirect
-	github.com/segmentio/encoding v0.4.0 // indirect
 	github.com/shopspring/decimal v1.3.1 // indirect
 	github.com/sirupsen/logrus v1.9.3 // indirect
 	github.com/sosodev/duration v1.2.0 // indirect
@@ -114,7 +104,6 @@ require (
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.1 // indirect
 	github.com/tidwall/sjson v1.2.5 // indirect
-	github.com/valyala/bytebufferpool v1.0.0 // indirect
 	github.com/vektah/gqlparser/v2 v2.5.11 // indirect
 	github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
diff --git a/go.sum b/go.sum
index 2b93e63d..d3faaccd 100644
--- a/go.sum
+++ b/go.sum
@@ -41,10 +41,6 @@ github.com/bsm/redislock v0.7.2/go.mod h1:kS2g0Yvlymc9Dz8V3iVYAtLAaSVruYbAFdYBDr
 github.com/cactus/go-statsd-client/statsd v0.0.0-20200423205355-cb0885a1018c/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI=
 github.com/capnm/sysinfo v0.0.0-20130621111458-5909a53897f3 h1:IHZ1Le1ejzkmS7Si7dIzJvYDWe+BIoNmqMnfWHBZSVw=
 github.com/capnm/sysinfo v0.0.0-20130621111458-5909a53897f3/go.mod h1:M5XHQLu90v2JNm/bW2tdsYar+5vhV0gEcBcmDBNAN1Y=
-github.com/centrifugal/centrifuge-go v0.8.3 h1:kZ0AZaaSbrDJuMH+Hp5RiCKZyUsKmUmNv8h0tMlij78=
-github.com/centrifugal/centrifuge-go v0.8.3/go.mod h1:HkBuiQLwdLdauVtiqig2wgzLsDKp9As72w01WDat+ow=
-github.com/centrifugal/protocol v0.9.1 h1:DCoZvYtblUotGrM7GrpIvKtZYhjT03chvhEN9tyWZMY=
-github.com/centrifugal/protocol v0.9.1/go.mod h1:qpYrxz4cDj+rlgC6giSADkf7XDN1K7aFmkkFwt/bayQ=
 github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -53,8 +49,6 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
 github.com/coocood/freecache v1.2.4 h1:UdR6Yz/X1HW4fZOuH0Z94KwG851GWOSknua5VUbb/5M=
 github.com/coocood/freecache v1.2.4/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk=
 github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U=
-github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -132,9 +126,6 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
-github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
 github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
 github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
@@ -161,10 +152,6 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y
 github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
 github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
 github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
-github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
-github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
-github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
-github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
@@ -196,8 +183,6 @@ github.com/libsv/go-bt/v2 v2.2.5 h1:VoggBLMRW9NYoFujqe5bSYKqnw5y+fYfufgERSoubog=
 github.com/libsv/go-bt/v2 v2.2.5/go.mod h1:cV45+jDlPOLfhJLfpLmpQoWzrIvVth9Ao2ZO1f6CcqU=
 github.com/libsv/go-p2p v0.1.5 h1:zbUE1UQ73J7LN/s3gruQBTh3Sz0DSSmj3cWhC1ZQVM0=
 github.com/libsv/go-p2p v0.1.5/go.mod h1:9KhX8e+3oEmGiYQSeF/CrHj22YNHqiof3TH77VqcMCs=
-github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
 github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
 github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
@@ -272,13 +257,6 @@ github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0=
 github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
 github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
-github.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg=
-github.com/segmentio/asm v1.1.4/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg=
-github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
-github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
-github.com/segmentio/encoding v0.3.5/go.mod h1:n0JeuIqEQrQoPDGsjo8UNd1iA0U8d8+oHAA4E3G3OxM=
-github.com/segmentio/encoding v0.4.0 h1:MEBYvRqiUB2nfR2criEXWqwdY6HJOUrCn5hboVOVmy8=
-github.com/segmentio/encoding v0.4.0/go.mod h1:/d03Cd8PoaDeceuhUUUQWjU0KhWjrmYrWPgtJHYZSnI=
 github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
 github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
 github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
@@ -327,10 +305,6 @@ github.com/tonicpow/go-minercraft/v2 v2.0.8 h1:gDjHOpmD0P5qRLpgRLUHDcDR39DdT5c/X
 github.com/tonicpow/go-minercraft/v2 v2.0.8/go.mod h1:mfr1fgOpnu2GkTmPDT4Sanoh4wOfV6kcwOrjVdo8vPk=
 github.com/tryvium-travels/memongo v0.11.0 h1:VpFkeigK7bge9aXH+oVG+H3OI2ih12riTROk0CvERrk=
 github.com/tryvium-travels/memongo v0.11.0/go.mod h1:riRUHKRQ5JbeX2ryzFfmr7P2EYXIkNwgloSQJPpBikA=
-github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43 h1:QEePdg0ty2r0t1+qwfZmQ4OOl/MB2UXIeJSpIZv56lg=
-github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43/go.mod h1:OYRfF6eb5wY9VRFkXJH8FFBi3plw2v+giaIu7P054pM=
-github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
-github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/vektah/gqlparser/v2 v2.5.11 h1:JJxLtXIoN7+3x6MBdtIP59TP1RANnY7pXOaDnADQSf8=
 github.com/vektah/gqlparser/v2 v2.5.11/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc=
 github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
@@ -422,8 +396,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -480,7 +452,6 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
 google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=