From ee9888e3648a465f0e8cb6257e27d94af196847a Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 9 Apr 2025 16:57:55 -0700 Subject: [PATCH 01/55] multi thread queue --- queue/queue.go | 138 +++++++++++++++++++++++++++++------------------- queue/types.go | 17 ++++-- queue/worker.go | 38 +++++++++++++ 3 files changed, 135 insertions(+), 58 deletions(-) create mode 100644 queue/worker.go diff --git a/queue/queue.go b/queue/queue.go index 0a13092..8e4f0c1 100644 --- a/queue/queue.go +++ b/queue/queue.go @@ -1,29 +1,54 @@ package queue import ( + "errors" "fmt" "sync" "time" "github.com/cosmos/cosmos-sdk/types" - walletTypes "github.com/desmos-labs/cosmos-go-wallet/types" "github.com/desmos-labs/cosmos-go-wallet/wallet" "github.com/rs/zerolog/log" ) -func (m *Message) Done() { - m.wg.Done() -} +// does it really need to sleep less than 0.1 second? +const minSleepDuration = time.Millisecond * 500 + +// There must be at least 1 thread +// For every thread, TxWorker is assigned its own wallet with an offset +// Each TxWorker uses its wallet to sign and broadcast messages +// Queue sleeps for refreshInterval after Queue distributes messages to the workers +func NewQueue(w *wallet.Wallet, refreshInterval time.Duration, thread int8) (*Queue, error) { + if thread < 1 { + return nil, errors.New("thread must be at least 1") + } + + if refreshInterval < time.Second { + return nil, errors.New("refresh interval cannot be shorter than 1 second") + } -func NewQueue(w *wallet.Wallet, interval int64) *Queue { q := &Queue{ - wallet: w, - messages: make([]*Message, 0), - processed: time.Now(), - running: false, - interval: interval, + wallet: w, + txWorkers: make([]*TxWorker, 0), + msgPool: make([]*Message, 0), + refreshInterval: refreshInterval, + processed: time.Now(), + running: false, + } + + for i := 0; i < int(thread); i++ { + offset := byte(i + 1) + w, err := w.CloneWalletOffset(offset) + if err != nil { + // should be debugged if this happens + return nil, errors.New("failed to create offset wallet for txWorker") + } + + worker := NewTxWorker(int8(i), w) + q.txWorkers = append(q.txWorkers, worker) } - return q + + return q, nil } func (q *Queue) Add(msg types.Msg) (*Message, *sync.WaitGroup) { @@ -37,71 +62,78 @@ func (q *Queue) Add(msg types.Msg) (*Message, *sync.WaitGroup) { err: nil, } - q.messages = append(q.messages, m) // adding the message to the end of the list + q.addLast(m) return m, &wg } -func (q *Queue) Stop() { - q.running = false -} - func (q *Queue) Listen() { q.running = true defer log.Info().Msg("Queue module stopped") log.Info().Msg("Queue module started") - for q.running { - time.Sleep(time.Millisecond * 333) // pauses for one third of a second - if !q.processed.Add(time.Second * time.Duration(q.interval)).Before(time.Now()) { // check every ten seconds - continue - } - lmsg := len(q.messages) + for q.running { + q.sleep() - if lmsg == 0 { // skipping this queue cycle if there is no messages to be pushed + if len(q.msgPool) == 0 { continue } - log.Info().Msg(fmt.Sprintf("Queue: %d messages waiting to be put on-chain...", lmsg)) - - // maxSize := 1024 * 1024 // 1mb - maxSize := 45 + before := len(q.msgPool) + count := q.distributeMsg() + log.Info().Msg(fmt.Sprintf("assigned %d out of %d messages", count, before)) + } +} - total := len(q.messages) - queueSize.Set(float64(total)) +func (q *Queue) Stop() { + q.running = false +} - if total > maxSize { - total = maxSize - } +// fcfs +func (q *Queue) popFront() *Message { - log.Info().Msg(fmt.Sprintf("Queue: Posting %d messages to chain...", total)) + if len(q.msgPool) == 0 { + return nil + } - toProcess := q.messages[:total] - q.messages = q.messages[total:] + msg := q.msgPool[0] + q.msgPool = q.msgPool[1:] + return msg +} - allMsgs := make([]types.Msg, len(toProcess)) +// assign message to free workers from msg pool +// returns number of messages assigned +func (q *Queue) distributeMsg() int { + if len(q.msgPool) == 0 { + return 0 + } - for i, process := range toProcess { - allMsgs[i] = process.msg + count := 0 + for _, w := range q.txWorkers { + if w.busy() { + continue } - data := walletTypes.NewTransactionData( - allMsgs..., - ).WithGasAuto().WithFeeAuto() + w.assign(q.popFront()) + go w.broadCast() + count++ + } + return count +} - res, err := q.wallet.BroadcastTxCommit(data) - if err != nil { - log.Warn().Err(err).Msg("tx broadcast failed from queue") - } +// sleep until next interval +// if slept duration is too small consider increasing interval or threads +func (q *Queue) sleep() (slept time.Duration) { + wakeUpTime := q.processed.Add(q.refreshInterval) + sleep := wakeUpTime.Sub(time.Now()) + if sleep > minSleepDuration { + time.Sleep(sleep) + } - for i, process := range toProcess { - process.err = err - process.res = res - process.msgIndex = i - process.Done() - } + return sleep +} - q.processed = time.Now() - } +func (q *Queue) addLast(msg *Message) { + q.msgPool = append(q.msgPool, msg) } diff --git a/queue/types.go b/queue/types.go index 0534857..86f82a6 100644 --- a/queue/types.go +++ b/queue/types.go @@ -8,12 +8,19 @@ import ( "github.com/desmos-labs/cosmos-go-wallet/wallet" ) +type TxWorker struct { + id int8 + wallet *wallet.Wallet + msg *Message +} + type Queue struct { - wallet *wallet.Wallet - messages []*Message - processed time.Time - running bool - interval int64 + txWorkers []*TxWorker + wallet *wallet.Wallet + refreshInterval time.Duration + msgPool []*Message + processed time.Time + running bool } type Message struct { diff --git a/queue/worker.go b/queue/worker.go new file mode 100644 index 0000000..0b85588 --- /dev/null +++ b/queue/worker.go @@ -0,0 +1,38 @@ +package queue + +import ( + walletTypes "github.com/desmos-labs/cosmos-go-wallet/types" + "github.com/desmos-labs/cosmos-go-wallet/wallet" +) + +func NewTxWorker(id int8, offsetWallet *wallet.Wallet) *TxWorker { + return &TxWorker{ + id: id, + wallet: offsetWallet, + msg: nil, + } +} + +func (t *TxWorker) Address() string { + return t.wallet.AccAddress() +} + +func (t *TxWorker) busy() bool { + return t.msg != nil +} + +func (t *TxWorker) assign(msg *Message) { + if msg == nil { + t.msg = msg + } +} + +func (t *TxWorker) broadCast() { + data := walletTypes.NewTransactionData( + t.msg.msg, + ).WithGasAuto().WithFeeAuto() + + t.msg.res, t.msg.err = t.wallet.BroadcastTxCommit(data) + t.msg.wg.Done() + t.msg = nil +} From b1a0d1a4f88145587ccf7a34cc0c9e1c59b58382 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 9 Apr 2025 17:06:19 -0700 Subject: [PATCH 02/55] queue thread config --- config/types.go | 6 ++++++ core/app.go | 8 +++++++- queue/queue.go | 1 - 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/config/types.go b/config/types.go index 9e77dd8..7e2c871 100644 --- a/config/types.go +++ b/config/types.go @@ -24,6 +24,7 @@ type ChainConfig struct { type Config struct { QueueInterval int64 `yaml:"queue_interval" mapstructure:"queue_interval"` + QueueThreads int8 `yaml:"queue_threads" mapstructure:"queue_threads"` ProofInterval int64 `yaml:"proof_interval" mapstructure:"proof_interval"` StrayManagerCfg StrayManagerConfig `yaml:"stray_manager" mapstructure:"stray_manager"` ChainCfg ChainConfig `yaml:"chain_config" mapstructure:"chain_config"` @@ -39,6 +40,10 @@ func DefaultQueueInterval() int64 { return 10 } +func DefaultQueueThreads() int8 { + return 5 +} + func DefaultProofInterval() int64 { return 120 } @@ -143,6 +148,7 @@ func DefaultChainConfig() ChainConfig { func DefaultConfig() *Config { return &Config{ QueueInterval: DefaultQueueInterval(), + QueueThreads: DefaultQueueThreads(), ProofInterval: DefaultProofInterval(), StrayManagerCfg: DefaultStrayManagerConfig(), ChainCfg: DefaultChainConfig(), diff --git a/core/app.go b/core/app.go index 698a050..44d0d9a 100644 --- a/core/app.go +++ b/core/app.go @@ -249,7 +249,13 @@ func (a *App) Start() error { return err } - a.q = queue.NewQueue(a.wallet, cfg.QueueInterval) + refreshInterval := time.Second * time.Duration(cfg.QueueInterval) + a.q, err = queue.NewQueue(a.wallet, refreshInterval, cfg.QueueThreads) + if err != nil { + log.Error().Err(err).Msg("failed to initialize Queue module") + return err + } + go a.q.Listen() prover := proofs.NewProver(a.wallet, a.q, a.fileSystem, cfg.ProofInterval, cfg.ProofThreads, int(params.ChunkSize)) diff --git a/queue/queue.go b/queue/queue.go index 8e4f0c1..b1836c0 100644 --- a/queue/queue.go +++ b/queue/queue.go @@ -92,7 +92,6 @@ func (q *Queue) Stop() { // fcfs func (q *Queue) popFront() *Message { - if len(q.msgPool) == 0 { return nil } From c6218d4184b5397f206f1fba4052a15cb0771630 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 9 Apr 2025 17:06:37 -0700 Subject: [PATCH 03/55] clarify log messages --- proofs/proofs.go | 14 ++++++++------ strays/manager.go | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/proofs/proofs.go b/proofs/proofs.go index a2adfcf..3630bf6 100644 --- a/proofs/proofs.go +++ b/proofs/proofs.go @@ -32,7 +32,7 @@ const ( ) func GenerateMerkleProof(tree *merkletree.MerkleTree, index int, item []byte) (bool, *merkletree.Proof, error) { - log.Debug().Msg(fmt.Sprintf("Generating Merkle proof for %d", index)) + log.Debug().Msg(fmt.Sprintf("Generating Merkle proof for index: %d", index)) h := sha256.New() _, err := fmt.Fprintf(h, "%d%x", index, item) @@ -56,6 +56,8 @@ func GenerateMerkleProof(tree *merkletree.MerkleTree, index int, item []byte) (b // // returns proof, item and error func GenProof(io FileSystem, merkle []byte, owner string, start int64, block int, chunkSize int, proofType int64) ([]byte, []byte, error) { + log.Debug().Msg(fmt.Sprintf("About to generate merkle proof for file: %x", merkle)) + tree, chunk, err := io.GetFileTreeByChunk(merkle, owner, start, block, chunkSize, proofType) if err != nil { e := fmt.Errorf("cannot get chunk for %x at %d | %w", merkle, block, err) @@ -63,8 +65,6 @@ func GenProof(io FileSystem, merkle []byte, owner string, start int64, block int return nil, nil, e } - log.Debug().Msg(fmt.Sprintf("About to generate merkle proof for %x", merkle)) - valid, proof, err := GenerateMerkleProof(tree, block, chunk) if err != nil { return nil, nil, err @@ -220,11 +220,12 @@ func (p *Prover) Start() { } time.Sleep(time.Millisecond * 1000) // pauses for one third of a second + // sleep until next proving cycle if !p.processed.Add(time.Second * time.Duration(p.interval)).Before(time.Now()) { continue } - log.Debug().Msg("Starting proof cycle...") + log.Debug().Time("start at", p.processed).Msg("Starting proof cycle...") abciInfo, err := p.wallet.Client.RPCClient.ABCIInfo(context.Background()) if err != nil { @@ -241,15 +242,16 @@ func (p *Prover) Start() { time.Sleep(time.Second * 5) } - log.Debug().Msg(fmt.Sprintf("proving: %x", merkle)) + log.Debug().Hex("merkle", merkle).Str("owner", owner).Int64("start", start).Msg("proving file") filesProving.Inc() p.Inc() go p.wrapPostProof(merkle, owner, start, height, t) }) if err != nil { - log.Error().Err(err) + log.Error().Err(err).Msg("something went wrong while processing files in this proving cycle") } + log.Debug().Time("finish at", time.Now()).TimeDiff("duration", time.Now(), p.processed).Msg("End of proof cycle") p.processed = time.Now() } log.Info().Msg("Prover module stopped") diff --git a/strays/manager.go b/strays/manager.go index ba85981..8d5c32e 100644 --- a/strays/manager.go +++ b/strays/manager.go @@ -34,7 +34,7 @@ func NewStrayManager(w *wallet.Wallet, q *queue.Queue, interval int64, refreshIn h, err := s.NewHand(q) if err != nil { - log.Error().Err(err) + log.Error().Err(err).Int("index", i).Msg("Failed to create hand") continue } From 66dec99b694523054b4734075e7d83365d6690b7 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 9 Apr 2025 22:48:43 -0700 Subject: [PATCH 04/55] batch send messages --- queue/worker.go | 76 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 15 deletions(-) diff --git a/queue/worker.go b/queue/worker.go index 0b85588..7fdebf4 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -3,13 +3,21 @@ package queue import ( walletTypes "github.com/desmos-labs/cosmos-go-wallet/types" "github.com/desmos-labs/cosmos-go-wallet/wallet" + + "github.com/cosmos/cosmos-sdk/types" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) -func NewTxWorker(id int8, offsetWallet *wallet.Wallet) *TxWorker { +func NewTxWorker(id int8, bucketSize int16, msgBatchSize int8, retryAttempt int8, offsetWallet *wallet.Wallet) *TxWorker { return &TxWorker{ - id: id, - wallet: offsetWallet, - msg: nil, + id: id, + wallet: offsetWallet, + msgBucketSize: bucketSize, + msgBucket: make([]*Message, 0, bucketSize), + msgBatchSize: msgBatchSize, + retryAttempt: retryAttempt, } } @@ -17,22 +25,60 @@ func (t *TxWorker) Address() string { return t.wallet.AccAddress() } -func (t *TxWorker) busy() bool { - return t.msg != nil +func (t *TxWorker) available() int { + return int(t.msgBucketSize) - len(t.msgBucket) } -func (t *TxWorker) assign(msg *Message) { - if msg == nil { - t.msg = msg +func (t *TxWorker) assign(msgs []*Message) int { + if msgs == nil { + return 0 } + + // take whatever it can to fill the bucket + // required for the sanity check + fillCount := min(int(t.msgBucketSize)-len(t.msgBucket), len(msgs)) + m := msgs[:fillCount] + + t.msgBucket = append(t.msgBucket, m...) + return fillCount +} + +func (t *TxWorker) grabNextBatch() []*Message { + total := min(len(t.msgBucket), int(t.msgBatchSize)) + msgs := t.msgBucket[:total] + t.msgBucket = t.msgBucket[total:] + + return msgs } func (t *TxWorker) broadCast() { - data := walletTypes.NewTransactionData( - t.msg.msg, - ).WithGasAuto().WithFeeAuto() + batchMessage := t.grabNextBatch() + + batch := make([]types.Msg, len(batchMessage)) + for i, m := range batchMessage { + batch[i] = m.msg + } + data := walletTypes.NewTransactionData(batch...).WithGasAuto().WithFeeAuto() - t.msg.res, t.msg.err = t.wallet.BroadcastTxCommit(data) - t.msg.wg.Done() - t.msg = nil + var resp *types.TxResponse + var err error + for attempt := 0; attempt < int(t.retryAttempt); attempt++ { + resp, err = t.wallet.BroadcastTxCommit(data) + if err != nil { + // retry if network is not responding + if code := status.Code(err); code == codes.DeadlineExceeded { + err = nil + } else { + break + } + } else { + break + } + + } + for _, m := range batchMessage { + m.wg.Done() + m.res = resp + m.err = err + } } From f0cb595f0e247aa7f906a4745f1a3a110afc1bf8 Mon Sep 17 00:00:00 2001 From: marston Date: Thu, 10 Apr 2025 09:30:49 -0400 Subject: [PATCH 05/55] tweaking queue init --- queue/queue.go | 13 ++++++------- queue/types.go | 10 +++++++--- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/queue/queue.go b/queue/queue.go index b1836c0..c90b7fa 100644 --- a/queue/queue.go +++ b/queue/queue.go @@ -14,7 +14,7 @@ import ( // does it really need to sleep less than 0.1 second? const minSleepDuration = time.Millisecond * 500 -// There must be at least 1 thread +// NewQueue creates a new queue. There must be at least 1 thread // For every thread, TxWorker is assigned its own wallet with an offset // Each TxWorker uses its wallet to sign and broadcast messages // Queue sleeps for refreshInterval after Queue distributes messages to the workers @@ -44,7 +44,7 @@ func NewQueue(w *wallet.Wallet, refreshInterval time.Duration, thread int8) (*Qu return nil, errors.New("failed to create offset wallet for txWorker") } - worker := NewTxWorker(int8(i), w) + worker := NewTxWorker(int8(i), w) // need defaults here q.txWorkers = append(q.txWorkers, worker) } @@ -110,12 +110,11 @@ func (q *Queue) distributeMsg() int { count := 0 for _, w := range q.txWorkers { - if w.busy() { - continue - } - w.assign(q.popFront()) - go w.broadCast() + grabbed := w.assign(q.msgPool) + q.msgPool = q.msgPool[grabbed:] + + go w.broadCast() // we should probably give each worker its own loop instead of calling this over and over again count++ } return count diff --git a/queue/types.go b/queue/types.go index 86f82a6..8cfda0c 100644 --- a/queue/types.go +++ b/queue/types.go @@ -9,9 +9,13 @@ import ( ) type TxWorker struct { - id int8 - wallet *wallet.Wallet - msg *Message + id int8 + wallet *wallet.Wallet + msg *Message + msgBucketSize int16 + msgBucket []*Message + msgBatchSize int8 + retryAttempt int8 } type Queue struct { From bb2f2013b2fa1c937eae9a1b79e4b0fe14b38f2e Mon Sep 17 00:00:00 2001 From: Daniel Ahn Date: Mon, 14 Apr 2025 14:01:40 -0700 Subject: [PATCH 06/55] batch queue --- config/types.go | 41 ++++++++----- queue/queue.go | 159 ++++++++++++++++++++++++++++++++---------------- queue/types.go | 19 +++--- queue/worker.go | 116 +++++++++++++++++++++-------------- 4 files changed, 216 insertions(+), 119 deletions(-) diff --git a/config/types.go b/config/types.go index 7e2c871..80b2a92 100644 --- a/config/types.go +++ b/config/types.go @@ -23,9 +23,8 @@ type ChainConfig struct { } type Config struct { - QueueInterval int64 `yaml:"queue_interval" mapstructure:"queue_interval"` - QueueThreads int8 `yaml:"queue_threads" mapstructure:"queue_threads"` ProofInterval int64 `yaml:"proof_interval" mapstructure:"proof_interval"` + QueueConfig QueueConfig `yaml:"queue_config" mapstructure:"queue_config"` StrayManagerCfg StrayManagerConfig `yaml:"stray_manager" mapstructure:"stray_manager"` ChainCfg ChainConfig `yaml:"chain_config" mapstructure:"chain_config"` Ip string `yaml:"domain" mapstructure:"domain"` @@ -36,14 +35,6 @@ type Config struct { BlockStoreConfig BlockStoreConfig `yaml:"block_store_config" mapstructure:"block_store_config"` } -func DefaultQueueInterval() int64 { - return 10 -} - -func DefaultQueueThreads() int8 { - return 5 -} - func DefaultProofInterval() int64 { return 120 } @@ -145,11 +136,32 @@ func DefaultChainConfig() ChainConfig { } } +type QueueConfig struct { + // seconds + QueueInterval int64 `yaml:"queue_interval" mapstructure:"queue_interval"` + QueueThreads int8 `yaml:"queue_threads" mapstructure:"queue_threads"` + // resend tx if network isn't responding + MaxRetryAttempt int8 `yaml:"max_retry_attempt" mapstructure:"max_retry_attempt"` + // group individual messages into one tx + TxBatchSize int8 `yaml:"tx_batch_size" mapstructure:"tx_batch_size"` + // worker's own message pool, set this value > TxBatchSize + WorkerQueueSize int16 `yaml:"worker_queue_size" mapstructure:"worker_queue_size"` +} + +func DefaultQueueConfig() QueueConfig { + return QueueConfig{ + QueueInterval: 10, + QueueThreads: 5, + MaxRetryAttempt: 100, + TxBatchSize: 45, + WorkerQueueSize: 100, + } +} + func DefaultConfig() *Config { return &Config{ - QueueInterval: DefaultQueueInterval(), - QueueThreads: DefaultQueueThreads(), ProofInterval: DefaultProofInterval(), + QueueConfig: DefaultQueueConfig(), StrayManagerCfg: DefaultStrayManagerConfig(), ChainCfg: DefaultChainConfig(), Ip: DefaultIP(), @@ -162,8 +174,7 @@ func DefaultConfig() *Config { } func (c Config) MarshalZerologObject(e *zerolog.Event) { - e.Int64("QueueInterval", c.QueueInterval). - Int64("ProofInterval", c.ProofInterval). + e.Int64("ProofInterval", c.ProofInterval). Int64("StrayCheckInterval", c.StrayManagerCfg.CheckInterval). Int64("StrayRefreshInterval", c.StrayManagerCfg.RefreshInterval). Int("StrayHandCount", c.StrayManagerCfg.HandCount). @@ -182,7 +193,7 @@ func (c Config) MarshalZerologObject(e *zerolog.Event) { } func init() { - viper.SetDefault("QueueInterval", DefaultQueueInterval()) + viper.SetDefault("QueueConfig", DefaultQueueConfig()) viper.SetDefault("ProofInterval", DefaultProofInterval()) viper.SetDefault("StrayManagerCfg", DefaultStrayManagerConfig()) viper.SetDefault("ChainCfg", DefaultChainConfig()) diff --git a/queue/queue.go b/queue/queue.go index c90b7fa..ddf9484 100644 --- a/queue/queue.go +++ b/queue/queue.go @@ -2,11 +2,16 @@ package queue import ( "errors" - "fmt" "sync" "time" - "github.com/cosmos/cosmos-sdk/types" + "github.com/JackalLabs/sequoia/config" + + "github.com/jackalLabs/canine-chain/v4/x/storage/types" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/feegrant" + "github.com/desmos-labs/cosmos-go-wallet/wallet" "github.com/rs/zerolog/log" ) @@ -18,40 +23,64 @@ const minSleepDuration = time.Millisecond * 500 // For every thread, TxWorker is assigned its own wallet with an offset // Each TxWorker uses its wallet to sign and broadcast messages // Queue sleeps for refreshInterval after Queue distributes messages to the workers -func NewQueue(w *wallet.Wallet, refreshInterval time.Duration, thread int8) (*Queue, error) { - if thread < 1 { +func NewQueue(w *wallet.Wallet, config config.QueueConfig, authedClaimers []string) (*Queue, error) { + if config.QueueThreads < 1 { return nil, errors.New("thread must be at least 1") } - if refreshInterval < time.Second { - return nil, errors.New("refresh interval cannot be shorter than 1 second") + refreshInterval := time.Duration(config.QueueInterval) * time.Second + if refreshInterval < minSleepDuration { + return nil, errors.New("refresh interval is too short") // TODO: improve this } q := &Queue{ wallet: w, - txWorkers: make([]*TxWorker, 0), - msgPool: make([]*Message, 0), + txWorkers: make([]*TxWorker, config.QueueThreads), + pool: make([]*Message, 0), + poolLock: &sync.Mutex{}, refreshInterval: refreshInterval, processed: time.Now(), running: false, } - for i := 0; i < int(thread); i++ { + // temp tx worker to init children workers + parent := NewTxWorker( + q, + 0, + config.WorkerQueueSize, + config.TxBatchSize, + config.MaxRetryAttempt, + w) + + for i := 0; i < int(config.QueueThreads); i++ { offset := byte(i + 1) w, err := w.CloneWalletOffset(offset) if err != nil { // should be debugged if this happens - return nil, errors.New("failed to create offset wallet for txWorker") + return nil, errors.Join(err, errors.New("failed to create offset wallet for txWorker")) } - worker := NewTxWorker(int8(i), w) // need defaults here + // TODO: batch all auth claim tx into one tx + err = q.authNewClaimer(parent, w, authedClaimers) + if err != nil { + return nil, err // don't want partial amount of threads + } + + worker := NewTxWorker( + q, + int8(i), + config.WorkerQueueSize, + config.TxBatchSize, + config.MaxRetryAttempt, + w) + q.txWorkers = append(q.txWorkers, worker) } return q, nil } -func (q *Queue) Add(msg types.Msg) (*Message, *sync.WaitGroup) { +func (q *Queue) Add(msg sdk.Msg) (*Message, *sync.WaitGroup) { var wg sync.WaitGroup wg.Add(1) @@ -72,17 +101,16 @@ func (q *Queue) Listen() { defer log.Info().Msg("Queue module stopped") log.Info().Msg("Queue module started") - for q.running { - q.sleep() - - if len(q.msgPool) == 0 { - continue + for _, w := range q.txWorkers { + w.start() } - before := len(q.msgPool) - count := q.distributeMsg() - log.Info().Msg(fmt.Sprintf("assigned %d out of %d messages", count, before)) + time.Sleep(q.refreshInterval) + + for _, w := range q.txWorkers { + w.stop() + } } } @@ -90,48 +118,75 @@ func (q *Queue) Stop() { q.running = false } -// fcfs -func (q *Queue) popFront() *Message { - if len(q.msgPool) == 0 { - return nil - } +func (q *Queue) addLast(msgs *Message) { + q.poolLock.Lock() + defer q.poolLock.Unlock() - msg := q.msgPool[0] - q.msgPool = q.msgPool[1:] - return msg + q.pool = append(q.pool, msgs) + return } -// assign message to free workers from msg pool -// returns number of messages assigned -func (q *Queue) distributeMsg() int { - if len(q.msgPool) == 0 { - return 0 +func (q *Queue) request(count int) []*Message { + q.poolLock.Lock() + defer q.poolLock.Unlock() + + size := min(len(q.pool), count) + msgs := q.pool[:size] + + q.pool = q.pool[size:] + return msgs +} + +func (q *Queue) authNewClaimer(worker *TxWorker, w *wallet.Wallet, authedClaimers []string) error { + for _, authed := range authedClaimers { + if w.AccAddress() == authed { + return nil + } + } + + msg := types.NewMsgAddClaimer(q.wallet.AccAddress(), w.AccAddress()) + + allowance := feegrant.BasicAllowance{ + SpendLimit: nil, + Expiration: nil, } - count := 0 - for _, w := range q.txWorkers { + wadd, err := sdk.AccAddressFromBech32(w.AccAddress()) + if err != nil { + panic(err) + } - grabbed := w.assign(q.msgPool) - q.msgPool = q.msgPool[grabbed:] + hadd, err := sdk.AccAddressFromBech32(q.wallet.AccAddress()) + if err != nil { + panic(err) + } - go w.broadCast() // we should probably give each worker its own loop instead of calling this over and over again - count++ + grantMsg, nerr := feegrant.NewMsgGrantAllowance(&allowance, wadd, hadd) + if nerr != nil { + panic(nerr) + } + + var wg sync.WaitGroup + wg.Add(2) + + addClaimerMsg := &Message{ + msg: msg, + wg: &wg, + err: nil, } - return count -} -// sleep until next interval -// if slept duration is too small consider increasing interval or threads -func (q *Queue) sleep() (slept time.Duration) { - wakeUpTime := q.processed.Add(q.refreshInterval) - sleep := wakeUpTime.Sub(time.Now()) - if sleep > minSleepDuration { - time.Sleep(sleep) + feeGrantMsg := &Message{ + msg: grantMsg, + wg: &wg, + err: nil, } - return sleep -} + err = worker.processBatch([]*Message{addClaimerMsg, feeGrantMsg}) + + wg.Wait() + if errs := errors.Join(err, addClaimerMsg.err, feeGrantMsg.err); errs != nil { + return errs + } -func (q *Queue) addLast(msg *Message) { - q.msgPool = append(q.msgPool, msg) + return nil } diff --git a/queue/types.go b/queue/types.go index 8cfda0c..da30f06 100644 --- a/queue/types.go +++ b/queue/types.go @@ -9,20 +9,23 @@ import ( ) type TxWorker struct { - id int8 - wallet *wallet.Wallet - msg *Message - msgBucketSize int16 - msgBucket []*Message - msgBatchSize int8 - retryAttempt int8 + pool *Queue + id int8 + wallet *wallet.Wallet + // not concurrent safe + buffer []*Message + bufferSize int16 + batchSize int8 + maxRetryAttempt int8 + running bool } type Queue struct { txWorkers []*TxWorker wallet *wallet.Wallet refreshInterval time.Duration - msgPool []*Message + pool []*Message + poolLock *sync.Mutex processed time.Time running bool } diff --git a/queue/worker.go b/queue/worker.go index 7fdebf4..65f692a 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -1,6 +1,8 @@ package queue import ( + "time" + walletTypes "github.com/desmos-labs/cosmos-go-wallet/types" "github.com/desmos-labs/cosmos-go-wallet/wallet" @@ -8,16 +10,21 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + + "github.com/rs/zerolog/log" ) -func NewTxWorker(id int8, bucketSize int16, msgBatchSize int8, retryAttempt int8, offsetWallet *wallet.Wallet) *TxWorker { +// offsetWallet must be registered as authorized claimer on chain +func NewTxWorker(pool *Queue, id int8, bufferSize int16, batchSize int8, maxRetryAttempt int8, offsetWallet *wallet.Wallet) *TxWorker { return &TxWorker{ - id: id, - wallet: offsetWallet, - msgBucketSize: bucketSize, - msgBucket: make([]*Message, 0, bucketSize), - msgBatchSize: msgBatchSize, - retryAttempt: retryAttempt, + pool: pool, + id: id, + wallet: offsetWallet, + buffer: make([]*Message, 0, bufferSize), + bufferSize: bufferSize, + batchSize: batchSize, + maxRetryAttempt: maxRetryAttempt, + running: false, } } @@ -26,59 +33,80 @@ func (t *TxWorker) Address() string { } func (t *TxWorker) available() int { - return int(t.msgBucketSize) - len(t.msgBucket) + return int(t.bufferSize) - len(t.buffer) } -func (t *TxWorker) assign(msgs []*Message) int { - if msgs == nil { - return 0 - } - - // take whatever it can to fill the bucket - // required for the sanity check - fillCount := min(int(t.msgBucketSize)-len(t.msgBucket), len(msgs)) - m := msgs[:fillCount] - - t.msgBucket = append(t.msgBucket, m...) - return fillCount +func (t *TxWorker) getWork() { + msgs := t.pool.request(t.available()) + t.buffer = append(t.buffer, msgs...) } -func (t *TxWorker) grabNextBatch() []*Message { - total := min(len(t.msgBucket), int(t.msgBatchSize)) - msgs := t.msgBucket[:total] - t.msgBucket = t.msgBucket[total:] - +func (t *TxWorker) getBatch() []*Message { + size := min(len(t.buffer), int(t.batchSize)) + msgs := t.buffer[:size] + t.buffer = t.buffer[size:] return msgs } -func (t *TxWorker) broadCast() { - batchMessage := t.grabNextBatch() - - batch := make([]types.Msg, len(batchMessage)) - for i, m := range batchMessage { - batch[i] = m.msg +func (t *TxWorker) processBatch(b []*Message) error { + msgs := make([]types.Msg, len(b)) + for i, m := range b { + msgs[i] = m.msg } - data := walletTypes.NewTransactionData(batch...).WithGasAuto().WithFeeAuto() + data := walletTypes.NewTransactionData(msgs...).WithGasAuto().WithFeeAuto() var resp *types.TxResponse var err error - for attempt := 0; attempt < int(t.retryAttempt); attempt++ { + + a := 0 +Retry: + for a := 0; a < int(t.maxRetryAttempt); a++ { resp, err = t.wallet.BroadcastTxCommit(data) - if err != nil { - // retry if network is not responding - if code := status.Code(err); code == codes.DeadlineExceeded { - err = nil - } else { - break - } - } else { - break + switch code := status.Code(err); code { + case codes.AlreadyExists, codes.NotFound, codes.OK: + break Retry } + } + if a == int(t.maxRetryAttempt) { + log.Error(). + Int8("id", t.id). + Int8("max attempt", t.maxRetryAttempt). + Int("msg size", len(b)). + Msg("queue worker batch msg broadcast exceeded max retry attempts") } - for _, m := range batchMessage { - m.wg.Done() + + for _, m := range b { m.res = resp m.err = err + m.wg.Done() } + return err +} + +func (t *TxWorker) start() { + t.running = true + defer t.stop() + for t.running { + if len(t.buffer) == 0 { + t.getWork() // blocks the loop + } + + batch := t.getBatch() + start := time.Now() + err := t.processBatch(batch) // blocks until tx goes through or exceeds retry attempts + if err != nil { + log.Error(). + Err(err). + Int8("id", t.id). + Time("started at", start). + Time("finished at", time.Now()). + Int("batchSize", len(batch)). + Msg("error while processing messages") + } + } +} + +func (t *TxWorker) stop() { + t.running = false } From c8abaad756c73b763a6bda105e354f4e6c0fd0d3 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 14 Apr 2025 19:18:05 -0700 Subject: [PATCH 07/55] clean up --- queue/queue.go | 30 +++++++++++++----------------- queue/worker.go | 3 +++ 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/queue/queue.go b/queue/queue.go index ddf9484..9123783 100644 --- a/queue/queue.go +++ b/queue/queue.go @@ -2,6 +2,7 @@ package queue import ( "errors" + "slices" "sync" "time" @@ -98,24 +99,19 @@ func (q *Queue) Add(msg sdk.Msg) (*Message, *sync.WaitGroup) { func (q *Queue) Listen() { q.running = true - defer log.Info().Msg("Queue module stopped") - log.Info().Msg("Queue module started") - for q.running { - for _, w := range q.txWorkers { - w.start() - } - - time.Sleep(q.refreshInterval) - - for _, w := range q.txWorkers { - w.stop() - } + for _, w := range q.txWorkers { + w.start() } + log.Info().Msg("Queue module started") } func (q *Queue) Stop() { q.running = false + for _, w := range q.txWorkers { + w.stop() + } + log.Info().Msg("Queue module stopped") } func (q *Queue) addLast(msgs *Message) { @@ -123,12 +119,14 @@ func (q *Queue) addLast(msgs *Message) { defer q.poolLock.Unlock() q.pool = append(q.pool, msgs) - return } func (q *Queue) request(count int) []*Message { q.poolLock.Lock() defer q.poolLock.Unlock() + if len(q.pool) == 0 { + return nil + } size := min(len(q.pool), count) msgs := q.pool[:size] @@ -138,10 +136,8 @@ func (q *Queue) request(count int) []*Message { } func (q *Queue) authNewClaimer(worker *TxWorker, w *wallet.Wallet, authedClaimers []string) error { - for _, authed := range authedClaimers { - if w.AccAddress() == authed { - return nil - } + if slices.Contains(authedClaimers, w.AccAddress()) { + return nil } msg := types.NewMsgAddClaimer(q.wallet.AccAddress(), w.AccAddress()) diff --git a/queue/worker.go b/queue/worker.go index 65f692a..0b38620 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -38,6 +38,9 @@ func (t *TxWorker) available() int { func (t *TxWorker) getWork() { msgs := t.pool.request(t.available()) + if msgs == nil { + time.Sleep(t.pool.refreshInterval) + } t.buffer = append(t.buffer, msgs...) } From 701304f69407d1d5926d5040b1d9d8c6dd7230e6 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 15 Apr 2025 20:09:08 -0700 Subject: [PATCH 08/55] channel queue --- proofs/types.go | 2 +- queue/pool.go | 158 +++++++++++++++++++++++++++++++++++++++++ queue/queue.go | 185 ++---------------------------------------------- queue/types.go | 24 ------- queue/worker.go | 134 +++++++++++++++++------------------ 5 files changed, 228 insertions(+), 275 deletions(-) create mode 100644 queue/pool.go diff --git a/proofs/types.go b/proofs/types.go index b001500..740776f 100644 --- a/proofs/types.go +++ b/proofs/types.go @@ -12,7 +12,7 @@ import ( type Prover struct { running bool wallet *wallet.Wallet - q *queue.Queue + q queue.Queue processed time.Time interval int64 io FileSystem diff --git a/queue/pool.go b/queue/pool.go new file mode 100644 index 0000000..ef88a33 --- /dev/null +++ b/queue/pool.go @@ -0,0 +1,158 @@ +package queue + +import ( + "context" + "errors" + "slices" + "sync" + + "github.com/JackalLabs/sequoia/config" + "github.com/cosmos/cosmos-sdk/types" + + walletTypes "github.com/desmos-labs/cosmos-go-wallet/types" + "github.com/desmos-labs/cosmos-go-wallet/wallet" + + storageTypes "github.com/jackalLabs/canine-chain/v4/x/storage/types" + + "github.com/rs/zerolog/log" +) + +var _ Queue = &Pool{} + +type Pool struct { + workers []*worker + wallet *wallet.Wallet + msgInput chan *Message + bufferIn chan<- *Message + bufferOut <-chan *Message +} + +func NewPool(wallet *wallet.Wallet, config config.QueueConfig) (*Pool, error) { + msgChannel := make(chan *Message) + bufferIn := make(chan *Message) + bufferOut := newBuffer(bufferIn) + pool := &Pool{ + wallet: wallet, + msgInput: msgChannel, + bufferIn: bufferIn, + bufferOut: bufferOut, + } + + workerWallets, err := initAuthClaimers(wallet, config.QueueThreads) + if err != nil { + return nil, errors.Join(errors.New("failed to initialize auth claimers"), err) + } + + workers := createWorkers(workerWallets, config.MaxRetryAttempt) + pool.workers = workers + + return pool, nil +} + +func (p *Pool) Stop() { + close(p.msgInput) + close(p.bufferIn) +} + +func (p *Pool) Listen() { + for m := range p.msgInput { + p.bufferIn <- m + } +} + +func (p *Pool) Add(msg types.Msg) (*Message, *sync.WaitGroup) { + var wg sync.WaitGroup + wg.Add(1) + m := &Message{ + msg: msg, + wg: &wg, + err: nil, + res: nil, + msgIndex: -1, + } + + p.msgInput <- m + + return m, &wg +} + +func createWorkers(workerWallets []*wallet.Wallet, maxRetryAttempt int8) []*worker { + workers := make([]*worker, 0, len(workerWallets)) + for i, w := range workerWallets { + worker := newWorker(int8(i), w, maxRetryAttempt) + workers = append(workers, worker) + } + + return workers +} + +func initAuthClaimers(wallet *wallet.Wallet, count int8) (workerWallets []*wallet.Wallet, err error) { + query := &storageTypes.QueryProvider{ + Address: wallet.AccAddress(), + } + + cl := storageTypes.NewQueryClient(wallet.Client.GRPCConn) + res, err := cl.Provider(context.Background(), query) + if err != nil { + return nil, errors.Join(errors.New("unable to query provider auth claimers"), err) + } + claimers := res.Provider.AuthClaimers + + for i := range count { + workerWallet := newOffsetWallet(wallet, int(i)) + if !slices.Contains(claimers, workerWallet.AccAddress()) { + err := addClaimer(wallet, workerWallet) + if err != nil { + return nil, errors.Join(errors.New("failed to add claimer on chain"), err) + } + } + workerWallets = append(workerWallets, workerWallet) + } + + return workerWallets, nil +} + +func addClaimer(main *wallet.Wallet, claimer *wallet.Wallet) error { + msg := storageTypes.NewMsgAddClaimer(main.AccAddress(), claimer.AccAddress()) + txData := walletTypes.NewTransactionData(msg).WithFeeAuto().WithGasAuto() + + res, err := main.BroadcastTxCommit(txData) + if err != nil { + return errors.Join(errors.New("unable to broadcast MsgAddClaimer"), err) + } + + log.Info().Msg(res.TxHash) + + return nil +} + +func newOffsetWallet(main *wallet.Wallet, index int) *wallet.Wallet { + w, err := main.CloneWalletOffset(byte(index + 1)) + if err != nil { + panic(err) + } + return w +} + +func newBuffer(in <-chan *Message) <-chan *Message { + // From: https://blogtitle.github.io/go-advanced-concurrency-patterns-part-4-unlimited-buffer-channels/ + var buf []*Message + out := make(chan *Message) + + go func() { + defer close(out) + for msg := range in { + select { + case out <- msg: + default: + buf = append(buf, msg) + } + } + + for _, v := range buf { + out <- v + } + }() + + return out +} diff --git a/queue/queue.go b/queue/queue.go index 9123783..a63590b 100644 --- a/queue/queue.go +++ b/queue/queue.go @@ -1,188 +1,13 @@ package queue import ( - "errors" - "slices" "sync" - "time" - "github.com/JackalLabs/sequoia/config" - - "github.com/jackalLabs/canine-chain/v4/x/storage/types" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/x/feegrant" - - "github.com/desmos-labs/cosmos-go-wallet/wallet" - "github.com/rs/zerolog/log" + "github.com/cosmos/cosmos-sdk/types" ) -// does it really need to sleep less than 0.1 second? -const minSleepDuration = time.Millisecond * 500 - -// NewQueue creates a new queue. There must be at least 1 thread -// For every thread, TxWorker is assigned its own wallet with an offset -// Each TxWorker uses its wallet to sign and broadcast messages -// Queue sleeps for refreshInterval after Queue distributes messages to the workers -func NewQueue(w *wallet.Wallet, config config.QueueConfig, authedClaimers []string) (*Queue, error) { - if config.QueueThreads < 1 { - return nil, errors.New("thread must be at least 1") - } - - refreshInterval := time.Duration(config.QueueInterval) * time.Second - if refreshInterval < minSleepDuration { - return nil, errors.New("refresh interval is too short") // TODO: improve this - } - - q := &Queue{ - wallet: w, - txWorkers: make([]*TxWorker, config.QueueThreads), - pool: make([]*Message, 0), - poolLock: &sync.Mutex{}, - refreshInterval: refreshInterval, - processed: time.Now(), - running: false, - } - - // temp tx worker to init children workers - parent := NewTxWorker( - q, - 0, - config.WorkerQueueSize, - config.TxBatchSize, - config.MaxRetryAttempt, - w) - - for i := 0; i < int(config.QueueThreads); i++ { - offset := byte(i + 1) - w, err := w.CloneWalletOffset(offset) - if err != nil { - // should be debugged if this happens - return nil, errors.Join(err, errors.New("failed to create offset wallet for txWorker")) - } - - // TODO: batch all auth claim tx into one tx - err = q.authNewClaimer(parent, w, authedClaimers) - if err != nil { - return nil, err // don't want partial amount of threads - } - - worker := NewTxWorker( - q, - int8(i), - config.WorkerQueueSize, - config.TxBatchSize, - config.MaxRetryAttempt, - w) - - q.txWorkers = append(q.txWorkers, worker) - } - - return q, nil -} - -func (q *Queue) Add(msg sdk.Msg) (*Message, *sync.WaitGroup) { - var wg sync.WaitGroup - - wg.Add(1) - - m := &Message{ - msg: msg, - wg: &wg, - err: nil, - } - - q.addLast(m) - - return m, &wg -} - -func (q *Queue) Listen() { - q.running = true - - for _, w := range q.txWorkers { - w.start() - } - log.Info().Msg("Queue module started") -} - -func (q *Queue) Stop() { - q.running = false - for _, w := range q.txWorkers { - w.stop() - } - log.Info().Msg("Queue module stopped") -} - -func (q *Queue) addLast(msgs *Message) { - q.poolLock.Lock() - defer q.poolLock.Unlock() - - q.pool = append(q.pool, msgs) -} - -func (q *Queue) request(count int) []*Message { - q.poolLock.Lock() - defer q.poolLock.Unlock() - if len(q.pool) == 0 { - return nil - } - - size := min(len(q.pool), count) - msgs := q.pool[:size] - - q.pool = q.pool[size:] - return msgs -} - -func (q *Queue) authNewClaimer(worker *TxWorker, w *wallet.Wallet, authedClaimers []string) error { - if slices.Contains(authedClaimers, w.AccAddress()) { - return nil - } - - msg := types.NewMsgAddClaimer(q.wallet.AccAddress(), w.AccAddress()) - - allowance := feegrant.BasicAllowance{ - SpendLimit: nil, - Expiration: nil, - } - - wadd, err := sdk.AccAddressFromBech32(w.AccAddress()) - if err != nil { - panic(err) - } - - hadd, err := sdk.AccAddressFromBech32(q.wallet.AccAddress()) - if err != nil { - panic(err) - } - - grantMsg, nerr := feegrant.NewMsgGrantAllowance(&allowance, wadd, hadd) - if nerr != nil { - panic(nerr) - } - - var wg sync.WaitGroup - wg.Add(2) - - addClaimerMsg := &Message{ - msg: msg, - wg: &wg, - err: nil, - } - - feeGrantMsg := &Message{ - msg: grantMsg, - wg: &wg, - err: nil, - } - - err = worker.processBatch([]*Message{addClaimerMsg, feeGrantMsg}) - - wg.Wait() - if errs := errors.Join(err, addClaimerMsg.err, feeGrantMsg.err); errs != nil { - return errs - } - - return nil +type Queue interface { + Add(msg types.Msg) (*Message, *sync.WaitGroup) + Listen() + Stop() } diff --git a/queue/types.go b/queue/types.go index da30f06..eee8770 100644 --- a/queue/types.go +++ b/queue/types.go @@ -2,34 +2,10 @@ package queue import ( "sync" - "time" "github.com/cosmos/cosmos-sdk/types" - "github.com/desmos-labs/cosmos-go-wallet/wallet" ) -type TxWorker struct { - pool *Queue - id int8 - wallet *wallet.Wallet - // not concurrent safe - buffer []*Message - bufferSize int16 - batchSize int8 - maxRetryAttempt int8 - running bool -} - -type Queue struct { - txWorkers []*TxWorker - wallet *wallet.Wallet - refreshInterval time.Duration - pool []*Message - poolLock *sync.Mutex - processed time.Time - running bool -} - type Message struct { msg types.Msg wg *sync.WaitGroup diff --git a/queue/worker.go b/queue/worker.go index 0b38620..a8cab22 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -7,109 +7,103 @@ import ( "github.com/desmos-labs/cosmos-go-wallet/wallet" "github.com/cosmos/cosmos-sdk/types" - + "github.com/rs/zerolog/log" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - - "github.com/rs/zerolog/log" ) -// offsetWallet must be registered as authorized claimer on chain -func NewTxWorker(pool *Queue, id int8, bufferSize int16, batchSize int8, maxRetryAttempt int8, offsetWallet *wallet.Wallet) *TxWorker { - return &TxWorker{ - pool: pool, +// TODO: change these to a config +const batchSize = 42 +const timerDuration = time.Second * 5 + +type worker struct { + id int8 + wallet *wallet.Wallet // offset wallet + maxRetryAttempt int8 + stop chan struct{} + batch []*Message +} + +func newWorker(id int8, wallet *wallet.Wallet, maxRetryAttempt int8) *worker { + return &worker{ id: id, - wallet: offsetWallet, - buffer: make([]*Message, 0, bufferSize), - bufferSize: bufferSize, - batchSize: batchSize, - maxRetryAttempt: maxRetryAttempt, - running: false, + wallet: wallet, + maxRetryAttempt: int8(maxRetryAttempt), + stop: make(chan struct{}), } } -func (t *TxWorker) Address() string { - return t.wallet.AccAddress() +func (w *worker) Stop() { + close(w.stop) } -func (t *TxWorker) available() int { - return int(t.bufferSize) - len(t.buffer) +func (w *worker) start(msg <-chan *Message) { + timer := time.NewTimer(timerDuration) // if no msg comes for 5 seconds, broadcast tx +run: + for { + select { + case <-w.stop: + timer.Stop() + break run + + case m := <-msg: + if len(w.batch) >= batchSize { + w.send() + } + w.add(m) + timer.Reset(timerDuration) + + case <-timer.C: + w.send() + timer.Stop() + } + } } -func (t *TxWorker) getWork() { - msgs := t.pool.request(t.available()) - if msgs == nil { - time.Sleep(t.pool.refreshInterval) +func (w *worker) add(msg *Message) { + if w.batch == nil { + w.batch = []*Message{msg} + return } - t.buffer = append(t.buffer, msgs...) -} -func (t *TxWorker) getBatch() []*Message { - size := min(len(t.buffer), int(t.batchSize)) - msgs := t.buffer[:size] - t.buffer = t.buffer[size:] - return msgs + w.batch = append(w.batch, msg) } -func (t *TxWorker) processBatch(b []*Message) error { - msgs := make([]types.Msg, len(b)) - for i, m := range b { - msgs[i] = m.msg +func (w *worker) send() { + msg := make([]types.Msg, 0, len(w.batch)) + for _, m := range w.batch { + msg = append(msg, m.msg) } - data := walletTypes.NewTransactionData(msgs...).WithGasAuto().WithFeeAuto() + txData := walletTypes.NewTransactionData(msg...).WithFeeAuto().WithGasAuto() var resp *types.TxResponse var err error a := 0 -Retry: - for a := 0; a < int(t.maxRetryAttempt); a++ { - resp, err = t.wallet.BroadcastTxCommit(data) + +retry: + for ; a < int(w.maxRetryAttempt); a++ { + resp, err = w.wallet.BroadcastTxCommit(txData) switch code := status.Code(err); code { case codes.AlreadyExists, codes.NotFound, codes.OK: - break Retry + break retry } + // TODO: change this to a config + time.Sleep(time.Second) // sleep for a bit before retrying } - if a == int(t.maxRetryAttempt) { + if a == int(w.maxRetryAttempt) { log.Error(). - Int8("id", t.id). - Int8("max attempt", t.maxRetryAttempt). - Int("msg size", len(b)). + Int8("id", w.id). + Int8("max attempt", w.maxRetryAttempt). + Int("msg size", len(msg)). + Err(err). Msg("queue worker batch msg broadcast exceeded max retry attempts") } - for _, m := range b { + for _, m := range w.batch { m.res = resp m.err = err m.wg.Done() } - return err -} - -func (t *TxWorker) start() { - t.running = true - defer t.stop() - for t.running { - if len(t.buffer) == 0 { - t.getWork() // blocks the loop - } - - batch := t.getBatch() - start := time.Now() - err := t.processBatch(batch) // blocks until tx goes through or exceeds retry attempts - if err != nil { - log.Error(). - Err(err). - Int8("id", t.id). - Time("started at", start). - Time("finished at", time.Now()). - Int("batchSize", len(batch)). - Msg("error while processing messages") - } - } -} - -func (t *TxWorker) stop() { - t.running = false } From 125c590a20472bc75f8140b68de55c89ed32f315 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 21 Apr 2025 15:07:56 -0700 Subject: [PATCH 09/55] replace stop channel with msg output channel --- queue/worker.go | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/queue/worker.go b/queue/worker.go index a8cab22..c1eb96a 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -7,7 +7,9 @@ import ( "github.com/desmos-labs/cosmos-go-wallet/wallet" "github.com/cosmos/cosmos-sdk/types" + "github.com/rs/zerolog/log" + "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -20,44 +22,48 @@ type worker struct { id int8 wallet *wallet.Wallet // offset wallet maxRetryAttempt int8 - stop chan struct{} + msgIn <-chan *Message // worker stop if this closes batch []*Message } -func newWorker(id int8, wallet *wallet.Wallet, maxRetryAttempt int8) *worker { +func newWorker(id int8, wallet *wallet.Wallet, maxRetryAttempt int8, msgIn <-chan *Message) *worker { return &worker{ id: id, wallet: wallet, maxRetryAttempt: int8(maxRetryAttempt), - stop: make(chan struct{}), + msgIn: msgIn, } } -func (w *worker) Stop() { - close(w.stop) -} - -func (w *worker) start(msg <-chan *Message) { +func (w *worker) start() { timer := time.NewTimer(timerDuration) // if no msg comes for 5 seconds, broadcast tx run: for { select { - case <-w.stop: - timer.Stop() - break run - - case m := <-msg: + case m, ok := <-w.msgIn: + if !ok { + break run + } if len(w.batch) >= batchSize { w.send() + timer.Stop() } w.add(m) timer.Reset(timerDuration) case <-timer.C: - w.send() + if len(w.batch) > 0 { + w.send() + } timer.Stop() } } + + log.Info().Int8("id", w.id).Msg("queue worker stopped") + if len(w.batch) > 0 { // send the remaining messages + log.Info().Int8("id", w.id).Int("messages", len(w.batch)).Msg("sending remaining messages") + w.send() + } } func (w *worker) add(msg *Message) { @@ -70,10 +76,14 @@ func (w *worker) add(msg *Message) { } func (w *worker) send() { - msg := make([]types.Msg, 0, len(w.batch)) - for _, m := range w.batch { + toProcess := w.batch + w.batch = nil + + msg := make([]types.Msg, 0, len(toProcess)) + for _, m := range toProcess { msg = append(msg, m.msg) } + txData := walletTypes.NewTransactionData(msg...).WithFeeAuto().WithGasAuto() var resp *types.TxResponse @@ -101,7 +111,7 @@ retry: Msg("queue worker batch msg broadcast exceeded max retry attempts") } - for _, m := range w.batch { + for _, m := range toProcess { m.res = resp m.err = err m.wg.Done() From 27313d392fdb3382dc22b43d6f002d8aa9a628ca Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 21 Apr 2025 17:11:51 -0700 Subject: [PATCH 10/55] send msg to free worker channel --- queue/pool.go | 76 ++++++++++++++++++++++++++++++++----------------- queue/worker.go | 2 +- 2 files changed, 51 insertions(+), 27 deletions(-) diff --git a/queue/pool.go b/queue/pool.go index ef88a33..f5f5063 100644 --- a/queue/pool.go +++ b/queue/pool.go @@ -3,6 +3,7 @@ package queue import ( "context" "errors" + "reflect" "slices" "sync" @@ -20,43 +21,46 @@ import ( var _ Queue = &Pool{} type Pool struct { - workers []*worker - wallet *wallet.Wallet - msgInput chan *Message - bufferIn chan<- *Message - bufferOut <-chan *Message + workers []*worker + workerChannels []chan *Message // worker id should correspond to index of this + wallet *wallet.Wallet } func NewPool(wallet *wallet.Wallet, config config.QueueConfig) (*Pool, error) { - msgChannel := make(chan *Message) - bufferIn := make(chan *Message) - bufferOut := newBuffer(bufferIn) - pool := &Pool{ - wallet: wallet, - msgInput: msgChannel, - bufferIn: bufferIn, - bufferOut: bufferOut, - } - workerWallets, err := initAuthClaimers(wallet, config.QueueThreads) if err != nil { return nil, errors.Join(errors.New("failed to initialize auth claimers"), err) } - workers := createWorkers(workerWallets, config.MaxRetryAttempt) - pool.workers = workers + workers, workerChannels := createWorkers(workerWallets, config.MaxRetryAttempt) + if workers == nil { + panic("no workers created") + } + if workerChannels == nil { + panic("no worker channels created") + } + if len(workerChannels) != len(workers) { + panic("size of workers does not match size of worker channels") + } + + pool := &Pool{ + wallet: wallet, + workers: workers, + workerChannels: workerChannels, + } return pool, nil } func (p *Pool) Stop() { - close(p.msgInput) - close(p.bufferIn) + for _, c := range p.workerChannels { + close(c) + } } func (p *Pool) Listen() { - for m := range p.msgInput { - p.bufferIn <- m + for _, w := range p.workers { + go w.start() } } @@ -68,22 +72,42 @@ func (p *Pool) Add(msg types.Msg) (*Message, *sync.WaitGroup) { wg: &wg, err: nil, res: nil, - msgIndex: -1, + msgIndex: -1, // no longer relevant(?) } - p.msgInput <- m + _ = p.sendToAny(m) return m, &wg } -func createWorkers(workerWallets []*wallet.Wallet, maxRetryAttempt int8) []*worker { +func (p *Pool) sendToAny(msg *Message) (workerId int) { + set := make([]reflect.SelectCase, 0, len(p.workerChannels)) + for _, ch := range p.workerChannels { + set = append(set, reflect.SelectCase{ + Dir: reflect.SelectSend, + Chan: reflect.ValueOf(ch), + Send: reflect.ValueOf(msg), + }) + } + + // blocks until a worker is free + to, _, _ := reflect.Select(set) + return to +} + +func createWorkers(workerWallets []*wallet.Wallet, maxRetryAttempt int8) ([]*worker, []chan *Message) { + wChannels := make([]chan *Message, 0, len(workerWallets)) + for _ = range len(workerWallets) { + wChannels = append(wChannels, make(chan *Message)) + } + workers := make([]*worker, 0, len(workerWallets)) for i, w := range workerWallets { - worker := newWorker(int8(i), w, maxRetryAttempt) + worker := newWorker(int8(i), w, maxRetryAttempt, wChannels[i]) workers = append(workers, worker) } - return workers + return workers, wChannels } func initAuthClaimers(wallet *wallet.Wallet, count int8) (workerWallets []*wallet.Wallet, err error) { diff --git a/queue/worker.go b/queue/worker.go index c1eb96a..b594dce 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -41,7 +41,7 @@ run: for { select { case m, ok := <-w.msgIn: - if !ok { + if !ok { // pool closed the channel, stop worker break run } if len(w.batch) >= batchSize { From bf12c6397ee716bd2ebeaf3ea4f814ec14da2c2f Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 23 Apr 2025 21:44:00 -0700 Subject: [PATCH 11/55] clean up compile errors --- core/app.go | 5 ++--- proofs/proofs.go | 2 +- queue/pool.go | 23 ----------------------- strays/hands.go | 2 +- strays/manager.go | 2 +- 5 files changed, 5 insertions(+), 29 deletions(-) diff --git a/core/app.go b/core/app.go index 44d0d9a..383ddae 100644 --- a/core/app.go +++ b/core/app.go @@ -41,7 +41,7 @@ import ( type App struct { api *api.API - q *queue.Queue + q queue.Queue prover *proofs.Prover strayManager *strays.StrayManager home string @@ -249,8 +249,7 @@ func (a *App) Start() error { return err } - refreshInterval := time.Second * time.Duration(cfg.QueueInterval) - a.q, err = queue.NewQueue(a.wallet, refreshInterval, cfg.QueueThreads) + a.q, err = queue.NewPool(a.wallet, cfg.QueueConfig) if err != nil { log.Error().Err(err).Msg("failed to initialize Queue module") return err diff --git a/proofs/proofs.go b/proofs/proofs.go index 3630bf6..667847b 100644 --- a/proofs/proofs.go +++ b/proofs/proofs.go @@ -316,7 +316,7 @@ func (p *Prover) Stop() { p.running = false } -func NewProver(wallet *wallet.Wallet, q *queue.Queue, io FileSystem, interval int64, threads int16, chunkSize int) *Prover { +func NewProver(wallet *wallet.Wallet, q queue.Queue, io FileSystem, interval int64, threads int16, chunkSize int) *Prover { p := Prover{ running: false, wallet: wallet, diff --git a/queue/pool.go b/queue/pool.go index f5f5063..aabcf57 100644 --- a/queue/pool.go +++ b/queue/pool.go @@ -157,26 +157,3 @@ func newOffsetWallet(main *wallet.Wallet, index int) *wallet.Wallet { } return w } - -func newBuffer(in <-chan *Message) <-chan *Message { - // From: https://blogtitle.github.io/go-advanced-concurrency-patterns-part-4-unlimited-buffer-channels/ - var buf []*Message - out := make(chan *Message) - - go func() { - defer close(out) - for msg := range in { - select { - case out <- msg: - default: - buf = append(buf, msg) - } - } - - for _, v := range buf { - out <- v - } - }() - - return out -} diff --git a/strays/hands.go b/strays/hands.go index 8544c92..54b4f10 100644 --- a/strays/hands.go +++ b/strays/hands.go @@ -112,7 +112,7 @@ func (h *Hand) Take(stray *types.UnifiedFile) { h.stray = stray } -func (s *StrayManager) NewHand(q *queue.Queue) (*Hand, error) { +func (s *StrayManager) NewHand(q queue.Queue) (*Hand, error) { offset := byte(len(s.hands)) + 1 w, err := s.wallet.CloneWalletOffset(offset) diff --git a/strays/manager.go b/strays/manager.go index 8d5c32e..f89c4c3 100644 --- a/strays/manager.go +++ b/strays/manager.go @@ -17,7 +17,7 @@ import ( "github.com/rs/zerolog/log" ) -func NewStrayManager(w *wallet.Wallet, q *queue.Queue, interval int64, refreshInterval int64, handCount int, authList []string) *StrayManager { +func NewStrayManager(w *wallet.Wallet, q queue.Queue, interval int64, refreshInterval int64, handCount int, authList []string) *StrayManager { s := &StrayManager{ rand: rand.New(rand.NewSource(time.Now().Unix())), wallet: w, From 5ae1615bae3b7646da1cb7d1d65bb03e7ea975db Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 23 Apr 2025 22:15:59 -0700 Subject: [PATCH 12/55] tx timer and batch size config --- config/types.go | 8 ++++---- queue/pool.go | 6 +++--- queue/worker.go | 14 +++++++------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/config/types.go b/config/types.go index 80b2a92..89b905d 100644 --- a/config/types.go +++ b/config/types.go @@ -139,13 +139,13 @@ func DefaultChainConfig() ChainConfig { type QueueConfig struct { // seconds QueueInterval int64 `yaml:"queue_interval" mapstructure:"queue_interval"` - QueueThreads int8 `yaml:"queue_threads" mapstructure:"queue_threads"` + // seconds + TxTimer int16 `yaml:"tx_timer" mapstructure:"tx_timer"` + QueueThreads int8 `yaml:"queue_threads" mapstructure:"queue_threads"` // resend tx if network isn't responding MaxRetryAttempt int8 `yaml:"max_retry_attempt" mapstructure:"max_retry_attempt"` // group individual messages into one tx TxBatchSize int8 `yaml:"tx_batch_size" mapstructure:"tx_batch_size"` - // worker's own message pool, set this value > TxBatchSize - WorkerQueueSize int16 `yaml:"worker_queue_size" mapstructure:"worker_queue_size"` } func DefaultQueueConfig() QueueConfig { @@ -154,7 +154,7 @@ func DefaultQueueConfig() QueueConfig { QueueThreads: 5, MaxRetryAttempt: 100, TxBatchSize: 45, - WorkerQueueSize: 100, + TxTimer: 3, } } diff --git a/queue/pool.go b/queue/pool.go index aabcf57..edd273f 100644 --- a/queue/pool.go +++ b/queue/pool.go @@ -32,7 +32,7 @@ func NewPool(wallet *wallet.Wallet, config config.QueueConfig) (*Pool, error) { return nil, errors.Join(errors.New("failed to initialize auth claimers"), err) } - workers, workerChannels := createWorkers(workerWallets, config.MaxRetryAttempt) + workers, workerChannels := createWorkers(workerWallets, int(config.TxTimer), int(config.TxBatchSize), config.MaxRetryAttempt) if workers == nil { panic("no workers created") } @@ -95,7 +95,7 @@ func (p *Pool) sendToAny(msg *Message) (workerId int) { return to } -func createWorkers(workerWallets []*wallet.Wallet, maxRetryAttempt int8) ([]*worker, []chan *Message) { +func createWorkers(workerWallets []*wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8) ([]*worker, []chan *Message) { wChannels := make([]chan *Message, 0, len(workerWallets)) for _ = range len(workerWallets) { wChannels = append(wChannels, make(chan *Message)) @@ -103,7 +103,7 @@ func createWorkers(workerWallets []*wallet.Wallet, maxRetryAttempt int8) ([]*wor workers := make([]*worker, 0, len(workerWallets)) for i, w := range workerWallets { - worker := newWorker(int8(i), w, maxRetryAttempt, wChannels[i]) + worker := newWorker(int8(i), w, txTimer, batchSize, maxRetryAttempt, wChannels[i]) workers = append(workers, worker) } diff --git a/queue/worker.go b/queue/worker.go index b594dce..0503ce6 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -14,24 +14,24 @@ import ( "google.golang.org/grpc/status" ) -// TODO: change these to a config -const batchSize = 42 -const timerDuration = time.Second * 5 - type worker struct { id int8 wallet *wallet.Wallet // offset wallet maxRetryAttempt int8 msgIn <-chan *Message // worker stop if this closes batch []*Message + batchSize int + txTimer int } -func newWorker(id int8, wallet *wallet.Wallet, maxRetryAttempt int8, msgIn <-chan *Message) *worker { +func newWorker(id int8, wallet *wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8, msgIn <-chan *Message) *worker { return &worker{ id: id, wallet: wallet, maxRetryAttempt: int8(maxRetryAttempt), msgIn: msgIn, + batchSize: batchSize, + txTimer: txTimer, } } @@ -44,12 +44,12 @@ run: if !ok { // pool closed the channel, stop worker break run } - if len(w.batch) >= batchSize { + if len(w.batch) >= w.batchSize { w.send() timer.Stop() } w.add(m) - timer.Reset(timerDuration) + timer.Reset(time.Second * time.Duration(w.txTimer)) case <-timer.C: if len(w.batch) > 0 { From bdf7f77b705688ec12d01acaa22639edccbb0c55 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 23 Apr 2025 22:18:01 -0700 Subject: [PATCH 13/55] fix build error --- queue/worker.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/queue/worker.go b/queue/worker.go index 0503ce6..2ee292b 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -21,7 +21,7 @@ type worker struct { msgIn <-chan *Message // worker stop if this closes batch []*Message batchSize int - txTimer int + txTimer time.Duration } func newWorker(id int8, wallet *wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8, msgIn <-chan *Message) *worker { @@ -31,12 +31,12 @@ func newWorker(id int8, wallet *wallet.Wallet, txTimer int, batchSize int, maxRe maxRetryAttempt: int8(maxRetryAttempt), msgIn: msgIn, batchSize: batchSize, - txTimer: txTimer, + txTimer: time.Duration(txTimer) * time.Second, } } func (w *worker) start() { - timer := time.NewTimer(timerDuration) // if no msg comes for 5 seconds, broadcast tx + timer := time.NewTimer(w.txTimer) // if no msg comes for 5 seconds, broadcast tx run: for { select { @@ -49,7 +49,7 @@ run: timer.Stop() } w.add(m) - timer.Reset(time.Second * time.Duration(w.txTimer)) + timer.Reset(w.txTimer) case <-timer.C: if len(w.batch) > 0 { From 534f3e402c169db96bebfa95c232c115563a1b34 Mon Sep 17 00:00:00 2001 From: Daniel Ahn Date: Mon, 28 Apr 2025 16:52:52 -0700 Subject: [PATCH 14/55] max retry error --- queue/types.go | 5 +++++ queue/worker.go | 2 ++ 2 files changed, 7 insertions(+) diff --git a/queue/types.go b/queue/types.go index eee8770..dfadc16 100644 --- a/queue/types.go +++ b/queue/types.go @@ -1,11 +1,16 @@ package queue import ( + "errors" "sync" "github.com/cosmos/cosmos-sdk/types" ) +var ( + ReachedMaxRetry = errors.New("send retry attempt reached max retry") +) + type Message struct { msg types.Msg wg *sync.WaitGroup diff --git a/queue/worker.go b/queue/worker.go index 2ee292b..50f8ac2 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -1,6 +1,7 @@ package queue import ( + "errors" "time" walletTypes "github.com/desmos-labs/cosmos-go-wallet/types" @@ -109,6 +110,7 @@ retry: Int("msg size", len(msg)). Err(err). Msg("queue worker batch msg broadcast exceeded max retry attempts") + err = errors.Join(ReachedMaxRetry, err) } for _, m := range toProcess { From fbfa22505eb3e568fa7d096d4df48dfa830e24be Mon Sep 17 00:00:00 2001 From: Daniel Ahn Date: Mon, 28 Apr 2025 16:53:17 -0700 Subject: [PATCH 15/55] test max retry --- queue/worker_test.go | 54 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 queue/worker_test.go diff --git a/queue/worker_test.go b/queue/worker_test.go new file mode 100644 index 0000000..e7b4e92 --- /dev/null +++ b/queue/worker_test.go @@ -0,0 +1,54 @@ +package queue + +import ( + "sync" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/JackalLabs/sequoia/config" + sequoiaWallet "github.com/JackalLabs/sequoia/wallet" + wtypes "github.com/desmos-labs/cosmos-go-wallet/types" + + "github.com/jackalLabs/canine-chain/v4/x/storage/types" +) + +func TestWorkerSendMaxRetry(t *testing.T) { + r := require.New(t) + + chainCfg := wtypes.ChainConfig{ + RPCAddr: "http://localhost:26657", + GRPCAddr: "localhost:9090", + GasPrice: "0.02ujkl", + GasAdjustment: 1.5, + Bech32Prefix: "jkl", + } + + s := &config.Seed{ + SeedPhrase: "forward service profit benefit punch catch fan chief jealous steel harvest column spell rude warm home melody hat broccoli pulse say garlic you firm", + DerivationPath: "m/44'/118'/0'/0/0", + } + + wallet, err := sequoiaWallet.CreateWallet(s.SeedPhrase, s.DerivationPath, chainCfg) + r.NoError(err) + + chMsg := make(chan *Message) + w := newWorker(0, wallet, 1, 10, 3, chMsg) + + wg := sync.WaitGroup{} + wg.Add(1) + + msg := types.NewMsgPostProof(w.wallet.AccAddress(), []byte("hello"), "owner", 0, []byte("item"), []byte("list"), 0) + m := Message{ + msg: msg, + wg: &wg, + } + + w.batch = append(w.batch, &m) + + t.Log("sending msg") + w.send() + + wg.Wait() + r.ErrorIs(m.err, ReachedMaxRetry) +} From 2eed453c045761f887c36a2dbbde5ffac5ee47ad Mon Sep 17 00:00:00 2001 From: Daniel Ahn Date: Wed, 30 Apr 2025 17:40:22 -0700 Subject: [PATCH 16/55] worker test --- go.mod | 136 ++++++++++---------- go.sum | 298 +++++++++++++++++++++++-------------------- queue/worker_test.go | 3 + 3 files changed, 233 insertions(+), 204 deletions(-) diff --git a/go.mod b/go.mod index 15c7ee6..124ad24 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,15 @@ module github.com/JackalLabs/sequoia -go 1.22.2 +go 1.23.5 -toolchain go1.22.5 +toolchain go1.24.0 require ( github.com/cosmos/cosmos-sdk v0.45.17 github.com/cosmos/go-bip39 v1.0.0 - github.com/cosmos/gogoproto v1.4.12 + github.com/cosmos/gogoproto v1.7.0 github.com/desmos-labs/cosmos-go-wallet v0.7.2 - github.com/dgraph-io/badger/v4 v4.2.0 + github.com/dgraph-io/badger/v4 v4.5.1 github.com/gorilla/mux v1.8.1 github.com/hsanjuan/ipfs-lite v1.8.2 github.com/ipfs/boxo v0.17.0 @@ -22,15 +22,15 @@ require ( github.com/json-iterator/go v1.1.12 github.com/libp2p/go-libp2p v0.32.2 github.com/multiformats/go-multiaddr v0.12.3 - github.com/prometheus/client_golang v1.18.0 - github.com/rs/cors v1.11.0 + github.com/prometheus/client_golang v1.20.5 + github.com/rs/cors v1.11.1 github.com/rs/zerolog v1.33.0 - github.com/spf13/cobra v1.8.0 - github.com/spf13/viper v1.16.0 - github.com/stretchr/testify v1.9.0 + github.com/spf13/cobra v1.8.1 + github.com/spf13/viper v1.19.0 + github.com/stretchr/testify v1.10.0 github.com/tendermint/tendermint v0.34.27 github.com/wealdtech/go-merkletree/v2 v2.6.0 - google.golang.org/grpc v1.61.1 + google.golang.org/grpc v1.70.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -41,12 +41,14 @@ require ( filippo.io/edwards25519 v1.0.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d // indirect github.com/CosmWasm/wasmd v0.32.0 // indirect github.com/CosmWasm/wasmvm v1.2.6 // indirect github.com/DataDog/zstd v1.5.2 // indirect github.com/Jorropo/jsync v1.0.1 // indirect github.com/Workiva/go-datastructures v1.0.53 // indirect + github.com/adlio/schema v1.3.6 // indirect github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5 // indirect github.com/armon/go-metrics v0.4.1 // indirect @@ -54,16 +56,19 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect + github.com/btcsuite/btcd/btcutil v1.1.6 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect + github.com/cockroachdb/pebble v1.1.2 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/coinbase/rosetta-sdk-go v0.7.9 // indirect - github.com/cometbft/cometbft-db v0.7.0 // indirect + github.com/cometbft/cometbft-db v1.0.1 // indirect github.com/confio/ics23/go v0.9.1 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect @@ -79,12 +84,13 @@ require ( github.com/creachadair/taskgroup v0.3.2 // indirect github.com/cskr/pubsub v1.0.2 // indirect github.com/danieljoos/wincred v1.1.2 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect - github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 // indirect + github.com/dgraph-io/ristretto/v2 v2.1.0 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/go-units v0.5.0 // indirect @@ -93,35 +99,35 @@ require ( github.com/ecies/go/v2 v2.0.6 // indirect github.com/elastic/gosigar v0.14.2 // indirect github.com/ethereum/go-ethereum v1.13.15 // indirect - github.com/felixge/httpsnoop v1.0.2 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect github.com/flynn/noise v1.0.1 // indirect github.com/francoispqt/gojay v1.2.13 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/gateway v1.1.0 // indirect github.com/gogo/protobuf v1.3.3 // indirect - github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect - github.com/google/flatbuffers v1.12.1 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/flatbuffers v24.12.23+incompatible // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/gopacket v1.1.19 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/google/pprof v0.0.0-20231229205709-960ae82b1e42 // indirect - github.com/google/uuid v1.5.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/handlers v1.5.1 // indirect - github.com/gorilla/websocket v1.5.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect @@ -156,12 +162,12 @@ require ( github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jbenet/goprocess v0.1.4 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.17.4 // indirect + github.com/klauspost/compress v1.17.11 // indirect github.com/klauspost/cpuid/v2 v2.2.6 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect - github.com/lib/pq v1.10.7 // indirect + github.com/lib/pq v1.10.9 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect @@ -175,17 +181,16 @@ require ( github.com/libp2p/go-netroute v0.2.1 // indirect github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/libp2p/go-yamux/v4 v4.0.1 // indirect - github.com/linxGnu/grocksdb v1.7.10 // indirect + github.com/linxGnu/grocksdb v1.9.3 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/miekg/dns v1.1.57 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect - github.com/minio/highwayhash v1.0.2 // indirect + github.com/minio/highwayhash v1.0.3 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -201,19 +206,21 @@ require ( github.com/multiformats/go-multihash v0.2.3 // indirect github.com/multiformats/go-multistream v0.5.0 // indirect github.com/multiformats/go-varint v0.0.7 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/onsi/ginkgo/v2 v2.13.2 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0-rc5 // indirect github.com/opencontainers/runtime-spec v1.1.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect - github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/polydawn/refmt v0.89.0 // indirect - 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/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/quic-go/qpack v0.4.0 // indirect github.com/quic-go/qtls-go1-20 v0.4.1 // indirect github.com/quic-go/quic-go v0.40.1 // indirect @@ -222,17 +229,18 @@ require ( github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/regen-network/cosmos-proto v0.3.1 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/sasha-s/go-deadlock v0.3.1 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/afero v1.9.5 // indirect - github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/subosito/gotenv v1.4.2 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect - github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/tendermint/go-amino v0.16.0 // indirect github.com/tendermint/tm-db v0.6.7 // indirect github.com/tidwall/btree v1.5.0 // indirect @@ -240,30 +248,30 @@ require ( github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect - go.etcd.io/bbolt v1.3.7 // indirect + go.etcd.io/bbolt v1.3.11 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.21.0 // indirect - go.opentelemetry.io/otel/metric v1.21.0 // indirect - go.opentelemetry.io/otel/trace v1.21.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect go.uber.org/dig v1.17.1 // indirect go.uber.org/fx v1.20.1 // indirect go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect - golang.org/x/mod v0.15.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/tools v0.18.0 // indirect - gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 // indirect - google.golang.org/protobuf v1.33.0 // indirect + golang.org/x/crypto v0.32.0 // indirect + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect + golang.org/x/mod v0.19.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/term v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/tools v0.23.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a // indirect + google.golang.org/protobuf v1.36.4 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect lukechampine.com/blake3 v1.2.1 // indirect diff --git a/go.sum b/go.sum index 56272db..5f39e6a 100644 --- a/go.sum +++ b/go.sum @@ -6,7 +6,6 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -20,7 +19,6 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -44,7 +42,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= cosmossdk.io/api v0.4.1 h1:0ikaYM6GyxTYYcfBiyR8YnLCfhNnhKpEFnaSepCTmqg= cosmossdk.io/api v0.4.1/go.mod h1:jR7k5ok90LxW2lFUXvd8Vpo/dr4PpiyVegxdm7b1ZdE= @@ -69,8 +66,8 @@ github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOv github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -123,8 +120,8 @@ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/ github.com/Workiva/go-datastructures v1.0.53 h1:J6Y/52yX10Xc5JjXmGtWoSSxs3mZnGSaq37xZZh7Yig= github.com/Workiva/go-datastructures v1.0.53/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/Zilliqa/gozilliqa-sdk v1.2.1-0.20201201074141-dd0ecada1be6/go.mod h1:eSYp2T6f0apnuW8TzhV3f6Aff2SE8Dwio++U4ha4yEM= -github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= -github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= +github.com/adlio/schema v1.3.6 h1:k1/zc2jNfeiZBA5aFTRy37jlBIuCkXCm0XmvpzCKI9I= +github.com/adlio/schema v1.3.6/go.mod h1:qkxwLgPBd1FgLRHYVCmQT/rrBr3JH38J9LjmVzWNudg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= @@ -188,17 +185,25 @@ github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBT github.com/btcsuite/btcd v0.0.0-20190315201642-aa6e0f35703c/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.21.0-beta.0.20201114000516-e9c7a5ac6401/go.mod h1:Sv4JPQ3/M+teHz9Bo5jBpkNcP0x6r7rdihlNL/7tTAs= +github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd v0.22.2 h1:vBZ+lGGd1XubpOWO67ITJpAEsICWhA0YzqkcpkgNBfo= +github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= +github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= +github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= +github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= -github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= -github.com/btcsuite/btcd/btcutil v1.1.2/go.mod h1:UR7dsSJzJUfMmFiiLlIrMq1lS9jh9EdCV7FStZSnpi0= +github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= +github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= @@ -226,8 +231,9 @@ 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.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -250,18 +256,22 @@ github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaY github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= -github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= @@ -272,8 +282,8 @@ github.com/coinbase/rosetta-sdk-go v0.7.9 h1:lqllBjMnazTjIqYrOGv8h8jxjg9+hJazIGZ github.com/coinbase/rosetta-sdk-go v0.7.9/go.mod h1:0/knutI7XGVqXmmH4OQD8OckFrbQ8yMsUZTG7FXCR2M= github.com/cometbft/cometbft v0.34.27 h1:ri6BvmwjWR0gurYjywcBqRe4bbwc3QVs9KRcCzgh/J0= github.com/cometbft/cometbft v0.34.27/go.mod h1:BcCbhKv7ieM0KEddnYXvQZR+pZykTKReJJYf7YC7qhw= -github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= -github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= +github.com/cometbft/cometbft-db v1.0.1 h1:SylKuLseMLQKw3+i8y8KozZyJcQSL98qEe2CGMCGTYE= +github.com/cometbft/cometbft-db v1.0.1/go.mod h1:EBrFs1GDRiTqrWXYi4v90Awf/gcdD5ExzdPbg4X8+mk= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= @@ -310,8 +320,8 @@ github.com/cosmos/cosmos-sdk/ics23/go v0.8.0/go.mod h1:2a4dBq88TUoqoWAU5eu0lGvpF github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= -github.com/cosmos/gogoproto v1.4.12 h1:vB6Lbe/rtnYGjQuFxkPiPYiCybqFT8QvLipDZP8JpFE= -github.com/cosmos/gogoproto v1.4.12/go.mod h1:LnZob1bXRdUoqMMtwYlcR3wjiElmlC+FkjaZRv1/eLY= +github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= +github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cosmos/iavl v0.19.5 h1:rGA3hOrgNxgRM5wYcSCxgQBap7fW82WZgY78V9po/iY= @@ -328,7 +338,7 @@ github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwc github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668 h1:ZFUue+PNxmHlu7pYv+IYMtqlaO/0VwaGEqKepZf9JpA= github.com/crackcomm/go-gitignore v0.0.0-20231225121904-e25f5bc08668/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= @@ -348,8 +358,9 @@ github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnG github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= @@ -358,8 +369,9 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= @@ -368,12 +380,14 @@ github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFM github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/badger/v4 v4.2.0 h1:kJrlajbXXL9DFTNuhhu9yCx7JJa4qpYWxtE8BzuWsEs= -github.com/dgraph-io/badger/v4 v4.2.0/go.mod h1:qfCqhPoWDFJRx1gp5QwwyGo8xk1lbHUxvK9nK0OGAak= +github.com/dgraph-io/badger/v4 v4.5.1 h1:7DCIXrQjo1LKmM96YD+hLVJ2EEsyyoWxJfpdd56HLps= +github.com/dgraph-io/badger/v4 v4.5.1/go.mod h1:qn3Be0j3TfV4kPbVoK0arXCD1/nr1ftth6sbL5jxdoA= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.0.3/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 h1:Pux6+xANi0I7RRo5E1gflI4EZ2yx3BGZ75JkAIvGEOA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91/go.mod h1:swkazRqnUf1N62d0Nutz7KIj2UKqsm/H8tD0nBJAXqM= +github.com/dgraph-io/ristretto/v2 v2.1.0 h1:59LjpOJLNDULHh8MC4UaegN52lC4JnO2dITsie/Pa8I= +github.com/dgraph-io/ristretto/v2 v2.1.0/go.mod h1:uejeqfYXpUomfse0+lO+13ATz4TypQYLJZzBSAemuB4= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -443,8 +457,8 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= -github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= @@ -464,8 +478,9 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= @@ -473,8 +488,9 @@ github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIX github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -504,11 +520,12 @@ github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBj github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= @@ -569,8 +586,6 @@ github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -618,11 +633,11 @@ github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGS github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/flatbuffers v1.12.1 h1:MVlul7pQNoDzWRLTw5imwYsl+usrS1TXG2H4jg6ImGw= -github.com/google/flatbuffers v1.12.1/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v24.12.23+incompatible h1:ubBKR94NR4pXUCY/MUsRVzd9umNW7ht7EG9hHfS9FX8= +github.com/google/flatbuffers v24.12.23+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -663,7 +678,6 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -676,13 +690,12 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= @@ -700,8 +713,9 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -935,8 +949,8 @@ github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e github.com/klauspost/compress v1.15.10/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= -github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= @@ -961,6 +975,7 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= @@ -973,8 +988,8 @@ github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2 github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= @@ -1007,8 +1022,8 @@ github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCy github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linxGnu/grocksdb v1.7.10 h1:dz7RY7GnFUA+GJO6jodyxgkUeGMEkPp3ikt9hAcNGEw= -github.com/linxGnu/grocksdb v1.7.10/go.mod h1:0hTf+iA+GOr0jDX4CgIYyJZxqOH9XlBh6KVj8+zmF34= +github.com/linxGnu/grocksdb v1.9.3 h1:s1cbPcOd0cU2SKXRG1nEqCOWYAELQjdqg3RVI2MH9ik= +github.com/linxGnu/grocksdb v1.9.3/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= @@ -1054,8 +1069,6 @@ github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpe github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= @@ -1078,8 +1091,9 @@ github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjK github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= @@ -1137,6 +1151,8 @@ github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dy github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1196,10 +1212,10 @@ github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8P github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034= -github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= -github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= +github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss= +github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= @@ -1231,14 +1247,13 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU= -github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= @@ -1252,10 +1267,10 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4= github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -1272,8 +1287,8 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1282,8 +1297,8 @@ github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6T github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1298,8 +1313,8 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= -github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= -github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1312,8 +1327,8 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= @@ -1345,11 +1360,11 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= -github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= @@ -1358,9 +1373,13 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -1416,27 +1435,28 @@ github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -1445,8 +1465,8 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -1471,12 +1491,13 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/supranational/blst v0.3.8-0.20220526154634-513d2456b344/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= @@ -1487,8 +1508,6 @@ github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZ github.com/tdewolff/parse/v2 v2.6.3/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c h1:g+WoO5jjkqGAzHWCjJB1zZfXPIAaDpzXIEJ0eS6B5Ok= -github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tendermint/tm-db v0.6.7 h1:fE00Cbl0jayAoqlExN6oyQJ7fR/ZtoVOmvPJ//+shu8= @@ -1581,8 +1600,8 @@ github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1U go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= -go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0= +go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= @@ -1599,12 +1618,16 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= -go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= -go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= -go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1664,7 +1687,6 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -1676,8 +1698,8 @@ golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1695,8 +1717,8 @@ golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8H golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1729,8 +1751,8 @@ golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= -golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1781,7 +1803,6 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -1806,8 +1827,8 @@ golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1840,8 +1861,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1913,7 +1934,6 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1924,10 +1944,10 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1954,7 +1974,6 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1962,8 +1981,9 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1971,8 +1991,8 @@ golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= -golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1986,8 +2006,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2059,8 +2079,8 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -2068,8 +2088,8 @@ golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlz golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= -golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2081,8 +2101,8 @@ gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJ gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= -gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= @@ -2166,22 +2186,20 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917 h1:nz5NESFLZbJGPFxDT/HCn+V1mZ8JGNoY4nUpmW/Y2eg= -google.golang.org/genproto v0.0.0-20240102182953-50ed04b92917/go.mod h1:pZqR+glSb11aJ+JQcczCvgf47+duRuzNSKqE8YAQnV0= -google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1 h1:OPXtXn7fNMaXwO3JvOmF1QyTc00jsSFFz1vXXBOdCDo= -google.golang.org/genproto/googleapis/api v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1 h1:gphdwh0npgs8elJ4T6J+DQJHPVF7RsuJHCfwztUb4J4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240108191215-35c7eff3a6b1/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 h1:9+tzLLstTlPTRyJTh+ah5wIMsBW5c4tQwGTN3thOW9Y= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= +google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a h1:OAiGFfOiA0v9MRYsSidp3ubZaBnteRUyn3xB2ZQ5G/E= +google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a h1:hgh8P4EuoxpsuKMXX/To36nOFD7vixReXgn8lPGnt+o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= @@ -2212,8 +2230,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY= -google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2229,8 +2247,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= +google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/queue/worker_test.go b/queue/worker_test.go index e7b4e92..e364eaf 100644 --- a/queue/worker_test.go +++ b/queue/worker_test.go @@ -10,6 +10,8 @@ import ( sequoiaWallet "github.com/JackalLabs/sequoia/wallet" wtypes "github.com/desmos-labs/cosmos-go-wallet/types" + "github.com/JackalLabs/sequoia/testutils" + "github.com/jackalLabs/canine-chain/v4/x/storage/types" ) @@ -31,6 +33,7 @@ func TestWorkerSendMaxRetry(t *testing.T) { wallet, err := sequoiaWallet.CreateWallet(s.SeedPhrase, s.DerivationPath, chainCfg) r.NoError(err) + wallet.Client.RPCClient = &testutils.MockRPCClient{} chMsg := make(chan *Message) w := newWorker(0, wallet, 1, 10, 3, chMsg) From f78e4b868c9a568a1a59c5ea199db0f3a34ac93a Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 30 Apr 2025 18:13:39 -0700 Subject: [PATCH 17/55] mock auth query client --- testutil/mocks/auth.go | 10 +++ testutil/mocks/auth_mocks.go | 123 +++++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 testutil/mocks/auth.go create mode 100644 testutil/mocks/auth_mocks.go diff --git a/testutil/mocks/auth.go b/testutil/mocks/auth.go new file mode 100644 index 0000000..6336ea8 --- /dev/null +++ b/testutil/mocks/auth.go @@ -0,0 +1,10 @@ +// Only used to generate mocks +package mocks + +import ( + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +type AuthQueryClient interface { + authtypes.QueryClient +} diff --git a/testutil/mocks/auth_mocks.go b/testutil/mocks/auth_mocks.go new file mode 100644 index 0000000..8ce7a4a --- /dev/null +++ b/testutil/mocks/auth_mocks.go @@ -0,0 +1,123 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: auth.go +// +// Generated by this command: +// +// mockgen -source=auth.go +// + +// Package mock_mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + types "github.com/cosmos/cosmos-sdk/x/auth/types" + gomock "go.uber.org/mock/gomock" + grpc "google.golang.org/grpc" +) + +// MockAuthQueryClient is a mock of AuthQueryClient interface. +type MockAuthQueryClient struct { + ctrl *gomock.Controller + recorder *MockAuthQueryClientMockRecorder + isgomock struct{} +} + +// MockAuthQueryClientMockRecorder is the mock recorder for MockAuthQueryClient. +type MockAuthQueryClientMockRecorder struct { + mock *MockAuthQueryClient +} + +// NewMockAuthQueryClient creates a new mock instance. +func NewMockAuthQueryClient(ctrl *gomock.Controller) *MockAuthQueryClient { + mock := &MockAuthQueryClient{ctrl: ctrl} + mock.recorder = &MockAuthQueryClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAuthQueryClient) EXPECT() *MockAuthQueryClientMockRecorder { + return m.recorder +} + +// Account mocks base method. +func (m *MockAuthQueryClient) Account(ctx context.Context, in *types.QueryAccountRequest, opts ...grpc.CallOption) (*types.QueryAccountResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Account", varargs...) + ret0, _ := ret[0].(*types.QueryAccountResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Account indicates an expected call of Account. +func (mr *MockAuthQueryClientMockRecorder) Account(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Account", reflect.TypeOf((*MockAuthQueryClient)(nil).Account), varargs...) +} + +// Accounts mocks base method. +func (m *MockAuthQueryClient) Accounts(ctx context.Context, in *types.QueryAccountsRequest, opts ...grpc.CallOption) (*types.QueryAccountsResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Accounts", varargs...) + ret0, _ := ret[0].(*types.QueryAccountsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Accounts indicates an expected call of Accounts. +func (mr *MockAuthQueryClientMockRecorder) Accounts(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Accounts", reflect.TypeOf((*MockAuthQueryClient)(nil).Accounts), varargs...) +} + +// ModuleAccountByName mocks base method. +func (m *MockAuthQueryClient) ModuleAccountByName(ctx context.Context, in *types.QueryModuleAccountByNameRequest, opts ...grpc.CallOption) (*types.QueryModuleAccountByNameResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ModuleAccountByName", varargs...) + ret0, _ := ret[0].(*types.QueryModuleAccountByNameResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ModuleAccountByName indicates an expected call of ModuleAccountByName. +func (mr *MockAuthQueryClientMockRecorder) ModuleAccountByName(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ModuleAccountByName", reflect.TypeOf((*MockAuthQueryClient)(nil).ModuleAccountByName), varargs...) +} + +// Params mocks base method. +func (m *MockAuthQueryClient) Params(ctx context.Context, in *types.QueryParamsRequest, opts ...grpc.CallOption) (*types.QueryParamsResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Params", varargs...) + ret0, _ := ret[0].(*types.QueryParamsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Params indicates an expected call of Params. +func (mr *MockAuthQueryClientMockRecorder) Params(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Params", reflect.TypeOf((*MockAuthQueryClient)(nil).Params), varargs...) +} From d200bb47ef0d188efdb63b5e48f09689be7f0555 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 1 May 2025 22:07:46 -0700 Subject: [PATCH 18/55] mock auth client --- queue/worker_test.go | 22 ++++++++++++++++++++-- testutil/mocks/auth.go | 9 ++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/queue/worker_test.go b/queue/worker_test.go index e364eaf..31c1fd4 100644 --- a/queue/worker_test.go +++ b/queue/worker_test.go @@ -5,14 +5,19 @@ import ( "testing" "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" "github.com/JackalLabs/sequoia/config" sequoiaWallet "github.com/JackalLabs/sequoia/wallet" wtypes "github.com/desmos-labs/cosmos-go-wallet/types" - "github.com/JackalLabs/sequoia/testutils" + "github.com/JackalLabs/sequoia/testutil/mocks" "github.com/jackalLabs/canine-chain/v4/x/storage/types" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdkTypes "github.com/cosmos/cosmos-sdk/types" + authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) func TestWorkerSendMaxRetry(t *testing.T) { @@ -33,7 +38,20 @@ func TestWorkerSendMaxRetry(t *testing.T) { wallet, err := sequoiaWallet.CreateWallet(s.SeedPhrase, s.DerivationPath, chainCfg) r.NoError(err) - wallet.Client.RPCClient = &testutils.MockRPCClient{} + + queryClient := mocks.SetupAuthClient(t) + + baseAcc := authTypes.ProtoBaseAccount() + err = baseAcc.SetAddress(sdkTypes.AccAddress(wallet.AccAddress())) + r.NoError(err) + any, err := codectypes.NewAnyWithValue(baseAcc) + r.NoError(err) + queryResp := &authTypes.QueryAccountResponse{ + Account: any, + } + queryClient.EXPECT().Account(gomock.Any(), &authTypes.QueryAccountRequest{Address: wallet.AccAddress()}).Return(queryResp, nil).AnyTimes() + + wallet.Client.AuthClient = queryClient chMsg := make(chan *Message) w := newWorker(0, wallet, 1, 10, 3, chMsg) diff --git a/testutil/mocks/auth.go b/testutil/mocks/auth.go index 6336ea8..91b33a3 100644 --- a/testutil/mocks/auth.go +++ b/testutil/mocks/auth.go @@ -1,10 +1,17 @@ -// Only used to generate mocks package mocks import ( + "testing" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "go.uber.org/mock/gomock" ) type AuthQueryClient interface { authtypes.QueryClient } + +func SetupAuthClient(t *testing.T) *MockAuthQueryClient { + ctrl := gomock.NewController(t) + return NewMockAuthQueryClient(ctrl) +} From f5539f1a4c732da5b20a55fa32c4e7900b2a0139 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Fri, 2 May 2025 18:50:43 -0700 Subject: [PATCH 19/55] mock tx and rpc clients --- queue/worker_test.go | 23 + testutil/mocks/auth.go | 15 +- testutil/mocks/auth_mocks.go | 123 ----- testutil/mocks/expected_mocks.go | 19 + testutil/mocks/mocks.go | 866 +++++++++++++++++++++++++++++++ 5 files changed, 918 insertions(+), 128 deletions(-) delete mode 100644 testutil/mocks/auth_mocks.go create mode 100644 testutil/mocks/expected_mocks.go create mode 100644 testutil/mocks/mocks.go diff --git a/queue/worker_test.go b/queue/worker_test.go index 31c1fd4..e3362ce 100644 --- a/queue/worker_test.go +++ b/queue/worker_test.go @@ -5,7 +5,11 @@ import ( "testing" "github.com/stretchr/testify/require" + "github.com/tendermint/tendermint/p2p" + coretypes "github.com/tendermint/tendermint/rpc/core/types" "go.uber.org/mock/gomock" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "github.com/JackalLabs/sequoia/config" sequoiaWallet "github.com/JackalLabs/sequoia/wallet" @@ -17,6 +21,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdkTypes "github.com/cosmos/cosmos-sdk/types" + txTypes "github.com/cosmos/cosmos-sdk/types/tx" authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) @@ -53,6 +58,24 @@ func TestWorkerSendMaxRetry(t *testing.T) { wallet.Client.AuthClient = queryClient + serviceClient := mocks.SetupServiceClient(t) + + // auto gas & fees + simRes := txTypes.SimulateResponse{ + GasInfo: &sdkTypes.GasInfo{GasWanted: 0, GasUsed: 0}, + Result: nil, + } + serviceClient.EXPECT().Simulate(gomock.Any(), gomock.Any()).Return(&simRes, nil).AnyTimes() + wallet.Client.TxClient = serviceClient + + rpcClient := mocks.SetupRPCClient(t) + re := coretypes.ResultStatus{ + NodeInfo: p2p.DefaultNodeInfo{Network: "jackaaaal"}, + } + rpcClient.EXPECT().Status(gomock.Any()).Return(&re, nil).AnyTimes() + rpcClient.EXPECT().BroadcastTxCommit(gomock.Any(), gomock.Any()).Return(nil, status.Error(codes.Aborted, "haha")).AnyTimes() + wallet.Client.RPCClient = rpcClient + chMsg := make(chan *Message) w := newWorker(0, wallet, 1, 10, 3, chMsg) diff --git a/testutil/mocks/auth.go b/testutil/mocks/auth.go index 91b33a3..78aaf80 100644 --- a/testutil/mocks/auth.go +++ b/testutil/mocks/auth.go @@ -3,15 +3,20 @@ package mocks import ( "testing" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "go.uber.org/mock/gomock" ) -type AuthQueryClient interface { - authtypes.QueryClient -} - func SetupAuthClient(t *testing.T) *MockAuthQueryClient { ctrl := gomock.NewController(t) return NewMockAuthQueryClient(ctrl) } + +func SetupServiceClient(t *testing.T) *MockServiceClient { + ctrl := gomock.NewController(t) + return NewMockServiceClient(ctrl) +} + +func SetupRPCClient(t *testing.T) *MockRPCClient { + ctrl := gomock.NewController(t) + return NewMockRPCClient(ctrl) +} diff --git a/testutil/mocks/auth_mocks.go b/testutil/mocks/auth_mocks.go deleted file mode 100644 index 8ce7a4a..0000000 --- a/testutil/mocks/auth_mocks.go +++ /dev/null @@ -1,123 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: auth.go -// -// Generated by this command: -// -// mockgen -source=auth.go -// - -// Package mock_mocks is a generated GoMock package. -package mocks - -import ( - context "context" - reflect "reflect" - - types "github.com/cosmos/cosmos-sdk/x/auth/types" - gomock "go.uber.org/mock/gomock" - grpc "google.golang.org/grpc" -) - -// MockAuthQueryClient is a mock of AuthQueryClient interface. -type MockAuthQueryClient struct { - ctrl *gomock.Controller - recorder *MockAuthQueryClientMockRecorder - isgomock struct{} -} - -// MockAuthQueryClientMockRecorder is the mock recorder for MockAuthQueryClient. -type MockAuthQueryClientMockRecorder struct { - mock *MockAuthQueryClient -} - -// NewMockAuthQueryClient creates a new mock instance. -func NewMockAuthQueryClient(ctrl *gomock.Controller) *MockAuthQueryClient { - mock := &MockAuthQueryClient{ctrl: ctrl} - mock.recorder = &MockAuthQueryClientMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockAuthQueryClient) EXPECT() *MockAuthQueryClientMockRecorder { - return m.recorder -} - -// Account mocks base method. -func (m *MockAuthQueryClient) Account(ctx context.Context, in *types.QueryAccountRequest, opts ...grpc.CallOption) (*types.QueryAccountResponse, error) { - m.ctrl.T.Helper() - varargs := []any{ctx, in} - for _, a := range opts { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Account", varargs...) - ret0, _ := ret[0].(*types.QueryAccountResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Account indicates an expected call of Account. -func (mr *MockAuthQueryClientMockRecorder) Account(ctx, in any, opts ...any) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]any{ctx, in}, opts...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Account", reflect.TypeOf((*MockAuthQueryClient)(nil).Account), varargs...) -} - -// Accounts mocks base method. -func (m *MockAuthQueryClient) Accounts(ctx context.Context, in *types.QueryAccountsRequest, opts ...grpc.CallOption) (*types.QueryAccountsResponse, error) { - m.ctrl.T.Helper() - varargs := []any{ctx, in} - for _, a := range opts { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Accounts", varargs...) - ret0, _ := ret[0].(*types.QueryAccountsResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Accounts indicates an expected call of Accounts. -func (mr *MockAuthQueryClientMockRecorder) Accounts(ctx, in any, opts ...any) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]any{ctx, in}, opts...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Accounts", reflect.TypeOf((*MockAuthQueryClient)(nil).Accounts), varargs...) -} - -// ModuleAccountByName mocks base method. -func (m *MockAuthQueryClient) ModuleAccountByName(ctx context.Context, in *types.QueryModuleAccountByNameRequest, opts ...grpc.CallOption) (*types.QueryModuleAccountByNameResponse, error) { - m.ctrl.T.Helper() - varargs := []any{ctx, in} - for _, a := range opts { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "ModuleAccountByName", varargs...) - ret0, _ := ret[0].(*types.QueryModuleAccountByNameResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// ModuleAccountByName indicates an expected call of ModuleAccountByName. -func (mr *MockAuthQueryClientMockRecorder) ModuleAccountByName(ctx, in any, opts ...any) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]any{ctx, in}, opts...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ModuleAccountByName", reflect.TypeOf((*MockAuthQueryClient)(nil).ModuleAccountByName), varargs...) -} - -// Params mocks base method. -func (m *MockAuthQueryClient) Params(ctx context.Context, in *types.QueryParamsRequest, opts ...grpc.CallOption) (*types.QueryParamsResponse, error) { - m.ctrl.T.Helper() - varargs := []any{ctx, in} - for _, a := range opts { - varargs = append(varargs, a) - } - ret := m.ctrl.Call(m, "Params", varargs...) - ret0, _ := ret[0].(*types.QueryParamsResponse) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// Params indicates an expected call of Params. -func (mr *MockAuthQueryClientMockRecorder) Params(ctx, in any, opts ...any) *gomock.Call { - mr.mock.ctrl.T.Helper() - varargs := append([]any{ctx, in}, opts...) - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Params", reflect.TypeOf((*MockAuthQueryClient)(nil).Params), varargs...) -} diff --git a/testutil/mocks/expected_mocks.go b/testutil/mocks/expected_mocks.go new file mode 100644 index 0000000..0b2ce3c --- /dev/null +++ b/testutil/mocks/expected_mocks.go @@ -0,0 +1,19 @@ +package mocks + +import ( + "github.com/cosmos/cosmos-sdk/types/tx" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + rpcclient "github.com/tendermint/tendermint/rpc/client" +) + +type AuthQueryClient interface { + authtypes.QueryClient +} + +type ServiceClient interface { + tx.ServiceClient +} + +type RPCClient interface { + rpcclient.Client +} diff --git a/testutil/mocks/mocks.go b/testutil/mocks/mocks.go new file mode 100644 index 0000000..b0b3791 --- /dev/null +++ b/testutil/mocks/mocks.go @@ -0,0 +1,866 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: expected_mocks.go +// +// Generated by this command: +// +// mockgen -source=expected_mocks.go +// + +// Package mock_mocks is a generated GoMock package. +package mocks + +import ( + "github.com/tendermint/tendermint/libs/bytes" + context "context" + reflect "reflect" + + tx "github.com/cosmos/cosmos-sdk/types/tx" + types "github.com/cosmos/cosmos-sdk/x/auth/types" + log "github.com/tendermint/tendermint/libs/log" + client "github.com/tendermint/tendermint/rpc/client" + coretypes "github.com/tendermint/tendermint/rpc/core/types" + types0 "github.com/tendermint/tendermint/types" + gomock "go.uber.org/mock/gomock" + grpc "google.golang.org/grpc" +) + +// MockAuthQueryClient is a mock of AuthQueryClient interface. +type MockAuthQueryClient struct { + ctrl *gomock.Controller + recorder *MockAuthQueryClientMockRecorder + isgomock struct{} +} + +// MockAuthQueryClientMockRecorder is the mock recorder for MockAuthQueryClient. +type MockAuthQueryClientMockRecorder struct { + mock *MockAuthQueryClient +} + +// NewMockAuthQueryClient creates a new mock instance. +func NewMockAuthQueryClient(ctrl *gomock.Controller) *MockAuthQueryClient { + mock := &MockAuthQueryClient{ctrl: ctrl} + mock.recorder = &MockAuthQueryClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAuthQueryClient) EXPECT() *MockAuthQueryClientMockRecorder { + return m.recorder +} + +// Account mocks base method. +func (m *MockAuthQueryClient) Account(ctx context.Context, in *types.QueryAccountRequest, opts ...grpc.CallOption) (*types.QueryAccountResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Account", varargs...) + ret0, _ := ret[0].(*types.QueryAccountResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Account indicates an expected call of Account. +func (mr *MockAuthQueryClientMockRecorder) Account(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Account", reflect.TypeOf((*MockAuthQueryClient)(nil).Account), varargs...) +} + +// Accounts mocks base method. +func (m *MockAuthQueryClient) Accounts(ctx context.Context, in *types.QueryAccountsRequest, opts ...grpc.CallOption) (*types.QueryAccountsResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Accounts", varargs...) + ret0, _ := ret[0].(*types.QueryAccountsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Accounts indicates an expected call of Accounts. +func (mr *MockAuthQueryClientMockRecorder) Accounts(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Accounts", reflect.TypeOf((*MockAuthQueryClient)(nil).Accounts), varargs...) +} + +// ModuleAccountByName mocks base method. +func (m *MockAuthQueryClient) ModuleAccountByName(ctx context.Context, in *types.QueryModuleAccountByNameRequest, opts ...grpc.CallOption) (*types.QueryModuleAccountByNameResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ModuleAccountByName", varargs...) + ret0, _ := ret[0].(*types.QueryModuleAccountByNameResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ModuleAccountByName indicates an expected call of ModuleAccountByName. +func (mr *MockAuthQueryClientMockRecorder) ModuleAccountByName(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ModuleAccountByName", reflect.TypeOf((*MockAuthQueryClient)(nil).ModuleAccountByName), varargs...) +} + +// Params mocks base method. +func (m *MockAuthQueryClient) Params(ctx context.Context, in *types.QueryParamsRequest, opts ...grpc.CallOption) (*types.QueryParamsResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Params", varargs...) + ret0, _ := ret[0].(*types.QueryParamsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Params indicates an expected call of Params. +func (mr *MockAuthQueryClientMockRecorder) Params(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Params", reflect.TypeOf((*MockAuthQueryClient)(nil).Params), varargs...) +} + +// MockServiceClient is a mock of ServiceClient interface. +type MockServiceClient struct { + ctrl *gomock.Controller + recorder *MockServiceClientMockRecorder + isgomock struct{} +} + +// MockServiceClientMockRecorder is the mock recorder for MockServiceClient. +type MockServiceClientMockRecorder struct { + mock *MockServiceClient +} + +// NewMockServiceClient creates a new mock instance. +func NewMockServiceClient(ctrl *gomock.Controller) *MockServiceClient { + mock := &MockServiceClient{ctrl: ctrl} + mock.recorder = &MockServiceClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockServiceClient) EXPECT() *MockServiceClientMockRecorder { + return m.recorder +} + +// BroadcastTx mocks base method. +func (m *MockServiceClient) BroadcastTx(ctx context.Context, in *tx.BroadcastTxRequest, opts ...grpc.CallOption) (*tx.BroadcastTxResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "BroadcastTx", varargs...) + ret0, _ := ret[0].(*tx.BroadcastTxResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BroadcastTx indicates an expected call of BroadcastTx. +func (mr *MockServiceClientMockRecorder) BroadcastTx(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BroadcastTx", reflect.TypeOf((*MockServiceClient)(nil).BroadcastTx), varargs...) +} + +// GetBlockWithTxs mocks base method. +func (m *MockServiceClient) GetBlockWithTxs(ctx context.Context, in *tx.GetBlockWithTxsRequest, opts ...grpc.CallOption) (*tx.GetBlockWithTxsResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetBlockWithTxs", varargs...) + ret0, _ := ret[0].(*tx.GetBlockWithTxsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetBlockWithTxs indicates an expected call of GetBlockWithTxs. +func (mr *MockServiceClientMockRecorder) GetBlockWithTxs(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBlockWithTxs", reflect.TypeOf((*MockServiceClient)(nil).GetBlockWithTxs), varargs...) +} + +// GetTx mocks base method. +func (m *MockServiceClient) GetTx(ctx context.Context, in *tx.GetTxRequest, opts ...grpc.CallOption) (*tx.GetTxResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetTx", varargs...) + ret0, _ := ret[0].(*tx.GetTxResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTx indicates an expected call of GetTx. +func (mr *MockServiceClientMockRecorder) GetTx(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTx", reflect.TypeOf((*MockServiceClient)(nil).GetTx), varargs...) +} + +// GetTxsEvent mocks base method. +func (m *MockServiceClient) GetTxsEvent(ctx context.Context, in *tx.GetTxsEventRequest, opts ...grpc.CallOption) (*tx.GetTxsEventResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetTxsEvent", varargs...) + ret0, _ := ret[0].(*tx.GetTxsEventResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTxsEvent indicates an expected call of GetTxsEvent. +func (mr *MockServiceClientMockRecorder) GetTxsEvent(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTxsEvent", reflect.TypeOf((*MockServiceClient)(nil).GetTxsEvent), varargs...) +} + +// Simulate mocks base method. +func (m *MockServiceClient) Simulate(ctx context.Context, in *tx.SimulateRequest, opts ...grpc.CallOption) (*tx.SimulateResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Simulate", varargs...) + ret0, _ := ret[0].(*tx.SimulateResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Simulate indicates an expected call of Simulate. +func (mr *MockServiceClientMockRecorder) Simulate(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Simulate", reflect.TypeOf((*MockServiceClient)(nil).Simulate), varargs...) +} + +// MockRPCClient is a mock of RPCClient interface. +type MockRPCClient struct { + ctrl *gomock.Controller + recorder *MockRPCClientMockRecorder + isgomock struct{} +} + +// MockRPCClientMockRecorder is the mock recorder for MockRPCClient. +type MockRPCClientMockRecorder struct { + mock *MockRPCClient +} + +// NewMockRPCClient creates a new mock instance. +func NewMockRPCClient(ctrl *gomock.Controller) *MockRPCClient { + mock := &MockRPCClient{ctrl: ctrl} + mock.recorder = &MockRPCClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockRPCClient) EXPECT() *MockRPCClientMockRecorder { + return m.recorder +} + +// ABCIInfo mocks base method. +func (m *MockRPCClient) ABCIInfo(arg0 context.Context) (*coretypes.ResultABCIInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ABCIInfo", arg0) + ret0, _ := ret[0].(*coretypes.ResultABCIInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ABCIInfo indicates an expected call of ABCIInfo. +func (mr *MockRPCClientMockRecorder) ABCIInfo(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ABCIInfo", reflect.TypeOf((*MockRPCClient)(nil).ABCIInfo), arg0) +} + +// ABCIQuery mocks base method. +func (m *MockRPCClient) ABCIQuery(ctx context.Context, path string, data bytes.HexBytes) (*coretypes.ResultABCIQuery, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ABCIQuery", ctx, path, data) + ret0, _ := ret[0].(*coretypes.ResultABCIQuery) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ABCIQuery indicates an expected call of ABCIQuery. +func (mr *MockRPCClientMockRecorder) ABCIQuery(ctx, path, data any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ABCIQuery", reflect.TypeOf((*MockRPCClient)(nil).ABCIQuery), ctx, path, data) +} + +// ABCIQueryWithOptions mocks base method. +func (m *MockRPCClient) ABCIQueryWithOptions(ctx context.Context, path string, data bytes.HexBytes, opts client.ABCIQueryOptions) (*coretypes.ResultABCIQuery, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ABCIQueryWithOptions", ctx, path, data, opts) + ret0, _ := ret[0].(*coretypes.ResultABCIQuery) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ABCIQueryWithOptions indicates an expected call of ABCIQueryWithOptions. +func (mr *MockRPCClientMockRecorder) ABCIQueryWithOptions(ctx, path, data, opts any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ABCIQueryWithOptions", reflect.TypeOf((*MockRPCClient)(nil).ABCIQueryWithOptions), ctx, path, data, opts) +} + +// Block mocks base method. +func (m *MockRPCClient) Block(ctx context.Context, height *int64) (*coretypes.ResultBlock, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Block", ctx, height) + ret0, _ := ret[0].(*coretypes.ResultBlock) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Block indicates an expected call of Block. +func (mr *MockRPCClientMockRecorder) Block(ctx, height any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Block", reflect.TypeOf((*MockRPCClient)(nil).Block), ctx, height) +} + +// BlockByHash mocks base method. +func (m *MockRPCClient) BlockByHash(ctx context.Context, hash []byte) (*coretypes.ResultBlock, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockByHash", ctx, hash) + ret0, _ := ret[0].(*coretypes.ResultBlock) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BlockByHash indicates an expected call of BlockByHash. +func (mr *MockRPCClientMockRecorder) BlockByHash(ctx, hash any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockByHash", reflect.TypeOf((*MockRPCClient)(nil).BlockByHash), ctx, hash) +} + +// BlockResults mocks base method. +func (m *MockRPCClient) BlockResults(ctx context.Context, height *int64) (*coretypes.ResultBlockResults, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockResults", ctx, height) + ret0, _ := ret[0].(*coretypes.ResultBlockResults) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BlockResults indicates an expected call of BlockResults. +func (mr *MockRPCClientMockRecorder) BlockResults(ctx, height any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockResults", reflect.TypeOf((*MockRPCClient)(nil).BlockResults), ctx, height) +} + +// BlockSearch mocks base method. +func (m *MockRPCClient) BlockSearch(ctx context.Context, query string, page, perPage *int, orderBy string) (*coretypes.ResultBlockSearch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockSearch", ctx, query, page, perPage, orderBy) + ret0, _ := ret[0].(*coretypes.ResultBlockSearch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BlockSearch indicates an expected call of BlockSearch. +func (mr *MockRPCClientMockRecorder) BlockSearch(ctx, query, page, perPage, orderBy any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockSearch", reflect.TypeOf((*MockRPCClient)(nil).BlockSearch), ctx, query, page, perPage, orderBy) +} + +// BlockchainInfo mocks base method. +func (m *MockRPCClient) BlockchainInfo(ctx context.Context, minHeight, maxHeight int64) (*coretypes.ResultBlockchainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BlockchainInfo", ctx, minHeight, maxHeight) + ret0, _ := ret[0].(*coretypes.ResultBlockchainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BlockchainInfo indicates an expected call of BlockchainInfo. +func (mr *MockRPCClientMockRecorder) BlockchainInfo(ctx, minHeight, maxHeight any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BlockchainInfo", reflect.TypeOf((*MockRPCClient)(nil).BlockchainInfo), ctx, minHeight, maxHeight) +} + +// BroadcastEvidence mocks base method. +func (m *MockRPCClient) BroadcastEvidence(arg0 context.Context, arg1 types0.Evidence) (*coretypes.ResultBroadcastEvidence, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BroadcastEvidence", arg0, arg1) + ret0, _ := ret[0].(*coretypes.ResultBroadcastEvidence) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BroadcastEvidence indicates an expected call of BroadcastEvidence. +func (mr *MockRPCClientMockRecorder) BroadcastEvidence(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BroadcastEvidence", reflect.TypeOf((*MockRPCClient)(nil).BroadcastEvidence), arg0, arg1) +} + +// BroadcastTxAsync mocks base method. +func (m *MockRPCClient) BroadcastTxAsync(arg0 context.Context, arg1 types0.Tx) (*coretypes.ResultBroadcastTx, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BroadcastTxAsync", arg0, arg1) + ret0, _ := ret[0].(*coretypes.ResultBroadcastTx) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BroadcastTxAsync indicates an expected call of BroadcastTxAsync. +func (mr *MockRPCClientMockRecorder) BroadcastTxAsync(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BroadcastTxAsync", reflect.TypeOf((*MockRPCClient)(nil).BroadcastTxAsync), arg0, arg1) +} + +// BroadcastTxCommit mocks base method. +func (m *MockRPCClient) BroadcastTxCommit(arg0 context.Context, arg1 types0.Tx) (*coretypes.ResultBroadcastTxCommit, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BroadcastTxCommit", arg0, arg1) + ret0, _ := ret[0].(*coretypes.ResultBroadcastTxCommit) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BroadcastTxCommit indicates an expected call of BroadcastTxCommit. +func (mr *MockRPCClientMockRecorder) BroadcastTxCommit(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BroadcastTxCommit", reflect.TypeOf((*MockRPCClient)(nil).BroadcastTxCommit), arg0, arg1) +} + +// BroadcastTxSync mocks base method. +func (m *MockRPCClient) BroadcastTxSync(arg0 context.Context, arg1 types0.Tx) (*coretypes.ResultBroadcastTx, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BroadcastTxSync", arg0, arg1) + ret0, _ := ret[0].(*coretypes.ResultBroadcastTx) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BroadcastTxSync indicates an expected call of BroadcastTxSync. +func (mr *MockRPCClientMockRecorder) BroadcastTxSync(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BroadcastTxSync", reflect.TypeOf((*MockRPCClient)(nil).BroadcastTxSync), arg0, arg1) +} + +// CheckTx mocks base method. +func (m *MockRPCClient) CheckTx(arg0 context.Context, arg1 types0.Tx) (*coretypes.ResultCheckTx, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckTx", arg0, arg1) + ret0, _ := ret[0].(*coretypes.ResultCheckTx) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckTx indicates an expected call of CheckTx. +func (mr *MockRPCClientMockRecorder) CheckTx(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckTx", reflect.TypeOf((*MockRPCClient)(nil).CheckTx), arg0, arg1) +} + +// Commit mocks base method. +func (m *MockRPCClient) Commit(ctx context.Context, height *int64) (*coretypes.ResultCommit, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Commit", ctx, height) + ret0, _ := ret[0].(*coretypes.ResultCommit) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Commit indicates an expected call of Commit. +func (mr *MockRPCClientMockRecorder) Commit(ctx, height any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Commit", reflect.TypeOf((*MockRPCClient)(nil).Commit), ctx, height) +} + +// ConsensusParams mocks base method. +func (m *MockRPCClient) ConsensusParams(ctx context.Context, height *int64) (*coretypes.ResultConsensusParams, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ConsensusParams", ctx, height) + ret0, _ := ret[0].(*coretypes.ResultConsensusParams) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ConsensusParams indicates an expected call of ConsensusParams. +func (mr *MockRPCClientMockRecorder) ConsensusParams(ctx, height any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConsensusParams", reflect.TypeOf((*MockRPCClient)(nil).ConsensusParams), ctx, height) +} + +// ConsensusState mocks base method. +func (m *MockRPCClient) ConsensusState(arg0 context.Context) (*coretypes.ResultConsensusState, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ConsensusState", arg0) + ret0, _ := ret[0].(*coretypes.ResultConsensusState) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ConsensusState indicates an expected call of ConsensusState. +func (mr *MockRPCClientMockRecorder) ConsensusState(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ConsensusState", reflect.TypeOf((*MockRPCClient)(nil).ConsensusState), arg0) +} + +// DumpConsensusState mocks base method. +func (m *MockRPCClient) DumpConsensusState(arg0 context.Context) (*coretypes.ResultDumpConsensusState, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DumpConsensusState", arg0) + ret0, _ := ret[0].(*coretypes.ResultDumpConsensusState) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DumpConsensusState indicates an expected call of DumpConsensusState. +func (mr *MockRPCClientMockRecorder) DumpConsensusState(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DumpConsensusState", reflect.TypeOf((*MockRPCClient)(nil).DumpConsensusState), arg0) +} + +// Genesis mocks base method. +func (m *MockRPCClient) Genesis(arg0 context.Context) (*coretypes.ResultGenesis, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Genesis", arg0) + ret0, _ := ret[0].(*coretypes.ResultGenesis) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Genesis indicates an expected call of Genesis. +func (mr *MockRPCClientMockRecorder) Genesis(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Genesis", reflect.TypeOf((*MockRPCClient)(nil).Genesis), arg0) +} + +// GenesisChunked mocks base method. +func (m *MockRPCClient) GenesisChunked(arg0 context.Context, arg1 uint) (*coretypes.ResultGenesisChunk, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GenesisChunked", arg0, arg1) + ret0, _ := ret[0].(*coretypes.ResultGenesisChunk) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GenesisChunked indicates an expected call of GenesisChunked. +func (mr *MockRPCClientMockRecorder) GenesisChunked(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GenesisChunked", reflect.TypeOf((*MockRPCClient)(nil).GenesisChunked), arg0, arg1) +} + +// Health mocks base method. +func (m *MockRPCClient) Health(arg0 context.Context) (*coretypes.ResultHealth, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Health", arg0) + ret0, _ := ret[0].(*coretypes.ResultHealth) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Health indicates an expected call of Health. +func (mr *MockRPCClientMockRecorder) Health(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Health", reflect.TypeOf((*MockRPCClient)(nil).Health), arg0) +} + +// IsRunning mocks base method. +func (m *MockRPCClient) IsRunning() bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsRunning") + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsRunning indicates an expected call of IsRunning. +func (mr *MockRPCClientMockRecorder) IsRunning() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsRunning", reflect.TypeOf((*MockRPCClient)(nil).IsRunning)) +} + +// NetInfo mocks base method. +func (m *MockRPCClient) NetInfo(arg0 context.Context) (*coretypes.ResultNetInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetInfo", arg0) + ret0, _ := ret[0].(*coretypes.ResultNetInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetInfo indicates an expected call of NetInfo. +func (mr *MockRPCClientMockRecorder) NetInfo(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetInfo", reflect.TypeOf((*MockRPCClient)(nil).NetInfo), arg0) +} + +// NumUnconfirmedTxs mocks base method. +func (m *MockRPCClient) NumUnconfirmedTxs(arg0 context.Context) (*coretypes.ResultUnconfirmedTxs, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NumUnconfirmedTxs", arg0) + ret0, _ := ret[0].(*coretypes.ResultUnconfirmedTxs) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NumUnconfirmedTxs indicates an expected call of NumUnconfirmedTxs. +func (mr *MockRPCClientMockRecorder) NumUnconfirmedTxs(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NumUnconfirmedTxs", reflect.TypeOf((*MockRPCClient)(nil).NumUnconfirmedTxs), arg0) +} + +// OnReset mocks base method. +func (m *MockRPCClient) OnReset() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OnReset") + ret0, _ := ret[0].(error) + return ret0 +} + +// OnReset indicates an expected call of OnReset. +func (mr *MockRPCClientMockRecorder) OnReset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnReset", reflect.TypeOf((*MockRPCClient)(nil).OnReset)) +} + +// OnStart mocks base method. +func (m *MockRPCClient) OnStart() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OnStart") + ret0, _ := ret[0].(error) + return ret0 +} + +// OnStart indicates an expected call of OnStart. +func (mr *MockRPCClientMockRecorder) OnStart() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnStart", reflect.TypeOf((*MockRPCClient)(nil).OnStart)) +} + +// OnStop mocks base method. +func (m *MockRPCClient) OnStop() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnStop") +} + +// OnStop indicates an expected call of OnStop. +func (mr *MockRPCClientMockRecorder) OnStop() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnStop", reflect.TypeOf((*MockRPCClient)(nil).OnStop)) +} + +// Quit mocks base method. +func (m *MockRPCClient) Quit() <-chan struct{} { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Quit") + ret0, _ := ret[0].(<-chan struct{}) + return ret0 +} + +// Quit indicates an expected call of Quit. +func (mr *MockRPCClientMockRecorder) Quit() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Quit", reflect.TypeOf((*MockRPCClient)(nil).Quit)) +} + +// Reset mocks base method. +func (m *MockRPCClient) Reset() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Reset") + ret0, _ := ret[0].(error) + return ret0 +} + +// Reset indicates an expected call of Reset. +func (mr *MockRPCClientMockRecorder) Reset() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Reset", reflect.TypeOf((*MockRPCClient)(nil).Reset)) +} + +// SetLogger mocks base method. +func (m *MockRPCClient) SetLogger(arg0 log.Logger) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetLogger", arg0) +} + +// SetLogger indicates an expected call of SetLogger. +func (mr *MockRPCClientMockRecorder) SetLogger(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLogger", reflect.TypeOf((*MockRPCClient)(nil).SetLogger), arg0) +} + +// Start mocks base method. +func (m *MockRPCClient) Start() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Start") + ret0, _ := ret[0].(error) + return ret0 +} + +// Start indicates an expected call of Start. +func (mr *MockRPCClientMockRecorder) Start() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Start", reflect.TypeOf((*MockRPCClient)(nil).Start)) +} + +// Status mocks base method. +func (m *MockRPCClient) Status(arg0 context.Context) (*coretypes.ResultStatus, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Status", arg0) + ret0, _ := ret[0].(*coretypes.ResultStatus) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Status indicates an expected call of Status. +func (mr *MockRPCClientMockRecorder) Status(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Status", reflect.TypeOf((*MockRPCClient)(nil).Status), arg0) +} + +// Stop mocks base method. +func (m *MockRPCClient) Stop() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Stop") + ret0, _ := ret[0].(error) + return ret0 +} + +// Stop indicates an expected call of Stop. +func (mr *MockRPCClientMockRecorder) Stop() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Stop", reflect.TypeOf((*MockRPCClient)(nil).Stop)) +} + +// String mocks base method. +func (m *MockRPCClient) String() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "String") + ret0, _ := ret[0].(string) + return ret0 +} + +// String indicates an expected call of String. +func (mr *MockRPCClientMockRecorder) String() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "String", reflect.TypeOf((*MockRPCClient)(nil).String)) +} + +// Subscribe mocks base method. +func (m *MockRPCClient) Subscribe(ctx context.Context, subscriber, query string, outCapacity ...int) (<-chan coretypes.ResultEvent, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, subscriber, query} + for _, a := range outCapacity { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Subscribe", varargs...) + ret0, _ := ret[0].(<-chan coretypes.ResultEvent) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Subscribe indicates an expected call of Subscribe. +func (mr *MockRPCClientMockRecorder) Subscribe(ctx, subscriber, query any, outCapacity ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, subscriber, query}, outCapacity...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Subscribe", reflect.TypeOf((*MockRPCClient)(nil).Subscribe), varargs...) +} + +// Tx mocks base method. +func (m *MockRPCClient) Tx(ctx context.Context, hash []byte, prove bool) (*coretypes.ResultTx, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Tx", ctx, hash, prove) + ret0, _ := ret[0].(*coretypes.ResultTx) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Tx indicates an expected call of Tx. +func (mr *MockRPCClientMockRecorder) Tx(ctx, hash, prove any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Tx", reflect.TypeOf((*MockRPCClient)(nil).Tx), ctx, hash, prove) +} + +// TxSearch mocks base method. +func (m *MockRPCClient) TxSearch(ctx context.Context, query string, prove bool, page, perPage *int, orderBy string) (*coretypes.ResultTxSearch, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "TxSearch", ctx, query, prove, page, perPage, orderBy) + ret0, _ := ret[0].(*coretypes.ResultTxSearch) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// TxSearch indicates an expected call of TxSearch. +func (mr *MockRPCClientMockRecorder) TxSearch(ctx, query, prove, page, perPage, orderBy any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TxSearch", reflect.TypeOf((*MockRPCClient)(nil).TxSearch), ctx, query, prove, page, perPage, orderBy) +} + +// UnconfirmedTxs mocks base method. +func (m *MockRPCClient) UnconfirmedTxs(ctx context.Context, limit *int) (*coretypes.ResultUnconfirmedTxs, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UnconfirmedTxs", ctx, limit) + ret0, _ := ret[0].(*coretypes.ResultUnconfirmedTxs) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UnconfirmedTxs indicates an expected call of UnconfirmedTxs. +func (mr *MockRPCClientMockRecorder) UnconfirmedTxs(ctx, limit any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnconfirmedTxs", reflect.TypeOf((*MockRPCClient)(nil).UnconfirmedTxs), ctx, limit) +} + +// Unsubscribe mocks base method. +func (m *MockRPCClient) Unsubscribe(ctx context.Context, subscriber, query string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Unsubscribe", ctx, subscriber, query) + ret0, _ := ret[0].(error) + return ret0 +} + +// Unsubscribe indicates an expected call of Unsubscribe. +func (mr *MockRPCClientMockRecorder) Unsubscribe(ctx, subscriber, query any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Unsubscribe", reflect.TypeOf((*MockRPCClient)(nil).Unsubscribe), ctx, subscriber, query) +} + +// UnsubscribeAll mocks base method. +func (m *MockRPCClient) UnsubscribeAll(ctx context.Context, subscriber string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UnsubscribeAll", ctx, subscriber) + ret0, _ := ret[0].(error) + return ret0 +} + +// UnsubscribeAll indicates an expected call of UnsubscribeAll. +func (mr *MockRPCClientMockRecorder) UnsubscribeAll(ctx, subscriber any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnsubscribeAll", reflect.TypeOf((*MockRPCClient)(nil).UnsubscribeAll), ctx, subscriber) +} + +// Validators mocks base method. +func (m *MockRPCClient) Validators(ctx context.Context, height *int64, page, perPage *int) (*coretypes.ResultValidators, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Validators", ctx, height, page, perPage) + ret0, _ := ret[0].(*coretypes.ResultValidators) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Validators indicates an expected call of Validators. +func (mr *MockRPCClientMockRecorder) Validators(ctx, height, page, perPage any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validators", reflect.TypeOf((*MockRPCClient)(nil).Validators), ctx, height, page, perPage) +} From dcf3ef26a7697888cb17c9b1517dce14ad11f9c8 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Fri, 2 May 2025 18:58:20 -0700 Subject: [PATCH 20/55] lint cleanup --- queue/monitoring.go | 2 ++ queue/pool.go | 2 +- queue/types.go | 2 +- queue/worker.go | 2 +- queue/worker_test.go | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/queue/monitoring.go b/queue/monitoring.go index be5cd54..f4cb386 100644 --- a/queue/monitoring.go +++ b/queue/monitoring.go @@ -9,3 +9,5 @@ var queueSize = promauto.NewGauge(prometheus.GaugeOpts{ Name: "sequoia_queue_size", Help: "The number of messages currently in the queue", }) + +var _ = queueSize diff --git a/queue/pool.go b/queue/pool.go index edd273f..02f04c2 100644 --- a/queue/pool.go +++ b/queue/pool.go @@ -97,7 +97,7 @@ func (p *Pool) sendToAny(msg *Message) (workerId int) { func createWorkers(workerWallets []*wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8) ([]*worker, []chan *Message) { wChannels := make([]chan *Message, 0, len(workerWallets)) - for _ = range len(workerWallets) { + for range len(workerWallets) { wChannels = append(wChannels, make(chan *Message)) } diff --git a/queue/types.go b/queue/types.go index dfadc16..6dca9e9 100644 --- a/queue/types.go +++ b/queue/types.go @@ -8,7 +8,7 @@ import ( ) var ( - ReachedMaxRetry = errors.New("send retry attempt reached max retry") + ErrReachedMaxRetry = errors.New("send retry attempt reached max retry") ) type Message struct { diff --git a/queue/worker.go b/queue/worker.go index 50f8ac2..4f097d8 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -110,7 +110,7 @@ retry: Int("msg size", len(msg)). Err(err). Msg("queue worker batch msg broadcast exceeded max retry attempts") - err = errors.Join(ReachedMaxRetry, err) + err = errors.Join(ErrReachedMaxRetry, err) } for _, m := range toProcess { diff --git a/queue/worker_test.go b/queue/worker_test.go index e3362ce..69056b6 100644 --- a/queue/worker_test.go +++ b/queue/worker_test.go @@ -94,5 +94,5 @@ func TestWorkerSendMaxRetry(t *testing.T) { w.send() wg.Wait() - r.ErrorIs(m.err, ReachedMaxRetry) + r.ErrorIs(m.err, ErrReachedMaxRetry) } From d84c9676e2006a8c6262b1256b0fc4458c92f886 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 5 May 2025 15:56:49 -0700 Subject: [PATCH 21/55] test batch full send --- queue/worker.go | 16 ++++--- queue/worker_test.go | 102 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 110 insertions(+), 8 deletions(-) diff --git a/queue/worker.go b/queue/worker.go index 4f097d8..9163a37 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -22,7 +22,7 @@ type worker struct { msgIn <-chan *Message // worker stop if this closes batch []*Message batchSize int - txTimer time.Duration + txTimer int } func newWorker(id int8, wallet *wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8, msgIn <-chan *Message) *worker { @@ -32,12 +32,13 @@ func newWorker(id int8, wallet *wallet.Wallet, txTimer int, batchSize int, maxRe maxRetryAttempt: int8(maxRetryAttempt), msgIn: msgIn, batchSize: batchSize, - txTimer: time.Duration(txTimer) * time.Second, + txTimer: txTimer, } } func (w *worker) start() { - timer := time.NewTimer(w.txTimer) // if no msg comes for 5 seconds, broadcast tx + d := time.Duration(w.txTimer) * time.Second + timer := time.NewTimer(d) // if no msg comes for 5 seconds, broadcast tx run: for { select { @@ -45,12 +46,13 @@ run: if !ok { // pool closed the channel, stop worker break run } + + w.add(m) if len(w.batch) >= w.batchSize { w.send() timer.Stop() } - w.add(m) - timer.Reset(w.txTimer) + timer.Reset(d) case <-timer.C: if len(w.batch) > 0 { @@ -93,7 +95,7 @@ func (w *worker) send() { a := 0 retry: - for ; a < int(w.maxRetryAttempt); a++ { + for ; a < int(w.maxRetryAttempt+1); a++ { resp, err = w.wallet.BroadcastTxCommit(txData) switch code := status.Code(err); code { case codes.AlreadyExists, codes.NotFound, codes.OK: @@ -103,7 +105,7 @@ retry: time.Sleep(time.Second) // sleep for a bit before retrying } - if a == int(w.maxRetryAttempt) { + if a == int(w.maxRetryAttempt+1) { log.Error(). Int8("id", w.id). Int8("max attempt", w.maxRetryAttempt). diff --git a/queue/worker_test.go b/queue/worker_test.go index 69056b6..124dd78 100644 --- a/queue/worker_test.go +++ b/queue/worker_test.go @@ -1,12 +1,14 @@ package queue import ( + "context" "sync" "testing" "github.com/stretchr/testify/require" "github.com/tendermint/tendermint/p2p" coretypes "github.com/tendermint/tendermint/rpc/core/types" + ttypes "github.com/tendermint/tendermint/types" "go.uber.org/mock/gomock" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -22,6 +24,7 @@ import ( codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdkTypes "github.com/cosmos/cosmos-sdk/types" txTypes "github.com/cosmos/cosmos-sdk/types/tx" + "github.com/cosmos/cosmos-sdk/x/auth/tx" authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) @@ -73,7 +76,7 @@ func TestWorkerSendMaxRetry(t *testing.T) { NodeInfo: p2p.DefaultNodeInfo{Network: "jackaaaal"}, } rpcClient.EXPECT().Status(gomock.Any()).Return(&re, nil).AnyTimes() - rpcClient.EXPECT().BroadcastTxCommit(gomock.Any(), gomock.Any()).Return(nil, status.Error(codes.Aborted, "haha")).AnyTimes() + rpcClient.EXPECT().BroadcastTxCommit(gomock.Any(), gomock.Any()).Return(nil, status.Error(codes.Aborted, "some error")).AnyTimes() wallet.Client.RPCClient = rpcClient chMsg := make(chan *Message) @@ -95,4 +98,101 @@ func TestWorkerSendMaxRetry(t *testing.T) { wg.Wait() r.ErrorIs(m.err, ErrReachedMaxRetry) + close(chMsg) +} + +func TestBatchFullSend(t *testing.T) { + r := require.New(t) + + chainCfg := wtypes.ChainConfig{ + RPCAddr: "http://localhost:26657", + GRPCAddr: "localhost:9090", + GasPrice: "0.02ujkl", + GasAdjustment: 1.5, + Bech32Prefix: "jkl", + } + + s := &config.Seed{ + SeedPhrase: "forward service profit benefit punch catch fan chief jealous steel harvest column spell rude warm home melody hat broccoli pulse say garlic you firm", + DerivationPath: "m/44'/118'/0'/0/0", + } + + wallet, err := sequoiaWallet.CreateWallet(s.SeedPhrase, s.DerivationPath, chainCfg) + r.NoError(err) + + queryClient := mocks.SetupAuthClient(t) + + baseAcc := authTypes.ProtoBaseAccount() + err = baseAcc.SetAddress(sdkTypes.AccAddress(wallet.AccAddress())) + r.NoError(err) + any, err := codectypes.NewAnyWithValue(baseAcc) + r.NoError(err) + queryResp := &authTypes.QueryAccountResponse{ + Account: any, + } + queryClient.EXPECT().Account(gomock.Any(), &authTypes.QueryAccountRequest{Address: wallet.AccAddress()}).Return(queryResp, nil).AnyTimes() + + wallet.Client.AuthClient = queryClient + + serviceClient := mocks.SetupServiceClient(t) + + // auto gas & fees + simRes := txTypes.SimulateResponse{ + GasInfo: &sdkTypes.GasInfo{GasWanted: 0, GasUsed: 0}, + Result: nil, + } + serviceClient.EXPECT().Simulate(gomock.Any(), gomock.Any()).Return(&simRes, nil).AnyTimes() + wallet.Client.TxClient = serviceClient + + rpcClient := mocks.SetupRPCClient(t) + re := coretypes.ResultStatus{ + NodeInfo: p2p.DefaultNodeInfo{Network: "jackaaaal"}, + } + rpcClient.EXPECT().Status(gomock.Any()).Return(&re, nil).AnyTimes() + wallet.Client.RPCClient = rpcClient + + wg := sync.WaitGroup{} + wg.Add(2) + + m0 := Message{ + msg: types.NewMsgPostProof("1", []byte(""), "", 0, []byte(""), []byte(""), 0), + wg: &wg, + } + m1 := Message{ + msg: types.NewMsgPostProof("2", []byte(""), "", 0, []byte(""), []byte(""), 0), + wg: &wg, + } + + txData := wtypes.NewTransactionData(m0.msg, m1.msg).WithFeeAuto().WithGasAuto() + + txEncoder := tx.DefaultTxEncoder() + builder, err := wallet.BuildTx(txData) + r.NoError(err) + + expectedSignedTx, err := txEncoder(builder.GetTx()) + r.NoError(err) + + var actual ttypes.Tx + + rpcClient. + EXPECT(). + BroadcastTxCommit(gomock.Any(), gomock.Any()). + DoAndReturn(func(_ context.Context, tx ttypes.Tx) (*sdkTypes.TxResponse, error) { + actual = tx + + return nil, status.Error(codes.OK, "no error") + }). + AnyTimes() + + chMsg := make(chan *Message) + w := newWorker(0, wallet, 3, 2, 2, chMsg) + go w.start() + + chMsg <- &m0 + chMsg <- &m1 + + wg.Wait() + + close(chMsg) + r.EqualValues(expectedSignedTx, actual) } From bd6c12e41d7a83ca3db3898ece2880a22bce148b Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 5 May 2025 18:41:35 -0700 Subject: [PATCH 22/55] clean up --- queue/worker_test.go | 96 ++++++++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 39 deletions(-) diff --git a/queue/worker_test.go b/queue/worker_test.go index 124dd78..a39524d 100644 --- a/queue/worker_test.go +++ b/queue/worker_test.go @@ -16,6 +16,7 @@ import ( "github.com/JackalLabs/sequoia/config" sequoiaWallet "github.com/JackalLabs/sequoia/wallet" wtypes "github.com/desmos-labs/cosmos-go-wallet/types" + "github.com/desmos-labs/cosmos-go-wallet/wallet" "github.com/JackalLabs/sequoia/testutil/mocks" @@ -28,7 +29,7 @@ import ( authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) -func TestWorkerSendMaxRetry(t *testing.T) { +func setupWalletClient(t *testing.T) (*wallet.Wallet, *mocks.MockAuthQueryClient, *mocks.MockServiceClient, *mocks.MockRPCClient) { r := require.New(t) chainCfg := wtypes.ChainConfig{ @@ -76,6 +77,16 @@ func TestWorkerSendMaxRetry(t *testing.T) { NodeInfo: p2p.DefaultNodeInfo{Network: "jackaaaal"}, } rpcClient.EXPECT().Status(gomock.Any()).Return(&re, nil).AnyTimes() + wallet.Client.RPCClient = rpcClient + + return wallet, queryClient, serviceClient, rpcClient +} + +func TestWorkerSendMaxRetry(t *testing.T) { + r := require.New(t) + + wallet, _, _, rpcClient := setupWalletClient(t) + rpcClient.EXPECT().BroadcastTxCommit(gomock.Any(), gomock.Any()).Return(nil, status.Error(codes.Aborted, "some error")).AnyTimes() wallet.Client.RPCClient = rpcClient @@ -104,52 +115,59 @@ func TestWorkerSendMaxRetry(t *testing.T) { func TestBatchFullSend(t *testing.T) { r := require.New(t) - chainCfg := wtypes.ChainConfig{ - RPCAddr: "http://localhost:26657", - GRPCAddr: "localhost:9090", - GasPrice: "0.02ujkl", - GasAdjustment: 1.5, - Bech32Prefix: "jkl", - } + wallet, _, _, rpcclient := setupWalletClient(t) - s := &config.Seed{ - SeedPhrase: "forward service profit benefit punch catch fan chief jealous steel harvest column spell rude warm home melody hat broccoli pulse say garlic you firm", - DerivationPath: "m/44'/118'/0'/0/0", - } + wg := sync.WaitGroup{} + wg.Add(2) - wallet, err := sequoiaWallet.CreateWallet(s.SeedPhrase, s.DerivationPath, chainCfg) - r.NoError(err) + m0 := Message{ + msg: types.NewMsgPostProof("1", []byte(""), "", 0, []byte(""), []byte(""), 0), + wg: &wg, + } + m1 := Message{ + msg: types.NewMsgPostProof("2", []byte(""), "", 0, []byte(""), []byte(""), 0), + wg: &wg, + } - queryClient := mocks.SetupAuthClient(t) + txData := wtypes.NewTransactionData(m0.msg, m1.msg).WithFeeAuto().WithGasAuto() - baseAcc := authTypes.ProtoBaseAccount() - err = baseAcc.SetAddress(sdkTypes.AccAddress(wallet.AccAddress())) + txEncoder := tx.DefaultTxEncoder() + builder, err := wallet.BuildTx(txData) r.NoError(err) - any, err := codectypes.NewAnyWithValue(baseAcc) + + expectedSignedTx, err := txEncoder(builder.GetTx()) r.NoError(err) - queryResp := &authTypes.QueryAccountResponse{ - Account: any, - } - queryClient.EXPECT().Account(gomock.Any(), &authTypes.QueryAccountRequest{Address: wallet.AccAddress()}).Return(queryResp, nil).AnyTimes() - wallet.Client.AuthClient = queryClient + var actual ttypes.Tx - serviceClient := mocks.SetupServiceClient(t) + rpcclient. + EXPECT(). + BroadcastTxCommit(gomock.Any(), gomock.Any()). + DoAndReturn(func(_ context.Context, tx ttypes.Tx) (*sdkTypes.TxResponse, error) { + actual = tx - // auto gas & fees - simRes := txTypes.SimulateResponse{ - GasInfo: &sdkTypes.GasInfo{GasWanted: 0, GasUsed: 0}, - Result: nil, - } - serviceClient.EXPECT().Simulate(gomock.Any(), gomock.Any()).Return(&simRes, nil).AnyTimes() - wallet.Client.TxClient = serviceClient + return nil, status.Error(codes.OK, "no error") + }). + AnyTimes() + wallet.Client.RPCClient = rpcclient - rpcClient := mocks.SetupRPCClient(t) - re := coretypes.ResultStatus{ - NodeInfo: p2p.DefaultNodeInfo{Network: "jackaaaal"}, - } - rpcClient.EXPECT().Status(gomock.Any()).Return(&re, nil).AnyTimes() - wallet.Client.RPCClient = rpcClient + chMsg := make(chan *Message) + w := newWorker(0, wallet, 3, 2, 2, chMsg) + go w.start() + + chMsg <- &m0 + chMsg <- &m1 + + wg.Wait() + + close(chMsg) + r.EqualValues(expectedSignedTx, actual) +} + +func TestBatchHalfFullSend(t *testing.T) { + r := require.New(t) + + wallet, _, _, rpcclient := setupWalletClient(t) wg := sync.WaitGroup{} wg.Add(2) @@ -174,7 +192,7 @@ func TestBatchFullSend(t *testing.T) { var actual ttypes.Tx - rpcClient. + rpcclient. EXPECT(). BroadcastTxCommit(gomock.Any(), gomock.Any()). DoAndReturn(func(_ context.Context, tx ttypes.Tx) (*sdkTypes.TxResponse, error) { @@ -185,7 +203,7 @@ func TestBatchFullSend(t *testing.T) { AnyTimes() chMsg := make(chan *Message) - w := newWorker(0, wallet, 3, 2, 2, chMsg) + w := newWorker(0, wallet, 3, 5, 2, chMsg) go w.start() chMsg <- &m0 From 5e0695999758e81002476138012d748ca6f2dc31 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 7 May 2025 17:02:10 -0700 Subject: [PATCH 23/55] wait for workers to terminate --- queue/pool.go | 16 +++++++++++----- queue/types.go | 4 +--- queue/worker.go | 11 +++++++---- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/queue/pool.go b/queue/pool.go index 02f04c2..8dc659a 100644 --- a/queue/pool.go +++ b/queue/pool.go @@ -23,6 +23,7 @@ var _ Queue = &Pool{} type Pool struct { workers []*worker workerChannels []chan *Message // worker id should correspond to index of this + workerRunning *sync.WaitGroup wallet *wallet.Wallet } @@ -32,7 +33,7 @@ func NewPool(wallet *wallet.Wallet, config config.QueueConfig) (*Pool, error) { return nil, errors.Join(errors.New("failed to initialize auth claimers"), err) } - workers, workerChannels := createWorkers(workerWallets, int(config.TxTimer), int(config.TxBatchSize), config.MaxRetryAttempt) + workers, workerChannels, workerRunning := createWorkers(workerWallets, int(config.TxTimer), int(config.TxBatchSize), config.MaxRetryAttempt) if workers == nil { panic("no workers created") } @@ -47,6 +48,7 @@ func NewPool(wallet *wallet.Wallet, config config.QueueConfig) (*Pool, error) { wallet: wallet, workers: workers, workerChannels: workerChannels, + workerRunning: workerRunning, } return pool, nil @@ -56,6 +58,7 @@ func (p *Pool) Stop() { for _, c := range p.workerChannels { close(c) } + p.workerRunning.Wait() } func (p *Pool) Listen() { @@ -95,19 +98,22 @@ func (p *Pool) sendToAny(msg *Message) (workerId int) { return to } -func createWorkers(workerWallets []*wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8) ([]*worker, []chan *Message) { +func createWorkers(workerWallets []*wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8) (workers []*worker, queue []chan *Message, workerRunning *sync.WaitGroup) { wChannels := make([]chan *Message, 0, len(workerWallets)) for range len(workerWallets) { wChannels = append(wChannels, make(chan *Message)) } - workers := make([]*worker, 0, len(workerWallets)) + workerRunning = &sync.WaitGroup{} + workerRunning.Add(len(workerWallets)) + + workers = make([]*worker, 0, len(workerWallets)) for i, w := range workerWallets { - worker := newWorker(int8(i), w, txTimer, batchSize, maxRetryAttempt, wChannels[i]) + worker := newWorker(int8(i), w, txTimer, batchSize, maxRetryAttempt, wChannels[i], workerRunning) workers = append(workers, worker) } - return workers, wChannels + return workers, wChannels, workerRunning } func initAuthClaimers(wallet *wallet.Wallet, count int8) (workerWallets []*wallet.Wallet, err error) { diff --git a/queue/types.go b/queue/types.go index 6dca9e9..8bb50f1 100644 --- a/queue/types.go +++ b/queue/types.go @@ -7,9 +7,7 @@ import ( "github.com/cosmos/cosmos-sdk/types" ) -var ( - ErrReachedMaxRetry = errors.New("send retry attempt reached max retry") -) +var ErrReachedMaxRetry = errors.New("send retry attempt reached max retry") type Message struct { msg types.Msg diff --git a/queue/worker.go b/queue/worker.go index 9163a37..4c7f5ff 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -2,6 +2,7 @@ package queue import ( "errors" + "sync" "time" walletTypes "github.com/desmos-labs/cosmos-go-wallet/types" @@ -23,9 +24,10 @@ type worker struct { batch []*Message batchSize int txTimer int + running *sync.WaitGroup } -func newWorker(id int8, wallet *wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8, msgIn <-chan *Message) *worker { +func newWorker(id int8, wallet *wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8, msgIn <-chan *Message, running *sync.WaitGroup) *worker { return &worker{ id: id, wallet: wallet, @@ -33,10 +35,12 @@ func newWorker(id int8, wallet *wallet.Wallet, txTimer int, batchSize int, maxRe msgIn: msgIn, batchSize: batchSize, txTimer: txTimer, + running: running, } } func (w *worker) start() { + defer w.running.Done() d := time.Duration(w.txTimer) * time.Second timer := time.NewTimer(d) // if no msg comes for 5 seconds, broadcast tx run: @@ -50,7 +54,6 @@ run: w.add(m) if len(w.batch) >= w.batchSize { w.send() - timer.Stop() } timer.Reset(d) @@ -62,7 +65,7 @@ run: } } - log.Info().Int8("id", w.id).Msg("queue worker stopped") + log.Info().Int8("worker_id", w.id).Msg("queue worker stopped") if len(w.batch) > 0 { // send the remaining messages log.Info().Int8("id", w.id).Int("messages", len(w.batch)).Msg("sending remaining messages") w.send() @@ -78,6 +81,7 @@ func (w *worker) add(msg *Message) { w.batch = append(w.batch, msg) } +// TODO: make this dep inject func (w *worker) send() { toProcess := w.batch w.batch = nil @@ -101,7 +105,6 @@ retry: case codes.AlreadyExists, codes.NotFound, codes.OK: break retry } - // TODO: change this to a config time.Sleep(time.Second) // sleep for a bit before retrying } From 777f7b1685fb0170989b54fcf2f41feda5b0e0e9 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 7 May 2025 17:02:29 -0700 Subject: [PATCH 24/55] queue and worker tests --- queue/queue_test.go | 48 ++++++++++++++++++++++++++++++++++++++++++++ queue/worker_test.go | 18 ++++++++++++++--- 2 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 queue/queue_test.go diff --git a/queue/queue_test.go b/queue/queue_test.go new file mode 100644 index 0000000..17eca96 --- /dev/null +++ b/queue/queue_test.go @@ -0,0 +1,48 @@ +package queue + +import ( + "sync" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/jackalLabs/canine-chain/v4/x/storage/types" +) + +func TestPoolSendToAny(t *testing.T) { + r := require.New(t) + queue := make([]chan *Message, 0) + + for range 4 { + queue = append(queue, make(chan *Message)) + } + + pool := Pool{ + workerChannels: queue, + } + + msg := Message{ + msg: types.NewMsgPostProof("", []byte("hello"), "owner", 0, []byte("item"), []byte("list"), 0), + wg: nil, + } + + wg := sync.WaitGroup{} + go func() { + t.Logf("starting goroutine(worker): %d", len(queue)-1) + for m := range queue[len(queue)-1] { + t.Logf("worker[%d]: message received", len(queue)-1) + _ = m + wg.Done() + } + }() + + msgCount := 8 + for range msgCount { + wg.Add(1) + to := pool.sendToAny(&msg) + r.EqualValues(len(queue)-1, to) + } + + wg.Wait() + close(queue[len(queue)-1]) +} diff --git a/queue/worker_test.go b/queue/worker_test.go index a39524d..7f14b5c 100644 --- a/queue/worker_test.go +++ b/queue/worker_test.go @@ -91,7 +91,10 @@ func TestWorkerSendMaxRetry(t *testing.T) { wallet.Client.RPCClient = rpcClient chMsg := make(chan *Message) - w := newWorker(0, wallet, 1, 10, 3, chMsg) + + workerRunning := sync.WaitGroup{} // not used + + w := newWorker(0, wallet, 1, 10, 3, chMsg, &workerRunning) wg := sync.WaitGroup{} wg.Add(1) @@ -152,7 +155,11 @@ func TestBatchFullSend(t *testing.T) { wallet.Client.RPCClient = rpcclient chMsg := make(chan *Message) - w := newWorker(0, wallet, 3, 2, 2, chMsg) + + workerRunning := sync.WaitGroup{} + workerRunning.Add(1) + + w := newWorker(0, wallet, 3, 2, 2, chMsg, &workerRunning) go w.start() chMsg <- &m0 @@ -162,6 +169,7 @@ func TestBatchFullSend(t *testing.T) { close(chMsg) r.EqualValues(expectedSignedTx, actual) + workerRunning.Wait() } func TestBatchHalfFullSend(t *testing.T) { @@ -203,7 +211,10 @@ func TestBatchHalfFullSend(t *testing.T) { AnyTimes() chMsg := make(chan *Message) - w := newWorker(0, wallet, 3, 5, 2, chMsg) + + workerRunning := sync.WaitGroup{} + workerRunning.Add(1) + w := newWorker(0, wallet, 3, 5, 2, chMsg, &workerRunning) go w.start() chMsg <- &m0 @@ -213,4 +224,5 @@ func TestBatchHalfFullSend(t *testing.T) { close(chMsg) r.EqualValues(expectedSignedTx, actual) + workerRunning.Wait() } From 9fdb0c4c898e2022a326708376407ddc3f812cc8 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 8 May 2025 16:14:37 -0700 Subject: [PATCH 25/55] bench pool Add --- queue/pool_bench_test.go | 83 +++++++++++++++++++++++++++ queue/{queue_test.go => pool_test.go} | 0 queue/worker_test.go | 16 ++++-- testutil/mocks/auth.go | 8 +-- 4 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 queue/pool_bench_test.go rename queue/{queue_test.go => pool_test.go} (100%) diff --git a/queue/pool_bench_test.go b/queue/pool_bench_test.go new file mode 100644 index 0000000..fcb2e70 --- /dev/null +++ b/queue/pool_bench_test.go @@ -0,0 +1,83 @@ +package queue + +import ( + "context" + "testing" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/JackalLabs/sequoia/config" + + "go.uber.org/mock/gomock" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdkTypes "github.com/cosmos/cosmos-sdk/types" + authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "github.com/desmos-labs/cosmos-go-wallet/wallet" + ttypes "github.com/tendermint/tendermint/types" + + "github.com/jackalLabs/canine-chain/v4/x/storage/types" +) + +var queueConfig config.QueueConfig = config.QueueConfig{ + QueueInterval: 10, + QueueThreads: 4, + MaxRetryAttempt: 100, + TxBatchSize: 45, + TxTimer: 3, +} + +func setupNewPool(w *wallet.Wallet, config config.QueueConfig) *Pool { + workerWallets := make([]*wallet.Wallet, 0) + for i := range config.QueueThreads { + workerWallet := newOffsetWallet(w, int(i)) + workerWallets = append(workerWallets, workerWallet) + } + + workers, queue, workerRunning := createWorkers(workerWallets, int(config.TxTimer), int(config.TxBatchSize), config.MaxRetryAttempt) + return &Pool{ + wallet: w, + workers: workers, + workerChannels: queue, + workerRunning: workerRunning, + } + +} + +// really rough estimate because it benchmarks the whole pool.Add pipeline +func BenchmarkPoolAdd(b *testing.B) { + wallet, queryClient, _, rpcClient := setupWalletClient(b) + rpcClient. + EXPECT(). + BroadcastTxCommit(gomock.Any(), gomock.Any()). + DoAndReturn(func(_ context.Context, tx ttypes.Tx) (*sdkTypes.TxResponse, error) { + return nil, status.Error(codes.OK, "no error") + }). + AnyTimes() + wallet.Client.RPCClient = rpcClient + baseAcc := authTypes.ProtoBaseAccount() + err := baseAcc.SetAddress(sdkTypes.AccAddress(wallet.AccAddress())) + if err != nil { + b.Error(err) + } + + any, err := codectypes.NewAnyWithValue(baseAcc) + if err != nil { + b.Error(err) + } + queryResp := &authTypes.QueryAccountResponse{ + Account: any, + } + queryClient.EXPECT().Account(gomock.Any(), gomock.Any()).Return(queryResp, nil).AnyTimes() + + pool := setupNewPool(wallet, queueConfig) + go pool.Listen() + defer pool.Stop() + + msg := types.NewMsgPostProof("2", []byte(""), "", 0, []byte(""), []byte(""), 0) + b.ResetTimer() + for range b.N { + pool.Add(msg) + } +} diff --git a/queue/queue_test.go b/queue/pool_test.go similarity index 100% rename from queue/queue_test.go rename to queue/pool_test.go diff --git a/queue/worker_test.go b/queue/worker_test.go index 7f14b5c..b193f3d 100644 --- a/queue/worker_test.go +++ b/queue/worker_test.go @@ -29,9 +29,7 @@ import ( authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) -func setupWalletClient(t *testing.T) (*wallet.Wallet, *mocks.MockAuthQueryClient, *mocks.MockServiceClient, *mocks.MockRPCClient) { - r := require.New(t) - +func setupWalletClient(t gomock.TestReporter) (*wallet.Wallet, *mocks.MockAuthQueryClient, *mocks.MockServiceClient, *mocks.MockRPCClient) { chainCfg := wtypes.ChainConfig{ RPCAddr: "http://localhost:26657", GRPCAddr: "localhost:9090", @@ -46,15 +44,21 @@ func setupWalletClient(t *testing.T) (*wallet.Wallet, *mocks.MockAuthQueryClient } wallet, err := sequoiaWallet.CreateWallet(s.SeedPhrase, s.DerivationPath, chainCfg) - r.NoError(err) + if err != nil { + t.Errorf(err.Error()) + } queryClient := mocks.SetupAuthClient(t) baseAcc := authTypes.ProtoBaseAccount() err = baseAcc.SetAddress(sdkTypes.AccAddress(wallet.AccAddress())) - r.NoError(err) + if err != nil { + t.Errorf(err.Error()) + } any, err := codectypes.NewAnyWithValue(baseAcc) - r.NoError(err) + if err != nil { + t.Errorf(err.Error()) + } queryResp := &authTypes.QueryAccountResponse{ Account: any, } diff --git a/testutil/mocks/auth.go b/testutil/mocks/auth.go index 78aaf80..762384a 100644 --- a/testutil/mocks/auth.go +++ b/testutil/mocks/auth.go @@ -1,22 +1,20 @@ package mocks import ( - "testing" - "go.uber.org/mock/gomock" ) -func SetupAuthClient(t *testing.T) *MockAuthQueryClient { +func SetupAuthClient(t gomock.TestReporter) *MockAuthQueryClient { ctrl := gomock.NewController(t) return NewMockAuthQueryClient(ctrl) } -func SetupServiceClient(t *testing.T) *MockServiceClient { +func SetupServiceClient(t gomock.TestReporter) *MockServiceClient { ctrl := gomock.NewController(t) return NewMockServiceClient(ctrl) } -func SetupRPCClient(t *testing.T) *MockRPCClient { +func SetupRPCClient(t gomock.TestReporter) *MockRPCClient { ctrl := gomock.NewController(t) return NewMockRPCClient(ctrl) } From 8bf2b0f6de86334599cb03c8c17de3b686f2b012 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 14 May 2025 15:09:24 -0700 Subject: [PATCH 26/55] fake and mock query client --- testutil/fake.go | 172 +++++++ testutil/mocks/expected_mocks.go | 11 + testutil/mocks/mocks.go | 702 ++++++++++++++++++++++++++- testutil/mocks/{auth.go => setup.go} | 13 + 4 files changed, 891 insertions(+), 7 deletions(-) create mode 100644 testutil/fake.go rename testutil/mocks/{auth.go => setup.go} (61%) diff --git a/testutil/fake.go b/testutil/fake.go new file mode 100644 index 0000000..0f7ec3e --- /dev/null +++ b/testutil/fake.go @@ -0,0 +1,172 @@ +package testutil + +import ( + "context" + "github.com/jackalLabs/canine-chain/v4/x/storage/types" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +var _ types.QueryClient = (*FakeStorageQueryClient)(nil) + +type FakeStorageQueryClient struct { +} + +func NewFakeStorageQueryClient() types.QueryClient { + return &FakeStorageQueryClient{} +} + +func (f *FakeStorageQueryClient) Params(ctx context.Context, in *types.QueryParams, opts ...grpc.CallOption) (*types.QueryParamsResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a File by merkle, owner, and start. +func (f *FakeStorageQueryClient) File(ctx context.Context, in *types.QueryFile, opts ...grpc.CallOption) (*types.QueryFileResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of File items. +func (f *FakeStorageQueryClient) AllFiles(ctx context.Context, in *types.QueryAllFiles, opts ...grpc.CallOption) (*types.QueryAllFilesResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a File by merkle, owner, and start. +func (f *FakeStorageQueryClient) FilesFromNote(ctx context.Context, in *types.QueryFilesFromNote, opts ...grpc.CallOption) (*types.QueryFilesFromNoteResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of open files by provider_address. +func (f *FakeStorageQueryClient) OpenFiles(ctx context.Context, in *types.QueryOpenFiles, opts ...grpc.CallOption) (*types.QueryAllFilesResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of files with only 1x redundancy by provider_address. +func (f *FakeStorageQueryClient) EndangeredFiles(ctx context.Context, in *types.QueryOpenFiles, opts ...grpc.CallOption) (*types.QueryAllFilesResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of File items matching the merkle. +func (f *FakeStorageQueryClient) AllFilesByMerkle(ctx context.Context, in *types.QueryAllFilesByMerkle, opts ...grpc.CallOption) (*types.QueryAllFilesByMerkleResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of File items matching the owner. +func (f *FakeStorageQueryClient) AllFilesByOwner(ctx context.Context, in *types.QueryAllFilesByOwner, opts ...grpc.CallOption) (*types.QueryAllFilesByOwnerResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a Proof by provider_address, merkle, owner, and start. +func (f *FakeStorageQueryClient) Proof(ctx context.Context, in *types.QueryProof, opts ...grpc.CallOption) (*types.QueryProofResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of Proof items. +func (f *FakeStorageQueryClient) AllProofs(ctx context.Context, in *types.QueryAllProofs, opts ...grpc.CallOption) (*types.QueryAllProofsResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of Proof items by provider_address. +func (f *FakeStorageQueryClient) ProofsByAddress(ctx context.Context, in *types.QueryProofsByAddress, opts ...grpc.CallOption) (*types.QueryProofsByAddressResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a Provider by address. +func (f *FakeStorageQueryClient) Provider(ctx context.Context, in *types.QueryProvider, opts ...grpc.CallOption) (*types.QueryProviderResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of Provider items. +func (f *FakeStorageQueryClient) AllProviders(ctx context.Context, in *types.QueryAllProviders, opts ...grpc.CallOption) (*types.QueryAllProvidersResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries an Attestation by prover, merkle, owner, and start. +func (f *FakeStorageQueryClient) Attestation(ctx context.Context, in *types.QueryAttestation, opts ...grpc.CallOption) (*types.QueryAttestationResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of Attestation items. +func (f *FakeStorageQueryClient) AllAttestations(ctx context.Context, in *types.QueryAllAttestations, opts ...grpc.CallOption) (*types.QueryAllAttestationsResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a Report by prover, merkle, owner, and start. +func (f *FakeStorageQueryClient) Report(ctx context.Context, in *types.QueryReport, opts ...grpc.CallOption) (*types.QueryReportResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of Report items. +func (f *FakeStorageQueryClient) AllReports(ctx context.Context, in *types.QueryAllReports, opts ...grpc.CallOption) (*types.QueryAllReportsResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries free space by address. +func (f *FakeStorageQueryClient) FreeSpace(ctx context.Context, in *types.QueryFreeSpace, opts ...grpc.CallOption) (*types.QueryFreeSpaceResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries how many files a provider has stored by address. +func (f *FakeStorageQueryClient) StoreCount(ctx context.Context, in *types.QueryStoreCount, opts ...grpc.CallOption) (*types.QueryStoreCountResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries where a file is located by merkle. +func (f *FakeStorageQueryClient) FindFile(ctx context.Context, in *types.QueryFindFile, opts ...grpc.CallOption) (*types.QueryFindFileResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries free space by address. +func (f *FakeStorageQueryClient) GetClientFreeSpace(ctx context.Context, in *types.QueryClientFreeSpace, opts ...grpc.CallOption) (*types.QueryClientFreeSpaceResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a PayData by address. +func (f *FakeStorageQueryClient) GetPayData(ctx context.Context, in *types.QueryPayData, opts ...grpc.CallOption) (*types.QueryPayDataResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a StoragePaymentInfo by address. +func (f *FakeStorageQueryClient) StoragePaymentInfo(ctx context.Context, in *types.QueryStoragePaymentInfo, opts ...grpc.CallOption) (*types.QueryStoragePaymentInfoResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of StoragePaymentInfo items. +func (f *FakeStorageQueryClient) AllStoragePaymentInfo(ctx context.Context, in *types.QueryAllStoragePaymentInfo, opts ...grpc.CallOption) (*types.QueryAllStoragePaymentInfoResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries whether user can upload a file based on size. +func (f *FakeStorageQueryClient) FileUploadCheck(ctx context.Context, in *types.QueryFileUploadCheck, opts ...grpc.CallOption) (*types.QueryFileUploadCheckResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries current price of storage. +func (f *FakeStorageQueryClient) PriceCheck(ctx context.Context, in *types.QueryPriceCheck, opts ...grpc.CallOption) (*types.QueryPriceCheckResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries a list of ActiveProviders items. +func (f *FakeStorageQueryClient) ActiveProviders(ctx context.Context, in *types.QueryActiveProviders, opts ...grpc.CallOption) (*types.QueryActiveProvidersResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries protocol storage space used and purchased. +func (f *FakeStorageQueryClient) StorageStats(ctx context.Context, in *types.QueryStorageStats, opts ...grpc.CallOption) (*types.QueryStorageStatsResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries how much storage space is being used on the network at this time. +func (f *FakeStorageQueryClient) NetworkSize(ctx context.Context, in *types.QueryNetworkSize, opts ...grpc.CallOption) (*types.QueryNetworkSizeResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries the amount of offered storage by active providers +func (f *FakeStorageQueryClient) AvailableSpace(ctx context.Context, in *types.QueryAvailableSpace, opts ...grpc.CallOption) (*types.QueryAvailableSpaceResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} + +// Queries protocol storage space used and purchased. +func (f *FakeStorageQueryClient) Gauges(ctx context.Context, in *types.QueryAllGauges, opts ...grpc.CallOption) (*types.QueryAllGaugesResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") +} diff --git a/testutil/mocks/expected_mocks.go b/testutil/mocks/expected_mocks.go index 0b2ce3c..d9e612e 100644 --- a/testutil/mocks/expected_mocks.go +++ b/testutil/mocks/expected_mocks.go @@ -3,7 +3,10 @@ package mocks import ( "github.com/cosmos/cosmos-sdk/types/tx" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + storage "github.com/jackalLabs/canine-chain/v4/x/storage/types" rpcclient "github.com/tendermint/tendermint/rpc/client" + + "google.golang.org/grpc" ) type AuthQueryClient interface { @@ -17,3 +20,11 @@ type ServiceClient interface { type RPCClient interface { rpcclient.Client } + +type GRPCConn interface { + grpc.ClientConnInterface +} + +type StorageQueryClient interface { + storage.QueryClient +} diff --git a/testutil/mocks/mocks.go b/testutil/mocks/mocks.go index b0b3791..a0f6412 100644 --- a/testutil/mocks/mocks.go +++ b/testutil/mocks/mocks.go @@ -10,16 +10,17 @@ package mocks import ( - "github.com/tendermint/tendermint/libs/bytes" context "context" reflect "reflect" tx "github.com/cosmos/cosmos-sdk/types/tx" types "github.com/cosmos/cosmos-sdk/x/auth/types" + types0 "github.com/jackalLabs/canine-chain/v4/x/storage/types" + bytes "github.com/tendermint/tendermint/libs/bytes" log "github.com/tendermint/tendermint/libs/log" client "github.com/tendermint/tendermint/rpc/client" coretypes "github.com/tendermint/tendermint/rpc/core/types" - types0 "github.com/tendermint/tendermint/types" + types1 "github.com/tendermint/tendermint/types" gomock "go.uber.org/mock/gomock" grpc "google.golang.org/grpc" ) @@ -397,7 +398,7 @@ func (mr *MockRPCClientMockRecorder) BlockchainInfo(ctx, minHeight, maxHeight an } // BroadcastEvidence mocks base method. -func (m *MockRPCClient) BroadcastEvidence(arg0 context.Context, arg1 types0.Evidence) (*coretypes.ResultBroadcastEvidence, error) { +func (m *MockRPCClient) BroadcastEvidence(arg0 context.Context, arg1 types1.Evidence) (*coretypes.ResultBroadcastEvidence, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BroadcastEvidence", arg0, arg1) ret0, _ := ret[0].(*coretypes.ResultBroadcastEvidence) @@ -412,7 +413,7 @@ func (mr *MockRPCClientMockRecorder) BroadcastEvidence(arg0, arg1 any) *gomock.C } // BroadcastTxAsync mocks base method. -func (m *MockRPCClient) BroadcastTxAsync(arg0 context.Context, arg1 types0.Tx) (*coretypes.ResultBroadcastTx, error) { +func (m *MockRPCClient) BroadcastTxAsync(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultBroadcastTx, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BroadcastTxAsync", arg0, arg1) ret0, _ := ret[0].(*coretypes.ResultBroadcastTx) @@ -427,7 +428,7 @@ func (mr *MockRPCClientMockRecorder) BroadcastTxAsync(arg0, arg1 any) *gomock.Ca } // BroadcastTxCommit mocks base method. -func (m *MockRPCClient) BroadcastTxCommit(arg0 context.Context, arg1 types0.Tx) (*coretypes.ResultBroadcastTxCommit, error) { +func (m *MockRPCClient) BroadcastTxCommit(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultBroadcastTxCommit, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BroadcastTxCommit", arg0, arg1) ret0, _ := ret[0].(*coretypes.ResultBroadcastTxCommit) @@ -442,7 +443,7 @@ func (mr *MockRPCClientMockRecorder) BroadcastTxCommit(arg0, arg1 any) *gomock.C } // BroadcastTxSync mocks base method. -func (m *MockRPCClient) BroadcastTxSync(arg0 context.Context, arg1 types0.Tx) (*coretypes.ResultBroadcastTx, error) { +func (m *MockRPCClient) BroadcastTxSync(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultBroadcastTx, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "BroadcastTxSync", arg0, arg1) ret0, _ := ret[0].(*coretypes.ResultBroadcastTx) @@ -457,7 +458,7 @@ func (mr *MockRPCClientMockRecorder) BroadcastTxSync(arg0, arg1 any) *gomock.Cal } // CheckTx mocks base method. -func (m *MockRPCClient) CheckTx(arg0 context.Context, arg1 types0.Tx) (*coretypes.ResultCheckTx, error) { +func (m *MockRPCClient) CheckTx(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultCheckTx, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CheckTx", arg0, arg1) ret0, _ := ret[0].(*coretypes.ResultCheckTx) @@ -864,3 +865,690 @@ func (mr *MockRPCClientMockRecorder) Validators(ctx, height, page, perPage any) mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Validators", reflect.TypeOf((*MockRPCClient)(nil).Validators), ctx, height, page, perPage) } + +// MockGRPCConn is a mock of GRPCConn interface. +type MockGRPCConn struct { + ctrl *gomock.Controller + recorder *MockGRPCConnMockRecorder + isgomock struct{} +} + +// MockGRPCConnMockRecorder is the mock recorder for MockGRPCConn. +type MockGRPCConnMockRecorder struct { + mock *MockGRPCConn +} + +// NewMockGRPCConn creates a new mock instance. +func NewMockGRPCConn(ctrl *gomock.Controller) *MockGRPCConn { + mock := &MockGRPCConn{ctrl: ctrl} + mock.recorder = &MockGRPCConnMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockGRPCConn) EXPECT() *MockGRPCConnMockRecorder { + return m.recorder +} + +// Invoke mocks base method. +func (m *MockGRPCConn) Invoke(ctx context.Context, method string, args, reply any, opts ...grpc.CallOption) error { + m.ctrl.T.Helper() + varargs := []any{ctx, method, args, reply} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Invoke", varargs...) + ret0, _ := ret[0].(error) + return ret0 +} + +// Invoke indicates an expected call of Invoke. +func (mr *MockGRPCConnMockRecorder) Invoke(ctx, method, args, reply any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, method, args, reply}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Invoke", reflect.TypeOf((*MockGRPCConn)(nil).Invoke), varargs...) +} + +// NewStream mocks base method. +func (m *MockGRPCConn) NewStream(ctx context.Context, desc *grpc.StreamDesc, method string, opts ...grpc.CallOption) (grpc.ClientStream, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, desc, method} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "NewStream", varargs...) + ret0, _ := ret[0].(grpc.ClientStream) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NewStream indicates an expected call of NewStream. +func (mr *MockGRPCConnMockRecorder) NewStream(ctx, desc, method any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, desc, method}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewStream", reflect.TypeOf((*MockGRPCConn)(nil).NewStream), varargs...) +} + +// MockStorageQueryClient is a mock of StorageQueryClient interface. +type MockStorageQueryClient struct { + ctrl *gomock.Controller + recorder *MockStorageQueryClientMockRecorder + isgomock struct{} +} + +// MockStorageQueryClientMockRecorder is the mock recorder for MockStorageQueryClient. +type MockStorageQueryClientMockRecorder struct { + mock *MockStorageQueryClient +} + +// NewMockStorageQueryClient creates a new mock instance. +func NewMockStorageQueryClient(ctrl *gomock.Controller) *MockStorageQueryClient { + mock := &MockStorageQueryClient{ctrl: ctrl} + mock.recorder = &MockStorageQueryClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockStorageQueryClient) EXPECT() *MockStorageQueryClientMockRecorder { + return m.recorder +} + +// ActiveProviders mocks base method. +func (m *MockStorageQueryClient) ActiveProviders(ctx context.Context, in *types0.QueryActiveProviders, opts ...grpc.CallOption) (*types0.QueryActiveProvidersResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ActiveProviders", varargs...) + ret0, _ := ret[0].(*types0.QueryActiveProvidersResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ActiveProviders indicates an expected call of ActiveProviders. +func (mr *MockStorageQueryClientMockRecorder) ActiveProviders(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ActiveProviders", reflect.TypeOf((*MockStorageQueryClient)(nil).ActiveProviders), varargs...) +} + +// AllAttestations mocks base method. +func (m *MockStorageQueryClient) AllAttestations(ctx context.Context, in *types0.QueryAllAttestations, opts ...grpc.CallOption) (*types0.QueryAllAttestationsResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AllAttestations", varargs...) + ret0, _ := ret[0].(*types0.QueryAllAttestationsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllAttestations indicates an expected call of AllAttestations. +func (mr *MockStorageQueryClientMockRecorder) AllAttestations(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllAttestations", reflect.TypeOf((*MockStorageQueryClient)(nil).AllAttestations), varargs...) +} + +// AllFiles mocks base method. +func (m *MockStorageQueryClient) AllFiles(ctx context.Context, in *types0.QueryAllFiles, opts ...grpc.CallOption) (*types0.QueryAllFilesResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AllFiles", varargs...) + ret0, _ := ret[0].(*types0.QueryAllFilesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllFiles indicates an expected call of AllFiles. +func (mr *MockStorageQueryClientMockRecorder) AllFiles(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllFiles", reflect.TypeOf((*MockStorageQueryClient)(nil).AllFiles), varargs...) +} + +// AllFilesByMerkle mocks base method. +func (m *MockStorageQueryClient) AllFilesByMerkle(ctx context.Context, in *types0.QueryAllFilesByMerkle, opts ...grpc.CallOption) (*types0.QueryAllFilesByMerkleResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AllFilesByMerkle", varargs...) + ret0, _ := ret[0].(*types0.QueryAllFilesByMerkleResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllFilesByMerkle indicates an expected call of AllFilesByMerkle. +func (mr *MockStorageQueryClientMockRecorder) AllFilesByMerkle(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllFilesByMerkle", reflect.TypeOf((*MockStorageQueryClient)(nil).AllFilesByMerkle), varargs...) +} + +// AllFilesByOwner mocks base method. +func (m *MockStorageQueryClient) AllFilesByOwner(ctx context.Context, in *types0.QueryAllFilesByOwner, opts ...grpc.CallOption) (*types0.QueryAllFilesByOwnerResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AllFilesByOwner", varargs...) + ret0, _ := ret[0].(*types0.QueryAllFilesByOwnerResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllFilesByOwner indicates an expected call of AllFilesByOwner. +func (mr *MockStorageQueryClientMockRecorder) AllFilesByOwner(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllFilesByOwner", reflect.TypeOf((*MockStorageQueryClient)(nil).AllFilesByOwner), varargs...) +} + +// AllProofs mocks base method. +func (m *MockStorageQueryClient) AllProofs(ctx context.Context, in *types0.QueryAllProofs, opts ...grpc.CallOption) (*types0.QueryAllProofsResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AllProofs", varargs...) + ret0, _ := ret[0].(*types0.QueryAllProofsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllProofs indicates an expected call of AllProofs. +func (mr *MockStorageQueryClientMockRecorder) AllProofs(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllProofs", reflect.TypeOf((*MockStorageQueryClient)(nil).AllProofs), varargs...) +} + +// AllProviders mocks base method. +func (m *MockStorageQueryClient) AllProviders(ctx context.Context, in *types0.QueryAllProviders, opts ...grpc.CallOption) (*types0.QueryAllProvidersResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AllProviders", varargs...) + ret0, _ := ret[0].(*types0.QueryAllProvidersResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllProviders indicates an expected call of AllProviders. +func (mr *MockStorageQueryClientMockRecorder) AllProviders(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllProviders", reflect.TypeOf((*MockStorageQueryClient)(nil).AllProviders), varargs...) +} + +// AllReports mocks base method. +func (m *MockStorageQueryClient) AllReports(ctx context.Context, in *types0.QueryAllReports, opts ...grpc.CallOption) (*types0.QueryAllReportsResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AllReports", varargs...) + ret0, _ := ret[0].(*types0.QueryAllReportsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllReports indicates an expected call of AllReports. +func (mr *MockStorageQueryClientMockRecorder) AllReports(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllReports", reflect.TypeOf((*MockStorageQueryClient)(nil).AllReports), varargs...) +} + +// AllStoragePaymentInfo mocks base method. +func (m *MockStorageQueryClient) AllStoragePaymentInfo(ctx context.Context, in *types0.QueryAllStoragePaymentInfo, opts ...grpc.CallOption) (*types0.QueryAllStoragePaymentInfoResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AllStoragePaymentInfo", varargs...) + ret0, _ := ret[0].(*types0.QueryAllStoragePaymentInfoResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AllStoragePaymentInfo indicates an expected call of AllStoragePaymentInfo. +func (mr *MockStorageQueryClientMockRecorder) AllStoragePaymentInfo(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllStoragePaymentInfo", reflect.TypeOf((*MockStorageQueryClient)(nil).AllStoragePaymentInfo), varargs...) +} + +// Attestation mocks base method. +func (m *MockStorageQueryClient) Attestation(ctx context.Context, in *types0.QueryAttestation, opts ...grpc.CallOption) (*types0.QueryAttestationResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Attestation", varargs...) + ret0, _ := ret[0].(*types0.QueryAttestationResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Attestation indicates an expected call of Attestation. +func (mr *MockStorageQueryClientMockRecorder) Attestation(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Attestation", reflect.TypeOf((*MockStorageQueryClient)(nil).Attestation), varargs...) +} + +// AvailableSpace mocks base method. +func (m *MockStorageQueryClient) AvailableSpace(ctx context.Context, in *types0.QueryAvailableSpace, opts ...grpc.CallOption) (*types0.QueryAvailableSpaceResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "AvailableSpace", varargs...) + ret0, _ := ret[0].(*types0.QueryAvailableSpaceResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AvailableSpace indicates an expected call of AvailableSpace. +func (mr *MockStorageQueryClientMockRecorder) AvailableSpace(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AvailableSpace", reflect.TypeOf((*MockStorageQueryClient)(nil).AvailableSpace), varargs...) +} + +// File mocks base method. +func (m *MockStorageQueryClient) File(ctx context.Context, in *types0.QueryFile, opts ...grpc.CallOption) (*types0.QueryFileResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "File", varargs...) + ret0, _ := ret[0].(*types0.QueryFileResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// File indicates an expected call of File. +func (mr *MockStorageQueryClientMockRecorder) File(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "File", reflect.TypeOf((*MockStorageQueryClient)(nil).File), varargs...) +} + +// FileUploadCheck mocks base method. +func (m *MockStorageQueryClient) FileUploadCheck(ctx context.Context, in *types0.QueryFileUploadCheck, opts ...grpc.CallOption) (*types0.QueryFileUploadCheckResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "FileUploadCheck", varargs...) + ret0, _ := ret[0].(*types0.QueryFileUploadCheckResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FileUploadCheck indicates an expected call of FileUploadCheck. +func (mr *MockStorageQueryClientMockRecorder) FileUploadCheck(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FileUploadCheck", reflect.TypeOf((*MockStorageQueryClient)(nil).FileUploadCheck), varargs...) +} + +// FilesFromNote mocks base method. +func (m *MockStorageQueryClient) FilesFromNote(ctx context.Context, in *types0.QueryFilesFromNote, opts ...grpc.CallOption) (*types0.QueryFilesFromNoteResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "FilesFromNote", varargs...) + ret0, _ := ret[0].(*types0.QueryFilesFromNoteResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FilesFromNote indicates an expected call of FilesFromNote. +func (mr *MockStorageQueryClientMockRecorder) FilesFromNote(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilesFromNote", reflect.TypeOf((*MockStorageQueryClient)(nil).FilesFromNote), varargs...) +} + +// FindFile mocks base method. +func (m *MockStorageQueryClient) FindFile(ctx context.Context, in *types0.QueryFindFile, opts ...grpc.CallOption) (*types0.QueryFindFileResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "FindFile", varargs...) + ret0, _ := ret[0].(*types0.QueryFindFileResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FindFile indicates an expected call of FindFile. +func (mr *MockStorageQueryClientMockRecorder) FindFile(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindFile", reflect.TypeOf((*MockStorageQueryClient)(nil).FindFile), varargs...) +} + +// FreeSpace mocks base method. +func (m *MockStorageQueryClient) FreeSpace(ctx context.Context, in *types0.QueryFreeSpace, opts ...grpc.CallOption) (*types0.QueryFreeSpaceResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "FreeSpace", varargs...) + ret0, _ := ret[0].(*types0.QueryFreeSpaceResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// FreeSpace indicates an expected call of FreeSpace. +func (mr *MockStorageQueryClientMockRecorder) FreeSpace(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FreeSpace", reflect.TypeOf((*MockStorageQueryClient)(nil).FreeSpace), varargs...) +} + +// Gauges mocks base method. +func (m *MockStorageQueryClient) Gauges(ctx context.Context, in *types0.QueryAllGauges, opts ...grpc.CallOption) (*types0.QueryAllGaugesResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Gauges", varargs...) + ret0, _ := ret[0].(*types0.QueryAllGaugesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Gauges indicates an expected call of Gauges. +func (mr *MockStorageQueryClientMockRecorder) Gauges(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Gauges", reflect.TypeOf((*MockStorageQueryClient)(nil).Gauges), varargs...) +} + +// GetClientFreeSpace mocks base method. +func (m *MockStorageQueryClient) GetClientFreeSpace(ctx context.Context, in *types0.QueryClientFreeSpace, opts ...grpc.CallOption) (*types0.QueryClientFreeSpaceResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetClientFreeSpace", varargs...) + ret0, _ := ret[0].(*types0.QueryClientFreeSpaceResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetClientFreeSpace indicates an expected call of GetClientFreeSpace. +func (mr *MockStorageQueryClientMockRecorder) GetClientFreeSpace(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetClientFreeSpace", reflect.TypeOf((*MockStorageQueryClient)(nil).GetClientFreeSpace), varargs...) +} + +// GetPayData mocks base method. +func (m *MockStorageQueryClient) GetPayData(ctx context.Context, in *types0.QueryPayData, opts ...grpc.CallOption) (*types0.QueryPayDataResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetPayData", varargs...) + ret0, _ := ret[0].(*types0.QueryPayDataResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPayData indicates an expected call of GetPayData. +func (mr *MockStorageQueryClientMockRecorder) GetPayData(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPayData", reflect.TypeOf((*MockStorageQueryClient)(nil).GetPayData), varargs...) +} + +// NetworkSize mocks base method. +func (m *MockStorageQueryClient) NetworkSize(ctx context.Context, in *types0.QueryNetworkSize, opts ...grpc.CallOption) (*types0.QueryNetworkSizeResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "NetworkSize", varargs...) + ret0, _ := ret[0].(*types0.QueryNetworkSizeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetworkSize indicates an expected call of NetworkSize. +func (mr *MockStorageQueryClientMockRecorder) NetworkSize(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetworkSize", reflect.TypeOf((*MockStorageQueryClient)(nil).NetworkSize), varargs...) +} + +// OpenFiles mocks base method. +func (m *MockStorageQueryClient) OpenFiles(ctx context.Context, in *types0.QueryOpenFiles, opts ...grpc.CallOption) (*types0.QueryAllFilesResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "OpenFiles", varargs...) + ret0, _ := ret[0].(*types0.QueryAllFilesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// OpenFiles indicates an expected call of OpenFiles. +func (mr *MockStorageQueryClientMockRecorder) OpenFiles(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OpenFiles", reflect.TypeOf((*MockStorageQueryClient)(nil).OpenFiles), varargs...) +} + +// Params mocks base method. +func (m *MockStorageQueryClient) Params(ctx context.Context, in *types0.QueryParams, opts ...grpc.CallOption) (*types0.QueryParamsResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Params", varargs...) + ret0, _ := ret[0].(*types0.QueryParamsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Params indicates an expected call of Params. +func (mr *MockStorageQueryClientMockRecorder) Params(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Params", reflect.TypeOf((*MockStorageQueryClient)(nil).Params), varargs...) +} + +// PriceCheck mocks base method. +func (m *MockStorageQueryClient) PriceCheck(ctx context.Context, in *types0.QueryPriceCheck, opts ...grpc.CallOption) (*types0.QueryPriceCheckResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "PriceCheck", varargs...) + ret0, _ := ret[0].(*types0.QueryPriceCheckResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PriceCheck indicates an expected call of PriceCheck. +func (mr *MockStorageQueryClientMockRecorder) PriceCheck(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PriceCheck", reflect.TypeOf((*MockStorageQueryClient)(nil).PriceCheck), varargs...) +} + +// Proof mocks base method. +func (m *MockStorageQueryClient) Proof(ctx context.Context, in *types0.QueryProof, opts ...grpc.CallOption) (*types0.QueryProofResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Proof", varargs...) + ret0, _ := ret[0].(*types0.QueryProofResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Proof indicates an expected call of Proof. +func (mr *MockStorageQueryClientMockRecorder) Proof(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Proof", reflect.TypeOf((*MockStorageQueryClient)(nil).Proof), varargs...) +} + +// ProofsByAddress mocks base method. +func (m *MockStorageQueryClient) ProofsByAddress(ctx context.Context, in *types0.QueryProofsByAddress, opts ...grpc.CallOption) (*types0.QueryProofsByAddressResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ProofsByAddress", varargs...) + ret0, _ := ret[0].(*types0.QueryProofsByAddressResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ProofsByAddress indicates an expected call of ProofsByAddress. +func (mr *MockStorageQueryClientMockRecorder) ProofsByAddress(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProofsByAddress", reflect.TypeOf((*MockStorageQueryClient)(nil).ProofsByAddress), varargs...) +} + +// Provider mocks base method. +func (m *MockStorageQueryClient) Provider(ctx context.Context, in *types0.QueryProvider, opts ...grpc.CallOption) (*types0.QueryProviderResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Provider", varargs...) + ret0, _ := ret[0].(*types0.QueryProviderResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Provider indicates an expected call of Provider. +func (mr *MockStorageQueryClientMockRecorder) Provider(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Provider", reflect.TypeOf((*MockStorageQueryClient)(nil).Provider), varargs...) +} + +// Report mocks base method. +func (m *MockStorageQueryClient) Report(ctx context.Context, in *types0.QueryReport, opts ...grpc.CallOption) (*types0.QueryReportResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Report", varargs...) + ret0, _ := ret[0].(*types0.QueryReportResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Report indicates an expected call of Report. +func (mr *MockStorageQueryClientMockRecorder) Report(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Report", reflect.TypeOf((*MockStorageQueryClient)(nil).Report), varargs...) +} + +// StoragePaymentInfo mocks base method. +func (m *MockStorageQueryClient) StoragePaymentInfo(ctx context.Context, in *types0.QueryStoragePaymentInfo, opts ...grpc.CallOption) (*types0.QueryStoragePaymentInfoResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "StoragePaymentInfo", varargs...) + ret0, _ := ret[0].(*types0.QueryStoragePaymentInfoResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StoragePaymentInfo indicates an expected call of StoragePaymentInfo. +func (mr *MockStorageQueryClientMockRecorder) StoragePaymentInfo(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoragePaymentInfo", reflect.TypeOf((*MockStorageQueryClient)(nil).StoragePaymentInfo), varargs...) +} + +// StorageStats mocks base method. +func (m *MockStorageQueryClient) StorageStats(ctx context.Context, in *types0.QueryStorageStats, opts ...grpc.CallOption) (*types0.QueryStorageStatsResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "StorageStats", varargs...) + ret0, _ := ret[0].(*types0.QueryStorageStatsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StorageStats indicates an expected call of StorageStats. +func (mr *MockStorageQueryClientMockRecorder) StorageStats(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StorageStats", reflect.TypeOf((*MockStorageQueryClient)(nil).StorageStats), varargs...) +} + +// StoreCount mocks base method. +func (m *MockStorageQueryClient) StoreCount(ctx context.Context, in *types0.QueryStoreCount, opts ...grpc.CallOption) (*types0.QueryStoreCountResponse, error) { + m.ctrl.T.Helper() + varargs := []any{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "StoreCount", varargs...) + ret0, _ := ret[0].(*types0.QueryStoreCountResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StoreCount indicates an expected call of StoreCount. +func (mr *MockStorageQueryClientMockRecorder) StoreCount(ctx, in any, opts ...any) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]any{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoreCount", reflect.TypeOf((*MockStorageQueryClient)(nil).StoreCount), varargs...) +} diff --git a/testutil/mocks/auth.go b/testutil/mocks/setup.go similarity index 61% rename from testutil/mocks/auth.go rename to testutil/mocks/setup.go index 762384a..d1083f3 100644 --- a/testutil/mocks/auth.go +++ b/testutil/mocks/setup.go @@ -18,3 +18,16 @@ func SetupRPCClient(t gomock.TestReporter) *MockRPCClient { ctrl := gomock.NewController(t) return NewMockRPCClient(ctrl) } + +func SetupGRPCConn(t gomock.TestReporter) *MockGRPCConn { + ctrl := gomock.NewController(t) + grpc := NewMockGRPCConn(ctrl) + + return grpc +} + +func SetupStorageQueryClient(t gomock.TestReporter) StorageQueryClient { + ctrl := gomock.NewController(t) + + return NewMockStorageQueryClient(ctrl) +} From a89e0dbbea94e203c2f194466d05bb21592bd264 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 14 May 2025 17:18:23 -0700 Subject: [PATCH 27/55] fake clients --- testutil/fake.go | 306 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 305 insertions(+), 1 deletion(-) diff --git a/testutil/fake.go b/testutil/fake.go index 0f7ec3e..53a6db0 100644 --- a/testutil/fake.go +++ b/testutil/fake.go @@ -2,10 +2,23 @@ package testutil import ( "context" + + codec "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/tx" + auth "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/jackalLabs/canine-chain/v4/x/storage/types" + bytes "github.com/tendermint/tendermint/libs/bytes" + log "github.com/tendermint/tendermint/libs/log" + "github.com/tendermint/tendermint/p2p" + rpc "github.com/tendermint/tendermint/rpc/client" + coretypes "github.com/tendermint/tendermint/rpc/core/types" + types1 "github.com/tendermint/tendermint/types" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + + "github.com/desmos-labs/cosmos-go-wallet/wallet" ) var _ types.QueryClient = (*FakeStorageQueryClient)(nil) @@ -13,7 +26,7 @@ var _ types.QueryClient = (*FakeStorageQueryClient)(nil) type FakeStorageQueryClient struct { } -func NewFakeStorageQueryClient() types.QueryClient { +func NewFakeStorageQueryClient() *FakeStorageQueryClient { return &FakeStorageQueryClient{} } @@ -170,3 +183,294 @@ func (f *FakeStorageQueryClient) AvailableSpace(ctx context.Context, in *types.Q func (f *FakeStorageQueryClient) Gauges(ctx context.Context, in *types.QueryAllGauges, opts ...grpc.CallOption) (*types.QueryAllGaugesResponse, error) { return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") } + +var _ auth.QueryClient = (*FakeAuthQueryClient)(nil) + +type FakeAuthQueryClient struct { + wallet *wallet.Wallet +} + +func NewFakeAuthQueryClient(w *wallet.Wallet) *FakeAuthQueryClient { + return &FakeAuthQueryClient{ + wallet: w, + } +} + +// Accounts returns all the existing accounts +// +// Since: cosmos-sdk 0.43 +func (a *FakeAuthQueryClient) Accounts(ctx context.Context, in *auth.QueryAccountsRequest, opts ...grpc.CallOption) (*auth.QueryAccountsResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake auth query client") +} + +// Account returns account details based on address. +func (a *FakeAuthQueryClient) Account(ctx context.Context, in *auth.QueryAccountRequest, opts ...grpc.CallOption) (*auth.QueryAccountResponse, error) { + baseAcc := auth.ProtoBaseAccount() + err := baseAcc.SetAddress(sdk.AccAddress(a.wallet.AccAddress())) + if err != nil { + return nil, err + } + + any, err := codec.NewAnyWithValue(baseAcc) + if err != nil { + return nil, err + } + + resp := &auth.QueryAccountResponse{ + Account: any, + } + + return resp, nil +} + +// Params queries all parameters. +func (a *FakeAuthQueryClient) Params(ctx context.Context, in *auth.QueryParamsRequest, opts ...grpc.CallOption) (*auth.QueryParamsResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake auth query client") +} + +// ModuleAccountByName returns the module account info by module name +func (a *FakeAuthQueryClient) ModuleAccountByName(ctx context.Context, in *auth.QueryModuleAccountByNameRequest, opts ...grpc.CallOption) (*auth.QueryModuleAccountByNameResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake auth query client") +} + +var _ tx.ServiceClient = (*FakeServiceClient)(nil) + +type FakeServiceClient struct { +} + +// Simulate simulates executing a transaction for estimating gas usage. +func (s *FakeServiceClient) Simulate(ctx context.Context, in *tx.SimulateRequest, opts ...grpc.CallOption) (*tx.SimulateResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake service client") +} + +// GetTx fetches a tx by hash. +func (s *FakeServiceClient) GetTx(ctx context.Context, in *tx.GetTxRequest, opts ...grpc.CallOption) (*tx.GetTxResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake service client") +} + +// BroadcastTx broadcast transaction. +func (s *FakeServiceClient) BroadcastTx(ctx context.Context, in *tx.BroadcastTxRequest, opts ...grpc.CallOption) (*tx.BroadcastTxResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake service client") +} + +// GetTxsEvent fetches txs by event. +func (s *FakeServiceClient) GetTxsEvent(ctx context.Context, in *tx.GetTxsEventRequest, opts ...grpc.CallOption) (*tx.GetTxsEventResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake service client") +} + +// GetBlockWithTxs fetches a block with decoded txs. +// +// Since: cosmos-sdk 0.45.2 +func (s *FakeServiceClient) GetBlockWithTxs(ctx context.Context, in *tx.GetBlockWithTxsRequest, opts ...grpc.CallOption) (*tx.GetBlockWithTxsResponse, error) { + return nil, status.Error(codes.Unimplemented, "this is a fake service client") +} + +var _ rpc.Client = (*FakeRPCClient)(nil) + +type FakeRPCClient struct { +} + +func NewFakeRPCClient() *FakeRPCClient { + return &FakeRPCClient{} +} + +// ABCIInfo mocks base method. +func (m *FakeRPCClient) ABCIInfo(arg0 context.Context) (*coretypes.ResultABCIInfo, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// ABCIQuery mocks base method. +func (m *FakeRPCClient) ABCIQuery(ctx context.Context, path string, data bytes.HexBytes) (*coretypes.ResultABCIQuery, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// ABCIQueryWithOptions mocks base method. +func (m *FakeRPCClient) ABCIQueryWithOptions(ctx context.Context, path string, data bytes.HexBytes, opts rpc.ABCIQueryOptions) (*coretypes.ResultABCIQuery, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// Block mocks base method. +func (m *FakeRPCClient) Block(ctx context.Context, height *int64) (*coretypes.ResultBlock, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// BlockByHash mocks base method. +func (m *FakeRPCClient) BlockByHash(ctx context.Context, hash []byte) (*coretypes.ResultBlock, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// BlockResults mocks base method. +func (m *FakeRPCClient) BlockResults(ctx context.Context, height *int64) (*coretypes.ResultBlockResults, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// BlockSearch mocks base method. +func (m *FakeRPCClient) BlockSearch(ctx context.Context, query string, page, perPage *int, orderBy string) (*coretypes.ResultBlockSearch, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// BlockchainInfo mocks base method. +func (m *FakeRPCClient) BlockchainInfo(ctx context.Context, minHeight, maxHeight int64) (*coretypes.ResultBlockchainInfo, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// BroadcastEvidence mocks base method. +func (m *FakeRPCClient) BroadcastEvidence(arg0 context.Context, arg1 types1.Evidence) (*coretypes.ResultBroadcastEvidence, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// BroadcastTxAsync mocks base method. +func (m *FakeRPCClient) BroadcastTxAsync(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultBroadcastTx, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// BroadcastTxCommit mocks base method. +func (m *FakeRPCClient) BroadcastTxCommit(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultBroadcastTxCommit, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// BroadcastTxSync mocks base method. +func (m *FakeRPCClient) BroadcastTxSync(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultBroadcastTx, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// CheckTx mocks base method. +func (m *FakeRPCClient) CheckTx(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultCheckTx, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// Commit mocks base method. +func (m *FakeRPCClient) Commit(ctx context.Context, height *int64) (*coretypes.ResultCommit, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// ConsensusParams mocks base method. +func (m *FakeRPCClient) ConsensusParams(ctx context.Context, height *int64) (*coretypes.ResultConsensusParams, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// ConsensusState mocks base method. +func (m *FakeRPCClient) ConsensusState(arg0 context.Context) (*coretypes.ResultConsensusState, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// DumpConsensusState mocks base method. +func (m *FakeRPCClient) DumpConsensusState(arg0 context.Context) (*coretypes.ResultDumpConsensusState, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// Genesis mocks base method. +func (m *FakeRPCClient) Genesis(arg0 context.Context) (*coretypes.ResultGenesis, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// GenesisChunked mocks base method. +func (m *FakeRPCClient) GenesisChunked(arg0 context.Context, arg1 uint) (*coretypes.ResultGenesisChunk, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// Health mocks base method. +func (m *FakeRPCClient) Health(arg0 context.Context) (*coretypes.ResultHealth, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// IsRunning mocks base method. +func (m *FakeRPCClient) IsRunning() bool { + return false +} + +// NetInfo mocks base method. +func (m *FakeRPCClient) NetInfo(arg0 context.Context) (*coretypes.ResultNetInfo, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// NumUnconfirmedTxs mocks base method. +func (m *FakeRPCClient) NumUnconfirmedTxs(arg0 context.Context) (*coretypes.ResultUnconfirmedTxs, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// OnReset mocks base method. +func (m *FakeRPCClient) OnReset() error { + return status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// OnStart mocks base method. +func (m *FakeRPCClient) OnStart() error { + return status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// OnStop mocks base method. +func (m *FakeRPCClient) OnStop() { +} + +// Quit mocks base method. +func (m *FakeRPCClient) Quit() <-chan struct{} { + return make(chan struct{}) +} + +// Reset mocks base method. +func (m *FakeRPCClient) Reset() error { + return status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// SetLogger mocks base method. +func (m *FakeRPCClient) SetLogger(arg0 log.Logger) { +} + +// Start mocks base method. +func (m *FakeRPCClient) Start() error { + return status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// Status mocks base method. +func (m *FakeRPCClient) Status(arg0 context.Context) (*coretypes.ResultStatus, error) { + re := coretypes.ResultStatus{ + NodeInfo: p2p.DefaultNodeInfo{Network: "jackaaaal"}, + } + return &re, nil +} + +// Stop mocks base method. +func (m *FakeRPCClient) Stop() error { + return status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// String mocks base method. +func (m *FakeRPCClient) String() string { + return "fake RPCClient" +} + +// Subscribe mocks base method. +func (m *FakeRPCClient) Subscribe(ctx context.Context, subscriber, query string, outCapacity ...int) (<-chan coretypes.ResultEvent, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// Tx mocks base method. +func (m *FakeRPCClient) Tx(ctx context.Context, hash []byte, prove bool) (*coretypes.ResultTx, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// TxSearch mocks base method. +func (m *FakeRPCClient) TxSearch(ctx context.Context, query string, prove bool, page, perPage *int, orderBy string) (*coretypes.ResultTxSearch, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// UnconfirmedTxs mocks base method. +func (m *FakeRPCClient) UnconfirmedTxs(ctx context.Context, limit *int) (*coretypes.ResultUnconfirmedTxs, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// Unsubscribe mocks base method. +func (m *FakeRPCClient) Unsubscribe(ctx context.Context, subscriber, query string) error { + return status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// UnsubscribeAll mocks base method. +func (m *FakeRPCClient) UnsubscribeAll(ctx context.Context, subscriber string) error { + return status.Error(codes.Unimplemented, "this is fake RPCClient") +} + +// Validators mocks base method. +func (m *FakeRPCClient) Validators(ctx context.Context, height *int64, page, perPage *int) (*coretypes.ResultValidators, error) { + return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") +} From 6f98006c4da64b76db473a24d7bbae10a4d600f5 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 14 May 2025 19:23:43 -0700 Subject: [PATCH 28/55] fake methods used by the wallet --- testutil/fake.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/testutil/fake.go b/testutil/fake.go index 53a6db0..2eb496f 100644 --- a/testutil/fake.go +++ b/testutil/fake.go @@ -238,9 +238,19 @@ var _ tx.ServiceClient = (*FakeServiceClient)(nil) type FakeServiceClient struct { } +func NewFakeServiceClient() *FakeServiceClient { + return &FakeServiceClient{} +} + // Simulate simulates executing a transaction for estimating gas usage. +// returns 0 gas wanted, 0 gas used func (s *FakeServiceClient) Simulate(ctx context.Context, in *tx.SimulateRequest, opts ...grpc.CallOption) (*tx.SimulateResponse, error) { - return nil, status.Error(codes.Unimplemented, "this is a fake service client") + simRes := tx.SimulateResponse{ + GasInfo: &sdk.GasInfo{GasWanted: 0, GasUsed: 0}, + Result: nil, + } + + return &simRes, nil } // GetTx fetches a tx by hash. @@ -325,8 +335,9 @@ func (m *FakeRPCClient) BroadcastTxAsync(arg0 context.Context, arg1 types1.Tx) ( } // BroadcastTxCommit mocks base method. +// returns nil, nil func (m *FakeRPCClient) BroadcastTxCommit(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultBroadcastTxCommit, error) { - return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") + return nil, nil } // BroadcastTxSync mocks base method. @@ -423,6 +434,7 @@ func (m *FakeRPCClient) Start() error { } // Status mocks base method. +// returns Network: "jackaaaal" func (m *FakeRPCClient) Status(arg0 context.Context) (*coretypes.ResultStatus, error) { re := coretypes.ResultStatus{ NodeInfo: p2p.DefaultNodeInfo{Network: "jackaaaal"}, From 529bffcd375e3c6a0a9b26ff5c0e1d5e25cfd5bb Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 14 May 2025 19:24:21 -0700 Subject: [PATCH 29/55] create new app with options --- core/app.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/app.go b/core/app.go index 383ddae..41282ed 100644 --- a/core/app.go +++ b/core/app.go @@ -16,6 +16,7 @@ import ( "time" apiTypes "github.com/JackalLabs/sequoia/api/types" + "github.com/JackalLabs/sequoia/testutil" "github.com/libp2p/go-libp2p/core/peer" "github.com/JackalLabs/sequoia/file_system" @@ -48,6 +49,18 @@ type App struct { monitor *monitoring.Monitor fileSystem *file_system.FileSystem wallet *wallet.Wallet + queryClient storageTypes.QueryClient +} + +type Option func(*App) + +func WithTestMode() Option { + return func(app *App) { + app.queryClient = testutil.NewFakeStorageQueryClient() + app.wallet.Client.AuthClient = testutil.NewFakeAuthQueryClient(app.wallet) + app.wallet.Client.RPCClient = testutil.NewFakeRPCClient() + app.wallet.Client.TxClient = testutil.NewFakeServiceClient() + } } func NewApp(home string) (*App, error) { From d539b51f56c8512f13c3dad57b791db2482991db Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 14 May 2025 19:27:10 -0700 Subject: [PATCH 30/55] add test_mode flag to start cmd --- cmd/start.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cmd/start.go b/cmd/start.go index ca50af2..3b950f3 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -45,7 +45,13 @@ func StartCmd() *cobra.Command { log.Logger = log.Level(zerolog.ErrorLevel) } - app, err := core.NewApp(home) + var opts []core.Option + + if cmd.Flags().Changed("test_mode") { + opts = append(opts, core.WithTestMode()) + } + + app, err := core.NewApp(home, opts...) if err != nil { return err } @@ -62,5 +68,7 @@ func StartCmd() *cobra.Command { }, } + cmd.Flags().Bool("test_mode", false, "run provider without chain network") + return cmd } From f1179c5e8745e2a78bd4b9b6058e60b09546292f Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 15 May 2025 16:47:55 -0700 Subject: [PATCH 31/55] use query client from app --- api/client.go | 4 +--- api/file_handler.go | 2 +- api/server.go | 7 ++++--- core/app.go | 47 ++++++++++++++++++++++++-------------------- network/downloads.go | 6 ++---- queue/pool.go | 9 ++++----- strays/hands.go | 4 ++-- strays/manager.go | 4 ++-- 8 files changed, 42 insertions(+), 41 deletions(-) diff --git a/api/client.go b/api/client.go index 5b84218..dcb22b0 100644 --- a/api/client.go +++ b/api/client.go @@ -11,10 +11,8 @@ import ( "github.com/rs/zerolog/log" ) -func SpaceHandler(c *client.Client, address string) func(http.ResponseWriter, *http.Request) { +func SpaceHandler(c *client.Client, queryClient storageTypes.QueryClient, address string) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, req *http.Request) { - queryClient := storageTypes.NewQueryClient(c.GRPCConn) - params := &storageTypes.QueryProvider{ Address: address, } diff --git a/api/file_handler.go b/api/file_handler.go index d2338aa..16d5fa9 100644 --- a/api/file_handler.go +++ b/api/file_handler.go @@ -149,7 +149,7 @@ func PostFileHandler(fio *file_system.FileSystem, prover *proofs.Prover, wl *wal } } -func PostFileHandlerV2(fio *file_system.FileSystem, prover *proofs.Prover, wl *wallet.Wallet, chunkSize int64) func(http.ResponseWriter, *http.Request) { +func PostFileHandlerV2(fio *file_system.FileSystem, prover *proofs.Prover, wl *wallet.Wallet, queryClient storageTypes.QueryClient, chunkSize int64) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, req *http.Request) { err := req.ParseMultipartForm(MaxFileSize) // MAX file size lives here if err != nil { diff --git a/api/server.go b/api/server.go index b2c350c..8469346 100644 --- a/api/server.go +++ b/api/server.go @@ -11,6 +11,7 @@ import ( "github.com/rs/cors" "github.com/JackalLabs/sequoia/file_system" + storageTypes "github.com/jackalLabs/canine-chain/v4/x/storage/types" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/JackalLabs/sequoia/proofs" @@ -42,7 +43,7 @@ func (a *API) Close() error { return a.srv.Close() } -func (a *API) Serve(f *file_system.FileSystem, p *proofs.Prover, wallet *wallet.Wallet, chunkSize int64) { +func (a *API) Serve(f *file_system.FileSystem, p *proofs.Prover, wallet *wallet.Wallet, queryClient storageTypes.QueryClient, chunkSize int64) { defer log.Info().Msg("API module stopped") r := mux.NewRouter() @@ -51,7 +52,7 @@ func (a *API) Serve(f *file_system.FileSystem, p *proofs.Prover, wallet *wallet. outline.RegisterGetRoute(r, "/", IndexHandler(wallet.AccAddress())) outline.RegisterPostRoute(r, "/upload", PostFileHandler(f, p, wallet, chunkSize)) - outline.RegisterPostRoute(r, "/v2/upload", PostFileHandlerV2(f, p, wallet, chunkSize)) + outline.RegisterPostRoute(r, "/v2/upload", PostFileHandlerV2(f, p, wallet, queryClient, chunkSize)) outline.RegisterPostRoute(r, "/v2/status/{id}", CheckUploadStatus()) outline.RegisterPostRoute(r, "/api/jobs", ListJobsHandler()) outline.RegisterGetRoute(r, "/download/{merkle}", DownloadFileHandler(f)) @@ -59,7 +60,7 @@ func (a *API) Serve(f *file_system.FileSystem, p *proofs.Prover, wallet *wallet. outline.RegisterGetRoute(r, "/list", ListFilesHandler(f)) outline.RegisterGetRoute(r, "/api/client/list", ListFilesHandler(f)) outline.RegisterGetRoute(r, "/api/data/fids", LegacyListFilesHandler(f)) - outline.RegisterGetRoute(r, "/api/client/space", SpaceHandler(wallet.Client, wallet.AccAddress())) + outline.RegisterGetRoute(r, "/api/client/space", SpaceHandler(wallet.Client, queryClient, wallet.AccAddress())) outline.RegisterGetRoute(r, "/ipfs/peers", IPFSListPeers(f)) outline.RegisterGetRoute(r, "/ipfs/hosts", IPFSListHosts(f)) diff --git a/core/app.go b/core/app.go index 41282ed..1eb15bd 100644 --- a/core/app.go +++ b/core/app.go @@ -25,8 +25,6 @@ import ( "github.com/JackalLabs/sequoia/monitoring" - "github.com/cosmos/gogoproto/grpc" - "github.com/JackalLabs/sequoia/api" "github.com/JackalLabs/sequoia/config" "github.com/JackalLabs/sequoia/logger" @@ -63,7 +61,7 @@ func WithTestMode() Option { } } -func NewApp(home string) (*App, error) { +func NewApp(home string, opts ...Option) (*App, error) { cfg, err := config.Init(home) if err != nil { return nil, err @@ -118,12 +116,22 @@ func NewApp(home string) (*App, error) { if err != nil { return nil, err } - return &App{ - fileSystem: f, - api: apiServer, - home: home, - wallet: w, - }, nil + + queryClient := storageTypes.NewQueryClient(w.Client.GRPCConn) + + app := &App{ + fileSystem: f, + api: apiServer, + home: home, + wallet: w, + queryClient: queryClient, + } + + for _, opt := range opts { + opt(app) + } + + return app, nil } func initProviderOnChain(wallet *wallet.Wallet, ip string, totalSpace int64) error { @@ -192,12 +200,10 @@ func updateIp(wallet *wallet.Wallet, ip string) error { return nil } -func (a *App) GetStorageParams(client grpc.ClientConn) (storageTypes.Params, error) { +func (a *App) GetStorageParams(queryClient storageTypes.QueryClient) (storageTypes.Params, error) { queryParams := &storageTypes.QueryParams{} - cl := storageTypes.NewQueryClient(client) - - res, err := cl.Params(context.Background(), queryParams) + res, err := queryClient.Params(context.Background(), queryParams) if err != nil { return storageTypes.Params{}, err } @@ -218,7 +224,7 @@ func (a *App) Start() error { Address: myAddress, } - cl := storageTypes.NewQueryClient(a.wallet.Client.GRPCConn) + cl := a.queryClient claimers := make([]string, 0) @@ -257,12 +263,12 @@ func (a *App) Start() error { } } - params, err := a.GetStorageParams(a.wallet.Client.GRPCConn) + params, err := a.GetStorageParams(a.queryClient) if err != nil { return err } - a.q, err = queue.NewPool(a.wallet, cfg.QueueConfig) + a.q, err = queue.NewPool(a.wallet, a.queryClient, cfg.QueueConfig) if err != nil { log.Error().Err(err).Msg("failed to initialize Queue module") return err @@ -285,9 +291,9 @@ func (a *App) Start() error { // nolint:all go a.ConnectPeers() } - go a.api.Serve(a.fileSystem, a.prover, a.wallet, params.ChunkSize) + go a.api.Serve(a.fileSystem, a.prover, a.wallet, a.queryClient, params.ChunkSize) go a.prover.Start() - go a.strayManager.Start(a.fileSystem, myUrl, params.ChunkSize) + go a.strayManager.Start(a.fileSystem, a.queryClient, myUrl, params.ChunkSize) go a.monitor.Start() done := make(chan os.Signal, 1) @@ -313,16 +319,15 @@ func (a *App) Start() error { func (a *App) ConnectPeers() { log.Info().Msg("Starting IPFS Peering cycle...") ctx := context.Background() - queryClient := storageTypes.NewQueryClient(a.wallet.Client.GRPCConn) - activeProviders, err := queryClient.ActiveProviders(ctx, &storageTypes.QueryActiveProviders{}) + activeProviders, err := a.queryClient.ActiveProviders(ctx, &storageTypes.QueryActiveProviders{}) if err != nil { log.Warn().Msg("Cannot get active provider list. Won't try IPFS Peers.") return } for _, provider := range activeProviders.Providers { - providerDetails, err := queryClient.Provider(ctx, &storageTypes.QueryProvider{ + providerDetails, err := a.queryClient.Provider(ctx, &storageTypes.QueryProvider{ Address: provider.Address, }) if err != nil { diff --git a/network/downloads.go b/network/downloads.go index b645a0f..556a1f5 100644 --- a/network/downloads.go +++ b/network/downloads.go @@ -15,14 +15,12 @@ import ( "github.com/rs/zerolog/log" ) -func DownloadFile(f *file_system.FileSystem, merkle []byte, owner string, start int64, wallet *wallet.Wallet, fileSize int64, myUrl string, chunkSize int64, proofType int64, ipfsParams *ipfslite.AddParams) error { +func DownloadFile(f *file_system.FileSystem, merkle []byte, owner string, start int64, wallet *wallet.Wallet, queryClinet types.QueryClient, fileSize int64, myUrl string, chunkSize int64, proofType int64, ipfsParams *ipfslite.AddParams) error { queryParams := &types.QueryFindFile{ Merkle: merkle, } - cl := types.NewQueryClient(wallet.Client.GRPCConn) - - res, err := cl.FindFile(context.Background(), queryParams) + res, err := queryClinet.FindFile(context.Background(), queryParams) if err != nil { return err } diff --git a/queue/pool.go b/queue/pool.go index 8dc659a..7de81ee 100644 --- a/queue/pool.go +++ b/queue/pool.go @@ -27,8 +27,8 @@ type Pool struct { wallet *wallet.Wallet } -func NewPool(wallet *wallet.Wallet, config config.QueueConfig) (*Pool, error) { - workerWallets, err := initAuthClaimers(wallet, config.QueueThreads) +func NewPool(wallet *wallet.Wallet, queryClient storageTypes.QueryClient, config config.QueueConfig) (*Pool, error) { + workerWallets, err := initAuthClaimers(wallet, queryClient, config.QueueThreads) if err != nil { return nil, errors.Join(errors.New("failed to initialize auth claimers"), err) } @@ -116,13 +116,12 @@ func createWorkers(workerWallets []*wallet.Wallet, txTimer int, batchSize int, m return workers, wChannels, workerRunning } -func initAuthClaimers(wallet *wallet.Wallet, count int8) (workerWallets []*wallet.Wallet, err error) { +func initAuthClaimers(wallet *wallet.Wallet, queryClient storageTypes.QueryClient, count int8) (workerWallets []*wallet.Wallet, err error) { query := &storageTypes.QueryProvider{ Address: wallet.AccAddress(), } - cl := storageTypes.NewQueryClient(wallet.Client.GRPCConn) - res, err := cl.Provider(context.Background(), query) + res, err := queryClient.Provider(context.Background(), query) if err != nil { return nil, errors.Join(errors.New("unable to query provider auth claimers"), err) } diff --git a/strays/hands.go b/strays/hands.go index 54b4f10..179d081 100644 --- a/strays/hands.go +++ b/strays/hands.go @@ -23,7 +23,7 @@ func (h *Hand) Stop() { h.running = false } -func (h *Hand) Start(f *file_system.FileSystem, wallet *wallet.Wallet, myUrl string, chunkSize int64) { +func (h *Hand) Start(f *file_system.FileSystem, wallet *wallet.Wallet, queryClient types.QueryClient, myUrl string, chunkSize int64) { h.running = true defer log.Info().Msg("Hand stopped") for h.running { @@ -41,7 +41,7 @@ func (h *Hand) Start(f *file_system.FileSystem, wallet *wallet.Wallet, myUrl str start := h.stray.Start proofType := h.stray.ProofType - err := network.DownloadFile(f, merkle, signee, start, wallet, h.stray.FileSize, myUrl, chunkSize, proofType, utils.GetIPFSParams(h.stray)) + err := network.DownloadFile(f, merkle, signee, start, wallet, queryClient, h.stray.FileSize, myUrl, chunkSize, proofType, utils.GetIPFSParams(h.stray)) if err != nil { log.Error().Err(err) h.stray = nil diff --git a/strays/manager.go b/strays/manager.go index f89c4c3..7d4de3e 100644 --- a/strays/manager.go +++ b/strays/manager.go @@ -88,12 +88,12 @@ func NewStrayManager(w *wallet.Wallet, q queue.Queue, interval int64, refreshInt return s } -func (s *StrayManager) Start(f *file_system.FileSystem, myUrl string, chunkSize int64) { +func (s *StrayManager) Start(f *file_system.FileSystem, queryClient types.QueryClient, myUrl string, chunkSize int64) { s.running = true defer log.Info().Msg("StrayManager stopped") for _, hand := range s.hands { - go hand.Start(f, s.wallet, myUrl, chunkSize) + go hand.Start(f, s.wallet, queryClient, myUrl, chunkSize) } for s.running { From e5abf229552499b81e8e02c183e2085c1ed3da73 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 15 May 2025 16:49:08 -0700 Subject: [PATCH 32/55] add query client to api handler --- api/file_handler.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/api/file_handler.go b/api/file_handler.go index 16d5fa9..c4b0183 100644 --- a/api/file_handler.go +++ b/api/file_handler.go @@ -222,13 +222,12 @@ func PostFileHandlerV2(fio *file_system.FileSystem, prover *proofs.Prover, wl *w log.Error().Err(fmt.Errorf("can't encode json : %w", err)) } - cl := storageTypes.NewQueryClient(wl.Client.GRPCConn) queryParams := storageTypes.QueryFile{ Merkle: merkle, Owner: sender, Start: startBlock, } - res, err := cl.File(context.Background(), &queryParams) + res, err := queryClient.File(context.Background(), &queryParams) if err != nil { log.Error().Err(fmt.Errorf("failed to find file on chain with merkle: %x, owner: %s, start: %d | %w", merkle, sender, startBlock, err)) return From 5b4afbe431a6bb56dc7f490f4bae6e0618beb8f8 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Fri, 16 May 2025 18:11:15 -0700 Subject: [PATCH 33/55] fake query responses to start app --- testutil/fake.go | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/testutil/fake.go b/testutil/fake.go index 2eb496f..c04e270 100644 --- a/testutil/fake.go +++ b/testutil/fake.go @@ -31,7 +31,25 @@ func NewFakeStorageQueryClient() *FakeStorageQueryClient { } func (f *FakeStorageQueryClient) Params(ctx context.Context, in *types.QueryParams, opts ...grpc.CallOption) (*types.QueryParamsResponse, error) { - return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") + + resp := types.QueryParamsResponse{ + Params: types.Params{ + AttestFormSize: 5, + AttestMinToPass: 3, + CheckWindow: 300, + ChunkSize: 10240, + CollateralPrice: 10000000000, + DepositAccount: "jkl1t35eusvx97953uk47r3z4ckwd2prkn3fay76r8", + MaxContractAgeInBlocks: 100, + MissesToBurn: 1, + PolRatio: 40, + PriceFeed: "jklprice", + PricePerTbPerMonth: 15, + ProofWindow: 7200, + ReferralCommission: 25, + }, + } + return &resp, nil } // Queries a File by merkle, owner, and start. @@ -86,7 +104,9 @@ func (f *FakeStorageQueryClient) ProofsByAddress(ctx context.Context, in *types. // Queries a Provider by address. func (f *FakeStorageQueryClient) Provider(ctx context.Context, in *types.QueryProvider, opts ...grpc.CallOption) (*types.QueryProviderResponse, error) { - return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") + resp := new(types.QueryProviderResponse) + resp.Provider.Totalspace = "100000000" + return resp, nil } // Queries a list of Provider items. @@ -337,7 +357,9 @@ func (m *FakeRPCClient) BroadcastTxAsync(arg0 context.Context, arg1 types1.Tx) ( // BroadcastTxCommit mocks base method. // returns nil, nil func (m *FakeRPCClient) BroadcastTxCommit(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultBroadcastTxCommit, error) { - return nil, nil + res := new(coretypes.ResultBroadcastTxCommit) + + return res, nil } // BroadcastTxSync mocks base method. From d4f2d410f1155b603672eda48382be507fdcdd9f Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 20 May 2025 16:54:55 -0700 Subject: [PATCH 34/55] fix blockstore key unmarshal error --- config/types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/types.go b/config/types.go index 89b905d..6060705 100644 --- a/config/types.go +++ b/config/types.go @@ -105,7 +105,7 @@ func DefaultBlockStoreConfig() BlockStoreConfig { if err != nil { panic(err) } - k, err := priv.Raw() + k, err := crypto.MarshalPrivateKey(priv) if err != nil { panic(err) } From 1b44ad272d47734b92420560237e4e2cbd1228f6 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 20 May 2025 17:16:42 -0700 Subject: [PATCH 35/55] pass query client to stray manager --- core/app.go | 10 +++++++++- strays/manager.go | 11 ++++------- strays/types.go | 1 + testutil/fake.go | 3 +++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/core/app.go b/core/app.go index 1eb15bd..7a92d87 100644 --- a/core/app.go +++ b/core/app.go @@ -283,7 +283,15 @@ func (a *App) Start() error { log.Info().Msg(fmt.Sprintf("Provider started as: %s", myAddress)) a.prover = prover - a.strayManager = strays.NewStrayManager(a.wallet, a.q, cfg.StrayManagerCfg.CheckInterval, cfg.StrayManagerCfg.RefreshInterval, cfg.StrayManagerCfg.HandCount, claimers) + a.strayManager = strays.NewStrayManager( + a.wallet, + a.queryClient, + a.q, + cfg.StrayManagerCfg.CheckInterval, + cfg.StrayManagerCfg.RefreshInterval, + cfg.StrayManagerCfg.HandCount, + claimers) + a.monitor = monitoring.NewMonitor(a.wallet) // Starting the 4 concurrent services diff --git a/strays/manager.go b/strays/manager.go index 7d4de3e..41f0419 100644 --- a/strays/manager.go +++ b/strays/manager.go @@ -17,7 +17,7 @@ import ( "github.com/rs/zerolog/log" ) -func NewStrayManager(w *wallet.Wallet, q queue.Queue, interval int64, refreshInterval int64, handCount int, authList []string) *StrayManager { +func NewStrayManager(w *wallet.Wallet, queryClient types.QueryClient, q queue.Queue, interval int64, refreshInterval int64, handCount int, authList []string) *StrayManager { s := &StrayManager{ rand: rand.New(rand.NewSource(time.Now().Unix())), wallet: w, @@ -27,6 +27,7 @@ func NewStrayManager(w *wallet.Wallet, q queue.Queue, interval int64, refreshInt processed: time.Time{}, refreshed: time.Time{}, refreshInterval: time.Duration(refreshInterval), + queryClient: queryClient, } for i := 0; i < handCount; i++ { @@ -105,9 +106,7 @@ func (s *StrayManager) Start(f *file_system.FileSystem, queryClient types.QueryC if s.refreshed.Add(time.Second * s.refreshInterval).Before(time.Now()) { err := s.RefreshList() if err != nil { - log.Error().Err(err) - - log.Info().Msg("failed refresh") + log.Error().Err(err).Msg("failed refresh") } s.refreshed = time.Now() } @@ -170,9 +169,7 @@ func (s *StrayManager) RefreshList() error { Pagination: page, } - cl := types.NewQueryClient(s.wallet.Client.GRPCConn) - - res, err := cl.OpenFiles(context.Background(), queryParams) + res, err := s.queryClient.OpenFiles(context.Background(), queryParams) if err != nil { return err } diff --git a/strays/types.go b/strays/types.go index a5cebcf..0d6663f 100644 --- a/strays/types.go +++ b/strays/types.go @@ -26,4 +26,5 @@ type StrayManager struct { hands []*Hand processed time.Time refreshed time.Time + queryClient types.QueryClient } diff --git a/testutil/fake.go b/testutil/fake.go index c04e270..a45091d 100644 --- a/testutil/fake.go +++ b/testutil/fake.go @@ -18,6 +18,8 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + zlog "github.com/rs/zerolog/log" + "github.com/desmos-labs/cosmos-go-wallet/wallet" ) @@ -69,6 +71,7 @@ func (f *FakeStorageQueryClient) FilesFromNote(ctx context.Context, in *types.Qu // Queries a list of open files by provider_address. func (f *FakeStorageQueryClient) OpenFiles(ctx context.Context, in *types.QueryOpenFiles, opts ...grpc.CallOption) (*types.QueryAllFilesResponse, error) { + zlog.Info().Str("query", "OpenFiles").Msg("fake storage query client") return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") } From 186dbf9a83c1396f6f12c80e9d3b891d05583c97 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 26 May 2025 21:56:47 -0700 Subject: [PATCH 36/55] tx decoder --- testutil/txBuilder.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 testutil/txBuilder.go diff --git a/testutil/txBuilder.go b/testutil/txBuilder.go new file mode 100644 index 0000000..825b7d9 --- /dev/null +++ b/testutil/txBuilder.go @@ -0,0 +1,20 @@ +package testutil + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/jackalLabs/canine-chain/v4/types/module/testutil" + storageTypes "github.com/jackalLabs/canine-chain/v4/x/storage/types" +) + +func GetTxDecoder() sdk.TxDecoder { + cfg := MakeTestEncodingConfig() + + return cfg.TxConfig.TxDecoder() +} + +func MakeTestEncodingConfig() testutil.TestEncodingConfig { + cfg := testutil.MakeTestEncodingConfig() + + storageTypes.RegisterInterfaces(cfg.InterfaceRegistry) + return cfg +} From d5cd8df0ec7344e888922ded42bc7ce31ea84688 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 26 May 2025 21:57:10 -0700 Subject: [PATCH 37/55] decode tx sent to fake rpc client --- testutil/fake.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/testutil/fake.go b/testutil/fake.go index a45091d..c8ca5b4 100644 --- a/testutil/fake.go +++ b/testutil/fake.go @@ -360,8 +360,24 @@ func (m *FakeRPCClient) BroadcastTxAsync(arg0 context.Context, arg1 types1.Tx) ( // BroadcastTxCommit mocks base method. // returns nil, nil func (m *FakeRPCClient) BroadcastTxCommit(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultBroadcastTxCommit, error) { + res := new(coretypes.ResultBroadcastTxCommit) + tx, err := GetTxDecoder()(arg1) + if err != nil { + panic(err) + } + + msgs := tx.GetMsgs() + for _, m := range msgs { + msg, ok := m.(*types.MsgAddClaimer) + if !ok { + continue + } + + zlog.Info().Type("msg", msg).Str("creator", msg.Creator).Msg("msg sent to wallet") + } + return res, nil } From c2169242828ad4c8c9fa14b107c380e461508e98 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 27 May 2025 20:47:06 -0700 Subject: [PATCH 38/55] register feegrant interface --- testutil/fake.go | 17 +++++++++++++---- testutil/txBuilder.go | 6 ++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/testutil/fake.go b/testutil/fake.go index c8ca5b4..63b5ebb 100644 --- a/testutil/fake.go +++ b/testutil/fake.go @@ -370,12 +370,21 @@ func (m *FakeRPCClient) BroadcastTxCommit(arg0 context.Context, arg1 types1.Tx) msgs := tx.GetMsgs() for _, m := range msgs { - msg, ok := m.(*types.MsgAddClaimer) - if !ok { - continue + if msg, ok := m.(*types.MsgAddClaimer); ok { + zlog.Info().Type("msg", msg).Str("claim address", msg.ClaimAddress).Msg("msg sent to fake rpc") + } else if msg, ok := m.(*types.MsgPostProof); ok { + zlog.Info(). + Type("msg", msg). + Str("creator", msg.Creator). + Bytes("item", msg.Item). + Hex("hash_list", msg.HashList). + Hex("merkle", msg.Merkle). + Str("owner", msg.Owner). + Int64("start", msg.Start). + Int64("to_prove", msg.ToProve). + Msg("msg sent to fake rpc") } - zlog.Info().Type("msg", msg).Str("creator", msg.Creator).Msg("msg sent to wallet") } return res, nil diff --git a/testutil/txBuilder.go b/testutil/txBuilder.go index 825b7d9..bce2cb7 100644 --- a/testutil/txBuilder.go +++ b/testutil/txBuilder.go @@ -2,6 +2,9 @@ package testutil import ( sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + "github.com/cosmos/cosmos-sdk/x/feegrant" "github.com/jackalLabs/canine-chain/v4/types/module/testutil" storageTypes "github.com/jackalLabs/canine-chain/v4/x/storage/types" ) @@ -16,5 +19,8 @@ func MakeTestEncodingConfig() testutil.TestEncodingConfig { cfg := testutil.MakeTestEncodingConfig() storageTypes.RegisterInterfaces(cfg.InterfaceRegistry) + banktypes.RegisterInterfaces(cfg.InterfaceRegistry) + authtypes.RegisterInterfaces(cfg.InterfaceRegistry) + feegrant.RegisterInterfaces(cfg.InterfaceRegistry) return cfg } From b1637f72f34aaf228725719a5bd00f498ab02904 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 2 Jun 2025 17:32:46 -0700 Subject: [PATCH 39/55] fake query file --- testutil/fake.go | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/testutil/fake.go b/testutil/fake.go index 63b5ebb..35ca718 100644 --- a/testutil/fake.go +++ b/testutil/fake.go @@ -8,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/types/tx" auth "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/jackalLabs/canine-chain/v4/x/storage/types" + abci "github.com/tendermint/tendermint/abci/types" bytes "github.com/tendermint/tendermint/libs/bytes" log "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/p2p" @@ -55,8 +56,18 @@ func (f *FakeStorageQueryClient) Params(ctx context.Context, in *types.QueryPara } // Queries a File by merkle, owner, and start. +// returns UnifiedFile with empty proofs func (f *FakeStorageQueryClient) File(ctx context.Context, in *types.QueryFile, opts ...grpc.CallOption) (*types.QueryFileResponse, error) { - return nil, status.Error(codes.Unimplemented, "this is a fake storage query client") + var file types.UnifiedFile + file.Merkle = in.Merkle + file.Owner = in.Owner + file.Start = in.Start + + resp := &types.QueryFileResponse{ + File: file, + } + + return resp, nil } // Queries a list of File items. @@ -301,15 +312,29 @@ func (s *FakeServiceClient) GetBlockWithTxs(ctx context.Context, in *tx.GetBlock var _ rpc.Client = (*FakeRPCClient)(nil) type FakeRPCClient struct { + BlockHeight int64 } func NewFakeRPCClient() *FakeRPCClient { - return &FakeRPCClient{} + return &FakeRPCClient{ + BlockHeight: 0, + } } // ABCIInfo mocks base method. +// Pass context with key: "blockHeight" with value: int64 to get response blockheight +// of that value otherwise client's blockheight is returned func (m *FakeRPCClient) ABCIInfo(arg0 context.Context) (*coretypes.ResultABCIInfo, error) { - return nil, status.Error(codes.Unimplemented, "this is fake RPCClient") + respInfo := abci.ResponseInfo{ + LastBlockHeight: m.BlockHeight, + } + if v := arg0.Value("blockHeight"); v != nil { + height, ok := v.(int64) + if ok { + respInfo.LastBlockHeight = height + } + } + return &coretypes.ResultABCIInfo{Response: respInfo}, nil } // ABCIQuery mocks base method. From bd31f2d2d2fe3da1736c35ccbe4041e0f0f07c57 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 2 Jun 2025 17:33:29 -0700 Subject: [PATCH 40/55] use passed query client --- api/file_handler.go | 5 ++--- api/server.go | 2 +- core/app.go | 2 +- proofs/proofs.go | 27 ++++++++++++++------------- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/api/file_handler.go b/api/file_handler.go index c4b0183..1ee100a 100644 --- a/api/file_handler.go +++ b/api/file_handler.go @@ -43,7 +43,7 @@ func handleErr(err error, w http.ResponseWriter, code int) { } } -func PostFileHandler(fio *file_system.FileSystem, prover *proofs.Prover, wl *wallet.Wallet, chunkSize int64) func(http.ResponseWriter, *http.Request) { +func PostFileHandler(fio *file_system.FileSystem, prover *proofs.Prover, wl *wallet.Wallet, query storageTypes.QueryClient, chunkSize int64) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, req *http.Request) { err := req.ParseMultipartForm(MaxFileSize) // MAX file size lives here if err != nil { @@ -91,13 +91,12 @@ func PostFileHandler(fio *file_system.FileSystem, prover *proofs.Prover, wl *wal return } - cl := storageTypes.NewQueryClient(wl.Client.GRPCConn) queryParams := storageTypes.QueryFile{ Merkle: merkle, Owner: sender, Start: startBlock, } - res, err := cl.File(context.Background(), &queryParams) + res, err := query.File(context.Background(), &queryParams) if err != nil { handleErr(fmt.Errorf("failed to find file on chain with merkle: %x, owner: %s, start: %d | %w", merkle, sender, startBlock, err), w, http.StatusInternalServerError) return diff --git a/api/server.go b/api/server.go index 8469346..c0d0e28 100644 --- a/api/server.go +++ b/api/server.go @@ -51,7 +51,7 @@ func (a *API) Serve(f *file_system.FileSystem, p *proofs.Prover, wallet *wallet. outline.RegisterGetRoute(r, "/", IndexHandler(wallet.AccAddress())) - outline.RegisterPostRoute(r, "/upload", PostFileHandler(f, p, wallet, chunkSize)) + outline.RegisterPostRoute(r, "/upload", PostFileHandler(f, p, wallet, queryClient, chunkSize)) outline.RegisterPostRoute(r, "/v2/upload", PostFileHandlerV2(f, p, wallet, queryClient, chunkSize)) outline.RegisterPostRoute(r, "/v2/status/{id}", CheckUploadStatus()) outline.RegisterPostRoute(r, "/api/jobs", ListJobsHandler()) diff --git a/core/app.go b/core/app.go index 7a92d87..df324a9 100644 --- a/core/app.go +++ b/core/app.go @@ -276,7 +276,7 @@ func (a *App) Start() error { go a.q.Listen() - prover := proofs.NewProver(a.wallet, a.q, a.fileSystem, cfg.ProofInterval, cfg.ProofThreads, int(params.ChunkSize)) + prover := proofs.NewProver(a.wallet, a.queryClient, a.q, a.fileSystem, cfg.ProofInterval, cfg.ProofThreads, int(params.ChunkSize)) myUrl := cfg.Ip diff --git a/proofs/proofs.go b/proofs/proofs.go index f8e7b3f..08cb045 100644 --- a/proofs/proofs.go +++ b/proofs/proofs.go @@ -6,6 +6,7 @@ import ( "encoding/hex" "errors" "fmt" + "sync/atomic" "time" "google.golang.org/grpc/codes" @@ -93,9 +94,7 @@ func (p *Prover) GenerateProof(merkle []byte, owner string, start int64, blockHe Start: start, } - cl := types.NewQueryClient(p.wallet.Client.GRPCConn) - - res, err := cl.File(context.Background(), queryParams) + res, err := p.query.File(context.Background(), queryParams) if err != nil { return nil, nil, 0, err } @@ -120,7 +119,7 @@ func (p *Prover) GenerateProof(merkle []byte, owner string, start int64, blockHe if file.ContainsProver(p.wallet.AccAddress()) { // file is ours - proofRes, err := cl.Proof(context.Background(), proofQuery) + proofRes, err := p.query.Proof(context.Background(), proofQuery) if err == nil { newProof = proofRes.Proof // found the proof, we're good to go } @@ -315,16 +314,18 @@ func (p *Prover) Stop() { p.running = false } -func NewProver(wallet *wallet.Wallet, q queue.Queue, io FileSystem, interval int64, threads int16, chunkSize int) *Prover { +func NewProver(wallet *wallet.Wallet, query types.QueryClient, q queue.Queue, io FileSystem, interval int64, threads int16, chunkSize int) *Prover { p := Prover{ - running: false, - wallet: wallet, - q: q, - processed: time.Time{}, - interval: interval, - io: io, - threads: threads, - chunkSize: chunkSize, + running: false, + wallet: wallet, + query: query, + q: q, + processed: time.Time{}, + interval: interval, + io: io, + threads: int32(threads), + currentThreads: atomic.Int32{}, + chunkSize: chunkSize, } return &p From 166706be7f823a05622e4712c2152c7025000ab4 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 2 Jun 2025 17:33:51 -0700 Subject: [PATCH 41/55] fix race condition of file prove counter --- proofs/types.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/proofs/types.go b/proofs/types.go index 740776f..23d1486 100644 --- a/proofs/types.go +++ b/proofs/types.go @@ -1,12 +1,15 @@ package proofs import ( + "sync/atomic" "time" merkletree "github.com/wealdtech/go-merkletree/v2" "github.com/JackalLabs/sequoia/queue" "github.com/desmos-labs/cosmos-go-wallet/wallet" + + storageTypes "github.com/jackalLabs/canine-chain/v4/x/storage/types" ) type Prover struct { @@ -16,9 +19,10 @@ type Prover struct { processed time.Time interval int64 io FileSystem - threads int16 - currentThreads int16 + threads int32 + currentThreads atomic.Int32 chunkSize int + query storageTypes.QueryClient } type FileSystem interface { @@ -28,13 +32,13 @@ type FileSystem interface { } func (p *Prover) Inc() { - p.currentThreads++ + p.currentThreads.Add(1) } func (p *Prover) Dec() { - p.currentThreads-- + p.currentThreads.Add(-1) } func (p *Prover) Full() bool { - return p.threads <= p.currentThreads + return p.threads <= p.currentThreads.Load() } From 7198fe3a01561d02373540212a60f9ecc919ef56 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 3 Jun 2025 19:05:12 -0700 Subject: [PATCH 42/55] create offset wallet from main wallet --- wallet/wallet.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/wallet/wallet.go b/wallet/wallet.go index bcdb23b..52f6db2 100644 --- a/wallet/wallet.go +++ b/wallet/wallet.go @@ -11,6 +11,19 @@ import ( canine "github.com/jackalLabs/canine-chain/v4/app" ) +// creates count wallets from main wallet +func CreateOffsetWallets(main *wallet.Wallet, count int) (offsetWallets []*wallet.Wallet, err error) { + for i := range count { + w, err := main.CloneWalletOffset(byte(i + 1)) + if err != nil { + return nil, err + } + offsetWallets = append(offsetWallets, w) + } + + return offsetWallets, nil +} + func CreateWallet(seed string, derivation string, chainCfg types.ChainConfig) (*wallet.Wallet, error) { accountCfg := types.AccountConfig{ Mnemonic: seed, // forward service profit benefit punch catch fan chief jealous steel harvest column spell rude warm home melody hat broccoli pulse say garlic you firm From bbf3adaf53db78d2b44b1fea834431ec1f0a849f Mon Sep 17 00:00:00 2001 From: dahn510 Date: Tue, 3 Jun 2025 19:34:48 -0700 Subject: [PATCH 43/55] fix hands and worker wallet collision --- core/app.go | 25 +++++++++++++++--------- queue/pool.go | 49 ++++++++++++++++++++++++++++++++--------------- strays/manager.go | 42 +++++++++++++++++++++------------------- 3 files changed, 72 insertions(+), 44 deletions(-) diff --git a/core/app.go b/core/app.go index df324a9..4678913 100644 --- a/core/app.go +++ b/core/app.go @@ -31,6 +31,7 @@ import ( "github.com/JackalLabs/sequoia/proofs" "github.com/JackalLabs/sequoia/queue" "github.com/JackalLabs/sequoia/strays" + sequoiaWallet "github.com/JackalLabs/sequoia/wallet" walletTypes "github.com/desmos-labs/cosmos-go-wallet/types" "github.com/desmos-labs/cosmos-go-wallet/wallet" badger "github.com/dgraph-io/badger/v4" @@ -224,11 +225,13 @@ func (a *App) Start() error { Address: myAddress, } - cl := a.queryClient - - claimers := make([]string, 0) + offsetWalletCount := cfg.QueueConfig.QueueThreads + int8(cfg.StrayManagerCfg.HandCount) + offsetWallets, err := sequoiaWallet.CreateOffsetWallets(a.wallet, int(offsetWalletCount)) + if err != nil { + return err + } - res, err := cl.Provider(context.Background(), queryParams) + res, err := a.queryClient.Provider(context.Background(), queryParams) if err != nil { log.Info().Err(err).Msg("Provider does not exist on network or is not connected...") err := initProviderOnChain(a.wallet, cfg.Ip, cfg.TotalSpace) @@ -243,7 +246,6 @@ func (a *App) Start() error { Str("burned_contracts", res.Provider.BurnedContracts). Str("keybase_identity", res.Provider.KeybaseIdentity). Msg("provider query result") - claimers = res.Provider.AuthClaimers totalSpace, err := strconv.ParseInt(res.Provider.Totalspace, 10, 64) if err != nil { @@ -268,7 +270,8 @@ func (a *App) Start() error { return err } - a.q, err = queue.NewPool(a.wallet, a.queryClient, cfg.QueueConfig) + queueWallets := offsetWallets[:cfg.QueueConfig.QueueThreads] + a.q, err = queue.NewPool(a.wallet, a.queryClient, queueWallets, cfg.QueueConfig) if err != nil { log.Error().Err(err).Msg("failed to initialize Queue module") return err @@ -283,14 +286,18 @@ func (a *App) Start() error { log.Info().Msg(fmt.Sprintf("Provider started as: %s", myAddress)) a.prover = prover - a.strayManager = strays.NewStrayManager( + handWallets := offsetWallets[cfg.QueueConfig.QueueThreads:] + strayManager, err := strays.NewStrayManager( a.wallet, a.queryClient, a.q, cfg.StrayManagerCfg.CheckInterval, cfg.StrayManagerCfg.RefreshInterval, - cfg.StrayManagerCfg.HandCount, - claimers) + handWallets) + if err != nil { + return err + } + a.strayManager = strayManager a.monitor = monitoring.NewMonitor(a.wallet) diff --git a/queue/pool.go b/queue/pool.go index 7de81ee..1e31c91 100644 --- a/queue/pool.go +++ b/queue/pool.go @@ -13,6 +13,7 @@ import ( walletTypes "github.com/desmos-labs/cosmos-go-wallet/types" "github.com/desmos-labs/cosmos-go-wallet/wallet" + "github.com/cosmos/cosmos-sdk/x/feegrant" storageTypes "github.com/jackalLabs/canine-chain/v4/x/storage/types" "github.com/rs/zerolog/log" @@ -27,8 +28,8 @@ type Pool struct { wallet *wallet.Wallet } -func NewPool(wallet *wallet.Wallet, queryClient storageTypes.QueryClient, config config.QueueConfig) (*Pool, error) { - workerWallets, err := initAuthClaimers(wallet, queryClient, config.QueueThreads) +func NewPool(main *wallet.Wallet, queryClient storageTypes.QueryClient, workerWallets []*wallet.Wallet, config config.QueueConfig) (*Pool, error) { + err := initAuthClaimers(main, queryClient, workerWallets) if err != nil { return nil, errors.Join(errors.New("failed to initialize auth claimers"), err) } @@ -45,7 +46,7 @@ func NewPool(wallet *wallet.Wallet, queryClient storageTypes.QueryClient, config } pool := &Pool{ - wallet: wallet, + wallet: main, workers: workers, workerChannels: workerChannels, workerRunning: workerRunning, @@ -116,41 +117,59 @@ func createWorkers(workerWallets []*wallet.Wallet, txTimer int, batchSize int, m return workers, wChannels, workerRunning } -func initAuthClaimers(wallet *wallet.Wallet, queryClient storageTypes.QueryClient, count int8) (workerWallets []*wallet.Wallet, err error) { +func initAuthClaimers(wallet *wallet.Wallet, queryClient storageTypes.QueryClient, workerWallets []*wallet.Wallet) error { query := &storageTypes.QueryProvider{ Address: wallet.AccAddress(), } res, err := queryClient.Provider(context.Background(), query) if err != nil { - return nil, errors.Join(errors.New("unable to query provider auth claimers"), err) + return errors.Join(errors.New("unable to query provider auth claimers"), err) } - claimers := res.Provider.AuthClaimers - for i := range count { - workerWallet := newOffsetWallet(wallet, int(i)) - if !slices.Contains(claimers, workerWallet.AccAddress()) { - err := addClaimer(wallet, workerWallet) + claimers := res.Provider.AuthClaimers + // odd offsets are queue pool worker claimers + for _, w := range workerWallets { + if !slices.Contains(claimers, w.AccAddress()) { + err := addClaimer(wallet, w) if err != nil { - return nil, errors.Join(errors.New("failed to add claimer on chain"), err) + return errors.Join(errors.New("failed to add claimer on chain"), err) } } - workerWallets = append(workerWallets, workerWallet) } - return workerWallets, nil + return nil } func addClaimer(main *wallet.Wallet, claimer *wallet.Wallet) error { + allowance := feegrant.BasicAllowance{ + SpendLimit: nil, + Expiration: nil, + } + + wadd, err := types.AccAddressFromBech32(main.AccAddress()) + if err != nil { + return err + } + + hadd, err := types.AccAddressFromBech32(claimer.AccAddress()) + if err != nil { + return err + } + + grantMsg, nerr := feegrant.NewMsgGrantAllowance(&allowance, wadd, hadd) + if nerr != nil { + return err + } msg := storageTypes.NewMsgAddClaimer(main.AccAddress(), claimer.AccAddress()) - txData := walletTypes.NewTransactionData(msg).WithFeeAuto().WithGasAuto() + txData := walletTypes.NewTransactionData(msg, grantMsg).WithFeeAuto().WithGasAuto() res, err := main.BroadcastTxCommit(txData) if err != nil { return errors.Join(errors.New("unable to broadcast MsgAddClaimer"), err) } - log.Info().Msg(res.TxHash) + log.Info().Type("msg_type", msg).Msg(res.TxHash) return nil } diff --git a/strays/manager.go b/strays/manager.go index 41f0419..ddf31ea 100644 --- a/strays/manager.go +++ b/strays/manager.go @@ -2,8 +2,10 @@ package strays import ( "context" + "errors" "fmt" "math/rand" + "slices" "time" "github.com/JackalLabs/sequoia/file_system" @@ -17,7 +19,7 @@ import ( "github.com/rs/zerolog/log" ) -func NewStrayManager(w *wallet.Wallet, queryClient types.QueryClient, q queue.Queue, interval int64, refreshInterval int64, handCount int, authList []string) *StrayManager { +func NewStrayManager(w *wallet.Wallet, queryClient types.QueryClient, q queue.Queue, interval int64, refreshInterval int64, handWallets []*wallet.Wallet) (*StrayManager, error) { s := &StrayManager{ rand: rand.New(rand.NewSource(time.Now().Unix())), wallet: w, @@ -30,24 +32,27 @@ func NewStrayManager(w *wallet.Wallet, queryClient types.QueryClient, q queue.Qu queryClient: queryClient, } - for i := 0; i < handCount; i++ { + query := &types.QueryProvider{ + Address: w.AccAddress(), + } + + res, err := queryClient.Provider(context.Background(), query) + if err != nil { + return nil, errors.Join(errors.New("unable to query provider auth claimers"), err) + } + + authList := res.Provider.AuthClaimers + + for i, wallet := range handWallets { log.Info().Msg(fmt.Sprintf("Authorizing hand %d to transact on my behalf...", i)) h, err := s.NewHand(q) if err != nil { log.Error().Err(err).Int("index", i).Msg("Failed to create hand") - continue + return nil, err } - alreadyAuth := false - for _, auth := range authList { - if auth == h.Address() { - alreadyAuth = true - break - } - } - - if alreadyAuth { + if slices.Contains(authList, wallet.AccAddress()) { // already authorized continue } @@ -60,20 +65,17 @@ func NewStrayManager(w *wallet.Wallet, queryClient types.QueryClient, q queue.Qu wadd, err := sdk.AccAddressFromBech32(w.AccAddress()) if err != nil { - log.Error().Err(err) - continue + return nil, err } hadd, err := sdk.AccAddressFromBech32(h.Address()) if err != nil { - log.Error().Err(err) - continue + return nil, err } grantMsg, nerr := feegrant.NewMsgGrantAllowance(&allowance, wadd, hadd) if nerr != nil { - log.Error().Err(nerr) - continue + return nil, err } m, wg := q.Add(msg) @@ -82,11 +84,11 @@ func NewStrayManager(w *wallet.Wallet, queryClient types.QueryClient, q queue.Qu wg.Wait() if m.Error() != nil { - log.Error().Err(m.Error()) + return nil, err } } - return s + return s, nil } func (s *StrayManager) Start(f *file_system.FileSystem, queryClient types.QueryClient, myUrl string, chunkSize int64) { From 57fa87db3f85d4ff1861ae32575c07c475a0d157 Mon Sep 17 00:00:00 2001 From: marston Date: Fri, 6 Jun 2025 14:26:21 -0400 Subject: [PATCH 44/55] lint --- api/server.go | 2 +- core/app.go | 4 ++-- queue/pool_bench_test.go | 1 - queue/queue.go | 7 ------- strays/hands.go | 13 +------------ strays/manager.go | 4 ++-- testutil/fake.go | 9 ++------- 7 files changed, 8 insertions(+), 32 deletions(-) diff --git a/api/server.go b/api/server.go index 8ae3c5e..3354754 100644 --- a/api/server.go +++ b/api/server.go @@ -48,7 +48,7 @@ func (a *API) Close() error { return a.srv.Close() } -func (a *API) Serve(f *file_system.FileSystem, p *proofs.Prover, wallet *wallet.Wallet, queryClient storageTypes.QueryClient, chunkSize int64) { +func (a *API) Serve(f *file_system.FileSystem, p *proofs.Prover, wallet *wallet.Wallet, queryClient storageTypes.QueryClient, myIp string, chunkSize int64) { defer log.Info().Msg("API module stopped") r := mux.NewRouter() diff --git a/core/app.go b/core/app.go index 93c5a3c..5794e01 100644 --- a/core/app.go +++ b/core/app.go @@ -309,9 +309,9 @@ func (a *App) Start() error { // nolint:all go a.ConnectPeers() } - go a.api.Serve(a.fileSystem, a.prover, a.wallet, a.queryClient, params.ChunkSize) + go a.api.Serve(a.fileSystem, a.prover, a.wallet, a.queryClient, myUrl, params.ChunkSize) go a.prover.Start() - go a.strayManager.Start(a.fileSystem, a.queryClient, myUrl, params.ChunkSize) + go a.strayManager.Start(a.fileSystem, a.queryClient, a.q, myUrl, params.ChunkSize) go a.monitor.Start() diff --git a/queue/pool_bench_test.go b/queue/pool_bench_test.go index fcb2e70..ddec014 100644 --- a/queue/pool_bench_test.go +++ b/queue/pool_bench_test.go @@ -42,7 +42,6 @@ func setupNewPool(w *wallet.Wallet, config config.QueueConfig) *Pool { workerChannels: queue, workerRunning: workerRunning, } - } // really rough estimate because it benchmarks the whole pool.Add pipeline diff --git a/queue/queue.go b/queue/queue.go index caa0696..a63590b 100644 --- a/queue/queue.go +++ b/queue/queue.go @@ -1,15 +1,8 @@ package queue import ( - - "bytes" - "errors" - "fmt" - "strings" "sync" - storageTypes "github.com/jackalLabs/canine-chain/v4/x/storage/types" - "github.com/cosmos/cosmos-sdk/types" ) diff --git a/strays/hands.go b/strays/hands.go index d021e35..a7084a4 100644 --- a/strays/hands.go +++ b/strays/hands.go @@ -22,7 +22,7 @@ func (h *Hand) Stop() { h.running = false } -func (h *Hand) Start(f *file_system.FileSystem, wallet *wallet.Wallet, queryClient types.QueryClient, myUrl string, chunkSize int64) { +func (h *Hand) Start(f *file_system.FileSystem, wallet *wallet.Wallet, queryClient types.QueryClient, q queue.Queue, myUrl string, chunkSize int64) { h.running = true defer log.Info().Msg("Hand stopped") for h.running { @@ -77,19 +77,8 @@ func (h *Hand) Start(f *file_system.FileSystem, wallet *wallet.Wallet, queryClie Start: start, } - //data := walletTypes.NewTransactionData( - // msg, - //).WithGasAuto().WithFeeAuto() - m, wg := q.Add(msg) - //res, err := h.wallet.BroadcastTxCommit(data) - //if err != nil { - // log.Error().Err(err) - // h.stray = nil - // continue - //} - if m.Res() != nil { if m.Res().Code > 0 { log.Info().Msg(m.Res().RawLog) diff --git a/strays/manager.go b/strays/manager.go index b22f38d..f5245b7 100644 --- a/strays/manager.go +++ b/strays/manager.go @@ -92,12 +92,12 @@ func NewStrayManager(w *wallet.Wallet, queryClient types.QueryClient, q queue.Qu return s, nil } -func (s *StrayManager) Start(f *file_system.FileSystem, queryClient types.QueryClient, myUrl string, chunkSize int64) { +func (s *StrayManager) Start(f *file_system.FileSystem, queryClient types.QueryClient, q queue.Queue, myUrl string, chunkSize int64) { s.running = true defer log.Info().Msg("StrayManager stopped") for _, hand := range s.hands { - go hand.Start(f, s.wallet, queryClient, myUrl, chunkSize) + go hand.Start(f, s.wallet, queryClient, q, myUrl, chunkSize) } for s.running { diff --git a/testutil/fake.go b/testutil/fake.go index 35ca718..e673444 100644 --- a/testutil/fake.go +++ b/testutil/fake.go @@ -26,15 +26,13 @@ import ( var _ types.QueryClient = (*FakeStorageQueryClient)(nil) -type FakeStorageQueryClient struct { -} +type FakeStorageQueryClient struct{} func NewFakeStorageQueryClient() *FakeStorageQueryClient { return &FakeStorageQueryClient{} } func (f *FakeStorageQueryClient) Params(ctx context.Context, in *types.QueryParams, opts ...grpc.CallOption) (*types.QueryParamsResponse, error) { - resp := types.QueryParamsResponse{ Params: types.Params{ AttestFormSize: 5, @@ -269,8 +267,7 @@ func (a *FakeAuthQueryClient) ModuleAccountByName(ctx context.Context, in *auth. var _ tx.ServiceClient = (*FakeServiceClient)(nil) -type FakeServiceClient struct { -} +type FakeServiceClient struct{} func NewFakeServiceClient() *FakeServiceClient { return &FakeServiceClient{} @@ -385,7 +382,6 @@ func (m *FakeRPCClient) BroadcastTxAsync(arg0 context.Context, arg1 types1.Tx) ( // BroadcastTxCommit mocks base method. // returns nil, nil func (m *FakeRPCClient) BroadcastTxCommit(arg0 context.Context, arg1 types1.Tx) (*coretypes.ResultBroadcastTxCommit, error) { - res := new(coretypes.ResultBroadcastTxCommit) tx, err := GetTxDecoder()(arg1) @@ -409,7 +405,6 @@ func (m *FakeRPCClient) BroadcastTxCommit(arg0 context.Context, arg1 types1.Tx) Int64("to_prove", msg.ToProve). Msg("msg sent to fake rpc") } - } return res, nil From ebe4c04defa110e5b4ad1fcdf6f6422f26a8ec84 Mon Sep 17 00:00:00 2001 From: marston Date: Mon, 9 Jun 2025 11:43:51 -0400 Subject: [PATCH 45/55] gitignore linting --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index bc34f13..18c9491 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ data sequoia *.txt *.json +~ +.DS_Store \ No newline at end of file From a199413396919fb14b67112e351dc83c1717b09c Mon Sep 17 00:00:00 2001 From: marston Date: Mon, 9 Jun 2025 13:52:47 -0400 Subject: [PATCH 46/55] mem leaks maybe? --- api/server.go | 19 +++++++++++++------ file_system/file_system.go | 13 ++++++++----- network/downloads.go | 7 +++++-- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/api/server.go b/api/server.go index 3354754..cbeb0dd 100644 --- a/api/server.go +++ b/api/server.go @@ -100,11 +100,18 @@ func (a *API) Serve(f *file_system.FileSystem, p *proofs.Prover, wallet *wallet. } log.Logger.Info().Msg(fmt.Sprintf("Sequoia API now listening on %s", a.srv.Addr)) - err := a.srv.ListenAndServe() - if err != nil { - if !errors.Is(err, http.ErrServerClosed) { - log.Warn().Err(err) - return - } + + // Create a channel to listen for errors coming from the listener. + serverErrors := make(chan error, 1) + + go func() { + serverErrors <- a.srv.ListenAndServe() + }() + + // Wait for server error + err := <-serverErrors + if err != nil && !errors.Is(err, http.ErrServerClosed) { + log.Warn().Err(err).Msg("server error") + return } } diff --git a/file_system/file_system.go b/file_system/file_system.go index bd3534e..120fc10 100644 --- a/file_system/file_system.go +++ b/file_system/file_system.go @@ -551,11 +551,10 @@ func (f *FileSystem) GetFileData(merkle []byte) ([]byte, error) { return err } - _ = b.Value(func(val []byte) error { + return b.Value(func(val []byte) error { fcid = string(val) return nil }) - return nil }) if err != nil { return nil, fmt.Errorf("cannot get cid mapping from disk: %w", err) @@ -586,12 +585,16 @@ func (f *FileSystem) GetFileData(merkle []byte) ([]byte, error) { return nil, fmt.Errorf("cannot get file for cid '%s': %w", c.String(), err) } - //nolint:errcheck - defer rsc.Close() + defer func() { + if err := rsc.Close(); err != nil { + log.Error().Err(err).Msg("error closing file resource") + } + }() + fileData, err := io.ReadAll(rsc) if err != nil { return nil, err } - return fileData, err + return fileData, nil } diff --git a/network/downloads.go b/network/downloads.go index d4e94c3..6afc688 100644 --- a/network/downloads.go +++ b/network/downloads.go @@ -134,6 +134,11 @@ func DownloadFileFromURL(f *file_system.FileSystem, url string, merkle []byte, o } return 0, err } + defer func() { + if err := resp.Body.Close(); err != nil { + log.Error().Err(err).Msg("error closing response body") + } + }() if resp.StatusCode != 200 { data, err := io.ReadAll(resp.Body) @@ -148,8 +153,6 @@ func DownloadFileFromURL(f *file_system.FileSystem, url string, merkle []byte, o return 0, fmt.Errorf("could not get file, code: %d | msg: %s", resp.StatusCode, e.Error) } - //nolint:errcheck - defer resp.Body.Close() buff := bytes.NewBuffer([]byte{}) From bd39aa3b82a4e0366d2f891173467f705525f3ea Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 11 Jun 2025 20:46:40 -0700 Subject: [PATCH 47/55] remove wallet offset from new hand --- strays/hands.go | 7 +------ strays/manager.go | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/strays/hands.go b/strays/hands.go index a7084a4..2d0bc23 100644 --- a/strays/hands.go +++ b/strays/hands.go @@ -104,14 +104,9 @@ func (h *Hand) Take(stray *types.UnifiedFile) { h.stray = stray } -func (s *StrayManager) NewHand(q queue.Queue) (*Hand, error) { +func (s *StrayManager) NewHand(q queue.Queue, w *wallet.Wallet) (*Hand, error) { offset := byte(len(s.hands)) + 1 - w, err := s.wallet.CloneWalletOffset(offset) - if err != nil { - return nil, err - } - h := &Hand{ offset: offset, wallet: w, diff --git a/strays/manager.go b/strays/manager.go index f5245b7..bd36b33 100644 --- a/strays/manager.go +++ b/strays/manager.go @@ -47,7 +47,7 @@ func NewStrayManager(w *wallet.Wallet, queryClient types.QueryClient, q queue.Qu for i, wallet := range handWallets { log.Info().Msg(fmt.Sprintf("Authorizing hand %d to transact on my behalf...", i)) - h, err := s.NewHand(q) + h, err := s.NewHand(q, wallet) if err != nil { log.Error().Err(err).Int("index", i).Msg("Failed to create hand") return nil, err From a1aa8ac2147db15e34e2f78ab23546d5c0b668b9 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 11 Jun 2025 21:26:23 -0700 Subject: [PATCH 48/55] fix wrong error reference returned --- strays/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strays/manager.go b/strays/manager.go index bd36b33..c2a38bb 100644 --- a/strays/manager.go +++ b/strays/manager.go @@ -85,7 +85,7 @@ func NewStrayManager(w *wallet.Wallet, queryClient types.QueryClient, q queue.Qu wg.Wait() if m.Error() != nil { - return nil, err + return nil, m.Error() } } From 52c60ed261b14c3025ab79a4592b12a600e05232 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Wed, 11 Jun 2025 23:01:57 -0700 Subject: [PATCH 49/55] fix account sequence mismatch fee granter is main wallet and queue worker is offset wallet when stray manager adds new claimer, it uses main wallet as fee granter queue worker's offset wallet can't send feegrant msg because chain uses the granter's wallet to authorize the tx. --- core/app.go | 81 +++++++++++++++++++++++++++++++++++++---------- queue/pool.go | 69 ---------------------------------------- strays/manager.go | 61 ----------------------------------- 3 files changed, 64 insertions(+), 147 deletions(-) diff --git a/core/app.go b/core/app.go index 5794e01..c08b060 100644 --- a/core/app.go +++ b/core/app.go @@ -3,6 +3,7 @@ package core import ( "context" "encoding/json" + "errors" "fmt" "net/http" "net/url" @@ -10,6 +11,7 @@ import ( "os/signal" "path" "regexp" + "slices" "strconv" "strings" "syscall" @@ -37,6 +39,9 @@ import ( badger "github.com/dgraph-io/badger/v4" storageTypes "github.com/jackalLabs/canine-chain/v4/x/storage/types" "github.com/rs/zerolog/log" + + "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/feegrant" ) type App struct { @@ -241,27 +246,35 @@ func (a *App) Start() error { if err != nil { return err } - } else { - log.Debug(). - Str("address", res.Provider.Address). - Str("ip", res.Provider.Ip). - Str("totalspace", res.Provider.Totalspace). - Str("burned_contracts", res.Provider.BurnedContracts). - Str("keybase_identity", res.Provider.KeybaseIdentity). - Msg("provider query result") - - totalSpace, err := strconv.ParseInt(res.Provider.Totalspace, 10, 64) + } + + log.Debug(). + Str("address", res.Provider.Address). + Str("ip", res.Provider.Ip). + Str("totalspace", res.Provider.Totalspace). + Str("burned_contracts", res.Provider.BurnedContracts). + Str("keybase_identity", res.Provider.KeybaseIdentity). + Msg("provider query result") + + totalSpace, err := strconv.ParseInt(res.Provider.Totalspace, 10, 64) + if err != nil { + return err + } + if totalSpace != cfg.TotalSpace { + err := updateSpace(a.wallet, cfg.TotalSpace) if err != nil { return err } - if totalSpace != cfg.TotalSpace { - err := updateSpace(a.wallet, cfg.TotalSpace) - if err != nil { - return err - } + } + if res.Provider.Ip != cfg.Ip { + err := updateIp(a.wallet, cfg.Ip) + if err != nil { + return err } - if res.Provider.Ip != cfg.Ip { - err := updateIp(a.wallet, cfg.Ip) + } + for _, w := range offsetWallets { + if !slices.Contains(res.Provider.AuthClaimers, w.AccAddress()) { + err = a.authorizeClaimer(w) if err != nil { return err } @@ -335,6 +348,40 @@ func (a *App) Start() error { return nil } +func (a *App) authorizeClaimer(claimer *wallet.Wallet) error { + allowance := feegrant.BasicAllowance{ + SpendLimit: nil, + Expiration: nil, + } + + wadd, err := types.AccAddressFromBech32(a.wallet.AccAddress()) + if err != nil { + return err + } + + hadd, err := types.AccAddressFromBech32(claimer.AccAddress()) + if err != nil { + return err + } + + grantMsg, nerr := feegrant.NewMsgGrantAllowance(&allowance, wadd, hadd) + if nerr != nil { + return err + } + msg := storageTypes.NewMsgAddClaimer(a.wallet.AccAddress(), claimer.AccAddress()) + txData := walletTypes.NewTransactionData(msg, grantMsg).WithFeeAuto().WithGasAuto() + + res, err := a.wallet.BroadcastTxCommit(txData) + if err != nil { + return errors.Join(errors.New("unable to broadcast MsgAddClaimer"), err) + } + + log.Info().Str("claimer", claimer.AccAddress()).Type("msg_type", msg).Str("tx_hash", res.TxHash).Msg("added new claimer") + + return nil + +} + func (a *App) ConnectPeers() { log.Info().Msg("Starting IPFS Peering cycle...") ctx := context.Background() diff --git a/queue/pool.go b/queue/pool.go index 1e31c91..b3d2f8d 100644 --- a/queue/pool.go +++ b/queue/pool.go @@ -1,22 +1,15 @@ package queue import ( - "context" - "errors" "reflect" - "slices" "sync" "github.com/JackalLabs/sequoia/config" "github.com/cosmos/cosmos-sdk/types" - walletTypes "github.com/desmos-labs/cosmos-go-wallet/types" "github.com/desmos-labs/cosmos-go-wallet/wallet" - "github.com/cosmos/cosmos-sdk/x/feegrant" storageTypes "github.com/jackalLabs/canine-chain/v4/x/storage/types" - - "github.com/rs/zerolog/log" ) var _ Queue = &Pool{} @@ -29,11 +22,6 @@ type Pool struct { } func NewPool(main *wallet.Wallet, queryClient storageTypes.QueryClient, workerWallets []*wallet.Wallet, config config.QueueConfig) (*Pool, error) { - err := initAuthClaimers(main, queryClient, workerWallets) - if err != nil { - return nil, errors.Join(errors.New("failed to initialize auth claimers"), err) - } - workers, workerChannels, workerRunning := createWorkers(workerWallets, int(config.TxTimer), int(config.TxBatchSize), config.MaxRetryAttempt) if workers == nil { panic("no workers created") @@ -117,63 +105,6 @@ func createWorkers(workerWallets []*wallet.Wallet, txTimer int, batchSize int, m return workers, wChannels, workerRunning } -func initAuthClaimers(wallet *wallet.Wallet, queryClient storageTypes.QueryClient, workerWallets []*wallet.Wallet) error { - query := &storageTypes.QueryProvider{ - Address: wallet.AccAddress(), - } - - res, err := queryClient.Provider(context.Background(), query) - if err != nil { - return errors.Join(errors.New("unable to query provider auth claimers"), err) - } - - claimers := res.Provider.AuthClaimers - // odd offsets are queue pool worker claimers - for _, w := range workerWallets { - if !slices.Contains(claimers, w.AccAddress()) { - err := addClaimer(wallet, w) - if err != nil { - return errors.Join(errors.New("failed to add claimer on chain"), err) - } - } - } - - return nil -} - -func addClaimer(main *wallet.Wallet, claimer *wallet.Wallet) error { - allowance := feegrant.BasicAllowance{ - SpendLimit: nil, - Expiration: nil, - } - - wadd, err := types.AccAddressFromBech32(main.AccAddress()) - if err != nil { - return err - } - - hadd, err := types.AccAddressFromBech32(claimer.AccAddress()) - if err != nil { - return err - } - - grantMsg, nerr := feegrant.NewMsgGrantAllowance(&allowance, wadd, hadd) - if nerr != nil { - return err - } - msg := storageTypes.NewMsgAddClaimer(main.AccAddress(), claimer.AccAddress()) - txData := walletTypes.NewTransactionData(msg, grantMsg).WithFeeAuto().WithGasAuto() - - res, err := main.BroadcastTxCommit(txData) - if err != nil { - return errors.Join(errors.New("unable to broadcast MsgAddClaimer"), err) - } - - log.Info().Type("msg_type", msg).Msg(res.TxHash) - - return nil -} - func newOffsetWallet(main *wallet.Wallet, index int) *wallet.Wallet { w, err := main.CloneWalletOffset(byte(index + 1)) if err != nil { diff --git a/strays/manager.go b/strays/manager.go index c2a38bb..e78bf27 100644 --- a/strays/manager.go +++ b/strays/manager.go @@ -2,18 +2,13 @@ package strays import ( "context" - "errors" - "fmt" "math/rand" - "slices" "time" "github.com/JackalLabs/sequoia/file_system" "github.com/JackalLabs/sequoia/queue" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" - "github.com/cosmos/cosmos-sdk/x/feegrant" "github.com/desmos-labs/cosmos-go-wallet/wallet" "github.com/jackalLabs/canine-chain/v4/x/storage/types" "github.com/rs/zerolog/log" @@ -33,62 +28,6 @@ func NewStrayManager(w *wallet.Wallet, queryClient types.QueryClient, q queue.Qu queryClient: queryClient, } - query := &types.QueryProvider{ - Address: w.AccAddress(), - } - - res, err := queryClient.Provider(context.Background(), query) - if err != nil { - return nil, errors.Join(errors.New("unable to query provider auth claimers"), err) - } - - authList := res.Provider.AuthClaimers - - for i, wallet := range handWallets { - log.Info().Msg(fmt.Sprintf("Authorizing hand %d to transact on my behalf...", i)) - - h, err := s.NewHand(q, wallet) - if err != nil { - log.Error().Err(err).Int("index", i).Msg("Failed to create hand") - return nil, err - } - - if slices.Contains(authList, wallet.AccAddress()) { // already authorized - continue - } - - msg := types.NewMsgAddClaimer(w.AccAddress(), h.Address()) - - allowance := feegrant.BasicAllowance{ - SpendLimit: nil, - Expiration: nil, - } - - wadd, err := sdk.AccAddressFromBech32(w.AccAddress()) - if err != nil { - return nil, err - } - - hadd, err := sdk.AccAddressFromBech32(h.Address()) - if err != nil { - return nil, err - } - - grantMsg, nerr := feegrant.NewMsgGrantAllowance(&allowance, wadd, hadd) - if nerr != nil { - return nil, err - } - - m, wg := q.Add(msg) - q.Add(grantMsg) - - wg.Wait() - - if m.Error() != nil { - return nil, m.Error() - } - } - return s, nil } From a70c565c2248f4cf8fb3780832730c865636725e Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 16 Jun 2025 12:40:17 -0700 Subject: [PATCH 50/55] fix nil pointer dereference --- core/app.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/app.go b/core/app.go index c08b060..7b0cc36 100644 --- a/core/app.go +++ b/core/app.go @@ -246,16 +246,16 @@ func (a *App) Start() error { if err != nil { return err } + } else { + log.Debug(). + Str("address", res.Provider.Address). + Str("ip", res.Provider.Ip). + Str("totalspace", res.Provider.Totalspace). + Str("burned_contracts", res.Provider.BurnedContracts). + Str("keybase_identity", res.Provider.KeybaseIdentity). + Msg("provider query result") } - log.Debug(). - Str("address", res.Provider.Address). - Str("ip", res.Provider.Ip). - Str("totalspace", res.Provider.Totalspace). - Str("burned_contracts", res.Provider.BurnedContracts). - Str("keybase_identity", res.Provider.KeybaseIdentity). - Msg("provider query result") - totalSpace, err := strconv.ParseInt(res.Provider.Totalspace, 10, 64) if err != nil { return err From c9a1a0b9ca720aef2a0263b02f5a2807550de99f Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 23 Jun 2025 15:40:45 -0700 Subject: [PATCH 51/55] fix provider not found init problem --- core/app.go | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/core/app.go b/core/app.go index 7b0cc36..1e1e153 100644 --- a/core/app.go +++ b/core/app.go @@ -20,6 +20,8 @@ import ( apiTypes "github.com/JackalLabs/sequoia/api/types" "github.com/JackalLabs/sequoia/testutil" "github.com/libp2p/go-libp2p/core/peer" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "github.com/JackalLabs/sequoia/file_system" "github.com/JackalLabs/sequoia/ipfs" @@ -240,22 +242,30 @@ func (a *App) Start() error { } res, err := a.queryClient.Provider(context.Background(), queryParams) - if err != nil { - log.Info().Err(err).Msg("Provider does not exist on network or is not connected...") + if code := status.Code(err); code == codes.NotFound { + log.Info().Err(err).Msg("Provider does not exist on network") + log.Info(). + Str("address", myAddress). + Str("ip", cfg.Ip). + Int64("total_space", cfg.TotalSpace). + Msg("attempting to register provider on network") err := initProviderOnChain(a.wallet, cfg.Ip, cfg.TotalSpace) if err != nil { return err } - } else { - log.Debug(). - Str("address", res.Provider.Address). - Str("ip", res.Provider.Ip). - Str("totalspace", res.Provider.Totalspace). - Str("burned_contracts", res.Provider.BurnedContracts). - Str("keybase_identity", res.Provider.KeybaseIdentity). - Msg("provider query result") + } else if err != nil { + log.Info().Err(err).Msg("Network is unreachable...") + return err } + log.Debug(). + Str("address", res.Provider.Address). + Str("ip", res.Provider.Ip). + Str("totalspace", res.Provider.Totalspace). + Str("burned_contracts", res.Provider.BurnedContracts). + Str("keybase_identity", res.Provider.KeybaseIdentity). + Msg("provider query result") + totalSpace, err := strconv.ParseInt(res.Provider.Totalspace, 10, 64) if err != nil { return err From 7d35001ef760219da721aab3a67bfe876b3cc43d Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 23 Jun 2025 15:48:04 -0700 Subject: [PATCH 52/55] return init provider on chain err --- core/app.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/app.go b/core/app.go index 1e1e153..51741c7 100644 --- a/core/app.go +++ b/core/app.go @@ -249,10 +249,7 @@ func (a *App) Start() error { Str("ip", cfg.Ip). Int64("total_space", cfg.TotalSpace). Msg("attempting to register provider on network") - err := initProviderOnChain(a.wallet, cfg.Ip, cfg.TotalSpace) - if err != nil { - return err - } + return initProviderOnChain(a.wallet, cfg.Ip, cfg.TotalSpace) } else if err != nil { log.Info().Err(err).Msg("Network is unreachable...") return err From fbd533d27f515c53e8e13592dbfd879413cdc2db Mon Sep 17 00:00:00 2001 From: dahn510 Date: Mon, 30 Jun 2025 16:19:16 -0700 Subject: [PATCH 53/55] fix sequence mismatch error route postproof message to auth claimers and the rest to main wallet --- queue/pool.go | 78 ++++++++++++++++++++++++------------------------- queue/worker.go | 32 ++++++++++++-------- 2 files changed, 59 insertions(+), 51 deletions(-) diff --git a/queue/pool.go b/queue/pool.go index b3d2f8d..d439e56 100644 --- a/queue/pool.go +++ b/queue/pool.go @@ -10,48 +10,43 @@ import ( "github.com/desmos-labs/cosmos-go-wallet/wallet" storageTypes "github.com/jackalLabs/canine-chain/v4/x/storage/types" + + "github.com/rs/zerolog/log" ) var _ Queue = &Pool{} type Pool struct { - workers []*worker - workerChannels []chan *Message // worker id should correspond to index of this - workerRunning *sync.WaitGroup - wallet *wallet.Wallet + root *worker + rootQueue chan *Message + offsets []*worker + offsetQueue []chan *Message } func NewPool(main *wallet.Wallet, queryClient storageTypes.QueryClient, workerWallets []*wallet.Wallet, config config.QueueConfig) (*Pool, error) { - workers, workerChannels, workerRunning := createWorkers(workerWallets, int(config.TxTimer), int(config.TxBatchSize), config.MaxRetryAttempt) - if workers == nil { - panic("no workers created") - } - if workerChannels == nil { - panic("no worker channels created") - } - if len(workerChannels) != len(workers) { - panic("size of workers does not match size of worker channels") - } + root, rootQueue := createWorkers([]*wallet.Wallet{main}, int(config.TxTimer), int(config.TxBatchSize), config.MaxRetryAttempt) + workers, workerChannels := createWorkers(workerWallets, int(config.TxTimer), int(config.TxBatchSize), config.MaxRetryAttempt) pool := &Pool{ - wallet: main, - workers: workers, - workerChannels: workerChannels, - workerRunning: workerRunning, + root: root[0], + rootQueue: rootQueue[0], + offsets: workers, + offsetQueue: workerChannels, } return pool, nil } func (p *Pool) Stop() { - for _, c := range p.workerChannels { + close(p.rootQueue) + for _, c := range p.offsetQueue { close(c) } - p.workerRunning.Wait() } func (p *Pool) Listen() { - for _, w := range p.workers { + go p.root.start() + for _, w := range p.offsets { go w.start() } } @@ -67,14 +62,30 @@ func (p *Pool) Add(msg types.Msg) (*Message, *sync.WaitGroup) { msgIndex: -1, // no longer relevant(?) } - _ = p.sendToAny(m) + to := p.sendToQueue(m) + log.Debug().Type("msg_type", m.msg).Str("worker_id", to).Msg("message is sent to a worker") return m, &wg } -func (p *Pool) sendToAny(msg *Message) (workerId int) { - set := make([]reflect.SelectCase, 0, len(p.workerChannels)) - for _, ch := range p.workerChannels { +func (p *Pool) sendToQueue(msg *Message) (workerId string) { + // Auth claimers can sign and broadcast MsgPostProof but + // other messages must be signed by main wallet + switch msg.msg.(type) { + case *storageTypes.MsgPostProof: + to := p.sendToOffsets(msg) + return p.offsets[to].Id() + + default: + p.rootQueue <- msg + return p.root.Id() // 0 is always root + } +} + +func (p *Pool) sendToOffsets(msg *Message) int { + set := make([]reflect.SelectCase, 0, len(p.offsetQueue)) + + for _, ch := range p.offsetQueue { set = append(set, reflect.SelectCase{ Dir: reflect.SelectSend, Chan: reflect.ValueOf(ch), @@ -87,28 +98,17 @@ func (p *Pool) sendToAny(msg *Message) (workerId int) { return to } -func createWorkers(workerWallets []*wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8) (workers []*worker, queue []chan *Message, workerRunning *sync.WaitGroup) { +func createWorkers(workerWallets []*wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8) (workers []*worker, queue []chan *Message) { wChannels := make([]chan *Message, 0, len(workerWallets)) for range len(workerWallets) { wChannels = append(wChannels, make(chan *Message)) } - workerRunning = &sync.WaitGroup{} - workerRunning.Add(len(workerWallets)) - workers = make([]*worker, 0, len(workerWallets)) for i, w := range workerWallets { - worker := newWorker(int8(i), w, txTimer, batchSize, maxRetryAttempt, wChannels[i], workerRunning) + worker := newWorker(int8(i), w, txTimer, batchSize, maxRetryAttempt, wChannels[i]) workers = append(workers, worker) } - return workers, wChannels, workerRunning -} - -func newOffsetWallet(main *wallet.Wallet, index int) *wallet.Wallet { - w, err := main.CloneWalletOffset(byte(index + 1)) - if err != nil { - panic(err) - } - return w + return workers, wChannels } diff --git a/queue/worker.go b/queue/worker.go index 4c7f5ff..6216c6d 100644 --- a/queue/worker.go +++ b/queue/worker.go @@ -2,7 +2,6 @@ package queue import ( "errors" - "sync" "time" walletTypes "github.com/desmos-labs/cosmos-go-wallet/types" @@ -10,6 +9,8 @@ import ( "github.com/cosmos/cosmos-sdk/types" + storageTypes "github.com/jackalLabs/canine-chain/v4/x/storage/types" + "github.com/rs/zerolog/log" "google.golang.org/grpc/codes" @@ -17,30 +18,25 @@ import ( ) type worker struct { - id int8 wallet *wallet.Wallet // offset wallet maxRetryAttempt int8 msgIn <-chan *Message // worker stop if this closes batch []*Message batchSize int txTimer int - running *sync.WaitGroup } -func newWorker(id int8, wallet *wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8, msgIn <-chan *Message, running *sync.WaitGroup) *worker { +func newWorker(id int8, wallet *wallet.Wallet, txTimer int, batchSize int, maxRetryAttempt int8, msgIn <-chan *Message) *worker { return &worker{ - id: id, wallet: wallet, maxRetryAttempt: int8(maxRetryAttempt), msgIn: msgIn, batchSize: batchSize, txTimer: txTimer, - running: running, } } func (w *worker) start() { - defer w.running.Done() d := time.Duration(w.txTimer) * time.Second timer := time.NewTimer(d) // if no msg comes for 5 seconds, broadcast tx run: @@ -65,14 +61,22 @@ run: } } - log.Info().Int8("worker_id", w.id).Msg("queue worker stopped") - if len(w.batch) > 0 { // send the remaining messages - log.Info().Int8("id", w.id).Int("messages", len(w.batch)).Msg("sending remaining messages") - w.send() + log.Info().Str("worker_id", w.Id()).Msg("queue worker stopped") + if len(w.batch) > 0 { + log.Info(). + Str("id", w.Id()). + Str("addr", w.wallet.AccAddress()). + Int("count", len(w.batch)). + Msg("worker discarded remaining messages in the queue") } } func (w *worker) add(msg *Message) { + // broadcast message as auth claimer + if m, ok := msg.msg.(*storageTypes.MsgPostProof); ok { + m.Creator = w.wallet.AccAddress() + msg.msg = m + } if w.batch == nil { w.batch = []*Message{msg} return @@ -110,7 +114,7 @@ retry: if a == int(w.maxRetryAttempt+1) { log.Error(). - Int8("id", w.id). + Str("id", w.Id()). Int8("max attempt", w.maxRetryAttempt). Int("msg size", len(msg)). Err(err). @@ -124,3 +128,7 @@ retry: m.wg.Done() } } + +func (w *worker) Id() string { + return w.wallet.AccAddress()[3:8] +} From 210c22c5c41198e82ca5efe721545d95cb483832 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 10 Jul 2025 18:01:50 -0700 Subject: [PATCH 54/55] update test --- queue/pool_bench_test.go | 31 +++++++++++--------------- queue/pool_test.go | 47 ++++++++++++++++++---------------------- queue/worker_test.go | 23 ++++++-------------- 3 files changed, 41 insertions(+), 60 deletions(-) diff --git a/queue/pool_bench_test.go b/queue/pool_bench_test.go index ddec014..36a6475 100644 --- a/queue/pool_bench_test.go +++ b/queue/pool_bench_test.go @@ -8,13 +8,14 @@ import ( "google.golang.org/grpc/status" "github.com/JackalLabs/sequoia/config" + "github.com/JackalLabs/sequoia/testutil" + sequoiaWallet "github.com/JackalLabs/sequoia/wallet" "go.uber.org/mock/gomock" codectypes "github.com/cosmos/cosmos-sdk/codec/types" sdkTypes "github.com/cosmos/cosmos-sdk/types" authTypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/desmos-labs/cosmos-go-wallet/wallet" ttypes "github.com/tendermint/tendermint/types" "github.com/jackalLabs/canine-chain/v4/x/storage/types" @@ -28,22 +29,6 @@ var queueConfig config.QueueConfig = config.QueueConfig{ TxTimer: 3, } -func setupNewPool(w *wallet.Wallet, config config.QueueConfig) *Pool { - workerWallets := make([]*wallet.Wallet, 0) - for i := range config.QueueThreads { - workerWallet := newOffsetWallet(w, int(i)) - workerWallets = append(workerWallets, workerWallet) - } - - workers, queue, workerRunning := createWorkers(workerWallets, int(config.TxTimer), int(config.TxBatchSize), config.MaxRetryAttempt) - return &Pool{ - wallet: w, - workers: workers, - workerChannels: queue, - workerRunning: workerRunning, - } -} - // really rough estimate because it benchmarks the whole pool.Add pipeline func BenchmarkPoolAdd(b *testing.B) { wallet, queryClient, _, rpcClient := setupWalletClient(b) @@ -70,7 +55,17 @@ func BenchmarkPoolAdd(b *testing.B) { } queryClient.EXPECT().Account(gomock.Any(), gomock.Any()).Return(queryResp, nil).AnyTimes() - pool := setupNewPool(wallet, queueConfig) + storageQuery := testutil.NewFakeStorageQueryClient() + + offsetWallets, err := sequoiaWallet.CreateOffsetWallets(wallet, int(queueConfig.QueueThreads)) + if err != nil { + b.Error(err) + } + pool, err := NewPool(wallet, storageQuery, offsetWallets, queueConfig) + if err != nil { + b.Error(err) + } + go pool.Listen() defer pool.Stop() diff --git a/queue/pool_test.go b/queue/pool_test.go index 17eca96..083e510 100644 --- a/queue/pool_test.go +++ b/queue/pool_test.go @@ -1,48 +1,43 @@ package queue import ( - "sync" "testing" - "github.com/stretchr/testify/require" - "github.com/jackalLabs/canine-chain/v4/x/storage/types" ) -func TestPoolSendToAny(t *testing.T) { - r := require.New(t) +func TestPoolAddMsg(t *testing.T) { queue := make([]chan *Message, 0) - for range 4 { + for range 2 { queue = append(queue, make(chan *Message)) } - pool := Pool{ - workerChannels: queue, - } + wallet, _, _, _ := setupWalletClient(t) - msg := Message{ - msg: types.NewMsgPostProof("", []byte("hello"), "owner", 0, []byte("item"), []byte("list"), 0), - wg: nil, + workers := []*worker{{wallet: wallet}, {wallet: wallet}} + + pool := Pool{ + offsets: workers, + offsetQueue: queue, } - wg := sync.WaitGroup{} go func() { - t.Logf("starting goroutine(worker): %d", len(queue)-1) - for m := range queue[len(queue)-1] { - t.Logf("worker[%d]: message received", len(queue)-1) - _ = m - wg.Done() - } + msg := <-queue[0] // worker 0 is "busy" after receiving from queue[0] + msg.wg.Done() + msg = <-queue[1] + msg.wg.Done() }() - msgCount := 8 - for range msgCount { - wg.Add(1) - to := pool.sendToAny(&msg) - r.EqualValues(len(queue)-1, to) + msg, wg0 := pool.Add(&types.MsgPostProof{}) + if _, ok := msg.msg.(*types.MsgPostProof); !ok { + t.Errorf("expected: msg.msg as *types.MsgPostProof, got: %T", msg.msg) } + wg0.Wait() - wg.Wait() - close(queue[len(queue)-1]) + msg, wg1 := pool.Add(&types.MsgPostProof{}) + if _, ok := msg.msg.(*types.MsgPostProof); !ok { + t.Errorf("expected: msg.msg as *types.MsgPostProof, got: %T", msg.msg) + } + wg1.Wait() } diff --git a/queue/worker_test.go b/queue/worker_test.go index b193f3d..4110ae2 100644 --- a/queue/worker_test.go +++ b/queue/worker_test.go @@ -96,9 +96,7 @@ func TestWorkerSendMaxRetry(t *testing.T) { chMsg := make(chan *Message) - workerRunning := sync.WaitGroup{} // not used - - w := newWorker(0, wallet, 1, 10, 3, chMsg, &workerRunning) + w := newWorker(0, wallet, 1, 10, 3, chMsg) wg := sync.WaitGroup{} wg.Add(1) @@ -128,11 +126,11 @@ func TestBatchFullSend(t *testing.T) { wg.Add(2) m0 := Message{ - msg: types.NewMsgPostProof("1", []byte(""), "", 0, []byte(""), []byte(""), 0), + msg: types.NewMsgPostProof(wallet.AccAddress(), []byte(""), "", 0, []byte(""), []byte(""), 0), wg: &wg, } m1 := Message{ - msg: types.NewMsgPostProof("2", []byte(""), "", 0, []byte(""), []byte(""), 0), + msg: types.NewMsgPostProof(wallet.AccAddress(), []byte(""), "", 0, []byte(""), []byte(""), 0), wg: &wg, } @@ -160,10 +158,7 @@ func TestBatchFullSend(t *testing.T) { chMsg := make(chan *Message) - workerRunning := sync.WaitGroup{} - workerRunning.Add(1) - - w := newWorker(0, wallet, 3, 2, 2, chMsg, &workerRunning) + w := newWorker(0, wallet, 3, 2, 2, chMsg) go w.start() chMsg <- &m0 @@ -173,7 +168,6 @@ func TestBatchFullSend(t *testing.T) { close(chMsg) r.EqualValues(expectedSignedTx, actual) - workerRunning.Wait() } func TestBatchHalfFullSend(t *testing.T) { @@ -185,11 +179,11 @@ func TestBatchHalfFullSend(t *testing.T) { wg.Add(2) m0 := Message{ - msg: types.NewMsgPostProof("1", []byte(""), "", 0, []byte(""), []byte(""), 0), + msg: types.NewMsgPostProof(wallet.AccAddress(), []byte(""), "", 0, []byte(""), []byte(""), 0), wg: &wg, } m1 := Message{ - msg: types.NewMsgPostProof("2", []byte(""), "", 0, []byte(""), []byte(""), 0), + msg: types.NewMsgPostProof(wallet.AccAddress(), []byte(""), "", 0, []byte(""), []byte(""), 0), wg: &wg, } @@ -216,9 +210,7 @@ func TestBatchHalfFullSend(t *testing.T) { chMsg := make(chan *Message) - workerRunning := sync.WaitGroup{} - workerRunning.Add(1) - w := newWorker(0, wallet, 3, 5, 2, chMsg, &workerRunning) + w := newWorker(0, wallet, 3, 5, 2, chMsg) go w.start() chMsg <- &m0 @@ -228,5 +220,4 @@ func TestBatchHalfFullSend(t *testing.T) { close(chMsg) r.EqualValues(expectedSignedTx, actual) - workerRunning.Wait() } From 28579bcbab020d1de7d460a21ecfeac57f1fc5a8 Mon Sep 17 00:00:00 2001 From: dahn510 Date: Thu, 10 Jul 2025 18:02:03 -0700 Subject: [PATCH 55/55] lint --- core/app.go | 1 - 1 file changed, 1 deletion(-) diff --git a/core/app.go b/core/app.go index 51741c7..f36369b 100644 --- a/core/app.go +++ b/core/app.go @@ -386,7 +386,6 @@ func (a *App) authorizeClaimer(claimer *wallet.Wallet) error { log.Info().Str("claimer", claimer.AccAddress()).Type("msg_type", msg).Str("tx_hash", res.TxHash).Msg("added new claimer") return nil - } func (a *App) ConnectPeers() {