diff --git a/blockchain/common/test/.!33033!bsc_blob_sidecars_len_1.rlp b/.!19703!.DS_Store similarity index 100% rename from blockchain/common/test/.!33033!bsc_blob_sidecars_len_1.rlp rename to .!19703!.DS_Store diff --git a/blockchain/common/test/.!33861!bsc_blob_sidecars_len_1.rlp b/.!20449!.DS_Store similarity index 100% rename from blockchain/common/test/.!33861!bsc_blob_sidecars_len_1.rlp rename to .!20449!.DS_Store diff --git a/blockchain/bdn/block.go b/blockchain/bdn/block.go new file mode 100644 index 0000000..c84c273 --- /dev/null +++ b/blockchain/bdn/block.go @@ -0,0 +1,62 @@ +package bdn + +import ( + "errors" + + "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" + ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/prysm/v5/runtime/version" +) + +// ErrNotDenebBlock is returned when the block is not a Deneb block. +var ErrNotDenebBlock = errors.New("block is not Deneb block") + +// PbGenericBlock returns a generic signed beacon block. +func PbGenericBlock(b interfaces.ReadOnlySignedBeaconBlock) (*ethpb.GenericSignedBeaconBlock, error) { + pb, err := b.Proto() + if err != nil { + return nil, err + } + switch b.Version() { + case version.Deneb: + if b.IsBlinded() { + return ðpb.GenericSignedBeaconBlock{ + Block: ðpb.GenericSignedBeaconBlock_BlindedDeneb{BlindedDeneb: pb.(*ethpb.SignedBlindedBeaconBlockDeneb)}, + }, nil + } + + block, ok := pb.(*ethpb.SignedBeaconBlockDeneb) + if !ok { + return b.PbGenericBlock() + } + + return ðpb.GenericSignedBeaconBlock{ + Block: ðpb.GenericSignedBeaconBlock_Deneb{ + Deneb: ðpb.SignedBeaconBlockContentsDeneb{ + Block: block, + }, + }, + }, nil + case version.Electra: + if b.IsBlinded() { + return ðpb.GenericSignedBeaconBlock{ + Block: ðpb.GenericSignedBeaconBlock_BlindedElectra{BlindedElectra: pb.(*ethpb.SignedBlindedBeaconBlockElectra)}, + }, nil + } + + block, ok := pb.(*ethpb.SignedBeaconBlockElectra) + if !ok { + return b.PbGenericBlock() + } + + return ðpb.GenericSignedBeaconBlock{ + Block: ðpb.GenericSignedBeaconBlock_Electra{ + Electra: ðpb.SignedBeaconBlockContentsElectra{ + Block: block, + }, + }, + }, nil + default: + return b.PbGenericBlock() + } +} diff --git a/blockchain/beacon/handle_bridge.go b/blockchain/beacon/handle_bridge.go index b031a2d..86fb228 100644 --- a/blockchain/beacon/handle_bridge.go +++ b/blockchain/beacon/handle_bridge.go @@ -6,12 +6,13 @@ import ( "fmt" "time" - "github.com/bloXroute-Labs/gateway/v2/blockchain" - log "github.com/bloXroute-Labs/gateway/v2/logger" - "github.com/bloXroute-Labs/gateway/v2/types" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" + + "github.com/bloXroute-Labs/gateway/v2/blockchain" + log "github.com/bloXroute-Labs/gateway/v2/logger" + "github.com/bloXroute-Labs/gateway/v2/types" ) // HandleBDNBeaconMessages waits for beacon messages from BDN and broadcast it to the connected nodes @@ -108,9 +109,14 @@ func HandleBDNBlocks(ctx context.Context, b blockchain.Bridge, n *Node, beaconAP } func fillBlockContents(blobsManager *BlobSidecarCacheManager, castedBlock interfaces.ReadOnlySignedBeaconBlock, blockHash string) (*ethpb.SignedBeaconBlockContentsDeneb, error) { - denebBlock, err := castedBlock.PbDenebBlock() + bp, err := castedBlock.Proto() if err != nil { - return nil, fmt.Errorf("failed to convert block to Deneb block: %v", err) + return nil, fmt.Errorf("failed to convert block to proto message: %v", err) + } + + denebBlock, ok := bp.(*ethpb.SignedBeaconBlockDeneb) + if !ok { + return nil, fmt.Errorf("failed to convert block of type %T to Deneb block", bp) } kzgCommits := denebBlock.Block.Body.BlobKzgCommitments diff --git a/blockchain/beacon/prysm_client.go b/blockchain/beacon/prysm_client.go index 7a9964d..f1fb1aa 100644 --- a/blockchain/beacon/prysm_client.go +++ b/blockchain/beacon/prysm_client.go @@ -4,11 +4,6 @@ import ( "context" "time" - "github.com/bloXroute-Labs/gateway/v2/blockchain" - "github.com/bloXroute-Labs/gateway/v2/blockchain/network" - log "github.com/bloXroute-Labs/gateway/v2/logger" - "github.com/bloXroute-Labs/gateway/v2/types" - "github.com/bloXroute-Labs/gateway/v2/utils" ethcommon "github.com/ethereum/go-ethereum/common" "github.com/prysmaticlabs/prysm/v5/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" @@ -16,6 +11,12 @@ import ( ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + + "github.com/bloXroute-Labs/gateway/v2/blockchain" + "github.com/bloXroute-Labs/gateway/v2/blockchain/network" + log "github.com/bloXroute-Labs/gateway/v2/logger" + "github.com/bloXroute-Labs/gateway/v2/types" + "github.com/bloXroute-Labs/gateway/v2/utils" ) const prysmClientTimeout = 10 * time.Second @@ -68,7 +69,7 @@ func (c *PrysmClient) run() { func() { c.log.Trace("connecting to prysm") - conn, err := grpc.DialContext(c.ctx, c.addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, err := grpc.NewClient(c.addr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { c.log.Warnf("could not establish a connection to the Prysm: %v, retrying in %v seconds...", err, prysmClientTimeout) return diff --git a/blockchain/bsc/blockproposer/block_proposer.go b/blockchain/bsc/blockproposer/block_proposer.go deleted file mode 100644 index fe84dbd..0000000 --- a/blockchain/bsc/blockproposer/block_proposer.go +++ /dev/null @@ -1,579 +0,0 @@ -package blockproposer - -import ( - "context" - "math/big" - "strconv" - "sync" - "time" - - "github.com/pkg/errors" - "go.uber.org/atomic" - - ethtypes "github.com/ethereum/go-ethereum/core/types" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/rpc" - - "google.golang.org/protobuf/types/known/durationpb" - "google.golang.org/protobuf/types/known/timestamppb" - - pb "github.com/bloXroute-Labs/gateway/v2/protobuf" - - "github.com/bloXroute-Labs/gateway/v2/blockchain/bsc" - "github.com/bloXroute-Labs/gateway/v2/blockchain/eth" - "github.com/bloXroute-Labs/gateway/v2/services" - "github.com/bloXroute-Labs/gateway/v2/types" - "github.com/bloXroute-Labs/gateway/v2/utils/ctxutil" - "github.com/bloXroute-Labs/gateway/v2/utils/ptr" -) - -type sendingState uint8 - -const ( - sendingStateNotSent = sendingState(iota) - sendingStateSent - sendingStateReplacedWithHigherReward -) - -const mevRelayID = "bloXroute-GW" - -const mevBlockBacklog = 100 - -type loadType string - -const ( - regularLoadType loadType = "REGULAR" - highLoadType loadType = "HIGHLOAD" -) - -var ( - errAlreadySent = errors.New("block already sent") - errLowerBlockReward = errors.New("block reward is lower than the one is in memory") - errBlockNotFound = errors.New("block number not found") - - errLowerBlockNumber = errors.New("proposed block number is too low") - errHigherBlockNumber = errors.New("proposed block number is too high") - - errBlockNotSent = errors.New("no block was sent") - errBlockReplacedWithNew = errors.New("block was replaced with higher reward") - - errSendBlockToBlockProposer = errors.New("failed to send block to block proposer") -) - -var inTurnDifficulty = big.NewInt(2) - -// BlockProposer is responsible for proposing blocks to the gateway -type BlockProposer struct { - cfg *Config - - state *atomic.Pointer[services.RunState] - - wg *sync.WaitGroup - wgProposing *sync.WaitGroup - - blockCh chan bsc.ChainBlock - - blockMap ProposedBlockStore - - cancel context.CancelFunc - ctxSwitcher ctxutil.CtxSwitcher - - blockNumberToProposeFor *atomic.Pointer[big.Int] - - blockReward *atomic.Pointer[big.Int] -} - -// New creates a new block proposer -func New(cfg *Config) *BlockProposer { - b := &BlockProposer{ - cfg: cfg, - - state: atomic.NewPointer(ptr.New(services.StateIdle)), - - wg: new(sync.WaitGroup), - wgProposing: new(sync.WaitGroup), - - blockCh: make(chan bsc.ChainBlock, mevBlockBacklog), - } - - b.reset() - - return b -} - -// requireIdle returns an error if the block proposer is not in the idle state -func (b *BlockProposer) requireIdle() error { - return services.RequireState(b.state.Load(), services.StateIdle) -} - -// requireRunning returns an error if the block proposer is not in the running state -func (b *BlockProposer) requireRunning() error { - return services.RequireState(b.state.Load(), services.StateRunning) -} - -// reset resets the block proposer -func (b *BlockProposer) reset() { - if b.cancel != nil { - b.cancel() - b.wg.Wait() - } - - b.blockMap = NewProposedBlockMap(b.cfg.BlocksToCache, b.cfg.SendingInfo.HighLoadTxNumThreshold) - - b.blockNumberToProposeFor = atomic.NewPointer(big.NewInt(-1)) - b.blockReward = atomic.NewPointer(big.NewInt(0)) -} - -// runLoop runs the block proposer loop -func (b *BlockProposer) runLoop(ctx context.Context) { - // reassign the context to the local context with cancel - ctx, b.cancel = context.WithCancel(ctx) - - // set the context switcher that manages the context of the current block inside the loop - // can be switched to the context of the next block - // or canceled from the outside - b.ctxSwitcher = ctxutil.NewCtxSwitcher(ctx) - - // define defers to be executed when the loop exits - defer func() { - b.ctxSwitcher.Cancel() - b.cancel() - b.state.Store(ptr.New(services.StateIdle)) - b.wg.Done() - }() - - var ( - chainHeadBlockNumber = big.NewInt(0) - chainHeadBlockDifficulty = big.NewInt(0) - ) - - { // start the ticker handlers - go b.runTicker(ctx, b.cfg.RegularTicker, regularLoadType) - go b.runTicker(ctx, b.cfg.HighLoadTicker, highLoadType) - } - - b.cfg.Log.Info("start service startTime(" + b.cfg.Clock.Now().Format(bsc.BlockProposingDateFormat) + ") blocksToCache(" + strconv.FormatInt(b.cfg.BlocksToCache, 10) + ")") - - b.state.Store(ptr.New(services.StateRunning)) - - // block listener loop - for { - select { - case <-ctx.Done(): - b.close() - b.cfg.Log.Info("stop service stopTime(" + b.cfg.Clock.Now().Format(bsc.BlockProposingDateFormat) + "): " + ctx.Err().Error()) - return - case blk := <-b.blockCh: - func() { - if blk == nil { - return - } - - newChainHeadBlockNumber := blk.Number() - newChainHeadBlockDifficulty := blk.Difficulty() - newBlockNumberToProposeFor := getBlockNumberToProposeFor(newChainHeadBlockNumber) - newBlockTime := timeFromTimestamp(blk.Time()) - - switch chainHeadBlockNumber.Cmp(newChainHeadBlockNumber) { - case 1: // chainHeadBlockNumber > newChainHeadBlockNumber - return - case 0: // chainHeadBlockNumber == newChainHeadBlockNumber - if chainHeadBlockDifficulty.Cmp(inTurnDifficulty) == 0 || newChainHeadBlockDifficulty.Cmp(inTurnDifficulty) != 0 { - return - } - } - - msg := "stopProposingForBlock(" + newChainHeadBlockNumber.String() + ") startProposingForBlock(" + newBlockNumberToProposeFor.String() + ")" - defer func() { b.cfg.Log.Debug(msg) }() - - // TODO: (mk) add block number request to the validator to establish connection with keep-alive - - b.ctxSwitcher.Switch() - b.wgProposing.Wait() - - b.blockMap.Shift(rpc.BlockNumber(newBlockNumberToProposeFor.Uint64())) - chainHeadBlockNumber.Set(newChainHeadBlockNumber) - chainHeadBlockDifficulty.Set(newChainHeadBlockDifficulty) - - b.blockReward.Store(big.NewInt(0)) - - b.cfg.RegularTicker.Reset(newBlockTime) - b.cfg.HighLoadTicker.Reset(newBlockTime) - - b.blockNumberToProposeFor.Store(newBlockNumberToProposeFor) - }() - } - } -} - -// runTicker runs the ticker handler -func (b *BlockProposer) runTicker(ctx context.Context, ticker bsc.Ticker, load loadType) { - go func() { - if err := ticker.Run(ctx); err != nil { - b.cfg.Log.Error("failed running " + string(load) + " ticker: " + err.Error()) - } - }() - - b.cfg.Log.Info("start " + string(load) + " ticker handler startTime(" + b.cfg.Clock.Now().Format(bsc.BlockProposingDateFormat) + ")") - - for { - select { - case <-ctx.Done(): - b.cfg.Log.Info("stop " + string(load) + " ticker handler stopTime(" + b.cfg.Clock.Now().Format(bsc.BlockProposingDateFormat) + "): " + ctx.Err().Error()) - return - case <-ticker.Alert(): - blockNumber := b.blockNumberToProposeFor.Load() - if blockNumber == nil { - b.cfg.Log.Warn(string(load) + " failed to get block number to propose for") - continue - } - - blockNum := rpc.BlockNumber(blockNumber.Int64()) - - // checks inside of the loop so to not fire goroutines no submitter is available - submitter := b.blockMap.SubmitBlock(blockNum, load == highLoadType) - if submitter == nil { - continue - } - - b.wgProposing.Add(1) - go func(submitter Submitter, blockNum rpc.BlockNumber, load loadType) { - defer b.wgProposing.Done() - - msg, err := submitter(b.ctxSwitcher.Context(), b.cfg.Clock, b.cfg.CallerManager) - if err != nil { - b.cfg.Log.Error(string(load) + " failed submitting " + msg + ": " + err.Error()) - return - } - - b.blockMap.SetState(blockNum, sendingStateSent) - b.cfg.Log.Debug(string(load) + " " + msg) - }(submitter, blockNum, load) - } - } -} - -// close closes the block proposer -func (b *BlockProposer) close() { - b.ctxSwitcher.Cancel() - b.wgProposing.Wait() - b.cfg.CallerManager.Close() -} - -// proposedBlockRequest is a request to propose a block -func (b *BlockProposer) prepareProposedBlockReq(ctx context.Context, req *pb.ProposedBlockRequest) (*proposedBlockRequest, error) { - receivedTime := b.cfg.Clock.Now() - - blockNumber := b.blockNumberToProposeFor.Load() - if blockNumber == nil { - return nil, errors.New("failed to get block number to propose for") - } - - blockNumberToProposeFor := blockNumber.Uint64() - - switch { - case req.BlockNumber < blockNumberToProposeFor: - return nil, errors.WithMessage(errLowerBlockNumber, "proposed "+strconv.FormatUint(req.BlockNumber, 10)+", current "+strconv.FormatUint(blockNumberToProposeFor, 10)) - case req.BlockNumber > blockNumberToProposeFor: - return nil, errors.WithMessage(errHigherBlockNumber, "proposed "+strconv.FormatUint(req.BlockNumber, 10)+", current "+strconv.FormatUint(blockNumberToProposeFor, 10)) - } - - blockReward, ok := new(big.Int).SetString(req.BlockReward, 10) - if !ok || blockReward == nil { - return nil, errors.New("failed converting blockReward") - } - - blockRewardPtr := b.blockReward.Load() - if blockReward.Cmp(blockRewardPtr) != 1 { - return nil, errors.WithMessage(errLowerBlockReward, "blockReward("+req.BlockReward+") is lower than the one is in memory("+blockRewardPtr.String()+")") - } - - b.blockReward.Store(blockReward) - - if b.cfg.TxStore == nil || *b.cfg.TxStore == nil { - return nil, errors.New("tx store is not initialized") - } - - txStore := *b.cfg.TxStore - - unReverted := req.GetUnRevertedHashes() - unRevertedHashes := make([]common.Hash, len(unReverted)) - - for _, hash := range unReverted { - unRevertedHashes = append(unRevertedHashes, common.BytesToHash(hash)) - } - - payload := req.GetPayload() - - proposedBlockReq := newProposedBlockRequest() - proposedBlockReq.id = req.Id - proposedBlockReq.addr = req.ValidatorHttpAddress - proposedBlockReq.receivedTime = receivedTime - proposedBlockReq.method = req.Namespace + "_proposedBlock" - proposedBlockReq.args = proposedBlockArgs{ - MEVRelay: mevRelayID, - BlockNumber: rpc.BlockNumber(req.BlockNumber), - PrevBlockHash: common.HexToHash(req.PrevBlockHash), - BlockReward: blockReward, - GasLimit: req.GasLimit, - GasUsed: req.GasUsed, - Payload: make([]hexutil.Bytes, len(payload)), - UnRevertedHashes: unRevertedHashes, - } - - var ( - txStoreTx *types.BxTransaction - err error - ) - - for i, proposedBlockTx := range payload { - select { // check if context is done - case <-ctx.Done(): - return nil, ctx.Err() - default: - } - - if proposedBlockTx.GetShortId() == 0 { - proposedBlockReq.args.Payload[i] = proposedBlockTx.GetRawData() - continue - } - - if txStoreTx, err = txStore.GetTxByShortID(types.ShortID(proposedBlockTx.GetShortId()), false); err != nil { - return nil, errors.WithMessage(err, "failed decompressing tx") - } - - blockchainTx := new(ethtypes.Transaction) - - if err = blockchainTx.UnmarshalBinary(txStoreTx.Content()); err == nil { - proposedBlockReq.args.Payload[i] = hexutil.Bytes(txStoreTx.Content()) - continue - - } - - if blockchainTx, err = eth.TransactionBDNToBlockchain(txStoreTx); err != nil { - return nil, errors.WithMessage(err, "failed converting tx") - } - - if proposedBlockReq.args.Payload[i], err = blockchainTx.MarshalBinary(); err != nil { - return nil, errors.WithMessage(err, "failed serializing tx") - } - } - - proposedBlockReq.preparingDuration = b.cfg.Clock.Now().Sub(receivedTime) - - return proposedBlockReq, nil -} - -// submitProposedBlock submits the proposed block to the validator -func (b *BlockProposer) submitProposedBlock(ctx context.Context, req *proposedBlockRequest) (reply *pb.ProposedBlockReply, err error) { - if err = req.submit(ctx, b.cfg.Clock, b.cfg.CallerManager); err != nil { - b.cfg.Log.Error(err.Error()) - return - } - - reply = &pb.ProposedBlockReply{ValidatorReply: req.validatorReply, ValidatorReplyTime: req.validatorReplyTime} - return -} - -// processProposedBlock processes the proposed block -func (b *BlockProposer) processProposedBlock(ctx context.Context, req *proposedBlockRequest) (*pb.ProposedBlockReply, error) { - var ( - resp = "block updated in memory" - err error - created bool - ) - - created, err = b.blockMap.CreateOrUpdate(req.args.BlockNumber, req) - - switch { - case err != nil: - return nil, err - case created: - resp = "block added to memory" - } - - if _, err = b.cfg.CallerManager.AddClient(ctx, req.addr); err != nil { // init client if not exists - return nil, err - } - - return &pb.ProposedBlockReply{ValidatorReply: resp, ValidatorReplyTime: b.cfg.Clock.Now().UnixMilli()}, nil -} - -// Run starts the block proposer -// that proposes blocks to the validator -// provides short IDs for transactions to the builder -// and collects statistics about the proposed blocks -func (b *BlockProposer) Run(ctx context.Context) (err error) { - defer func() { - if err != nil { - b.cfg.Log.Warn("failed to start: " + err.Error()) - } - }() - - if err = b.requireIdle(); err != nil { - return - } - - if err = b.cfg.Validate(); err != nil { - return - } - - b.state.Store(ptr.New(services.StateBooting)) - - b.reset() - - b.wg.Add(1) - go func(ctx context.Context) { defer b.wg.Done(); b.runLoop(ctx) }(ctx) - - return -} - -// OnBlock receives a block from the blockchain or BDN -// and sends it into the block proposer for further processing -func (b *BlockProposer) OnBlock(ctx context.Context, chainBlock bsc.ChainBlock) (err error) { - defer func() { - if err != nil { - b.cfg.Log.Warn("handling OnBlock request failed: " + err.Error()) - } - }() - - if err = b.requireRunning(); err != nil { - return - } - - // check if context is done before creating a new block - select { - default: - err = errSendBlockToBlockProposer - case <-ctx.Done(): - err = ctx.Err() - case b.blockCh <- chainBlock: - } - - return -} - -// ShortIDs returns short IDs for the given transaction hashes that were sent from the builder -// so builder can use them to build a compressed block and submit it to the gateway -func (b *BlockProposer) ShortIDs(ctx context.Context, req *pb.ShortIDsRequest) (reply *pb.ShortIDsReply, err error) { - msg := "handling ShortIDs request txHashesLen(" + strconv.FormatInt(int64(len(req.TxHashes)), 10) + ")" - - defer func() { - if err != nil { - msg += " err(" + err.Error() + ")" - } - - b.cfg.Log.Debug(msg) - }() - - reply, err = bsc.ShortIDs(ctx, req, b.cfg.TxStore, b.cfg.Log) - - return -} - -// ProposedBlock receives a compressed block from the builder and sends it to the validator -// either immediately or after a processing comparison with the block that was previously sent -// and collects statistics about the proposed blocks -func (b *BlockProposer) ProposedBlock(ctx context.Context, req *pb.ProposedBlockRequest) (reply *pb.ProposedBlockReply, err error) { - msg := "handling ProposedBlock request blockNum(" + strconv.FormatUint(req.BlockNumber, 10) + ") ID(" + req.Id + ") blockReward(" + req.BlockReward + ") processBlocksOnGateway(" + strconv.FormatBool(req.ProcessBlocksOnGateway) + ")" - - defer func() { - if err != nil { - msg += " err(" + err.Error() + ")" - } - - b.cfg.Log.Debug(msg) - }() - - if err = b.requireRunning(); err != nil { - return - } - - var blockReq *proposedBlockRequest - - if blockReq, err = b.prepareProposedBlockReq(ctx, req); err != nil { - return - } - - if !req.ProcessBlocksOnGateway { - msg += " details(proxy) blockPreparingDuration(" + blockReq.preparingDuration.String() + ")" - - if reply, err = b.submitProposedBlock(ctx, blockReq); err != nil { - return - } - - msg += " validatorReply(" + reply.ValidatorReply + ") validatorReplyTime(" + time.UnixMilli(reply.ValidatorReplyTime).Format(bsc.BlockProposingDateFormat) + ")" - b.blockMap.SetState(blockReq.args.BlockNumber, sendingStateReplacedWithHigherReward) - - return - } - - reply, err = b.processProposedBlock(ctx, blockReq) - - return -} - -// ProposedBlockStats returns statistics about the proposed blocks -func (b *BlockProposer) ProposedBlockStats(ctx context.Context, req *pb.ProposedBlockStatsRequest) (reply *pb.ProposedBlockStatsReply, err error) { - msg := "handling ProposedBlockStats request blockNum(" + strconv.FormatUint(req.BlockNumber, 10) + ")" - - defer func() { - if err != nil { - msg += " err(" + err.Error() + ")" - } - - b.cfg.Log.Debug(msg) - }() - - if err = b.requireRunning(); err != nil { - return - } - - records := b.blockMap.Get(rpc.BlockNumber(req.BlockNumber)) - if records == nil { - err = errors.WithMessage(errBlockNotFound, "block number "+strconv.FormatUint(req.BlockNumber, 10)) - return - } - - if err = records.requireSent(); err != nil { - return - } - - replyRecords := make([]*pb.ProposedBlockStatsRecord, 0, records.len()) - - for i, record := range records.get() { // filter out records that were not sent or are nil - if record == nil || !record.isSent() { - continue - } - - replyRecords = append(replyRecords, &pb.ProposedBlockStatsRecord{ - Id: record.id, - SendingDuration: durationpb.New(record.sendingDuration), - ReceivedTime: timestamppb.New(record.receivedTime), - SentTime: timestamppb.New(record.sentTime), - ValidatorReply: record.validatorReply, - ValidatorReplyTime: record.validatorReplyTime, - }) - - msg += " record-" + strconv.FormatInt(int64(i), 10) + "(" + record.String() + ")" - } - - if len(replyRecords) == 0 { - err = errors.WithMessage(errBlockNotFound, "block number "+strconv.FormatUint(req.BlockNumber, 10)) - return - } - - // check if context is done before creating a new block - select { - default: - case <-ctx.Done(): - err = ctx.Err() - return - } - - reply = &pb.ProposedBlockStatsReply{Records: replyRecords} - - return -} diff --git a/blockchain/common/block.go b/blockchain/common/block.go index 2a0283b..f6239de 100644 --- a/blockchain/common/block.go +++ b/blockchain/common/block.go @@ -6,7 +6,7 @@ import ( // Block represents a wrapper around an ethereum execution layer block, providing additional functionality. // It is a copy of the original go-ethereum Block struct, with the addition of the sidecars field to support BSC. -// Currently used only by BSC or Polygon chains. +// Currently used only by BSC chain. type Block struct { ethTypes.Block diff --git a/blockchain/common/test/.!20003!bsc_blob_sidecars_len_1.rlp b/blockchain/common/test/.!20003!bsc_blob_sidecars_len_1.rlp new file mode 100644 index 0000000..e69de29 diff --git a/blockchain/common/test/.!20757!bsc_blob_sidecars_len_1.rlp b/blockchain/common/test/.!20757!bsc_blob_sidecars_len_1.rlp new file mode 100644 index 0000000..e69de29 diff --git a/blockchain/eth/converter.go b/blockchain/eth/converter.go index d5b9f5f..7c1513f 100644 --- a/blockchain/eth/converter.go +++ b/blockchain/eth/converter.go @@ -5,9 +5,6 @@ import ( "fmt" "math/big" - "github.com/bloXroute-Labs/gateway/v2/blockchain/beacon" - bxcommoneth "github.com/bloXroute-Labs/gateway/v2/blockchain/common" - "github.com/bloXroute-Labs/gateway/v2/types" ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" @@ -18,6 +15,11 @@ import ( "github.com/prysmaticlabs/prysm/v5/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/runtime/version" + + "github.com/bloXroute-Labs/gateway/v2/blockchain/bdn" + "github.com/bloXroute-Labs/gateway/v2/blockchain/beacon" + bxcommoneth "github.com/bloXroute-Labs/gateway/v2/blockchain/common" + "github.com/bloXroute-Labs/gateway/v2/types" ) type bxBlockRLP struct { @@ -113,6 +115,11 @@ func (c Converter) beaconBlockBlockchainToBDN(wrappedBlock beacon.WrappedReadOnl return nil, fmt.Errorf("could not copy block: %v", err) } + b, err := bdn.PbGenericBlock(block) + if err != nil { + return nil, fmt.Errorf("could not get generic block: %v", err) + } + header, err := block.Header() if err != nil { return nil, fmt.Errorf("could not get header: %v", err) @@ -137,33 +144,20 @@ func (c Converter) beaconBlockBlockchainToBDN(wrappedBlock beacon.WrappedReadOnl var bxBlockType types.BxBlockType switch block.Version() { case version.Phase0: - block, err := block.PbPhase0Block() - if err != nil { - return nil, fmt.Errorf("could not get phase 0 block %v: %v", beaconHash, err) - } - hash = beaconHash - concreteBlock = block + concreteBlock = b.GetPhase0() bxBlockType = types.BxBlockTypeBeaconPhase0 case version.Altair: - block, err := block.PbAltairBlock() - if err != nil { - return nil, fmt.Errorf("could not get altair block %v: %v", beaconHash, err) - } - hash = beaconHash - concreteBlock = block + concreteBlock = b.GetAltair() bxBlockType = types.BxBlockTypeBeaconAltair case version.Bellatrix: - block, err := block.PbBellatrixBlock() - if err != nil { - return nil, fmt.Errorf("could not get bellatrix block %v: %v", beaconHash, err) - } + blockBellatrix := b.GetBellatrix() - copy(hash[:], block.GetBlock().GetBody().GetExecutionPayload().GetBlockHash()) - number = block.GetBlock().GetBody().GetExecutionPayload().GetBlockNumber() + copy(hash[:], blockBellatrix.GetBlock().GetBody().GetExecutionPayload().GetBlockHash()) + number = blockBellatrix.GetBlock().GetBody().GetExecutionPayload().GetBlockNumber() - for i, tx := range block.GetBlock().GetBody().GetExecutionPayload().GetTransactions() { + for i, tx := range blockBellatrix.GetBlock().GetBody().GetExecutionPayload().GetTransactions() { t := new(ethtypes.Transaction) if err := t.UnmarshalBinary(tx); err != nil { return nil, fmt.Errorf("invalid transaction %d: %v", i, err) @@ -181,20 +175,17 @@ func (c Converter) beaconBlockBlockchainToBDN(wrappedBlock beacon.WrappedReadOnl compressedTx := types.NewBxBlockTransaction(txHash, txBytes) txs = append(txs, compressedTx) } - block.Block.Body.ExecutionPayload.Transactions = nil + blockBellatrix.Block.Body.ExecutionPayload.Transactions = nil - concreteBlock = block + concreteBlock = blockBellatrix bxBlockType = types.BxBlockTypeBeaconBellatrix case version.Capella: - b, err := block.PbCapellaBlock() - if err != nil { - return nil, fmt.Errorf("could not get capella block %v: %v", beaconHash, err) - } + blockCapella := b.GetCapella() - copy(hash[:], b.GetBlock().GetBody().GetExecutionPayload().GetBlockHash()) - number = b.GetBlock().GetBody().GetExecutionPayload().GetBlockNumber() + copy(hash[:], blockCapella.GetBlock().GetBody().GetExecutionPayload().GetBlockHash()) + number = blockCapella.GetBlock().GetBody().GetExecutionPayload().GetBlockNumber() - for i, tx := range b.GetBlock().GetBody().GetExecutionPayload().GetTransactions() { + for i, tx := range blockCapella.GetBlock().GetBody().GetExecutionPayload().GetTransactions() { t := new(ethtypes.Transaction) if err := t.UnmarshalBinary(tx); err != nil { return nil, fmt.Errorf("invalid transaction %d: %v", i, err) @@ -212,15 +203,18 @@ func (c Converter) beaconBlockBlockchainToBDN(wrappedBlock beacon.WrappedReadOnl compressedTx := types.NewBxBlockTransaction(txHash, txBytes) txs = append(txs, compressedTx) } - b.Block.Body.ExecutionPayload.Transactions = nil + blockCapella.Block.Body.ExecutionPayload.Transactions = nil - concreteBlock = b + concreteBlock = blockCapella bxBlockType = types.BxBlockTypeBeaconCapella case version.Deneb: - b, err := block.PbDenebBlock() - if err != nil { - return nil, fmt.Errorf("could not get deneb block %v: %v", beaconHash, err) + blockDeneb := b.GetDeneb() + if blockDeneb == nil { + return nil, bdn.ErrNotDenebBlock } + + b := blockDeneb.GetBlock() + copy(hash[:], b.GetBlock().GetBody().GetExecutionPayload().GetBlockHash()) number = b.GetBlock().GetBody().GetExecutionPayload().GetBlockNumber() diff --git a/blockchain/eth/converter_test.go b/blockchain/eth/converter_test.go index a8af618..5746bb1 100644 --- a/blockchain/eth/converter_test.go +++ b/blockchain/eth/converter_test.go @@ -5,15 +5,17 @@ import ( "math/big" "testing" - "github.com/bloXroute-Labs/gateway/v2/blockchain/beacon" - bxethcommon "github.com/bloXroute-Labs/gateway/v2/blockchain/common" - "github.com/bloXroute-Labs/gateway/v2/test/bxmock" - "github.com/bloXroute-Labs/gateway/v2/types" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rlp" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" "github.com/stretchr/testify/require" + + "github.com/bloXroute-Labs/gateway/v2/blockchain/bdn" + "github.com/bloXroute-Labs/gateway/v2/blockchain/beacon" + bxethcommon "github.com/bloXroute-Labs/gateway/v2/blockchain/common" + "github.com/bloXroute-Labs/gateway/v2/test/bxmock" + "github.com/bloXroute-Labs/gateway/v2/types" ) var ( @@ -148,13 +150,18 @@ func TestConverter_DenebBeaconBlock(t *testing.T) { blockchainBlock, err := c.BlockBDNtoBlockchain(bxBlock) require.NoError(t, err) - denebBlock, err := blockchainBlock.(interfaces.ReadOnlySignedBeaconBlock).PbDenebBlock() + genericBlock, err := bdn.PbGenericBlock(blockchainBlock.(interfaces.ReadOnlySignedBeaconBlock)) require.NoError(t, err) + denebBlock := genericBlock.GetDeneb() + require.NotNil(t, denebBlock) + + signedBlock := denebBlock.GetBlock() + // Check beacon BxBlock transactions exactly same as eth block for i, tx := range block.Transactions() { blockTx := new(ethtypes.Transaction) - err = blockTx.UnmarshalBinary(denebBlock.GetBlock().GetBody().GetExecutionPayload().GetTransactions()[i]) + err = blockTx.UnmarshalBinary(signedBlock.GetBlock().GetBody().GetExecutionPayload().GetTransactions()[i]) require.NoError(t, err) require.Equal(t, blockTx.Hash(), tx.Hash()) @@ -170,7 +177,7 @@ func TestConverter_DenebBeaconBlock(t *testing.T) { require.NoError(t, err) tx := new(ethtypes.Transaction) - err = tx.UnmarshalBinary(denebBlock.GetBlock().GetBody().GetExecutionPayload().GetTransactions()[i]) + err = tx.UnmarshalBinary(signedBlock.GetBlock().GetBody().GetExecutionPayload().GetTransactions()[i]) require.NoError(t, err) require.Equal(t, notificationTx.Hash(), tx.Hash()) diff --git a/blockchain/eth/peer.go b/blockchain/eth/peer.go index cde1e59..ea5cf21 100644 --- a/blockchain/eth/peer.go +++ b/blockchain/eth/peer.go @@ -10,6 +10,12 @@ import ( "sync" "time" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/protocols/eth" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rlp" + "github.com/bloXroute-Labs/gateway/v2" bxcommoneth "github.com/bloXroute-Labs/gateway/v2/blockchain/common" "github.com/bloXroute-Labs/gateway/v2/blockchain/network" @@ -17,11 +23,6 @@ import ( "github.com/bloXroute-Labs/gateway/v2/types" "github.com/bloXroute-Labs/gateway/v2/utils" "github.com/bloXroute-Labs/gateway/v2/utils/syncmap" - "github.com/ethereum/go-ethereum/common" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/eth/protocols/eth" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/rlp" ) // UpgradeStatusMsg is a message overloaded in eth/66 @@ -336,9 +337,7 @@ func (ep *Peer) Handshake(version uint32, networkChain uint64, td *big.Int, head // for ethereum override the TD and the Head as get from the peer // Nethermind checks reject connections which brings old value - // New: If polygon sees old head it sends header request for it and of course it fails. This causes gateway to be disconnected - switch networkChain { - case network.EthMainnetChainID, network.PolygonMainnetChainID, network.PolygonMumbaiChainID: + if networkChain == network.EthMainnetChainID { td = peerStatus.TD head = peerStatus.Head } @@ -563,10 +562,11 @@ func (ep *Peer) NotifyResponse(requestID uint64, packet eth.Packet) (bool, error // UpdateHead sets the latest confirmed block on the peer. This may release or prune queued blocks on the peer connection. func (ep *Peer) UpdateHead(height uint64, hash common.Hash) { - ep.Log().Debugf("confirming new head (height=%v, hash=%v)", height, hash) - ep.newHeadCh <- blockRef{ - height: height, - hash: hash, + ep.Log().Debugf("confirming new head (height=%v, hash=%v), newHeadCh len %v", height, hash, len(ep.newHeadCh)) + select { + case ep.newHeadCh <- blockRef{height: height, hash: hash}: + default: + ep.Log().Errorf("newHeadCh channel is full(height=%v, hash=%v), dropping new head update", height, hash) } } diff --git a/blockchain/eth/protocol.go b/blockchain/eth/protocol.go index bb664e3..cff73d1 100644 --- a/blockchain/eth/protocol.go +++ b/blockchain/eth/protocol.go @@ -6,15 +6,16 @@ import ( "sync" "time" - "github.com/bloXroute-Labs/gateway/v2/blockchain" - bxcommoneth "github.com/bloXroute-Labs/gateway/v2/blockchain/common" - "github.com/bloXroute-Labs/gateway/v2/blockchain/network" - log "github.com/bloXroute-Labs/gateway/v2/logger" "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth/protocols/eth" "github.com/ethereum/go-ethereum/p2p" "github.com/ethereum/go-ethereum/p2p/enode" + + "github.com/bloXroute-Labs/gateway/v2/blockchain" + bxcommoneth "github.com/bloXroute-Labs/gateway/v2/blockchain/common" + "github.com/bloXroute-Labs/gateway/v2/blockchain/network" + log "github.com/bloXroute-Labs/gateway/v2/logger" ) // ETH66, ETH67 are the protocols that dropped by go-ethereum which still should be supported @@ -99,12 +100,10 @@ func (*NewPooledTransactionHashesPacket66) Kind() byte { return eth.NewPooledTra // supportedProtocols is the map of networks to devp2p protocols supported by this client var supportedProtocols = map[uint64][]uint{ - network.BSCMainnetChainID: {eth.ETH68}, - network.BSCTestnetChainID: {eth.ETH68}, - network.PolygonMainnetChainID: {ETH67, eth.ETH68}, - network.PolygonMumbaiChainID: {ETH67, eth.ETH68}, - network.EthMainnetChainID: {ETH66, ETH67, eth.ETH68}, - network.HoleskyChainID: {ETH67, eth.ETH68}, + network.BSCMainnetChainID: {eth.ETH68}, + network.BSCTestnetChainID: {eth.ETH68}, + network.EthMainnetChainID: {ETH66, ETH67, eth.ETH68}, + network.HoleskyChainID: {ETH67, eth.ETH68}, } // protocolLengths is a mapping of each supported devp2p protocol to its message version length diff --git a/blockchain/network/preset.go b/blockchain/network/preset.go index 6ba9fa4..3fd4721 100644 --- a/blockchain/network/preset.go +++ b/blockchain/network/preset.go @@ -21,22 +21,14 @@ const BSCMainnetChainID = 56 // BSCTestnetChainID BSC testnet chain ID const BSCTestnetChainID = 97 -// PolygonMainnetChainID Polygon mainnet chain ID -const PolygonMainnetChainID = 137 - -// PolygonMumbaiChainID Polygon testnet chain ID -const PolygonMumbaiChainID = 80001 - // HoleskyChainID Holesky testnet chain ID const HoleskyChainID = 17000 var networkMapping = map[string]EthConfig{ - "Mainnet": newEthereumMainnetConfig(), - "BSC-Mainnet": newBSCMainnetConfig(), - "BSC-Testnet": newBSCTestnetConfig(), - "Polygon-Mainnet": newPolygonMainnetConfig(), - "Polygon-Mumbai": newPolygonMumbaiConfig(), - "Holesky": newHoleskyConfig(), + "Mainnet": newEthereumMainnetConfig(), + "BSC-Mainnet": newBSCMainnetConfig(), + "BSC-Testnet": newBSCTestnetConfig(), + "Holesky": newHoleskyConfig(), } // NewEthereumPreset returns an Ethereum configuration for the given network name. For most of these presets, the client will present itself as only having the genesis block, but that shouldn't matter too much. @@ -154,65 +146,6 @@ func newBSCTestnetConfig() EthConfig { } } -func newPolygonMumbaiConfig() EthConfig { - td, ok := new(big.Int).SetString("40000", 16) - if !ok { - panic("could not load Polygon Mumbai configuration") - } - - var err error - var bootNodes []*enode.Node - - bootNodes, err = bootstrapNodes(enode.ValidSchemes, []string{ - "enode://bdcd4786a616a853b8a041f53496d853c68d99d54ff305615cd91c03cd56895e0a7f6e9f35dbf89131044e2114a9a782b792b5661e3aff07faf125a98606a071@43.200.206.40:30303", - "enode://209aaf7ed549cf4a5700fd833da25413f80a1248bd3aa7fe2a87203e3f7b236dd729579e5c8df61c97bf508281bae4969d6de76a7393bcbd04a0af70270333b3@54.216.248.9:30303", - }) - - if err != nil { - panic("could not set Polygon Mumbai bootstrapNodes") - } - - return EthConfig{ - Network: PolygonMumbaiChainID, - TotalDifficulty: td, - TerminalTotalDifficulty: big.NewInt(math.MaxInt), - Head: common.HexToHash("0x7b66506a9ebdbf30d32b43c5f15a3b1216269a1ec3a75aa3182b86176a2b1ca7"), - Genesis: common.HexToHash("0x7b66506a9ebdbf30d32b43c5f15a3b1216269a1ec3a75aa3182b86176a2b1ca7"), - IgnoreBlockTimeout: 30 * time.Second, - BootstrapNodes: bootNodes, - ProgramName: "bor/v0.2.16-stable-f083705e/linux-amd64/go1.18.4", - } -} - -func newPolygonMainnetConfig() EthConfig { - td, ok := new(big.Int).SetString("40000", 16) - if !ok { - panic("could not load Polygon Mainnet configuration") - } - - var err error - var bootNodes []*enode.Node - - bootNodes, err = bootstrapNodes(enode.ValidSchemes, []string{ - "enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303", - "enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303", - }) - if err != nil { - panic("could not set Polygon Mainnet bootstrapNodes") - } - - return EthConfig{ - Network: 137, - TotalDifficulty: td, - TerminalTotalDifficulty: big.NewInt(math.MaxInt), - Head: common.HexToHash("0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b"), - Genesis: common.HexToHash("0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b"), - IgnoreBlockTimeout: 30 * time.Second, - BootstrapNodes: bootNodes, - ProgramName: "bor/v0.2.16-stable-f083705e/linux-amd64/go1.18.4", - } -} - func newHoleskyConfig() EthConfig { td, ok := new(big.Int).SetString("1", 16) if !ok { diff --git a/blockchain/polygon/bor/bor.go b/blockchain/polygon/bor/bor.go deleted file mode 100644 index 58181b4..0000000 --- a/blockchain/polygon/bor/bor.go +++ /dev/null @@ -1,111 +0,0 @@ -// Package bor is a monkey patching of helper methods from https://github.com/maticnetwork/bor -// in the future we probably would move to use bor as a package directly -// but for the moment no need to have it as a requirement whole package. -package bor - -import ( - "fmt" - "io" - "math/big" - - "golang.org/x/crypto/sha3" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/rlp" -) - -const extraSeal = 65 // fixed number of extra-data suffix bytes reserved for signer seal - -type runState uint8 - -const ( - stateIdle = runState(iota) - stateBooting - stateRunning -) - -// Ecrecover extracts the Ethereum account address from a signed header. -func Ecrecover(header *types.Header) (common.Address, error) { - // Retrieve the signature from the header extra-data - if len(header.Extra) < extraSeal { - // block's extra-data section doesn't seem to contain a 65 byte secp256k1 signature. - return common.Address{}, fmt.Errorf("extra-data too short: %d < %d", len(header.Extra), extraSeal) - } - - signature := header.Extra[len(header.Extra)-extraSeal:] - - sealed, err := SealHash(header) - if err != nil { - return common.Address{}, fmt.Errorf("failed to seal header hash: %w", err) - } - - // Recover the public key and the Ethereum address - pubKey, err := crypto.Ecrecover(sealed.Bytes(), signature) - if err != nil { - return common.Address{}, fmt.Errorf("failed to recover public key from signature: %w", err) - } - - var signer common.Address - - copy(signer[:], crypto.Keccak256(pubKey[1:])[12:]) - - return signer, nil -} - -// SealHash returns the hash of a block prior to it being sealed. -func SealHash(header *types.Header) (hash common.Hash, err error) { - hasher := sha3.NewLegacyKeccak256() - if err = encodeSigHeader(hasher, header); err != nil { - return common.Hash{}, err - } - - hasher.Sum(hash[:0]) - - return hash, nil -} - -func encodeSigHeader(w io.Writer, header *types.Header) error { - enc := []interface{}{ - header.ParentHash, - header.UncleHash, - header.Coinbase, - header.Root, - header.TxHash, - header.ReceiptHash, - header.Bloom, - header.Difficulty, - header.Number, - header.GasLimit, - header.GasUsed, - header.Time, - header.Extra[:len(header.Extra)-65], // Yes, this will panic if extra is too short - header.MixDigest, - header.Nonce, - } - - if IsJaipur(header.Number) { - if header.BaseFee != nil { - enc = append(enc, header.BaseFee) - } - } - - return rlp.Encode(w, enc) -} - -// isForked returns whether a fork scheduled at block s is active at the given head block. -func isForked(s, head *big.Int) bool { - if s == nil || head == nil { - return false - } - return s.Cmp(head) <= 0 -} - -// IsJaipur returns whether a fork scheduled at mainnet jaipur block is active at the given head block. -func IsJaipur(number *big.Int) bool { - return isForked( - big.NewInt(23850000), // mainnet jaipur block - number, - ) -} diff --git a/blockchain/polygon/bor/retry.go b/blockchain/polygon/bor/retry.go deleted file mode 100644 index e8078cd..0000000 --- a/blockchain/polygon/bor/retry.go +++ /dev/null @@ -1,18 +0,0 @@ -package bor - -import ( - "time" - - "github.com/cenkalti/backoff/v4" -) - -const ( - maxRetries = 10 - - backoffInterval = 100 * time.Millisecond -) - -// Retry returns preconfigured backoff instance. -func Retry() backoff.BackOff { - return backoff.WithMaxRetries(backoff.NewConstantBackOff(backoffInterval), maxRetries) -} diff --git a/blockchain/polygon/bor/snapshot.go b/blockchain/polygon/bor/snapshot.go deleted file mode 100644 index f99942b..0000000 --- a/blockchain/polygon/bor/snapshot.go +++ /dev/null @@ -1,149 +0,0 @@ -package bor - -import ( - "encoding/json" - "fmt" - - "github.com/ethereum/go-ethereum/common" - - "github.com/bloXroute-Labs/gateway/v2" - "github.com/bloXroute-Labs/gateway/v2/blockchain" - "github.com/bloXroute-Labs/gateway/v2/blockchain/polygon/bor/valset" -) - -const methodGetSnapshot = "bor_getSnapshot" - -// Snapshot bor snapshot info -type Snapshot struct { - Number uint64 `json:"number"` // Block number where the snapshot was created - Hash common.Hash `json:"hash"` // Block hash where the snapshot was created - ValidatorSet *valset.ValidatorSet `json:"validatorSet"` // Validator set at this moment - Recents map[uint64]common.Address `json:"recents"` // Set of recent signers for spam protections -} - -// copy creates a deep copy of the snapshot, though not the individual votes. -func (s *Snapshot) copy() *Snapshot { - snapshot := &Snapshot{ - Number: s.Number, - Hash: s.Hash, - ValidatorSet: s.ValidatorSet.Copy(), - Recents: make(map[uint64]common.Address), - } - for block, signer := range s.Recents { - snapshot.Recents[block] = signer - } - - return snapshot -} - -// IncrementSprint changes state of Snapshot to the state on the start of next sprint -func (s *Snapshot) IncrementSprint(currentSpan *SpanInfo, nextSpan *SpanInfo) (*Snapshot, error) { - snap := s.copy() - sprintStart := SprintStart(snap.Number) - signer := snap.ValidatorSet.GetProposer().Address - - snap.Number = sprintStart + SprintSize - snap.Recents = make(map[uint64]common.Address, SprintSize) - - for i := sprintStart + 1; i < snap.Number; i++ { - snap.Recents[i] = signer - } - - var newVals []*valset.Validator - - if snap.Number > currentSpan.EndBlock { - newVals = nextSpan.SelectedProducers - } else { - newVals = snap.ValidatorSet.Validators - } - - var err error - - snap.ValidatorSet, err = snap.nextSprintValidatorSet(newVals) - if err != nil { - return nil, err - } - - return snap, nil -} - -func (s *Snapshot) nextSprintValidatorSet(newVals []*valset.Validator) (*valset.ValidatorSet, error) { - validatorSet, err := getUpdatedValidatorSet(s.ValidatorSet.Copy(), newVals) - if err != nil { - return nil, err - } - - validatorSet.IncrementProposerPriority(1) - - return validatorSet, nil -} - -func validatorContains(a []*valset.Validator, x *valset.Validator) (*valset.Validator, bool) { - for _, n := range a { - if n.Address == x.Address { - return n, true - } - } - - return nil, false -} - -func getUpdatedValidatorSet(oldValidatorSet *valset.ValidatorSet, newVals []*valset.Validator) (*valset.ValidatorSet, error) { - v := oldValidatorSet - oldVals := v.Validators - - changes := make([]*valset.Validator, 0, len(oldVals)) - - for _, ov := range oldVals { - if f, ok := validatorContains(newVals, ov); ok { - ov.VotingPower = f.VotingPower - } else { - ov.VotingPower = 0 - } - - changes = append(changes, ov) - } - - for _, nv := range newVals { - if _, ok := validatorContains(changes, nv); !ok { - changes = append(changes, nv) - } - } - - if err := v.UpdateWithChangeSet(changes); err != nil { - return nil, err - } - - return v, nil -} - -// GetLatestSnapshot returns latest Snapshot. -func GetLatestSnapshot(provider blockchain.WSProvider) (*Snapshot, error) { - return GetSnapshot(provider, "latest") -} - -// GetSnapshot perform call to RPC. -func GetSnapshot(provider blockchain.WSProvider, payload ...any) (*Snapshot, error) { - resp, err := provider.CallRPC(methodGetSnapshot, - payload, - blockchain.RPCOptions{ - RetryAttempts: bxgateway.MaxEthOnBlockCallRetries, - RetryInterval: bxgateway.EthOnBlockCallRetrySleepInterval, - }) - if err != nil { - return nil, fmt.Errorf("failed to call rpc: %w", err) - } - - marshal, err := json.Marshal(resp) - if err != nil { - return nil, fmt.Errorf("failed to marshal response to bytes: %w", err) - } - - snapshot := new(Snapshot) - - if err = json.Unmarshal(marshal, snapshot); err != nil { - return nil, fmt.Errorf("failed to unmarshal response to snapshot: %w", err) - } - - return snapshot, nil -} diff --git a/blockchain/polygon/bor/span.go b/blockchain/polygon/bor/span.go deleted file mode 100644 index 17bbdc6..0000000 --- a/blockchain/polygon/bor/span.go +++ /dev/null @@ -1,348 +0,0 @@ -package bor - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "strings" - "sync" - "time" - - "github.com/cenkalti/backoff/v4" - "go.uber.org/atomic" - - "github.com/bloXroute-Labs/gateway/v2/blockchain/polygon/bor/valset" - log "github.com/bloXroute-Labs/gateway/v2/logger" - cs "github.com/bloXroute-Labs/gateway/v2/utils/cycledslice" - "github.com/bloXroute-Labs/gateway/v2/utils/orderedmap" - "github.com/bloXroute-Labs/gateway/v2/utils/ptr" -) - -const ( - endpointLatestSpanFmt = "%s/bor/latest-span" - endpointSpanIDFmt = "%s/bor/span/%d" - - // SpanSize size of Heimdall span - SpanSize = 100 * SprintSizeHeimdall -) - -var ( - errCorruptedSpanMap = errors.New("span map corrupted or uninitialized") - errBadHeimdallEndpoint = errors.New("bad heimdall endpoint") -) - -// SpanInfo basic info about span -type SpanInfo struct { - SelectedProducers []*valset.Validator `json:"selected_producers"` - - StartBlock uint64 `json:"start_block"` - EndBlock uint64 `json:"end_block"` - SpanID uint64 `json:"span_id"` - - defaultDifficulty uint64 -} - -// Difficulty returns default span difficulty. -func (i *SpanInfo) Difficulty() uint64 { - if i.defaultDifficulty == 0 { - i.defaultDifficulty = uint64(len(i.SelectedProducers)) - } - - return i.defaultDifficulty -} - -type spanResponse struct { - Result *SpanInfo `json:"result"` -} - -// Spanner interface for processing span requests. -type Spanner interface { - Run() error - GetCurrentSpan() (*SpanInfo, error) - GetLatestSpan() (*SpanInfo, error) - GetSpanByID(spanID uint64) (*SpanInfo, error) - GetSpanForHeight(height uint64) (*SpanInfo, error) - GetSpanNotificationCh() <-chan struct{} - SendSpanNotification() -} - -// HeimdallSpanner basic client for processing heimdall spans. -type HeimdallSpanner struct { - ctx context.Context - - mx *sync.RWMutex - - state *atomic.Pointer[runState] - - httpClient *http.Client - - spanMap *orderedmap.OrderedMap[uint64, *SpanInfo] - - spanUpdateCh chan *SpanInfo - spanNotifyCh chan struct{} - - endpoints *cs.CycledSlice[string] -} - -// NewHeimdallSpanner creates a new HeimdallSpanner. -func NewHeimdallSpanner(ctx context.Context, endpointsArg string) *HeimdallSpanner { - return &HeimdallSpanner{ - ctx: ctx, - - mx: new(sync.RWMutex), - - state: atomic.NewPointer(ptr.New(stateIdle)), - - httpClient: new(http.Client), - - spanMap: orderedmap.New[uint64, *SpanInfo](), - - spanUpdateCh: make(chan *SpanInfo, 2), - spanNotifyCh: make(chan struct{}, 1), - - endpoints: cs.NewCycledSlice(strings.Split(strings.TrimSuffix(endpointsArg, "/"), ",")), - } -} - -// GetSpanNotificationCh returns notification channel. -func (h *HeimdallSpanner) GetSpanNotificationCh() <-chan struct{} { return h.spanNotifyCh } - -// SendSpanNotification sends notification to the channel. -func (h *HeimdallSpanner) SendSpanNotification() { - select { - default: - case h.spanNotifyCh <- struct{}{}: - } -} - -func (h *HeimdallSpanner) bootstrap() error { - err := h.ctx.Err() - if err != nil { - return err - } - - latestSpan, err := h.GetLatestSpan() - if err != nil { - return err - } - - currentSpan, err := h.GetSpanByID(latestSpan.SpanID - 1) - if err != nil { - return err - } - - h.spanMap.Store(currentSpan.SpanID, currentSpan) - h.spanMap.Store(latestSpan.SpanID, latestSpan) - - return nil -} - -// Run bootstrap initial state and start goroutine for processing of changes. -func (h *HeimdallSpanner) Run() error { - if *h.state.Load() != stateIdle { - return nil - } - - h.state.Store(ptr.New(stateBooting)) - - log.Debugf("heimdall spanner bootstrapping") - if err := h.bootstrap(); err != nil { - h.state.Store(ptr.New(stateIdle)) - - return fmt.Errorf("failed to bootstrap heimdall spanner: %w", err) - } - - h.state.Store(ptr.New(stateRunning)) - - log.Debugf("heimdall spanner successful bootstrapped") - go func() { - backOff := backoff.WithContext(Retry(), h.ctx) - - for { - select { - case <-h.ctx.Done(): - h.state.Store(ptr.New(stateIdle)) - - return - case spanInfo := <-h.spanUpdateCh: - backOff.Reset() - if err := backoff.RetryNotify( - func() error { return h.updateSpanMap(spanInfo) }, - backOff, - func(err error, duration time.Duration) { - log.Tracef("failed to update span: %v, retry in %s", err, duration.String()) - }, - ); err != nil { - log.Warnf("failed to update span: %v", err) - } - } - } - }() - - return nil -} - -func (h *HeimdallSpanner) updateSpanMap(spanInfo *SpanInfo) error { - h.mx.RLock() - _, exists := h.spanMap.Get(spanInfo.SpanID) - h.mx.RUnlock() - - if exists { - return nil - } - - h.mx.Lock() - defer h.mx.Unlock() - - // cleanup of span map - for pair := h.spanMap.Oldest(); pair != nil; pair = pair.Next() { - if pair.Key+2 <= spanInfo.SpanID { - h.spanMap.Delete(pair.Key) - } - } - - defer h.SendSpanNotification() - - // adding of new value - h.spanMap.Store(spanInfo.SpanID, spanInfo) - - prevNewest := h.spanMap.Oldest() - if prevNewest == nil || prevNewest.Key <= spanInfo.SpanID { - return nil - } - - if err := h.spanMap.MoveAfter(prevNewest.Key, spanInfo.SpanID); err != nil { - return fmt.Errorf("failed to sort spans: %w", err) - } - - return nil -} - -// GetCurrentSpan returns current cpan. -func (h *HeimdallSpanner) GetCurrentSpan() (*SpanInfo, error) { - if h.spanMap.Len() != 2 { - return nil, errCorruptedSpanMap - } - - return h.spanMap.Oldest().Value, nil -} - -// GetLatestSpan returns latest cpan. -func (h *HeimdallSpanner) GetLatestSpan() (*SpanInfo, error) { - err := h.ctx.Err() - if err != nil { - return nil, err - } - - return h.requestSpanFromEndpoint(fmt.Sprintf(endpointLatestSpanFmt, h.endpoints.Current())) -} - -// GetSpanByID returns cpan by ID. -func (h *HeimdallSpanner) GetSpanByID(spanID uint64) (*SpanInfo, error) { - err := h.ctx.Err() - if err != nil { - return nil, err - } - - h.mx.RLock() - spanInfo, exists := h.spanMap.Get(spanID) - h.mx.RUnlock() - - if exists { - spanCopy := *spanInfo - - return &spanCopy, nil - } - - return h.requestSpanFromEndpoint(fmt.Sprintf(endpointSpanIDFmt, h.endpoints.Current(), spanID)) -} - -func (h *HeimdallSpanner) requestSpanFromEndpoint(endpoint string) (*SpanInfo, error) { - req, err := http.NewRequestWithContext(h.ctx, http.MethodGet, endpoint, nil) - if err != nil { - return nil, fmt.Errorf("failed to create request for fetching of span by id: %w", err) - } - - span, err := h.doSpanRequest(req) - if err != nil { - log.Warnf("failed to request span from endpoint %s, trying next...", h.endpoints.Current()) - h.endpoints.Next() - return nil, err - } - return span, nil -} - -func (h *HeimdallSpanner) doSpanRequest(req *http.Request) (*SpanInfo, error) { - if h.endpoints == nil { - return nil, errBadHeimdallEndpoint - } - - backOff := backoff.WithContext(Retry(), h.ctx) - - resp, err := backoff.RetryNotifyWithData( - func() (*http.Response, error) { return h.httpClient.Do(req) }, - backOff, - func(err error, duration time.Duration) { - log.Tracef("failed to fetch span: %v, retry in %s", err, duration.String()) - }, - ) - if err != nil { - return nil, fmt.Errorf("failed to fetch span: %w", err) - } - - defer func() { _ = resp.Body.Close() }() - - bytes, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) - } - - spanResp := new(spanResponse) - - if err = json.Unmarshal(bytes, spanResp); err != nil { - return nil, fmt.Errorf("failed to unmarshal response body: %w", err) - } - - if spanResp == nil || spanResp.Result == nil { - return nil, fmt.Errorf("invalid span response: %s", string(bytes)) - } - - // make difficulty cached - spanResp.Result.Difficulty() - - currentSpan, err := h.GetCurrentSpan() - if currentSpan == nil || err != nil || currentSpan.SpanID+2 <= spanResp.Result.SpanID { - spanInfoCopy := *spanResp.Result - - h.spanUpdateCh <- &spanInfoCopy - } - - return spanResp.Result, nil -} - -// GetSpanForHeight returns span for height. -func (h *HeimdallSpanner) GetSpanForHeight(height uint64) (*SpanInfo, error) { - return h.GetSpanByID(GetSpanIDByHeight(height)) -} - -// GetSpanIDByHeight returns span id for height. -func GetSpanIDByHeight(height uint64) uint64 { - if height < 256 { - return 1 - } - - return ((height - 256) / SpanSize) + 1 -} - -// SpanStart helper which returns the closest span start for provided blockHeight. -func SpanStart(height uint64) uint64 { - return ((GetSpanIDByHeight(height) - 1) * SpanSize) + 256 -} - -// IsSpanStart helper which indicates if provided blockHeight is start of span. -func IsSpanStart(height uint64) bool { - return (height-256)%SpanSize == 0 -} diff --git a/blockchain/polygon/bor/span_test.go b/blockchain/polygon/bor/span_test.go deleted file mode 100644 index 9268d68..0000000 --- a/blockchain/polygon/bor/span_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package bor - -import ( - "context" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestHeimdallSpannerGetLatestSpan(t *testing.T) { - t.Skip("Local check only.") - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - spanner := NewHeimdallSpanner(ctx, "http://0.0.0.0:1317") - - start := time.Now() - latestSpan, err := spanner.GetLatestSpan() - t.Log("LatestSpan:", time.Since(start).String()) - require.NoError(t, err) - require.NotNil(t, latestSpan) - - start = time.Now() - span, err := spanner.GetSpanByID(latestSpan.SpanID - 1) - t.Log("CurrentSpan:", time.Since(start).String()) - require.NoError(t, err) - require.NotNil(t, latestSpan) - - require.Equal(t, latestSpan.StartBlock-1, span.EndBlock) - - cancel() - - latestSpan, err = spanner.GetLatestSpan() - require.ErrorIs(t, err, context.Canceled) - require.Nil(t, latestSpan) - - span, err = spanner.GetSpanByID(1) - require.ErrorIs(t, err, context.Canceled) - require.Nil(t, span) -} - -func TestGetSpanIdByHeight(t *testing.T) { - const ( - mainTargetSpanID uint64 = 6145 - startSpanHeight uint64 = 39321856 - endSpanHeight uint64 = 39328255 - ) - - var resolvedSpanID uint64 - - height := startSpanHeight - 1 - targetSpanID := mainTargetSpanID - 1 - - resolvedSpanID = GetSpanIDByHeight(height) - assert.Equalf(t, targetSpanID, resolvedSpanID, "expected: %d, actual: %d, height: %d", targetSpanID, resolvedSpanID, height) - - height = startSpanHeight - targetSpanID = mainTargetSpanID - - resolvedSpanID = GetSpanIDByHeight(height) - assert.Equalf(t, targetSpanID, resolvedSpanID, "expected: %d, actual: %d, height: %d", targetSpanID, resolvedSpanID, height) - - height = endSpanHeight + 1 - targetSpanID = mainTargetSpanID + 1 - - resolvedSpanID = GetSpanIDByHeight(height) - assert.Equalf(t, targetSpanID, resolvedSpanID, "expected: %d, actual: %d, height: %d", targetSpanID, resolvedSpanID, height) -} - -func TestSpanStart(t *testing.T) { - const ( - startBlock uint64 = 39321856 - endBlock uint64 = 39341055 - ) - - spanStarts := map[uint64]uint64{ - 6145: 39321856, - 6146: 39328256, - 6147: 39334656, - } - - for height := startBlock; height <= endBlock; height++ { - spanStart := spanStarts[GetSpanIDByHeight(height)] - recoveredSpanStart := SpanStart(height) - - require.Equal(t, spanStart, recoveredSpanStart, "expected: %d, actual: %d, height: %d", spanStart, recoveredSpanStart, height) - } -} diff --git a/blockchain/polygon/bor/sprint.go b/blockchain/polygon/bor/sprint.go deleted file mode 100644 index 97d7828..0000000 --- a/blockchain/polygon/bor/sprint.go +++ /dev/null @@ -1,318 +0,0 @@ -package bor - -import ( - "context" - "errors" - "fmt" - "strings" - "sync" - "time" - - "github.com/cenkalti/backoff/v4" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "go.uber.org/atomic" - - "github.com/bloXroute-Labs/gateway/v2/blockchain" - log "github.com/bloXroute-Labs/gateway/v2/logger" - "github.com/bloXroute-Labs/gateway/v2/types" - "github.com/bloXroute-Labs/gateway/v2/utils/ptr" -) - -const ( - // SprintSize represent size of sprint for polygon bor module - SprintSize = uint64(16) - - // SprintSizeHeimdall represent size of sprint for polygon heimdall module - SprintSizeHeimdall = SprintSize * 4 - - // average sprint time - heimdallNextEndpointInterval = 2 * 16 * time.Second - - // interval for updating sprint map - heimdallUpdateSprintInterval = time.Hour -) - -var ( - // ErrWSManagerNotInitialized is the error for ws manager is not initialized - ErrWSManagerNotInitialized = errors.New("ws manager is not initialized") - - // ErrNoOpenProviders is the error for no open providers - ErrNoOpenProviders = errors.New("no open providers") -) - -// SprintManager basic client for processing bor sprints. -type SprintManager struct { - ctx context.Context - - mx *sync.RWMutex - - state *atomic.Pointer[runState] - - // pointer to the interface to make it managed externally - wsManager *blockchain.WSManager - - spanner Spanner - - sprintMap map[uint64]string -} - -// NewSprintManager creates a new SprintManager. -func NewSprintManager(ctx context.Context, wsManager *blockchain.WSManager, spanner Spanner) *SprintManager { - return &SprintManager{ - ctx: ctx, - spanner: spanner, - wsManager: wsManager, - - mx: new(sync.RWMutex), - - state: atomic.NewPointer(ptr.New(stateIdle)), - - sprintMap: make(map[uint64]string), - } -} - -func (m *SprintManager) bootstrap() error { - err := m.ctx.Err() - if err != nil { - return err - } - - backOff := backoff.WithContext(Retry(), m.ctx) - - if err = backoff.Retry(m.spanner.Run, backOff); err != nil { - return err - } - - backOff.Reset() - if err = backoff.Retry(m.updateSprintMapFromLatest, backOff); err != nil { - return err - } - - return nil -} - -func (m *SprintManager) updateSprintMapFromLatest() error { - snapshot, err := m.getLatestSnapshot() - if err != nil { - return fmt.Errorf("failed to query blockchain node for snapshot: %w", err) - } - - currentSpan, err := m.spanner.GetSpanForHeight(snapshot.Number) - if err != nil { - return err - } - - nextSpan, err := m.spanner.GetSpanByID(currentSpan.SpanID + 1) - if err != nil { - return err - } - - sprintMap, err := getSprintValidatorsMap(currentSpan, nextSpan, snapshot) - if err != nil { - return fmt.Errorf("failed to generate sprint validators map: %w", err) - } - - m.mx.Lock() - m.sprintMap = sprintMap - m.mx.Unlock() - - return nil -} - -func getSprintValidatorsMap(currentSpan *SpanInfo, nextSpan *SpanInfo, snapshot *Snapshot) (map[uint64]string, error) { - var err error - - sprintMap := make(map[uint64]string) - - sprintMap[snapshot.Number/SprintSize] = strings.ToLower(snapshot.ValidatorSet.GetProposer().Address.String()) - - for snapshot.Number+SprintSize < nextSpan.EndBlock { - snapshot, err = snapshot.IncrementSprint(currentSpan, nextSpan) - if err != nil { - return nil, err - } - - sprintMap[snapshot.Number/SprintSize] = strings.ToLower(snapshot.ValidatorSet.GetProposer().Address.String()) - } - - return sprintMap, nil -} - -func (m *SprintManager) getLatestSnapshot() (*Snapshot, error) { - if m.wsManager == nil { - return nil, ErrWSManagerNotInitialized - } - - for _, wsProvider := range (*m.wsManager).Providers() { - if !wsProvider.IsOpen() { - continue - } - - snapshot, err := GetLatestSnapshot(wsProvider) - if err != nil { - wsProvider.Log().Tracef("Failed to fetch snapshot by height: %v", err) - - continue - } - - return snapshot, nil - } - - return nil, ErrNoOpenProviders -} - -// Run bootstrap initial state and start goroutine for processing of changes. -func (m *SprintManager) Run() error { - if *m.state.Load() != stateIdle { - return nil - } - - m.state.Store(ptr.New(stateBooting)) - log.Debugf("sprint manager bootstrapping") - if err := m.bootstrap(); err != nil { - m.state.Store(ptr.New(stateIdle)) - - return fmt.Errorf("failed to bootstrap sprint manager: %w", err) - } - - // cleanup span notification channel after bootstrap - select { - default: - case <-m.spanner.GetSpanNotificationCh(): - } - - m.state.Store(ptr.New(stateRunning)) - log.Debugf("sprint manager successful bootstrapped") - go func() { - for { - select { - case <-m.ctx.Done(): - m.state.Store(ptr.New(stateIdle)) - - return - case <-m.spanner.GetSpanNotificationCh(): - log.Debugf("processing span notification") - if err := m.updateSprintMapFromLatest(); err != nil { - log.Warnf("failed to update validators for the latest span: %v", err) - time.Sleep(heimdallNextEndpointInterval) - m.spanner.SendSpanNotification() - } else { - log.Info("successfully updated validators for the latest span") - } - } - } - }() - - go func() { - for { - if *m.state.Load() == stateRunning { - m.spanner.SendSpanNotification() - } - time.Sleep(heimdallUpdateSprintInterval) - } - }() - - return nil -} - -// IsRunning returns current state of SprintManager. -func (m *SprintManager) IsRunning() bool { return *m.state.Load() == stateRunning } - -// FutureValidators returns next n+2 producers of block. -func (m *SprintManager) FutureValidators(header *ethtypes.Header) [2]*types.FutureValidatorInfo { - height := header.Number.Uint64() - - signer, err := Ecrecover(header) - if err != nil { - log.WithField("blockHeight", height).Warnf("failed to recover signer from header: %v", err) - - return emptyFutureValidatorInfo(height) - } - - validatorInfo := StaticFutureValidatorInfo(height, strings.ToLower(signer.String())) - - var ( - validator string - exists bool - ) - - m.mx.RLock() - validator, exists = m.sprintMap[SprintNum(header.Number.Uint64())] - m.mx.RUnlock() - - if exists && validator != strings.ToLower(signer.String()) { - spanInfo, err := m.spanner.GetSpanByID(GetSpanIDByHeight(header.Number.Uint64())) - if err != nil { - log.WithField("blockHeight", height).Warnf("failed to get span info: %v", err) - - return validatorInfo - } - - if header.Difficulty.Uint64() == spanInfo.Difficulty() { - log.Debugf("invalid future validator prediction detected: predicted(%s) actual(%s)", validator, strings.ToLower(signer.String())) - - m.spanner.SendSpanNotification() - - return validatorInfo - } - } - - if validatorInfo[1].WalletID != "nil" { - return validatorInfo - } - - m.mx.RLock() - for i, info := range validatorInfo { - if validator, exists = m.sprintMap[SprintNum(info.BlockHeight)]; exists { - validatorInfo[i].WalletID = validator - } - } - m.mx.RUnlock() - - return validatorInfo -} - -// StaticFutureValidatorInfo that can be recovered from block header. -func StaticFutureValidatorInfo(height uint64, producer string) [2]*types.FutureValidatorInfo { - if IsSprintStart(height + 1) { - return emptyFutureValidatorInfo(height) - } - - if SprintStart(height+2) <= height { - return [2]*types.FutureValidatorInfo{ - {BlockHeight: height + 1, WalletID: producer}, - {BlockHeight: height + 2, WalletID: producer}, - } - } - - if IsSprintStart(height + 2) { - return [2]*types.FutureValidatorInfo{ - {BlockHeight: height + 1, WalletID: producer}, - {BlockHeight: height + 2, WalletID: "nil"}, - } - } - - return emptyFutureValidatorInfo(height) -} - -func emptyFutureValidatorInfo(height uint64) [2]*types.FutureValidatorInfo { - return [2]*types.FutureValidatorInfo{ - {BlockHeight: height + 1, WalletID: "nil"}, - {BlockHeight: height + 2, WalletID: "nil"}, - } -} - -// SprintNum helper which returns sprint number for provided blockHeight. -func SprintNum(blockHeight uint64) uint64 { - return blockHeight / SprintSize -} - -// SprintStart helper which returns the closest sprint start for provided blockHeight. -func SprintStart(blockHeight uint64) uint64 { - return blockHeight / SprintSize * SprintSize -} - -// IsSprintStart helper which indicates if provided blockHeight is start of sprint. -func IsSprintStart(blockHeight uint64) bool { - return blockHeight%SprintSize == 0 -} diff --git a/blockchain/polygon/bor/sprint_test.go b/blockchain/polygon/bor/sprint_test.go deleted file mode 100644 index 37e38b3..0000000 --- a/blockchain/polygon/bor/sprint_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package bor - -import ( - "encoding/json" - "os" - "testing" - - "github.com/stretchr/testify/require" -) - -type WSResp[T any] struct { - Result T `json:"result"` -} - -type SprinterPayloadDTO struct { - Current WSResp[*SpanInfo] - Next WSResp[*SpanInfo] - Snapshot WSResp[*Snapshot] -} - -func newSprinterPayloadDTO(t require.TestingT, currentSpanPath, nextSpanPath, snapshotPath string) *SprinterPayloadDTO { - sprinterPayloadDTO := new(SprinterPayloadDTO) - - data, err := os.ReadFile(currentSpanPath) - require.NoError(t, err) - require.NoError(t, json.Unmarshal(data, &sprinterPayloadDTO.Current)) - - data, err = os.ReadFile(nextSpanPath) - require.NoError(t, err) - require.NoError(t, json.Unmarshal(data, &sprinterPayloadDTO.Next)) - - data, err = os.ReadFile(snapshotPath) - require.NoError(t, err) - require.NoError(t, json.Unmarshal(data, &sprinterPayloadDTO.Snapshot)) - - return sprinterPayloadDTO -} - -func Benchmark_getSprintValidatorsMap(b *testing.B) { - sprinterPayload := newSprinterPayloadDTO( - b, - "./testdata/span_6145.json", - "./testdata/span_6146.json", - "./testdata/snap_39321856.json", - ) - - for n := 0; n < b.N; n++ { - _, _ = getSprintValidatorsMap( - sprinterPayload.Current.Result, - sprinterPayload.Next.Result, - sprinterPayload.Snapshot.Result, - ) - } -} - -func BenchmarkSnapshot_IncrementSprint(b *testing.B) { - sprinterPayload := newSprinterPayloadDTO( - b, - "./testdata/span_6145.json", - "./testdata/span_6146.json", - "./testdata/snap_39321856.json", - ) - - for n := 0; n < b.N; n++ { - _, _ = sprinterPayload.Snapshot.Result.IncrementSprint( - sprinterPayload.Current.Result, - sprinterPayload.Next.Result, - ) - } -} diff --git a/blockchain/polygon/bor/testdata/snap_39321856.json b/blockchain/polygon/bor/testdata/snap_39321856.json deleted file mode 100644 index 4d066b9..0000000 --- a/blockchain/polygon/bor/testdata/snap_39321856.json +++ /dev/null @@ -1,216 +0,0 @@ -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "number": 39321856, - "hash": "0x61b8b757c568f0523515f7d32dd7093519a0bb5748ffa443d906be7412158ac0", - "validatorSet": { - "validators": [ - { - "ID": 0, - "signer": "0x02f70172f7f490653665c9bfac0666147c8af1f5", - "power": 1, - "accum": -41 - }, - { - "ID": 0, - "signer": "0x09385a960a2e0b6b4516d341534da92cb2a50085", - "power": 2, - "accum": -40 - }, - { - "ID": 0, - "signer": "0x1efecb61a2f80aa34d3b9218b564a64d05946290", - "power": 3, - "accum": 25 - }, - { - "ID": 0, - "signer": "0x26c80cc193b27d73d2c40943acec77f4da2c5bd8", - "power": 4, - "accum": -5 - }, - { - "ID": 0, - "signer": "0x30dd252c7c150f26a3a06e4eada9e706db3fa58c", - "power": 1, - "accum": -41 - }, - { - "ID": 0, - "signer": "0x40314efbc35bc0db441969bce451bf0167efded1", - "power": 1, - "accum": 42 - }, - { - "ID": 0, - "signer": "0x46a3a41bd932244dd08186e4c19f1a7e48cbcdf4", - "power": 2, - "accum": -40 - }, - { - "ID": 0, - "signer": "0x60e274b09f701107a4b3226fcc1376ebda3cdd92", - "power": 1, - "accum": -41 - }, - { - "ID": 0, - "signer": "0x67b94473d81d0cd00849d563c94d0432ac988b49", - "power": 7, - "accum": 32 - }, - { - "ID": 0, - "signer": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "power": 4, - "accum": 30 - }, - { - "ID": 0, - "signer": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "power": 4, - "accum": 16 - }, - { - "ID": 0, - "signer": "0x8e9700392f9246a6c5b32ee3ecef586f156ed683", - "power": 1, - "accum": -41 - }, - { - "ID": 0, - "signer": "0x9ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0", - "power": 5, - "accum": 30 - }, - { - "ID": 0, - "signer": "0xb9ede6f94d192073d8eaf85f8db677133d483249", - "power": 1, - "accum": 34 - }, - { - "ID": 0, - "signer": "0xbdbd4347b082d9d6bdf2da4555a37ce52a2e2120", - "power": 2, - "accum": 23 - }, - { - "ID": 0, - "signer": "0xe63727cb2b3a8d6e3a2d1df4990f441938b67a34", - "power": 1, - "accum": -41 - }, - { - "ID": 0, - "signer": "0xe7e2cb8c81c10ff191a73fe266788c9ce62ec754", - "power": 1, - "accum": 15 - }, - { - "ID": 0, - "signer": "0xeb4f2a75cac4bbcb4d71c252e4cc80eb80bb3a34", - "power": 1, - "accum": -41 - }, - { - "ID": 0, - "signer": "0xec20607aa654d823dd01beb8780a44863c57ed07", - "power": 3, - "accum": 16 - }, - { - "ID": 0, - "signer": "0xeedba2484aaf940f37cd3cd21a5d7c4a7dafbfc0", - "power": 2, - "accum": 27 - }, - { - "ID": 0, - "signer": "0xef46d5fe753c988606e6f703260d816af53b03eb", - "power": 1, - "accum": 14 - }, - { - "ID": 0, - "signer": "0xf0245f6251bef9447a08766b9da2b07b28ad80b0", - "power": 2, - "accum": 32 - } - ], - "proposer": { - "ID": 0, - "signer": "0x26c80cc193b27d73d2c40943acec77f4da2c5bd8", - "power": 4, - "accum": -5 - } - }, - "recents": { - "38188992": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38188993": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38188994": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38188995": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38188996": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38188997": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38188998": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38188999": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189000": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189001": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189002": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189003": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189004": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189005": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189006": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189007": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189008": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189009": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189010": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189011": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189012": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189013": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189014": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189015": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189016": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189017": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189018": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189019": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189020": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189021": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189022": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189023": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189024": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189025": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189026": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189027": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189028": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189029": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189030": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189031": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189032": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189033": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189034": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189035": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189036": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189037": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189038": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "38189039": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "39321841": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321842": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321843": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321844": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321845": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321846": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321847": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321848": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321849": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321850": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321851": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321852": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321853": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321854": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321855": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "39321856": "0x26c80cc193b27d73d2c40943acec77f4da2c5bd8" - } - } -} diff --git a/blockchain/polygon/bor/testdata/span_6145.json b/blockchain/polygon/bor/testdata/span_6145.json deleted file mode 100644 index a6e4533..0000000 --- a/blockchain/polygon/bor/testdata/span_6145.json +++ /dev/null @@ -1,1551 +0,0 @@ -{ - "height": "12844075", - "result": { - "span_id": 6145, - "start_block": 39321856, - "end_block": 39328255, - "validator_set": { - "validators": [ - { - "ID": 127, - "startEpoch": 12530, - "endEpoch": 0, - "nonce": 2689, - "power": 35562604, - "pubKey": "0x04a6f3c7bb0c6cacdb5a50a95dc03dbdf254ff0eb9b3fcad2a30e0d9ab36defd61d003e29ec310a94b18d5c794ab8b7037da184c966a0aa8e4d503b881437c01e7", - "signer": "0x00856730088a5c3191bd26eb482e45229555ce57", - "last_updated": "1661635600249", - "jailed": false, - "accum": -1027692219 - }, - { - "ID": 136, - "startEpoch": 19269, - "endEpoch": 0, - "nonce": 535, - "power": 5225013, - "pubKey": "0x04fe434b14886b67fbada360f68f6a2ce1484d68e4fde20ff56a39a54d6c561e72c9f9a604685746faad3ef4ea0402cac903f192041d0726b650571553b99e14e6", - "signer": "0x00b69ba135b496b7f17fdfcd50d48b86bb397be6", - "last_updated": "1662527400131", - "jailed": false, - "accum": 457430406 - }, - { - "ID": 132, - "startEpoch": 16217, - "endEpoch": 0, - "nonce": 739, - "power": 9581907, - "pubKey": "0x04841b0cba6c27f4e77bd8a7105f0f0a85e158cccc39487158257d84879c2a6c57c3d8f30be8bc1e3383e6d329db0d9321d6f151b4689c71edb2128c32f43730da", - "signer": "0x0208652a93baf5f1962849efcf5795eac7439a5e", - "last_updated": "1662931200083", - "jailed": false, - "accum": 735367791 - }, - { - "ID": 32, - "startEpoch": 5313, - "endEpoch": 0, - "nonce": 1567, - "power": 13391696, - "pubKey": "0x04d1228cce225214fc1c36c5ac76f6f9e2394de97bee956197f632ebf406469ffe218193ac7425d9b827b1bf6928ba5967043c7e88e09f7ba5f6a45599a115eec2", - "signer": "0x02f70172f7f490653665c9bfac0666147c8af1f5", - "last_updated": "1663134000286", - "jailed": false, - "accum": 744135454 - }, - { - "ID": 111, - "startEpoch": 11293, - "endEpoch": 0, - "nonce": 379, - "power": 807023, - "pubKey": "0x0407ad4b275b9e9c73c27639e4679c560d473aae0c7fc11b88ffb0d74b9dbb9d9550da8eda54b3a5de8ecdb42c1b6a4757ddfe2277adf03f2e00a7ed7ca0bf97b8", - "signer": "0x0306b7d3095ab008927166cd648a8ca7dbe53f05", - "last_updated": "1663247300138", - "jailed": false, - "accum": 344751516 - }, - { - "ID": 63, - "startEpoch": 7525, - "endEpoch": 0, - "nonce": 130, - "power": 5613457, - "pubKey": "0x04088437a36ee99d2b71955ccf2e1c9ffb32f6edbf206f27cfee1027ae55f9961e2c4eb6c179b88c237db58cc109cc97e10d0114be2aaa232c1e922ce2e16b4ded", - "signer": "0x055bd801ca712b4ddf67db8bc23fb6c8510d52b9", - "last_updated": "1660485900054", - "jailed": false, - "accum": -1646375210 - }, - { - "ID": 125, - "startEpoch": 12242, - "endEpoch": 0, - "nonce": 1438, - "power": 4194034, - "pubKey": "0x04754537eec61d12cd31906c804ce25cf926291974eeb38d638584a0bb6f4cbb36c9c3ff649b32d3aa36a62d01ac2becd243a0dad7f1026397338b3a0e33093842", - "signer": "0x06abe41e26db44ad94fe61db2ce56023347bcf0c", - "last_updated": "1663238000062", - "jailed": false, - "accum": 78832490 - }, - { - "ID": 141, - "startEpoch": 35390, - "endEpoch": 0, - "nonce": 50, - "power": 48310609, - "pubKey": "0x048940a918da7be89d91610753c288312a0c5ac67bf3754c9dc4bbfcc8e50a19a18fa899b0b2d4085c6e33d7637f4afad74769864c4fc32f116ec3e9f2c6448952", - "signer": "0x09385a960a2e0b6b4516d341534da92cb2a50085", - "last_updated": "1648561300077", - "jailed": false, - "accum": -1244037719 - }, - { - "ID": 66, - "startEpoch": 7949, - "endEpoch": 0, - "nonce": 315, - "power": 893639, - "pubKey": "0x040166a0206026cf08ba57b2dfe8acdda167b0ab9698021088cbecffc1eade4e204ae455d56ad03916484bdcf44be81155628e466e58fa70afa99dd823b92151f7", - "signer": "0x0f145e3b90e88fceb55ed5bd6cf0b9adfc2223e9", - "last_updated": "1661426100133", - "jailed": false, - "accum": -839313837 - }, - { - "ID": 37, - "startEpoch": 5763, - "endEpoch": 0, - "nonce": 1655, - "power": 222752799, - "pubKey": "0x046996fd88565bd0d4e2bc5162e822bb4fd76126e641d5a240cff1074411f217c6d6503ea7616f10297ce7646c1794cd5ddbc1eaf5b4130f26c43c9c34feb5ee0f", - "signer": "0x127685d6dd6683085da4b6a041efcef1681e5c9c", - "last_updated": "1663244600055", - "jailed": false, - "accum": 1180409037 - }, - { - "ID": 114, - "startEpoch": 11404, - "endEpoch": 0, - "nonce": 527, - "power": 1094788, - "pubKey": "0x044fa9ace6016c6543ec37a6324790633db2d5757fbd02cb784bc15978dc6a1fbcb1b907a2cab94b271d1e58c96ee8432d58fcf9f2fa71f69e5c4216d830b35eb3", - "signer": "0x13a9d78f4712a65678d7735682819b4f4f74253c", - "last_updated": "1662217900041", - "jailed": false, - "accum": 758980922 - }, - { - "ID": 131, - "startEpoch": 16036, - "endEpoch": 0, - "nonce": 976, - "power": 6556335, - "pubKey": "0x04cb7728536d97b5cd3d6442133a9f4867959941b6161db8caf732298181892d184e4e4a95e126d59e9d9838aceac5c43e73d15cdd6cbda04e819697f0e2e15adc", - "signer": "0x160cdef60e786295728a6ea334c091238e474e01", - "last_updated": "1660517600016", - "jailed": false, - "accum": 1648727150 - }, - { - "ID": 55, - "startEpoch": 6878, - "endEpoch": 0, - "nonce": 32, - "power": 5018710, - "pubKey": "0x04ca36a3591de0fe7ced56e611c067bb16eb4038cfc81aa77eaaa101b7753231a3d3bca30a36200a0954703c4a77871c5ca6d73b616e010a639664cbdd412b3816", - "signer": "0x18f371aeee4e2636df789931c9cd43e5d7b72d66", - "last_updated": "1662200200109", - "jailed": false, - "accum": -522006565 - }, - { - "ID": 13, - "startEpoch": 3773, - "endEpoch": 0, - "nonce": 4770, - "power": 27529970, - "pubKey": "0x04bcb9741052a1b818d1c2410b975f5edf7e3a64cabb9f73cad6e8819dad7b1039697bcbd6bf69d9dd5b9d335194b36d1f9fbad329a18bffd6c5e9ec6b7cefd580", - "signer": "0x1ca971963bdb4ba2bf337c90660674acff5beb3f", - "last_updated": "1662206900176", - "jailed": false, - "accum": -1456741410 - }, - { - "ID": 36, - "startEpoch": 5596, - "endEpoch": 0, - "nonce": 1040, - "power": 3852946, - "pubKey": "0x04b656d36d057c0c1a6ae8128099088f4e641b9c5d055554642f96bcd690a2dd74b849363296f5b309cd8351380056cefacc7318a1f810559685eaa4699474bc0d", - "signer": "0x1d25c827abd466387bda00b429fe728627d6eee6", - "last_updated": "1663264400317", - "jailed": false, - "accum": 221498970 - }, - { - "ID": 87, - "startEpoch": 9509, - "endEpoch": 0, - "nonce": 921, - "power": 142795347, - "pubKey": "0x0404a438fa6b5033aa83847d283aedc67ca862c4183b837b664489e38f141d9fe92aaee18976acbcbbbaa137ecd350a9fe5b37bb851156f2a077500b5e742ca3ec", - "signer": "0x1efecb61a2f80aa34d3b9218b564a64d05946290", - "last_updated": "1662953100026", - "jailed": false, - "accum": -726233040 - }, - { - "ID": 92, - "startEpoch": 9991, - "endEpoch": 0, - "nonce": 74, - "power": 116102343, - "pubKey": "0x04877af9e5e26bca4f9063d4baf2803a491fad3219865d9d5fbda6edea5e1c1b4272d4f4704ee167b77091498d6eb8442ef8ab6c2b5a02722b15e0e5ab0ca27a00", - "signer": "0x26c80cc193b27d73d2c40943acec77f4da2c5bd8", - "last_updated": "1633048600271", - "jailed": false, - "accum": 1329300867 - }, - { - "ID": 28, - "startEpoch": 5212, - "endEpoch": 0, - "nonce": 891, - "power": 7575264, - "pubKey": "0x04b24d50f05b6e709a93ba13d67484c750e13fb2eba74cd87a373ea21908be274232c703cc30bd66263202a745cfb4f207d5466872abb89f4f75e966d10e4a8bf7", - "signer": "0x28c0d4328520ed7e8657de141eee74a954b07c1f", - "last_updated": "1662687800175", - "jailed": false, - "accum": 406494778 - }, - { - "ID": 75, - "startEpoch": 8322, - "endEpoch": 0, - "nonce": 362, - "power": 14252372, - "pubKey": "0x0441bda7846a4bf03d50ba81e7f082cfb736534e5db7213c10cee08b6e4e12c5460fd10ffe213f599ffa372879e0803240c95dc225f7074bae3c0cf4828d3290fb", - "signer": "0x2c74ca71679cf1299936d6104d825c965448907b", - "last_updated": "1662674700396", - "jailed": false, - "accum": 1350722227 - }, - { - "ID": 45, - "startEpoch": 6295, - "endEpoch": 0, - "nonce": 332, - "power": 933590, - "pubKey": "0x0439a3232e18c22876b20fc1c5fef1b2ce82d5393e7e592622aa271471c6ae0366e69879bcc1c2c19dba0c1b1b7a33bae48ddda6e5d130afb687dd2e6f258d2802", - "signer": "0x30523527aced0ed2f5ce1721086d1d282d3af38f", - "last_updated": "1660988800027", - "jailed": false, - "accum": 850333302 - }, - { - "ID": 64, - "startEpoch": 7791, - "endEpoch": 0, - "nonce": 393, - "power": 15789757, - "pubKey": "0x0434f30e5ed1fbc44c7b41b0134c886097c2ed98d17141ac40e0796a7c4ec93c0c1eceec4160192bcb75997f57f4a2783343883450421ac750f360aba5ac826cb5", - "signer": "0x30dd252c7c150f26a3a06e4eada9e706db3fa58c", - "last_updated": "1660974100018", - "jailed": false, - "accum": -396549075 - }, - { - "ID": 59, - "startEpoch": 7090, - "endEpoch": 0, - "nonce": 269, - "power": 1574537, - "pubKey": "0x047411c3fb72ba4d9d1422c08cf8a565b573352a9e94aeadb0c05bc279ec63c9522a6f7a115b33ce921332d3601a88f735c23239d047b7960ad078d51373d64696", - "signer": "0x3296233d946fb9399ff8bb87215eb312902d6224", - "last_updated": "1660439200093", - "jailed": false, - "accum": 588073844 - }, - { - "ID": 105, - "startEpoch": 10762, - "endEpoch": 0, - "nonce": 859, - "power": 1401924, - "pubKey": "0x047ccefa8460faea3a81b4ce41be62c29ea1cfc1a8fda2b3e4eb634a3c0a8da104a4c916fe0612ba2ae22e3ec9b8521efaaffcda7b05afa4826bd36242ece756cc", - "signer": "0x3a9df5dfcb4cc102ce20d40434a2b1baca9eafd3", - "last_updated": "1662274600078", - "jailed": false, - "accum": 947890952 - }, - { - "ID": 135, - "startEpoch": 17168, - "endEpoch": 0, - "nonce": 605, - "power": 6350401, - "pubKey": "0x04aae35f24c0c10be6892bfd3f0b5f5756b944acbdf3f20e16093829b632b06e166ed8bb9884a1f6fdbf7a8f4f655a69030eed02b61dd44f1b828eadd1cab6d70e", - "signer": "0x3aeb7722c208c8f35fef5ec4f2ebf887beb59360", - "last_updated": "1663109700183", - "jailed": false, - "accum": 1879333523 - }, - { - "ID": 38, - "startEpoch": 5812, - "endEpoch": 0, - "nonce": 423, - "power": 65583613, - "pubKey": "0x046d2b9e512879af19be7fc0e2f886a8206d9e396a423d00b3af9009afe2be783d5fde36984c966fe2ec51c7d7572d6f49faee5a73d3d4d9a9e2382b5d8adc8b5b", - "signer": "0x40314efbc35bc0db441969bce451bf0167efded1", - "last_updated": "1658978400079", - "jailed": false, - "accum": 1331701096 - }, - { - "ID": 62, - "startEpoch": 7414, - "endEpoch": 0, - "nonce": 445, - "power": 1408610, - "pubKey": "0x047ad53f370481eb0babe5439180af6942cb6272d3fe2989696a7f630c11752f9209a5714fced679f6981b5a70048f1e7ae05cebafb4df9c63271ac2aaa933a3df", - "signer": "0x406c3fef5969b36231bd573adfc34e16f54d23e0", - "last_updated": "1663275000032", - "jailed": false, - "accum": -931429580 - }, - { - "ID": 73, - "startEpoch": 8291, - "endEpoch": 0, - "nonce": 615, - "power": 15007048, - "pubKey": "0x0445c2815f01217c3e7e730304196f7d72c440387addbf2fb743728e2fbfa6ad585fb2c4d996b3556597f2a845613e9a469caa65934a55c41ca9d982cb9b7075f1", - "signer": "0x414b4b5a2a0e303b89360eda83598ab7702eae04", - "last_updated": "1663275000036", - "jailed": false, - "accum": 177513310 - }, - { - "ID": 40, - "startEpoch": 5889, - "endEpoch": 0, - "nonce": 984, - "power": 2736373, - "pubKey": "0x04fe0e75276f667c335d798e4c11de8a0cb938b41e91d4f184fa11f2cb09845edb5bdc914f4da87db1511ef6ff90727142a6acc3d55d963350962c322879584eaa", - "signer": "0x43c7c14d94197a30a44dab27bfb3eee9e05496d4", - "last_updated": "1663247300142", - "jailed": false, - "accum": -954537906 - }, - { - "ID": 68, - "startEpoch": 8100, - "endEpoch": 0, - "nonce": 98, - "power": 8075050, - "pubKey": "0x04bbd4f850e6ce8ce5069a4bedc8526f482201511ad8dcdecb408916d20e27d92197b28dc91e151f7300125f258f557b8ffc1d2acaf914b258afc0f38873190bb3", - "signer": "0x43cd17fa4c21440d71d34061f9a6aa9f99093049", - "last_updated": "1626624200247", - "jailed": false, - "accum": -360594941 - }, - { - "ID": 20, - "startEpoch": 4384, - "endEpoch": 0, - "nonce": 317, - "power": 10075367, - "pubKey": "0x0420f2d4e8ca210f9976821d94fe9f57410a3800fd54010726c74336a702f7261716186e1f834e247a3ab095aa96af7c3663652ea4c42ae85eea27c2be29cb0970", - "signer": "0x448aa1665fe1fae6d1a00a9209ea62d7dcd81a4b", - "last_updated": "1662671000080", - "jailed": false, - "accum": -1221767838 - }, - { - "ID": 93, - "startEpoch": 9992, - "endEpoch": 0, - "nonce": 143, - "power": 132604614, - "pubKey": "0x04af2b42565d5c22d1353e23936bf32fd0642d2a2c567d866135d2e547fc4679524a2306141bc214c96893ef6c6d312fd5bc3654abbbf3b74ac96180f0c2efab90", - "signer": "0x46a3a41bd932244dd08186e4c19f1a7e48cbcdf4", - "last_updated": "1663080800101", - "jailed": false, - "accum": 2013862711 - }, - { - "ID": 31, - "startEpoch": 5284, - "endEpoch": 0, - "nonce": 506, - "power": 5032071, - "pubKey": "0x04cc7a0adaa5d58b8b9aff67696f52e59541a0d208c22f56097f92522e9e4da98b7dedf2924cbb69e922414bbc090f4e28f6b42a310e96abcef80539a95dba9503", - "signer": "0x48aff66a7a9ce3b8fc4f62c80604bc310edf94cd", - "last_updated": "1662887400293", - "jailed": false, - "accum": -812484289 - }, - { - "ID": 29, - "startEpoch": 5250, - "endEpoch": 0, - "nonce": 643, - "power": 171769, - "pubKey": "0x04c74de15a4e622b0d47958034da5f8376f8f3c36a77fb807e2b6533b9b9445af8c1d9d7271e0e2d1d9e1f1e2976851241452517cd25658a438fad8b908412865e", - "signer": "0x4923de87853e95751a87eafe957a88a564387dac", - "last_updated": "1660044600132", - "jailed": false, - "accum": 1614406950 - }, - { - "ID": 99, - "startEpoch": 10293, - "endEpoch": 0, - "nonce": 203, - "power": 1126270, - "pubKey": "0x043b3772b13e1a2f9d979ebbe62baa8cf9519b1cc7df1342bc52c8486eadadbfe3fe045dcca4871435e2f557bf78ea70adc99b4e933fb7934725ac1f18b81d00db", - "signer": "0x4cb65428d672e5c6932678043887d62da78c9841", - "last_updated": "1663273900108", - "jailed": false, - "accum": 1015981318 - }, - { - "ID": 82, - "startEpoch": 8843, - "endEpoch": 0, - "nonce": 660, - "power": 993383, - "pubKey": "0x0408a8eb34eccba507e5aa16e783e3fd3bc4b70b1d10a8cb3d31674a1b00bfa7968514c584520a8575a4afb4bb25bc10baa97639f1be380dbf3eace482da579258", - "signer": "0x4df34fac8313dcd3442064b90e22129ad82b5103", - "last_updated": "1663098400095", - "jailed": false, - "accum": 167562533 - }, - { - "ID": 107, - "startEpoch": 10844, - "endEpoch": 0, - "nonce": 802, - "power": 2848538, - "pubKey": "0x0499b870beda52248490b5e9ba7c83ffeecff962c49df117389f58ff43fc1412d7d721f0308d1ff0c5b4c401b1e9f873c370277c8cfdd345a38fe426d0feed1eeb", - "signer": "0x55cc129dad4df3771a37770c6c0a469ff51918c8", - "last_updated": "1662552900029", - "jailed": false, - "accum": -1449229470 - }, - { - "ID": 76, - "startEpoch": 8425, - "endEpoch": 0, - "nonce": 588, - "power": 2918688, - "pubKey": "0x047b7d5e1a2291fe1f8f0a8490bcc45c3b77ab9b827925f207373be89b1de47df6bfb2aa5689f0d9a8a2cabeeb90518241e4da39ebe89668d3d4ce56985e5ae808", - "signer": "0x5627fe906f34a53a381a726dbbfff03f65ebcfb5", - "last_updated": "1662399000087", - "jailed": false, - "accum": -1752338561 - }, - { - "ID": 1, - "startEpoch": 0, - "endEpoch": 0, - "nonce": 5328, - "power": 1621831, - "pubKey": "0x043c53ea6e1964e0670dc9ac72b3224207885d4c5f08cabe1e1080c662fdec278e7e833798757cb5cf121447dcd02a15f010eb4aa87cceecb23daa4bf904112e77", - "signer": "0x5973918275c01f50555d44e92c9d9b353cadad54", - "last_updated": "1655746800381", - "jailed": false, - "accum": 1099792062 - }, - { - "ID": 126, - "startEpoch": 12527, - "endEpoch": 0, - "nonce": 524, - "power": 24836625, - "pubKey": "0x049d73839b66cfdecd2ecce0dfaefca77e9ee3a795ad51c752974c24385f904bd51746e04b4c0bdb47469f24bf9a0ba8c89011b65833850f0e589a08ceaf185fb2", - "signer": "0x5b106f49f30620a07b4fbdcebb1e08b70499c851", - "last_updated": "1658982600406", - "jailed": false, - "accum": 1020758622 - }, - { - "ID": 109, - "startEpoch": 10955, - "endEpoch": 0, - "nonce": 979, - "power": 7786835, - "pubKey": "0x04e048dae89bb4235dd4216a54a46312427db9cffb82959f48cba797f04605ee8c47cd9025ae7099cb6bc80deea1bea207a26d4b4ec8ef5c0cd2ed3671acd5ff7f", - "signer": "0x5fe93ddf4490a02257bef079f2498650c97c44de", - "last_updated": "1663216600039", - "jailed": false, - "accum": 1753204556 - }, - { - "ID": 118, - "startEpoch": 11448, - "endEpoch": 0, - "nonce": 1034, - "power": 1961016, - "pubKey": "0x04f5598cea9e86d4cb880e2b9a92cc2935047a717b923caa946cb030c82c30af6adc76ac6f7559b2ae069ad5d4ef7aa7ad2d2a9649baef37ba3967f210bf906495", - "signer": "0x5ffd4effd8e476c72fddc75bcd31f421001f9ce6", - "last_updated": "1662855100148", - "jailed": false, - "accum": 893422653 - }, - { - "ID": 50, - "startEpoch": 6374, - "endEpoch": 0, - "nonce": 90, - "power": 21370243, - "pubKey": "0x045498aeb04c83d70578cfb7d7c6b002c0c5b114261f710457fb17e23033de406ebeb99a95a048abe93416f603295e25ca0d877160845f808b5b6979eff2b0ef69", - "signer": "0x60e274b09f701107a4b3226fcc1376ebda3cdd92", - "last_updated": "1662700800143", - "jailed": false, - "accum": 606685462 - }, - { - "ID": 108, - "startEpoch": 10917, - "endEpoch": 0, - "nonce": 274, - "power": 6915246, - "pubKey": "0x04b91df3078221d1f13a7fec6d07230f878e3f01c4d3d3ff486c403ae68a95be8048f9738a7772e928a54d4c1da4ccea7d4654590e781037768b87d0dea199aeb9", - "signer": "0x6237b2af1238d12248630ce21aa84f0952122232", - "last_updated": "1662069800183", - "jailed": false, - "accum": -77979113 - }, - { - "ID": 116, - "startEpoch": 11440, - "endEpoch": 0, - "nonce": 711, - "power": 968129, - "pubKey": "0x041e7b1045fa8d8dce5d97d021da9a715499485570bb38d9d72deb1c76fbcb8043f5ed4477cf756e68de3f98d9476db8dbee5707650c91d3d4983af2889ce96a66", - "signer": "0x62fb676db64f87fd1602048106476c6036d44c92", - "last_updated": "1662504300082", - "jailed": false, - "accum": 399983867 - }, - { - "ID": 137, - "startEpoch": 26759, - "endEpoch": 0, - "nonce": 875, - "power": 353620333, - "pubKey": "0x0409d27f3f25b3ce0472d95f74d909596806dfd580ad2a80755075e011d4f77a390bafe5e14470b4f600c3b3d3374b5fc1c7528bf360c6ad621b6b20f9f3990a7f", - "signer": "0x67b94473d81d0cd00849d563c94d0432ac988b49", - "last_updated": "1663041200037", - "jailed": false, - "accum": -637313156 - }, - { - "ID": 86, - "startEpoch": 9484, - "endEpoch": 0, - "nonce": 1120, - "power": 1405042, - "pubKey": "0x04e488ff6fd81fb21f7fc098f727786fd9a3454d0e7a0c48bfdf0cb01228260dbf9d7cfc3ca5bd6706a525973299589baa6ed1c28ab3973bc81477127438eea3bf", - "signer": "0x6b2ed7e4b12a544ca7d215fed85dc16240d64aea", - "last_updated": "1662596800028", - "jailed": false, - "accum": 972427460 - }, - { - "ID": 19, - "startEpoch": 4369, - "endEpoch": 0, - "nonce": 866, - "power": 46418702, - "pubKey": "0x041a98b875a62e03aa51d60812d57d03b22d51b36cff91cd4070db64c7eb4206a1a4f8b6265f6297045ea5074d997b2d5db0417115a4e5175d10390410c19aadce", - "signer": "0x72f93a2740e00112d5f2cef404c0aa16fae21fa4", - "last_updated": "1663041400047", - "jailed": false, - "accum": -26903139 - }, - { - "ID": 134, - "startEpoch": 16837, - "endEpoch": 0, - "nonce": 2890, - "power": 25434718, - "pubKey": "0x04538ca213d90908572dad1044727dc844ed02012b4016631594dbaa9c152bb3d50fca5d420d803e12c651b36c11ba74b67161b4fec13be305186c264b118568e1", - "signer": "0x73d378cfeaa5cbe8daed64128ebdc91322aa586b", - "last_updated": "1662802300173", - "jailed": false, - "accum": -1147181097 - }, - { - "ID": 70, - "startEpoch": 8135, - "endEpoch": 0, - "nonce": 109, - "power": 27019553, - "pubKey": "0x04e3d9d418d82e60dcad162478f8e7d6362c8d584b42c93e4a9e6ad877a941c2b1e58a1571b39c89316e78729ae9190bef889a58e847fe104cff01e1c62cb3ed47", - "signer": "0x742d13f0b2a19c823bdd362b16305e4704b97a38", - "last_updated": "1660970200056", - "jailed": false, - "accum": 1657004241 - }, - { - "ID": 139, - "startEpoch": 33634, - "endEpoch": 0, - "nonce": 164, - "power": 196511793, - "pubKey": "0x0426913137c3778975cf5ceca8ef6e6cc8551e81d98192caf1a0d48cda0c7134e1ffc7583f170520525d007ef8bc609377a457c3f50cb77ffefb1b383aa101fddc", - "signer": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "last_updated": "1661886700085", - "jailed": false, - "accum": 2334232801 - }, - { - "ID": 140, - "startEpoch": 34806, - "endEpoch": 0, - "nonce": 1, - "power": 100, - "pubKey": "0x0452f78223250eb6f4a9b8827578b3b84ffcb1102d1cbbdfce2b15bb4277496961baa4776b4cba23f5a80cfe816ab9e19b899cd8c139b7031798c39f2fef3f836b", - "signer": "0x7ab5d38b454e50e31df0e9333564acb3541a7c4a", - "last_updated": "1527076600026", - "jailed": false, - "accum": -2237400868 - }, - { - "ID": 72, - "startEpoch": 8285, - "endEpoch": 0, - "nonce": 3032, - "power": 224952502, - "pubKey": "0x0449b4c834634c6893da4ab09f54f4167388ff229d4002e92665a625e30b07feca3aa907e1234e5fa032e8f1cd277caf3d392513ac8a40e288a9da45bb206ed02c", - "signer": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "last_updated": "1662886600331", - "jailed": false, - "accum": -1215118244 - }, - { - "ID": 16, - "startEpoch": 4114, - "endEpoch": 0, - "nonce": 198, - "power": 1034257, - "pubKey": "0x04ea262816cc0e5ef341aaadd1a295ec6fc65afc46921baa86aface3bfc11df179ba5825b143913e43438952f954c3a34a9d6bc8633ebd67d25d498f3bf472f356", - "signer": "0x7e8024132d07e3e69c9bc2012dffe300b9c5807d", - "last_updated": "1659749200067", - "jailed": false, - "accum": 888974721 - }, - { - "ID": 47, - "startEpoch": 6312, - "endEpoch": 0, - "nonce": 819, - "power": 4621721, - "pubKey": "0x04fcaec0ba14512a24f110d9c96988372189cd1879092f35078f89676a93a8ab37e887d8caf3c1cbd5512dcf4f90de4b25e151e8ad2db7bcf7271acfbb62062e47", - "signer": "0x83d69448f88bf9c701c1b93f43e1f753d39b2632", - "last_updated": "1663055600075", - "jailed": false, - "accum": 301580039 - }, - { - "ID": 106, - "startEpoch": 10783, - "endEpoch": 0, - "nonce": 749, - "power": 4961107, - "pubKey": "0x04c93dfd11c637c9e4bd5bd0b4e9f5e25dbc0ea790dbdde7657a6147aa1d54fd8295e2f7683e614d68939121d59dfd375e419956be54bf767ecb8d1123559d2bc7", - "signer": "0x88c5e96c1459d224383dcb1fe0cedd1fcee25ffb", - "last_updated": "1662242400154", - "jailed": false, - "accum": -937384688 - }, - { - "ID": 133, - "startEpoch": 16443, - "endEpoch": 0, - "nonce": 927, - "power": 3395273, - "pubKey": "0x04ee62945cef0b885c98781802dfdaab67e7104cc3010fa73bf179a5dfcea50aec410c6e07160576daf0ba5ce8885e78de575933b55b36eb23121ddf8a7831fb38", - "signer": "0x8bbf92f4da9be0478464a077f582abd7b6df193c", - "last_updated": "1662876000144", - "jailed": false, - "accum": 631267988 - }, - { - "ID": 9, - "startEpoch": 2878, - "endEpoch": 0, - "nonce": 595, - "power": 17317575, - "pubKey": "0x0466d071600a26ff3c046afb7f556ec840b39f5bf1a27660a5f739f48970807e80b1d4125473ffd52eb494fd07255777ce19865590837da46edaa50f77d4471204", - "signer": "0x8cb120478e9503760656c1fcac9c1539158bdb55", - "last_updated": "1662802900102", - "jailed": false, - "accum": 1708298795 - }, - { - "ID": 112, - "startEpoch": 11391, - "endEpoch": 0, - "nonce": 336, - "power": 208849, - "pubKey": "0x04fa7ae89ef582165552d6507c4d8ed26624a38671de6c1f41278b178a869a3204ad276093f2291260bfdb7a46d9499deda25029218809313c6c544bba7b58acb6", - "signer": "0x8e35263b1ed592f585c8b8d1f3abacd2de247923", - "last_updated": "1662562400060", - "jailed": false, - "accum": -969954088 - }, - { - "ID": 26, - "startEpoch": 5127, - "endEpoch": 0, - "nonce": 297, - "power": 11235600, - "pubKey": "0x0480b48e24338369cd3c10913d26fdbcf57b6133291a28c2392b36b38dbd0b37c44e077f4551efce25ef13f138b899e4c3bfedc6ea43d52b893546db45b971e9f0", - "signer": "0x8e9700392f9246a6c5b32ee3ecef586f156ed683", - "last_updated": "1663089900215", - "jailed": false, - "accum": -346564537 - }, - { - "ID": 79, - "startEpoch": 8683, - "endEpoch": 0, - "nonce": 829, - "power": 13296529, - "pubKey": "0x04050e946ae40dcb277af26c22338f89b7e5912a435f45ee63293367e977ce26fe437a855204b4de9396dfc7cee6b8d92be26a37235e2afcd9baa0551f27b2ebd9", - "signer": "0x90b11143a0cb64e067402307bc7f2276dcec8250", - "last_updated": "1662674700401", - "jailed": false, - "accum": -349292160 - }, - { - "ID": 42, - "startEpoch": 5958, - "endEpoch": 0, - "nonce": 456, - "power": 707167, - "pubKey": "0x041dec50455dec8b1e2dde8062e90a1cc1ea69dfeea23415bced071b21f31a4d287d7e3ef7f6703f79fa7e57fc2b929e001a12342a007e6b27d86498abf3e7a034", - "signer": "0x91935751ba30494c4fd276adcf134ecd66f8eca6", - "last_updated": "1663062800076", - "jailed": false, - "accum": 637868011 - }, - { - "ID": 120, - "startEpoch": 11556, - "endEpoch": 0, - "nonce": 558, - "power": 2363325, - "pubKey": "0x04dc5de4ecc100f12fd467e9674e2894b4061118e210d3bd19ce53feb5e6df24ce1811fc198340d06ce9f275eb5b764b7d864c8818324d161a4ecdcb81b910e5e2", - "signer": "0x951c881cab59ed669915a2b04ea5721600794ec3", - "last_updated": "1643339300024", - "jailed": false, - "accum": -894728133 - }, - { - "ID": 117, - "startEpoch": 11447, - "endEpoch": 0, - "nonce": 406, - "power": 14007964, - "pubKey": "0x041506bd87d2844fe8bb60ca3f7f286ca9991fb17483917668114fcc7d42a701f95e6a83524bbddd7b5cf2010b8ec55b47793d6d179bf547a5504a3ebf0b9cd0ba", - "signer": "0x959a4d857b7071c38878beb9dc77051b5fed1dfd", - "last_updated": "1662674700391", - "jailed": false, - "accum": 70390766 - }, - { - "ID": 128, - "startEpoch": 12623, - "endEpoch": 0, - "nonce": 5107, - "power": 29851118, - "pubKey": "0x0416552133948883a45e5c7967441a889ac6c48fad900b5b8b321d46ee13d5a90f065e36c517747400400f697630cdd94b898cccbddab79019edfa36fd59833744", - "signer": "0x959c65b72147faf3450d8b50a0de57e72ffc5e0d", - "last_updated": "1663272500167", - "jailed": false, - "accum": -1208938615 - }, - { - "ID": 12, - "startEpoch": 3738, - "endEpoch": 0, - "nonce": 134, - "power": 14515910, - "pubKey": "0x044bc95f26db29fd21204871f7011a4606ae8253f879cc1a988b0858e2d95894d4fe2bb18d46cda7859367ffea3344ebdf960b0ac073023635aadcb59f47b0a79c", - "signer": "0x98c27cc3f0301b6272049dc3f972e2f542780629", - "last_updated": "1662448200118", - "jailed": false, - "accum": 148390151 - }, - { - "ID": 129, - "startEpoch": 13216, - "endEpoch": 0, - "nonce": 228, - "power": 3977003, - "pubKey": "0x0427ca49d47de88f14492b240602913b155c372d0c8bb77e3e1d9da7c7466cfcd8992c0cc0deb2887abcd88fef8836170110df807508b5e3f90dba2d14b0c65a71", - "signer": "0x9c56f33b968f83922bccf6d7689b9c883af9de49", - "last_updated": "1658826600143", - "jailed": false, - "accum": -1569000695 - }, - { - "ID": 18, - "startEpoch": 4252, - "endEpoch": 0, - "nonce": 445, - "power": 419670128, - "pubKey": "0x04127513ffb9cae0800d8894b4fcf5c5763fe7c52b30a3b488a5507e31ff00f693b4cb26dea3ec5be0c33506a7f0ee87364ac6a5c259bb60498cc03c5900f55860", - "signer": "0x9ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0", - "last_updated": "1662754700132", - "jailed": false, - "accum": 1401641981 - }, - { - "ID": 146, - "startEpoch": 40578, - "endEpoch": 0, - "nonce": 61, - "power": 674088, - "pubKey": "0x048aaa75c5817eb487379b1047dfc46d4d4a300186028b96d41070f6430fd0eb001348ba9c6f7406e9b7cb76d96b52f2cfc5af6492e7adec443182875cd5891f85", - "signer": "0xa38f3504e661d2b152adaf197ba5057c911c879b", - "last_updated": "1662106800325", - "jailed": false, - "accum": -1878714532 - }, - { - "ID": 14, - "startEpoch": 3816, - "endEpoch": 0, - "nonce": 135, - "power": 3630672, - "pubKey": "0x040572f6bac2320d4ea912b99ce6828cd8dd3e0d3471f8102df7b05dd8ad8791a53e00f74b6f89499e5d0c0f8254a33d85947486afe02565430b9345e1c24bc2dd", - "signer": "0xa5d5a7c2ebd2a381f7e958754c0d6a2d469b131b", - "last_updated": "1663191000107", - "jailed": false, - "accum": -556910623 - }, - { - "ID": 148, - "startEpoch": 42122, - "endEpoch": 0, - "nonce": 2, - "power": 101, - "pubKey": "0x04f506761ba8c351e8b9e082340c7f7fde107c6b65663894cdfe2e7b0bcf48968b7d348731ec2c20401462867c439f3461ba8a5c8818be1a724fdfd798ab8ff20e", - "signer": "0xa8b52f02108aa5f4b675bdcc973760022d7c6020", - "last_updated": "1657746200106", - "jailed": false, - "accum": -3976204978 - }, - { - "ID": 23, - "startEpoch": 4481, - "endEpoch": 0, - "nonce": 743, - "power": 2195314, - "pubKey": "0x042171f29c1d106bd66bf5ccc471c96dea2f43a9589e3a72622cf4667f76440f6f1a681040f36247c4f810ebbfac7fe6a6e79eb542d3e0ca3f26a332b2183eea6c", - "signer": "0xa972652c63dce1705ce73e956fb523b4bd1239b0", - "last_updated": "1662185000062", - "jailed": false, - "accum": 1496535373 - }, - { - "ID": 130, - "startEpoch": 13645, - "endEpoch": 0, - "nonce": 3160, - "power": 11765058, - "pubKey": "0x04a071c51312f90322fd714ec8c769a01ebdc9bdb2d80922ff4cdaebe0d02c159d5f649bc6f49f6af1d8c7f7a87be55041b334d4c6353997f2cd9501b0fb0bbaa3", - "signer": "0xb2dd091ea6e591d62f565d7a18ce2a7640add227", - "last_updated": "1662070100258", - "jailed": false, - "accum": -1017850371 - }, - { - "ID": 149, - "startEpoch": 42122, - "endEpoch": 0, - "nonce": 2, - "power": 13, - "pubKey": "0x045cddfebb55e0e8286e374d5f2c80ca8076b782ce172ffa80ad529b4a0b011be9ae4f5d2b9926bef4eb529431c6a70cc2875b163fccdd531e6ad66ffe30733e7d", - "signer": "0xb38b208c79855404c56025aca4a4ffa8da6f4810", - "last_updated": "1657017200095", - "jailed": false, - "accum": -3976340598 - }, - { - "ID": 4, - "startEpoch": 0, - "endEpoch": 0, - "nonce": 2739, - "power": 2025453, - "pubKey": "0x04b4e1d56b3429f7756452426be611e595debcb858d59f47d29ec9dd6e4b547dce1539f9b7144420bc309de496b70d6dc5f13345eee85e6b7fb332cd9f364ef12f", - "signer": "0xb702f1c9154ac9c08da247a8e30ee6f2f3373f41", - "last_updated": "1656828300069", - "jailed": false, - "accum": 538440633 - }, - { - "ID": 2, - "startEpoch": 0, - "endEpoch": 0, - "nonce": 2759, - "power": 1877419, - "pubKey": "0x04d6b06c725f5410e4ccbd65906ece180364ebea4902b21232c1fb5892a76be7eec22480397d6bf653e9abe7ac50435ee472b59364fe78b17acb2be2116f92a76f", - "signer": "0xb8bb158b93c94ed35c1970d610d1e2b34e26652c", - "last_updated": "1621137900064", - "jailed": false, - "accum": 1762357635 - }, - { - "ID": 77, - "startEpoch": 8565, - "endEpoch": 0, - "nonce": 1576, - "power": 14822358, - "pubKey": "0x04181ff8d843c85b3773504bb7a693378eed4a2137a6a8c75d91c5acb3d97876cc4155d0889d389204774aae71eb2288181252aebb78b52592c4feba35224de204", - "signer": "0xb95d435df3f8b2a8d8b9c2b7c8766c9ae6ed8cc9", - "last_updated": "1663208800036", - "jailed": false, - "accum": -1148363172 - }, - { - "ID": 121, - "startEpoch": 11581, - "endEpoch": 0, - "nonce": 6167, - "power": 88788585, - "pubKey": "0x04e92bbc619154b3086f099a285ff441b7e62d021abe597fa5639a082679a65c09c62640c761f436f33e398761a07987f4214d0f25b8a50b908436e04a223585e1", - "signer": "0xb9ede6f94d192073d8eaf85f8db677133d483249", - "last_updated": "1662983300081", - "jailed": false, - "accum": 1728163900 - }, - { - "ID": 144, - "startEpoch": 40092, - "endEpoch": 0, - "nonce": 5, - "power": 674, - "pubKey": "0x040147400eaa0f2082cbfca8d965f35fc728e1490716dce8e377babbb20924306639fa0ad77c50224211c13935b37d4b4e7c5cfac707dba7d3517e8d8212df3376", - "signer": "0xbac24ee20b56dc01a87a678c54a5f27d302d1edc", - "last_updated": "1661067900251", - "jailed": false, - "accum": -3500809280 - }, - { - "ID": 123, - "startEpoch": 11807, - "endEpoch": 0, - "nonce": 2389, - "power": 28658440, - "pubKey": "0x0476ecb34921018cb5359fc16a8e676cf055e5b155a45a51dcb23c29c161432b037ff1bb8b44a190d367202c0b6d64783858e4c3f232cfc75836e81e1f30e8d1b0", - "signer": "0xbc6044f4a1688d8b8596a9f7d4659e09985eebe6", - "last_updated": "1663310700067", - "jailed": false, - "accum": -594124499 - }, - { - "ID": 91, - "startEpoch": 9990, - "endEpoch": 0, - "nonce": 150, - "power": 124088098, - "pubKey": "0x04f4efb1dc25cf3653a408e3640a13d11855bc2cd9957976d793a18491d674c99bd410312bf891f4eb87e37cea6372ddd31e60fb0eb255e197a52be71eaef62b67", - "signer": "0xbdbd4347b082d9d6bdf2da4555a37ce52a2e2120", - "last_updated": "1647620200020", - "jailed": false, - "accum": 2214445542 - }, - { - "ID": 147, - "startEpoch": 41108, - "endEpoch": 0, - "nonce": 33, - "power": 918373, - "pubKey": "0x049e5341f9fc5c62d7e9808f139edcf2c9cf759231109c5dfd017623abdd5c29333eb28ef0c41e8db2ef603c66ee2846236de7d2bb98b8ba51763e45c207742263", - "signer": "0xc063fd85702b3e0e1845b2a490d12c39d19a9ccb", - "last_updated": "1661158400107", - "jailed": false, - "accum": -2382488928 - }, - { - "ID": 34, - "startEpoch": 5457, - "endEpoch": 0, - "nonce": 445, - "power": 15658821, - "pubKey": "0x04071930b3d77174fae43dcfbfba3079081c8ae3788cf00e758fc74e19da7cbc651be23673b027ca85570d021789a87d3ac6e04e71140ac4d8c09dd35ddda52b47", - "signer": "0xc35649ae99be820c7b200a0add09b96d7032d232", - "last_updated": "1663218000137", - "jailed": false, - "accum": -1614073248 - }, - { - "ID": 30, - "startEpoch": 5280, - "endEpoch": 0, - "nonce": 2330, - "power": 33687148, - "pubKey": "0x04e039bb399a4b185f97d3842b01b3fe86e794bbfe39d7110b75dd0727d69eb8114ac573ba9cb1fb34d7b944253dfa9832276902a283ff39605bc27639d7404f80", - "signer": "0xc6869257205e20c2a43cb31345db534aecb49f6e", - "last_updated": "1662744000096", - "jailed": false, - "accum": 1202179124 - }, - { - "ID": 138, - "startEpoch": 27049, - "endEpoch": 0, - "nonce": 1044, - "power": 3946646, - "pubKey": "0x04df13003e52b6241084db11a329767e9695e0b502b5f695c8178f8cc1b8ceb3ddcf5208b064d108c025f7f61db6e389c7a7b618696886b4aaba56bd9d981cb8e4", - "signer": "0xcfb5ea41788c1d539b6fd760cf26d688ae0331ff", - "last_updated": "1662998900096", - "jailed": false, - "accum": 206839828 - }, - { - "ID": 22, - "startEpoch": 4450, - "endEpoch": 0, - "nonce": 598, - "power": 3425873, - "pubKey": "0x0459b51c20aa5aa182852314c5b92d5a2cad131d1570184158bd00777be386b13732cd9ecbbefd2edf75079bd245e39ffbf9fef7a04586ec7643abe63d481c8fb8", - "signer": "0xd2e4be547b21e99a668f81eecf0298471a19808f", - "last_updated": "1663043300077", - "jailed": false, - "accum": -646099658 - }, - { - "ID": 41, - "startEpoch": 5911, - "endEpoch": 0, - "nonce": 513, - "power": 2415537, - "pubKey": "0x04690010a73742050da4ffaa1bae9a0b2188bce80d3f29ce43f6223c024e516110ee142d694f2fcc9b025ea48aca9191e015922fd442d8cd17c87ecab1ad3e5434", - "signer": "0xd48611f40a37623bbcf9f047b8538177d879bad0", - "last_updated": "1659692500333", - "jailed": false, - "accum": 869081899 - }, - { - "ID": 8, - "startEpoch": 2539, - "endEpoch": 0, - "nonce": 228, - "power": 20080652, - "pubKey": "0x043171932c1a17af7256fe0951d1d8a69f7be98207c0fbbcda87a62d3fb341fc0430ebd33f385759c6283af5698f595ffab12424f59d5be241ffe528def8583847", - "signer": "0xd56fbe3294ea4d73cca99ff8751ce7bd9b688cd5", - "last_updated": "1659749200071", - "jailed": false, - "accum": -1219587258 - }, - { - "ID": 145, - "startEpoch": 40578, - "endEpoch": 0, - "nonce": 12, - "power": 691424, - "pubKey": "0x0454ed813a37d26a57c1272bc814ef4b44c4aa1ad8cd678d17bb19d0be5c0bec413e546ed6ab7803982bca0c5bbc759781b6758ccb5642069fcc2742a1526719e7", - "signer": "0xd6dbd84137d9337b01583b1c23c14b1d0da8e1cd", - "last_updated": "1653889000105", - "jailed": false, - "accum": -829756385 - }, - { - "ID": 10, - "startEpoch": 3195, - "endEpoch": 0, - "nonce": 839, - "power": 16520070, - "pubKey": "0x043fef3dbac0ac22f7261d9f5b71671bdd6ac3b024d7a8a4d63b4fe9a8b3abba68063161f364fc2feedea2dfe1daea59bd2715a9991fbe5c6e7b9b34a46323d132", - "signer": "0xde8da1ee512529b6c61fe7c769affc160308dea2", - "last_updated": "1661705100220", - "jailed": false, - "accum": 263170467 - }, - { - "ID": 98, - "startEpoch": 10224, - "endEpoch": 0, - "nonce": 279, - "power": 1912301, - "pubKey": "0x045c242a0228b3956b89132fc9ad810de460285adc17a5ed19f6e9bd2c92b2a53384f0416d336e8fc3924542a6069ed17e1fa532ed93f872a818f65a02f66b7e32", - "signer": "0xe05ae0e76f582817c9e31d9c1a5c02287a31d689", - "last_updated": "1657980300058", - "jailed": false, - "accum": -996773131 - }, - { - "ID": 95, - "startEpoch": 10035, - "endEpoch": 0, - "nonce": 301, - "power": 2695910, - "pubKey": "0x04c462bb3fb7258f31a631cd4d0d73017e1ab5ce7aed4330352de8ffd2b39a301ab3fff59fc2073b92b9c6f4fc2f7e487cd31498604c2fe9dd6c0e4fa117278305", - "signer": "0xe0b1a1d599a66407556171b073003ef854f5d2bd", - "last_updated": "1663206500157", - "jailed": false, - "accum": 1696342840 - }, - { - "ID": 101, - "startEpoch": 10561, - "endEpoch": 0, - "nonce": 430, - "power": 687652, - "pubKey": "0x043d33f282f64a03d8ea84908c07bdf1ec81c4c6ccdea46a5562e67e8aef14009c9b13489177964a63de768f2aeb0f885e5e40a9c0e6a816b01267419d6f495cee", - "signer": "0xe296cf6511ab951e026c620fb0e266db4d6de4a0", - "last_updated": "1662845100106", - "jailed": false, - "accum": -144710678 - }, - { - "ID": 102, - "startEpoch": 10626, - "endEpoch": 0, - "nonce": 213, - "power": 4328673, - "pubKey": "0x0439ff7824e759b9ace75ff977d86fb6d54cd9a67ac87d9ed72850b68a1cec7bdbaa3d9ab87881b50f870d5095dece87077f98f417a05333306dc55924b703a370", - "signer": "0xe63727cb2b3a8d6e3a2d1df4990f441938b67a34", - "last_updated": "1656454600056", - "jailed": false, - "accum": 1714943995 - }, - { - "ID": 15, - "startEpoch": 4061, - "endEpoch": 0, - "nonce": 1859, - "power": 5552161, - "pubKey": "0x04053015a485e04c39236b3cf0dd4f0a8d50f4cdca2e806725ba5c732d098a5e156d1bfa6f8ce2189e12dd91378c723dc63a408794410365d181971b52f511bc68", - "signer": "0xe77bbfd8ed65720f187efdd109e38d75eaca7385", - "last_updated": "1634531300030", - "jailed": false, - "accum": 1679016651 - }, - { - "ID": 94, - "startEpoch": 9992, - "endEpoch": 0, - "nonce": 363, - "power": 106323801, - "pubKey": "0x046ff196614c2398bc7e2c0a95a8be5ee41604e3f5e678afc642cb7f982386433142b7f7320affa049cb2840b431f40b28ce0796c68f21d2198bf2a91a961b6925", - "signer": "0xe7e2cb8c81c10ff191a73fe266788c9ce62ec754", - "last_updated": "1655891500054", - "jailed": false, - "accum": 1639169239 - }, - { - "ID": 122, - "startEpoch": 11587, - "endEpoch": 0, - "nonce": 3935, - "power": 16118602, - "pubKey": "0x042e117dcc774659d4b6f3ee3bc520cbd22550c4683f299f3e43e36512b25d829f2bfe6208f00254b9eaa1a4df2683f809c6485e91b3d556022f2105f275913f73", - "signer": "0xeb4f2a75cac4bbcb4d71c252e4cc80eb80bb3a34", - "last_updated": "1663050200129", - "jailed": false, - "accum": -431392226 - }, - { - "ID": 85, - "startEpoch": 9444, - "endEpoch": 0, - "nonce": 559, - "power": 1072060, - "pubKey": "0x045ba6177072c47f1e278794701b9cbeb851b8c9807964bae23ca85f2be762286182319503c1fbd93fe53d5095b352e81077473113ee2bf1637222f439a56b18a3", - "signer": "0xeb578c32a783dccac4b3abffc5b993ceea621012", - "last_updated": "1662714200040", - "jailed": false, - "accum": -303114806 - }, - { - "ID": 27, - "startEpoch": 5208, - "endEpoch": 0, - "nonce": 331, - "power": 152849094, - "pubKey": "0x044960885bd1248f632673bf276aafaae6242043e36828f671cd2c9cf83e1e284426ef7df53ab5f203fc016ffac62754e8cfd9aca3379bc93f748a327ff1b19cd6", - "signer": "0xec20607aa654d823dd01beb8780a44863c57ed07", - "last_updated": "1659894900050", - "jailed": false, - "accum": -1215895354 - }, - { - "ID": 100, - "startEpoch": 10294, - "endEpoch": 0, - "nonce": 153, - "power": 1038832, - "pubKey": "0x04639a77f115238bdf590f66f42554fa38ec45da11911399b1d200605f469464d590e3569325c090f9001eaecb3606e72aeed748e90496f2e1876829285e2b6737", - "signer": "0xedc0b61948531e1962517869bdbef9abf0ffd645", - "last_updated": "1658696300078", - "jailed": false, - "accum": 704351264 - }, - { - "ID": 142, - "startEpoch": 36337, - "endEpoch": 0, - "nonce": 7949, - "power": 215348898, - "pubKey": "0x0400c81a10aad5f1452ee90b4d41f8b6bb4e04bbdd6c3c42475a0fb74ef4437f3ff8ae75dcfa92ed2c89d7dd81a41ccc47d5a6eb81b7b7bb78ea0dbbda1740917e", - "signer": "0xeedba2484aaf940f37cd3cd21a5d7c4a7dafbfc0", - "last_updated": "1663314200085", - "jailed": false, - "accum": -1071541496 - }, - { - "ID": 88, - "startEpoch": 9841, - "endEpoch": 0, - "nonce": 646, - "power": 62586081, - "pubKey": "0x04f942d6ca3d87de9b0767262db4363758753bdb2dbed83a65b1b731c60a8ecf9be0a9cb70547bae211875f7965df789da6177692f200b403d6fdfde92283a9a98", - "signer": "0xef46d5fe753c988606e6f703260d816af53b03eb", - "last_updated": "1663003900137", - "jailed": false, - "accum": 1210281603 - }, - { - "ID": 110, - "startEpoch": 11050, - "endEpoch": 0, - "nonce": 13463, - "power": 228010536, - "pubKey": "0x040e6465dce45cd815f1590fa6e7eb7850977e2a06c26cbba3df31787133b2b996cbaa25e68770175e460d8afccae2bafcd8d018f4b9d2d210f82507d78f58bac3", - "signer": "0xf0245f6251bef9447a08766b9da2b07b28ad80b0", - "last_updated": "1663308300082", - "jailed": false, - "accum": -504184247 - }, - { - "ID": 3, - "startEpoch": 0, - "endEpoch": 0, - "nonce": 3101, - "power": 1633901, - "pubKey": "0x040600efda73e1404b0c596e08c78c5ed51631fc173e5f39d21deeddd5712fcd7d6d440c53d211eb48b03063a05b2c0c0eb084053dfcf1c6540def705c8e028456", - "signer": "0xf84c74dea96df0ec22e11e7c33996c73fcc2d822", - "last_updated": "1625013400041", - "jailed": false, - "accum": 462537024 - }, - { - "ID": 143, - "startEpoch": 37140, - "endEpoch": 0, - "nonce": 207, - "power": 4948196, - "pubKey": "0x0493dde87799c59af1726172f6a797032ce5394202ed3f28dcbe41bd596b071ed722be95ac8db7a79c5b926471e3ce3d23dcd201d21797383e489a53c218dbdd13", - "signer": "0xf8b527d500e0d1387d5f9d8cb23868bbb90e4bca", - "last_updated": "1663119300441", - "jailed": false, - "accum": -1549325890 - }, - { - "ID": 54, - "startEpoch": 6810, - "endEpoch": 0, - "nonce": 551, - "power": 13268669, - "pubKey": "0x04be2d1cdedae233fee1f65abe5d64d9f8ecc42acf533caae558d306e8b43e5b55dc942263c46e2fc4892427f30bb684a5edcec7382f8aeb8b12eabbf3eaf41069", - "signer": "0xfb960a9450fc2f5dc8c6b1172932b678e287835f", - "last_updated": "1663128400209", - "jailed": false, - "accum": 760259312 - } - ], - "proposer": { - "ID": 72, - "startEpoch": 8285, - "endEpoch": 0, - "nonce": 3032, - "power": 224952502, - "pubKey": "0x0449b4c834634c6893da4ab09f54f4167388ff229d4002e92665a625e30b07feca3aa907e1234e5fa032e8f1cd277caf3d392513ac8a40e288a9da45bb206ed02c", - "signer": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "last_updated": "1662886600331", - "jailed": false, - "accum": -1215118244 - } - }, - "selected_producers": [ - { - "ID": 32, - "startEpoch": 5313, - "endEpoch": 0, - "nonce": 1567, - "power": 1, - "pubKey": "0x04d1228cce225214fc1c36c5ac76f6f9e2394de97bee956197f632ebf406469ffe218193ac7425d9b827b1bf6928ba5967043c7e88e09f7ba5f6a45599a115eec2", - "signer": "0x02f70172f7f490653665c9bfac0666147c8af1f5", - "last_updated": "1663134000286", - "jailed": false, - "accum": 0 - }, - { - "ID": 141, - "startEpoch": 35390, - "endEpoch": 0, - "nonce": 50, - "power": 2, - "pubKey": "0x048940a918da7be89d91610753c288312a0c5ac67bf3754c9dc4bbfcc8e50a19a18fa899b0b2d4085c6e33d7637f4afad74769864c4fc32f116ec3e9f2c6448952", - "signer": "0x09385a960a2e0b6b4516d341534da92cb2a50085", - "last_updated": "1648561300077", - "jailed": false, - "accum": 0 - }, - { - "ID": 87, - "startEpoch": 9509, - "endEpoch": 0, - "nonce": 921, - "power": 3, - "pubKey": "0x0404a438fa6b5033aa83847d283aedc67ca862c4183b837b664489e38f141d9fe92aaee18976acbcbbbaa137ecd350a9fe5b37bb851156f2a077500b5e742ca3ec", - "signer": "0x1efecb61a2f80aa34d3b9218b564a64d05946290", - "last_updated": "1662953100026", - "jailed": false, - "accum": 0 - }, - { - "ID": 92, - "startEpoch": 9991, - "endEpoch": 0, - "nonce": 74, - "power": 4, - "pubKey": "0x04877af9e5e26bca4f9063d4baf2803a491fad3219865d9d5fbda6edea5e1c1b4272d4f4704ee167b77091498d6eb8442ef8ab6c2b5a02722b15e0e5ab0ca27a00", - "signer": "0x26c80cc193b27d73d2c40943acec77f4da2c5bd8", - "last_updated": "1633048600271", - "jailed": false, - "accum": 0 - }, - { - "ID": 64, - "startEpoch": 7791, - "endEpoch": 0, - "nonce": 393, - "power": 1, - "pubKey": "0x0434f30e5ed1fbc44c7b41b0134c886097c2ed98d17141ac40e0796a7c4ec93c0c1eceec4160192bcb75997f57f4a2783343883450421ac750f360aba5ac826cb5", - "signer": "0x30dd252c7c150f26a3a06e4eada9e706db3fa58c", - "last_updated": "1660974100018", - "jailed": false, - "accum": 0 - }, - { - "ID": 38, - "startEpoch": 5812, - "endEpoch": 0, - "nonce": 423, - "power": 1, - "pubKey": "0x046d2b9e512879af19be7fc0e2f886a8206d9e396a423d00b3af9009afe2be783d5fde36984c966fe2ec51c7d7572d6f49faee5a73d3d4d9a9e2382b5d8adc8b5b", - "signer": "0x40314efbc35bc0db441969bce451bf0167efded1", - "last_updated": "1658978400079", - "jailed": false, - "accum": 0 - }, - { - "ID": 93, - "startEpoch": 9992, - "endEpoch": 0, - "nonce": 143, - "power": 2, - "pubKey": "0x04af2b42565d5c22d1353e23936bf32fd0642d2a2c567d866135d2e547fc4679524a2306141bc214c96893ef6c6d312fd5bc3654abbbf3b74ac96180f0c2efab90", - "signer": "0x46a3a41bd932244dd08186e4c19f1a7e48cbcdf4", - "last_updated": "1663080800101", - "jailed": false, - "accum": 0 - }, - { - "ID": 50, - "startEpoch": 6374, - "endEpoch": 0, - "nonce": 90, - "power": 1, - "pubKey": "0x045498aeb04c83d70578cfb7d7c6b002c0c5b114261f710457fb17e23033de406ebeb99a95a048abe93416f603295e25ca0d877160845f808b5b6979eff2b0ef69", - "signer": "0x60e274b09f701107a4b3226fcc1376ebda3cdd92", - "last_updated": "1662700800143", - "jailed": false, - "accum": 0 - }, - { - "ID": 137, - "startEpoch": 26759, - "endEpoch": 0, - "nonce": 875, - "power": 7, - "pubKey": "0x0409d27f3f25b3ce0472d95f74d909596806dfd580ad2a80755075e011d4f77a390bafe5e14470b4f600c3b3d3374b5fc1c7528bf360c6ad621b6b20f9f3990a7f", - "signer": "0x67b94473d81d0cd00849d563c94d0432ac988b49", - "last_updated": "1663041200037", - "jailed": false, - "accum": 0 - }, - { - "ID": 139, - "startEpoch": 33634, - "endEpoch": 0, - "nonce": 164, - "power": 4, - "pubKey": "0x0426913137c3778975cf5ceca8ef6e6cc8551e81d98192caf1a0d48cda0c7134e1ffc7583f170520525d007ef8bc609377a457c3f50cb77ffefb1b383aa101fddc", - "signer": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "last_updated": "1661886700085", - "jailed": false, - "accum": 0 - }, - { - "ID": 72, - "startEpoch": 8285, - "endEpoch": 0, - "nonce": 3032, - "power": 4, - "pubKey": "0x0449b4c834634c6893da4ab09f54f4167388ff229d4002e92665a625e30b07feca3aa907e1234e5fa032e8f1cd277caf3d392513ac8a40e288a9da45bb206ed02c", - "signer": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "last_updated": "1662886600331", - "jailed": false, - "accum": 0 - }, - { - "ID": 26, - "startEpoch": 5127, - "endEpoch": 0, - "nonce": 297, - "power": 1, - "pubKey": "0x0480b48e24338369cd3c10913d26fdbcf57b6133291a28c2392b36b38dbd0b37c44e077f4551efce25ef13f138b899e4c3bfedc6ea43d52b893546db45b971e9f0", - "signer": "0x8e9700392f9246a6c5b32ee3ecef586f156ed683", - "last_updated": "1663089900215", - "jailed": false, - "accum": 0 - }, - { - "ID": 18, - "startEpoch": 4252, - "endEpoch": 0, - "nonce": 445, - "power": 5, - "pubKey": "0x04127513ffb9cae0800d8894b4fcf5c5763fe7c52b30a3b488a5507e31ff00f693b4cb26dea3ec5be0c33506a7f0ee87364ac6a5c259bb60498cc03c5900f55860", - "signer": "0x9ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0", - "last_updated": "1662754700132", - "jailed": false, - "accum": 0 - }, - { - "ID": 121, - "startEpoch": 11581, - "endEpoch": 0, - "nonce": 6167, - "power": 1, - "pubKey": "0x04e92bbc619154b3086f099a285ff441b7e62d021abe597fa5639a082679a65c09c62640c761f436f33e398761a07987f4214d0f25b8a50b908436e04a223585e1", - "signer": "0xb9ede6f94d192073d8eaf85f8db677133d483249", - "last_updated": "1662983300081", - "jailed": false, - "accum": 0 - }, - { - "ID": 91, - "startEpoch": 9990, - "endEpoch": 0, - "nonce": 150, - "power": 2, - "pubKey": "0x04f4efb1dc25cf3653a408e3640a13d11855bc2cd9957976d793a18491d674c99bd410312bf891f4eb87e37cea6372ddd31e60fb0eb255e197a52be71eaef62b67", - "signer": "0xbdbd4347b082d9d6bdf2da4555a37ce52a2e2120", - "last_updated": "1647620200020", - "jailed": false, - "accum": 0 - }, - { - "ID": 102, - "startEpoch": 10626, - "endEpoch": 0, - "nonce": 213, - "power": 1, - "pubKey": "0x0439ff7824e759b9ace75ff977d86fb6d54cd9a67ac87d9ed72850b68a1cec7bdbaa3d9ab87881b50f870d5095dece87077f98f417a05333306dc55924b703a370", - "signer": "0xe63727cb2b3a8d6e3a2d1df4990f441938b67a34", - "last_updated": "1656454600056", - "jailed": false, - "accum": 0 - }, - { - "ID": 94, - "startEpoch": 9992, - "endEpoch": 0, - "nonce": 363, - "power": 1, - "pubKey": "0x046ff196614c2398bc7e2c0a95a8be5ee41604e3f5e678afc642cb7f982386433142b7f7320affa049cb2840b431f40b28ce0796c68f21d2198bf2a91a961b6925", - "signer": "0xe7e2cb8c81c10ff191a73fe266788c9ce62ec754", - "last_updated": "1655891500054", - "jailed": false, - "accum": 0 - }, - { - "ID": 122, - "startEpoch": 11587, - "endEpoch": 0, - "nonce": 3935, - "power": 1, - "pubKey": "0x042e117dcc774659d4b6f3ee3bc520cbd22550c4683f299f3e43e36512b25d829f2bfe6208f00254b9eaa1a4df2683f809c6485e91b3d556022f2105f275913f73", - "signer": "0xeb4f2a75cac4bbcb4d71c252e4cc80eb80bb3a34", - "last_updated": "1663050200129", - "jailed": false, - "accum": 0 - }, - { - "ID": 27, - "startEpoch": 5208, - "endEpoch": 0, - "nonce": 331, - "power": 3, - "pubKey": "0x044960885bd1248f632673bf276aafaae6242043e36828f671cd2c9cf83e1e284426ef7df53ab5f203fc016ffac62754e8cfd9aca3379bc93f748a327ff1b19cd6", - "signer": "0xec20607aa654d823dd01beb8780a44863c57ed07", - "last_updated": "1659894900050", - "jailed": false, - "accum": 0 - }, - { - "ID": 142, - "startEpoch": 36337, - "endEpoch": 0, - "nonce": 7949, - "power": 2, - "pubKey": "0x0400c81a10aad5f1452ee90b4d41f8b6bb4e04bbdd6c3c42475a0fb74ef4437f3ff8ae75dcfa92ed2c89d7dd81a41ccc47d5a6eb81b7b7bb78ea0dbbda1740917e", - "signer": "0xeedba2484aaf940f37cd3cd21a5d7c4a7dafbfc0", - "last_updated": "1663314200085", - "jailed": false, - "accum": 0 - }, - { - "ID": 88, - "startEpoch": 9841, - "endEpoch": 0, - "nonce": 646, - "power": 1, - "pubKey": "0x04f942d6ca3d87de9b0767262db4363758753bdb2dbed83a65b1b731c60a8ecf9be0a9cb70547bae211875f7965df789da6177692f200b403d6fdfde92283a9a98", - "signer": "0xef46d5fe753c988606e6f703260d816af53b03eb", - "last_updated": "1663003900137", - "jailed": false, - "accum": 0 - }, - { - "ID": 110, - "startEpoch": 11050, - "endEpoch": 0, - "nonce": 13463, - "power": 2, - "pubKey": "0x040e6465dce45cd815f1590fa6e7eb7850977e2a06c26cbba3df31787133b2b996cbaa25e68770175e460d8afccae2bafcd8d018f4b9d2d210f82507d78f58bac3", - "signer": "0xf0245f6251bef9447a08766b9da2b07b28ad80b0", - "last_updated": "1663308300082", - "jailed": false, - "accum": 0 - } - ], - "bor_chain_id": "137" - } -} diff --git a/blockchain/polygon/bor/testdata/span_6146.json b/blockchain/polygon/bor/testdata/span_6146.json deleted file mode 100644 index 8547c61..0000000 --- a/blockchain/polygon/bor/testdata/span_6146.json +++ /dev/null @@ -1,1575 +0,0 @@ -{ - "height": "12844077", - "result": { - "span_id": 6146, - "start_block": 39328256, - "end_block": 39334655, - "validator_set": { - "validators": [ - { - "ID": 127, - "startEpoch": 12530, - "endEpoch": 0, - "nonce": 2689, - "power": 35562604, - "pubKey": "0x04a6f3c7bb0c6cacdb5a50a95dc03dbdf254ff0eb9b3fcad2a30e0d9ab36defd61d003e29ec310a94b18d5c794ab8b7037da184c966a0aa8e4d503b881437c01e7", - "signer": "0x00856730088a5c3191bd26eb482e45229555ce57", - "last_updated": "1661635600249", - "jailed": false, - "accum": -280877535 - }, - { - "ID": 136, - "startEpoch": 19269, - "endEpoch": 0, - "nonce": 535, - "power": 5225013, - "pubKey": "0x04fe434b14886b67fbada360f68f6a2ce1484d68e4fde20ff56a39a54d6c561e72c9f9a604685746faad3ef4ea0402cac903f192041d0726b650571553b99e14e6", - "signer": "0x00b69ba135b496b7f17fdfcd50d48b86bb397be6", - "last_updated": "1662527400131", - "jailed": false, - "accum": 567155679 - }, - { - "ID": 132, - "startEpoch": 16217, - "endEpoch": 0, - "nonce": 739, - "power": 9581907, - "pubKey": "0x04841b0cba6c27f4e77bd8a7105f0f0a85e158cccc39487158257d84879c2a6c57c3d8f30be8bc1e3383e6d329db0d9321d6f151b4689c71edb2128c32f43730da", - "signer": "0x0208652a93baf5f1962849efcf5795eac7439a5e", - "last_updated": "1662931200083", - "jailed": false, - "accum": 936587838 - }, - { - "ID": 32, - "startEpoch": 5313, - "endEpoch": 0, - "nonce": 1567, - "power": 13391696, - "pubKey": "0x04d1228cce225214fc1c36c5ac76f6f9e2394de97bee956197f632ebf406469ffe218193ac7425d9b827b1bf6928ba5967043c7e88e09f7ba5f6a45599a115eec2", - "signer": "0x02f70172f7f490653665c9bfac0666147c8af1f5", - "last_updated": "1663134000286", - "jailed": false, - "accum": 1025361070 - }, - { - "ID": 111, - "startEpoch": 11293, - "endEpoch": 0, - "nonce": 379, - "power": 807023, - "pubKey": "0x0407ad4b275b9e9c73c27639e4679c560d473aae0c7fc11b88ffb0d74b9dbb9d9550da8eda54b3a5de8ecdb42c1b6a4757ddfe2277adf03f2e00a7ed7ca0bf97b8", - "signer": "0x0306b7d3095ab008927166cd648a8ca7dbe53f05", - "last_updated": "1663247300138", - "jailed": false, - "accum": 361698999 - }, - { - "ID": 63, - "startEpoch": 7525, - "endEpoch": 0, - "nonce": 130, - "power": 5613457, - "pubKey": "0x04088437a36ee99d2b71955ccf2e1c9ffb32f6edbf206f27cfee1027ae55f9961e2c4eb6c179b88c237db58cc109cc97e10d0114be2aaa232c1e922ce2e16b4ded", - "signer": "0x055bd801ca712b4ddf67db8bc23fb6c8510d52b9", - "last_updated": "1660485900054", - "jailed": false, - "accum": -1528492613 - }, - { - "ID": 125, - "startEpoch": 12242, - "endEpoch": 0, - "nonce": 1439, - "power": 4196034, - "pubKey": "0x04754537eec61d12cd31906c804ce25cf926291974eeb38d638584a0bb6f4cbb36c9c3ff649b32d3aa36a62d01ac2becd243a0dad7f1026397338b3a0e33093842", - "signer": "0x06abe41e26db44ad94fe61db2ce56023347bcf0c", - "last_updated": "1663318000098", - "jailed": false, - "accum": 166947204 - }, - { - "ID": 141, - "startEpoch": 35390, - "endEpoch": 0, - "nonce": 50, - "power": 48310609, - "pubKey": "0x048940a918da7be89d91610753c288312a0c5ac67bf3754c9dc4bbfcc8e50a19a18fa899b0b2d4085c6e33d7637f4afad74769864c4fc32f116ec3e9f2c6448952", - "signer": "0x09385a960a2e0b6b4516d341534da92cb2a50085", - "last_updated": "1648561300077", - "jailed": false, - "accum": -229514930 - }, - { - "ID": 66, - "startEpoch": 7949, - "endEpoch": 0, - "nonce": 315, - "power": 893639, - "pubKey": "0x040166a0206026cf08ba57b2dfe8acdda167b0ab9698021088cbecffc1eade4e204ae455d56ad03916484bdcf44be81155628e466e58fa70afa99dd823b92151f7", - "signer": "0x0f145e3b90e88fceb55ed5bd6cf0b9adfc2223e9", - "last_updated": "1661426100133", - "jailed": false, - "accum": -820547418 - }, - { - "ID": 37, - "startEpoch": 5763, - "endEpoch": 0, - "nonce": 1655, - "power": 222752799, - "pubKey": "0x046996fd88565bd0d4e2bc5162e822bb4fd76126e641d5a240cff1074411f217c6d6503ea7616f10297ce7646c1794cd5ddbc1eaf5b4130f26c43c9c34feb5ee0f", - "signer": "0x127685d6dd6683085da4b6a041efcef1681e5c9c", - "last_updated": "1663244600055", - "jailed": false, - "accum": -1385760491 - }, - { - "ID": 114, - "startEpoch": 11404, - "endEpoch": 0, - "nonce": 527, - "power": 1094788, - "pubKey": "0x044fa9ace6016c6543ec37a6324790633db2d5757fbd02cb784bc15978dc6a1fbcb1b907a2cab94b271d1e58c96ee8432d58fcf9f2fa71f69e5c4216d830b35eb3", - "signer": "0x13a9d78f4712a65678d7735682819b4f4f74253c", - "last_updated": "1662217900041", - "jailed": false, - "accum": 781971470 - }, - { - "ID": 131, - "startEpoch": 16036, - "endEpoch": 0, - "nonce": 976, - "power": 6556335, - "pubKey": "0x04cb7728536d97b5cd3d6442133a9f4867959941b6161db8caf732298181892d184e4e4a95e126d59e9d9838aceac5c43e73d15cdd6cbda04e819697f0e2e15adc", - "signer": "0x160cdef60e786295728a6ea334c091238e474e01", - "last_updated": "1660517600016", - "jailed": false, - "accum": 1786410185 - }, - { - "ID": 55, - "startEpoch": 6878, - "endEpoch": 0, - "nonce": 32, - "power": 5018710, - "pubKey": "0x04ca36a3591de0fe7ced56e611c067bb16eb4038cfc81aa77eaaa101b7753231a3d3bca30a36200a0954703c4a77871c5ca6d73b616e010a639664cbdd412b3816", - "signer": "0x18f371aeee4e2636df789931c9cd43e5d7b72d66", - "last_updated": "1662200200109", - "jailed": false, - "accum": -416613655 - }, - { - "ID": 13, - "startEpoch": 3773, - "endEpoch": 0, - "nonce": 4771, - "power": 27530330, - "pubKey": "0x04bcb9741052a1b818d1c2410b975f5edf7e3a64cabb9f73cad6e8819dad7b1039697bcbd6bf69d9dd5b9d335194b36d1f9fbad329a18bffd6c5e9ec6b7cefd580", - "signer": "0x1ca971963bdb4ba2bf337c90660674acff5beb3f", - "last_updated": "1663428400117", - "jailed": false, - "accum": -878611320 - }, - { - "ID": 36, - "startEpoch": 5596, - "endEpoch": 0, - "nonce": 1040, - "power": 3852946, - "pubKey": "0x04b656d36d057c0c1a6ae8128099088f4e641b9c5d055554642f96bcd690a2dd74b849363296f5b309cd8351380056cefacc7318a1f810559685eaa4699474bc0d", - "signer": "0x1d25c827abd466387bda00b429fe728627d6eee6", - "last_updated": "1663264400317", - "jailed": false, - "accum": 302410836 - }, - { - "ID": 87, - "startEpoch": 9509, - "endEpoch": 0, - "nonce": 923, - "power": 142795407, - "pubKey": "0x0404a438fa6b5033aa83847d283aedc67ca862c4183b837b664489e38f141d9fe92aaee18976acbcbbbaa137ecd350a9fe5b37bb851156f2a077500b5e742ca3ec", - "signer": "0x1efecb61a2f80aa34d3b9218b564a64d05946290", - "last_updated": "1663380400270", - "jailed": false, - "accum": -1349531450 - }, - { - "ID": 92, - "startEpoch": 9991, - "endEpoch": 0, - "nonce": 74, - "power": 116102343, - "pubKey": "0x04877af9e5e26bca4f9063d4baf2803a491fad3219865d9d5fbda6edea5e1c1b4272d4f4704ee167b77091498d6eb8442ef8ab6c2b5a02722b15e0e5ab0ca27a00", - "signer": "0x26c80cc193b27d73d2c40943acec77f4da2c5bd8", - "last_updated": "1633048600271", - "jailed": false, - "accum": 145478901 - }, - { - "ID": 28, - "startEpoch": 5212, - "endEpoch": 0, - "nonce": 891, - "power": 7575264, - "pubKey": "0x04b24d50f05b6e709a93ba13d67484c750e13fb2eba74cd87a373ea21908be274232c703cc30bd66263202a745cfb4f207d5466872abb89f4f75e966d10e4a8bf7", - "signer": "0x28c0d4328520ed7e8657de141eee74a954b07c1f", - "last_updated": "1662687800175", - "jailed": false, - "accum": 565575322 - }, - { - "ID": 75, - "startEpoch": 8322, - "endEpoch": 0, - "nonce": 362, - "power": 14252372, - "pubKey": "0x0441bda7846a4bf03d50ba81e7f082cfb736534e5db7213c10cee08b6e4e12c5460fd10ffe213f599ffa372879e0803240c95dc225f7074bae3c0cf4828d3290fb", - "signer": "0x2c74ca71679cf1299936d6104d825c965448907b", - "last_updated": "1662674700396", - "jailed": false, - "accum": 1650022039 - }, - { - "ID": 45, - "startEpoch": 6295, - "endEpoch": 0, - "nonce": 332, - "power": 933590, - "pubKey": "0x0439a3232e18c22876b20fc1c5fef1b2ce82d5393e7e592622aa271471c6ae0366e69879bcc1c2c19dba0c1b1b7a33bae48ddda6e5d130afb687dd2e6f258d2802", - "signer": "0x30523527aced0ed2f5ce1721086d1d282d3af38f", - "last_updated": "1660988800027", - "jailed": false, - "accum": 869938692 - }, - { - "ID": 64, - "startEpoch": 7791, - "endEpoch": 0, - "nonce": 393, - "power": 15789757, - "pubKey": "0x0434f30e5ed1fbc44c7b41b0134c886097c2ed98d17141ac40e0796a7c4ec93c0c1eceec4160192bcb75997f57f4a2783343883450421ac750f360aba5ac826cb5", - "signer": "0x30dd252c7c150f26a3a06e4eada9e706db3fa58c", - "last_updated": "1660974100018", - "jailed": false, - "accum": -64964178 - }, - { - "ID": 59, - "startEpoch": 7090, - "endEpoch": 0, - "nonce": 269, - "power": 1574537, - "pubKey": "0x047411c3fb72ba4d9d1422c08cf8a565b573352a9e94aeadb0c05bc279ec63c9522a6f7a115b33ce921332d3601a88f735c23239d047b7960ad078d51373d64696", - "signer": "0x3296233d946fb9399ff8bb87215eb312902d6224", - "last_updated": "1660439200093", - "jailed": false, - "accum": 621139121 - }, - { - "ID": 105, - "startEpoch": 10762, - "endEpoch": 0, - "nonce": 859, - "power": 1401924, - "pubKey": "0x047ccefa8460faea3a81b4ce41be62c29ea1cfc1a8fda2b3e4eb634a3c0a8da104a4c916fe0612ba2ae22e3ec9b8521efaaffcda7b05afa4826bd36242ece756cc", - "signer": "0x3a9df5dfcb4cc102ce20d40434a2b1baca9eafd3", - "last_updated": "1662274600078", - "jailed": false, - "accum": 977331356 - }, - { - "ID": 135, - "startEpoch": 17168, - "endEpoch": 0, - "nonce": 605, - "power": 6350401, - "pubKey": "0x04aae35f24c0c10be6892bfd3f0b5f5756b944acbdf3f20e16093829b632b06e166ed8bb9884a1f6fdbf7a8f4f655a69030eed02b61dd44f1b828eadd1cab6d70e", - "signer": "0x3aeb7722c208c8f35fef5ec4f2ebf887beb59360", - "last_updated": "1663109700183", - "jailed": false, - "accum": 2012691944 - }, - { - "ID": 38, - "startEpoch": 5812, - "endEpoch": 0, - "nonce": 423, - "power": 65583613, - "pubKey": "0x046d2b9e512879af19be7fc0e2f886a8206d9e396a423d00b3af9009afe2be783d5fde36984c966fe2ec51c7d7572d6f49faee5a73d3d4d9a9e2382b5d8adc8b5b", - "signer": "0x40314efbc35bc0db441969bce451bf0167efded1", - "last_updated": "1658978400079", - "jailed": false, - "accum": -913043550 - }, - { - "ID": 62, - "startEpoch": 7414, - "endEpoch": 0, - "nonce": 445, - "power": 1408610, - "pubKey": "0x047ad53f370481eb0babe5439180af6942cb6272d3fe2989696a7f630c11752f9209a5714fced679f6981b5a70048f1e7ae05cebafb4df9c63271ac2aaa933a3df", - "signer": "0x406c3fef5969b36231bd573adfc34e16f54d23e0", - "last_updated": "1663275000032", - "jailed": false, - "accum": -901848770 - }, - { - "ID": 73, - "startEpoch": 8291, - "endEpoch": 0, - "nonce": 615, - "power": 15007048, - "pubKey": "0x0445c2815f01217c3e7e730304196f7d72c440387addbf2fb743728e2fbfa6ad585fb2c4d996b3556597f2a845613e9a469caa65934a55c41ca9d982cb9b7075f1", - "signer": "0x414b4b5a2a0e303b89360eda83598ab7702eae04", - "last_updated": "1663275000036", - "jailed": false, - "accum": 492661318 - }, - { - "ID": 40, - "startEpoch": 5889, - "endEpoch": 0, - "nonce": 984, - "power": 2736373, - "pubKey": "0x04fe0e75276f667c335d798e4c11de8a0cb938b41e91d4f184fa11f2cb09845edb5bdc914f4da87db1511ef6ff90727142a6acc3d55d963350962c322879584eaa", - "signer": "0x43c7c14d94197a30a44dab27bfb3eee9e05496d4", - "last_updated": "1663247300142", - "jailed": false, - "accum": -897074073 - }, - { - "ID": 68, - "startEpoch": 8100, - "endEpoch": 0, - "nonce": 98, - "power": 8075050, - "pubKey": "0x04bbd4f850e6ce8ce5069a4bedc8526f482201511ad8dcdecb408916d20e27d92197b28dc91e151f7300125f258f557b8ffc1d2acaf914b258afc0f38873190bb3", - "signer": "0x43cd17fa4c21440d71d34061f9a6aa9f99093049", - "last_updated": "1626624200247", - "jailed": false, - "accum": -191018891 - }, - { - "ID": 20, - "startEpoch": 4384, - "endEpoch": 0, - "nonce": 317, - "power": 10075367, - "pubKey": "0x0420f2d4e8ca210f9976821d94fe9f57410a3800fd54010726c74336a702f7261716186e1f834e247a3ab095aa96af7c3663652ea4c42ae85eea27c2be29cb0970", - "signer": "0x448aa1665fe1fae6d1a00a9209ea62d7dcd81a4b", - "last_updated": "1662671000080", - "jailed": false, - "accum": -1010185131 - }, - { - "ID": 93, - "startEpoch": 9992, - "endEpoch": 0, - "nonce": 143, - "power": 132604614, - "pubKey": "0x04af2b42565d5c22d1353e23936bf32fd0642d2a2c567d866135d2e547fc4679524a2306141bc214c96893ef6c6d312fd5bc3654abbbf3b74ac96180f0c2efab90", - "signer": "0x46a3a41bd932244dd08186e4c19f1a7e48cbcdf4", - "last_updated": "1663080800101", - "jailed": false, - "accum": 1176582365 - }, - { - "ID": 31, - "startEpoch": 5284, - "endEpoch": 0, - "nonce": 506, - "power": 5032071, - "pubKey": "0x04cc7a0adaa5d58b8b9aff67696f52e59541a0d208c22f56097f92522e9e4da98b7dedf2924cbb69e922414bbc090f4e28f6b42a310e96abcef80539a95dba9503", - "signer": "0x48aff66a7a9ce3b8fc4f62c80604bc310edf94cd", - "last_updated": "1662887400293", - "jailed": false, - "accum": -706810798 - }, - { - "ID": 29, - "startEpoch": 5250, - "endEpoch": 0, - "nonce": 643, - "power": 171769, - "pubKey": "0x04c74de15a4e622b0d47958034da5f8376f8f3c36a77fb807e2b6533b9b9445af8c1d9d7271e0e2d1d9e1f1e2976851241452517cd25658a438fad8b908412865e", - "signer": "0x4923de87853e95751a87eafe957a88a564387dac", - "last_updated": "1660044600132", - "jailed": false, - "accum": 1618014099 - }, - { - "ID": 99, - "startEpoch": 10293, - "endEpoch": 0, - "nonce": 203, - "power": 1126270, - "pubKey": "0x043b3772b13e1a2f9d979ebbe62baa8cf9519b1cc7df1342bc52c8486eadadbfe3fe045dcca4871435e2f557bf78ea70adc99b4e933fb7934725ac1f18b81d00db", - "signer": "0x4cb65428d672e5c6932678043887d62da78c9841", - "last_updated": "1663273900108", - "jailed": false, - "accum": 1039632988 - }, - { - "ID": 82, - "startEpoch": 8843, - "endEpoch": 0, - "nonce": 660, - "power": 993383, - "pubKey": "0x0408a8eb34eccba507e5aa16e783e3fd3bc4b70b1d10a8cb3d31674a1b00bfa7968514c584520a8575a4afb4bb25bc10baa97639f1be380dbf3eace482da579258", - "signer": "0x4df34fac8313dcd3442064b90e22129ad82b5103", - "last_updated": "1663098400095", - "jailed": false, - "accum": 188423576 - }, - { - "ID": 107, - "startEpoch": 10844, - "endEpoch": 0, - "nonce": 803, - "power": 2848730, - "pubKey": "0x0499b870beda52248490b5e9ba7c83ffeecff962c49df117389f58ff43fc1412d7d721f0308d1ff0c5b4c401b1e9f873c370277c8cfdd345a38fe426d0feed1eeb", - "signer": "0x55cc129dad4df3771a37770c6c0a469ff51918c8", - "last_updated": "1663366800300", - "jailed": false, - "accum": -1389408060 - }, - { - "ID": 76, - "startEpoch": 8425, - "endEpoch": 0, - "nonce": 588, - "power": 2918688, - "pubKey": "0x047b7d5e1a2291fe1f8f0a8490bcc45c3b77ab9b827925f207373be89b1de47df6bfb2aa5689f0d9a8a2cabeeb90518241e4da39ebe89668d3d4ce56985e5ae808", - "signer": "0x5627fe906f34a53a381a726dbbfff03f65ebcfb5", - "last_updated": "1662399000087", - "jailed": false, - "accum": -1691046113 - }, - { - "ID": 1, - "startEpoch": 0, - "endEpoch": 0, - "nonce": 5328, - "power": 1621831, - "pubKey": "0x043c53ea6e1964e0670dc9ac72b3224207885d4c5f08cabe1e1080c662fdec278e7e833798757cb5cf121447dcd02a15f010eb4aa87cceecb23daa4bf904112e77", - "signer": "0x5973918275c01f50555d44e92c9d9b353cadad54", - "last_updated": "1655746800381", - "jailed": false, - "accum": 1133850513 - }, - { - "ID": 126, - "startEpoch": 12527, - "endEpoch": 0, - "nonce": 524, - "power": 24836625, - "pubKey": "0x049d73839b66cfdecd2ecce0dfaefca77e9ee3a795ad51c752974c24385f904bd51746e04b4c0bdb47469f24bf9a0ba8c89011b65833850f0e589a08ceaf185fb2", - "signer": "0x5b106f49f30620a07b4fbdcebb1e08b70499c851", - "last_updated": "1658982600406", - "jailed": false, - "accum": 1542327747 - }, - { - "ID": 109, - "startEpoch": 10955, - "endEpoch": 0, - "nonce": 979, - "power": 7786835, - "pubKey": "0x04e048dae89bb4235dd4216a54a46312427db9cffb82959f48cba797f04605ee8c47cd9025ae7099cb6bc80deea1bea207a26d4b4ec8ef5c0cd2ed3671acd5ff7f", - "signer": "0x5fe93ddf4490a02257bef079f2498650c97c44de", - "last_updated": "1663216600039", - "jailed": false, - "accum": 1916728091 - }, - { - "ID": 118, - "startEpoch": 11448, - "endEpoch": 0, - "nonce": 1034, - "power": 1961016, - "pubKey": "0x04f5598cea9e86d4cb880e2b9a92cc2935047a717b923caa946cb030c82c30af6adc76ac6f7559b2ae069ad5d4ef7aa7ad2d2a9649baef37ba3967f210bf906495", - "signer": "0x5ffd4effd8e476c72fddc75bcd31f421001f9ce6", - "last_updated": "1662855100148", - "jailed": false, - "accum": 934603989 - }, - { - "ID": 50, - "startEpoch": 6374, - "endEpoch": 0, - "nonce": 90, - "power": 21370243, - "pubKey": "0x045498aeb04c83d70578cfb7d7c6b002c0c5b114261f710457fb17e23033de406ebeb99a95a048abe93416f603295e25ca0d877160845f808b5b6979eff2b0ef69", - "signer": "0x60e274b09f701107a4b3226fcc1376ebda3cdd92", - "last_updated": "1662700800143", - "jailed": false, - "accum": 1055460565 - }, - { - "ID": 108, - "startEpoch": 10917, - "endEpoch": 0, - "nonce": 274, - "power": 6915246, - "pubKey": "0x04b91df3078221d1f13a7fec6d07230f878e3f01c4d3d3ff486c403ae68a95be8048f9738a7772e928a54d4c1da4ccea7d4654590e781037768b87d0dea199aeb9", - "signer": "0x6237b2af1238d12248630ce21aa84f0952122232", - "last_updated": "1662069800183", - "jailed": false, - "accum": 67241053 - }, - { - "ID": 116, - "startEpoch": 11440, - "endEpoch": 0, - "nonce": 711, - "power": 968129, - "pubKey": "0x041e7b1045fa8d8dce5d97d021da9a715499485570bb38d9d72deb1c76fbcb8043f5ed4477cf756e68de3f98d9476db8dbee5707650c91d3d4983af2889ce96a66", - "signer": "0x62fb676db64f87fd1602048106476c6036d44c92", - "last_updated": "1662504300082", - "jailed": false, - "accum": 420314576 - }, - { - "ID": 137, - "startEpoch": 26759, - "endEpoch": 0, - "nonce": 875, - "power": 353620333, - "pubKey": "0x0409d27f3f25b3ce0472d95f74d909596806dfd580ad2a80755075e011d4f77a390bafe5e14470b4f600c3b3d3374b5fc1c7528bf360c6ad621b6b20f9f3990a7f", - "signer": "0x67b94473d81d0cd00849d563c94d0432ac988b49", - "last_updated": "1663041200037", - "jailed": false, - "accum": -455287509 - }, - { - "ID": 86, - "startEpoch": 9484, - "endEpoch": 0, - "nonce": 1120, - "power": 1405042, - "pubKey": "0x04e488ff6fd81fb21f7fc098f727786fd9a3454d0e7a0c48bfdf0cb01228260dbf9d7cfc3ca5bd6706a525973299589baa6ed1c28ab3973bc81477127438eea3bf", - "signer": "0x6b2ed7e4b12a544ca7d215fed85dc16240d64aea", - "last_updated": "1662596800028", - "jailed": false, - "accum": 1001933342 - }, - { - "ID": 19, - "startEpoch": 4369, - "endEpoch": 0, - "nonce": 866, - "power": 46418702, - "pubKey": "0x041a98b875a62e03aa51d60812d57d03b22d51b36cff91cd4070db64c7eb4206a1a4f8b6265f6297045ea5074d997b2d5db0417115a4e5175d10390410c19aadce", - "signer": "0x72f93a2740e00112d5f2cef404c0aa16fae21fa4", - "last_updated": "1663041400047", - "jailed": false, - "accum": 947889603 - }, - { - "ID": 134, - "startEpoch": 16837, - "endEpoch": 0, - "nonce": 2890, - "power": 25434718, - "pubKey": "0x04538ca213d90908572dad1044727dc844ed02012b4016631594dbaa9c152bb3d50fca5d420d803e12c651b36c11ba74b67161b4fec13be305186c264b118568e1", - "signer": "0x73d378cfeaa5cbe8daed64128ebdc91322aa586b", - "last_updated": "1662802300173", - "jailed": false, - "accum": -613052019 - }, - { - "ID": 70, - "startEpoch": 8135, - "endEpoch": 0, - "nonce": 109, - "power": 27019553, - "pubKey": "0x04e3d9d418d82e60dcad162478f8e7d6362c8d584b42c93e4a9e6ad877a941c2b1e58a1571b39c89316e78729ae9190bef889a58e847fe104cff01e1c62cb3ed47", - "signer": "0x742d13f0b2a19c823bdd362b16305e4704b97a38", - "last_updated": "1660970200056", - "jailed": false, - "accum": -1397585917 - }, - { - "ID": 139, - "startEpoch": 33634, - "endEpoch": 0, - "nonce": 164, - "power": 196511793, - "pubKey": "0x0426913137c3778975cf5ceca8ef6e6cc8551e81d98192caf1a0d48cda0c7134e1ffc7583f170520525d007ef8bc609377a457c3f50cb77ffefb1b383aa101fddc", - "signer": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "last_updated": "1661886700085", - "jailed": false, - "accum": -782995311 - }, - { - "ID": 140, - "startEpoch": 34806, - "endEpoch": 0, - "nonce": 1, - "power": 100, - "pubKey": "0x0452f78223250eb6f4a9b8827578b3b84ffcb1102d1cbbdfce2b15bb4277496961baa4776b4cba23f5a80cfe816ab9e19b899cd8c139b7031798c39f2fef3f836b", - "signer": "0x7ab5d38b454e50e31df0e9333564acb3541a7c4a", - "last_updated": "1527076600026", - "jailed": false, - "accum": -2237398768 - }, - { - "ID": 72, - "startEpoch": 8285, - "endEpoch": 0, - "nonce": 3032, - "power": 224952502, - "pubKey": "0x0449b4c834634c6893da4ab09f54f4167388ff229d4002e92665a625e30b07feca3aa907e1234e5fa032e8f1cd277caf3d392513ac8a40e288a9da45bb206ed02c", - "signer": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "last_updated": "1662886600331", - "jailed": false, - "accum": -113116473 - }, - { - "ID": 16, - "startEpoch": 4114, - "endEpoch": 0, - "nonce": 198, - "power": 1034257, - "pubKey": "0x04ea262816cc0e5ef341aaadd1a295ec6fc65afc46921baa86aface3bfc11df179ba5825b143913e43438952f954c3a34a9d6bc8633ebd67d25d498f3bf472f356", - "signer": "0x7e8024132d07e3e69c9bc2012dffe300b9c5807d", - "last_updated": "1659749200067", - "jailed": false, - "accum": 910694118 - }, - { - "ID": 47, - "startEpoch": 6312, - "endEpoch": 0, - "nonce": 819, - "power": 4621721, - "pubKey": "0x04fcaec0ba14512a24f110d9c96988372189cd1879092f35078f89676a93a8ab37e887d8caf3c1cbd5512dcf4f90de4b25e151e8ad2db7bcf7271acfbb62062e47", - "signer": "0x83d69448f88bf9c701c1b93f43e1f753d39b2632", - "last_updated": "1663055600075", - "jailed": false, - "accum": 398636180 - }, - { - "ID": 106, - "startEpoch": 10783, - "endEpoch": 0, - "nonce": 749, - "power": 4961107, - "pubKey": "0x04c93dfd11c637c9e4bd5bd0b4e9f5e25dbc0ea790dbdde7657a6147aa1d54fd8295e2f7683e614d68939121d59dfd375e419956be54bf767ecb8d1123559d2bc7", - "signer": "0x88c5e96c1459d224383dcb1fe0cedd1fcee25ffb", - "last_updated": "1662242400154", - "jailed": false, - "accum": -833201441 - }, - { - "ID": 133, - "startEpoch": 16443, - "endEpoch": 0, - "nonce": 927, - "power": 3395273, - "pubKey": "0x04ee62945cef0b885c98781802dfdaab67e7104cc3010fa73bf179a5dfcea50aec410c6e07160576daf0ba5ce8885e78de575933b55b36eb23121ddf8a7831fb38", - "signer": "0x8bbf92f4da9be0478464a077f582abd7b6df193c", - "last_updated": "1662876000144", - "jailed": false, - "accum": 702568721 - }, - { - "ID": 9, - "startEpoch": 2878, - "endEpoch": 0, - "nonce": 595, - "power": 17317575, - "pubKey": "0x0466d071600a26ff3c046afb7f556ec840b39f5bf1a27660a5f739f48970807e80b1d4125473ffd52eb494fd07255777ce19865590837da46edaa50f77d4471204", - "signer": "0x8cb120478e9503760656c1fcac9c1539158bdb55", - "last_updated": "1662802900102", - "jailed": false, - "accum": 2071967870 - }, - { - "ID": 112, - "startEpoch": 11391, - "endEpoch": 0, - "nonce": 336, - "power": 208849, - "pubKey": "0x04fa7ae89ef582165552d6507c4d8ed26624a38671de6c1f41278b178a869a3204ad276093f2291260bfdb7a46d9499deda25029218809313c6c544bba7b58acb6", - "signer": "0x8e35263b1ed592f585c8b8d1f3abacd2de247923", - "last_updated": "1662562400060", - "jailed": false, - "accum": -965568259 - }, - { - "ID": 26, - "startEpoch": 5127, - "endEpoch": 0, - "nonce": 297, - "power": 11235600, - "pubKey": "0x0480b48e24338369cd3c10913d26fdbcf57b6133291a28c2392b36b38dbd0b37c44e077f4551efce25ef13f138b899e4c3bfedc6ea43d52b893546db45b971e9f0", - "signer": "0x8e9700392f9246a6c5b32ee3ecef586f156ed683", - "last_updated": "1663089900215", - "jailed": false, - "accum": -110616937 - }, - { - "ID": 79, - "startEpoch": 8683, - "endEpoch": 0, - "nonce": 829, - "power": 13296529, - "pubKey": "0x04050e946ae40dcb277af26c22338f89b7e5912a435f45ee63293367e977ce26fe437a855204b4de9396dfc7cee6b8d92be26a37235e2afcd9baa0551f27b2ebd9", - "signer": "0x90b11143a0cb64e067402307bc7f2276dcec8250", - "last_updated": "1662674700401", - "jailed": false, - "accum": -70065051 - }, - { - "ID": 42, - "startEpoch": 5958, - "endEpoch": 0, - "nonce": 456, - "power": 707167, - "pubKey": "0x041dec50455dec8b1e2dde8062e90a1cc1ea69dfeea23415bced071b21f31a4d287d7e3ef7f6703f79fa7e57fc2b929e001a12342a007e6b27d86498abf3e7a034", - "signer": "0x91935751ba30494c4fd276adcf134ecd66f8eca6", - "last_updated": "1663062800076", - "jailed": false, - "accum": 652718518 - }, - { - "ID": 120, - "startEpoch": 11556, - "endEpoch": 0, - "nonce": 558, - "power": 2363325, - "pubKey": "0x04dc5de4ecc100f12fd467e9674e2894b4061118e210d3bd19ce53feb5e6df24ce1811fc198340d06ce9f275eb5b764b7d864c8818324d161a4ecdcb81b910e5e2", - "signer": "0x951c881cab59ed669915a2b04ea5721600794ec3", - "last_updated": "1643339300024", - "jailed": false, - "accum": -845098308 - }, - { - "ID": 117, - "startEpoch": 11447, - "endEpoch": 0, - "nonce": 406, - "power": 14007964, - "pubKey": "0x041506bd87d2844fe8bb60ca3f7f286ca9991fb17483917668114fcc7d42a701f95e6a83524bbddd7b5cf2010b8ec55b47793d6d179bf547a5504a3ebf0b9cd0ba", - "signer": "0x959a4d857b7071c38878beb9dc77051b5fed1dfd", - "last_updated": "1662674700391", - "jailed": false, - "accum": 364558010 - }, - { - "ID": 128, - "startEpoch": 12623, - "endEpoch": 0, - "nonce": 5107, - "power": 29851118, - "pubKey": "0x0416552133948883a45e5c7967441a889ac6c48fad900b5b8b321d46ee13d5a90f065e36c517747400400f697630cdd94b898cccbddab79019edfa36fd59833744", - "signer": "0x959c65b72147faf3450d8b50a0de57e72ffc5e0d", - "last_updated": "1663272500167", - "jailed": false, - "accum": -582065137 - }, - { - "ID": 12, - "startEpoch": 3738, - "endEpoch": 0, - "nonce": 134, - "power": 14515910, - "pubKey": "0x044bc95f26db29fd21204871f7011a4606ae8253f879cc1a988b0858e2d95894d4fe2bb18d46cda7859367ffea3344ebdf960b0ac073023635aadcb59f47b0a79c", - "signer": "0x98c27cc3f0301b6272049dc3f972e2f542780629", - "last_updated": "1662448200118", - "jailed": false, - "accum": 453224261 - }, - { - "ID": 129, - "startEpoch": 13216, - "endEpoch": 0, - "nonce": 228, - "power": 3977003, - "pubKey": "0x0427ca49d47de88f14492b240602913b155c372d0c8bb77e3e1d9da7c7466cfcd8992c0cc0deb2887abcd88fef8836170110df807508b5e3f90dba2d14b0c65a71", - "signer": "0x9c56f33b968f83922bccf6d7689b9c883af9de49", - "last_updated": "1658826600143", - "jailed": false, - "accum": -1485483632 - }, - { - "ID": 18, - "startEpoch": 4252, - "endEpoch": 0, - "nonce": 445, - "power": 419670128, - "pubKey": "0x04127513ffb9cae0800d8894b4fcf5c5763fe7c52b30a3b488a5507e31ff00f693b4cb26dea3ec5be0c33506a7f0ee87364ac6a5c259bb60498cc03c5900f55860", - "signer": "0x9ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0", - "last_updated": "1662754700132", - "jailed": false, - "accum": -651263706 - }, - { - "ID": 146, - "startEpoch": 40578, - "endEpoch": 0, - "nonce": 61, - "power": 674088, - "pubKey": "0x048aaa75c5817eb487379b1047dfc46d4d4a300186028b96d41070f6430fd0eb001348ba9c6f7406e9b7cb76d96b52f2cfc5af6492e7adec443182875cd5891f85", - "signer": "0xa38f3504e661d2b152adaf197ba5057c911c879b", - "last_updated": "1662106800325", - "jailed": false, - "accum": -1864558684 - }, - { - "ID": 14, - "startEpoch": 3816, - "endEpoch": 0, - "nonce": 135, - "power": 3630672, - "pubKey": "0x040572f6bac2320d4ea912b99ce6828cd8dd3e0d3471f8102df7b05dd8ad8791a53e00f74b6f89499e5d0c0f8254a33d85947486afe02565430b9345e1c24bc2dd", - "signer": "0xa5d5a7c2ebd2a381f7e958754c0d6a2d469b131b", - "last_updated": "1663191000107", - "jailed": false, - "accum": -480666511 - }, - { - "ID": 148, - "startEpoch": 42122, - "endEpoch": 0, - "nonce": 2, - "power": 101, - "pubKey": "0x04f506761ba8c351e8b9e082340c7f7fde107c6b65663894cdfe2e7b0bcf48968b7d348731ec2c20401462867c439f3461ba8a5c8818be1a724fdfd798ab8ff20e", - "signer": "0xa8b52f02108aa5f4b675bdcc973760022d7c6020", - "last_updated": "1657746200106", - "jailed": false, - "accum": -3976202857 - }, - { - "ID": 23, - "startEpoch": 4481, - "endEpoch": 0, - "nonce": 743, - "power": 2195314, - "pubKey": "0x042171f29c1d106bd66bf5ccc471c96dea2f43a9589e3a72622cf4667f76440f6f1a681040f36247c4f810ebbfac7fe6a6e79eb542d3e0ca3f26a332b2183eea6c", - "signer": "0xa972652c63dce1705ce73e956fb523b4bd1239b0", - "last_updated": "1662185000062", - "jailed": false, - "accum": 1542636967 - }, - { - "ID": 130, - "startEpoch": 13645, - "endEpoch": 0, - "nonce": 3160, - "power": 11765058, - "pubKey": "0x04a071c51312f90322fd714ec8c769a01ebdc9bdb2d80922ff4cdaebe0d02c159d5f649bc6f49f6af1d8c7f7a87be55041b334d4c6353997f2cd9501b0fb0bbaa3", - "signer": "0xb2dd091ea6e591d62f565d7a18ce2a7640add227", - "last_updated": "1662070100258", - "jailed": false, - "accum": -770784153 - }, - { - "ID": 149, - "startEpoch": 42122, - "endEpoch": 0, - "nonce": 2, - "power": 13, - "pubKey": "0x045cddfebb55e0e8286e374d5f2c80ca8076b782ce172ffa80ad529b4a0b011be9ae4f5d2b9926bef4eb529431c6a70cc2875b163fccdd531e6ad66ffe30733e7d", - "signer": "0xb38b208c79855404c56025aca4a4ffa8da6f4810", - "last_updated": "1657017200095", - "jailed": false, - "accum": -3976340325 - }, - { - "ID": 4, - "startEpoch": 0, - "endEpoch": 0, - "nonce": 2739, - "power": 2025453, - "pubKey": "0x04b4e1d56b3429f7756452426be611e595debcb858d59f47d29ec9dd6e4b547dce1539f9b7144420bc309de496b70d6dc5f13345eee85e6b7fb332cd9f364ef12f", - "signer": "0xb702f1c9154ac9c08da247a8e30ee6f2f3373f41", - "last_updated": "1656828300069", - "jailed": false, - "accum": 580975146 - }, - { - "ID": 2, - "startEpoch": 0, - "endEpoch": 0, - "nonce": 2759, - "power": 1877419, - "pubKey": "0x04d6b06c725f5410e4ccbd65906ece180364ebea4902b21232c1fb5892a76be7eec22480397d6bf653e9abe7ac50435ee472b59364fe78b17acb2be2116f92a76f", - "signer": "0xb8bb158b93c94ed35c1970d610d1e2b34e26652c", - "last_updated": "1621137900064", - "jailed": false, - "accum": 1801783434 - }, - { - "ID": 77, - "startEpoch": 8565, - "endEpoch": 0, - "nonce": 1576, - "power": 14822358, - "pubKey": "0x04181ff8d843c85b3773504bb7a693378eed4a2137a6a8c75d91c5acb3d97876cc4155d0889d389204774aae71eb2288181252aebb78b52592c4feba35224de204", - "signer": "0xb95d435df3f8b2a8d8b9c2b7c8766c9ae6ed8cc9", - "last_updated": "1663208800036", - "jailed": false, - "accum": -837093654 - }, - { - "ID": 121, - "startEpoch": 11581, - "endEpoch": 0, - "nonce": 6168, - "power": 88788617, - "pubKey": "0x04e92bbc619154b3086f099a285ff441b7e62d021abe597fa5639a082679a65c09c62640c761f436f33e398761a07987f4214d0f25b8a50b908436e04a223585e1", - "signer": "0xb9ede6f94d192073d8eaf85f8db677133d483249", - "last_updated": "1663352400137", - "jailed": false, - "accum": -29246504 - }, - { - "ID": 144, - "startEpoch": 40092, - "endEpoch": 0, - "nonce": 5, - "power": 674, - "pubKey": "0x040147400eaa0f2082cbfca8d965f35fc728e1490716dce8e377babbb20924306639fa0ad77c50224211c13935b37d4b4e7c5cfac707dba7d3517e8d8212df3376", - "signer": "0xbac24ee20b56dc01a87a678c54a5f27d302d1edc", - "last_updated": "1661067900251", - "jailed": false, - "accum": -3500795126 - }, - { - "ID": 123, - "startEpoch": 11807, - "endEpoch": 0, - "nonce": 2389, - "power": 28658440, - "pubKey": "0x0476ecb34921018cb5359fc16a8e676cf055e5b155a45a51dcb23c29c161432b037ff1bb8b44a190d367202c0b6d64783858e4c3f232cfc75836e81e1f30e8d1b0", - "signer": "0xbc6044f4a1688d8b8596a9f7d4659e09985eebe6", - "last_updated": "1663310700067", - "jailed": false, - "accum": 7702741 - }, - { - "ID": 91, - "startEpoch": 9990, - "endEpoch": 0, - "nonce": 150, - "power": 124088098, - "pubKey": "0x04f4efb1dc25cf3653a408e3640a13d11855bc2cd9957976d793a18491d674c99bd410312bf891f4eb87e37cea6372ddd31e60fb0eb255e197a52be71eaef62b67", - "signer": "0xbdbd4347b082d9d6bdf2da4555a37ce52a2e2120", - "last_updated": "1647620200020", - "jailed": false, - "accum": 1198318763 - }, - { - "ID": 147, - "startEpoch": 41108, - "endEpoch": 0, - "nonce": 33, - "power": 918373, - "pubKey": "0x049e5341f9fc5c62d7e9808f139edcf2c9cf759231109c5dfd017623abdd5c29333eb28ef0c41e8db2ef603c66ee2846236de7d2bb98b8ba51763e45c207742263", - "signer": "0xc063fd85702b3e0e1845b2a490d12c39d19a9ccb", - "last_updated": "1661158400107", - "jailed": false, - "accum": -2363203095 - }, - { - "ID": 34, - "startEpoch": 5457, - "endEpoch": 0, - "nonce": 447, - "power": 15658600, - "pubKey": "0x04071930b3d77174fae43dcfbfba3079081c8ae3788cf00e758fc74e19da7cbc651be23673b027ca85570d021789a87d3ac6e04e71140ac4d8c09dd35ddda52b47", - "signer": "0xc35649ae99be820c7b200a0add09b96d7032d232", - "last_updated": "1663418300269", - "jailed": false, - "accum": -1285240451 - }, - { - "ID": 30, - "startEpoch": 5280, - "endEpoch": 0, - "nonce": 2330, - "power": 33687148, - "pubKey": "0x04e039bb399a4b185f97d3842b01b3fe86e794bbfe39d7110b75dd0727d69eb8114ac573ba9cb1fb34d7b944253dfa9832276902a283ff39605bc27639d7404f80", - "signer": "0xc6869257205e20c2a43cb31345db534aecb49f6e", - "last_updated": "1662744000096", - "jailed": false, - "accum": 1909609232 - }, - { - "ID": 138, - "startEpoch": 27049, - "endEpoch": 0, - "nonce": 1044, - "power": 3946646, - "pubKey": "0x04df13003e52b6241084db11a329767e9695e0b502b5f695c8178f8cc1b8ceb3ddcf5208b064d108c025f7f61db6e389c7a7b618696886b4aaba56bd9d981cb8e4", - "signer": "0xcfb5ea41788c1d539b6fd760cf26d688ae0331ff", - "last_updated": "1662998900096", - "jailed": false, - "accum": 289719394 - }, - { - "ID": 22, - "startEpoch": 4450, - "endEpoch": 0, - "nonce": 598, - "power": 3425873, - "pubKey": "0x0459b51c20aa5aa182852314c5b92d5a2cad131d1570184158bd00777be386b13732cd9ecbbefd2edf75079bd245e39ffbf9fef7a04586ec7643abe63d481c8fb8", - "signer": "0xd2e4be547b21e99a668f81eecf0298471a19808f", - "last_updated": "1663043300077", - "jailed": false, - "accum": -574156325 - }, - { - "ID": 41, - "startEpoch": 5911, - "endEpoch": 0, - "nonce": 513, - "power": 2415537, - "pubKey": "0x04690010a73742050da4ffaa1bae9a0b2188bce80d3f29ce43f6223c024e516110ee142d694f2fcc9b025ea48aca9191e015922fd442d8cd17c87ecab1ad3e5434", - "signer": "0xd48611f40a37623bbcf9f047b8538177d879bad0", - "last_updated": "1659692500333", - "jailed": false, - "accum": 919808176 - }, - { - "ID": 8, - "startEpoch": 2539, - "endEpoch": 0, - "nonce": 228, - "power": 20080652, - "pubKey": "0x043171932c1a17af7256fe0951d1d8a69f7be98207c0fbbcda87a62d3fb341fc0430ebd33f385759c6283af5698f595ffab12424f59d5be241ffe528def8583847", - "signer": "0xd56fbe3294ea4d73cca99ff8751ce7bd9b688cd5", - "last_updated": "1659749200071", - "jailed": false, - "accum": -797893566 - }, - { - "ID": 145, - "startEpoch": 40578, - "endEpoch": 0, - "nonce": 12, - "power": 691424, - "pubKey": "0x0454ed813a37d26a57c1272bc814ef4b44c4aa1ad8cd678d17bb19d0be5c0bec413e546ed6ab7803982bca0c5bbc759781b6758ccb5642069fcc2742a1526719e7", - "signer": "0xd6dbd84137d9337b01583b1c23c14b1d0da8e1cd", - "last_updated": "1653889000105", - "jailed": false, - "accum": -815236481 - }, - { - "ID": 10, - "startEpoch": 3195, - "endEpoch": 0, - "nonce": 839, - "power": 16520070, - "pubKey": "0x043fef3dbac0ac22f7261d9f5b71671bdd6ac3b024d7a8a4d63b4fe9a8b3abba68063161f364fc2feedea2dfe1daea59bd2715a9991fbe5c6e7b9b34a46323d132", - "signer": "0xde8da1ee512529b6c61fe7c769affc160308dea2", - "last_updated": "1661705100220", - "jailed": false, - "accum": 610091937 - }, - { - "ID": 98, - "startEpoch": 10224, - "endEpoch": 0, - "nonce": 279, - "power": 1912301, - "pubKey": "0x045c242a0228b3956b89132fc9ad810de460285adc17a5ed19f6e9bd2c92b2a53384f0416d336e8fc3924542a6069ed17e1fa532ed93f872a818f65a02f66b7e32", - "signer": "0xe05ae0e76f582817c9e31d9c1a5c02287a31d689", - "last_updated": "1657980300058", - "jailed": false, - "accum": -956614810 - }, - { - "ID": 95, - "startEpoch": 10035, - "endEpoch": 0, - "nonce": 301, - "power": 2695910, - "pubKey": "0x04c462bb3fb7258f31a631cd4d0d73017e1ab5ce7aed4330352de8ffd2b39a301ab3fff59fc2073b92b9c6f4fc2f7e487cd31498604c2fe9dd6c0e4fa117278305", - "signer": "0xe0b1a1d599a66407556171b073003ef854f5d2bd", - "last_updated": "1663206500157", - "jailed": false, - "accum": 1752956950 - }, - { - "ID": 101, - "startEpoch": 10561, - "endEpoch": 0, - "nonce": 430, - "power": 687652, - "pubKey": "0x043d33f282f64a03d8ea84908c07bdf1ec81c4c6ccdea46a5562e67e8aef14009c9b13489177964a63de768f2aeb0f885e5e40a9c0e6a816b01267419d6f495cee", - "signer": "0xe296cf6511ab951e026c620fb0e266db4d6de4a0", - "last_updated": "1662845100106", - "jailed": false, - "accum": -130269986 - }, - { - "ID": 102, - "startEpoch": 10626, - "endEpoch": 0, - "nonce": 213, - "power": 4328673, - "pubKey": "0x0439ff7824e759b9ace75ff977d86fb6d54cd9a67ac87d9ed72850b68a1cec7bdbaa3d9ab87881b50f870d5095dece87077f98f417a05333306dc55924b703a370", - "signer": "0xe63727cb2b3a8d6e3a2d1df4990f441938b67a34", - "last_updated": "1656454600056", - "jailed": false, - "accum": 1805846128 - }, - { - "ID": 15, - "startEpoch": 4061, - "endEpoch": 0, - "nonce": 1859, - "power": 5552161, - "pubKey": "0x04053015a485e04c39236b3cf0dd4f0a8d50f4cdca2e806725ba5c732d098a5e156d1bfa6f8ce2189e12dd91378c723dc63a408794410365d181971b52f511bc68", - "signer": "0xe77bbfd8ed65720f187efdd109e38d75eaca7385", - "last_updated": "1634531300030", - "jailed": false, - "accum": 1795612032 - }, - { - "ID": 94, - "startEpoch": 9992, - "endEpoch": 0, - "nonce": 363, - "power": 106323801, - "pubKey": "0x046ff196614c2398bc7e2c0a95a8be5ee41604e3f5e678afc642cb7f982386433142b7f7320affa049cb2840b431f40b28ce0796c68f21d2198bf2a91a961b6925", - "signer": "0xe7e2cb8c81c10ff191a73fe266788c9ce62ec754", - "last_updated": "1655891500054", - "jailed": false, - "accum": 249991940 - }, - { - "ID": 122, - "startEpoch": 11587, - "endEpoch": 0, - "nonce": 3935, - "power": 16118602, - "pubKey": "0x042e117dcc774659d4b6f3ee3bc520cbd22550c4683f299f3e43e36512b25d829f2bfe6208f00254b9eaa1a4df2683f809c6485e91b3d556022f2105f275913f73", - "signer": "0xeb4f2a75cac4bbcb4d71c252e4cc80eb80bb3a34", - "last_updated": "1663050200129", - "jailed": false, - "accum": -92901584 - }, - { - "ID": 85, - "startEpoch": 9444, - "endEpoch": 0, - "nonce": 559, - "power": 1072060, - "pubKey": "0x045ba6177072c47f1e278794701b9cbeb851b8c9807964bae23ca85f2be762286182319503c1fbd93fe53d5095b352e81077473113ee2bf1637222f439a56b18a3", - "signer": "0xeb578c32a783dccac4b3abffc5b993ceea621012", - "last_updated": "1662714200040", - "jailed": false, - "accum": -280601546 - }, - { - "ID": 27, - "startEpoch": 5208, - "endEpoch": 0, - "nonce": 331, - "power": 152849094, - "pubKey": "0x044960885bd1248f632673bf276aafaae6242043e36828f671cd2c9cf83e1e284426ef7df53ab5f203fc016ffac62754e8cfd9aca3379bc93f748a327ff1b19cd6", - "signer": "0xec20607aa654d823dd01beb8780a44863c57ed07", - "last_updated": "1659894900050", - "jailed": false, - "accum": 1993935620 - }, - { - "ID": 100, - "startEpoch": 10294, - "endEpoch": 0, - "nonce": 153, - "power": 1038832, - "pubKey": "0x04639a77f115238bdf590f66f42554fa38ec45da11911399b1d200605f469464d590e3569325c090f9001eaecb3606e72aeed748e90496f2e1876829285e2b6737", - "signer": "0xedc0b61948531e1962517869bdbef9abf0ffd645", - "last_updated": "1658696300078", - "jailed": false, - "accum": 726166736 - }, - { - "ID": 142, - "startEpoch": 36337, - "endEpoch": 0, - "nonce": 7950, - "power": 215349055, - "pubKey": "0x0400c81a10aad5f1452ee90b4d41f8b6bb4e04bbdd6c3c42475a0fb74ef4437f3ff8ae75dcfa92ed2c89d7dd81a41ccc47d5a6eb81b7b7bb78ea0dbbda1740917e", - "signer": "0xeedba2484aaf940f37cd3cd21a5d7c4a7dafbfc0", - "last_updated": "1663397900045", - "jailed": false, - "accum": -171214624 - }, - { - "ID": 88, - "startEpoch": 9841, - "endEpoch": 0, - "nonce": 646, - "power": 62586081, - "pubKey": "0x04f942d6ca3d87de9b0767262db4363758753bdb2dbed83a65b1b731c60a8ecf9be0a9cb70547bae211875f7965df789da6177692f200b403d6fdfde92283a9a98", - "signer": "0xef46d5fe753c988606e6f703260d816af53b03eb", - "last_updated": "1663003900137", - "jailed": false, - "accum": -1097411417 - }, - { - "ID": 110, - "startEpoch": 11050, - "endEpoch": 0, - "nonce": 13466, - "power": 228034306, - "pubKey": "0x040e6465dce45cd815f1590fa6e7eb7850977e2a06c26cbba3df31787133b2b996cbaa25e68770175e460d8afccae2bafcd8d018f4b9d2d210f82507d78f58bac3", - "signer": "0xf0245f6251bef9447a08766b9da2b07b28ad80b0", - "last_updated": "1663357200099", - "jailed": false, - "accum": 662335357 - }, - { - "ID": 3, - "startEpoch": 0, - "endEpoch": 0, - "nonce": 3101, - "power": 1633901, - "pubKey": "0x040600efda73e1404b0c596e08c78c5ed51631fc173e5f39d21deeddd5712fcd7d6d440c53d211eb48b03063a05b2c0c0eb084053dfcf1c6540def705c8e028456", - "signer": "0xf84c74dea96df0ec22e11e7c33996c73fcc2d822", - "last_updated": "1625013400041", - "jailed": false, - "accum": 496848945 - }, - { - "ID": 143, - "startEpoch": 37140, - "endEpoch": 0, - "nonce": 207, - "power": 4948196, - "pubKey": "0x0493dde87799c59af1726172f6a797032ce5394202ed3f28dcbe41bd596b071ed722be95ac8db7a79c5b926471e3ce3d23dcd201d21797383e489a53c218dbdd13", - "signer": "0xf8b527d500e0d1387d5f9d8cb23868bbb90e4bca", - "last_updated": "1663119300441", - "jailed": false, - "accum": -1445413774 - }, - { - "ID": 54, - "startEpoch": 6810, - "endEpoch": 0, - "nonce": 551, - "power": 13268669, - "pubKey": "0x04be2d1cdedae233fee1f65abe5d64d9f8ecc42acf533caae558d306e8b43e5b55dc942263c46e2fc4892427f30bb684a5edcec7382f8aeb8b12eabbf3eaf41069", - "signer": "0xfb960a9450fc2f5dc8c6b1172932b678e287835f", - "last_updated": "1663128400209", - "jailed": false, - "accum": 1038901361 - } - ], - "proposer": { - "ID": 37, - "startEpoch": 5763, - "endEpoch": 0, - "nonce": 1655, - "power": 222752799, - "pubKey": "0x046996fd88565bd0d4e2bc5162e822bb4fd76126e641d5a240cff1074411f217c6d6503ea7616f10297ce7646c1794cd5ddbc1eaf5b4130f26c43c9c34feb5ee0f", - "signer": "0x127685d6dd6683085da4b6a041efcef1681e5c9c", - "last_updated": "1663244600055", - "jailed": false, - "accum": -1385760491 - } - }, - "selected_producers": [ - { - "ID": 125, - "startEpoch": 12242, - "endEpoch": 0, - "nonce": 1439, - "power": 1, - "pubKey": "0x04754537eec61d12cd31906c804ce25cf926291974eeb38d638584a0bb6f4cbb36c9c3ff649b32d3aa36a62d01ac2becd243a0dad7f1026397338b3a0e33093842", - "signer": "0x06abe41e26db44ad94fe61db2ce56023347bcf0c", - "last_updated": "1663318000098", - "jailed": false, - "accum": 0 - }, - { - "ID": 37, - "startEpoch": 5763, - "endEpoch": 0, - "nonce": 1655, - "power": 4, - "pubKey": "0x046996fd88565bd0d4e2bc5162e822bb4fd76126e641d5a240cff1074411f217c6d6503ea7616f10297ce7646c1794cd5ddbc1eaf5b4130f26c43c9c34feb5ee0f", - "signer": "0x127685d6dd6683085da4b6a041efcef1681e5c9c", - "last_updated": "1663244600055", - "jailed": false, - "accum": 0 - }, - { - "ID": 87, - "startEpoch": 9509, - "endEpoch": 0, - "nonce": 923, - "power": 2, - "pubKey": "0x0404a438fa6b5033aa83847d283aedc67ca862c4183b837b664489e38f141d9fe92aaee18976acbcbbbaa137ecd350a9fe5b37bb851156f2a077500b5e742ca3ec", - "signer": "0x1efecb61a2f80aa34d3b9218b564a64d05946290", - "last_updated": "1663380400270", - "jailed": false, - "accum": 0 - }, - { - "ID": 92, - "startEpoch": 9991, - "endEpoch": 0, - "nonce": 74, - "power": 1, - "pubKey": "0x04877af9e5e26bca4f9063d4baf2803a491fad3219865d9d5fbda6edea5e1c1b4272d4f4704ee167b77091498d6eb8442ef8ab6c2b5a02722b15e0e5ab0ca27a00", - "signer": "0x26c80cc193b27d73d2c40943acec77f4da2c5bd8", - "last_updated": "1633048600271", - "jailed": false, - "accum": 0 - }, - { - "ID": 64, - "startEpoch": 7791, - "endEpoch": 0, - "nonce": 393, - "power": 1, - "pubKey": "0x0434f30e5ed1fbc44c7b41b0134c886097c2ed98d17141ac40e0796a7c4ec93c0c1eceec4160192bcb75997f57f4a2783343883450421ac750f360aba5ac826cb5", - "signer": "0x30dd252c7c150f26a3a06e4eada9e706db3fa58c", - "last_updated": "1660974100018", - "jailed": false, - "accum": 0 - }, - { - "ID": 38, - "startEpoch": 5812, - "endEpoch": 0, - "nonce": 423, - "power": 2, - "pubKey": "0x046d2b9e512879af19be7fc0e2f886a8206d9e396a423d00b3af9009afe2be783d5fde36984c966fe2ec51c7d7572d6f49faee5a73d3d4d9a9e2382b5d8adc8b5b", - "signer": "0x40314efbc35bc0db441969bce451bf0167efded1", - "last_updated": "1658978400079", - "jailed": false, - "accum": 0 - }, - { - "ID": 93, - "startEpoch": 9992, - "endEpoch": 0, - "nonce": 143, - "power": 2, - "pubKey": "0x04af2b42565d5c22d1353e23936bf32fd0642d2a2c567d866135d2e547fc4679524a2306141bc214c96893ef6c6d312fd5bc3654abbbf3b74ac96180f0c2efab90", - "signer": "0x46a3a41bd932244dd08186e4c19f1a7e48cbcdf4", - "last_updated": "1663080800101", - "jailed": false, - "accum": 0 - }, - { - "ID": 108, - "startEpoch": 10917, - "endEpoch": 0, - "nonce": 274, - "power": 1, - "pubKey": "0x04b91df3078221d1f13a7fec6d07230f878e3f01c4d3d3ff486c403ae68a95be8048f9738a7772e928a54d4c1da4ccea7d4654590e781037768b87d0dea199aeb9", - "signer": "0x6237b2af1238d12248630ce21aa84f0952122232", - "last_updated": "1662069800183", - "jailed": false, - "accum": 0 - }, - { - "ID": 137, - "startEpoch": 26759, - "endEpoch": 0, - "nonce": 875, - "power": 7, - "pubKey": "0x0409d27f3f25b3ce0472d95f74d909596806dfd580ad2a80755075e011d4f77a390bafe5e14470b4f600c3b3d3374b5fc1c7528bf360c6ad621b6b20f9f3990a7f", - "signer": "0x67b94473d81d0cd00849d563c94d0432ac988b49", - "last_updated": "1663041200037", - "jailed": false, - "accum": 0 - }, - { - "ID": 139, - "startEpoch": 33634, - "endEpoch": 0, - "nonce": 164, - "power": 1, - "pubKey": "0x0426913137c3778975cf5ceca8ef6e6cc8551e81d98192caf1a0d48cda0c7134e1ffc7583f170520525d007ef8bc609377a457c3f50cb77ffefb1b383aa101fddc", - "signer": "0x794e44d1334a56fea7f4df12633b88820d0c5888", - "last_updated": "1661886700085", - "jailed": false, - "accum": 0 - }, - { - "ID": 72, - "startEpoch": 8285, - "endEpoch": 0, - "nonce": 3032, - "power": 3, - "pubKey": "0x0449b4c834634c6893da4ab09f54f4167388ff229d4002e92665a625e30b07feca3aa907e1234e5fa032e8f1cd277caf3d392513ac8a40e288a9da45bb206ed02c", - "signer": "0x7c7379531b2aee82e4ca06d4175d13b9cbeafd49", - "last_updated": "1662886600331", - "jailed": false, - "accum": 0 - }, - { - "ID": 26, - "startEpoch": 5127, - "endEpoch": 0, - "nonce": 297, - "power": 1, - "pubKey": "0x0480b48e24338369cd3c10913d26fdbcf57b6133291a28c2392b36b38dbd0b37c44e077f4551efce25ef13f138b899e4c3bfedc6ea43d52b893546db45b971e9f0", - "signer": "0x8e9700392f9246a6c5b32ee3ecef586f156ed683", - "last_updated": "1663089900215", - "jailed": false, - "accum": 0 - }, - { - "ID": 18, - "startEpoch": 4252, - "endEpoch": 0, - "nonce": 445, - "power": 6, - "pubKey": "0x04127513ffb9cae0800d8894b4fcf5c5763fe7c52b30a3b488a5507e31ff00f693b4cb26dea3ec5be0c33506a7f0ee87364ac6a5c259bb60498cc03c5900f55860", - "signer": "0x9ead03f7136fc6b4bdb0780b00a1c14ae5a8b6d0", - "last_updated": "1662754700132", - "jailed": false, - "accum": 0 - }, - { - "ID": 146, - "startEpoch": 40578, - "endEpoch": 0, - "nonce": 61, - "power": 1, - "pubKey": "0x048aaa75c5817eb487379b1047dfc46d4d4a300186028b96d41070f6430fd0eb001348ba9c6f7406e9b7cb76d96b52f2cfc5af6492e7adec443182875cd5891f85", - "signer": "0xa38f3504e661d2b152adaf197ba5057c911c879b", - "last_updated": "1662106800325", - "jailed": false, - "accum": 0 - }, - { - "ID": 77, - "startEpoch": 8565, - "endEpoch": 0, - "nonce": 1576, - "power": 2, - "pubKey": "0x04181ff8d843c85b3773504bb7a693378eed4a2137a6a8c75d91c5acb3d97876cc4155d0889d389204774aae71eb2288181252aebb78b52592c4feba35224de204", - "signer": "0xb95d435df3f8b2a8d8b9c2b7c8766c9ae6ed8cc9", - "last_updated": "1663208800036", - "jailed": false, - "accum": 0 - }, - { - "ID": 91, - "startEpoch": 9990, - "endEpoch": 0, - "nonce": 150, - "power": 3, - "pubKey": "0x04f4efb1dc25cf3653a408e3640a13d11855bc2cd9957976d793a18491d674c99bd410312bf891f4eb87e37cea6372ddd31e60fb0eb255e197a52be71eaef62b67", - "signer": "0xbdbd4347b082d9d6bdf2da4555a37ce52a2e2120", - "last_updated": "1647620200020", - "jailed": false, - "accum": 0 - }, - { - "ID": 30, - "startEpoch": 5280, - "endEpoch": 0, - "nonce": 2330, - "power": 2, - "pubKey": "0x04e039bb399a4b185f97d3842b01b3fe86e794bbfe39d7110b75dd0727d69eb8114ac573ba9cb1fb34d7b944253dfa9832276902a283ff39605bc27639d7404f80", - "signer": "0xc6869257205e20c2a43cb31345db534aecb49f6e", - "last_updated": "1662744000096", - "jailed": false, - "accum": 0 - }, - { - "ID": 94, - "startEpoch": 9992, - "endEpoch": 0, - "nonce": 363, - "power": 1, - "pubKey": "0x046ff196614c2398bc7e2c0a95a8be5ee41604e3f5e678afc642cb7f982386433142b7f7320affa049cb2840b431f40b28ce0796c68f21d2198bf2a91a961b6925", - "signer": "0xe7e2cb8c81c10ff191a73fe266788c9ce62ec754", - "last_updated": "1655891500054", - "jailed": false, - "accum": 0 - }, - { - "ID": 27, - "startEpoch": 5208, - "endEpoch": 0, - "nonce": 331, - "power": 1, - "pubKey": "0x044960885bd1248f632673bf276aafaae6242043e36828f671cd2c9cf83e1e284426ef7df53ab5f203fc016ffac62754e8cfd9aca3379bc93f748a327ff1b19cd6", - "signer": "0xec20607aa654d823dd01beb8780a44863c57ed07", - "last_updated": "1659894900050", - "jailed": false, - "accum": 0 - }, - { - "ID": 142, - "startEpoch": 36337, - "endEpoch": 0, - "nonce": 7950, - "power": 2, - "pubKey": "0x0400c81a10aad5f1452ee90b4d41f8b6bb4e04bbdd6c3c42475a0fb74ef4437f3ff8ae75dcfa92ed2c89d7dd81a41ccc47d5a6eb81b7b7bb78ea0dbbda1740917e", - "signer": "0xeedba2484aaf940f37cd3cd21a5d7c4a7dafbfc0", - "last_updated": "1663397900045", - "jailed": false, - "accum": 0 - }, - { - "ID": 88, - "startEpoch": 9841, - "endEpoch": 0, - "nonce": 646, - "power": 1, - "pubKey": "0x04f942d6ca3d87de9b0767262db4363758753bdb2dbed83a65b1b731c60a8ecf9be0a9cb70547bae211875f7965df789da6177692f200b403d6fdfde92283a9a98", - "signer": "0xef46d5fe753c988606e6f703260d816af53b03eb", - "last_updated": "1663003900137", - "jailed": false, - "accum": 0 - }, - { - "ID": 110, - "startEpoch": 11050, - "endEpoch": 0, - "nonce": 13466, - "power": 3, - "pubKey": "0x040e6465dce45cd815f1590fa6e7eb7850977e2a06c26cbba3df31787133b2b996cbaa25e68770175e460d8afccae2bafcd8d018f4b9d2d210f82507d78f58bac3", - "signer": "0xf0245f6251bef9447a08766b9da2b07b28ad80b0", - "last_updated": "1663357200099", - "jailed": false, - "accum": 0 - }, - { - "ID": 3, - "startEpoch": 0, - "endEpoch": 0, - "nonce": 3101, - "power": 1, - "pubKey": "0x040600efda73e1404b0c596e08c78c5ed51631fc173e5f39d21deeddd5712fcd7d6d440c53d211eb48b03063a05b2c0c0eb084053dfcf1c6540def705c8e028456", - "signer": "0xf84c74dea96df0ec22e11e7c33996c73fcc2d822", - "last_updated": "1625013400041", - "jailed": false, - "accum": 10000 - }, - { - "ID": 143, - "startEpoch": 37140, - "endEpoch": 0, - "nonce": 207, - "power": 1, - "pubKey": "0x0493dde87799c59af1726172f6a797032ce5394202ed3f28dcbe41bd596b071ed722be95ac8db7a79c5b926471e3ce3d23dcd201d21797383e489a53c218dbdd13", - "signer": "0xf8b527d500e0d1387d5f9d8cb23868bbb90e4bca", - "last_updated": "1663119300441", - "jailed": false, - "accum": 0 - } - ], - "bor_chain_id": "137" - } -} diff --git a/blockchain/polygon/bor/valset/error.go b/blockchain/polygon/bor/valset/error.go deleted file mode 100644 index 3035a0f..0000000 --- a/blockchain/polygon/bor/valset/error.go +++ /dev/null @@ -1,18 +0,0 @@ -package valset - -import "fmt" - -// TotalVotingPowerExceededError is returned when the maximum allowed total voting power is exceeded -type TotalVotingPowerExceededError struct { - Sum int64 - Validators []*Validator -} - -func (e *TotalVotingPowerExceededError) Error() string { - return fmt.Sprintf( - "Total voting power should be guarded to not exceed %v; got: %v; for validator set: %v", - maxTotalVotingPower, - e.Sum, - e.Validators, - ) -} diff --git a/blockchain/polygon/bor/valset/validator.go b/blockchain/polygon/bor/valset/validator.go deleted file mode 100644 index e78686c..0000000 --- a/blockchain/polygon/bor/valset/validator.go +++ /dev/null @@ -1,96 +0,0 @@ -package valset - -import ( - "bytes" - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/common" -) - -// Validator represets Volatile state for each Validator -type Validator struct { - ID uint64 `json:"ID"` - Address common.Address `json:"signer"` - VotingPower int64 `json:"power"` - ProposerPriority int64 `json:"accum"` -} - -// NewValidator creates new validator -func NewValidator(address common.Address, votingPower int64) *Validator { - return &Validator{ - Address: address, - VotingPower: votingPower, - ProposerPriority: 0, - } -} - -// Copy creates a new copy of the validator so we can mutate ProposerPriority. -// Panics if the validator is nil. -func (v *Validator) Copy() *Validator { - vCopy := *v - return &vCopy -} - -// Cmp returns the one validator with a higher ProposerPriority. -// If ProposerPriority is same, it returns the validator with lexicographically smaller address -func (v *Validator) Cmp(other *Validator) *Validator { - // if both of v and other are nil, nil will be returned and that could possibly lead to nil pointer dereference bubbling up the stack - if v == nil { - return other - } - - if other == nil { - return v - } - - if v.ProposerPriority > other.ProposerPriority { - return v - } - - if v.ProposerPriority < other.ProposerPriority { - return other - } - - result := bytes.Compare(v.Address.Bytes(), other.Address.Bytes()) - - if result == 0 { - panic("Cannot compare identical validators") - } - - if result < 0 { - return v - } - - // result > 0 - return other -} - -func (v *Validator) String() string { - if v == nil { - return "nil-Validator" - } - - return fmt.Sprintf("Validator{%v Power:%v Priority:%v}", - v.Address.Hex(), - v.VotingPower, - v.ProposerPriority) -} - -// HeaderBytes return header bytes -func (v *Validator) HeaderBytes() []byte { - result := make([]byte, 40) - copy(result[:20], v.Address.Bytes()) - copy(result[20:], v.PowerBytes()) - - return result -} - -// PowerBytes return power bytes -func (v *Validator) PowerBytes() []byte { - powerBytes := big.NewInt(0).SetInt64(v.VotingPower).Bytes() - result := make([]byte, 20) - copy(result[20-len(powerBytes):], powerBytes) - - return result -} diff --git a/blockchain/polygon/bor/valset/validator_set.go b/blockchain/polygon/bor/valset/validator_set.go deleted file mode 100644 index 60a8e07..0000000 --- a/blockchain/polygon/bor/valset/validator_set.go +++ /dev/null @@ -1,738 +0,0 @@ -// Package valset Tendermint leader selection algorithm -// -//nolint:gofmt -package valset - -import ( - "bytes" - "fmt" - "math" - "math/big" - "sort" - "strings" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" -) - -// MaxTotalVotingPower - the maximum allowed total voting power. -// It needs to be sufficiently small to, in all cases: -// 1. prevent clipping in incrementProposerPriority() -// 2. let (diff+diffMax-1) not overflow in IncrementProposerPriority() -// (Proof of 1 is tricky, left to the reader). -// It could be higher, but this is sufficiently large for our purposes, -// and leaves room for defensive purposes. -// PriorityWindowSizeFactor - is a constant that when multiplied with the total voting power gives -// the maximum allowed distance between validator priorities. - -const ( - maxTotalVotingPower = int64(math.MaxInt64) / 8 - priorityWindowSizeFactor = 2 -) - -// ValidatorSet represent a set of *Validator at a given height. -// The validators can be fetched by address or index. -// The index is in order of .Address, so the indices are fixed -// for all rounds of a given blockchain height - ie. the validators -// are sorted by their address. -// On the other hand, the .ProposerPriority of each validator and -// the designated .GetProposer() of a set changes every round, -// upon calling .IncrementProposerPriority(). -// NOTE: Not goroutine-safe. -// NOTE: All get/set to validators should copy the value for safety. -type ValidatorSet struct { - // NOTE: persisted via reflect, must be exported. - Validators []*Validator `json:"validators"` - Proposer *Validator `json:"proposer"` - - // cached (unexported) - totalVotingPower int64 - validatorsMap map[common.Address]int // address -> index -} - -// NewValidatorSet initializes a ValidatorSet by copying over the -// values from `valz`, a list of Validators. If valz is nil or empty, -// the new ValidatorSet will have an empty list of Validators. -// The addresses of validators in `valz` must be unique otherwise the -// function panics. -func NewValidatorSet(valz []*Validator) *ValidatorSet { - vals := &ValidatorSet{validatorsMap: make(map[common.Address]int)} - - err := vals.updateWithChangeSet(valz, false) - if err != nil { - panic(fmt.Sprintf("cannot create validator set: %s", err)) - } - - if len(valz) > 0 { - vals.IncrementProposerPriority(1) - } - - return vals -} - -// IsNilOrEmpty Nil or empty validator sets are invalid. -func (vals *ValidatorSet) IsNilOrEmpty() bool { - return vals == nil || len(vals.Validators) == 0 -} - -// IncrementProposerPriority increments ProposerPriority of each validator and updates the -// proposer. Panics if validator set is empty. -// `times` must be positive. -func (vals *ValidatorSet) IncrementProposerPriority(times int) { - if vals.IsNilOrEmpty() { - panic("empty validator set") - } - - if times <= 0 { - panic("Cannot call IncrementProposerPriority with non-positive times") - } - - // Cap the difference between priorities to be proportional to 2*totalPower by - // re-normalizing priorities, i.e., rescale all priorities by multiplying with: - // 2*totalVotingPower/(maxPriority - minPriority) - diffMax := priorityWindowSizeFactor * vals.TotalVotingPower() - vals.RescalePriorities(diffMax) - vals.shiftByAvgProposerPriority() - - var proposer *Validator - // Call IncrementProposerPriority(1) times times. - for i := 0; i < times; i++ { - proposer = vals.incrementProposerPriority() - } - - vals.Proposer = proposer -} - -// RescalePriorities changes scaling of priorities -func (vals *ValidatorSet) RescalePriorities(diffMax int64) { - if vals.IsNilOrEmpty() { - panic("empty validator set") - } - // NOTE: This check is merely a sanity check which could be - // removed if all tests would init. voting power appropriately; - // i.e. diffMax should always be > 0 - if diffMax <= 0 { - return - } - - // Calculating ceil(diff/diffMax): - // Re-normalization is performed by dividing by an integer for simplicity. - // NOTE: This may make debugging priority issues easier as well. - diff := computeMaxMinPriorityDiff(vals) - ratio := (diff + diffMax - 1) / diffMax - - if diff > diffMax { - for _, val := range vals.Validators { - val.ProposerPriority = val.ProposerPriority / ratio - } - } -} - -func (vals *ValidatorSet) incrementProposerPriority() *Validator { - for _, val := range vals.Validators { - // Check for overflow for sum. - newPrio := safeAddClip(val.ProposerPriority, val.VotingPower) - val.ProposerPriority = newPrio - } - // Decrement the validator with most ProposerPriority. - mostest := vals.getValWithMostPriority() - // Mind the underflow. - mostest.ProposerPriority = safeSubClip(mostest.ProposerPriority, vals.TotalVotingPower()) - - return mostest -} - -// Should not be called on an empty validator set. -func (vals *ValidatorSet) computeAvgProposerPriority() int64 { - n := int64(len(vals.Validators)) - sum := big.NewInt(0) - - for _, val := range vals.Validators { - sum.Add(sum, big.NewInt(val.ProposerPriority)) - } - - avg := sum.Div(sum, big.NewInt(n)) - - if avg.IsInt64() { - return avg.Int64() - } - - // This should never happen: each val.ProposerPriority is in bounds of int64. - panic(fmt.Sprintf("Cannot represent avg ProposerPriority as an int64 %v", avg)) -} - -// Compute the difference between the max and min ProposerPriority of that set. -func computeMaxMinPriorityDiff(vals *ValidatorSet) int64 { - if vals.IsNilOrEmpty() { - panic("empty validator set") - } - - max := int64(math.MinInt64) - min := int64(math.MaxInt64) - - for _, v := range vals.Validators { - if v.ProposerPriority < min { - min = v.ProposerPriority - } - - if v.ProposerPriority > max { - max = v.ProposerPriority - } - } - - diff := max - min - - if diff < 0 { - return -1 * diff - } - - return diff -} - -func (vals *ValidatorSet) getValWithMostPriority() *Validator { - var res *Validator - for _, val := range vals.Validators { - res = res.Cmp(val) - } - - return res -} - -func (vals *ValidatorSet) shiftByAvgProposerPriority() { - if vals.IsNilOrEmpty() { - panic("empty validator set") - } - - avgProposerPriority := vals.computeAvgProposerPriority() - - for _, val := range vals.Validators { - val.ProposerPriority = safeSubClip(val.ProposerPriority, avgProposerPriority) - } -} - -// Makes a copy of the validator list. -func validatorListCopy(valsList []*Validator) []*Validator { - if valsList == nil { - return nil - } - - valsCopy := make([]*Validator, len(valsList)) - - for i, val := range valsList { - valsCopy[i] = val.Copy() - } - - return valsCopy -} - -// Copy each validator into a new ValidatorSet. -func (vals *ValidatorSet) Copy() *ValidatorSet { - valCopy := validatorListCopy(vals.Validators) - validatorsMap := make(map[common.Address]int, len(vals.Validators)) - - for i, val := range valCopy { - validatorsMap[val.Address] = i - } - - return &ValidatorSet{ - Validators: validatorListCopy(vals.Validators), - Proposer: vals.Proposer, - totalVotingPower: vals.totalVotingPower, - validatorsMap: validatorsMap, - } -} - -// HasAddress returns true if address given is in the validator set, false - -// otherwise. -func (vals *ValidatorSet) HasAddress(address common.Address) bool { - _, ok := vals.validatorsMap[address] - - return ok -} - -// GetByAddress returns an index of the validator with address and validator -// itself if found. Otherwise, -1 and nil are returned. -func (vals *ValidatorSet) GetByAddress(address common.Address) (index int, val *Validator) { - idx, ok := vals.validatorsMap[address] - if ok { - return idx, vals.Validators[idx].Copy() - } - - return -1, nil -} - -// GetByIndex returns the validator's address and validator itself by index. -// It returns nil values if index is less than 0 or greater or equal to -// len(ValidatorSet.Validators). -func (vals *ValidatorSet) GetByIndex(index int) (address common.Address, val *Validator) { - if index < 0 || index >= len(vals.Validators) { - return common.Address{}, nil - } - - val = vals.Validators[index] - - return val.Address, val.Copy() -} - -// Size returns the length of the validator set. -func (vals *ValidatorSet) Size() int { - return len(vals.Validators) -} - -// UpdateTotalVotingPower force recalculation of the set's total voting power. -func (vals *ValidatorSet) UpdateTotalVotingPower() error { - sum := int64(0) - for _, val := range vals.Validators { - // mind overflow - sum = safeAddClip(sum, val.VotingPower) - if sum > maxTotalVotingPower { - return &TotalVotingPowerExceededError{sum, vals.Validators} - } - } - - vals.totalVotingPower = sum - - return nil -} - -// TotalVotingPower returns the sum of the voting powers of all validators. -// It recomputes the total voting power if required. -func (vals *ValidatorSet) TotalVotingPower() int64 { - if vals.totalVotingPower == 0 { - log.Info("invoking updateTotalVotingPower before returning it") - - if err := vals.UpdateTotalVotingPower(); err != nil { - // Can/should we do better? - panic(err) - } - } - - return vals.totalVotingPower -} - -// GetProposer returns the current proposer. If the validator set is empty, nil -// is returned. -func (vals *ValidatorSet) GetProposer() (proposer *Validator) { - if len(vals.Validators) == 0 { - return nil - } - - if vals.Proposer == nil { - vals.Proposer = vals.findProposer() - } - - return vals.Proposer.Copy() -} - -func (vals *ValidatorSet) findProposer() *Validator { - var proposer *Validator - for _, val := range vals.Validators { - if proposer == nil || val.Address != proposer.Address { - proposer = proposer.Cmp(val) - } - } - - return proposer -} - -// Iterate will run the given function over the set. -func (vals *ValidatorSet) Iterate(fn func(index int, val *Validator) bool) { - for i, val := range vals.Validators { - stop := fn(i, val.Copy()) - if stop { - break - } - } -} - -// Checks changes against duplicates, splits the changes in updates and removals, sorts them by address. -// -// Returns: -// updates, removals - the sorted lists of updates and removals -// err - non-nil if duplicate entries or entries with negative voting power are seen -// -// No changes are made to 'origChanges'. -func processChanges(origChanges []*Validator) (updates, removals []*Validator, err error) { - // Make a deep copy of the changes and sort by address. - changes := validatorListCopy(origChanges) - sort.Sort(ValidatorsByAddress(changes)) - - sliceCap := len(changes) / 2 - if sliceCap == 0 { - sliceCap = 1 - } - - removals = make([]*Validator, 0, sliceCap) - updates = make([]*Validator, 0, sliceCap) - - var prevAddr common.Address - - // Scan changes by address and append valid validators to updates or removals lists. - for _, valUpdate := range changes { - if valUpdate.Address == prevAddr { - err = fmt.Errorf("duplicate entry %v in %v", valUpdate, changes) - return nil, nil, err - } - - if valUpdate.VotingPower < 0 { - err = fmt.Errorf("voting power can't be negative: %v", valUpdate) - return nil, nil, err - } - - if valUpdate.VotingPower > maxTotalVotingPower { - err = fmt.Errorf("to prevent clipping/ overflow, voting power can't be higher than %v: %v ", - maxTotalVotingPower, valUpdate) - return nil, nil, err - } - - if valUpdate.VotingPower == 0 { - removals = append(removals, valUpdate) - } else { - updates = append(updates, valUpdate) - } - - prevAddr = valUpdate.Address - } - - return updates, removals, err -} - -// Verifies a list of updates against a validator set, making sure the allowed -// total voting power would not be exceeded if these updates would be applied to the set. -// -// Returns: -// updatedTotalVotingPower - the new total voting power if these updates would be applied -// numNewValidators - number of new validators -// err - non-nil if the maximum allowed total voting power would be exceeded -// -// 'updates' should be a list of proper validator changes, i.e. they have been verified -// by processChanges for duplicates and invalid values. -// No changes are made to the validator set 'vals'. -func verifyUpdates(updates []*Validator, vals *ValidatorSet) (updatedTotalVotingPower int64, numNewValidators int, err error) { - updatedTotalVotingPower = vals.TotalVotingPower() - - for _, valUpdate := range updates { - address := valUpdate.Address - _, val := vals.GetByAddress(address) - - if val == nil { - // New validator, add its voting power the the total. - updatedTotalVotingPower += valUpdate.VotingPower - numNewValidators++ - } else { - // Updated validator, add the difference in power to the total. - updatedTotalVotingPower += valUpdate.VotingPower - val.VotingPower - } - - overflow := updatedTotalVotingPower > maxTotalVotingPower - - if overflow { - err = fmt.Errorf( - "failed to add/update validator %v, total voting power would exceed the max allowed %v", - valUpdate, maxTotalVotingPower) - - return 0, 0, err - } - } - - return updatedTotalVotingPower, numNewValidators, nil -} - -// Computes the proposer priority for the validators not present in the set based on 'updatedTotalVotingPower'. -// Leaves unchanged the priorities of validators that are changed. -// -// 'updates' parameter must be a list of unique validators to be added or updated. -// No changes are made to the validator set 'vals'. -func computeNewPriorities(updates []*Validator, vals *ValidatorSet, updatedTotalVotingPower int64) { - for _, valUpdate := range updates { - address := valUpdate.Address - _, val := vals.GetByAddress(address) - - if val == nil { - // add val - // Set ProposerPriority to -C*totalVotingPower (with C ~= 1.125) to make sure validators can't - // un-bond and then re-bond to reset their (potentially previously negative) ProposerPriority to zero. - // - // Contract: updatedVotingPower < MaxTotalVotingPower to ensure ProposerPriority does - // not exceed the bounds of int64. - // - // Compute ProposerPriority = -1.125*totalVotingPower == -(updatedVotingPower + (updatedVotingPower >> 3)). - valUpdate.ProposerPriority = -(updatedTotalVotingPower + (updatedTotalVotingPower >> 3)) - } else { - valUpdate.ProposerPriority = val.ProposerPriority - } - } -} - -// Merges the vals' validator list with the updates list. -// When two elements with same address are seen, the one from updates is selected. -// Expects updates to be a list of updates sorted by address with no duplicates or errors, -// must have been validated with verifyUpdates() and priorities computed with computeNewPriorities(). -func (vals *ValidatorSet) applyUpdates(updates []*Validator) { - existing := vals.Validators - merged := make([]*Validator, uint64(len(existing))+uint64(len(updates))) - i := 0 - - for len(existing) > 0 && len(updates) > 0 { - if bytes.Compare(existing[0].Address.Bytes(), updates[0].Address.Bytes()) < 0 { // unchanged validator - merged[i] = existing[0] - existing = existing[1:] - } else { - // Apply add or update. - merged[i] = updates[0] - if existing[0].Address == updates[0].Address { - // Validator is present in both, advance existing. - existing = existing[1:] - } - - updates = updates[1:] - } - i++ - } - - // Add the elements which are left. - for j := 0; j < len(existing); j++ { - merged[i] = existing[j] - i++ - } - - // OR add updates which are left. - for j := 0; j < len(updates); j++ { - merged[i] = updates[j] - i++ - } - - vals.Validators = merged[:i] -} - -// Checks that the validators to be removed are part of the validator set. -// No changes are made to the validator set 'vals'. -func verifyRemovals(deletes []*Validator, vals *ValidatorSet) error { - for _, valUpdate := range deletes { - address := valUpdate.Address - _, val := vals.GetByAddress(address) - - if val == nil { - return fmt.Errorf("failed to find validator %X to remove", address) - } - } - - if len(deletes) > len(vals.Validators) { - panic("more deletes than validators") - } - - return nil -} - -// Removes the validators specified in 'deletes' from validator set 'vals'. -// Should not fail as verification has been done before. -func (vals *ValidatorSet) applyRemovals(deletes []*Validator) { - existing := vals.Validators - - merged := make([]*Validator, len(existing)-len(deletes)) - i := 0 - - // Loop over deletes until we removed all of them. - for len(deletes) > 0 { - if existing[0].Address == deletes[0].Address { - deletes = deletes[1:] - } else { // Leave it in the resulting slice. - merged[i] = existing[0] - i++ - } - - existing = existing[1:] - } - - // Add the elements which are left. - for j := 0; j < len(existing); j++ { - merged[i] = existing[j] - i++ - } - - vals.Validators = merged[:i] -} - -// Main function used by UpdateWithChangeSet() and NewValidatorSet(). -// If 'allowDeletes' is false then delete operations (identified by validators with voting power 0) -// are not allowed and will trigger an error if present in 'changes'. -// The 'allowDeletes' flag is set to false by NewValidatorSet() and to true by UpdateWithChangeSet(). -func (vals *ValidatorSet) updateWithChangeSet(changes []*Validator, allowDeletes bool) error { - if len(changes) <= 0 { - return nil - } - - // Check for duplicates within changes, split in 'updates' and 'deletes' lists (sorted). - updates, deletes, err := processChanges(changes) - if err != nil { - return err - } - - if !allowDeletes && len(deletes) != 0 { - return fmt.Errorf("cannot process validators with voting power 0: %v", deletes) - } - - // Verify that applying the 'deletes' against 'vals' will not result in error. - if err = verifyRemovals(deletes, vals); err != nil { - return err - } - - // Verify that applying the 'updates' against 'vals' will not result in error. - updatedTotalVotingPower, numNewValidators, err := verifyUpdates(updates, vals) - if err != nil { - return err - } - - // Check that the resulting set will not be empty. - if numNewValidators == 0 && len(vals.Validators) == len(deletes) { - return fmt.Errorf("applying the validator changes would result in empty set") - } - - // Compute the priorities for updates. - computeNewPriorities(updates, vals, updatedTotalVotingPower) - - // Apply updates and removals. - vals.updateValidators(updates, deletes) - - if err := vals.UpdateTotalVotingPower(); err != nil { - return err - } - - // Scale and center. - vals.RescalePriorities(priorityWindowSizeFactor * vals.TotalVotingPower()) - vals.shiftByAvgProposerPriority() - - return nil -} - -func (vals *ValidatorSet) updateValidators(updates []*Validator, deletes []*Validator) { - vals.applyUpdates(updates) - vals.applyRemovals(deletes) - - vals.UpdateValidatorMap() -} - -// UpdateValidatorMap cahnges state of validators map from Validators. -func (vals *ValidatorSet) UpdateValidatorMap() { - vals.validatorsMap = make(map[common.Address]int, len(vals.Validators)) - - for i, val := range vals.Validators { - vals.validatorsMap[val.Address] = i - } -} - -// UpdateWithChangeSet attempts to update the validator set with 'changes'. -// It performs the following steps: -// - validates the changes making sure there are no duplicates and splits them in updates and deletes -// - verifies that applying the changes will not result in errors -// - computes the total voting power BEFORE removals to ensure that in the next steps the priorities -// across old and newly added validators are fair -// - computes the priorities of new validators against the final set -// - applies the updates against the validator set -// - applies the removals against the validator set -// - performs scaling and centering of priority values -// -// If an error is detected during verification steps, it is returned and the validator set -// is not changed. -func (vals *ValidatorSet) UpdateWithChangeSet(changes []*Validator) error { - return vals.updateWithChangeSet(changes, true) -} - -//---------------- - -func (vals *ValidatorSet) String() string { - return vals.StringIndented("") -} - -// StringIndented implementation of pretty-printing -func (vals *ValidatorSet) StringIndented(indent string) string { - if vals == nil { - return "nil-ValidatorSet" - } - - valStrings := make([]string, 0, len(vals.Validators)) - - vals.Iterate(func(index int, val *Validator) bool { - valStrings = append(valStrings, val.String()) - return false - }) - - return fmt.Sprintf(`ValidatorSet{ -%s Proposer: %v -%s Validators: -%s %v -%s}`, - indent, vals.GetProposer().String(), - indent, - indent, strings.Join(valStrings, "\n"+indent+" "), - indent) -} - -//------------------------------------- -// Implements sort for sorting validators by address. - -// ValidatorsByAddress sort validators by address. -type ValidatorsByAddress []*Validator - -func (valz ValidatorsByAddress) Len() int { - return len(valz) -} - -func (valz ValidatorsByAddress) Less(i, j int) bool { - return bytes.Compare(valz[i].Address.Bytes(), valz[j].Address.Bytes()) == -1 -} - -func (valz ValidatorsByAddress) Swap(i, j int) { - it := valz[i] - valz[i] = valz[j] - valz[j] = it -} - -/////////////////////////////////////////////////////////////////////////////// -// safe addition/subtraction - -func safeAdd(a, b int64) (int64, bool) { - if b > 0 && a > math.MaxInt64-b { - return -1, true - } else if b < 0 && a < math.MinInt64-b { - return -1, true - } - - return a + b, false -} - -func safeSub(a, b int64) (int64, bool) { - if b > 0 && a < math.MinInt64+b { - return -1, true - } else if b < 0 && a > math.MaxInt64+b { - return -1, true - } - - return a - b, false -} - -func safeAddClip(a, b int64) int64 { - c, overflow := safeAdd(a, b) - if overflow { - if b < 0 { - return math.MinInt64 - } - - return math.MaxInt64 - } - - return c -} - -func safeSubClip(a, b int64) int64 { - c, overflow := safeSub(a, b) - if overflow { - if b > 0 { - return math.MinInt64 - } - - return math.MaxInt64 - } - - return c -} diff --git a/blockchain/polygon/bor/valset/validator_set_test.go b/blockchain/polygon/bor/valset/validator_set_test.go deleted file mode 100644 index 3e356c8..0000000 --- a/blockchain/polygon/bor/valset/validator_set_test.go +++ /dev/null @@ -1,198 +0,0 @@ -package valset - -import ( - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func NewValidatorFromKey(key string, votingPower int64) *Validator { - privKey, _ := crypto.HexToECDSA(key) - - return NewValidator(crypto.PubkeyToAddress(privKey.PublicKey), votingPower) -} - -func GetValidators() [4]*Validator { - const ( - // addr0 = 0x96C42C56fdb78294F96B0cFa33c92bed7D75F96a - signer0 = "c8deb0bea5c41afe8e37b4d1bd84e31adff11b09c8c96ff4b605003cce067cd9" - - // addr1 = 0x98925BE497f6dFF6A5a33dDA8B5933cA35262d69 - signer1 = "c8deb0bea5c41afe8e37b4d1bd84e31adff11b09c8c96ff4b605003cce067cd8" - - // addr2 = 0x648Cf2A5b119E2c04061021834F8f75735B1D36b - signer2 = "c8deb0bea5c41afe8e37b4d1bd84e31adff11b09c8c96ff4b605003cce067cd7" - - // addr3 = 0x168f220B3b313D456eD4797520eFdFA9c57E6C45 - signer3 = "c8deb0bea5c41afe8e37b4d1bd84e31adff11b09c8c96ff4b605003cce067cd6" - ) - - return [4]*Validator{ - NewValidatorFromKey(signer0, 100), - NewValidatorFromKey(signer1, 200), - NewValidatorFromKey(signer2, 300), - NewValidatorFromKey(signer3, 400), - } -} - -func TestIncrementProposerPriority(t *testing.T) { - t.Parallel() - - vals := GetValidators() - - // Validator set length = 1 - valSet := NewValidatorSet(vals[:1]) - - expectedPropsers := []*Validator{vals[0], vals[0], vals[0], vals[0], vals[0], vals[0], vals[0], vals[0], vals[0], vals[0]} - - for i := 0; i < 10; i++ { - valSet.IncrementProposerPriority(1) - - require.Equal(t, expectedPropsers[i].Address, valSet.GetProposer().Address) - } - - // Validator set length = 2 - valSet = NewValidatorSet(vals[:2]) - - expectedPropsers = []*Validator{vals[0], vals[1], vals[1], vals[0], vals[1], vals[1], vals[0], vals[1], vals[1], vals[0]} - - for i := 0; i < 10; i++ { - valSet.IncrementProposerPriority(1) - - require.Equal(t, expectedPropsers[i].Address, valSet.GetProposer().Address) - } - - // Validator set length = 3 - valSet = NewValidatorSet(vals[:3]) - - expectedPropsers = []*Validator{vals[1], vals[2], vals[0], vals[1], vals[2], vals[2], vals[1], vals[2], vals[0], vals[1]} - - for i := 0; i < 10; i++ { - valSet.IncrementProposerPriority(1) - - require.Equal(t, expectedPropsers[i].Address, valSet.GetProposer().Address) - } - - // Validator set length = 4 - valSet = NewValidatorSet(vals[:4]) - - expectedPropsers = []*Validator{vals[2], vals[1], vals[3], vals[2], vals[0], vals[3], vals[1], vals[2], vals[3], vals[3]} - - for i := 0; i < 10; i++ { - valSet.IncrementProposerPriority(1) - - require.Equal(t, expectedPropsers[i].Address, valSet.GetProposer().Address) - } -} - -func TestRescalePriorities(t *testing.T) { - t.Parallel() - - vals := GetValidators() - - // Validator set length = 1 - valSet := NewValidatorSet(vals[:1]) - - valSet.RescalePriorities(10) - - expectedPriorities := []int64{0} - for i, val := range valSet.Validators { - require.Equal(t, expectedPriorities[i], val.ProposerPriority) - } - - // Validator set length = 2 - - valSet = NewValidatorSet(vals[:2]) - - valSet.RescalePriorities(100) - - expectedPriorities = []int64{50, -50} - for i, val := range valSet.Validators { - require.Equal(t, expectedPriorities[i], val.ProposerPriority) - } - - // Validator set length = 3 - - valSet = NewValidatorSet(vals[:3]) - - valSet.RescalePriorities(30) - - expectedPriorities = []int64{-17, 5, 11} - for i, val := range valSet.Validators { - require.Equal(t, expectedPriorities[i], val.ProposerPriority) - } - - // Validator set length = 4 - - valSet = NewValidatorSet(vals[:4]) - - valSet.RescalePriorities(10) - - expectedPriorities = []int64{-6, 3, 1, 2} - for i, val := range valSet.Validators { - require.Equal(t, expectedPriorities[i], val.ProposerPriority) - } -} - -func TestGetValidatorByAddressAndIndex(t *testing.T) { - t.Parallel() - - vals := GetValidators() - valSet := NewValidatorSet(vals[:4]) - - for _, val := range valSet.Validators { - idx, valByAddress := valSet.GetByAddress(val.Address) - addr, valByIndex := valSet.GetByIndex(idx) - - assert.Equal(t, val, valByIndex) - assert.Equal(t, val, valByAddress) - assert.Equal(t, val.Address, addr) - } - - tempAddress := common.HexToAddress("0x12345") - - // Negative Testcase - idx, _ := valSet.GetByAddress(tempAddress) - require.Equal(t, idx, -1) - - // checking for validator index out of range - addr, _ := valSet.GetByIndex(100) - require.Equal(t, addr, common.Address{}) -} - -func TestUpdateWithChangeSet(t *testing.T) { - t.Parallel() - - vals := GetValidators() - valSet := NewValidatorSet(vals[:4]) - - // halved the power of vals[2] and doubled the power of vals[3] - vals[2].VotingPower = 150 - vals[3].VotingPower = 800 - - // Adding new temp validator in the set - const tempSigner = "c8deb0bea5c41afe8e37b4d1bd84e31adff11b09c8c96ff4b605003cce067cd5" - - tempVal := NewValidatorFromKey(tempSigner, 250) - - // check totalVotingPower before updating validator set - require.Equal(t, int64(1000), valSet.TotalVotingPower()) - - err := valSet.UpdateWithChangeSet([]*Validator{vals[2], vals[3], tempVal}) - require.NoError(t, err) - - // check totalVotingPower after updating validator set - require.Equal(t, int64(1500), valSet.TotalVotingPower()) - - _, updatedVal2 := valSet.GetByAddress(vals[2].Address) - require.Equal(t, int64(150), updatedVal2.VotingPower) - - _, updatedVal3 := valSet.GetByAddress(vals[3].Address) - require.Equal(t, int64(800), updatedVal3.VotingPower) - - _, updatedTempVal := valSet.GetByAddress(tempVal.Address) - require.Equal(t, int64(250), updatedTempVal.VotingPower) -} diff --git a/blockchain/polygon/test/prediction_test.go b/blockchain/polygon/test/prediction_test.go deleted file mode 100644 index 0215431..0000000 --- a/blockchain/polygon/test/prediction_test.go +++ /dev/null @@ -1,379 +0,0 @@ -package polygon_test - -import ( - "context" - "encoding/json" - "fmt" - "math/big" - "net/http" - "os" - "sort" - "strings" - "sync" - "testing" - "time" - - ethtypes "github.com/ethereum/go-ethereum/core/types" - - "github.com/ethereum/go-ethereum/common" - "github.com/gorilla/websocket" - "github.com/sourcegraph/jsonrpc2" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/bloXroute-Labs/gateway/v2/blockchain/polygon/bor" - "github.com/bloXroute-Labs/gateway/v2/types" - "github.com/bloXroute-Labs/gateway/v2/utils/syncmap" -) - -const ( - msgSubscribe = `{"id": 1, "method": "subscribe", "params": ["newBlocks", {"include": ["header", "future_validator_info"], "blockchain_network": "Polygon-Mainnet"}]}` - msgUnsubscribeFmt = `{"id": 1, "method": "unsubscribe", "params": ["%v"]}` - msgGetBlockFmt = `{"id": 1, "method": "eth_getBlockByNumber","params": ["0x%x", false]}` - - testDuration = 8 * time.Hour - retryDuration = 10 * time.Second - - blocksChBufferSize = 1000 -) - -type Notification struct { - Params struct { - Result *types.EthBlockNotification `json:"result"` - } `json:"params"` -} - -type rpcResp[Type any] struct { - Error any `json:"error"` - - Result Type `json:"result"` -} - -type testNotificationArgs struct { - notification *types.EthBlockNotification - - header *ethtypes.Header - - validatorInfo [2]*ethtypes.Header - - timestamps [2]uint64 -} - -func getTestName(blockNum uint64, producer common.Address, flags ...string) string { - const testNameFlag = "%s-[%s]" - - testName := fmt.Sprintf("%d", blockNum) - if producer != (common.Address{}) { - testName = fmt.Sprintf(testNameFlag, testName, strings.ToLower(producer.String())) - } - - if bor.IsSprintStart(blockNum) { - testName = fmt.Sprintf(testNameFlag, testName, "sprint") - } - - if bor.IsSpanStart(blockNum) { - testName = fmt.Sprintf(testNameFlag, testName, "span") - } - - for _, flag := range flags { - if flag == "" { - continue - } - - testName = fmt.Sprintf(testNameFlag, testName, flag) - } - - return testName -} - -func TestFutureValidatorPredictionLive(t *testing.T) { - authHeader, ok := os.LookupEnv("PREDICTION_AUTH_HEADER") - if !ok { - t.Skip("authHeader required") - } - - gatewayURI, ok := os.LookupEnv("PREDICTION_GATEWAY_URI") - if !ok { - t.Skip("gatewayURI required") - } - - providerURI, ok := os.LookupEnv("PREDICTION_PROVIDER_URI") - if !ok { - t.Skip("gatewayURI required") - } - - header := make(http.Header) - header.Set("Authorization", authHeader) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - conn, dialResp, err := websocket.DefaultDialer.DialContext(ctx, gatewayURI, header) - require.NoError(t, err) - require.NotNil(t, conn) - require.NotNil(t, dialResp) - - defer func() { assert.NoError(t, conn.Close()) }() - - require.NoError(t, conn.WriteMessage(websocket.TextMessage, []byte(msgSubscribe))) - - _, msg, err := conn.ReadMessage() - require.NoError(t, err) - require.NotNil(t, msg) - - var resp jsonrpc2.Response - require.NoError(t, json.Unmarshal(msg, &resp)) - - var subscriptionID string - require.NoError(t, json.Unmarshal(*resp.Result, &subscriptionID)) - - defer func() { - assert.NoError(t, conn.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintf(msgUnsubscribeFmt, subscriptionID)))) - }() - - wg := new(sync.WaitGroup) - - blocksCh := make(chan uint64, blocksChBufferSize) - - blockMap := syncmap.NewIntegerMapOf[uint64, *types.EthBlockNotification]() - - wg.Add(1) - go func() { - defer wg.Done() - - newBlocksCtx, newBlocksCancel := context.WithDeadline(ctx, time.Now().Add(testDuration)) - defer newBlocksCancel() - - newBlocksWG := new(sync.WaitGroup) - - timer := time.NewTimer(time.Minute) - defer timer.Stop() - - for { - select { - case <-timer.C: - newBlocksCancel() - case <-newBlocksCtx.Done(): - t.Log("stop receiving of new blocks") - newBlocksWG.Wait() - close(blocksCh) - - return - default: - _, notification, notificationErr := conn.ReadMessage() - if notificationErr != nil { - newBlocksCancel() - - continue - } - - assert.NoError(t, notificationErr) - - newBlocksWG.Add(1) - go processNotification(t, newBlocksWG, notification, blocksCh, blockMap) - - timer.Reset(time.Minute) - } - } - }() - - headersMap := syncmap.NewIntegerMapOf[uint64, *ethtypes.Header]() - - wg.Add(1) - go func() { - defer wg.Done() - - providerConn, providerDialResp, providerErr := websocket.DefaultDialer.DialContext(ctx, providerURI, header) - require.NotNil(t, providerConn) - require.NotNil(t, providerDialResp) - require.NoError(t, providerErr) - - defer func() { assert.NoError(t, providerConn.Close()) }() - - t.Log("block fetching started") - - for blockNumber := range blocksCh { - if !processBlock(t, blockNumber, headersMap, providerConn) { - cancel() - - return - } - } - - t.Log("stop fetching of blocks") - }() - - wg.Add(1) - go func() { - defer wg.Done() - - testCtx, testCancel := context.WithCancel(ctx) - defer testCancel() - - for blockMap.Size() <= int(bor.SprintSize) { - time.Sleep(retryDuration) - } - - sortedBlocks := blockMap.Keys() - - sort.Slice(sortedBlocks, func(i, j int) bool { return sortedBlocks[i] < sortedBlocks[j] }) - - blockNum := sortedBlocks[0] - - var ( - exist bool - opened bool - ) - - for { - select { - case <-testCtx.Done(): - return - default: - if func() bool { - args := testNotificationArgs{} - - if args.notification, exist = blockMap.Load(blockNum); !exist { - if _, opened = <-blocksCh; !opened { - testCancel() - } - - return true - } - - if args.header, exist = headersMap.Load(blockNum); !exist { - return true - } - - if args.validatorInfo[0], exist = headersMap.Load(args.notification.ValidatorInfo[0].BlockHeight); !exist { - return true - } - - if args.validatorInfo[1], exist = headersMap.Load(args.notification.ValidatorInfo[1].BlockHeight); !exist { - return true - } - - args.timestamps[0] = args.validatorInfo[0].Time - args.header.Time - args.timestamps[1] = args.validatorInfo[1].Time - args.validatorInfo[0].Time - - blockNum++ - - testNotification(t, args) - - return false - }() { - time.Sleep(time.Second) - } - } - } - }() - - wg.Wait() -} - -func testNotification(t *testing.T, args testNotificationArgs) { - require.NotNil(t, args.notification) - require.NotNil(t, args.header) - require.NotNil(t, args.validatorInfo[0]) - require.NotNil(t, args.validatorInfo[1]) - - producer, err := bor.Ecrecover(args.header) - - t.Run(getTestName(args.header.Number.Uint64(), producer), func(t *testing.T) { - require.NoError(t, err) - - for i := 0; i <= 1; i++ { - producer, err = bor.Ecrecover(args.validatorInfo[i]) - - producerStr := strings.ToLower(producer.String()) - - expectedTime := uint64(2) - if bor.IsSprintStart(args.notification.ValidatorInfo[i].BlockHeight) { - expectedTime += 2 - } - - var producerOffline string - var comparison require.ComparisonAssertionFunc - if (producerStr != args.notification.ValidatorInfo[i].WalletID) && (args.timestamps[i] != expectedTime) { - producerOffline = "producerOffline" - - comparison = require.NotEqual - } else { - comparison = require.Equal - } - - t.Run(getTestName(args.validatorInfo[i].Number.Uint64(), producer, producerOffline), func(t *testing.T) { - require.NoError(t, err) - require.NotEmpty(t, producer) - - if producerOffline != "" { - t.Log("in-turn validator got offline") - } - - t.Logf("\n%s - actual\n%s - predicted\n", producerStr, args.notification.ValidatorInfo[i].WalletID) - - comparison(t, producerStr, args.notification.ValidatorInfo[i].WalletID) - }) - } - }) -} - -func processNotification(t *testing.T, wg *sync.WaitGroup, data []byte, blocksCh chan<- uint64, blockMap *syncmap.SyncMap[uint64, *types.EthBlockNotification]) { - defer wg.Done() - - notification := new(Notification) - assert.NoError(t, json.Unmarshal(data, notification)) - - blockNumberBigInt := new(big.Int) - blockNumberBigInt.SetString(notification.Params.Result.Header.Number, 0) - - blockNumber := blockNumberBigInt.Uint64() - - blockMap.Store(blockNumber, notification.Params.Result) - - blocksCh <- blockNumber - blocksCh <- notification.Params.Result.ValidatorInfo[0].BlockHeight - blocksCh <- notification.Params.Result.ValidatorInfo[1].BlockHeight - - t.Logf("notification (%d) processed", blockNumber) -} - -func processBlock(t *testing.T, blockNumber uint64, headersMap *syncmap.SyncMap[uint64, *ethtypes.Header], conn *websocket.Conn) bool { - if _, exists := headersMap.Load(blockNumber); exists { - return true - } - - msg := fmt.Sprintf(msgGetBlockFmt, blockNumber) - - getResp := func() *rpcResp[*ethtypes.Header] { - require.NoError(t, conn.WriteMessage(websocket.TextMessage, []byte(msg))) - - _, body, err := conn.ReadMessage() - require.NoError(t, err) - - resp := new(rpcResp[*ethtypes.Header]) - require.NoError(t, json.Unmarshal(body, resp)) - - return resp - } - - resp := getResp() - - counter := 0 - for resp.Error != nil || resp.Result == nil { - if counter >= 10 { - require.Failf(t, "max retry attempts", "failed to fetch block: %d", blockNumber) - } - - time.Sleep(retryDuration) - - resp = getResp() - counter++ - } - - headersMap.Store(blockNumber, resp.Result) - - t.Logf("block (%d) fetched", blockNumber) - - return true -} diff --git a/blockchain/polygon/validator_manager.go b/blockchain/polygon/validator_manager.go deleted file mode 100644 index b1619fe..0000000 --- a/blockchain/polygon/validator_manager.go +++ /dev/null @@ -1,14 +0,0 @@ -package polygon - -import ( - ethtypes "github.com/ethereum/go-ethereum/core/types" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// ValidatorInfoManager responsible for getting next validators' info. -type ValidatorInfoManager interface { - Run() error - IsRunning() bool - FutureValidators(header *ethtypes.Header) [2]*types.FutureValidatorInfo -} diff --git a/bxmessage/bdn_performance_stats.go b/bxmessage/bdn_performance_stats.go index dc4dd08..0a8a057 100644 --- a/bxmessage/bdn_performance_stats.go +++ b/bxmessage/bdn_performance_stats.go @@ -316,7 +316,7 @@ func (bs *BdnPerformanceStats) getNodeStats(node types.NodeEndpoint) (*BdnPerfor func (bs *BdnPerformanceStats) getOrCreateNodeStats(node types.NodeEndpoint) *BdnPerformanceStatsData { stats, ok := bs.nodeStats[node.IPPort()] if !ok { - // right now we are not supporting beacon inbound connections, so for ETH inbound will be false and for BSC and Polygon it will be true + // right now we are not supporting beacon inbound connections, so for ETH inbound will be false and for BSC it will be true stats = &BdnPerformanceStatsData{Dynamic: true, IsConnected: true, IsBeacon: node.IsBeacon, BlockchainNetwork: node.BlockchainNetwork} if !node.Dynamic { log.Debugf("override the dynamic to true for node %v", node.IPPort()) diff --git a/bxmessage/constants.go b/bxmessage/constants.go index bcd0885..3a0cc61 100644 --- a/bxmessage/constants.go +++ b/bxmessage/constants.go @@ -68,18 +68,7 @@ const ( ValidatorUpdatesType = "validator" MEVBundleType = "mevbundle" ErrorNotificationType = "notify" - IntentType = "intent" - IntentSolutionType = "intentsol" - IntentSolutionsType = "intentsols" - IntentsSubscriptionType = "intentssub" - IntentsUnsubscriptionType = "intentsunsub" - SolutionsSubscriptionType = "solssub" - SolutionsUnsubscriptionType = "solsunsub" BeaconMessageType = "beaconmsg" - GetIntentSolutionsType = "getintsol" - QuotesType = "quotes" - QuotesSubscriptionType = "quotessub" - QuotesUnsubscriptionType = "quotesunsub" ) // SenderLen is the byte length of sender @@ -104,7 +93,10 @@ const EmptyProtocol = 0 const MinProtocol = NextValidatorMultipleProtocol // CurrentProtocol tracks the most recent version of the bloxroute wire protocol -const CurrentProtocol = BundleBlocksCountAndDroppingTxs +const CurrentProtocol = BundlesEndOfBlocks + +// BundlesEndOfBlocks is the minimum protocol version that supports bundle end of block +const BundlesEndOfBlocks = 53 // BundleBlocksCountAndDroppingTxs is the minimum protocol version that supports bundle blocks count and dropping txs const BundleBlocksCountAndDroppingTxs = 52 diff --git a/bxmessage/get_intent_solution.go b/bxmessage/get_intent_solution.go deleted file mode 100644 index e9641ba..0000000 --- a/bxmessage/get_intent_solution.go +++ /dev/null @@ -1,137 +0,0 @@ -package bxmessage - -import ( - "fmt" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// UnpackGetIntentSolutions unpacks a GetIntentSolutions message from a buffer -func UnpackGetIntentSolutions(b []byte, protocol Protocol) (*GetIntentSolutions, error) { - s := new(GetIntentSolutions) - err := s.Unpack(b, protocol) - if err != nil { - return nil, err - } - - return s, nil -} - -// GetIntentSolutions - represent the "getintsol" message -type GetIntentSolutions struct { - Header - IntentID string // UUIDv4 - DAppOrSenderAddress string // ETH Address - Hash []byte // hash of the intentID+DAppAddress - Signature []byte // ECDSA Signature -} - -// NewGetIntentSolutions - create a new GetIntentSolutions message -func NewGetIntentSolutions(intentID, dAppOrSenderAddress string, hash, signature []byte) *GetIntentSolutions { - return &GetIntentSolutions{ - Header: Header{ - msgType: GetIntentSolutionsType, - }, - IntentID: intentID, - DAppOrSenderAddress: dAppOrSenderAddress, - Hash: hash, - Signature: signature, - } -} - -// Pack serializes a GetIntentSolutions into a buffer for sending -func (s *GetIntentSolutions) Pack(_ Protocol) ([]byte, error) { - bufLen, err := calcPackSize( - HeaderLen, - types.UUIDv4Len, - types.ETHAddressLen, - types.Keccak256HashLen, - types.ECDSASignatureLen, - ControlByteLen, - ) - if err != nil { - return nil, fmt.Errorf("calc pack size: %w", err) - } - - offset := 0 - buf := make([]byte, bufLen) - - n, err := packHeader(buf, s.Header, GetIntentSolutionsType) - if err != nil { - return nil, fmt.Errorf("pack Header: %w", err) - } - - offset += n - n, err = packUUIDv4String(buf[offset:], s.IntentID) - if err != nil { - return nil, fmt.Errorf("pack ID: %w", err) - } - - offset += n - n, err = packETHAddressHex(buf[offset:], s.DAppOrSenderAddress) - if err != nil { - return nil, fmt.Errorf("pack DAppOrSenderAddress: %w", err) - } - - offset += n - n, err = packKeccak256Hash(buf[offset:], s.Hash) - if err != nil { - return nil, fmt.Errorf("pack Hash: %w", err) - } - - offset += n - n, err = packECDSASignature(buf[offset:], s.Signature) - if err != nil { - return nil, fmt.Errorf("pack Signature: %w", err) - } - - offset += n - if err = checkBuffEnd(&buf, offset); err != nil { - return nil, err - } - - return buf, nil -} - -// Unpack deserializes a GetIntentSolutions from a buffer -func (s *GetIntentSolutions) Unpack(buf []byte, protocol Protocol) error { - var ( - err error - n int - offset = 0 - ) - - s.Header, n, err = unpackHeader(buf, protocol) - if err != nil { - return fmt.Errorf("unpack BroadcastHeader: %v", err) - } - - offset += n - s.IntentID, n, err = unpackUUIDv4String(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack intent ID: %v", err) - } - - offset += n - s.DAppOrSenderAddress, n, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack DAppOrSenderAddress: %v", err) - } - - offset += n - s.Hash, n, err = unpackKeccak256Hash(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Hash: %v", err) - } - - offset += n - s.Signature, _, err = unpackECDSASignature(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Signature: %v", err) - } - - return nil -} - -// GetNetworkNum returns the network number -func (s *GetIntentSolutions) GetNetworkNum() types.NetworkNum { return types.AllNetworkNum } diff --git a/bxmessage/intent.go b/bxmessage/intent.go deleted file mode 100644 index 9a87c3b..0000000 --- a/bxmessage/intent.go +++ /dev/null @@ -1,198 +0,0 @@ -package bxmessage - -import ( - "fmt" - "time" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// UnpackIntent unpacks intent bxmessage -func UnpackIntent(b []byte, protocol Protocol) (*Intent, error) { - intent := new(Intent) - err := intent.Unpack(b, protocol) - if err != nil { - return nil, err - } - - return intent, nil -} - -// NewIntent constructor for Intent bxmessage -func NewIntent(id string, dAppAddr, senderAddress string, hash, signature []byte, timestamp time.Time, intent []byte) Message { - return &Intent{ - Header: Header{}, - ID: id, - DAppAddress: dAppAddr, - SenderAddress: senderAddress, - Hash: hash, - Signature: signature, - Timestamp: timestamp, - Intent: intent, - } -} - -// Intent bxmessage -type Intent struct { - Header - ID string // UUID - DAppAddress string // ETH Address - SenderAddress string // ETH Address - Hash []byte // Keccak256 - Signature []byte // ECDSA signature - Timestamp time.Time // Short timestamp - Intent []byte // Variable length -} - -// GetNetworkNum implements BroadcastMessage interface -func (i *Intent) GetNetworkNum() types.NetworkNum { return types.AllNetworkNum } - -// Pack packs intent into bytes for broadcasting -func (i *Intent) Pack(protocol Protocol) ([]byte, error) { - if protocol < IntentsProtocol { - return nil, fmt.Errorf("invalid protocol version for Intent message: %v", protocol) - } - - bufLen, err := calcPackSize( - HeaderLen, - types.UUIDv4Len, - types.ETHAddressLen, - types.ETHAddressLen, - types.Keccak256HashLen, - types.ECDSASignatureLen, - ShortTimestampLen, - i.Intent, - ControlByteLen, - ) - if err != nil { - return nil, fmt.Errorf("calc pack size: %w", err) - } - - var ( - offset = 0 - buf = make([]byte, bufLen) - ) - - n, err := packHeader(buf, i.Header, IntentType) - if err != nil { - return nil, fmt.Errorf("pack Header: %w", err) - } - - offset += n - n, err = packUUIDv4String(buf[offset:], i.ID) - if err != nil { - return nil, fmt.Errorf("pack ID: %w", err) - } - - offset += n - n, err = packETHAddressHex(buf[offset:], i.DAppAddress) - if err != nil { - return nil, fmt.Errorf("pack DAppAddress: %w", err) - } - - offset += n - n, err = packKeccak256Hash(buf[offset:], i.Hash) - if err != nil { - return nil, fmt.Errorf("pack Hash: %w", err) - } - - offset += n - n, err = packECDSASignature(buf[offset:], i.Signature) - if err != nil { - return nil, fmt.Errorf("pack Signature: %w", err) - } - - offset += n - n, err = packTimestamp(buf[offset:], i.Timestamp) - if err != nil { - return nil, fmt.Errorf("pack Timestamp: %w", err) - } - - offset += n - n, err = packRawBytes(buf[offset:], i.Intent) - if err != nil { - return nil, fmt.Errorf("pack Intent: %v", err) - } - - if protocol >= IntentsWithAnySenderProtocol { - offset += n - n, err = packETHAddressHex(buf[offset:], i.SenderAddress) - if err != nil { - return nil, fmt.Errorf("pack SenderAddress: %v", err) - } - } - - offset += n - if err := checkBuffEnd(&buf, offset); err != nil { - return nil, err - } - - return buf, nil -} - -// Unpack unpacks raw bytes from the network into Intent bxmessage -func (i *Intent) Unpack(buf []byte, protocol Protocol) error { - var ( - err error - offset int - n int - ) - - if protocol < IntentsProtocol { - return fmt.Errorf("invalid protocol version for Intent message: %v", protocol) - } - - i.Header, n, err = unpackHeader(buf, protocol) - if err != nil { - return fmt.Errorf("unpack Header: %v", err) - } - - offset += n - i.ID, n, err = unpackUUIDv4String(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack ID: %v", err) - } - - offset += n - i.DAppAddress, n, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack DAppAddress: %v", err) - } - - offset += n - i.Hash, n, err = unpackKeccak256Hash(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Hash: %v", err) - } - - offset += n - i.Signature, n, err = unpackECDSASignature(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Signature: %v", err) - } - - offset += n - i.Timestamp, n, err = unpackTimestamp(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Timestamp: %v", err) - } - - offset += n - i.Intent, n, err = unpackRawBytes(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Intent: %v", err) - } - - if protocol < IntentsWithAnySenderProtocol { - // In older version of the protocol, the intent sender was always the DApp address - i.SenderAddress = i.DAppAddress - } else { - offset += n - i.SenderAddress, n, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack SenderAddress: %v", err) - } - } - - return nil -} diff --git a/bxmessage/intent_solution.go b/bxmessage/intent_solution.go deleted file mode 100644 index 156a943..0000000 --- a/bxmessage/intent_solution.go +++ /dev/null @@ -1,240 +0,0 @@ -package bxmessage - -import ( - "fmt" - "time" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// UnpackIntentSolution unpacks intent solution bxmessage from bytes -func UnpackIntentSolution(b []byte, protocol Protocol) (*IntentSolution, error) { - solution := new(IntentSolution) - err := solution.Unpack(b, protocol) - if err != nil { - return nil, err - } - - return solution, nil -} - -// NewIntentSolution constructor for IntentSolution bxmessage -func NewIntentSolution(id, solverAddr, intentID string, hash, signature []byte, timestamp time.Time, solution []byte) Message { - return &IntentSolution{ - Header: Header{msgType: IntentSolutionType}, - ID: id, - SolverAddress: solverAddr, - IntentID: intentID, - Solution: solution, - Hash: hash, - Signature: signature, - Timestamp: timestamp, - } -} - -// IntentSolution bxmessage -type IntentSolution struct { - Header - ID string // UUIDv4 - SolverAddress string // ETH Address - IntentID string // UUIDv4 - Solution []byte // Variable length - Hash []byte // Keccak256 - Signature []byte // ECDSA Signature - Timestamp time.Time // Short timestamp - DappAddress string // ETH Address -> set up by relay - SenderAddress string // ETH Address -> set up by relay -} - -// GetNetworkNum implements BroadcastMessage interface -func (i *IntentSolution) GetNetworkNum() types.NetworkNum { return types.AllNetworkNum } - -// Pack packs IntentSolution into raw bytes for broadcasting -func (i *IntentSolution) Pack(protocol Protocol) ([]byte, error) { - if protocol < IntentsProtocol { - return nil, fmt.Errorf("invalid protocol version for IntentSolution message: %v", protocol) - } - - bufLen, err := i.size(protocol) - if err != nil { - return nil, fmt.Errorf("calc pack size: %w", err) - } - - offset := 0 - buf := make([]byte, bufLen) - - n, err := packHeader(buf, i.Header, IntentSolutionType) - if err != nil { - return nil, fmt.Errorf("pack Header: %w", err) - } - - offset += n - n, err = packUUIDv4String(buf[offset:], i.ID) - if err != nil { - return nil, fmt.Errorf("pack ID: %w", err) - } - - offset += n - n, err = packETHAddressHex(buf[offset:], i.SolverAddress) - if err != nil { - return nil, fmt.Errorf("pack SolverAddress: %w", err) - } - - offset += n - n, err = packUUIDv4String(buf[offset:], i.IntentID) - if err != nil { - return nil, fmt.Errorf("pack IntentID: %w", err) - } - - offset += n - n, err = packRawBytes(buf[offset:], i.Solution) - if err != nil { - return nil, fmt.Errorf("pack Solution: %w", err) - } - - offset += n - n, err = packKeccak256Hash(buf[offset:], i.Hash) - if err != nil { - return nil, fmt.Errorf("pack Hash: %w", err) - } - - offset += n - n, err = packECDSASignature(buf[offset:], i.Signature) - if err != nil { - return nil, fmt.Errorf("pack Signature: %w", err) - } - - offset += n - n, err = packTimestamp(buf[offset:], i.Timestamp) - if err != nil { - return nil, fmt.Errorf("pack Timestamp: %w", err) - } - - if protocol >= IntentSolutionProtocol { // DappAddress - offset += n - n, err = packETHAddressHex(buf[offset:], i.DappAddress) - if err != nil { - return nil, fmt.Errorf("pack DappAddress: %w", err) - } - } - - if protocol >= SolutionSenderAddressProtocol { // SenderAddress - offset += n - n, err = packETHAddressHex(buf[offset:], i.SenderAddress) - if err != nil { - return nil, fmt.Errorf("pack SenderAddress: %w", err) - } - } - - offset += n - if err := checkBuffEnd(&buf, offset); err != nil { - return nil, err - } - - return buf, nil -} - -// Unpack unpacks bxmessage from raw bytes -func (i *IntentSolution) Unpack(buf []byte, protocol Protocol) error { - var ( - err error - n int - offset = 0 - ) - - if protocol < IntentsProtocol { - return fmt.Errorf("invalid protocol version for IntentSolution message: %v", protocol) - } - - i.Header, n, err = unpackHeader(buf, protocol) - if err != nil { - return fmt.Errorf("unpack BroadcastHeader: %v", err) - } - - offset += n - i.ID, n, err = unpackUUIDv4String(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack ID: %v", err) - } - - offset += n - i.SolverAddress, n, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack SolverAddress: %v", err) - } - - offset += n - i.IntentID, n, err = unpackUUIDv4String(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack IntentID: %v", err) - } - - offset += n - i.Solution, n, err = unpackRawBytes(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack IntentSolution: %v", err) - } - - offset += n - i.Hash, n, err = unpackKeccak256Hash(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Hash: %v", err) - } - - offset += n - i.Signature, n, err = unpackECDSASignature(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Signature: %v", err) - } - - offset += n - i.Timestamp, n, err = unpackTimestamp(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Timestamp: %v", err) - } - - if protocol >= IntentSolutionProtocol { // DappAddress - offset += n - i.DappAddress, n, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack DappAddress: %v", err) - } - } - - if protocol >= SolutionSenderAddressProtocol { // SenderAddress - offset += n - i.SenderAddress, _, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack SenderAddress: %v", err) - } - } - - return nil -} - -func (i *IntentSolution) size(protocol Protocol) (uint32, error) { - size, err := calcPackSize( - HeaderLen, - types.UUIDv4Len, - types.ETHAddressLen, - types.UUIDv4Len, - i.Solution, - types.Keccak256HashLen, - types.ECDSASignatureLen, - ShortTimestampLen, - ControlByteLen, - ) - if err != nil { - return 0, err - } - - if protocol >= IntentSolutionProtocol { - size += types.ETHAddressLen // DappAddress - } - - if protocol >= SolutionSenderAddressProtocol { - size += types.ETHAddressLen // SenderAddress - } - - return size, nil -} diff --git a/bxmessage/intent_solution_test.go b/bxmessage/intent_solution_test.go deleted file mode 100644 index 07c3fd2..0000000 --- a/bxmessage/intent_solution_test.go +++ /dev/null @@ -1,81 +0,0 @@ -package bxmessage - -import ( - "testing" - "time" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/google/uuid" - "github.com/stretchr/testify/require" -) - -func TestIntentSolution_Unpack(t *testing.T) { - tests := []struct { - name string - protocol Protocol - emptyDAppAddress bool - emptySenderAddress bool - }{ - { - name: "intents protocol", - protocol: IntentsProtocol, - emptyDAppAddress: true, - emptySenderAddress: true, - }, - { - name: "intent solution protocol", - protocol: IntentSolutionProtocol, - emptyDAppAddress: false, - emptySenderAddress: true, - }, - { - name: "solution sender address protocol", - protocol: SolutionSenderAddressProtocol, - emptyDAppAddress: false, - emptySenderAddress: false, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - r := genIntentsRequest() - is := NewIntentSolution(uuid.New().String(), r.SolverAddress, uuid.New().String(), r.Hash, r.Signature, time.Now(), []byte("this is test :(")) - solution, ok := is.(*IntentSolution) - require.True(t, ok) - - privKey, err := crypto.GenerateKey() - require.NoError(t, err) - dAppAddress := crypto.PubkeyToAddress(privKey.PublicKey).String() - solution.DappAddress = dAppAddress - solution.SenderAddress = dAppAddress - - bytes, err := solution.Pack(tt.protocol) - require.NoError(t, err) - - solution2 := IntentSolution{} - err = solution2.Unpack(bytes, tt.protocol) - require.NoError(t, err) - - require.Equal(t, solution.Header.msgType, solution2.Header.msgType) - require.Equal(t, solution.ID, solution2.ID) - require.Equal(t, solution.SolverAddress, solution2.SolverAddress) - require.Equal(t, solution.IntentID, solution2.IntentID) - require.Equal(t, solution.Solution, solution2.Solution) - require.Equal(t, solution.Hash, solution2.Hash) - require.Equal(t, solution.Signature, solution2.Signature) - require.Equal(t, solution.Timestamp.UnixMilli(), solution2.Timestamp.UnixMilli()) - - if tt.emptyDAppAddress { - require.Empty(t, solution2.DappAddress) - } else { - require.Equal(t, solution.DappAddress, solution2.DappAddress) - } - - if tt.emptySenderAddress { - require.Empty(t, solution2.SenderAddress) - } else { - require.Equal(t, solution.SenderAddress, solution2.SenderAddress) - } - }) - } -} diff --git a/bxmessage/intent_solutions.go b/bxmessage/intent_solutions.go deleted file mode 100644 index e5c7338..0000000 --- a/bxmessage/intent_solutions.go +++ /dev/null @@ -1,140 +0,0 @@ -package bxmessage - -import ( - "encoding/binary" - "fmt" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// UnpackIntentSolutions unpacks a GetIntentSolutions message from a buffer -func UnpackIntentSolutions(b []byte, protocol Protocol) (*IntentSolutions, error) { - s := new(IntentSolutions) - err := s.Unpack(b, protocol) - if err != nil { - return nil, err - } - - return s, nil -} - -// IntentSolutions represents the response to GetIntentSolutions from relay proxies -type IntentSolutions struct { - Header - solutions []IntentSolution -} - -// NewIntentSolutions returns a new IntentSolutions message for packing -func NewIntentSolutions(solutions []IntentSolution) *IntentSolutions { - return &IntentSolutions{ - Header: Header{msgType: IntentSolutionsType}, - solutions: solutions, - } -} - -// Solutions returns all the requested intent solutions -func (s *IntentSolutions) Solutions() []IntentSolution { - return s.solutions -} - -// Pack packs IntentSolutions into raw bytes for broadcasting -func (s *IntentSolutions) Pack(protocol Protocol) ([]byte, error) { - if protocol < IntentsProtocol { - return nil, fmt.Errorf("invalid protocol version for IntentSolutions message: %v", protocol) - } - - bufLen, err := s.size(protocol) - if err != nil { - return nil, fmt.Errorf("calc pack size: %w", err) - } - - offset := 0 - buf := make([]byte, bufLen) - - n, err := packHeader(buf, s.Header, IntentSolutionsType) - if err != nil { - return nil, fmt.Errorf("pack Header: %w", err) - } - - offset += n - - binary.LittleEndian.PutUint32(buf[offset:], uint32(len(s.solutions))) - offset += types.UInt32Len - - for _, solution := range s.solutions { - packedSolution, err := solution.Pack(protocol) - if err != nil { - return nil, fmt.Errorf("pack solution: %w", err) - } - - copy(buf[offset:], packedSolution) - offset += len(packedSolution) - } - - if err = checkBuffEnd(&buf, offset); err != nil { - return nil, err - } - - return buf, nil -} - -// Unpack deserializes a IntentSolutions from a buffer -func (s *IntentSolutions) Unpack(data []byte, protocol Protocol) error { - if protocol < IntentsProtocol { - return fmt.Errorf("invalid protocol version for IntentSolutions message: %v", protocol) - } - - var ( - err error - n int - offset = 0 - ) - - s.Header, n, err = unpackHeader(data, protocol) - if err != nil { - return fmt.Errorf("unpack BroadcastHeader: %v", err) - } - - offset += n - - solutionsLen := binary.LittleEndian.Uint32(data[offset:]) - offset += types.UInt32Len - - s.solutions = make([]IntentSolution, solutionsLen) - - for i := 0; i < int(solutionsLen); i++ { - solution := new(IntentSolution) - err = solution.Unpack(data[offset:], protocol) - if err != nil { - return fmt.Errorf("unpack solution: %w", err) - } - - solSize, err := solution.size(protocol) - if err != nil { - return fmt.Errorf("calc solution size: %w", err) - } - - offset += int(solSize) - s.solutions[i] = *solution - } - - return nil -} - -// GetNetworkNum implements BroadcastMessage interface -func (s *IntentSolutions) GetNetworkNum() types.NetworkNum { return types.AllNetworkNum } - -func (s *IntentSolutions) size(protocol Protocol) (uint32, error) { - size := uint32(0) - - for _, solution := range s.solutions { - solutionSize, err := solution.size(protocol) - if err != nil { - return 0, fmt.Errorf("calc solution size: %w", err) - } - - size += solutionSize - } - - return s.Header.Size() + types.UInt32Len + size, nil -} diff --git a/bxmessage/intent_solutions_test.go b/bxmessage/intent_solutions_test.go deleted file mode 100644 index 5e9c7c6..0000000 --- a/bxmessage/intent_solutions_test.go +++ /dev/null @@ -1,56 +0,0 @@ -package bxmessage - -import ( - "testing" - "time" - - "github.com/bloXroute-Labs/gateway/v2/utils/intent" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestIntentSolutions_Unpack(t *testing.T) { - solutions := make([]IntentSolution, 5) - - for i := 0; i < 5; i++ { - solutions[i] = createTestIntentSolution(t) - } - - intentSolutions := NewIntentSolutions(solutions) - - bytes, err := intentSolutions.Pack(CurrentProtocol) - require.NoError(t, err) - - intentSolutions2 := IntentSolutions{} - err = intentSolutions2.Unpack(bytes, CurrentProtocol) - require.NoError(t, err) - - require.Equal(t, intentSolutions.Header.msgType, intentSolutions2.Header.msgType) - require.Equal(t, len(intentSolutions.Solutions()), len(intentSolutions2.Solutions())) - - for i := 0; i < len(intentSolutions.Solutions()); i++ { - assert.Equal(t, intentSolutions.Solutions()[i].Solution, intentSolutions2.Solutions()[i].Solution) - } -} - -func createTestIntentSolution(t *testing.T) IntentSolution { - r := genIntentsRequest() - solution := []byte("this is test :(") - intentID, err := intent.GenerateSolutionID("test", []byte("test")) - require.NoError(t, err) - id, err := intent.GenerateSolutionID(intentID, solution) - require.NoError(t, err) - - return IntentSolution{ - Header: Header{ - msgType: IntentSolutionType, - }, - ID: id, - SolverAddress: r.SolverAddress, - IntentID: intentID, - Solution: solution, - Hash: r.Hash, - Signature: r.Signature, - Timestamp: time.Now(), - } -} diff --git a/bxmessage/intent_test.go b/bxmessage/intent_test.go deleted file mode 100644 index 79c30e2..0000000 --- a/bxmessage/intent_test.go +++ /dev/null @@ -1,76 +0,0 @@ -package bxmessage - -import ( - "testing" - "time" - - gateway "github.com/bloXroute-Labs/gateway/v2/protobuf" - id "github.com/bloXroute-Labs/gateway/v2/utils/intent" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/require" -) - -func TestIntent_Unpack(t *testing.T) { - r := genIntentsRequest() - - intentByte := []byte("testing intent") - intentID, err := id.GenerateIntentID(r.SolverAddress, intentByte) - require.NoError(t, err) - intent := Intent{ - Header: Header{ - msgType: "intent", - }, - ID: intentID, - DAppAddress: r.SolverAddress, - SenderAddress: "0xb794F5eA0ba39494cE839613fffBA74279579268", - Hash: r.Hash, - Signature: r.Signature, - Timestamp: time.Now(), - Intent: intentByte, - } - - bytes, err := intent.Pack(CurrentProtocol) - require.NoError(t, err) - - intent2 := Intent{} - err = intent2.Unpack(bytes, CurrentProtocol) - require.NoError(t, err) - - require.Equal(t, intent.Header.msgType, intent2.Header.msgType) - require.Equal(t, intent.ID, intent2.ID) - require.Equal(t, intent.DAppAddress, intent2.DAppAddress) - require.Equal(t, intent.SenderAddress, intent2.SenderAddress) - require.Equal(t, intent.Hash, intent2.Hash) - require.Equal(t, intent.Signature, intent2.Signature) - require.Equal(t, intent.Timestamp.UnixMilli(), intent2.Timestamp.UnixMilli()) - require.Equal(t, intent.Intent, intent2.Intent) - - // Test unpacking with old protocol, should substitute DAppAddress with SenderAddress - intent3 := Intent{} - err = intent3.Unpack(bytes, IntentsProtocol) - require.NoError(t, err) - require.Equal(t, intent.DAppAddress, intent3.SenderAddress) -} - -func genIntentsRequest() *gateway.IntentsRequest { - // Generate an ECDSA key pair using secp256k1 curve - privKey, err := crypto.GenerateKey() - if err != nil { - panic(err) - } - - // Extract the public key - pubKey := privKey.PublicKey - signerAddress := crypto.PubkeyToAddress(pubKey) - hash := crypto.Keccak256Hash([]byte(signerAddress.String())).Bytes() - sig, err := crypto.Sign(hash, privKey) - if err != nil { - panic(err) - } - - return &gateway.IntentsRequest{ - SolverAddress: signerAddress.String(), - Hash: hash, - Signature: sig, - } -} diff --git a/bxmessage/intents_subscription.go b/bxmessage/intents_subscription.go deleted file mode 100644 index bdf32fe..0000000 --- a/bxmessage/intents_subscription.go +++ /dev/null @@ -1,123 +0,0 @@ -package bxmessage - -import ( - "fmt" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// UnpackIntentsSubscription unpacks IntentsSubscription bxmessage from bytes -func UnpackIntentsSubscription(b []byte, protocol Protocol) (*IntentsSubscription, error) { - sub := new(IntentsSubscription) - err := sub.Unpack(b, protocol) - if err != nil { - return nil, err - } - - return sub, nil -} - -// NewIntentsSubscription constructor for IntentsSubscription bxmessage -func NewIntentsSubscription(solverAddr string, hash, signature []byte) Message { - return &IntentsSubscription{ - Header: Header{}, - SolverAddress: solverAddr, - Hash: hash, - Signature: signature, - } -} - -// IntentsSubscription bxmessage -type IntentsSubscription struct { - Header - SolverAddress string - Hash []byte - Signature []byte -} - -// Pack packs IntentsSubscription into bytes array for broadcasting -func (i *IntentsSubscription) Pack(protocol Protocol) ([]byte, error) { - if protocol < IntentsProtocol { - return nil, fmt.Errorf("invalid protocol version for IntentsSubscription message: %v", protocol) - } - - bufLen, err := calcPackSize( - HeaderLen, - types.ETHAddressLen, - types.Keccak256HashLen, - types.ECDSASignatureLen, - ControlByteLen, - ) - if err != nil { - return nil, fmt.Errorf("calc pack size: %w", err) - } - - buf := make([]byte, bufLen) - var offset int - - n, err := packHeader(buf, i.Header, IntentsSubscriptionType) - if err != nil { - return nil, fmt.Errorf("pack Header: %w", err) - } - - offset += n - n, err = packETHAddressHex(buf[offset:], i.SolverAddress) - if err != nil { - return nil, fmt.Errorf("pack SolverAddress: %w", err) - } - - offset += n - n, err = packKeccak256Hash(buf[offset:], i.Hash) - if err != nil { - return nil, fmt.Errorf("pack Hash: %w", err) - } - - offset += n - n, err = packECDSASignature(buf[offset:], i.Signature) - if err != nil { - return nil, fmt.Errorf("pack Signature: %w", err) - } - - offset += n - if err := checkBuffEnd(&buf, offset); err != nil { - return nil, err - } - - return buf, nil -} - -// Unpack deserializes IntentsSubscription from bytes -func (i *IntentsSubscription) Unpack(buf []byte, protocol Protocol) error { - var offset int - var err error - var n int - - if protocol < IntentsProtocol { - return fmt.Errorf("invalid protocol version for IntentsSubscription message: %v", protocol) - } - - i.Header, n, err = unpackHeader(buf, protocol) - if err != nil { - return fmt.Errorf("unpack Header: %w", err) - } - - offset += n - i.SolverAddress, n, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack SolverAddress: %w", err) - } - - offset += n - i.Hash, n, err = unpackKeccak256Hash(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Hash: %w", err) - } - - offset += n - i.Signature, _, err = unpackECDSASignature(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Signature: %w", err) - } - - return nil -} diff --git a/bxmessage/intents_subscription_test.go b/bxmessage/intents_subscription_test.go deleted file mode 100644 index cf3e520..0000000 --- a/bxmessage/intents_subscription_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package bxmessage - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestIntentsSubscription_Unpack(t *testing.T) { - r := genIntentsRequest() - - sub := IntentsSubscription{ - Header: Header{ - msgType: IntentsSubscriptionType, - }, - SolverAddress: r.SolverAddress, - Hash: r.Hash, - Signature: r.Signature, - } - - bytes, err := sub.Pack(CurrentProtocol) - require.NoError(t, err) - - sub2 := IntentsSubscription{} - err = sub2.Unpack(bytes, CurrentProtocol) - require.NoError(t, err) - - require.Equal(t, sub.Header.msgType, sub2.Header.msgType) - require.Equal(t, sub.SolverAddress, sub2.SolverAddress) - require.Equal(t, sub.Hash, sub2.Hash) - require.Equal(t, sub.Signature, sub2.Signature) -} diff --git a/bxmessage/intents_unsubscription.go b/bxmessage/intents_unsubscription.go deleted file mode 100644 index 827c466..0000000 --- a/bxmessage/intents_unsubscription.go +++ /dev/null @@ -1,88 +0,0 @@ -package bxmessage - -import ( - "fmt" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// UnpackIntentsUnsubscription unpacks IntentsUnsubscription bxmessage from bytes -func UnpackIntentsUnsubscription(b []byte, protocol Protocol) (*IntentsUnsubscription, error) { - sub := new(IntentsUnsubscription) - err := sub.Unpack(b, protocol) - if err != nil { - return nil, err - } - - return sub, nil -} - -// NewIntentsUnsubscription constructor for IntentsUnsubscription bxmessage -func NewIntentsUnsubscription(solverAddr string) Message { - return &IntentsUnsubscription{ - Header: Header{}, - SolverAddress: solverAddr, - } -} - -// IntentsUnsubscription bxmessage -type IntentsUnsubscription struct { - Header - SolverAddress string -} - -// Pack packs IntentsUnsubscription into byte array -func (i *IntentsUnsubscription) Pack(protocol Protocol) ([]byte, error) { - if protocol < IntentsProtocol { - return nil, fmt.Errorf("invalid protocol version for IntentsUnsubscription message: %v", protocol) - } - - bufLen, err := calcPackSize( - HeaderLen, - types.ETHAddressLen, - ControlByteLen, - ) - if err != nil { - return nil, fmt.Errorf("calc pack size: %w", err) - } - - buf := make([]byte, bufLen) - var offset int - - n, err := packHeader(buf, i.Header, IntentsUnsubscriptionType) - if err != nil { - return nil, fmt.Errorf("pack Header: %w", err) - } - - offset += n - _, err = packETHAddressHex(buf[offset:], i.SolverAddress) - if err != nil { - return nil, fmt.Errorf("pack SolverAddress: %w", err) - } - - return buf, nil -} - -// Unpack deserializes IntentsUnsubscription from bytes -func (i *IntentsUnsubscription) Unpack(buf []byte, protocol Protocol) error { - var offset int - if protocol < IntentsProtocol { - return fmt.Errorf("invalid protocol version for IntentsUnsubscription message: %v", protocol) - } - - var err error - var n int - - i.Header, n, err = unpackHeader(buf, protocol) - if err != nil { - return fmt.Errorf("unpack Header: %w", err) - } - - offset += n - i.SolverAddress, _, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack SolverAddress: %w", err) - } - - return nil -} diff --git a/bxmessage/intents_unsubscription_test.go b/bxmessage/intents_unsubscription_test.go deleted file mode 100644 index 9e2ccec..0000000 --- a/bxmessage/intents_unsubscription_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package bxmessage - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestIntentsUnsubscription_Unpack(t *testing.T) { - r := genIntentsRequest() - - sub := IntentsUnsubscription{ - Header: Header{ - msgType: IntentsUnsubscriptionType, - }, - SolverAddress: r.SolverAddress, - } - - bytes, err := sub.Pack(CurrentProtocol) - require.NoError(t, err) - - sub2 := IntentsUnsubscription{} - err = sub2.Unpack(bytes, CurrentProtocol) - require.NoError(t, err) - - require.Equal(t, sub.Header.msgType, sub2.Header.msgType) - require.Equal(t, sub.SolverAddress, sub2.SolverAddress) -} diff --git a/bxmessage/mev_bundle.go b/bxmessage/mev_bundle.go index 185c569..87844d8 100644 --- a/bxmessage/mev_bundle.go +++ b/bxmessage/mev_bundle.go @@ -73,6 +73,8 @@ type MEVBundle struct { // From protocol version 52 BlocksCount int `json:"blocks_count,omitempty"` DroppingTxHashes []string `json:"dropping_tx_hashes,omitempty"` + // From protocol version 53 + EndOfBlock bool `json:"end_of_block"` } // NewMEVBundle creates a new MEVBundle @@ -90,6 +92,7 @@ func NewMEVBundle( incomingRefundRecipient string, blocksCount int, droppingTxHashes []string, + endOfBlock bool, ) (MEVBundle, error) { if len(uuid) != 0 && len(uuid) != 36 { return MEVBundle{}, errors.New("invalid uuid len") @@ -108,13 +111,14 @@ func NewMEVBundle( IncomingRefundRecipient: incomingRefundRecipient, BlocksCount: blocksCount, DroppingTxHashes: droppingTxHashes, + EndOfBlock: endOfBlock, }, nil } // String returns a string representation of the MEVBundle func (m MEVBundle) String() string { - return fmt.Sprintf("mev bundle(sender account ID: %s, hash: %s, blockNumber: %s, builders: %v, txs: %d, sent from cloud api: %v, tier: %v, allowMixedBundles: %v, priorityFeeRefund: %v, incomingRefundRecipient: %v, UUID: %s, MinTimestamp %v , MaxTimestamp %v, RevertingHashes %v, blocksCount %v, dropingTxs %v)", - m.OriginalSenderAccountID, m.BundleHash, m.BlockNumber, m.MEVBuilders, len(m.Transactions), m.SentFromCloudAPI, m.OriginalSenderAccountTier, m.AvoidMixedBundles, m.PriorityFeeRefund, m.IncomingRefundRecipient, m.UUID, m.MinTimestamp, m.MaxTimestamp, len(m.RevertingHashes), m.BlocksCount, len(m.DroppingTxHashes)) + return fmt.Sprintf("mev bundle(sender account ID: %s, hash: %s, blockNumber: %s, builders: %v, txs: %d, sent from cloud api: %v, tier: %v, allowMixedBundles: %v, priorityFeeRefund: %v, incomingRefundRecipient: %v, UUID: %s, MinTimestamp %v , MaxTimestamp %v, RevertingHashes %v, blocksCount %v, dropingTxs %v, endOfBlock %v)", + m.OriginalSenderAccountID, m.BundleHash, m.BlockNumber, m.MEVBuilders, len(m.Transactions), m.SentFromCloudAPI, m.OriginalSenderAccountTier, m.AvoidMixedBundles, m.PriorityFeeRefund, m.IncomingRefundRecipient, m.UUID, m.MinTimestamp, m.MaxTimestamp, len(m.RevertingHashes), m.BlocksCount, len(m.DroppingTxHashes), m.EndOfBlock) } // SetHash sets the hash based on the fields in BundleSubmission @@ -163,6 +167,24 @@ func (m *MEVBundle) SetHash() { buf = append(buf, []byte(hash)...) } + endOfBlock := make([]byte, 1) + if m.EndOfBlock { + endOfBlock[0] = 1 + } + buf = append(buf, endOfBlock...) + + avoidMixedBundles := make([]byte, 1) + if m.AvoidMixedBundles { + avoidMixedBundles[0] = 1 + } + buf = append(buf, avoidMixedBundles...) + + priorityFeeRefund := make([]byte, 1) + if m.PriorityFeeRefund { + priorityFeeRefund[0] = 1 + } + buf = append(buf, priorityFeeRefund...) + m.hash = utils.DoubleSHA256(buf[:]) } @@ -242,6 +264,10 @@ func (m MEVBundle) size(protocol Protocol, txs [][]byte) uint32 { size += uint32(types.SHA256HashLen * len(m.DroppingTxHashes)) // DroppingTxHashes } + if protocol >= BundlesEndOfBlocks { + size += types.UInt8Len + } + return size } @@ -452,6 +478,15 @@ func (m MEVBundle) Pack(protocol Protocol) ([]byte, error) { } } + if protocol >= BundlesEndOfBlocks { + if m.EndOfBlock { + buf[offset] = 1 + } else { + buf[offset] = 0 + } + offset += types.UInt8Len + } + if err := checkBuffEnd(&buf, offset); err != nil { return nil, err } @@ -742,6 +777,15 @@ func (m *MEVBundle) Unpack(data []byte, protocol Protocol) error { m.DroppingTxHashes = []string{} } + if protocol >= BundlesEndOfBlocks { + if err = checkBufSize(&data, offset, types.UInt8Len); err != nil { + return err + } + + m.EndOfBlock = data[offset] == 1 + offset += types.UInt8Len //nolint:ineffassign + } + return nil } @@ -816,5 +860,6 @@ func (m *MEVBundle) Clone() *MEVBundle { IncomingRefundRecipient: m.IncomingRefundRecipient, BlocksCount: m.BlocksCount, DroppingTxHashes: m.DroppingTxHashes, + EndOfBlock: m.EndOfBlock, } } diff --git a/bxmessage/mev_bundle_test.go b/bxmessage/mev_bundle_test.go index 8589edf..c279ba7 100644 --- a/bxmessage/mev_bundle_test.go +++ b/bxmessage/mev_bundle_test.go @@ -41,6 +41,7 @@ func TestMEVBundle(t *testing.T) { "0xa74b582bd1505262d2b9154d87b181600f5a6fe7b49bd7f0b0192407773f0143", "0x2d283f3b4bfc4a7fe37ec935566b92e9255d1413a2d0c814125e43750d952ecd", }, + EndOfBlock: true, } b, err := m.Pack(CurrentProtocol) @@ -76,6 +77,7 @@ func TestMEVBundle_EmptyBuilders(t *testing.T) { OriginalSenderAccountTier: sdnmessage.ATierUltra, SentFromCloudAPI: true, DroppingTxHashes: []string{}, + EndOfBlock: false, } b, err := m.Pack(BundlesOverBDNOriginalSenderTierProtocol) @@ -113,6 +115,7 @@ func TestMEVBundle_NoOriginalSenderAccountTier(t *testing.T) { OriginalSenderAccountID: "bloXroute LABS", SentFromCloudAPI: true, DroppingTxHashes: []string{}, + EndOfBlock: false, } b, err := m.Pack(BundlesOverBDNOriginalSenderTierProtocol) @@ -149,6 +152,7 @@ func TestMEVBundlePayoutBackCompatibility(t *testing.T) { }, PerformanceTimestamp: time.Now(), DroppingTxHashes: []string{}, + EndOfBlock: false, } b, err := m.Pack(BundlesOverBDNPayoutProtocol - 1) @@ -190,6 +194,7 @@ func TestMEVBundleOriginalSenderAccountBackCompatibility(t *testing.T) { PerformanceTimestamp: time.Now().UTC(), OriginalSenderAccountID: "bloXroute LABS", DroppingTxHashes: []string{}, + EndOfBlock: false, } b, err := m.Pack(BundlesOverBDNOriginalSenderAccountProtocol - 1) @@ -231,6 +236,7 @@ func TestMEVBundleAvoidMixedBundleBackCompatibility(t *testing.T) { OriginalSenderAccountID: "bloXroute LABS", AvoidMixedBundles: true, DroppingTxHashes: []string{}, + EndOfBlock: false, } b, err := m.Pack(AvoidMixedBundleProtocol - 1) @@ -272,6 +278,7 @@ func TestMevBundlePriorityFeeRefundBackCompatibility(t *testing.T) { OriginalSenderAccountID: "bloXroute LABS", PriorityFeeRefund: true, DroppingTxHashes: []string{}, + EndOfBlock: false, } t.Run("BundlePriorityFeeRefundProtocol - 1 protocol", func(t *testing.T) { @@ -329,8 +336,9 @@ func TestMEVBundleBlocksCountAndDroppingTxsBackCompatibility(t *testing.T) { AvoidMixedBundles: true, BlocksCount: 2, DroppingTxHashes: []string{ - "0xf85d808080945ac6ba4e9b9a4bb23be58af43f15351f70b71769808025a05a35c20b14e4bae033357c7ff5772dbb84a831b290e98ff26fb4073c7483afdba0492ac5720a1c153ca1a35a6214b9811fd04c7ba434c2d0cdf93f8d23080458cb", + "0xa74b582bd1505262d2b9154d87b181600f5a6fe7b49bd7f0b0192407773f0143", }, + EndOfBlock: false, } b, err := m.Pack(BundleBlocksCountAndDroppingTxs - 1) @@ -348,3 +356,48 @@ func TestMEVBundleBlocksCountAndDroppingTxsBackCompatibility(t *testing.T) { assert.Equal(t, m, m2) } + +func TestMEVBundleEndOfBlockCompatibility(t *testing.T) { + m := MEVBundle{ + UUID: "123e4567-e89b-12d3-a456-426614174000", + BundleHash: "0x5ac23d9a014dfbfc3ec5d06435f74c3dbb616a5a7d5dc77b152b1db2c524083d", + Transactions: []string{ + "0xf85d808080945ac6ba4e9b9a4bb23be58af43f15351f70b71769808025a05a35c20b14e4bae033357c7ff5772dbb84a831b290e98ff26fb4073c7483afdba0492ac5720a1c153ca1a35a6214b9811fd04c7ba434c2d0cdf93f8d23080458cb", + "0xf85d8080809419503078a85ceb93e3d7b12721bedcdfc0978ddc808026a05f3cff439aa83fcbde58c2011b5577e98148e7408a170d08acad4e3eb1d64e39a07e4295280fbfff13fbd2e6605bd20b7de0816c25aab8106fdd1ee280cc96a027", + "0xf85d8080809415817f1d896737cbdf4b3dc1cc175be63a9d347f808025a07e809211aff74a5c0af15ee389f53dd0cab085d373f6cef7897948c8518c574fa0024a201974175b06e28bf4ba63709188a30961417394576b5b2ba008dead802f", + }, + BlockNumber: "0x8", + MinTimestamp: 1633036800, + MaxTimestamp: 1633123200, + RevertingHashes: []string{ + "0xa74b582bd1505262d2b9154d87b181600f5a6fe7b49bd7f0b0192407773f0143", + "0x2d283f3b4bfc4a7fe37ec935566b92e9255d1413a2d0c814125e43750d952ecd", + }, + MEVBuilders: map[string]string{ + "builder1": "0x123", + "builder2": "0x456", + }, + PerformanceTimestamp: time.Now().UTC(), + OriginalSenderAccountID: "bloXroute LABS", + AvoidMixedBundles: true, + BlocksCount: 2, + DroppingTxHashes: []string{ + "0xa74b582bd1505262d2b9154d87b181600f5a6fe7b49bd7f0b0192407773f0143", + }, + EndOfBlock: false, + } + + b, err := m.Pack(BundlesEndOfBlocks - 1) + assert.NoError(t, err) + + var m2 MEVBundle + err = m2.Unpack(b, BundlesEndOfBlocks-1) + assert.NoError(t, err) + + m.msgType = MEVBundleType + + // new fields + m.EndOfBlock = false + + assert.Equal(t, m, m2) +} diff --git a/bxmessage/quotes.go b/bxmessage/quotes.go deleted file mode 100644 index 9d9e34e..0000000 --- a/bxmessage/quotes.go +++ /dev/null @@ -1,175 +0,0 @@ -package bxmessage - -import ( - "fmt" - "time" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// Quote bxmessage -type Quote struct { - Header - ID string // UUIDv4 - quote id - DappAddress string // ETH Address - SolverAddress string // ETH Address - Quote []byte // Variable length - Hash []byte // Keccak256 - Signature []byte // ECDSA Signature - Timestamp time.Time // Short timestamp -} - -// NewQuote constructor for Quote bxmessage -func NewQuote(id, dappAddress, solverAddr string, hash, signature, quote []byte, timestamp time.Time) *Quote { - return &Quote{ - Header: Header{msgType: QuotesType}, - ID: id, - DappAddress: dappAddress, - SolverAddress: solverAddr, - Quote: quote, - Hash: hash, - Signature: signature, - Timestamp: timestamp, - } -} - -// UnpackQuote unpacks quote bxmessage -func UnpackQuote(b []byte, protocol Protocol) (*Quote, error) { - quote := new(Quote) - err := quote.Unpack(b, protocol) - if err != nil { - return nil, err - } - - return quote, nil -} - -// Pack packs Quote into raw bytes for broadcasting -func (q *Quote) Pack(protocol Protocol) ([]byte, error) { - if protocol < QuotesProtocol { - return nil, fmt.Errorf("invalid protocol version for IntentSolution message: %v", protocol) - } - bufLen, err := q.size() - if err != nil { - return nil, fmt.Errorf("calc pack size: %w", err) - } - - offset := 0 - buf := make([]byte, bufLen) - - n, err := packHeader(buf, q.Header, QuotesType) - if err != nil { - return nil, fmt.Errorf("pack Header: %w", err) - } - - offset += n - n, err = packUUIDv4String(buf[offset:], q.ID) - if err != nil { - return nil, fmt.Errorf("pack ID: %w", err) - } - - offset += n - n, err = packETHAddressHex(buf[offset:], q.DappAddress) - if err != nil { - return nil, fmt.Errorf("pack DappAddress: %w", err) - } - - offset += n - n, err = packETHAddressHex(buf[offset:], q.SolverAddress) - if err != nil { - return nil, fmt.Errorf("pack SolverAddress: %w", err) - } - - offset += n - n, err = packRawBytes(buf[offset:], q.Quote) - if err != nil { - return nil, fmt.Errorf("pack Quote: %w", err) - } - - offset += n - n, err = packKeccak256Hash(buf[offset:], q.Hash) - if err != nil { - return nil, fmt.Errorf("pack Hash: %w", err) - } - - offset += n - n, err = packECDSASignature(buf[offset:], q.Signature) - if err != nil { - return nil, fmt.Errorf("pack Signature: %w", err) - } - - offset += n - if err := checkBuffEnd(&buf, offset); err != nil { - return nil, err - } - - return buf, nil -} - -// Unpack unpacks bxmessage from raw bytes -func (q *Quote) Unpack(buf []byte, protocol Protocol) error { - var ( - err error - n int - offset = 0 - ) - - if protocol < QuotesProtocol { - return fmt.Errorf("invalid protocol version for QuotesProtocol message: %v", protocol) - } - - q.Header, n, err = unpackHeader(buf, protocol) - if err != nil { - return fmt.Errorf("unpack BroadcastHeader: %v", err) - } - - offset += n - q.ID, n, err = unpackUUIDv4String(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack ID: %v", err) - } - - offset += n - q.DappAddress, n, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack DappAddress: %v", err) - } - - offset += n - q.SolverAddress, n, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack SolverAddress: %v", err) - } - - offset += n - q.Quote, n, err = unpackRawBytes(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Quote: %v", err) - } - - offset += n - q.Hash, n, err = unpackKeccak256Hash(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Hash: %v", err) - } - - offset += n - q.Signature, _, err = unpackECDSASignature(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Signature: %v", err) - } - - return nil -} - -// GetNetworkNum implements BroadcastMessage interface -func (q *Quote) GetNetworkNum() types.NetworkNum { return types.AllNetworkNum } - -func (q *Quote) size() (uint32, error) { - size, err := calcPackSize(HeaderLen, types.UUIDv4Len, types.ETHAddressLen, types.ETHAddressLen, - q.Quote, types.Keccak256HashLen, types.ECDSASignatureLen, ControlByteLen) - if err != nil { - return 0, err - } - return size, nil -} diff --git a/bxmessage/quotes_subscription.go b/bxmessage/quotes_subscription.go deleted file mode 100644 index 92562e4..0000000 --- a/bxmessage/quotes_subscription.go +++ /dev/null @@ -1,90 +0,0 @@ -package bxmessage - -import ( - "fmt" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// UnpackQuotesSubscription unpacks QuotesSubscription bxmessage from bytes -func UnpackQuotesSubscription(b []byte, protocol Protocol) (*QuotesSubscription, error) { - sub := new(QuotesSubscription) - err := sub.Unpack(b, protocol) - if err != nil { - return nil, err - } - return sub, nil -} - -// NewQuotesSubscription constructor for QuotesSubscription bxmessage -func NewQuotesSubscription(dappAddress string) Message { - return &QuotesSubscription{ - Header: Header{}, - DappAddress: dappAddress, - } -} - -// QuotesSubscription bxmessage -type QuotesSubscription struct { - Header - DappAddress string -} - -// Pack packs IntentsQuotesSubscriptionType into bytes array for broadcasting -func (q *QuotesSubscription) Pack(protocol Protocol) ([]byte, error) { - if protocol < QuotesProtocol { - return nil, fmt.Errorf("invalid protocol version for QuotesProtocol message: %v", protocol) - } - - bufLen, err := calcPackSize(HeaderLen, types.ETHAddressLen, ControlByteLen) - if err != nil { - return nil, fmt.Errorf("calc pack size: %w", err) - } - - buf := make([]byte, bufLen) - var offset int - - n, err := packHeader(buf, q.Header, QuotesSubscriptionType) - if err != nil { - return nil, fmt.Errorf("pack Header: %w", err) - } - - offset += n - n, err = packETHAddressHex(buf[offset:], q.DappAddress) - if err != nil { - return nil, fmt.Errorf("pack SolverAddress: %w", err) - } - - offset += n - if err := checkBuffEnd(&buf, offset); err != nil { - return nil, err - } - - return buf, nil -} - -// Unpack deserializes IntentsQuotesSubscriptionType from bytes -func (q *QuotesSubscription) Unpack(buf []byte, protocol Protocol) error { - var ( - err error - n int - offset = 0 - ) - - if protocol < QuotesProtocol { - return fmt.Errorf("invalid protocol version for QuotesProtocol message: %v", protocol) - } - - q.Header, n, err = unpackHeader(buf, protocol) - if err != nil { - return fmt.Errorf("unpack Header: %w", err) - } - - offset += n - q.DappAddress, _, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack DappAddress: %w", err) - } - - return nil -} diff --git a/bxmessage/quotes_test.go b/bxmessage/quotes_test.go deleted file mode 100644 index 8d0afee..0000000 --- a/bxmessage/quotes_test.go +++ /dev/null @@ -1,66 +0,0 @@ -package bxmessage - -import ( - "crypto/ecdsa" - "testing" - - "github.com/bloXroute-Labs/gateway/v2/utils/intent" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestQuotes_Unpack(t *testing.T) { - quote := createTestQuote(t) - bytes, err := quote.Pack(CurrentProtocol) - require.NoError(t, err) - - quoteRes := Quote{} - err = quoteRes.Unpack(bytes, CurrentProtocol) - require.NoError(t, err) - assert.Equal(t, quoteRes, quote) -} - -func createTestQuote(t *testing.T) Quote { - solverPrivKey, err := crypto.GenerateKey() - if err != nil { - panic(err) - } - dappPrivKey, err := crypto.GenerateKey() - if err != nil { - panic(err) - } - - dappAddress := createAddressFromPrivateKey(dappPrivKey) - solverAddress := createAddressFromPrivateKey(solverPrivKey) - quoteByte := []byte("this is test :(") - - id, err := intent.GenerateQuoteID(dappAddress.String(), quoteByte) - require.NoError(t, err) - quote := Quote{ - Header: Header{msgType: QuotesType}, - ID: id, - DappAddress: dappAddress.String(), - SolverAddress: solverAddress.String(), - Quote: quoteByte, - } - - combined := append([]byte(quote.SolverAddress), []byte(quote.DappAddress)...) - quote.Hash = crypto.Keccak256Hash(combined).Bytes() - - sig, err := crypto.Sign(quote.Hash, solverPrivKey) - if err != nil { - panic(err) - } - quote.Signature = sig - - return quote -} - -// createAddressFromPrivateKey creates an address from a given private key -func createAddressFromPrivateKey(privKey *ecdsa.PrivateKey) common.Address { - pubKey := privKey.PublicKey - signerAddress := crypto.PubkeyToAddress(pubKey) - return signerAddress -} diff --git a/bxmessage/quotes_unsubscription.go b/bxmessage/quotes_unsubscription.go deleted file mode 100644 index c765639..0000000 --- a/bxmessage/quotes_unsubscription.go +++ /dev/null @@ -1,91 +0,0 @@ -package bxmessage - -import ( - "fmt" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// UnpackQuotesUnsubscription unpacks QuotesUnsubscription bxmessage from bytes -func UnpackQuotesUnsubscription(b []byte, protocol Protocol) (*QuotesUnsubscription, error) { - sub := new(QuotesUnsubscription) - err := sub.Unpack(b, protocol) - if err != nil { - return nil, err - } - return sub, nil -} - -// QuotesUnsubscription constructor for QuotesUnsubscription bxmessage -type QuotesUnsubscription struct { - Header - DAppAddress string -} - -// NewQuotesUnsubscription constructor for QuotesUnsubscription bxmessage -func NewQuotesUnsubscription(dAppAddr string) Message { - return &QuotesUnsubscription{ - Header: Header{}, - DAppAddress: dAppAddr, - } -} - -// Pack packs QuotesUnsubscription into byte array -func (qu *QuotesUnsubscription) Pack(protocol Protocol) ([]byte, error) { - if protocol < QuotesProtocol { - return nil, fmt.Errorf("invalid protocol version for QuotesUnsubscription message: %v", protocol) - } - bufLen, err := calcPackSize( - HeaderLen, - types.ETHAddressLen, - ControlByteLen, - ) - if err != nil { - return nil, fmt.Errorf("calc pack size: %w", err) - } - - buf := make([]byte, bufLen) - var offset int - - n, err := packHeader(buf, qu.Header, QuotesUnsubscriptionType) - if err != nil { - return nil, fmt.Errorf("pack Header: %w", err) - } - - offset += n - n, err = packETHAddressHex(buf[offset:], qu.DAppAddress) - if err != nil { - return nil, fmt.Errorf("pack DappAddress: %w", err) - } - - offset += n - if err := checkBuffEnd(&buf, offset); err != nil { - return nil, err - } - - return buf, nil -} - -// Unpack deserializes QuotesUnsubscription from bytes -func (qu *QuotesUnsubscription) Unpack(buf []byte, protocol Protocol) error { - var offset int - if protocol < QuotesProtocol { - return fmt.Errorf("invalid protocol version for QuotesProtocol message: %v", protocol) - } - - var err error - var n int - - qu.Header, n, err = unpackHeader(buf, protocol) - if err != nil { - return fmt.Errorf("unpack Header: %w", err) - } - - offset += n - qu.DAppAddress, _, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack DappAddress: %w", err) - } - - return nil -} diff --git a/bxmessage/quotes_unsubscription_test.go b/bxmessage/quotes_unsubscription_test.go deleted file mode 100644 index e0ece85..0000000 --- a/bxmessage/quotes_unsubscription_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package bxmessage - -import ( - "testing" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/require" -) - -func TestQuotesUnsubscription_Unpack(t *testing.T) { - privKey, err := crypto.GenerateKey() - if err != nil { - panic(err) - } - - pubKey := privKey.PublicKey - signerAddress := crypto.PubkeyToAddress(pubKey) - - sub := QuotesUnsubscription{ - Header: Header{ - msgType: QuotesUnsubscriptionType, - }, - DAppAddress: signerAddress.String(), - } - - bytes, err := sub.Pack(CurrentProtocol) - require.NoError(t, err) - - sub2 := QuotesUnsubscription{} - err = sub2.Unpack(bytes, CurrentProtocol) - require.NoError(t, err) - - require.Equal(t, sub.Header.msgType, sub2.Header.msgType) - require.Equal(t, sub.DAppAddress, sub2.DAppAddress) -} diff --git a/bxmessage/solutions_subscription.go b/bxmessage/solutions_subscription.go deleted file mode 100644 index 5e76006..0000000 --- a/bxmessage/solutions_subscription.go +++ /dev/null @@ -1,124 +0,0 @@ -package bxmessage - -import ( - "fmt" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// UnpackSolutionsSubscription unpacks SolutionsSubscription bxmessage from bytes -func UnpackSolutionsSubscription(b []byte, protocol Protocol) (*SolutionsSubscription, error) { - sub := new(SolutionsSubscription) - err := sub.Unpack(b, protocol) - if err != nil { - return nil, err - } - - return sub, nil -} - -// NewSolutionsSubscription constructor for SolutionsSubscription bxmessage -func NewSolutionsSubscription(dAppOrSenderAddr string, hash, signature []byte) Message { - return &SolutionsSubscription{ - Header: Header{}, - DAppOrSenderAddress: dAppOrSenderAddr, - Hash: hash, - Signature: signature, - } -} - -// SolutionsSubscription describes solutions subscription bxmessage -type SolutionsSubscription struct { - Header - DAppOrSenderAddress string - Hash []byte - Signature []byte -} - -// Pack packs SolutionsSubscription into bytes array -func (i *SolutionsSubscription) Pack(protocol Protocol) ([]byte, error) { - if protocol < IntentsProtocol { - return nil, fmt.Errorf("invalid protocol version for SolutionsSubscription message: %v", protocol) - } - - bufLen, err := calcPackSize( - HeaderLen, - types.ETHAddressLen, - types.Keccak256HashLen, - types.ECDSASignatureLen, - ControlByteLen, - ) - if err != nil { - return nil, fmt.Errorf("calc pack size: %w", err) - } - - buf := make([]byte, bufLen) - var offset int - - n, err := packHeader(buf, i.Header, SolutionsSubscriptionType) - if err != nil { - return nil, fmt.Errorf("pack Header: %w", err) - } - - offset += n - n, err = packETHAddressHex(buf[offset:], i.DAppOrSenderAddress) - if err != nil { - return nil, fmt.Errorf("pack DAppAddress: %w", err) - } - - offset += n - n, err = packKeccak256Hash(buf[offset:], i.Hash) - if err != nil { - return nil, fmt.Errorf("pack Hash: %w", err) - } - - offset += n - n, err = packECDSASignature(buf[offset:], i.Signature) - if err != nil { - return nil, fmt.Errorf("pack Signature: %w", err) - } - - offset += n - if err := checkBuffEnd(&buf, offset); err != nil { - return nil, err - } - - return buf, nil -} - -// Unpack deserializes SolutionSubscription from bytes -func (i *SolutionsSubscription) Unpack(buf []byte, protocol Protocol) error { - var offset int - - if protocol < IntentsProtocol { - return fmt.Errorf("invalid protocol version for SolutionsSubscription message: %v", protocol) - } - - var err error - var n int - - i.Header, n, err = unpackHeader(buf, protocol) - if err != nil { - return fmt.Errorf("unpack Header: %w", err) - } - - offset += n - i.DAppOrSenderAddress, n, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack DAppAddress: %w", err) - } - - offset += n - i.Hash, n, err = unpackKeccak256Hash(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Hash: %w", err) - } - - offset += n - i.Signature, _, err = unpackECDSASignature(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack Signature: %w", err) - } - - return nil -} diff --git a/bxmessage/solutions_subscription_test.go b/bxmessage/solutions_subscription_test.go deleted file mode 100644 index c4b3af3..0000000 --- a/bxmessage/solutions_subscription_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package bxmessage - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestSolutionsSubscription_Unpack(t *testing.T) { - r := genIntentsRequest() - - sub := SolutionsSubscription{ - Header: Header{ - msgType: SolutionsSubscriptionType, - }, - DAppOrSenderAddress: r.SolverAddress, - Hash: r.Hash, - Signature: r.Signature, - } - - bytes, err := sub.Pack(CurrentProtocol) - require.NoError(t, err) - - sub2 := SolutionsSubscription{} - err = sub2.Unpack(bytes, CurrentProtocol) - require.NoError(t, err) - - require.Equal(t, sub.Header.msgType, sub2.Header.msgType) - require.Equal(t, sub.DAppOrSenderAddress, sub2.DAppOrSenderAddress) - require.Equal(t, sub.Hash, sub2.Hash) - require.Equal(t, sub.Signature, sub2.Signature) -} diff --git a/bxmessage/solutions_unsubscription.go b/bxmessage/solutions_unsubscription.go deleted file mode 100644 index 7663c06..0000000 --- a/bxmessage/solutions_unsubscription.go +++ /dev/null @@ -1,93 +0,0 @@ -package bxmessage - -import ( - "fmt" - - "github.com/bloXroute-Labs/gateway/v2/types" -) - -// UnpackSolutionsUnsubscription unpacks SolutionsUnsubscription bxmessage from bytes -func UnpackSolutionsUnsubscription(b []byte, protocol Protocol) (*SolutionsUnsubscription, error) { - sub := new(SolutionsUnsubscription) - err := sub.Unpack(b, protocol) - if err != nil { - return nil, err - } - - return sub, nil -} - -// NewSolutionsUnsubscription constructor for SolutionsUnsubscription bxmessage -func NewSolutionsUnsubscription(dAppAddr string) Message { - return &SolutionsUnsubscription{ - Header: Header{}, - DAppAddress: dAppAddr, - } -} - -// SolutionsUnsubscription bxmessage -type SolutionsUnsubscription struct { - Header - DAppAddress string -} - -// Pack packs SolutionsUnsubscription into bytes -func (i *SolutionsUnsubscription) Pack(protocol Protocol) ([]byte, error) { - if protocol < IntentsProtocol { - return nil, fmt.Errorf("invalid protocol version for SolutionsUnsubscription message: %v", protocol) - } - - bufLen, err := calcPackSize( - HeaderLen, - types.ETHAddressLen, - ControlByteLen, - ) - if err != nil { - return nil, fmt.Errorf("calc pack size: %w", err) - } - - buf := make([]byte, bufLen) - var offset int - - n, err := packHeader(buf, i.Header, SolutionsUnsubscriptionType) - if err != nil { - return nil, fmt.Errorf("pack Header: %w", err) - } - - offset += n - n, err = packETHAddressHex(buf[offset:], i.DAppAddress) - if err != nil { - return nil, fmt.Errorf("pack DAppAddress: %w", err) - } - - offset += n - if err := checkBuffEnd(&buf, offset); err != nil { - return nil, err - } - - return buf, nil -} - -// Unpack deserilizes SolutionsUnsubscription bxmessage -func (i *SolutionsUnsubscription) Unpack(buf []byte, protocol Protocol) error { - var offset int - if protocol < IntentsProtocol { - return fmt.Errorf("invalid protocol version for SolutionsUnsubscription message: %v", protocol) - } - - var err error - var n int - - i.Header, n, err = unpackHeader(buf, protocol) - if err != nil { - return fmt.Errorf("unpack Header: %w", err) - } - - offset += n - i.DAppAddress, _, err = unpackETHAddressHex(buf[offset:]) - if err != nil { - return fmt.Errorf("unpack DAppAddress: %w", err) - } - - return nil -} diff --git a/bxmessage/solutions_unsubscription_test.go b/bxmessage/solutions_unsubscription_test.go deleted file mode 100644 index 85b85ca..0000000 --- a/bxmessage/solutions_unsubscription_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package bxmessage - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestSolutionsUnsubscription_Unpack(t *testing.T) { - r := genIntentsRequest() - - sub := SolutionsUnsubscription{ - Header: Header{ - msgType: SolutionsUnsubscriptionType, - }, - DAppAddress: r.SolverAddress, - } - - bytes, err := sub.Pack(CurrentProtocol) - require.NoError(t, err) - - sub2 := SolutionsUnsubscription{} - err = sub2.Unpack(bytes, CurrentProtocol) - require.NoError(t, err) - - require.Equal(t, sub.Header.msgType, sub2.Header.msgType) - require.Equal(t, sub.DAppAddress, sub2.DAppAddress) -} diff --git a/cmd/gateway/main.go b/cmd/gateway/main.go index 468cc43..a594e5f 100644 --- a/cmd/gateway/main.go +++ b/cmd/gateway/main.go @@ -85,7 +85,6 @@ func main() { utils.EnableDynamicPeers, utils.ForwardTransactionEndpoint, utils.ForwardTransactionMethod, - utils.PolygonMainnetHeimdallEndpoints, utils.TransactionHoldDuration, utils.TransactionPassedDueDuration, utils.EnableBlockchainRPCMethodSupport, @@ -96,7 +95,6 @@ func main() { utils.NoStats, utils.EnableBloomFilter, utils.TxIncludeSenderInFeed, - utils.EnableIntroductoryIntentsAccess, utils.BeaconTrustedPeersFileFlag, utils.BeaconPort, }, @@ -258,7 +256,6 @@ func runGateway(c *cli.Context) error { sdn, sslCerts, len(ethConfig.StaticPeers.Enodes()), - c.String(utils.PolygonMainnetHeimdallEndpoints.Name), c.Int(utils.TransactionHoldDuration.Name), c.Int(utils.TransactionPassedDueDuration.Name), c.Bool(utils.EnableBloomFilter.Name), diff --git a/config/bx.go b/config/bx.go index c36bd8c..b0fa8ad 100644 --- a/config/bx.go +++ b/config/bx.go @@ -7,10 +7,11 @@ import ( "os" "time" + "github.com/urfave/cli/v2" + "github.com/bloXroute-Labs/gateway/v2/logger" "github.com/bloXroute-Labs/gateway/v2/utils" "github.com/bloXroute-Labs/gateway/v2/utils/bundle" - "github.com/urfave/cli/v2" ) const ( @@ -57,7 +58,6 @@ type Bx struct { NoTxsToBlockchain bool NoBlocks bool NoStats bool - AllowIntroductoryTierAccess bool *GRPC *Env @@ -123,15 +123,14 @@ func NewBxFromCLI(ctx *cli.Context) (*Bx, error) { MEVBuilders: mevBuilders, - ForwardTransactionEndpoint: ctx.String(utils.ForwardTransactionEndpoint.Name), - ForwardTransactionMethod: ctx.String(utils.ForwardTransactionMethod.Name), - EnableDynamicPeers: ctx.Bool(utils.EnableDynamicPeers.Name), - EnableBlockchainRPC: ctx.Bool(utils.EnableBlockchainRPCMethodSupport.Name), - PendingTxsSourceFromNode: ctx.Bool(utils.PendingTxsSourceFromNode.Name), - NoTxsToBlockchain: ctx.Bool(utils.NoTxsToBlockchain.Name), - NoBlocks: ctx.Bool(utils.NoBlocks.Name), - NoStats: ctx.Bool(utils.NoStats.Name), - AllowIntroductoryTierAccess: ctx.Bool(utils.EnableIntroductoryIntentsAccess.Name), + ForwardTransactionEndpoint: ctx.String(utils.ForwardTransactionEndpoint.Name), + ForwardTransactionMethod: ctx.String(utils.ForwardTransactionMethod.Name), + EnableDynamicPeers: ctx.Bool(utils.EnableDynamicPeers.Name), + EnableBlockchainRPC: ctx.Bool(utils.EnableBlockchainRPCMethodSupport.Name), + PendingTxsSourceFromNode: ctx.Bool(utils.PendingTxsSourceFromNode.Name), + NoTxsToBlockchain: ctx.Bool(utils.NoTxsToBlockchain.Name), + NoBlocks: ctx.Bool(utils.NoBlocks.Name), + NoStats: ctx.Bool(utils.NoStats.Name), GRPC: grpcConfig, Env: env, diff --git a/connections/handler/bxconn.go b/connections/handler/bxconn.go index 0749a91..9c76a98 100644 --- a/connections/handler/bxconn.go +++ b/connections/handler/bxconn.go @@ -345,38 +345,6 @@ func (b *BxConn) ProcessMessage(msgBytes bxmessage.MessageBytes) { return } _ = b.Node.HandleMsg(mevBundle, b, connections.RunForeground) - case bxmessage.IntentType: - intent, err := bxmessage.UnpackIntent(msg, b.Protocol()) - if err != nil { - b.log.Warnf("failed to unpack intent message: %v", err) - return - } - - _ = b.Node.HandleMsg(intent, b, connections.RunBackground) //nolint:errcheck - case bxmessage.QuotesType: - quote, err := bxmessage.UnpackQuote(msg, b.Protocol()) - if err != nil { - b.log.Warnf("failed to unpack quote message: %v", err) - return - } - - _ = b.Node.HandleMsg(quote, b, connections.RunBackground) //nolint:errcheck - case bxmessage.IntentSolutionType: - solution, err := bxmessage.UnpackIntentSolution(msg, b.Protocol()) - if err != nil { - b.log.Warnf("failed to unpack intent solution message: %v", err) - return - } - - _ = b.Node.HandleMsg(solution, b, connections.RunBackground) //nolint:errcheck - case bxmessage.IntentSolutionsType: - solutions, err := bxmessage.UnpackIntentSolutions(msg, b.Protocol()) - if err != nil { - b.Log().Warnf("failed to unpack intent solutions message: %v", err) - return - } - - _ = b.Node.HandleMsg(solutions, b, connections.RunForeground) //nolint:errcheck case bxmessage.BeaconMessageType: beaconMessage := &bxmessage.BeaconMessage{} if err := beaconMessage.Unpack(msg, b.Protocol()); err != nil { diff --git a/connections/sdnhttp_integration_test.go b/connections/sdnhttp_integration_test.go index 7e063c4..548e70b 100644 --- a/connections/sdnhttp_integration_test.go +++ b/connections/sdnhttp_integration_test.go @@ -8,17 +8,18 @@ import ( "os" "testing" + "github.com/stretchr/testify/assert" + "github.com/bloXroute-Labs/gateway/v2/sdnmessage" "github.com/bloXroute-Labs/gateway/v2/types" "github.com/bloXroute-Labs/gateway/v2/utils" - "github.com/stretchr/testify/assert" ) -//Requires setting these environment variables: -//REGISTRATION_ONLY_CERT_PATH -//REGISTRATION_ONLY_KEY_PATH -//API_CERT_PATH (for testnet) -//API_KEY_PATH (for testnet) +// Requires setting these environment variables: +// REGISTRATION_ONLY_CERT_PATH +// REGISTRATION_ONLY_KEY_PATH +// API_CERT_PATH (for testnet) +// API_KEY_PATH (for testnet) func getSSLCerts(t *testing.T) utils.SSLCerts { apiCertPath := os.Getenv("API_CERT_PATH") @@ -53,7 +54,6 @@ func TestInitGateway_GetsCorrectBlockchainNetworkFromProtocolAndNetwork(t *testi txSyncIntervalS float64 }{ {"Ethereum", "Mainnet", 5, "d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3", 15, 1048576, 1048576, 12, 1800}, - {"Ethereum", "Polygon-Mainnet", 36, "a9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b", 600, 2097152, 100000, 6, 1800}, {"Ethereum", "BSC-Mainnet", 10, "0d21840abff46b96c84b2ac9e10e4f5cdaeb5693cb665db62a2f3b02d2d57b5b", 15, 1048576, 1048576, 12, 1800}, {"BitcoinCash", "Mainnet", 3, "", 600, 33554432, 1048576, 6, 1800}, } @@ -72,14 +72,14 @@ func TestInitGateway_GetsCorrectBlockchainNetworkFromProtocolAndNetwork(t *testi err := s.InitGateway(testCase.protocol, testCase.network) assert.NoError(t, err) - //check Network Number correct + // check Network Number correct bcn, found := (*s.Networks())[testCase.networkNumber] if !found || bcn == nil { t.FailNow() } assert.Len(t, *s.Networks(), 1) - //check Network correct + // check Network correct assert.Equal(t, testCase.protocol, bcn.Protocol) assert.Equal(t, testCase.network, bcn.Network) assert.Equal(t, testCase.networkNumber, bcn.NetworkNum) diff --git a/constants.go b/constants.go index 52f2578..05b44f5 100644 --- a/constants.go +++ b/constants.go @@ -153,6 +153,9 @@ const ( ExternalTitanBuilderName = "titan" ) +// BaseMainnet - for Base main net blockchain network name +const BaseMainnet = "Base-Mainnet" + // Mainnet - for Ethereum main net blockchain network name const Mainnet = "Mainnet" @@ -165,38 +168,29 @@ const BSCTestnet = "BSC-Testnet" // Holesky - for Holesky testnet blockchain network name const Holesky = "Holesky" -// PolygonMainnet - for Polygon main net blockchain network name -const PolygonMainnet = "Polygon-Mainnet" - -// PolygonMumbai - for Polygon Mumbai blockchain network name -const PolygonMumbai = "Polygon-Mumbai" - // MainnetNum - for Ethereum main net blockchain network number const MainnetNum types.NetworkNum = 5 // BSCMainnetNum - for BSC main net blockchain network number const BSCMainnetNum types.NetworkNum = 10 +// BaseChainID -- Base chain ID +const BaseChainID = 8453 + // BSCChainID - BSC chain ID const BSCChainID = 56 // EthChainID - eth chain ID const EthChainID types.NetworkID = 1 -// PolygonChainID - polygon chain ID -const PolygonChainID types.NetworkID = 137 - // BSCTestnetChainID - BSC Testnet chain ID const BSCTestnetChainID = 97 // HoleskyChainID - Holesky Testnet chain ID const HoleskyChainID = 17000 -// PolygonMainnetNum - for Polygon main net blockchain network number -const PolygonMainnetNum types.NetworkNum = 36 - -// PolygonMumbaiNum - for Polygon Mumbai blockchain network number -const PolygonMumbaiNum types.NetworkNum = 47 +// BaseMainnetNum - for Base main net blockchain network number +const BaseMainnetNum types.NetworkNum = 456 // BSCTestnetNum - for BSC-Testnet blockchain network number const BSCTestnetNum types.NetworkNum = 42 @@ -216,41 +210,33 @@ const ( // BlockchainNetworkToNetworkNum converts blockchain network to number var BlockchainNetworkToNetworkNum = map[string]types.NetworkNum{ - Mainnet: MainnetNum, - BSCMainnet: BSCMainnetNum, - PolygonMainnet: PolygonMainnetNum, - PolygonMumbai: PolygonMumbaiNum, - BSCTestnet: BSCTestnetNum, - Holesky: HoleskyNum, + Mainnet: MainnetNum, + BSCMainnet: BSCMainnetNum, + BSCTestnet: BSCTestnetNum, + Holesky: HoleskyNum, } // NetworkToBlockDuration defines block interval for each network var NetworkToBlockDuration = map[string]time.Duration{ - Mainnet: 12 * time.Second, - Holesky: 12 * time.Second, - BSCMainnet: 3 * time.Second, - BSCTestnet: 3 * time.Second, - PolygonMainnet: 2 * time.Second, - PolygonMumbai: 2 * time.Second, + Mainnet: 12 * time.Second, + Holesky: 12 * time.Second, + BSCMainnet: 3 * time.Second, + BSCTestnet: 3 * time.Second, } // NetworkNumToChainID - Mapping from networkNum to chainID var NetworkNumToChainID = map[types.NetworkNum]types.NetworkID{ - MainnetNum: EthChainID, - BSCMainnetNum: BSCChainID, - PolygonMainnetNum: PolygonChainID, - PolygonMumbaiNum: PolygonChainID, - HoleskyNum: HoleskyChainID, + MainnetNum: EthChainID, + BSCMainnetNum: BSCChainID, + HoleskyNum: HoleskyChainID, } // NetworkNumToBlockchainNetwork - Mapping from networkNum to blockchain network var NetworkNumToBlockchainNetwork = map[types.NetworkNum]string{ - MainnetNum: Mainnet, - BSCMainnetNum: BSCMainnet, - PolygonMainnetNum: PolygonMainnet, - PolygonMumbaiNum: PolygonMumbai, - BSCTestnetNum: BSCTestnet, - HoleskyNum: Holesky, + MainnetNum: Mainnet, + BSCMainnetNum: BSCMainnet, + BSCTestnetNum: BSCTestnet, + HoleskyNum: Holesky, } // ErrSubscriptionNotFound - error for subscription not found diff --git a/go.mod b/go.mod index b1cda02..6a61a0b 100644 --- a/go.mod +++ b/go.mod @@ -5,43 +5,41 @@ go 1.23 require ( github.com/bits-and-blooms/bloom/v3 v3.7.0 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 - github.com/cenkalti/backoff/v4 v4.3.0 github.com/ethereum/go-ethereum v1.14.5 github.com/fluent/fluent-logger-golang v1.9.0 github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.3 - github.com/holiman/uint256 v1.3.1 + github.com/holiman/uint256 v1.3.2 github.com/jarcoal/httpmock v1.3.1 github.com/jinzhu/copier v0.4.0 - github.com/libp2p/go-libp2p v0.33.2 + github.com/libp2p/go-libp2p v0.38.1 github.com/libp2p/go-libp2p-mplex v0.9.0 - github.com/libp2p/go-libp2p-pubsub v0.10.0 - github.com/multiformats/go-multiaddr v0.13.0 - github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 - github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 - github.com/prysmaticlabs/prysm/v5 v5.0.3 + github.com/libp2p/go-libp2p-pubsub v0.12.0 + github.com/multiformats/go-multiaddr v0.14.0 + github.com/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516 + github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15 + github.com/prysmaticlabs/prysm/v5 v5.2.0 github.com/puzpuzpuz/xsync/v2 v2.5.1 github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc github.com/rs/zerolog v1.33.0 github.com/satori/go.uuid v1.2.1-0.20181016170032-d91630c85102 github.com/sourcegraph/jsonrpc2 v0.2.1-0.20240223163137-534fd43609f0 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 github.com/struCoder/pidusage v0.2.1 github.com/urfave/cli/v2 v2.27.5 github.com/wk8/go-ordered-map/v2 v2.1.8 github.com/zhouzhuojie/conditions v0.2.3 go.uber.org/atomic v1.11.0 go.uber.org/mock v0.5.0 - golang.org/x/crypto v0.28.0 - golang.org/x/sync v0.8.0 - google.golang.org/grpc v1.67.1 - google.golang.org/protobuf v1.35.1 + golang.org/x/crypto v0.32.0 + golang.org/x/sync v0.10.0 + google.golang.org/grpc v1.69.2 + google.golang.org/protobuf v1.36.2 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) require ( - contrib.go.opencensus.io/exporter/jaeger v0.2.1 // indirect github.com/BurntSushi/toml v1.4.0 // indirect github.com/DataDog/zstd v1.5.5 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect @@ -52,7 +50,7 @@ require ( github.com/bazelbuild/rules_go v0.23.2 // indirect github.com/benbjohnson/clock v1.3.5 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.11.0 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect @@ -62,13 +60,13 @@ require ( github.com/cockroachdb/pebble v1.1.0 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/consensys/bavard v0.1.25 // indirect + github.com/consensys/gnark-crypto v0.14.0 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect - github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect + github.com/crate-crypto/go-kzg-4844 v1.1.0 // indirect github.com/d4l3k/messagediff v1.2.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect @@ -78,29 +76,27 @@ require ( github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/elastic/gosigar v0.14.3 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect - github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.3 // indirect + github.com/ethereum/go-verkle v0.2.2 // indirect github.com/flynn/noise v1.1.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/getsentry/sentry-go v0.25.0 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.5.4 // indirect + github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // 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/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect - github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/huin/goupnp v1.3.0 // indirect @@ -110,27 +106,27 @@ require ( github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect - github.com/klauspost/compress v1.17.8 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect - github.com/koron/go-ssdp v0.0.4 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/koron/go-ssdp v0.0.5 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-flow-metrics v0.1.0 // indirect + github.com/libp2p/go-flow-metrics v0.2.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect github.com/libp2p/go-mplex v0.7.0 // indirect github.com/libp2p/go-msgio v0.3.0 // indirect github.com/libp2p/go-nat v0.2.0 // indirect - github.com/libp2p/go-netroute v0.2.1 // indirect + github.com/libp2p/go-netroute v0.2.2 // indirect github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/libp2p/go-yamux/v4 v4.0.1 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // 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-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/miekg/dns v1.1.59 // indirect + github.com/miekg/dns v1.1.62 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/highwayhash v1.0.2 // indirect @@ -144,77 +140,97 @@ require ( github.com/mr-tron/base58 v1.2.0 // indirect github.com/multiformats/go-base32 v0.1.0 // indirect github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect + github.com/multiformats/go-multiaddr-dns v0.4.1 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect github.com/multiformats/go-multicodec v0.9.0 // indirect github.com/multiformats/go-multihash v0.2.3 // indirect - github.com/multiformats/go-multistream v0.5.0 // indirect + github.com/multiformats/go-multistream v0.6.0 // indirect github.com/multiformats/go-varint v0.0.7 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/ginkgo/v2 v2.17.2 // indirect + github.com/onsi/ginkgo/v2 v2.22.2 // indirect github.com/opencontainers/runtime-spec v1.2.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/philhofer/fwd v1.1.1 // indirect + github.com/pion/datachannel v1.5.10 // indirect + github.com/pion/dtls/v2 v2.2.12 // indirect + github.com/pion/ice/v2 v2.3.37 // indirect + github.com/pion/interceptor v0.1.37 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/mdns v0.0.12 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/rtcp v1.2.15 // indirect + github.com/pion/rtp v1.8.10 // indirect + github.com/pion/sctp v1.8.35 // indirect + github.com/pion/sdp/v3 v3.0.9 // indirect + github.com/pion/srtp/v2 v2.0.20 // indirect + github.com/pion/stun v0.6.1 // indirect + github.com/pion/transport/v2 v2.2.10 // indirect + github.com/pion/transport/v3 v3.0.7 // indirect + github.com/pion/turn/v2 v2.1.6 // indirect + github.com/pion/webrtc/v3 v3.3.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.19.0 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.53.0 // indirect - github.com/prometheus/procfs v0.14.0 // indirect - github.com/prysmaticlabs/gohashtree v0.0.4-beta // indirect + github.com/prometheus/common v0.61.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b // indirect github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c // indirect - github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/quic-go v0.42.0 // indirect - github.com/quic-go/webtransport-go v0.6.0 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.48.2 // indirect + github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/rs/cors v1.7.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/schollz/progressbar/v3 v3.3.4 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/supranational/blst v0.3.11 // indirect + github.com/supranational/blst v0.3.13 // indirect github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect github.com/tinylib/msgp v1.1.5 // indirect github.com/tklauser/go-sysconf v0.3.13 // indirect github.com/tklauser/numcpus v0.7.0 // indirect - github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect + github.com/wlynxg/anet v0.0.5 // indirect github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect go.etcd.io/bbolt v1.3.6 // indirect - go.opencensus.io v0.24.0 // indirect - go.uber.org/dig v1.17.1 // indirect - go.uber.org/fx v1.21.1 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/otel/sdk v1.31.0 // indirect + go.opentelemetry.io/otel/trace v1.31.0 // indirect + go.uber.org/dig v1.18.0 // indirect + go.uber.org/fx v1.23.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/net v0.28.0 // indirect - golang.org/x/oauth2 v0.22.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/term v0.25.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/oauth2 v0.24.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/time v0.5.0 // indirect - golang.org/x/tools v0.22.0 // indirect - google.golang.org/api v0.44.0 // indirect - google.golang.org/genproto v0.0.0-20230525234025-438c736192d0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + golang.org/x/tools v0.29.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422 // indirect gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apimachinery v0.20.0 // indirect - k8s.io/client-go v0.20.0 // indirect - k8s.io/klog/v2 v2.80.0 // indirect - k8s.io/utils v0.0.0-20201110183641-67b214c5f920 // indirect - lukechampine.com/blake3 v1.2.2 // indirect + k8s.io/apimachinery v0.30.4 // indirect + k8s.io/client-go v0.30.4 // indirect + k8s.io/klog/v2 v2.120.1 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + lukechampine.com/blake3 v1.3.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.0.2 // indirect - sigs.k8s.io/yaml v1.2.0 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index c55495a..0ab837b 100644 --- a/go.sum +++ b/go.sum @@ -2,72 +2,21 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -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.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= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -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.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= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -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= -contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= -contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/sarama v1.26.1/go.mod h1:NbSGBSSndYaIhRcBtY9V0U7AyH+x71bG668AuWys/yU= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= @@ -84,7 +33,6 @@ github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/aristanetworks/fsnotify v1.4.2/go.mod h1:D/rtu7LpjYM8tRJphJ0hUBYpjai8SfX+aSNsWDTq/Ks= @@ -96,7 +44,6 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= @@ -114,8 +61,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/bits-and-blooms/bitset v1.11.0 h1:RMyy2mBBShArUAhfVRZJ2xyBO58KCBCtZFShw3umo6k= -github.com/bits-and-blooms/bitset v1.11.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/bits-and-blooms/bloom/v3 v3.7.0 h1:VfknkqV4xI+PsaDIsoHueyxVDZrfvMn56jeWUzvzdls= github.com/bits-and-blooms/bloom/v3 v3.7.0/go.mod h1:VKlUSvp0lFIYqxJjzdnSsZEw4iHb1kOL2tfHTgyJBHg= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= @@ -130,8 +77,6 @@ github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMU github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= @@ -147,9 +92,6 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= @@ -164,10 +106,10 @@ github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZ 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= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/bavard v0.1.25 h1:5YcSBnp03/HvfpKaIQLr/ecspTp2k8YNR5rQLOWvUyc= +github.com/consensys/bavard v0.1.25/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.14.0 h1:DDBdl4HaBtdQsq/wfMwJvZNE80sHidrK3Nfrefatm0E= +github.com/consensys/gnark-crypto v0.14.0/go.mod h1:CU4UijNPsHawiVGNxe9co07FkzCeWHHrb1li/n1XoU0= github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= @@ -180,12 +122,12 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= 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.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= -github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= -github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= +github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= +github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U= @@ -209,8 +151,6 @@ github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUn github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -222,22 +162,17 @@ github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaB github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo= github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= +github.com/ethereum/c-kzg-4844 v1.0.3/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.14.5 h1:szuFzO1MhJmweXjoM5nSAeDvjNUH3vIQoMzzQnfvjpw= github.com/ethereum/go-ethereum v1.14.5/go.mod h1:VEDGGhSxY7IEjn98hJRFXl/uFvpRgbIIf2PpXiyGGgc= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= -github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= +github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= @@ -246,7 +181,6 @@ github.com/fluent/fluent-logger-golang v1.9.0/go.mod h1:2/HCT/jTy78yGyeNGQLGQsjF github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= @@ -263,36 +197,31 @@ github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8x github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.25.0 h1:q6Eo+hS+yoJlTO3uu/azhQadsD8V+jQn2D8VvX1eOyI= github.com/getsentry/sentry-go v0.25.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= 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-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/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.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +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-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -313,41 +242,26 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= -github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= @@ -358,56 +272,37 @@ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXi github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= 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/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= 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= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -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-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= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/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/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -423,8 +318,6 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1 h1:X2vfSnm1WC8HEo0MBHZg2TcuDUHJj6kd1TmEAQncnSA= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.0.1/go.mod h1:oVMjMN64nzEcepv1kdZKgx1qNYt4Ro0Gqefiq2JWdis= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -446,8 +339,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= -github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= @@ -458,15 +351,13 @@ github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6w github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= -github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= +github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= @@ -485,6 +376,7 @@ github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -495,7 +387,6 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= @@ -507,16 +398,16 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.1/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= -github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +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 v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/klauspost/reedsolomon v1.9.3/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= -github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= +github.com/koron/go-ssdp v0.0.5 h1:E1iSMxIs4WqxTbIBLtmNBeOOC+1sCIXQeqTWVnpmwhk= +github.com/koron/go-ssdp v0.0.5/go.mod h1:Qm59B7hpKpDqfyRNWRNr00jGwLdXjDyZh6y7rH6VS0w= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -525,26 +416,25 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= 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 v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= 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-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= -github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.33.2 h1:vCdwnFxoGOXMKmaGHlDSnL4bM3fQeW8pgIa9DECnb40= -github.com/libp2p/go-libp2p v0.33.2/go.mod h1:zTeppLuCvUIkT118pFVzA8xzP/p2dJYOMApCkFh0Yww= +github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= +github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= +github.com/libp2p/go-libp2p v0.38.1 h1:aT1K7IFWi+gZUsQGCzTHBTlKX5QVZQOahng8DnOr6tQ= +github.com/libp2p/go-libp2p v0.38.1/go.mod h1:QWV4zGL3O9nXKdHirIC59DoRcZ446dfkjbOJ55NEWFo= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-mplex v0.9.0 h1:R58pDRAmuBXkYugbSSXR9wrTX3+1pFM1xP2bLuodIq8= github.com/libp2p/go-libp2p-mplex v0.9.0/go.mod h1:ro1i4kuwiFT+uMPbIDIFkcLs1KRbNp0QwnUXM+P64Og= -github.com/libp2p/go-libp2p-pubsub v0.10.0 h1:wS0S5FlISavMaAbxyQn3dxMOe2eegMfswM471RuHJwA= -github.com/libp2p/go-libp2p-pubsub v0.10.0/go.mod h1:1OxbaT/pFRO5h+Dpze8hdHQ63R0ke55XTs6b6NwLLkw= +github.com/libp2p/go-libp2p-pubsub v0.12.0 h1:PENNZjSfk8KYxANRlpipdS7+BfLmOl3L2E/6vSNjbdI= +github.com/libp2p/go-libp2p-pubsub v0.12.0/go.mod h1:Oi0zw9aw8/Y5GC99zt+Ef2gYAl+0nZlwdJonDyOz/sE= github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= github.com/libp2p/go-mplex v0.7.0 h1:BDhFZdlk5tbr0oyFq/xv/NPGfjbnrsDam1EvutpBDbY= @@ -553,8 +443,8 @@ github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0 github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= github.com/libp2p/go-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= -github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= -github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= +github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8= +github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE= github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= github.com/libp2p/go-yamux/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= @@ -566,15 +456,14 @@ github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/z github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -592,9 +481,8 @@ github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04 github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= -github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= +github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= +github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -640,11 +528,10 @@ github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYg github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.2.0/go.mod h1:0nO36NvPpyV4QzvTLi/lafl2y95ncPj0vFwVF6k6wJ4= -github.com/multiformats/go-multiaddr v0.13.0 h1:BCBzs61E3AGHcYYTv8dqRH43ZfyrqM8RXVPT8t13tLQ= -github.com/multiformats/go-multiaddr v0.13.0/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= +github.com/multiformats/go-multiaddr v0.14.0 h1:bfrHrJhrRuh/NXH5mCnemjpbGjzRw/b+tJFOD41g2tU= +github.com/multiformats/go-multiaddr v0.14.0/go.mod h1:6EkVAxtznq2yC3QT5CM1UTAwG0GTP3EWAIcjHuzQ+r4= +github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M= +github.com/multiformats/go-multiaddr-dns v0.4.1/go.mod h1:7hfthtB4E4pQwirrz+J0CcDUfbWzTqEzVyYKKIKpgkc= github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= @@ -654,15 +541,14 @@ github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI1 github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= -github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= -github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= -github.com/multiformats/go-varint v0.0.1/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= +github.com/multiformats/go-multistream v0.6.0 h1:ZaHKbsL404720283o4c/IHQXiS6gb8qAN5EIJ4PN5EA= +github.com/multiformats/go-multistream v0.6.0/go.mod h1:MOyoG5otO24cHIg8kf9QW2/NozURlkP/rvi2FQJyCPg= 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-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +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/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= @@ -673,34 +559,32 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.17.2 h1:7eMhcy3GimbsA3hEnVKdw/PQM9XN9krpKVXsZdph0/g= -github.com/onsi/ginkgo/v2 v2.17.2/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU= +github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/onsi/gomega v1.33.0 h1:snPCflnZrpMsy94p4lXVEkHo12lmPnc3vY5XBbreexE= -github.com/onsi/gomega v1.33.0/go.mod h1:+925n5YtiFsLzzafLUHzVMBpvvRAzrydIBiSIxjX3wY= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/openconfig/gnmi v0.0.0-20190823184014-89b2bf29312c/go.mod h1:t+O9It+LKzfOAhKTT5O0ehDix+MTqbtT0T9t+7zzOvc= github.com/openconfig/reference v0.0.0-20190727015836-8dfd928c9696/go.mod h1:ym2A+zigScwkSEb/cVQB0/ZMpU3rqiH6X7WRRsxgOGw= @@ -724,7 +608,6 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= 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= @@ -732,6 +615,48 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pion/datachannel v1.5.10 h1:ly0Q26K1i6ZkGf42W7D4hQYR90pZwzFOjTq5AuCKk4o= +github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oLo8Rs4Py/M= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= +github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= +github.com/pion/ice/v2 v2.3.37 h1:ObIdaNDu1rCo7hObhs34YSBcO7fjslJMZV0ux+uZWh0= +github.com/pion/ice/v2 v2.3.37/go.mod h1:mBF7lnigdqgtB+YHkaY/Y6s6tsyRyo4u4rPGRuOjUBQ= +github.com/pion/interceptor v0.1.37 h1:aRA8Zpab/wE7/c0O3fh1PqY0AJI3fCSEM5lRWJVorwI= +github.com/pion/interceptor v0.1.37/go.mod h1:JzxbJ4umVTlZAf+/utHzNesY8tmRkM2lVmkS82TTj8Y= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= +github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= +github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= +github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= +github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= +github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= +github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.10 h1:puphjdbjPB+L+NFaVuZ5h6bt1g5q4kFIoI+r5q/g0CU= +github.com/pion/rtp v1.8.10/go.mod h1:8uMBJj32Pa1wwx8Fuv/AsFhn8jsgw+3rUC2PfoBZ8p4= +github.com/pion/sctp v1.8.35 h1:qwtKvNK1Wc5tHMIYgTDJhfZk7vATGVHhXbUDfHbYwzA= +github.com/pion/sctp v1.8.35/go.mod h1:EcXP8zCYVTRy3W9xtOF7wJm1L1aXfKRQzaM33SjQlzg= +github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= +github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= +github.com/pion/srtp/v2 v2.0.20 h1:HNNny4s+OUmG280ETrCdgFndp4ufx3/uy85EawYEhTk= +github.com/pion/srtp/v2 v2.0.20/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= +github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= +github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= +github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= +github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= +github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= +github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= +github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= +github.com/pion/webrtc/v3 v3.3.5 h1:ZsSzaMz/i9nblPdiAkZoP+E6Kmjw+jnyq3bEmU3EtRg= +github.com/pion/webrtc/v3 v3.3.5/go.mod h1:liNa+E1iwyzyXqNUwvoMRNQ10x8h8FOeJKL8RkIbamE= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -749,8 +674,8 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +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= @@ -766,8 +691,8 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= -github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ= +github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s= 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= @@ -776,28 +701,28 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.0.10/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.14.0 h1:Lw4VdGGoKEZilJsayHf0B+9YgLGREba2C6xr+Fdfq6s= -github.com/prometheus/procfs v0.14.0/go.mod h1:XL+Iwz8k8ZabyZfMFHPiilCniixqQarAy5Mu67pHlNQ= -github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44 h1:c3p3UzV4vFA7xaCDphnDWOjpxcadrQ26l5b+ypsvyxo= -github.com/prysmaticlabs/fastssz v0.0.0-20221107182844-78142813af44/go.mod h1:MA5zShstUwCQaE9faGHgCGvEWUbG87p4SAXINhmCkvg= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7 h1:0tVE4tdWQK9ZpYygoV7+vS6QkDvQVySboMVEIxBJmXw= -github.com/prysmaticlabs/go-bitfield v0.0.0-20210809151128-385d8c5e3fb7/go.mod h1:wmuf/mdK4VMD+jA9ThwcUKjg3a2XWM9cVfFYjDyY4j4= -github.com/prysmaticlabs/gohashtree v0.0.4-beta h1:H/EbCuXPeTV3lpKeXGPpEV9gsUpkqOOVnWapUyeWro4= -github.com/prysmaticlabs/gohashtree v0.0.4-beta/go.mod h1:BFdtALS+Ffhg3lGQIHv9HDWuHS8cTvHZzrHWxwOtGOs= +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/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516 h1:xuVAdtz5ShYblG2sPyb4gw01DF8InbOI/kBCQjk7NiM= +github.com/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516/go.mod h1:h2OlIZD/M6wFvV3YMZbW16lFgh3Rsye00G44J2cwLyU= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15 h1:lC8kiphgdOBTcbTvo8MwkvpKjO0SlAgjv4xIK5FGJ94= +github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15/go.mod h1:8svFBIKKu31YriBG/pNizo9N0Jr9i5PQ+dFkxWg3x5k= +github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b h1:VK7thFOnhxAZ/5aolr5Os4beiubuD08WiuiHyRqgwks= +github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b/go.mod h1:HRuvtXLZ4WkaB1MItToVH2e8ZwKwZPY5/Rcby+CvvLY= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c h1:9PHRCuO/VN0s9k+RmLykho7AjDxblNYI5bYKed16NPU= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c/go.mod h1:ZRws458tYHS/Zs936OQ6oCrL+Ict5O4Xpwve1UQ6C9M= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294 h1:q9wE0ZZRdTUAAeyFP/w0SwBEnCqlVy2+on6X2/e+eAU= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294/go.mod h1:ZVEbRdnMkGhp/pu35zq4SXxtvUwWK0J1MATtekZpH2Y= -github.com/prysmaticlabs/prysm/v5 v5.0.3 h1:hUi0gu6v7aXmMQkl2GbrLoWcMhDNIbkVxRwrZchKbxU= -github.com/prysmaticlabs/prysm/v5 v5.0.3/go.mod h1:v5Oz4A4cWljfxUmW7SDk/VBzoYnei+lzwJogvSqUZVs= +github.com/prysmaticlabs/prysm/v5 v5.2.0 h1:JqKKK5aqehZN9GiSOSSw4M57NpbvG0nIxqFK5KpPnRw= +github.com/prysmaticlabs/prysm/v5 v5.2.0/go.mod h1:cQc+NIMKaHjPvY566HsYcuni763nzuUWnDsDbk45bbs= github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU= github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= -github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= -github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/quic-go v0.42.0 h1:uSfdap0eveIl8KXnipv9K7nlwZ5IqLlYOpJ58u5utpM= -github.com/quic-go/quic-go v0.42.0/go.mod h1:132kz4kL3F9vxhW3CtQJLDVwcFe5wdWeJXXijhsO57M= -github.com/quic-go/webtransport-go v0.6.0 h1:CvNsKqc4W2HljHJnoT+rMmbRJybShZ0YPFDD3NxaZLY= -github.com/quic-go/webtransport-go v0.6.0/go.mod h1:9KjU4AEBqEQidGHNDkZrb8CAa1abRaosM2yGOyiikEc= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= +github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= +github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc h1:zAsgcP8MhzAbhMnB1QQ2O7ZhWYVGYSR2iVcjzQuPV+o= github.com/r3labs/sse v0.0.0-20210224172625-26fe804710bc/go.mod h1:S8xSOnV3CgpNrWd0GQ/OoQfMtlg2uPRSuTzcSGrzwK8= github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= @@ -808,11 +733,10 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 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.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= @@ -873,11 +797,9 @@ github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod 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.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -888,25 +810,27 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= 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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +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/struCoder/pidusage v0.2.1 h1:dFiEgUDkubeIj0XA1NpQ6+8LQmKrLi7NiIQl86E6BoY= github.com/struCoder/pidusage v0.2.1/go.mod h1:bewtP2KUA1TBUyza5+/PCpSQ6sc/H6jJbIKAzqW86BA= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= +github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= @@ -927,8 +851,6 @@ github.com/twmb/murmur3 v1.1.6 h1:mqrRot1BRxm+Yct+vavLMou2/iJt0tNVTTC0QoIjaZg= github.com/twmb/murmur3 v1.1.6/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= -github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -938,6 +860,9 @@ github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49u github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= +github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= +github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU= +github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -945,11 +870,10 @@ github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGC github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= github.com/xtaci/kcp-go v5.4.20+incompatible/go.mod h1:bN6vIwHQbfHaHtFpEssmWsN45a+AZwO7eyRCmEIbtvE= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zhouzhuojie/conditions v0.2.3 h1:TS3X6vA9CVXXteRdeXtpOw3hAar+01f0TI/dLp8qEvY= @@ -962,24 +886,28 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -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.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= -go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= -go.uber.org/fx v1.21.1 h1:RqBh3cYdzZS0uqwVeEjOX2p73dddLpym315myy/Bpb0= -go.uber.org/fx v1.21.1/go.mod h1:HT2M7d7RHo+ebKGh9NRcrsrHHfpZ60nW3QRubMRfv48= +go.uber.org/dig v1.18.0 h1:imUL1UiY0Mg4bqbFfsRQO5G4CGRBec/ZujWTvSVp3pw= +go.uber.org/dig v1.18.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= +go.uber.org/fx v1.23.0 h1:lIr/gYWQGfTwGcSXWXu4vP5Ws6iqnNEIY+F/aFzCKTg= +go.uber.org/fx v1.23.0/go.mod h1:o/D9n+2mLP6v1EG+qsdT1O8wKopYAsqZasju97SDFCU= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= @@ -1004,7 +932,6 @@ golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1013,49 +940,32 @@ golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +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-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= -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= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1071,60 +981,37 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191116160921-f9c825593386/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -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-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +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.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +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= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1132,13 +1019,12 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +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.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= @@ -1151,63 +1037,35 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/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= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1216,35 +1074,45 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.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-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +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.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +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.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +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.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.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= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1255,61 +1123,25 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200221224223-e1da425f72fd/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= 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= @@ -1319,90 +1151,24 @@ google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+ google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0 h1:URs6qR1lAxDsqWITsQXI4ZkGiYJ5dHtRNiCpfs2OeKA= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200218151345-dad8c97a84f5/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -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-20210222152913-aa3ee6e6a81c/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-20230525234025-438c736192d0 h1:x1vNwUhVOcsYoKyEGCZBH694SBmmBjA2EfauFVEI2+M= -google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= -google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53 h1:fVoAXEKA4+yufmbdVYv+SE73+cPZbbbe8paLsHfkK+U= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53/go.mod h1:riSXTwQ4+nqmPGtobMFyW5FqVAmIs0St6VPp4Ug7CE4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422 h1:3UsHvIr4Wc2aW4brOaSCmcxh9ksica6fHEr8P1XhkYw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -1410,42 +1176,24 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -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.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= 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= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU= +google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610= gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= @@ -1476,7 +1224,6 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1491,37 +1238,31 @@ grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJd honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.0 h1:WwrYoZNM1W1aQEbyl8HNG+oWGzLpZQBlcerS9BQw9yI= -k8s.io/api v0.20.0/go.mod h1:HyLC5l5eoS/ygQYl1BXBgFzWNlkHiAuyNAbevIn+FKg= -k8s.io/apimachinery v0.20.0 h1:jjzbTJRXk0unNS71L7h3lxGDH/2HPxMPaQY+MjECKL8= -k8s.io/apimachinery v0.20.0/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/client-go v0.20.0 h1:Xlax8PKbZsjX4gFvNtt4F5MoJ1V5prDvCuoq9B7iax0= -k8s.io/client-go v0.20.0/go.mod h1:4KWh/g+Ocd8KkCwKF8vUNnmqgv+EVnQDK4MBF4oB5tY= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.80.0 h1:lyJt0TWMPaGoODa8B8bUuxgHS3W/m/bNr2cca3brA/g= -k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -lukechampine.com/blake3 v1.2.2 h1:wEAbSg0IVU4ih44CVlpMqMZMpzr5hf/6aqodLlevd/w= -lukechampine.com/blake3 v1.2.2/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +k8s.io/api v0.30.4 h1:XASIELmW8w8q0i1Y4124LqPoWMycLjyQti/fdYHYjCs= +k8s.io/api v0.30.4/go.mod h1:ZqniWRKu7WIeLijbbzetF4U9qZ03cg5IRwl8YVs8mX0= +k8s.io/apimachinery v0.30.4 h1:5QHQI2tInzr8LsT4kU/2+fSeibH1eIHswNx480cqIoY= +k8s.io/apimachinery v0.30.4/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc= +k8s.io/client-go v0.30.4 h1:eculUe+HPQoPbixfwmaSZGsKcOf7D288tH6hDAdd+wY= +k8s.io/client-go v0.30.4/go.mod h1:IBS0R/Mt0LHkNHF4E6n+SUDPG7+m2po6RZU7YHeOpzc= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= +k8s.io/klog/v2 v2.120.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE= +lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/jsonrpc/request.go b/jsonrpc/request.go index 4a8bb8b..71bc1b2 100644 --- a/jsonrpc/request.go +++ b/jsonrpc/request.go @@ -24,7 +24,6 @@ const ( RPCBatchTx RPCRequestType = "blxr_batch_tx" RPCQuotaUsage RPCRequestType = "quota_usage" RPCBundleSubmission RPCRequestType = "blxr_submit_bundle" - RPCEOBBundleSubmission RPCRequestType = "blxr_submit_eob_bundle" RPCBundleSimulation RPCRequestType = "blxr_simulate_bundle" RPCStartMonitoringTx RPCRequestType = "start_monitor_transaction" RPCStopMonitoringTx RPCRequestType = "stop_monitor_transaction" @@ -33,10 +32,6 @@ const ( RPCEthSubscribe RPCRequestType = "eth_subscribe" RPCEthSendRawTransaction RPCRequestType = "eth_sendRawTransaction" RPCEthUnsubscribe RPCRequestType = "eth_unsubscribe" - RPCSubmitIntent RPCRequestType = "blxr_submit_intent" - RPCSubmitIntentSolution RPCRequestType = "blxr_submit_intent_solution" - RPCGetIntentSolutions RPCRequestType = "blxr_get_intent_solutions" - RPCSubmitQuote RPCRequestType = "blxr_submit_quote" ) // External RPCRequestType enumeration @@ -46,6 +41,7 @@ const ( RPCEthCancelBundle RPCRequestType = "eth_cancelBundle" RPCEthSendExclusiveBundle RPCRequestType = "eth_sendExclusiveBundle" RPCEthSendSnipeBundle RPCRequestType = "eth_sendSnipeBundle" + RPCEthSendArbOnlyBundle RPCRequestType = "eth_sendArbOnlyBundle" ) // RPCMethodToRPCRequestType maps gRPC methods to RPCRequestType @@ -137,6 +133,7 @@ type RPCBundleSubmissionPayload struct { IncomingRefundRecipient string `json:"refund_recipient,omitempty"` BlocksCount int `json:"blocks_count,omitempty"` DroppingHashes []string `json:"dropping_hashes,omitempty"` + EndOfBlock bool `json:"end_of_block"` } // Validate doing validation for blxr_submit_bundle payload @@ -195,44 +192,11 @@ type RPCSendBundle struct { AccountID string `json:"accountId,omitempty"` BlocksCount int `json:"blocksCount,omitempty"` DroppingTxHashes []string `json:"droppingTxHashes,omitempty"` + EndOfBlock bool `json:"endOfBlock,omitempty"` + AccountTier string `json:"accountTier,omitempty"` } // RPCCancelBundlePayload custom json-rpc required to cancel flashbots bundle type RPCCancelBundlePayload struct { ReplacementUUID string `json:"replacementUuid"` } - -// RPCSubmitIntentPayload is the payload of blxr_submit_intent request -type RPCSubmitIntentPayload struct { - DappAddress string `json:"dapp_address"` - SenderAddress string `json:"sender_address"` - Intent []byte `json:"intent"` - Hash []byte `json:"hash"` - Signature []byte `json:"signature"` -} - -// RPCSubmitQuotePayload is the payload of blxr_submit_quote request -type RPCSubmitQuotePayload struct { - DappAddress string `json:"dapp_address"` - SolverAddress string `json:"solver_address"` - Quote []byte `json:"quote"` - Hash []byte `json:"hash"` - Signature []byte `json:"signature"` -} - -// RPCSubmitIntentSolutionPayload is the payload of blxr_submit_intent_solution request -type RPCSubmitIntentSolutionPayload struct { - SolverAddress string `json:"solver_address"` - IntentID string `json:"intent_id"` - IntentSolution []byte `json:"intent_solution"` - Hash []byte `json:"hash"` - Signature []byte `json:"signature"` -} - -// RPCGetIntentSolutionsPayload is the payload of blxr_get_intent_solutions request -type RPCGetIntentSolutionsPayload struct { - IntentID string `json:"intent_id"` - DappOrSenderAddress string `json:"dapp_or_sender_address"` - Hash []byte `json:"hash"` - Signature []byte `json:"signature"` -} diff --git a/nodes/gateway.go b/nodes/gateway.go index c035219..aed0f14 100644 --- a/nodes/gateway.go +++ b/nodes/gateway.go @@ -20,7 +20,6 @@ import ( "sync" "time" - "github.com/cenkalti/backoff/v4" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" @@ -36,8 +35,6 @@ import ( bxcommoneth "github.com/bloXroute-Labs/gateway/v2/blockchain/common" "github.com/bloXroute-Labs/gateway/v2/blockchain/eth" "github.com/bloXroute-Labs/gateway/v2/blockchain/network" - "github.com/bloXroute-Labs/gateway/v2/blockchain/polygon" - "github.com/bloXroute-Labs/gateway/v2/blockchain/polygon/bor" "github.com/bloXroute-Labs/gateway/v2/bxmessage" "github.com/bloXroute-Labs/gateway/v2/config" "github.com/bloXroute-Labs/gateway/v2/connections" @@ -61,9 +58,8 @@ import ( ) const ( - bscMainnetBloomCap = 35e6 - mainnetBloomCap = 85e5 - polygonMainnetBloomCap = 225e5 + bscMainnetBloomCap = 35e6 + mainnetBloomCap = 85e5 bloomStoreInterval = time.Hour @@ -132,8 +128,7 @@ type gateway struct { bloomFilter services.BloomFilter txIncludeSenderInFeed bool - polygonValidatorInfoManager polygon.ValidatorInfoManager - blockTime time.Duration + blockTime time.Duration txsQueue *services.MessageQueue txsOrderQueue *services.MessageQueue @@ -142,7 +137,6 @@ type gateway struct { log *log.Entry chainID int64 - intentsManager services.IntentsManager blobsManager *beacon.BlobSidecarCacheManager ignoredRelays *syncmap.SyncMap[string, types.RelayInfo] relaysToSwitch *syncmap.SyncMap[string, bool] @@ -180,7 +174,6 @@ func NewGateway(parent context.Context, sdn connections.SDNHTTP, sslCerts *utils.SSLCerts, staticEnodesCount int, - polygonHeimdallEndpoints string, transactionSlotStartDuration int, transactionSlotEndDuration int, enableBloomFilter bool, @@ -220,19 +213,12 @@ func NewGateway(parent context.Context, log: log.WithFields(log.Fields{ "component": "gateway", }), - intentsManager: services.NewIntentsManager(), - blobsManager: blobsManager, + blobsManager: blobsManager, } g.chainID = int64(bxgateway.NetworkNumToChainID[sdn.NetworkNum()]) - if polygonHeimdallEndpoints != "" { - g.polygonValidatorInfoManager = bor.NewSprintManager(parent, &g.wsManager, bor.NewHeimdallSpanner(parent, polygonHeimdallEndpoints)) - } else { - g.polygonValidatorInfoManager = nil - } - - if bxConfig.BlockchainNetwork == bxgateway.BSCMainnet || bxConfig.BlockchainNetwork == bxgateway.PolygonMainnet || bxConfig.BlockchainNetwork == bxgateway.PolygonMumbai { + if bxConfig.BlockchainNetwork == bxgateway.BSCMainnet { g.validatorStatusMap = syncmap.NewStringMapOf[bool]() g.nextValidatorMap = orderedmap.New[uint64, string]() } @@ -277,8 +263,6 @@ func NewGateway(parent context.Context, bloomCap = mainnetBloomCap case bxgateway.BSCMainnet, bxgateway.BSCTestnet: bloomCap = bscMainnetBloomCap - case bxgateway.PolygonMainnet, bxgateway.PolygonMumbai: - bloomCap = polygonMainnetBloomCap default: // default to mainnet bloomCap = mainnetBloomCap @@ -495,7 +479,7 @@ func (g *gateway) Run() error { g.clientHandler = servers.NewClientHandler(&g.Bx, g.BxConfig, g, g.sdn, accService, g.bridge, g.blockchainPeers, services.NewNoOpSubscriptionServices(), g.wsManager, g.bdnStats, g.timeStarted, g.txsQueue, g.txsOrderQueue, g.gatewayPublicKey, g.feedManager, g.validatorsManager, - g.intentsManager, g.stats, g.TxStore, + g.stats, g.TxStore, txFromFieldIncludable, sslCert.PrivateCertFile(), sslCert.PrivateKeyFile(), ) @@ -503,11 +487,6 @@ func (g *gateway) Run() error { return g.clientHandler.ManageServers(ctx, g.BxConfig.ManageWSServer) }) - group.Go(func() error { - g.intentsManager.CleanupExpiredSolutions(ctx) - return nil - }) - go g.PingLoop() relayInstructions := make(chan connections.RelayInstruction) @@ -523,22 +502,6 @@ func (g *gateway) Run() error { go g.handleBlockchainConnectionStatusUpdate() - if (networkNum == bxgateway.PolygonMainnetNum || networkNum == bxgateway.PolygonMumbaiNum) && g.polygonValidatorInfoManager != nil { - // running as goroutine to not block starting of node - log.Debugf("starting polygonValidatorInfoManager, networkNum=%d", networkNum) - go func() { - if retryErr := backoff.RetryNotify( - g.polygonValidatorInfoManager.Run, - bor.Retry(), - func(err error, duration time.Duration) { - g.log.Tracef("failed to start polygonValidatorInfoManager: %v, retry in %s", err, duration.String()) - }, - ); retryErr != nil { - g.log.Warnf("failed to start polygonValidatorInfoManager: %v", retryErr) - } - }() - } - return group.Wait() } @@ -908,35 +871,6 @@ func (g *gateway) reevaluatePendingBSCNextValidatorTx() { } } -func (g *gateway) generatePolygonValidator(bxBlock *types.BxBlock, blockInfo *eth.BlockInfo) []*types.FutureValidatorInfo { - blockHeight := bxBlock.Number.Uint64() - - if g.validatorStatusMap == nil || g.wsManager == nil || g.polygonValidatorInfoManager == nil || !g.polygonValidatorInfoManager.IsRunning() || blockInfo == nil { - return blockchain.DefaultValidatorInfo(blockHeight) - } - - validatorInfo := g.polygonValidatorInfoManager.FutureValidators(blockInfo.Block.Header()) - - for _, info := range validatorInfo { - if info.WalletID == "nil" { - break - } - - // nextValidatorMap is simulating a queue with height as expiration key. - // Regardless of the accessible status, next walletID will be appended to the queue. - g.nextValidatorMap.Set(info.BlockHeight, info.WalletID) - - accessible, exist := g.validatorStatusMap.Load(info.WalletID) - if exist { - info.Accessible = accessible - } - } - - g.cleanUpNextValidatorMap(blockHeight) - - return validatorInfo[:] -} - func bscExtractValidatorListFromBlock(b []byte) (validator.List, error) { addressLength := 20 bLSPublicKeyLength := 48 @@ -1020,9 +954,6 @@ func (g *gateway) generateFutureValidatorInfo(block *types.BxBlock, blockInfo *e g.latestValidatorInfoHeight = blockHeight switch g.sdn.NetworkNum() { - case bxgateway.PolygonMainnetNum, bxgateway.PolygonMumbaiNum: - g.latestValidatorInfo = g.generatePolygonValidator(block, blockInfo) - return g.latestValidatorInfo case bxgateway.BSCMainnetNum, bxgateway.BSCTestnetNum: g.latestValidatorInfo = g.generateBSCValidator(block.Number.Uint64()) return g.latestValidatorInfo @@ -1482,7 +1413,6 @@ func (g *gateway) HandleMsg(msg bxmessage.Message, source connections.Conn, back } }() } - case *bxmessage.BlockConfirmation: hashString := typedMsg.Hash().String() if g.seenBlockConfirmation.SetIfAbsent(hashString, 30*time.Minute) { @@ -1494,66 +1424,6 @@ func (g *gateway) HandleMsg(msg bxmessage.Message, source connections.Conn, back } _ = g.Bx.HandleMsg(msg, source) } - case *bxmessage.Intent: - userIntent := &types.UserIntent{ - ID: typedMsg.ID, - DappAddress: typedMsg.DAppAddress, - SenderAddress: typedMsg.SenderAddress, - Intent: typedMsg.Intent, - Hash: typedMsg.Hash, - Signature: typedMsg.Signature, - Timestamp: typedMsg.Timestamp, - } - - g.broadcast(typedMsg, source, utils.RelayProxy) - - g.notify(types.NewUserIntentNotification(userIntent)) - case *bxmessage.IntentSolutions: - // accept intent solutions from relays only - if source == nil || source.GetConnectionType() != utils.RelayProxy { - return nil - } - - // add list of solutions to the intent - g.intentsManager.AppendSolutionsForIntent(typedMsg) - case *bxmessage.IntentSolution: - // add solution to the intent - g.intentsManager.AppendSolutionForIntent(typedMsg) - - g.broadcast(typedMsg, source, utils.RelayProxy) // broadcast the solution to all other relays - - if source != nil && source.GetConnectionType() == utils.RelayProxy { - solution := &types.UserIntentSolution{ - ID: typedMsg.ID, - SolverAddress: typedMsg.SolverAddress, - IntentID: typedMsg.IntentID, - Solution: typedMsg.Solution, - Hash: typedMsg.Hash, - Signature: typedMsg.Signature, - Timestamp: typedMsg.Timestamp, - DappAddress: typedMsg.DappAddress, - SenderAddress: typedMsg.SenderAddress, - } - g.notify(types.NewUserIntentSolutionNotification(solution)) - } - case *bxmessage.Quote: - quote := &types.QuoteNotification{ - ID: typedMsg.ID, - DappAddress: typedMsg.DappAddress, - SolverAddress: typedMsg.SolverAddress, - Quote: typedMsg.Quote, - Hash: typedMsg.Hash, - Signature: typedMsg.Signature, - Timestamp: typedMsg.Timestamp, - } - - g.broadcast(typedMsg, source, utils.RelayProxy) - - g.notify(quote) - case *bxmessage.IntentsSubscription, *bxmessage.IntentsUnsubscription, *bxmessage.SolutionsSubscription, *bxmessage.SolutionsUnsubscription, *bxmessage.QuotesSubscription, *bxmessage.QuotesUnsubscription: - g.broadcast(typedMsg, source, utils.RelayProxy) - case *bxmessage.GetIntentSolutions: - g.broadcast(typedMsg, source, utils.RelayProxy) // request intent solutions from all the connected relays case *bxmessage.BeaconMessage: go g.processBeaconMessage(typedMsg, source) default: @@ -2125,7 +1995,7 @@ func (g *gateway) getHeaderFromGateway() string { } func (g *gateway) bxBlockToBlockInfo(bxBlock *types.BxBlock) (*eth.BlockInfo, error) { - // We support only types.BxBlockTypeEth. That means BSC or Polygon block + // We support only types.BxBlockTypeEth. That means BSC block if bxBlock.Type != types.BxBlockTypeEth { return nil, errUnsupportedBlockType } @@ -2306,26 +2176,3 @@ func (g *gateway) forwardBSCTx(conn *http.Client, txHash string, tx string, endp "statusCode": resp.StatusCode, }).Info("transaction sent") } - -func (g *gateway) OnConnEstablished(conn connections.Conn) error { - err := g.Bx.OnConnEstablished(conn) - if err != nil { - return err - } - - // push intents/solutions subscriptions to the relay - if connections.IsRelay(conn.GetConnectionType()) { - messages := g.intentsManager.SubscriptionMessages() - for _, m := range messages { - err = conn.Send(m) - if err != nil { - conn.Log().Errorf("error writing to connection: %s", err) - continue - } - } - - g.log.Debugf("sent %d intents/solutions subscription message(s) to %s", len(messages), conn.GetPeerIP()) - } - - return nil -} diff --git a/nodes/gateway_test.go b/nodes/gateway_test.go index 9f4da69..387eb42 100644 --- a/nodes/gateway_test.go +++ b/nodes/gateway_test.go @@ -113,7 +113,6 @@ func setup(t *testing.T, numPeers int) (blockchain.Bridge, *gateway) { sdn, nil, 0, - "", 0, 0, false, @@ -316,7 +315,7 @@ func TestGateway_HandleTransactionFromBlockchain_SeenInBloomFilter(t *testing.T) assert.Equal(t, true, g.pendingTxs.Exists(txHash)) // Bloom filter is adding asynchronously, so wait a bit - time.Sleep(time.Microsecond) + time.Sleep(time.Millisecond) // create empty TxStore to make sure transaction is ignored due to bloom_filter g.TxStore = services.NewEthTxStore(g.clock, 30*time.Minute, 10*time.Minute, @@ -1191,7 +1190,7 @@ func TestGateway_Status(t *testing.T) { g.clientHandler = servers.NewClientHandler(&g.Bx, g.BxConfig, g, g.sdn, accService, g.bridge, g.blockchainPeers, services.NewNoOpSubscriptionServices(), g.wsManager, g.bdnStats, g.timeStarted, g.txsQueue, g.txsOrderQueue, g.gatewayPublicKey, g.feedManager, g.validatorsManager, - g.intentsManager, g.stats, g.TxStore, + g.stats, g.TxStore, false, "", "", ) diff --git a/protobuf/gateway.pb.go b/protobuf/gateway.pb.go index 124f33d..932ce75 100644 --- a/protobuf/gateway.pb.go +++ b/protobuf/gateway.pb.go @@ -572,6 +572,7 @@ type BlxrSubmitBundleRequest struct { RefundRecipient string `protobuf:"bytes,12,opt,name=refund_recipient,json=refundRecipient,proto3" json:"refund_recipient,omitempty"` BlocksCount int64 `protobuf:"varint,13,opt,name=blocks_count,json=blocksCount,proto3" json:"blocks_count,omitempty"` DroppingHashes []string `protobuf:"bytes,14,rep,name=dropping_hashes,json=droppingHashes,proto3" json:"dropping_hashes,omitempty"` + EndOfBlock bool `protobuf:"varint,15,opt,name=end_of_block,json=endOfBlock,proto3" json:"end_of_block,omitempty"` } func (x *BlxrSubmitBundleRequest) Reset() { @@ -706,6 +707,13 @@ func (x *BlxrSubmitBundleRequest) GetDroppingHashes() []string { return nil } +func (x *BlxrSubmitBundleRequest) GetEndOfBlock() bool { + if x != nil { + return x.EndOfBlock + } + return false +} + type BlxrSubmitBundleReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3495,124 +3503,6 @@ func (x *AccountInfo) GetExpireDate() string { return "" } -type QueuesStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TxsQueueCount uint64 `protobuf:"varint,1,opt,name=txs_queue_count,json=txsQueueCount,proto3" json:"txs_queue_count,omitempty"` - TxsOrderQueueCount uint64 `protobuf:"varint,2,opt,name=txs_order_queue_count,json=txsOrderQueueCount,proto3" json:"txs_order_queue_count,omitempty"` -} - -func (x *QueuesStats) Reset() { - *x = QueuesStats{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *QueuesStats) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*QueuesStats) ProtoMessage() {} - -func (x *QueuesStats) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use QueuesStats.ProtoReflect.Descriptor instead. -func (*QueuesStats) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{48} -} - -func (x *QueuesStats) GetTxsQueueCount() uint64 { - if x != nil { - return x.TxsQueueCount - } - return 0 -} - -func (x *QueuesStats) GetTxsOrderQueueCount() uint64 { - if x != nil { - return x.TxsOrderQueueCount - } - return 0 -} - -type IntentStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SubmittedIntentsCount uint64 `protobuf:"varint,1,opt,name=submitted_intents_count,json=submittedIntentsCount,proto3" json:"submitted_intents_count,omitempty"` - SubmittedSolutionsCount uint64 `protobuf:"varint,2,opt,name=submitted_solutions_count,json=submittedSolutionsCount,proto3" json:"submitted_solutions_count,omitempty"` - SubmittedQuotesCount uint64 `protobuf:"varint,3,opt,name=submitted_quotes_count,json=submittedQuotesCount,proto3" json:"submitted_quotes_count,omitempty"` -} - -func (x *IntentStats) Reset() { - *x = IntentStats{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IntentStats) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IntentStats) ProtoMessage() {} - -func (x *IntentStats) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IntentStats.ProtoReflect.Descriptor instead. -func (*IntentStats) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{49} -} - -func (x *IntentStats) GetSubmittedIntentsCount() uint64 { - if x != nil { - return x.SubmittedIntentsCount - } - return 0 -} - -func (x *IntentStats) GetSubmittedSolutionsCount() uint64 { - if x != nil { - return x.SubmittedSolutionsCount - } - return 0 -} - -func (x *IntentStats) GetSubmittedQuotesCount() uint64 { - if x != nil { - return x.SubmittedQuotesCount - } - return 0 -} - type NodePerformance struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3633,7 +3523,7 @@ type NodePerformance struct { func (x *NodePerformance) Reset() { *x = NodePerformance{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[50] + mi := &file_gateway_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3646,7 +3536,7 @@ func (x *NodePerformance) String() string { func (*NodePerformance) ProtoMessage() {} func (x *NodePerformance) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[50] + mi := &file_gateway_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3659,7 +3549,7 @@ func (x *NodePerformance) ProtoReflect() protoreflect.Message { // Deprecated: Use NodePerformance.ProtoReflect.Descriptor instead. func (*NodePerformance) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{50} + return file_gateway_proto_rawDescGZIP(), []int{48} } func (x *NodePerformance) GetSince() string { @@ -3745,7 +3635,7 @@ type WsConnStatus struct { func (x *WsConnStatus) Reset() { *x = WsConnStatus{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[51] + mi := &file_gateway_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3758,7 +3648,7 @@ func (x *WsConnStatus) String() string { func (*WsConnStatus) ProtoMessage() {} func (x *WsConnStatus) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[51] + mi := &file_gateway_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3771,7 +3661,7 @@ func (x *WsConnStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use WsConnStatus.ProtoReflect.Descriptor instead. func (*WsConnStatus) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{51} + return file_gateway_proto_rawDescGZIP(), []int{49} } func (x *WsConnStatus) GetAddr() string { @@ -3815,7 +3705,7 @@ type NodeConnStatus struct { func (x *NodeConnStatus) Reset() { *x = NodeConnStatus{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[52] + mi := &file_gateway_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3828,7 +3718,7 @@ func (x *NodeConnStatus) String() string { func (*NodeConnStatus) ProtoMessage() {} func (x *NodeConnStatus) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[52] + mi := &file_gateway_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3841,7 +3731,7 @@ func (x *NodeConnStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeConnStatus.ProtoReflect.Descriptor instead. func (*NodeConnStatus) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{52} + return file_gateway_proto_rawDescGZIP(), []int{50} } func (x *NodeConnStatus) GetConnStatus() string { @@ -3920,7 +3810,7 @@ type BDNConnStatus struct { func (x *BDNConnStatus) Reset() { *x = BDNConnStatus{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[53] + mi := &file_gateway_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3933,7 +3823,7 @@ func (x *BDNConnStatus) String() string { func (*BDNConnStatus) ProtoMessage() {} func (x *BDNConnStatus) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[53] + mi := &file_gateway_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3946,7 +3836,7 @@ func (x *BDNConnStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use BDNConnStatus.ProtoReflect.Descriptor instead. func (*BDNConnStatus) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{53} + return file_gateway_proto_rawDescGZIP(), []int{51} } func (x *BDNConnStatus) GetStatus() string { @@ -3984,7 +3874,7 @@ type ConnectionLatency struct { func (x *ConnectionLatency) Reset() { *x = ConnectionLatency{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[54] + mi := &file_gateway_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3997,7 +3887,7 @@ func (x *ConnectionLatency) String() string { func (*ConnectionLatency) ProtoMessage() {} func (x *ConnectionLatency) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[54] + mi := &file_gateway_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4010,7 +3900,7 @@ func (x *ConnectionLatency) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectionLatency.ProtoReflect.Descriptor instead. func (*ConnectionLatency) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{54} + return file_gateway_proto_rawDescGZIP(), []int{52} } func (x *ConnectionLatency) GetMinMsFromPeer() int64 { @@ -4060,7 +3950,7 @@ type GatewayInfo struct { func (x *GatewayInfo) Reset() { *x = GatewayInfo{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[55] + mi := &file_gateway_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4073,7 +3963,7 @@ func (x *GatewayInfo) String() string { func (*GatewayInfo) ProtoMessage() {} func (x *GatewayInfo) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[55] + mi := &file_gateway_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4086,7 +3976,7 @@ func (x *GatewayInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use GatewayInfo.ProtoReflect.Descriptor instead. func (*GatewayInfo) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{55} + return file_gateway_proto_rawDescGZIP(), []int{53} } func (x *GatewayInfo) GetVersion() string { @@ -4161,14 +4051,12 @@ type StatusResponse struct { Nodes map[string]*NodeConnStatus `protobuf:"bytes,3,rep,name=nodes,proto3" json:"nodes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Relays map[string]*BDNConnStatus `protobuf:"bytes,4,rep,name=relays,proto3" json:"relays,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` AccountInfo *AccountInfo `protobuf:"bytes,1,opt,name=account_info,json=accountInfo,proto3" json:"account_info,omitempty"` - QueueStats *QueuesStats `protobuf:"bytes,5,opt,name=queue_stats,json=queueStats,proto3" json:"queue_stats,omitempty"` - IntentStats *IntentStats `protobuf:"bytes,6,opt,name=intent_stats,json=intentStats,proto3" json:"intent_stats,omitempty"` } func (x *StatusResponse) Reset() { *x = StatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[56] + mi := &file_gateway_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4181,7 +4069,7 @@ func (x *StatusResponse) String() string { func (*StatusResponse) ProtoMessage() {} func (x *StatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[56] + mi := &file_gateway_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4194,7 +4082,7 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{56} + return file_gateway_proto_rawDescGZIP(), []int{54} } func (x *StatusResponse) GetGatewayInfo() *GatewayInfo { @@ -4225,20 +4113,6 @@ func (x *StatusResponse) GetAccountInfo() *AccountInfo { return nil } -func (x *StatusResponse) GetQueueStats() *QueuesStats { - if x != nil { - return x.QueueStats - } - return nil -} - -func (x *StatusResponse) GetIntentStats() *IntentStats { - if x != nil { - return x.IntentStats - } - return nil -} - type TxResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4254,7 +4128,7 @@ type TxResult struct { func (x *TxResult) Reset() { *x = TxResult{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[57] + mi := &file_gateway_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4267,7 +4141,7 @@ func (x *TxResult) String() string { func (*TxResult) ProtoMessage() {} func (x *TxResult) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[57] + mi := &file_gateway_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4280,7 +4154,7 @@ func (x *TxResult) ProtoReflect() protoreflect.Message { // Deprecated: Use TxResult.ProtoReflect.Descriptor instead. func (*TxResult) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{57} + return file_gateway_proto_rawDescGZIP(), []int{55} } func (x *TxResult) GetTxHash() string { @@ -4332,7 +4206,7 @@ type ShortIDListRequest struct { func (x *ShortIDListRequest) Reset() { *x = ShortIDListRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[58] + mi := &file_gateway_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4345,7 +4219,7 @@ func (x *ShortIDListRequest) String() string { func (*ShortIDListRequest) ProtoMessage() {} func (x *ShortIDListRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[58] + mi := &file_gateway_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4358,7 +4232,7 @@ func (x *ShortIDListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShortIDListRequest.ProtoReflect.Descriptor instead. func (*ShortIDListRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{58} + return file_gateway_proto_rawDescGZIP(), []int{56} } // Deprecated: Do not use. @@ -4394,7 +4268,7 @@ type TxListReply struct { func (x *TxListReply) Reset() { *x = TxListReply{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[59] + mi := &file_gateway_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4407,7 +4281,7 @@ func (x *TxListReply) String() string { func (*TxListReply) ProtoMessage() {} func (x *TxListReply) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[59] + mi := &file_gateway_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4420,7 +4294,7 @@ func (x *TxListReply) ProtoReflect() protoreflect.Message { // Deprecated: Use TxListReply.ProtoReflect.Descriptor instead. func (*TxListReply) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{59} + return file_gateway_proto_rawDescGZIP(), []int{57} } func (x *TxListReply) GetTxs() [][]byte { @@ -4441,7 +4315,7 @@ type ShortIDsRequest struct { func (x *ShortIDsRequest) Reset() { *x = ShortIDsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[60] + mi := &file_gateway_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4454,7 +4328,7 @@ func (x *ShortIDsRequest) String() string { func (*ShortIDsRequest) ProtoMessage() {} func (x *ShortIDsRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[60] + mi := &file_gateway_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4467,7 +4341,7 @@ func (x *ShortIDsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShortIDsRequest.ProtoReflect.Descriptor instead. func (*ShortIDsRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{60} + return file_gateway_proto_rawDescGZIP(), []int{58} } func (x *ShortIDsRequest) GetTxHashes() [][]byte { @@ -4488,7 +4362,7 @@ type ShortIDsReply struct { func (x *ShortIDsReply) Reset() { *x = ShortIDsReply{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[61] + mi := &file_gateway_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4501,7 +4375,7 @@ func (x *ShortIDsReply) String() string { func (*ShortIDsReply) ProtoMessage() {} func (x *ShortIDsReply) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[61] + mi := &file_gateway_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4514,7 +4388,7 @@ func (x *ShortIDsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ShortIDsReply.ProtoReflect.Descriptor instead. func (*ShortIDsReply) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{61} + return file_gateway_proto_rawDescGZIP(), []int{59} } func (x *ShortIDsReply) GetShortIds() []uint32 { @@ -4545,7 +4419,7 @@ type ProposedBlockRequest struct { func (x *ProposedBlockRequest) Reset() { *x = ProposedBlockRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[62] + mi := &file_gateway_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4558,7 +4432,7 @@ func (x *ProposedBlockRequest) String() string { func (*ProposedBlockRequest) ProtoMessage() {} func (x *ProposedBlockRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[62] + mi := &file_gateway_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4571,7 +4445,7 @@ func (x *ProposedBlockRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProposedBlockRequest.ProtoReflect.Descriptor instead. func (*ProposedBlockRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{62} + return file_gateway_proto_rawDescGZIP(), []int{60} } func (x *ProposedBlockRequest) GetValidatorHttpAddress() string { @@ -4663,7 +4537,7 @@ type CompressTx struct { func (x *CompressTx) Reset() { *x = CompressTx{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[63] + mi := &file_gateway_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4676,7 +4550,7 @@ func (x *CompressTx) String() string { func (*CompressTx) ProtoMessage() {} func (x *CompressTx) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[63] + mi := &file_gateway_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4689,7 +4563,7 @@ func (x *CompressTx) ProtoReflect() protoreflect.Message { // Deprecated: Use CompressTx.ProtoReflect.Descriptor instead. func (*CompressTx) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{63} + return file_gateway_proto_rawDescGZIP(), []int{61} } func (x *CompressTx) GetRawData() []byte { @@ -4718,7 +4592,7 @@ type ProposedBlockReply struct { func (x *ProposedBlockReply) Reset() { *x = ProposedBlockReply{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[64] + mi := &file_gateway_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4731,7 +4605,7 @@ func (x *ProposedBlockReply) String() string { func (*ProposedBlockReply) ProtoMessage() {} func (x *ProposedBlockReply) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[64] + mi := &file_gateway_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4744,7 +4618,7 @@ func (x *ProposedBlockReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ProposedBlockReply.ProtoReflect.Descriptor instead. func (*ProposedBlockReply) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{64} + return file_gateway_proto_rawDescGZIP(), []int{62} } func (x *ProposedBlockReply) GetValidatorReply() string { @@ -4772,7 +4646,7 @@ type ProposedBlockStatsRequest struct { func (x *ProposedBlockStatsRequest) Reset() { *x = ProposedBlockStatsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[65] + mi := &file_gateway_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4785,7 +4659,7 @@ func (x *ProposedBlockStatsRequest) String() string { func (*ProposedBlockStatsRequest) ProtoMessage() {} func (x *ProposedBlockStatsRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[65] + mi := &file_gateway_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4798,7 +4672,7 @@ func (x *ProposedBlockStatsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ProposedBlockStatsRequest.ProtoReflect.Descriptor instead. func (*ProposedBlockStatsRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{65} + return file_gateway_proto_rawDescGZIP(), []int{63} } func (x *ProposedBlockStatsRequest) GetBlockNumber() uint64 { @@ -4819,7 +4693,7 @@ type ProposedBlockStatsReply struct { func (x *ProposedBlockStatsReply) Reset() { *x = ProposedBlockStatsReply{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[66] + mi := &file_gateway_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4832,7 +4706,7 @@ func (x *ProposedBlockStatsReply) String() string { func (*ProposedBlockStatsReply) ProtoMessage() {} func (x *ProposedBlockStatsReply) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[66] + mi := &file_gateway_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4845,7 +4719,7 @@ func (x *ProposedBlockStatsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ProposedBlockStatsReply.ProtoReflect.Descriptor instead. func (*ProposedBlockStatsReply) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{66} + return file_gateway_proto_rawDescGZIP(), []int{64} } func (x *ProposedBlockStatsReply) GetRecords() []*ProposedBlockStatsRecord { @@ -4871,7 +4745,7 @@ type ProposedBlockStatsRecord struct { func (x *ProposedBlockStatsRecord) Reset() { *x = ProposedBlockStatsRecord{} if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[67] + mi := &file_gateway_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4884,7 +4758,7 @@ func (x *ProposedBlockStatsRecord) String() string { func (*ProposedBlockStatsRecord) ProtoMessage() {} func (x *ProposedBlockStatsRecord) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[67] + mi := &file_gateway_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4897,7 +4771,7 @@ func (x *ProposedBlockStatsRecord) ProtoReflect() protoreflect.Message { // Deprecated: Use ProposedBlockStatsRecord.ProtoReflect.Descriptor instead. func (*ProposedBlockStatsRecord) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{67} + return file_gateway_proto_rawDescGZIP(), []int{65} } func (x *ProposedBlockStatsRecord) GetId() string { @@ -4942,820 +4816,7 @@ func (x *ProposedBlockStatsRecord) GetValidatorReplyTime() int64 { return 0 } -// Intent Gateway Messages -type SubmitIntentRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DappAddress string `protobuf:"bytes,1,opt,name=dappAddress,proto3" json:"dappAddress,omitempty"` // ETH address - SenderAddress string `protobuf:"bytes,2,opt,name=senderAddress,proto3" json:"senderAddress,omitempty"` // ETH address - Intent []byte `protobuf:"bytes,3,opt,name=intent,proto3" json:"intent,omitempty"` // The intent payload - Hash []byte `protobuf:"bytes,4,opt,name=hash,proto3" json:"hash,omitempty"` // Keccak256Hash of the Intent bytes - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` // ECDSA signature of hash -} - -func (x *SubmitIntentRequest) Reset() { - *x = SubmitIntentRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[68] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitIntentRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitIntentRequest) ProtoMessage() {} - -func (x *SubmitIntentRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[68] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitIntentRequest.ProtoReflect.Descriptor instead. -func (*SubmitIntentRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{68} -} - -func (x *SubmitIntentRequest) GetDappAddress() string { - if x != nil { - return x.DappAddress - } - return "" -} - -func (x *SubmitIntentRequest) GetSenderAddress() string { - if x != nil { - return x.SenderAddress - } - return "" -} - -func (x *SubmitIntentRequest) GetIntent() []byte { - if x != nil { - return x.Intent - } - return nil -} - -func (x *SubmitIntentRequest) GetHash() []byte { - if x != nil { - return x.Hash - } - return nil -} - -func (x *SubmitIntentRequest) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type SubmitIntentReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - IntentId string `protobuf:"bytes,1,opt,name=intentId,proto3" json:"intentId,omitempty"` - FirstSeen *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=first_seen,json=firstSeen,proto3" json:"first_seen,omitempty"` -} - -func (x *SubmitIntentReply) Reset() { - *x = SubmitIntentReply{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[69] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitIntentReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitIntentReply) ProtoMessage() {} - -func (x *SubmitIntentReply) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[69] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitIntentReply.ProtoReflect.Descriptor instead. -func (*SubmitIntentReply) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{69} -} - -func (x *SubmitIntentReply) GetIntentId() string { - if x != nil { - return x.IntentId - } - return "" -} - -func (x *SubmitIntentReply) GetFirstSeen() *timestamppb.Timestamp { - if x != nil { - return x.FirstSeen - } - return nil -} - -type SubmitIntentSolutionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SolverAddress string `protobuf:"bytes,1,opt,name=solverAddress,proto3" json:"solverAddress,omitempty"` - IntentId string `protobuf:"bytes,2,opt,name=intentId,proto3" json:"intentId,omitempty"` - IntentSolution []byte `protobuf:"bytes,3,opt,name=intentSolution,proto3" json:"intentSolution,omitempty"` //The solution payload - Hash []byte `protobuf:"bytes,4,opt,name=hash,proto3" json:"hash,omitempty"` //Keccak256Hash of the IntentSolution bytes - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` //ECDSA signature of the hash -} - -func (x *SubmitIntentSolutionRequest) Reset() { - *x = SubmitIntentSolutionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[70] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitIntentSolutionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitIntentSolutionRequest) ProtoMessage() {} - -func (x *SubmitIntentSolutionRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[70] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitIntentSolutionRequest.ProtoReflect.Descriptor instead. -func (*SubmitIntentSolutionRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{70} -} - -func (x *SubmitIntentSolutionRequest) GetSolverAddress() string { - if x != nil { - return x.SolverAddress - } - return "" -} - -func (x *SubmitIntentSolutionRequest) GetIntentId() string { - if x != nil { - return x.IntentId - } - return "" -} - -func (x *SubmitIntentSolutionRequest) GetIntentSolution() []byte { - if x != nil { - return x.IntentSolution - } - return nil -} - -func (x *SubmitIntentSolutionRequest) GetHash() []byte { - if x != nil { - return x.Hash - } - return nil -} - -func (x *SubmitIntentSolutionRequest) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type SubmitIntentSolutionReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SolutionId string `protobuf:"bytes,1,opt,name=solutionId,proto3" json:"solutionId,omitempty"` - FirstSeen *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=first_seen,json=firstSeen,proto3" json:"first_seen,omitempty"` -} - -func (x *SubmitIntentSolutionReply) Reset() { - *x = SubmitIntentSolutionReply{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[71] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitIntentSolutionReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitIntentSolutionReply) ProtoMessage() {} - -func (x *SubmitIntentSolutionReply) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[71] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitIntentSolutionReply.ProtoReflect.Descriptor instead. -func (*SubmitIntentSolutionReply) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{71} -} - -func (x *SubmitIntentSolutionReply) GetSolutionId() string { - if x != nil { - return x.SolutionId - } - return "" -} - -func (x *SubmitIntentSolutionReply) GetFirstSeen() *timestamppb.Timestamp { - if x != nil { - return x.FirstSeen - } - return nil -} - -type SubmitQuoteRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DappAddress string `protobuf:"bytes,1,opt,name=dappAddress,proto3" json:"dappAddress,omitempty"` // ETH address - SolverAddress string `protobuf:"bytes,2,opt,name=solverAddress,proto3" json:"solverAddress,omitempty"` // ETH address - Quote []byte `protobuf:"bytes,3,opt,name=quote,proto3" json:"quote,omitempty"` // The quote payload - Hash []byte `protobuf:"bytes,4,opt,name=hash,proto3" json:"hash,omitempty"` // Keccak256Hash of the quote bytes - Signature []byte `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` // ECDSA signature of hash -} - -func (x *SubmitQuoteRequest) Reset() { - *x = SubmitQuoteRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[72] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitQuoteRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitQuoteRequest) ProtoMessage() {} - -func (x *SubmitQuoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[72] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitQuoteRequest.ProtoReflect.Descriptor instead. -func (*SubmitQuoteRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{72} -} - -func (x *SubmitQuoteRequest) GetDappAddress() string { - if x != nil { - return x.DappAddress - } - return "" -} - -func (x *SubmitQuoteRequest) GetSolverAddress() string { - if x != nil { - return x.SolverAddress - } - return "" -} - -func (x *SubmitQuoteRequest) GetQuote() []byte { - if x != nil { - return x.Quote - } - return nil -} - -func (x *SubmitQuoteRequest) GetHash() []byte { - if x != nil { - return x.Hash - } - return nil -} - -func (x *SubmitQuoteRequest) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type SubmitQuoteReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - QuoteId string `protobuf:"bytes,1,opt,name=quoteId,proto3" json:"quoteId,omitempty"` - FirstSeen *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=first_seen,json=firstSeen,proto3" json:"first_seen,omitempty"` -} - -func (x *SubmitQuoteReply) Reset() { - *x = SubmitQuoteReply{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[73] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitQuoteReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitQuoteReply) ProtoMessage() {} - -func (x *SubmitQuoteReply) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[73] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitQuoteReply.ProtoReflect.Descriptor instead. -func (*SubmitQuoteReply) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{73} -} - -func (x *SubmitQuoteReply) GetQuoteId() string { - if x != nil { - return x.QuoteId - } - return "" -} - -func (x *SubmitQuoteReply) GetFirstSeen() *timestamppb.Timestamp { - if x != nil { - return x.FirstSeen - } - return nil -} - -type QuotesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DappAddress string `protobuf:"bytes,1,opt,name=dappAddress,proto3" json:"dappAddress,omitempty"` // dApp address -} - -func (x *QuotesRequest) Reset() { - *x = QuotesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[74] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *QuotesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*QuotesRequest) ProtoMessage() {} - -func (x *QuotesRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[74] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use QuotesRequest.ProtoReflect.Descriptor instead. -func (*QuotesRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{74} -} - -func (x *QuotesRequest) GetDappAddress() string { - if x != nil { - return x.DappAddress - } - return "" -} - -type QuotesReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DappAddress string `protobuf:"bytes,1,opt,name=dappAddress,proto3" json:"dappAddress,omitempty"` // GUID expected - SolverAddress string `protobuf:"bytes,2,opt,name=solverAddress,proto3" json:"solverAddress,omitempty"` // GUID expected - QuoteId string `protobuf:"bytes,3,opt,name=quoteId,proto3" json:"quoteId,omitempty"` - Quote []byte `protobuf:"bytes,4,opt,name=quote,proto3" json:"quote,omitempty"` //The intent payload - Timestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` -} - -func (x *QuotesReply) Reset() { - *x = QuotesReply{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[75] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *QuotesReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*QuotesReply) ProtoMessage() {} - -func (x *QuotesReply) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[75] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use QuotesReply.ProtoReflect.Descriptor instead. -func (*QuotesReply) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{75} -} - -func (x *QuotesReply) GetDappAddress() string { - if x != nil { - return x.DappAddress - } - return "" -} - -func (x *QuotesReply) GetSolverAddress() string { - if x != nil { - return x.SolverAddress - } - return "" -} - -func (x *QuotesReply) GetQuoteId() string { - if x != nil { - return x.QuoteId - } - return "" -} - -func (x *QuotesReply) GetQuote() []byte { - if x != nil { - return x.Quote - } - return nil -} - -func (x *QuotesReply) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp - } - return nil -} - -type IntentsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SolverAddress string `protobuf:"bytes,1,opt,name=solverAddress,proto3" json:"solverAddress,omitempty"` - Hash []byte `protobuf:"bytes,3,opt,name=hash,proto3" json:"hash,omitempty"` //Keccak256Hash of the solverAddress bytes - Signature []byte `protobuf:"bytes,4,opt,name=signature,proto3" json:"signature,omitempty"` //ECDSA signature - FromTimestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=fromTimestamp,proto3" json:"fromTimestamp,omitempty"` - Filters string `protobuf:"bytes,6,opt,name=filters,proto3" json:"filters,omitempty"` -} - -func (x *IntentsRequest) Reset() { - *x = IntentsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[76] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IntentsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IntentsRequest) ProtoMessage() {} - -func (x *IntentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[76] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IntentsRequest.ProtoReflect.Descriptor instead. -func (*IntentsRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{76} -} - -func (x *IntentsRequest) GetSolverAddress() string { - if x != nil { - return x.SolverAddress - } - return "" -} - -func (x *IntentsRequest) GetHash() []byte { - if x != nil { - return x.Hash - } - return nil -} - -func (x *IntentsRequest) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -func (x *IntentsRequest) GetFromTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.FromTimestamp - } - return nil -} - -func (x *IntentsRequest) GetFilters() string { - if x != nil { - return x.Filters - } - return "" -} - -type IntentsReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DappAddress string `protobuf:"bytes,1,opt,name=dappAddress,proto3" json:"dappAddress,omitempty"` // GUID expected - SenderAddress string `protobuf:"bytes,2,opt,name=senderAddress,proto3" json:"senderAddress,omitempty"` - IntentId string `protobuf:"bytes,3,opt,name=intentId,proto3" json:"intentId,omitempty"` - Intent []byte `protobuf:"bytes,4,opt,name=intent,proto3" json:"intent,omitempty"` //The intent payload - Timestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` -} - -func (x *IntentsReply) Reset() { - *x = IntentsReply{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[77] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IntentsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IntentsReply) ProtoMessage() {} - -func (x *IntentsReply) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[77] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IntentsReply.ProtoReflect.Descriptor instead. -func (*IntentsReply) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{77} -} - -func (x *IntentsReply) GetDappAddress() string { - if x != nil { - return x.DappAddress - } - return "" -} - -func (x *IntentsReply) GetSenderAddress() string { - if x != nil { - return x.SenderAddress - } - return "" -} - -func (x *IntentsReply) GetIntentId() string { - if x != nil { - return x.IntentId - } - return "" -} - -func (x *IntentsReply) GetIntent() []byte { - if x != nil { - return x.Intent - } - return nil -} - -func (x *IntentsReply) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp - } - return nil -} - -type IntentSolutionsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DappAddress string `protobuf:"bytes,1,opt,name=dappAddress,proto3" json:"dappAddress,omitempty"` // dApp or sender address - Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` // Keccak256Hash of the dappAddress bytes - Signature []byte `protobuf:"bytes,3,opt,name=signature,proto3" json:"signature,omitempty"` // ECDSA signature of the hash -} - -func (x *IntentSolutionsRequest) Reset() { - *x = IntentSolutionsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[78] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IntentSolutionsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IntentSolutionsRequest) ProtoMessage() {} - -func (x *IntentSolutionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[78] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IntentSolutionsRequest.ProtoReflect.Descriptor instead. -func (*IntentSolutionsRequest) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{78} -} - -func (x *IntentSolutionsRequest) GetDappAddress() string { - if x != nil { - return x.DappAddress - } - return "" -} - -func (x *IntentSolutionsRequest) GetHash() []byte { - if x != nil { - return x.Hash - } - return nil -} - -func (x *IntentSolutionsRequest) GetSignature() []byte { - if x != nil { - return x.Signature - } - return nil -} - -type IntentSolutionsReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - IntentId string `protobuf:"bytes,1,opt,name=intentId,proto3" json:"intentId,omitempty"` - IntentSolution []byte `protobuf:"bytes,2,opt,name=intentSolution,proto3" json:"intentSolution,omitempty"` //The solution payload - SolutionId string `protobuf:"bytes,3,opt,name=solutionId,proto3" json:"solutionId,omitempty"` -} - -func (x *IntentSolutionsReply) Reset() { - *x = IntentSolutionsReply{} - if protoimpl.UnsafeEnabled { - mi := &file_gateway_proto_msgTypes[79] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IntentSolutionsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IntentSolutionsReply) ProtoMessage() {} - -func (x *IntentSolutionsReply) ProtoReflect() protoreflect.Message { - mi := &file_gateway_proto_msgTypes[79] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IntentSolutionsReply.ProtoReflect.Descriptor instead. -func (*IntentSolutionsReply) Descriptor() ([]byte, []int) { - return file_gateway_proto_rawDescGZIP(), []int{79} -} - -func (x *IntentSolutionsReply) GetIntentId() string { - if x != nil { - return x.IntentId - } - return "" -} - -func (x *IntentSolutionsReply) GetIntentSolution() []byte { - if x != nil { - return x.IntentSolution - } - return nil -} - -func (x *IntentSolutionsReply) GetSolutionId() string { - if x != nil { - return x.SolutionId - } - return "" -} - -var File_gateway_proto protoreflect.FileDescriptor +var File_gateway_proto protoreflect.FileDescriptor var file_gateway_proto_rawDesc = []byte{ 0x0a, 0x0d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, @@ -5850,7 +4911,7 @@ var file_gateway_proto_rawDesc = []byte{ 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0xa8, 0x05, 0x0a, 0x17, 0x42, 0x6c, 0x78, 0x72, 0x53, 0x75, + 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0xca, 0x05, 0x0a, 0x17, 0x42, 0x6c, 0x78, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0c, 0x6d, 0x65, 0x76, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, @@ -5889,853 +4950,693 @@ var file_gateway_proto_rawDesc = []byte{ 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x1a, 0x3e, 0x0a, 0x10, 0x4d, 0x65, 0x76, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x38, 0x0a, 0x15, 0x42, 0x6c, 0x78, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x6e, - 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x22, 0x67, 0x0a, 0x0a, 0x54, 0x78, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x12, 0x23, - 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x66, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, - 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x21, 0x0a, - 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, - 0x74, 0x69, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x78, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x72, 0x61, 0x77, 0x54, 0x78, 0x22, 0x4a, 0x0a, 0x0b, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x27, 0x0a, 0x08, 0x54, 0x78, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x52, 0x02, 0x74, 0x78, - 0x22, 0x50, 0x0a, 0x0d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x12, 0x23, 0x0a, - 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x22, 0xa1, 0x05, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x33, 0x5f, 0x75, 0x6e, 0x63, 0x6c, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x68, 0x61, 0x33, 0x55, 0x6e, - 0x63, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, - 0x74, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, - 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, - 0x6f, 0x67, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x6f, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6c, 0x6f, 0x67, 0x73, 0x42, 0x6c, 0x6f, 0x6f, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, - 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x67, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x72, - 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, - 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x69, 0x78, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x69, 0x78, 0x48, 0x61, - 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x10, 0x62, 0x61, 0x73, 0x65, - 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x50, 0x65, 0x72, 0x47, 0x61, - 0x73, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, - 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x77, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x0d, - 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x62, 0x47, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, - 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x78, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, - 0x67, 0x61, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, 0x65, 0x73, - 0x73, 0x42, 0x6c, 0x6f, 0x62, 0x47, 0x61, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x75, 0x0a, 0x13, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, - 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, - 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x7d, 0x0a, - 0x0a, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xb3, 0x02, 0x0a, - 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, - 0x12, 0x2a, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x73, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2c, 0x0a, 0x06, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x15, 0x66, 0x75, - 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x13, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, 0x0a, 0x0b, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x52, 0x0b, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x0b, 0x77, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x1c, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, 0x70, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x65, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x70, 0x65, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x34, 0x0a, - 0x1a, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x3b, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x61, - 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x22, 0x9f, 0x02, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x69, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x65, 0x65, 0x64, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x72, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, 0x0a, 0x07, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x61, 0x67, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x73, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x22, 0x51, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3b, 0x0a, 0x0d, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x35, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x47, 0x0a, 0x0c, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, - 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x44, 0x61, 0x74, 0x65, 0x22, 0x32, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, - 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x0b, 0x0a, 0x09, 0x53, 0x74, 0x6f, - 0x70, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x47, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, - 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x60, 0x0a, 0x0c, 0x52, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x48, 0x6f, 0x75, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x07, 0x6f, 0x6e, 0x65, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x6e, 0x65, - 0x44, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x6e, 0x65, 0x44, 0x61, - 0x79, 0x22, 0xf6, 0x08, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, - 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x38, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, - 0x61, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, - 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, - 0x72, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, - 0x5f, 0x70, 0x65, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x69, 0x6e, - 0x55, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0e, 0x6d, 0x69, - 0x6e, 0x5f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x55, 0x73, 0x54, 0x6f, 0x50, 0x65, 0x65, 0x72, 0x12, - 0x2c, 0x0a, 0x12, 0x73, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x73, 0x6c, 0x6f, - 0x77, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, - 0x11, 0x6d, 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x5f, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x72, - 0x69, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x55, 0x73, 0x52, - 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x36, - 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x76, 0x5f, 0x6d, 0x69, - 0x6e, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x76, 0x4d, 0x69, - 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x76, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, - 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x76, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x15, 0x75, 0x6e, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x74, - 0x78, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x12, 0x75, 0x6e, 0x70, 0x61, 0x69, 0x64, 0x54, 0x78, 0x42, 0x75, 0x72, - 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x70, 0x61, 0x69, 0x64, 0x5f, - 0x74, 0x78, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x13, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x61, 0x69, 0x64, 0x54, 0x78, 0x42, 0x75, 0x72, 0x73, - 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x55, 0x0a, 0x1c, 0x75, 0x6e, 0x70, 0x61, 0x69, 0x64, - 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, - 0x65, 0x78, 0x63, 0x65, 0x73, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x18, 0x75, 0x6e, 0x70, 0x61, 0x69, 0x64, 0x54, 0x78, 0x42, 0x75, 0x72, - 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x63, 0x65, 0x73, 0x73, 0x12, 0x51, 0x0a, - 0x1a, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x73, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x61, 0x74, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x16, 0x70, 0x61, 0x69, 0x64, 0x54, 0x78, - 0x42, 0x75, 0x72, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x63, 0x65, 0x73, 0x73, - 0x12, 0x43, 0x0a, 0x12, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x74, 0x78, 0x5f, 0x74, 0x68, 0x72, 0x6f, - 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x10, 0x70, 0x61, 0x69, 0x64, 0x54, 0x78, 0x54, 0x68, 0x72, 0x6f, 0x75, - 0x67, 0x68, 0x70, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x14, 0x75, 0x6e, 0x70, 0x61, 0x69, 0x64, 0x5f, - 0x74, 0x78, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x18, 0x17, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x61, - 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x12, 0x75, 0x6e, 0x70, 0x61, - 0x69, 0x64, 0x54, 0x78, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x76, 0x5f, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, - 0x6d, 0x65, 0x76, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, - 0x65, 0x77, 0x5f, 0x74, 0x78, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6e, 0x65, - 0x77, 0x54, 0x78, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, - 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x74, 0x78, 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, - 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x53, 0x65, 0x65, 0x6e, 0x54, 0x78, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x31, 0x0a, 0x0a, 0x50, 0x65, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x23, 0x0a, 0x05, 0x70, 0x65, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x22, 0x0f, 0x0a, - 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x58, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x27, - 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x48, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x77, 0x0a, 0x0d, 0x42, 0x78, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x49, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x61, 0x64, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x07, 0x61, 0x64, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x17, 0x47, 0x65, - 0x74, 0x42, 0x78, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x42, 0x0a, 0x18, 0x47, 0x65, 0x74, - 0x42, 0x78, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x78, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x74, 0x78, 0x22, 0x35, 0x0a, - 0x0e, 0x54, 0x78, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, + 0x12, 0x20, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x1a, 0x3e, 0x0a, 0x10, 0x4d, 0x65, 0x76, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x38, 0x0a, 0x15, 0x42, 0x6c, 0x78, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, + 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x62, + 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x22, 0x67, 0x0a, 0x0a, + 0x54, 0x78, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, + 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x66, 0x0a, 0x02, 0x54, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x66, + 0x72, 0x6f, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, + 0x21, 0x0a, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x67, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x78, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x72, 0x61, 0x77, 0x54, 0x78, 0x22, 0x4a, 0x0a, + 0x0b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x27, 0x0a, 0x08, 0x54, 0x78, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x52, 0x02, + 0x74, 0x78, 0x22, 0x50, 0x0a, 0x0d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x12, + 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0xc2, 0x01, 0x0a, 0x12, 0x54, 0x78, 0x53, 0x74, 0x6f, 0x72, 0x65, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, - 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, - 0x5f, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x42, 0x78, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x54, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x73, - 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, - 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x0c, 0x54, 0x78, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x78, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x69, - 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x22, 0x47, 0x0a, 0x0b, 0x54, - 0x78, 0x41, 0x6e, 0x64, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x73, 0x65, - 0x6e, 0x64, 0x65, 0x72, 0x22, 0xa5, 0x03, 0x0a, 0x12, 0x42, 0x6c, 0x78, 0x72, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x54, 0x58, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x18, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, - 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x41, 0x6e, 0x64, 0x53, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x52, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x41, 0x6e, 0x64, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6e, - 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x6e, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, - 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x4f, 0x6e, - 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x64, - 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x73, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, - 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x17, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x72, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xcf, 0x02, 0x0a, - 0x0d, 0x42, 0x6c, 0x78, 0x72, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x63, - 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x6e, - 0x65, 0x78, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, - 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x4f, 0x6e, 0x6c, 0x79, - 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x27, 0x0a, 0x0f, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x17, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x26, - 0x0a, 0x0b, 0x42, 0x6c, 0x78, 0x72, 0x54, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x17, 0x0a, - 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0x34, 0x0a, 0x07, 0x54, 0x78, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x69, 0x64, 0x78, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0x34, 0x0a, 0x0a, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x69, 0x64, 0x78, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x73, 0x0a, 0x10, 0x42, 0x6c, 0x78, 0x72, 0x42, 0x61, 0x74, 0x63, 0x68, 0x54, - 0x58, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x08, 0x74, 0x78, 0x48, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x08, 0x74, - 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x34, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x4d, 0x0a, - 0x0b, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0x68, 0x0a, 0x0b, - 0x51, 0x75, 0x65, 0x75, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, - 0x78, 0x73, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x78, 0x73, 0x51, 0x75, 0x65, 0x75, 0x65, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x15, 0x74, 0x78, 0x73, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x12, 0x74, 0x78, 0x73, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x51, 0x75, 0x65, 0x75, - 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb7, 0x01, 0x0a, 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, - 0x0a, 0x19, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x17, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x53, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x75, - 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x73, 0x5f, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x73, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0xfd, 0x04, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x28, 0x6e, 0x65, - 0x77, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x23, 0x6e, 0x65, - 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x46, - 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4e, 0x6f, 0x64, - 0x65, 0x12, 0x3e, 0x0a, 0x1c, 0x6e, 0x65, 0x77, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, - 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x64, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x6e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x64, - 0x6e, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, - 0x73, 0x65, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x53, 0x0a, 0x27, 0x6e, 0x65, 0x77, - 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5f, - 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x22, 0x6e, 0x65, 0x77, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x5d, - 0x0a, 0x2c, 0x6e, 0x65, 0x77, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, - 0x75, 0x6e, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x27, 0x6e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x6e, - 0x6e, 0x6f, 0x75, 0x6e, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x4d, 0x0a, - 0x24, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x78, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, - 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1f, 0x6e, 0x65, 0x77, - 0x54, 0x78, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x36, 0x0a, 0x18, - 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x78, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, - 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x64, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, - 0x6e, 0x65, 0x77, 0x54, 0x78, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, - 0x6d, 0x42, 0x64, 0x6e, 0x12, 0x25, 0x0a, 0x0f, 0x74, 0x78, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, - 0x74, 0x6f, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x74, - 0x78, 0x53, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x64, - 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x78, 0x5f, 0x66, 0x72, 0x6f, 0x6d, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x64, 0x75, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, - 0x22, 0x64, 0x0a, 0x0c, 0x57, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x61, 0x64, 0x64, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x79, 0x6e, 0x63, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xd8, 0x02, 0x0a, 0x0e, 0x4e, 0x6f, 0x64, 0x65, 0x43, - 0x6f, 0x6e, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, - 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x0d, 0x77, 0x73, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x57, 0x73, 0x43, 0x6f, - 0x6e, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x77, 0x73, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, - 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, - 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x49, - 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x49, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x79, 0x6e, 0x61, 0x6d, - 0x69, 0x63, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, - 0x63, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x42, 0x44, 0x4e, 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, - 0x0a, 0x07, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x07, 0x6c, 0x61, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x22, 0xba, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x69, - 0x6e, 0x5f, 0x6d, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x4d, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x50, - 0x65, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x73, 0x5f, 0x74, 0x6f, - 0x5f, 0x70, 0x65, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x69, 0x6e, - 0x4d, 0x73, 0x54, 0x6f, 0x50, 0x65, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x6c, 0x6f, 0x77, - 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x73, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x73, - 0x5f, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x72, 0x69, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x4d, 0x73, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, - 0x70, 0x22, 0xa9, 0x02, 0x0a, 0x0b, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, - 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, - 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x69, - 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x75, 0x70, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x2c, 0x0a, 0x12, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x8f, 0x04, - 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x37, 0x0a, 0x0c, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x05, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6c, - 0x61, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x73, - 0x12, 0x37, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x35, 0x0a, 0x0b, 0x71, 0x75, 0x65, - 0x75, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x52, 0x0a, 0x71, 0x75, 0x65, 0x75, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x37, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0b, 0x69, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x51, 0x0a, 0x0b, - 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x44, 0x4e, 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x8e, 0x01, 0x0a, 0x08, 0x54, 0x78, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x78, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, - 0x77, 0x54, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x61, 0x77, 0x54, 0x78, - 0x22, 0x79, 0x0a, 0x12, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x61, 0x64, 0x65, 0x72, 0x22, 0xa1, 0x05, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x33, 0x5f, 0x75, 0x6e, + 0x63, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x68, 0x61, 0x33, + 0x55, 0x6e, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x70, 0x74, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x6c, 0x6f, 0x67, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x6f, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x73, 0x42, 0x6c, 0x6f, 0x6f, 0x6d, 0x12, 0x1e, 0x0a, 0x0a, + 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x69, 0x78, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x69, 0x78, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x10, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x46, 0x65, 0x65, 0x50, 0x65, 0x72, + 0x47, 0x61, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x73, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x77, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x22, + 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x62, 0x47, 0x61, 0x73, 0x55, 0x73, + 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x65, 0x78, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x62, 0x6c, 0x6f, + 0x62, 0x5f, 0x67, 0x61, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x63, + 0x65, 0x73, 0x73, 0x42, 0x6c, 0x6f, 0x62, 0x47, 0x61, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x5f, 0x72, 0x6f, 0x6f, 0x74, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x65, + 0x61, 0x63, 0x6f, 0x6e, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x75, 0x0a, 0x13, 0x46, 0x75, 0x74, 0x75, + 0x72, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x61, 0x6c, 0x6c, 0x65, 0x74, 0x49, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, + 0x7d, 0x0a, 0x0a, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xb3, + 0x02, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, + 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2c, + 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x15, + 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x13, 0x66, 0x75, 0x74, 0x75, 0x72, + 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2d, + 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, + 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, + 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x57, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x61, 0x6c, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x1c, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x69, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x65, 0x65, 0x72, 0x49, 0x70, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x70, 0x65, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x34, 0x0a, 0x1a, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3b, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, + 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x22, 0x9f, 0x02, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x69, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x65, 0x65, 0x64, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1f, 0x0a, + 0x0b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x61, + 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x73, + 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x22, 0x51, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3b, 0x0a, 0x0d, 0x73, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x35, 0x0a, 0x0e, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x47, + 0x0a, 0x0c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x44, 0x61, 0x74, 0x65, 0x22, 0x32, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x53, - 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x77, - 0x69, 0x74, 0x68, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x73, 0x22, 0x1f, 0x0a, 0x0b, 0x54, - 0x78, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x78, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0x2e, 0x0a, 0x0f, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0c, 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x2c, 0x0a, 0x0d, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1b, 0x0a, - 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, - 0x52, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x73, 0x22, 0xb8, 0x03, 0x0a, 0x14, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x74, - 0x74, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x72, - 0x65, 0x76, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, - 0x73, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x67, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x2d, 0x0a, - 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x54, 0x78, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x39, 0x0a, 0x19, - 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x6f, - 0x6e, 0x5f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x16, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4f, 0x6e, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x6e, 0x5f, 0x72, 0x65, - 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0b, 0x20, - 0x03, 0x28, 0x0c, 0x52, 0x10, 0x75, 0x6e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x48, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x42, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x54, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, - 0x0a, 0x08, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x22, 0x6f, 0x0a, 0x12, 0x50, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, - 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x19, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x56, 0x0a, 0x17, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3b, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x73, 0x22, 0xc5, 0x02, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x44, 0x0a, 0x10, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, - 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, - 0x6c, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x13, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x61, 0x70, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x61, 0x70, 0x70, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x69, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x22, 0x6a, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, - 0x65, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, - 0x22, 0xb9, 0x01, 0x0a, 0x1b, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, - 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x76, 0x0a, 0x19, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x53, 0x65, 0x65, 0x6e, 0x22, 0xa4, 0x01, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x51, - 0x75, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x61, 0x70, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x61, 0x70, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, - 0x0d, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x05, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, - 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x67, 0x0a, 0x10, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x18, 0x0a, 0x07, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x53, 0x65, 0x65, 0x6e, 0x22, 0x31, 0x0a, 0x0d, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x61, 0x70, 0x70, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x61, 0x70, 0x70, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xbf, 0x01, 0x0a, 0x0b, 0x51, 0x75, 0x6f, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x61, 0x70, 0x70, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x61, - 0x70, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x6f, 0x6c, - 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x6f, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x12, - 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, + 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x0b, 0x0a, 0x09, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x47, 0x0a, 0x0c, 0x50, 0x65, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0b, + 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x22, 0x60, 0x0a, 0x0c, 0x52, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x69, 0x76, 0x65, 0x4d, 0x69, 0x6e, 0x75, 0x74, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x48, 0x6f, 0x75, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x07, 0x6f, 0x6e, 0x65, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6f, + 0x6e, 0x65, 0x44, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x6e, 0x65, + 0x44, 0x61, 0x79, 0x22, 0xf6, 0x08, 0x0a, 0x04, 0x50, 0x65, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x17, 0x0a, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, + 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x38, 0x0a, 0x09, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, + 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x5f, 0x66, 0x72, + 0x6f, 0x6d, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, + 0x69, 0x6e, 0x55, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x65, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0e, + 0x6d, 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x55, 0x73, 0x54, 0x6f, 0x50, 0x65, 0x65, + 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x6c, 0x6f, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x73, + 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x29, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x5f, 0x75, 0x73, 0x5f, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, + 0x74, 0x72, 0x69, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x55, + 0x73, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, + 0x12, 0x36, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc4, 0x01, 0x0a, 0x0e, 0x49, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, - 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x66, 0x72, 0x6f, 0x6d, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, - 0x22, 0xc4, 0x01, 0x0a, 0x0c, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x61, 0x70, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x61, 0x70, 0x70, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x6c, 0x0a, 0x16, 0x49, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x61, 0x70, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x61, 0x70, 0x70, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x7a, 0x0a, 0x14, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, - 0x08, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x32, 0xe2, 0x0d, 0x0a, 0x07, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x38, 0x0a, - 0x06, 0x42, 0x6c, 0x78, 0x72, 0x54, 0x78, 0x12, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x42, 0x6c, 0x78, 0x72, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x78, 0x72, 0x54, 0x78, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0b, 0x42, 0x6c, 0x78, 0x72, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x54, 0x58, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x42, 0x6c, 0x78, 0x72, 0x42, 0x61, 0x74, 0x63, 0x68, 0x54, 0x58, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, - 0x78, 0x72, 0x42, 0x61, 0x74, 0x63, 0x68, 0x54, 0x58, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x35, 0x0a, 0x05, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0e, 0x54, 0x78, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x05, 0x47, - 0x65, 0x74, 0x54, 0x78, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x76, 0x5f, + 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x76, + 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x65, 0x76, 0x5f, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x65, 0x76, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x15, 0x75, 0x6e, 0x70, 0x61, 0x69, 0x64, + 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x75, 0x6e, 0x70, 0x61, 0x69, 0x64, 0x54, 0x78, 0x42, + 0x75, 0x72, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x70, 0x61, 0x69, + 0x64, 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x61, 0x69, 0x64, 0x54, 0x78, 0x42, 0x75, + 0x72, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x55, 0x0a, 0x1c, 0x75, 0x6e, 0x70, 0x61, + 0x69, 0x64, 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x73, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x18, 0x75, 0x6e, 0x70, 0x61, 0x69, 0x64, 0x54, 0x78, 0x42, + 0x75, 0x72, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x63, 0x65, 0x73, 0x73, 0x12, + 0x51, 0x0a, 0x1a, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x74, 0x78, 0x5f, 0x62, 0x75, 0x72, 0x73, 0x74, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x73, 0x73, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x61, + 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x16, 0x70, 0x61, 0x69, 0x64, + 0x54, 0x78, 0x42, 0x75, 0x72, 0x73, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x78, 0x63, 0x65, + 0x73, 0x73, 0x12, 0x43, 0x0a, 0x12, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x74, 0x78, 0x5f, 0x74, 0x68, + 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x10, 0x70, 0x61, 0x69, 0x64, 0x54, 0x78, 0x54, 0x68, 0x72, + 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x14, 0x75, 0x6e, 0x70, 0x61, 0x69, + 0x64, 0x5f, 0x74, 0x78, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x52, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x12, 0x75, 0x6e, + 0x70, 0x61, 0x69, 0x64, 0x54, 0x78, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x70, 0x75, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, + 0x76, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0b, 0x6d, 0x65, 0x76, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x17, 0x0a, + 0x07, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x78, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, + 0x6e, 0x65, 0x77, 0x54, 0x78, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x74, 0x78, 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0e, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x53, 0x65, 0x65, 0x6e, 0x54, 0x78, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x1c, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x31, 0x0a, 0x0a, + 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x23, 0x0a, 0x05, 0x70, 0x65, + 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x52, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x22, + 0x0f, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x58, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x27, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x48, 0x0a, 0x0c, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0c, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x77, 0x0a, 0x0d, 0x42, 0x78, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, + 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x64, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x61, 0x64, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x07, 0x61, 0x64, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x17, + 0x47, 0x65, 0x74, 0x42, 0x78, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x42, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x42, 0x78, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x47, 0x65, 0x74, 0x42, 0x78, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x04, 0x53, - 0x74, 0x6f, 0x70, 0x12, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, - 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x3b, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0d, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x65, 0x0a, 0x15, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x65, 0x65, - 0x72, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x65, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x78, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x74, 0x78, 0x22, + 0x35, 0x0a, 0x0e, 0x54, 0x78, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0xc2, 0x01, 0x0a, 0x12, 0x54, 0x78, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, + 0x07, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x78, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x78, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x73, 0x68, 0x6f, 0x72, + 0x74, 0x49, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x09, 0x6f, 0x6c, 0x64, 0x65, + 0x73, 0x74, 0x5f, 0x74, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x78, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x54, 0x78, 0x12, 0x1c, 0x0a, + 0x09, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x0c, + 0x54, 0x78, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x08, + 0x74, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x74, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x5f, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3e, 0x0a, + 0x0c, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x22, 0x47, 0x0a, + 0x0b, 0x54, 0x78, 0x41, 0x6e, 0x64, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, + 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x22, 0xa5, 0x03, 0x0a, 0x12, 0x42, 0x6c, 0x78, 0x72, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x54, 0x58, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4e, 0x0a, + 0x18, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x6e, + 0x64, 0x5f, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x41, 0x6e, 0x64, 0x53, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x41, 0x6e, 0x64, 0x53, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x12, 0x29, 0x0a, + 0x10, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x4d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x78, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x27, 0x0a, 0x0f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, + 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, + 0x6f, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, + 0x0c, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x17, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xcf, + 0x02, 0x0a, 0x0d, 0x42, 0x6c, 0x78, 0x72, 0x54, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, + 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x0a, + 0x0e, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, + 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x4f, 0x6e, + 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x27, + 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x17, 0x66, 0x72, 0x6f, 0x6e, 0x74, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x26, 0x0a, 0x0b, 0x42, 0x6c, 0x78, 0x72, 0x54, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0x34, 0x0a, 0x07, 0x54, 0x78, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x69, 0x64, 0x78, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x22, 0x34, + 0x0a, 0x0a, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x10, 0x0a, 0x03, + 0x69, 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x69, 0x64, 0x78, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x73, 0x0a, 0x10, 0x42, 0x6c, 0x78, 0x72, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x54, 0x58, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x08, 0x74, + 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x74, 0x78, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x08, 0x74, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x34, 0x0a, 0x0d, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x4d, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x44, 0x61, 0x74, 0x65, 0x22, 0xfd, + 0x04, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x55, 0x0a, 0x28, 0x6e, 0x65, 0x77, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, + 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x23, 0x6e, 0x65, 0x77, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, + 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x3e, 0x0a, 0x1c, 0x6e, 0x65, 0x77, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x64, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x6e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x64, 0x6e, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x73, 0x65, + 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x53, 0x0a, 0x27, 0x6e, 0x65, 0x77, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x66, 0x72, + 0x6f, 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x22, 0x6e, 0x65, 0x77, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x5d, 0x0a, 0x2c, + 0x6e, 0x65, 0x77, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x75, 0x6e, + 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x27, 0x6e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x6e, 0x6e, 0x6f, + 0x75, 0x6e, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x4d, 0x0a, 0x24, 0x6e, + 0x65, 0x77, 0x5f, 0x74, 0x78, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x66, + 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1f, 0x6e, 0x65, 0x77, 0x54, 0x78, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x36, 0x0a, 0x18, 0x6e, 0x65, + 0x77, 0x5f, 0x74, 0x78, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x66, 0x72, + 0x6f, 0x6d, 0x5f, 0x62, 0x64, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x6e, 0x65, + 0x77, 0x54, 0x78, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, + 0x64, 0x6e, 0x12, 0x25, 0x0a, 0x0f, 0x74, 0x78, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x74, 0x78, 0x53, + 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x64, 0x75, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x78, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x64, 0x75, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x54, 0x78, 0x46, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x64, + 0x0a, 0x0c, 0x57, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, + 0x64, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0xd8, 0x02, 0x0a, 0x0e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6e, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x0d, 0x77, 0x73, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x57, 0x73, 0x43, 0x6f, 0x6e, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0c, 0x77, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x10, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x65, 0x72, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x65, 0x72, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x49, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x49, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x12, + 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, + 0x80, 0x01, 0x0a, 0x0d, 0x42, 0x44, 0x4e, 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, 0x0a, 0x07, + 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x07, 0x6c, 0x61, 0x74, 0x65, 0x6e, + 0x63, 0x79, 0x22, 0xba, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x69, 0x6e, 0x5f, + 0x6d, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x4d, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x50, 0x65, 0x65, + 0x72, 0x12, 0x23, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x70, + 0x65, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x4d, 0x73, + 0x54, 0x6f, 0x50, 0x65, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x6c, 0x6f, 0x77, 0x5f, 0x74, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x10, 0x73, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x73, 0x5f, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x72, 0x69, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0e, 0x6d, 0x69, 0x6e, 0x4d, 0x73, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, 0x70, 0x22, + 0xa9, 0x02, 0x0a, 0x0b, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, + 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, 0x6e, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x65, + 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, + 0x70, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2c, 0x0a, + 0x12, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x9f, 0x03, 0x0a, 0x0e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, + 0x0a, 0x0c, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x12, 0x37, + 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x51, 0x0a, 0x0a, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x51, 0x0a, 0x0b, 0x52, 0x65, + 0x6c, 0x61, 0x79, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x44, 0x4e, 0x43, 0x6f, 0x6e, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8e, 0x01, + 0x0a, 0x08, 0x54, 0x78, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x78, + 0x48, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x78, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x67, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x77, 0x54, + 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x61, 0x77, 0x54, 0x78, 0x22, 0x79, + 0x0a, 0x12, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x61, + 0x75, 0x74, 0x68, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x44, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x44, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x53, 0x69, 0x64, + 0x65, 0x63, 0x61, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x77, 0x69, 0x74, + 0x68, 0x53, 0x69, 0x64, 0x65, 0x63, 0x61, 0x72, 0x73, 0x22, 0x1f, 0x0a, 0x0b, 0x54, 0x78, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x03, 0x74, 0x78, 0x73, 0x22, 0x2e, 0x0a, 0x0f, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x74, 0x78, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, + 0x52, 0x08, 0x74, 0x78, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x22, 0x2c, 0x0a, 0x0d, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x08, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x73, 0x22, 0xb8, 0x03, 0x0a, 0x14, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x34, 0x0a, 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x68, + 0x74, 0x74, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x76, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, + 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x67, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x67, 0x61, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x67, 0x61, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x2d, 0x0a, 0x07, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x54, + 0x78, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4f, 0x6e, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x10, 0x75, 0x6e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x48, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x22, 0x42, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x54, + 0x78, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, 0x61, 0x77, 0x44, 0x61, 0x74, 0x61, 0x12, 0x19, 0x0a, 0x08, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x64, 0x22, 0x6f, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, + 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x19, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x56, 0x0a, 0x17, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3b, 0x0a, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x07, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, + 0x22, 0xc5, 0x02, 0x0a, 0x18, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x44, 0x0a, + 0x10, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x08, 0x73, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x27, 0x0a, + 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x32, 0x97, 0x0a, 0x0a, 0x07, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x12, 0x38, 0x0a, 0x06, 0x42, 0x6c, 0x78, 0x72, 0x54, 0x78, 0x12, 0x16, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x78, 0x72, 0x54, 0x78, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x42, 0x6c, 0x78, 0x72, 0x54, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x47, + 0x0a, 0x0b, 0x42, 0x6c, 0x78, 0x72, 0x42, 0x61, 0x74, 0x63, 0x68, 0x54, 0x58, 0x12, 0x1b, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x78, 0x72, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x54, 0x58, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x78, 0x72, 0x42, 0x61, 0x74, 0x63, 0x68, 0x54, 0x58, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x05, 0x50, 0x65, 0x65, 0x72, 0x73, + 0x12, 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x0e, 0x54, 0x78, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x12, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x05, 0x47, 0x65, 0x74, 0x54, 0x78, 0x12, 0x20, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x78, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x78, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x32, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x14, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x12, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4d, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x65, 0x0a, 0x15, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x65, 0x65, 0x72, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x34, 0x0a, 0x06, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x73, 0x12, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x38, 0x0a, 0x0a, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x54, 0x78, 0x73, 0x12, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x54, 0x78, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x3d, 0x0a, 0x09, 0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3d, - 0x0a, 0x09, 0x42, 0x64, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x46, 0x0a, - 0x0a, 0x45, 0x74, 0x68, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1a, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x74, 0x68, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x45, 0x74, 0x68, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x46, 0x0a, 0x0a, 0x54, 0x78, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x70, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, - 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x70, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3c, 0x0a, - 0x08, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, 0x12, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x46, 0x0a, 0x0f, 0x54, - 0x78, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, 0x12, 0x1b, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x10, 0x42, 0x6c, 0x78, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, - 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x42, 0x6c, 0x78, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x75, 0x6e, 0x64, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x78, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0c, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x6d, 0x69, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x07, 0x49, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x15, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x55, 0x0a, 0x0f, 0x49, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, - 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x47, 0x0a, 0x0b, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x65, - 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, - 0x74, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x51, 0x75, - 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x06, 0x51, 0x75, - 0x6f, 0x74, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x51, - 0x75, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x42, 0x2b, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x6c, 0x6f, 0x58, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2d, 0x4c, - 0x61, 0x62, 0x73, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x06, 0x4e, 0x65, 0x77, 0x54, 0x78, 0x73, + 0x12, 0x13, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x54, 0x78, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x38, 0x0a, 0x0a, + 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x78, 0x73, 0x12, 0x13, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x11, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3d, 0x0a, 0x09, 0x4e, 0x65, 0x77, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3d, 0x0a, 0x09, 0x42, 0x64, 0x6e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x46, 0x0a, 0x0a, 0x45, 0x74, 0x68, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x74, 0x68, + 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x74, 0x68, 0x4f, 0x6e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x46, 0x0a, 0x0a, + 0x54, 0x78, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x54, 0x78, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x3c, 0x0a, 0x08, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, + 0x12, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x46, 0x0a, 0x0f, 0x54, 0x78, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x44, 0x73, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x78, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x10, 0x42, 0x6c, + 0x78, 0x72, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x20, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x78, 0x72, 0x53, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x42, 0x6c, 0x78, 0x72, 0x53, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x42, 0x2b, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x62, 0x6c, 0x6f, 0x58, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2d, 0x4c, 0x61, 0x62, 0x73, 0x2f, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6750,7 +5651,7 @@ func file_gateway_proto_rawDescGZIP() []byte { return file_gateway_proto_rawDescData } -var file_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 84) +var file_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 70) var file_gateway_proto_goTypes = []interface{}{ (*TxLogs)(nil), // 0: gateway.TxLogs (*TxReceiptsRequest)(nil), // 1: gateway.TxReceiptsRequest @@ -6800,149 +5701,115 @@ var file_gateway_proto_goTypes = []interface{}{ (*BlxrBatchTXReply)(nil), // 45: gateway.BlxrBatchTXReply (*StatusRequest)(nil), // 46: gateway.StatusRequest (*AccountInfo)(nil), // 47: gateway.AccountInfo - (*QueuesStats)(nil), // 48: gateway.QueuesStats - (*IntentStats)(nil), // 49: gateway.IntentStats - (*NodePerformance)(nil), // 50: gateway.NodePerformance - (*WsConnStatus)(nil), // 51: gateway.WsConnStatus - (*NodeConnStatus)(nil), // 52: gateway.NodeConnStatus - (*BDNConnStatus)(nil), // 53: gateway.BDNConnStatus - (*ConnectionLatency)(nil), // 54: gateway.ConnectionLatency - (*GatewayInfo)(nil), // 55: gateway.GatewayInfo - (*StatusResponse)(nil), // 56: gateway.StatusResponse - (*TxResult)(nil), // 57: gateway.TxResult - (*ShortIDListRequest)(nil), // 58: gateway.ShortIDListRequest - (*TxListReply)(nil), // 59: gateway.TxListReply - (*ShortIDsRequest)(nil), // 60: gateway.ShortIDsRequest - (*ShortIDsReply)(nil), // 61: gateway.ShortIDsReply - (*ProposedBlockRequest)(nil), // 62: gateway.ProposedBlockRequest - (*CompressTx)(nil), // 63: gateway.CompressTx - (*ProposedBlockReply)(nil), // 64: gateway.ProposedBlockReply - (*ProposedBlockStatsRequest)(nil), // 65: gateway.ProposedBlockStatsRequest - (*ProposedBlockStatsReply)(nil), // 66: gateway.ProposedBlockStatsReply - (*ProposedBlockStatsRecord)(nil), // 67: gateway.ProposedBlockStatsRecord - (*SubmitIntentRequest)(nil), // 68: gateway.SubmitIntentRequest - (*SubmitIntentReply)(nil), // 69: gateway.SubmitIntentReply - (*SubmitIntentSolutionRequest)(nil), // 70: gateway.SubmitIntentSolutionRequest - (*SubmitIntentSolutionReply)(nil), // 71: gateway.SubmitIntentSolutionReply - (*SubmitQuoteRequest)(nil), // 72: gateway.SubmitQuoteRequest - (*SubmitQuoteReply)(nil), // 73: gateway.SubmitQuoteReply - (*QuotesRequest)(nil), // 74: gateway.QuotesRequest - (*QuotesReply)(nil), // 75: gateway.QuotesReply - (*IntentsRequest)(nil), // 76: gateway.IntentsRequest - (*IntentsReply)(nil), // 77: gateway.IntentsReply - (*IntentSolutionsRequest)(nil), // 78: gateway.IntentSolutionsRequest - (*IntentSolutionsReply)(nil), // 79: gateway.IntentSolutionsReply - nil, // 80: gateway.CallParams.ParamsEntry - nil, // 81: gateway.BlxrSubmitBundleRequest.MevBuildersEntry - nil, // 82: gateway.StatusResponse.NodesEntry - nil, // 83: gateway.StatusResponse.RelaysEntry - (*wrapperspb.BoolValue)(nil), // 84: google.protobuf.BoolValue - (*timestamppb.Timestamp)(nil), // 85: google.protobuf.Timestamp - (*durationpb.Duration)(nil), // 86: google.protobuf.Duration + (*NodePerformance)(nil), // 48: gateway.NodePerformance + (*WsConnStatus)(nil), // 49: gateway.WsConnStatus + (*NodeConnStatus)(nil), // 50: gateway.NodeConnStatus + (*BDNConnStatus)(nil), // 51: gateway.BDNConnStatus + (*ConnectionLatency)(nil), // 52: gateway.ConnectionLatency + (*GatewayInfo)(nil), // 53: gateway.GatewayInfo + (*StatusResponse)(nil), // 54: gateway.StatusResponse + (*TxResult)(nil), // 55: gateway.TxResult + (*ShortIDListRequest)(nil), // 56: gateway.ShortIDListRequest + (*TxListReply)(nil), // 57: gateway.TxListReply + (*ShortIDsRequest)(nil), // 58: gateway.ShortIDsRequest + (*ShortIDsReply)(nil), // 59: gateway.ShortIDsReply + (*ProposedBlockRequest)(nil), // 60: gateway.ProposedBlockRequest + (*CompressTx)(nil), // 61: gateway.CompressTx + (*ProposedBlockReply)(nil), // 62: gateway.ProposedBlockReply + (*ProposedBlockStatsRequest)(nil), // 63: gateway.ProposedBlockStatsRequest + (*ProposedBlockStatsReply)(nil), // 64: gateway.ProposedBlockStatsReply + (*ProposedBlockStatsRecord)(nil), // 65: gateway.ProposedBlockStatsRecord + nil, // 66: gateway.CallParams.ParamsEntry + nil, // 67: gateway.BlxrSubmitBundleRequest.MevBuildersEntry + nil, // 68: gateway.StatusResponse.NodesEntry + nil, // 69: gateway.StatusResponse.RelaysEntry + (*wrapperspb.BoolValue)(nil), // 70: google.protobuf.BoolValue + (*timestamppb.Timestamp)(nil), // 71: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 72: google.protobuf.Duration } var file_gateway_proto_depIdxs = []int32{ 0, // 0: gateway.TxReceiptsReply.logs:type_name -> gateway.TxLogs - 80, // 1: gateway.CallParams.params:type_name -> gateway.CallParams.ParamsEntry + 66, // 1: gateway.CallParams.params:type_name -> gateway.CallParams.ParamsEntry 3, // 2: gateway.EthOnBlockRequest.call_params:type_name -> gateway.CallParams - 81, // 3: gateway.BlxrSubmitBundleRequest.mev_builders:type_name -> gateway.BlxrSubmitBundleRequest.MevBuildersEntry + 67, // 3: gateway.BlxrSubmitBundleRequest.mev_builders:type_name -> gateway.BlxrSubmitBundleRequest.MevBuildersEntry 9, // 4: gateway.TxsReply.tx:type_name -> gateway.Tx 13, // 5: gateway.BlocksReply.header:type_name -> gateway.BlockHeader 14, // 6: gateway.BlocksReply.future_validator_info:type_name -> gateway.FutureValidatorInfo 9, // 7: gateway.BlocksReply.transaction:type_name -> gateway.Tx 15, // 8: gateway.BlocksReply.withdrawals:type_name -> gateway.Withdrawal 20, // 9: gateway.SubscriptionsReply.subscriptions:type_name -> gateway.Subscription - 84, // 10: gateway.Peer.initiator:type_name -> google.protobuf.BoolValue - 84, // 11: gateway.Peer.disabled:type_name -> google.protobuf.BoolValue + 70, // 10: gateway.Peer.initiator:type_name -> google.protobuf.BoolValue + 70, // 11: gateway.Peer.disabled:type_name -> google.protobuf.BoolValue 27, // 12: gateway.Peer.unpaid_tx_burst_limit_excess:type_name -> gateway.RateSnapshot 27, // 13: gateway.Peer.paid_tx_burst_limit_excess:type_name -> gateway.RateSnapshot 27, // 14: gateway.Peer.paid_tx_throughput:type_name -> gateway.RateSnapshot 27, // 15: gateway.Peer.unpaid_tx_throughput:type_name -> gateway.RateSnapshot 28, // 16: gateway.PeersReply.peers:type_name -> gateway.Peer 31, // 17: gateway.Transactions.transactions:type_name -> gateway.Transaction - 85, // 18: gateway.BxTransaction.add_time:type_name -> google.protobuf.Timestamp + 71, // 18: gateway.BxTransaction.add_time:type_name -> google.protobuf.Timestamp 33, // 19: gateway.GetBxTransactionResponse.tx:type_name -> gateway.BxTransaction 33, // 20: gateway.TxStoreNetworkData.oldest_tx:type_name -> gateway.BxTransaction 37, // 21: gateway.TxStoreReply.network_data:type_name -> gateway.TxStoreNetworkData 39, // 22: gateway.BlxrBatchTXRequest.transactions_and_senders:type_name -> gateway.TxAndSender 43, // 23: gateway.BlxrBatchTXReply.tx_hashes:type_name -> gateway.TxIndex 44, // 24: gateway.BlxrBatchTXReply.tx_errors:type_name -> gateway.ErrorIndex - 51, // 25: gateway.NodeConnStatus.ws_connection:type_name -> gateway.WsConnStatus - 50, // 26: gateway.NodeConnStatus.node_performance:type_name -> gateway.NodePerformance - 54, // 27: gateway.BDNConnStatus.latency:type_name -> gateway.ConnectionLatency - 55, // 28: gateway.StatusResponse.gateway_info:type_name -> gateway.GatewayInfo - 82, // 29: gateway.StatusResponse.nodes:type_name -> gateway.StatusResponse.NodesEntry - 83, // 30: gateway.StatusResponse.relays:type_name -> gateway.StatusResponse.RelaysEntry + 49, // 25: gateway.NodeConnStatus.ws_connection:type_name -> gateway.WsConnStatus + 48, // 26: gateway.NodeConnStatus.node_performance:type_name -> gateway.NodePerformance + 52, // 27: gateway.BDNConnStatus.latency:type_name -> gateway.ConnectionLatency + 53, // 28: gateway.StatusResponse.gateway_info:type_name -> gateway.GatewayInfo + 68, // 29: gateway.StatusResponse.nodes:type_name -> gateway.StatusResponse.NodesEntry + 69, // 30: gateway.StatusResponse.relays:type_name -> gateway.StatusResponse.RelaysEntry 47, // 31: gateway.StatusResponse.account_info:type_name -> gateway.AccountInfo - 48, // 32: gateway.StatusResponse.queue_stats:type_name -> gateway.QueuesStats - 49, // 33: gateway.StatusResponse.intent_stats:type_name -> gateway.IntentStats - 63, // 34: gateway.ProposedBlockRequest.payload:type_name -> gateway.CompressTx - 67, // 35: gateway.ProposedBlockStatsReply.records:type_name -> gateway.ProposedBlockStatsRecord - 86, // 36: gateway.ProposedBlockStatsRecord.sending_duration:type_name -> google.protobuf.Duration - 85, // 37: gateway.ProposedBlockStatsRecord.received_time:type_name -> google.protobuf.Timestamp - 85, // 38: gateway.ProposedBlockStatsRecord.sent_time:type_name -> google.protobuf.Timestamp - 85, // 39: gateway.SubmitIntentReply.first_seen:type_name -> google.protobuf.Timestamp - 85, // 40: gateway.SubmitIntentSolutionReply.first_seen:type_name -> google.protobuf.Timestamp - 85, // 41: gateway.SubmitQuoteReply.first_seen:type_name -> google.protobuf.Timestamp - 85, // 42: gateway.QuotesReply.timestamp:type_name -> google.protobuf.Timestamp - 85, // 43: gateway.IntentsRequest.fromTimestamp:type_name -> google.protobuf.Timestamp - 85, // 44: gateway.IntentsReply.timestamp:type_name -> google.protobuf.Timestamp - 52, // 45: gateway.StatusResponse.NodesEntry.value:type_name -> gateway.NodeConnStatus - 53, // 46: gateway.StatusResponse.RelaysEntry.value:type_name -> gateway.BDNConnStatus - 41, // 47: gateway.Gateway.BlxrTx:input_type -> gateway.BlxrTxRequest - 40, // 48: gateway.Gateway.BlxrBatchTX:input_type -> gateway.BlxrBatchTXRequest - 26, // 49: gateway.Gateway.Peers:input_type -> gateway.PeersRequest - 36, // 50: gateway.Gateway.TxStoreSummary:input_type -> gateway.TxStoreRequest - 34, // 51: gateway.Gateway.GetTx:input_type -> gateway.GetBxTransactionRequest - 24, // 52: gateway.Gateway.Stop:input_type -> gateway.StopRequest - 22, // 53: gateway.Gateway.Version:input_type -> gateway.VersionRequest - 46, // 54: gateway.Gateway.Status:input_type -> gateway.StatusRequest - 19, // 55: gateway.Gateway.Subscriptions:input_type -> gateway.SubscriptionsRequest - 17, // 56: gateway.Gateway.DisconnectInboundPeer:input_type -> gateway.DisconnectInboundPeerRequest - 8, // 57: gateway.Gateway.NewTxs:input_type -> gateway.TxsRequest - 8, // 58: gateway.Gateway.PendingTxs:input_type -> gateway.TxsRequest - 12, // 59: gateway.Gateway.NewBlocks:input_type -> gateway.BlocksRequest - 12, // 60: gateway.Gateway.BdnBlocks:input_type -> gateway.BlocksRequest - 4, // 61: gateway.Gateway.EthOnBlock:input_type -> gateway.EthOnBlockRequest - 1, // 62: gateway.Gateway.TxReceipts:input_type -> gateway.TxReceiptsRequest - 60, // 63: gateway.Gateway.ShortIDs:input_type -> gateway.ShortIDsRequest - 58, // 64: gateway.Gateway.TxsFromShortIDs:input_type -> gateway.ShortIDListRequest - 6, // 65: gateway.Gateway.BlxrSubmitBundle:input_type -> gateway.BlxrSubmitBundleRequest - 68, // 66: gateway.Gateway.SubmitIntent:input_type -> gateway.SubmitIntentRequest - 70, // 67: gateway.Gateway.SubmitIntentSolution:input_type -> gateway.SubmitIntentSolutionRequest - 76, // 68: gateway.Gateway.Intents:input_type -> gateway.IntentsRequest - 78, // 69: gateway.Gateway.IntentSolutions:input_type -> gateway.IntentSolutionsRequest - 72, // 70: gateway.Gateway.SubmitQuote:input_type -> gateway.SubmitQuoteRequest - 74, // 71: gateway.Gateway.Quotes:input_type -> gateway.QuotesRequest - 42, // 72: gateway.Gateway.BlxrTx:output_type -> gateway.BlxrTxReply - 45, // 73: gateway.Gateway.BlxrBatchTX:output_type -> gateway.BlxrBatchTXReply - 29, // 74: gateway.Gateway.Peers:output_type -> gateway.PeersReply - 38, // 75: gateway.Gateway.TxStoreSummary:output_type -> gateway.TxStoreReply - 35, // 76: gateway.Gateway.GetTx:output_type -> gateway.GetBxTransactionResponse - 25, // 77: gateway.Gateway.Stop:output_type -> gateway.StopReply - 23, // 78: gateway.Gateway.Version:output_type -> gateway.VersionReply - 56, // 79: gateway.Gateway.Status:output_type -> gateway.StatusResponse - 21, // 80: gateway.Gateway.Subscriptions:output_type -> gateway.SubscriptionsReply - 18, // 81: gateway.Gateway.DisconnectInboundPeer:output_type -> gateway.DisconnectInboundPeerReply - 11, // 82: gateway.Gateway.NewTxs:output_type -> gateway.TxsReply - 11, // 83: gateway.Gateway.PendingTxs:output_type -> gateway.TxsReply - 16, // 84: gateway.Gateway.NewBlocks:output_type -> gateway.BlocksReply - 16, // 85: gateway.Gateway.BdnBlocks:output_type -> gateway.BlocksReply - 5, // 86: gateway.Gateway.EthOnBlock:output_type -> gateway.EthOnBlockReply - 2, // 87: gateway.Gateway.TxReceipts:output_type -> gateway.TxReceiptsReply - 61, // 88: gateway.Gateway.ShortIDs:output_type -> gateway.ShortIDsReply - 59, // 89: gateway.Gateway.TxsFromShortIDs:output_type -> gateway.TxListReply - 7, // 90: gateway.Gateway.BlxrSubmitBundle:output_type -> gateway.BlxrSubmitBundleReply - 69, // 91: gateway.Gateway.SubmitIntent:output_type -> gateway.SubmitIntentReply - 71, // 92: gateway.Gateway.SubmitIntentSolution:output_type -> gateway.SubmitIntentSolutionReply - 77, // 93: gateway.Gateway.Intents:output_type -> gateway.IntentsReply - 79, // 94: gateway.Gateway.IntentSolutions:output_type -> gateway.IntentSolutionsReply - 73, // 95: gateway.Gateway.SubmitQuote:output_type -> gateway.SubmitQuoteReply - 75, // 96: gateway.Gateway.Quotes:output_type -> gateway.QuotesReply - 72, // [72:97] is the sub-list for method output_type - 47, // [47:72] is the sub-list for method input_type - 47, // [47:47] is the sub-list for extension type_name - 47, // [47:47] is the sub-list for extension extendee - 0, // [0:47] is the sub-list for field type_name + 61, // 32: gateway.ProposedBlockRequest.payload:type_name -> gateway.CompressTx + 65, // 33: gateway.ProposedBlockStatsReply.records:type_name -> gateway.ProposedBlockStatsRecord + 72, // 34: gateway.ProposedBlockStatsRecord.sending_duration:type_name -> google.protobuf.Duration + 71, // 35: gateway.ProposedBlockStatsRecord.received_time:type_name -> google.protobuf.Timestamp + 71, // 36: gateway.ProposedBlockStatsRecord.sent_time:type_name -> google.protobuf.Timestamp + 50, // 37: gateway.StatusResponse.NodesEntry.value:type_name -> gateway.NodeConnStatus + 51, // 38: gateway.StatusResponse.RelaysEntry.value:type_name -> gateway.BDNConnStatus + 41, // 39: gateway.Gateway.BlxrTx:input_type -> gateway.BlxrTxRequest + 40, // 40: gateway.Gateway.BlxrBatchTX:input_type -> gateway.BlxrBatchTXRequest + 26, // 41: gateway.Gateway.Peers:input_type -> gateway.PeersRequest + 36, // 42: gateway.Gateway.TxStoreSummary:input_type -> gateway.TxStoreRequest + 34, // 43: gateway.Gateway.GetTx:input_type -> gateway.GetBxTransactionRequest + 24, // 44: gateway.Gateway.Stop:input_type -> gateway.StopRequest + 22, // 45: gateway.Gateway.Version:input_type -> gateway.VersionRequest + 46, // 46: gateway.Gateway.Status:input_type -> gateway.StatusRequest + 19, // 47: gateway.Gateway.Subscriptions:input_type -> gateway.SubscriptionsRequest + 17, // 48: gateway.Gateway.DisconnectInboundPeer:input_type -> gateway.DisconnectInboundPeerRequest + 8, // 49: gateway.Gateway.NewTxs:input_type -> gateway.TxsRequest + 8, // 50: gateway.Gateway.PendingTxs:input_type -> gateway.TxsRequest + 12, // 51: gateway.Gateway.NewBlocks:input_type -> gateway.BlocksRequest + 12, // 52: gateway.Gateway.BdnBlocks:input_type -> gateway.BlocksRequest + 4, // 53: gateway.Gateway.EthOnBlock:input_type -> gateway.EthOnBlockRequest + 1, // 54: gateway.Gateway.TxReceipts:input_type -> gateway.TxReceiptsRequest + 58, // 55: gateway.Gateway.ShortIDs:input_type -> gateway.ShortIDsRequest + 56, // 56: gateway.Gateway.TxsFromShortIDs:input_type -> gateway.ShortIDListRequest + 6, // 57: gateway.Gateway.BlxrSubmitBundle:input_type -> gateway.BlxrSubmitBundleRequest + 42, // 58: gateway.Gateway.BlxrTx:output_type -> gateway.BlxrTxReply + 45, // 59: gateway.Gateway.BlxrBatchTX:output_type -> gateway.BlxrBatchTXReply + 29, // 60: gateway.Gateway.Peers:output_type -> gateway.PeersReply + 38, // 61: gateway.Gateway.TxStoreSummary:output_type -> gateway.TxStoreReply + 35, // 62: gateway.Gateway.GetTx:output_type -> gateway.GetBxTransactionResponse + 25, // 63: gateway.Gateway.Stop:output_type -> gateway.StopReply + 23, // 64: gateway.Gateway.Version:output_type -> gateway.VersionReply + 54, // 65: gateway.Gateway.Status:output_type -> gateway.StatusResponse + 21, // 66: gateway.Gateway.Subscriptions:output_type -> gateway.SubscriptionsReply + 18, // 67: gateway.Gateway.DisconnectInboundPeer:output_type -> gateway.DisconnectInboundPeerReply + 11, // 68: gateway.Gateway.NewTxs:output_type -> gateway.TxsReply + 11, // 69: gateway.Gateway.PendingTxs:output_type -> gateway.TxsReply + 16, // 70: gateway.Gateway.NewBlocks:output_type -> gateway.BlocksReply + 16, // 71: gateway.Gateway.BdnBlocks:output_type -> gateway.BlocksReply + 5, // 72: gateway.Gateway.EthOnBlock:output_type -> gateway.EthOnBlockReply + 2, // 73: gateway.Gateway.TxReceipts:output_type -> gateway.TxReceiptsReply + 59, // 74: gateway.Gateway.ShortIDs:output_type -> gateway.ShortIDsReply + 57, // 75: gateway.Gateway.TxsFromShortIDs:output_type -> gateway.TxListReply + 7, // 76: gateway.Gateway.BlxrSubmitBundle:output_type -> gateway.BlxrSubmitBundleReply + 58, // [58:77] is the sub-list for method output_type + 39, // [39:58] is the sub-list for method input_type + 39, // [39:39] is the sub-list for extension type_name + 39, // [39:39] is the sub-list for extension extendee + 0, // [0:39] is the sub-list for field type_name } func init() { file_gateway_proto_init() } @@ -7528,30 +6395,6 @@ func file_gateway_proto_init() { } } file_gateway_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueuesStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IntentStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodePerformance); i { case 0: return &v.state @@ -7563,7 +6406,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WsConnStatus); i { case 0: return &v.state @@ -7575,7 +6418,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeConnStatus); i { case 0: return &v.state @@ -7587,7 +6430,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BDNConnStatus); i { case 0: return &v.state @@ -7599,7 +6442,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ConnectionLatency); i { case 0: return &v.state @@ -7611,7 +6454,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GatewayInfo); i { case 0: return &v.state @@ -7623,7 +6466,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusResponse); i { case 0: return &v.state @@ -7635,7 +6478,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TxResult); i { case 0: return &v.state @@ -7647,7 +6490,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShortIDListRequest); i { case 0: return &v.state @@ -7659,7 +6502,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TxListReply); i { case 0: return &v.state @@ -7671,7 +6514,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShortIDsRequest); i { case 0: return &v.state @@ -7683,7 +6526,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShortIDsReply); i { case 0: return &v.state @@ -7695,7 +6538,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProposedBlockRequest); i { case 0: return &v.state @@ -7707,7 +6550,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompressTx); i { case 0: return &v.state @@ -7719,7 +6562,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProposedBlockReply); i { case 0: return &v.state @@ -7731,7 +6574,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProposedBlockStatsRequest); i { case 0: return &v.state @@ -7743,7 +6586,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProposedBlockStatsReply); i { case 0: return &v.state @@ -7755,7 +6598,7 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_gateway_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProposedBlockStatsRecord); i { case 0: return &v.state @@ -7767,150 +6610,6 @@ func file_gateway_proto_init() { return nil } } - file_gateway_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitIntentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitIntentReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitIntentSolutionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitIntentSolutionReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitQuoteRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitQuoteReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QuotesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QuotesReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IntentsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IntentsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IntentSolutionsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_gateway_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IntentSolutionsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } } type x struct{} out := protoimpl.TypeBuilder{ @@ -7918,7 +6617,7 @@ func file_gateway_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_gateway_proto_rawDesc, NumEnums: 0, - NumMessages: 84, + NumMessages: 70, NumExtensions: 0, NumServices: 1, }, diff --git a/protobuf/gateway.proto b/protobuf/gateway.proto index 3e95c49..d49aa09 100644 --- a/protobuf/gateway.proto +++ b/protobuf/gateway.proto @@ -28,14 +28,6 @@ service Gateway { rpc ShortIDs (ShortIDsRequest) returns (ShortIDsReply); rpc TxsFromShortIDs (ShortIDListRequest) returns (TxListReply) {} rpc BlxrSubmitBundle (BlxrSubmitBundleRequest) returns (BlxrSubmitBundleReply) {} - - //Intent Gateway functions - rpc SubmitIntent(SubmitIntentRequest) returns (SubmitIntentReply){} - rpc SubmitIntentSolution(SubmitIntentSolutionRequest) returns (SubmitIntentSolutionReply){} - rpc Intents(IntentsRequest) returns (stream IntentsReply){} - rpc IntentSolutions(IntentSolutionsRequest) returns (stream IntentSolutionsReply){} - rpc SubmitQuote(SubmitQuoteRequest) returns (SubmitQuoteReply){} - rpc Quotes(QuotesRequest) returns (stream QuotesReply){} } message TxLogs { @@ -107,6 +99,7 @@ message BlxrSubmitBundleRequest { string refund_recipient = 12; int64 blocks_count = 13; repeated string dropping_hashes = 14; + bool end_of_block = 15; } message BlxrSubmitBundleReply { @@ -378,17 +371,6 @@ message AccountInfo { string expire_date = 2; } -message QueuesStats { - uint64 txs_queue_count = 1; - uint64 txs_order_queue_count = 2; -} - -message IntentStats { - uint64 submitted_intents_count = 1; - uint64 submitted_solutions_count = 2; - uint64 submitted_quotes_count = 3; -} - message NodePerformance { string since = 1; uint32 new_blocks_received_from_blockchain_node = 2; @@ -451,8 +433,6 @@ message StatusResponse { map nodes = 3; map relays = 4; AccountInfo account_info = 1; - QueuesStats queue_stats = 5; - IntentStats intent_stats = 6; } message TxResult { @@ -525,83 +505,3 @@ message ProposedBlockStatsRecord { int64 validator_reply_time = 6; } - -// Intent Gateway Messages -message SubmitIntentRequest { - string dappAddress = 1; // ETH address - string senderAddress = 2; // ETH address - bytes intent = 3; // The intent payload - bytes hash = 4; // Keccak256Hash of the Intent bytes - bytes signature = 5; // ECDSA signature of hash -} - -message SubmitIntentReply { - string intentId = 1; - google.protobuf.Timestamp first_seen = 2; -} - -message SubmitIntentSolutionRequest { - string solverAddress = 1; - string intentId = 2; - bytes intentSolution = 3; //The solution payload - bytes hash = 4; //Keccak256Hash of the IntentSolution bytes - bytes signature = 5; //ECDSA signature of the hash -} - -message SubmitIntentSolutionReply { - string solutionId = 1; - google.protobuf.Timestamp first_seen = 2; -} - -message SubmitQuoteRequest { - string dappAddress = 1; // ETH address - string solverAddress = 2; // ETH address - bytes quote = 3; // The quote payload - bytes hash = 4; // Keccak256Hash of the quote bytes - bytes signature = 5; // ECDSA signature of hash -} - -message SubmitQuoteReply { - string quoteId = 1; - google.protobuf.Timestamp first_seen = 2; -} - -message QuotesRequest { - string dappAddress = 1; // dApp address -} - -message QuotesReply { - string dappAddress = 1; // GUID expected - string solverAddress = 2; // GUID expected - string quoteId = 3; - bytes quote = 4; //The intent payload - google.protobuf.Timestamp timestamp = 5; -} - -message IntentsRequest { - string solverAddress = 1; - bytes hash = 3; //Keccak256Hash of the solverAddress bytes - bytes signature = 4; //ECDSA signature - google.protobuf.Timestamp fromTimestamp = 5; - string filters = 6; -} - -message IntentsReply { - string dappAddress = 1; // GUID expected - string senderAddress = 2; - string intentId = 3; - bytes intent = 4; //The intent payload - google.protobuf.Timestamp timestamp = 5; -} - -message IntentSolutionsRequest { - string dappAddress = 1; // dApp or sender address - bytes hash = 2; // Keccak256Hash of the dappAddress bytes - bytes signature = 3; // ECDSA signature of the hash -} - -message IntentSolutionsReply { - string intentId = 1; - bytes intentSolution = 2; //The solution payload - string solutionId = 3; -} diff --git a/protobuf/gateway_grpc.pb.go b/protobuf/gateway_grpc.pb.go index 8ea3dd2..060960c 100644 --- a/protobuf/gateway_grpc.pb.go +++ b/protobuf/gateway_grpc.pb.go @@ -37,13 +37,6 @@ type GatewayClient interface { ShortIDs(ctx context.Context, in *ShortIDsRequest, opts ...grpc.CallOption) (*ShortIDsReply, error) TxsFromShortIDs(ctx context.Context, in *ShortIDListRequest, opts ...grpc.CallOption) (*TxListReply, error) BlxrSubmitBundle(ctx context.Context, in *BlxrSubmitBundleRequest, opts ...grpc.CallOption) (*BlxrSubmitBundleReply, error) - //Intent Gateway functions - SubmitIntent(ctx context.Context, in *SubmitIntentRequest, opts ...grpc.CallOption) (*SubmitIntentReply, error) - SubmitIntentSolution(ctx context.Context, in *SubmitIntentSolutionRequest, opts ...grpc.CallOption) (*SubmitIntentSolutionReply, error) - Intents(ctx context.Context, in *IntentsRequest, opts ...grpc.CallOption) (Gateway_IntentsClient, error) - IntentSolutions(ctx context.Context, in *IntentSolutionsRequest, opts ...grpc.CallOption) (Gateway_IntentSolutionsClient, error) - SubmitQuote(ctx context.Context, in *SubmitQuoteRequest, opts ...grpc.CallOption) (*SubmitQuoteReply, error) - Quotes(ctx context.Context, in *QuotesRequest, opts ...grpc.CallOption) (Gateway_QuotesClient, error) } type gatewayClient struct { @@ -363,129 +356,6 @@ func (c *gatewayClient) BlxrSubmitBundle(ctx context.Context, in *BlxrSubmitBund return out, nil } -func (c *gatewayClient) SubmitIntent(ctx context.Context, in *SubmitIntentRequest, opts ...grpc.CallOption) (*SubmitIntentReply, error) { - out := new(SubmitIntentReply) - err := c.cc.Invoke(ctx, "/gateway.Gateway/SubmitIntent", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *gatewayClient) SubmitIntentSolution(ctx context.Context, in *SubmitIntentSolutionRequest, opts ...grpc.CallOption) (*SubmitIntentSolutionReply, error) { - out := new(SubmitIntentSolutionReply) - err := c.cc.Invoke(ctx, "/gateway.Gateway/SubmitIntentSolution", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *gatewayClient) Intents(ctx context.Context, in *IntentsRequest, opts ...grpc.CallOption) (Gateway_IntentsClient, error) { - stream, err := c.cc.NewStream(ctx, &Gateway_ServiceDesc.Streams[6], "/gateway.Gateway/Intents", opts...) - if err != nil { - return nil, err - } - x := &gatewayIntentsClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Gateway_IntentsClient interface { - Recv() (*IntentsReply, error) - grpc.ClientStream -} - -type gatewayIntentsClient struct { - grpc.ClientStream -} - -func (x *gatewayIntentsClient) Recv() (*IntentsReply, error) { - m := new(IntentsReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *gatewayClient) IntentSolutions(ctx context.Context, in *IntentSolutionsRequest, opts ...grpc.CallOption) (Gateway_IntentSolutionsClient, error) { - stream, err := c.cc.NewStream(ctx, &Gateway_ServiceDesc.Streams[7], "/gateway.Gateway/IntentSolutions", opts...) - if err != nil { - return nil, err - } - x := &gatewayIntentSolutionsClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Gateway_IntentSolutionsClient interface { - Recv() (*IntentSolutionsReply, error) - grpc.ClientStream -} - -type gatewayIntentSolutionsClient struct { - grpc.ClientStream -} - -func (x *gatewayIntentSolutionsClient) Recv() (*IntentSolutionsReply, error) { - m := new(IntentSolutionsReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *gatewayClient) SubmitQuote(ctx context.Context, in *SubmitQuoteRequest, opts ...grpc.CallOption) (*SubmitQuoteReply, error) { - out := new(SubmitQuoteReply) - err := c.cc.Invoke(ctx, "/gateway.Gateway/SubmitQuote", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *gatewayClient) Quotes(ctx context.Context, in *QuotesRequest, opts ...grpc.CallOption) (Gateway_QuotesClient, error) { - stream, err := c.cc.NewStream(ctx, &Gateway_ServiceDesc.Streams[8], "/gateway.Gateway/Quotes", opts...) - if err != nil { - return nil, err - } - x := &gatewayQuotesClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Gateway_QuotesClient interface { - Recv() (*QuotesReply, error) - grpc.ClientStream -} - -type gatewayQuotesClient struct { - grpc.ClientStream -} - -func (x *gatewayQuotesClient) Recv() (*QuotesReply, error) { - m := new(QuotesReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - // GatewayServer is the server API for Gateway service. // All implementations must embed UnimplementedGatewayServer // for forward compatibility @@ -509,13 +379,6 @@ type GatewayServer interface { ShortIDs(context.Context, *ShortIDsRequest) (*ShortIDsReply, error) TxsFromShortIDs(context.Context, *ShortIDListRequest) (*TxListReply, error) BlxrSubmitBundle(context.Context, *BlxrSubmitBundleRequest) (*BlxrSubmitBundleReply, error) - //Intent Gateway functions - SubmitIntent(context.Context, *SubmitIntentRequest) (*SubmitIntentReply, error) - SubmitIntentSolution(context.Context, *SubmitIntentSolutionRequest) (*SubmitIntentSolutionReply, error) - Intents(*IntentsRequest, Gateway_IntentsServer) error - IntentSolutions(*IntentSolutionsRequest, Gateway_IntentSolutionsServer) error - SubmitQuote(context.Context, *SubmitQuoteRequest) (*SubmitQuoteReply, error) - Quotes(*QuotesRequest, Gateway_QuotesServer) error mustEmbedUnimplementedGatewayServer() } @@ -580,24 +443,6 @@ func (UnimplementedGatewayServer) TxsFromShortIDs(context.Context, *ShortIDListR func (UnimplementedGatewayServer) BlxrSubmitBundle(context.Context, *BlxrSubmitBundleRequest) (*BlxrSubmitBundleReply, error) { return nil, status.Errorf(codes.Unimplemented, "method BlxrSubmitBundle not implemented") } -func (UnimplementedGatewayServer) SubmitIntent(context.Context, *SubmitIntentRequest) (*SubmitIntentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SubmitIntent not implemented") -} -func (UnimplementedGatewayServer) SubmitIntentSolution(context.Context, *SubmitIntentSolutionRequest) (*SubmitIntentSolutionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SubmitIntentSolution not implemented") -} -func (UnimplementedGatewayServer) Intents(*IntentsRequest, Gateway_IntentsServer) error { - return status.Errorf(codes.Unimplemented, "method Intents not implemented") -} -func (UnimplementedGatewayServer) IntentSolutions(*IntentSolutionsRequest, Gateway_IntentSolutionsServer) error { - return status.Errorf(codes.Unimplemented, "method IntentSolutions not implemented") -} -func (UnimplementedGatewayServer) SubmitQuote(context.Context, *SubmitQuoteRequest) (*SubmitQuoteReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SubmitQuote not implemented") -} -func (UnimplementedGatewayServer) Quotes(*QuotesRequest, Gateway_QuotesServer) error { - return status.Errorf(codes.Unimplemented, "method Quotes not implemented") -} func (UnimplementedGatewayServer) mustEmbedUnimplementedGatewayServer() {} // UnsafeGatewayServer may be embedded to opt out of forward compatibility for this service. @@ -971,123 +816,6 @@ func _Gateway_BlxrSubmitBundle_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Gateway_SubmitIntent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SubmitIntentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GatewayServer).SubmitIntent(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/gateway.Gateway/SubmitIntent", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GatewayServer).SubmitIntent(ctx, req.(*SubmitIntentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Gateway_SubmitIntentSolution_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SubmitIntentSolutionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GatewayServer).SubmitIntentSolution(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/gateway.Gateway/SubmitIntentSolution", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GatewayServer).SubmitIntentSolution(ctx, req.(*SubmitIntentSolutionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Gateway_Intents_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(IntentsRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(GatewayServer).Intents(m, &gatewayIntentsServer{stream}) -} - -type Gateway_IntentsServer interface { - Send(*IntentsReply) error - grpc.ServerStream -} - -type gatewayIntentsServer struct { - grpc.ServerStream -} - -func (x *gatewayIntentsServer) Send(m *IntentsReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Gateway_IntentSolutions_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(IntentSolutionsRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(GatewayServer).IntentSolutions(m, &gatewayIntentSolutionsServer{stream}) -} - -type Gateway_IntentSolutionsServer interface { - Send(*IntentSolutionsReply) error - grpc.ServerStream -} - -type gatewayIntentSolutionsServer struct { - grpc.ServerStream -} - -func (x *gatewayIntentSolutionsServer) Send(m *IntentSolutionsReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Gateway_SubmitQuote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SubmitQuoteRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(GatewayServer).SubmitQuote(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/gateway.Gateway/SubmitQuote", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(GatewayServer).SubmitQuote(ctx, req.(*SubmitQuoteRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Gateway_Quotes_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(QuotesRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(GatewayServer).Quotes(m, &gatewayQuotesServer{stream}) -} - -type Gateway_QuotesServer interface { - Send(*QuotesReply) error - grpc.ServerStream -} - -type gatewayQuotesServer struct { - grpc.ServerStream -} - -func (x *gatewayQuotesServer) Send(m *QuotesReply) error { - return x.ServerStream.SendMsg(m) -} - // Gateway_ServiceDesc is the grpc.ServiceDesc for Gateway service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1147,18 +875,6 @@ var Gateway_ServiceDesc = grpc.ServiceDesc{ MethodName: "BlxrSubmitBundle", Handler: _Gateway_BlxrSubmitBundle_Handler, }, - { - MethodName: "SubmitIntent", - Handler: _Gateway_SubmitIntent_Handler, - }, - { - MethodName: "SubmitIntentSolution", - Handler: _Gateway_SubmitIntentSolution_Handler, - }, - { - MethodName: "SubmitQuote", - Handler: _Gateway_SubmitQuote_Handler, - }, }, Streams: []grpc.StreamDesc{ { @@ -1191,21 +907,6 @@ var Gateway_ServiceDesc = grpc.ServiceDesc{ Handler: _Gateway_TxReceipts_Handler, ServerStreams: true, }, - { - StreamName: "Intents", - Handler: _Gateway_Intents_Handler, - ServerStreams: true, - }, - { - StreamName: "IntentSolutions", - Handler: _Gateway_IntentSolutions_Handler, - ServerStreams: true, - }, - { - StreamName: "Quotes", - Handler: _Gateway_Quotes_Handler, - ServerStreams: true, - }, }, Metadata: "gateway.proto", } diff --git a/run_gateway.sh b/run_gateway.sh index 8c27ef4..2dee40d 100755 --- a/run_gateway.sh +++ b/run_gateway.sh @@ -7,7 +7,7 @@ # The external_gateway folder should contain a registration_only folder with certs inside # LOGS_PATH: Where you want a logs folder to be created with a gateway.log file inside # DATADIR_PATH: The directory for storing various persistent files such as gateway private key file -# BLOCKCHAIN_NETWORK: available options are Mainnet (for Ethereum), BSC-Mainnet, Polygon-Mainnet +# BLOCKCHAIN_NETWORK: available options are Mainnet (for Ethereum), BSC-Mainnet # ENODES: Local blockchain node, Enterprise clients must start the gateway with local node connection diff --git a/servers/client_handler.go b/servers/client_handler.go index 3c65b7e..0713574 100644 --- a/servers/client_handler.go +++ b/servers/client_handler.go @@ -55,7 +55,6 @@ func NewClientHandler( gatewayPublicKey string, feedManager *feed.Manager, validatorsManager *validator.Manager, - intentsManager services.IntentsManager, stats statistics.Stats, txStore services.TxStore, txFromFieldIncludable bool, @@ -69,13 +68,13 @@ func NewClientHandler( if config.WebsocketEnabled || config.WebsocketTLSEnabled { websocketServer = ws.NewWSServer(config, certFile, keyFile, sdn, node, accService, feedManager, nodeWSManager, validatorsManager, - intentsManager, stats, txFromFieldIncludable) + stats, txFromFieldIncludable) } if config.GRPC.Enabled { gRPCServer = grpc.NewGRPCServer(config, stats, node, sdn, accService, bridge, blockchainPeers, nodeWSManager, bdnStats, timeStarted, - txsQueue, txsOrderQueue, gatewayPublicKey, bx, validatorsManager, intentsManager, feedManager, txStore, + txsQueue, txsOrderQueue, gatewayPublicKey, bx, validatorsManager, feedManager, txStore, ) } diff --git a/servers/client_handler_test.go b/servers/client_handler_test.go index 96935a2..73be1b7 100644 --- a/servers/client_handler_test.go +++ b/servers/client_handler_test.go @@ -49,7 +49,7 @@ func TestManageServers(t *testing.T) { clientHandler := NewClientHandler(nil, bxConfig, nil, sdn, nil, nil, nil, services.NewNoOpSubscriptionServices(), wsManager, nil, time.Now(), &services.MessageQueue{}, &services.MessageQueue{}, "", fm, nil, - nil, statistics.NoStats{}, nil, + statistics.NoStats{}, nil, false, "", "", ) diff --git a/servers/grpc/bundle.go b/servers/grpc/bundle.go index 8d13fb7..e99e444 100644 --- a/servers/grpc/bundle.go +++ b/servers/grpc/bundle.go @@ -40,6 +40,7 @@ func (g *server) BlxrSubmitBundle(ctx context.Context, req *pb.BlxrSubmitBundleR IncomingRefundRecipient: req.RefundRecipient, BlocksCount: int(req.BlocksCount), DroppingHashes: req.DroppingHashes, + EndOfBlock: req.EndOfBlock, } grpc := connections.NewRPCConn(*accountID, getPeerAddr(ctx), g.params.sdn.NetworkNum(), utils.GRPC) diff --git a/servers/grpc/grpc.go b/servers/grpc/grpc.go index 53d99fc..454e239 100644 --- a/servers/grpc/grpc.go +++ b/servers/grpc/grpc.go @@ -57,8 +57,6 @@ type grpcParams struct { connector Connector validatorsManager *validator.Manager txFromFieldIncludable bool - allowIntroductoryTierAccess bool - intentsManager services.IntentsManager feedManager feedManager txStore services.TxStore chainID types.NetworkID @@ -245,15 +243,6 @@ func (g *server) Status(ctx context.Context, req *pb.StatusRequest) (*pb.StatusR AccountId: string(accountModel.AccountID), ExpireDate: accountModel.ExpireDate, }, - QueueStats: &pb.QueuesStats{ - TxsQueueCount: g.params.txsQueue.TxsCount(), - TxsOrderQueueCount: g.params.txsOrderQueue.TxsCount(), - }, - IntentStats: &pb.IntentStats{ - SubmittedIntentsCount: g.params.intentsManager.TotalIntentSubmissions(), - SubmittedSolutionsCount: g.params.intentsManager.TotalSolutionSubmissions(), - SubmittedQuotesCount: g.params.intentsManager.TotalQuoteSubmissions(), - }, } return rsp, nil @@ -309,7 +298,7 @@ func (g *server) validateAuthHeader(authHeader string, isRequiredForExternalGate return nil, err } - accountModel, err := g.params.accService.Authorize(accountID, secretHash, allowAccessByOtherAccounts, false, ip) + accountModel, err := g.params.accService.Authorize(accountID, secretHash, allowAccessByOtherAccounts, ip) if err != nil { return nil, err } diff --git a/servers/grpc/grpc_test.go b/servers/grpc/grpc_test.go index 8632e91..fe93829 100644 --- a/servers/grpc/grpc_test.go +++ b/servers/grpc/grpc_test.go @@ -63,7 +63,7 @@ var ( type mockAccountService struct{} -func (s *mockAccountService) Authorize(accountID types.AccountID, hash string, _ bool, _ bool, _ string) (sdnmessage.Account, error) { +func (s *mockAccountService) Authorize(accountID types.AccountID, hash string, _ bool, _ string) (sdnmessage.Account, error) { acc, ok := accountIDToAccountModel[accountID] if !ok { return sdnmessage.Account{}, errTestAuth @@ -145,7 +145,6 @@ func testGRPCServer(t *testing.T, port int, user string, password string) (*Serv "", bx, nil, - services.NewIntentsManager(), feedMngr, nil, ) diff --git a/servers/grpc/intents.go b/servers/grpc/intents.go deleted file mode 100644 index 6764d36..0000000 --- a/servers/grpc/intents.go +++ /dev/null @@ -1,445 +0,0 @@ -package grpc - -import ( - "context" - "strings" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/zhouzhuojie/conditions" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/bloXroute-Labs/gateway/v2/servers/handler/filter" - - "github.com/bloXroute-Labs/gateway/v2/bxmessage" - log "github.com/bloXroute-Labs/gateway/v2/logger" - pb "github.com/bloXroute-Labs/gateway/v2/protobuf" - "github.com/bloXroute-Labs/gateway/v2/sdnmessage" - "github.com/bloXroute-Labs/gateway/v2/types" - "github.com/bloXroute-Labs/gateway/v2/utils" - "github.com/bloXroute-Labs/gateway/v2/utils/intent" -) - -//go:generate mockgen -destination ../test/mock/gw_intents_manager_mock.go -package mock . IntentsManager -//go:generate mockgen -destination ../test/mock/mock_grpc_feed_manager.go -package mock . GRPCFeedManager - -func (g *server) SubmitQuote(ctx context.Context, req *pb.SubmitQuoteRequest) (*pb.SubmitQuoteReply, error) { - authHeader := retrieveAuthHeader(ctx, "") - _, err := g.validateIntentAuthHeader(authHeader, true, true, getPeerAddr(ctx)) - if err != nil { - return nil, status.Error(codes.PermissionDenied, err.Error()) - } - - g.log.Infof("received SubmitQuote request, dAppAddress: %s, solverAddress: %s", req.DappAddress, req.SolverAddress) - - if !common.IsHexAddress(req.DappAddress) { - return nil, status.Errorf(codes.InvalidArgument, "DappAddress is invalid") - } - - if len(req.Quote) == 0 { - return nil, status.Errorf(codes.InvalidArgument, "Quote is required") - } - - err = intent.ValidateHashAndSignature(req.SolverAddress, req.Hash, req.Signature, req.Quote) - if err != nil { - return nil, status.Errorf(codes.InvalidArgument, err.Error()) - } - - quoteNotification, err := g.convertQuoteRequest(req) - if err != nil { - return nil, status.Errorf(codes.Internal, err.Error()) - } - - quoteMsg := bxmessage.NewQuote(quoteNotification.ID, quoteNotification.DappAddress, quoteNotification.SolverAddress, quoteNotification.Hash, quoteNotification.Signature, quoteNotification.Quote, quoteNotification.Timestamp) - g.params.connector.Broadcast(quoteMsg, nil, utils.RelayProxy) - g.notify(quoteNotification) - - g.params.intentsManager.IncQuoteSubmissions() - - return &pb.SubmitQuoteReply{QuoteId: quoteNotification.ID}, nil -} - -// SubmitIntent submit intent -func (g *server) SubmitIntent(ctx context.Context, req *pb.SubmitIntentRequest) (*pb.SubmitIntentReply, error) { - authHeader := retrieveAuthHeader(ctx, "") - _, err := g.validateIntentAuthHeader(authHeader, true, true, getPeerAddr(ctx)) - if err != nil { - return nil, status.Error(codes.PermissionDenied, err.Error()) - } - - g.log.Infof("received SubmitIntent request, dAppAddress: %s, senderAddress: %s", req.DappAddress, req.SenderAddress) - - if !common.IsHexAddress(req.DappAddress) { - return nil, status.Errorf(codes.InvalidArgument, "DAppAddress is invalid") - } - - if (req.DappAddress != req.SenderAddress) && !common.IsHexAddress(req.SenderAddress) { - return nil, status.Errorf(codes.InvalidArgument, "SenderAddress is invalid") - } - - if len(req.Intent) == 0 { - return nil, status.Errorf(codes.InvalidArgument, "Intent is required") - } - - err = intent.ValidateHashAndSignature(req.SenderAddress, req.Hash, req.Signature, req.Intent) - if err != nil { - return nil, status.Errorf(codes.InvalidArgument, err.Error()) - } - - intentNotification, err := g.convertIntentRequest(req) - if err != nil { - return nil, err - } - - // send intent to connected Relays - intentMsg := bxmessage.NewIntent(intentNotification.ID, intentNotification.DappAddress, intentNotification.SenderAddress, intentNotification.Hash, intentNotification.Signature, intentNotification.Timestamp, intentNotification.Intent) - g.params.connector.Broadcast(intentMsg, nil, utils.RelayProxy) - - // send intent notification into feedManager for propagation to subscribers if any - g.sendIntentNotification(intentNotification) - - g.params.intentsManager.IncIntentSubmissions() - - return &pb.SubmitIntentReply{IntentId: intentNotification.ID}, nil -} - -// SubmitIntentSolution submit intent solution -func (g *server) SubmitIntentSolution(ctx context.Context, req *pb.SubmitIntentSolutionRequest) (*pb.SubmitIntentSolutionReply, error) { - authHeader := retrieveAuthHeader(ctx, "") - _, err := g.validateIntentAuthHeader(authHeader, true, true, getPeerAddr(ctx)) - if err != nil { - return nil, status.Error(codes.PermissionDenied, err.Error()) - } - - g.log.Infof("received SubmitIntentSolution request, solverAddress: %s", req.SolverAddress) - - if len(req.IntentSolution) == 0 { - return nil, status.Errorf(codes.InvalidArgument, "IntentSolution is required") - } - - if len(req.IntentId) == 0 { - return nil, status.Errorf(codes.InvalidArgument, "IntentId is required") - } - - err = intent.ValidateHashAndSignature(req.SolverAddress, req.Hash, req.Signature, req.IntentSolution) - if err != nil { - return nil, status.Errorf(codes.InvalidArgument, err.Error()) - } - - id, err := intent.GenerateSolutionID(req.IntentId, req.IntentSolution) - if err != nil { - return nil, status.Errorf(codes.Internal, err.Error()) - } - firstSeen := time.Now() - - // send solution to BDN - intentMsg := bxmessage.NewIntentSolution(id, req.SolverAddress, req.IntentId, req.Hash, req.Signature, firstSeen, req.IntentSolution) - g.params.connector.Broadcast(intentMsg, nil, utils.RelayProxy) - - g.params.intentsManager.IncSolutionSubmissions() - - return &pb.SubmitIntentSolutionReply{SolutionId: id, FirstSeen: timestamppb.New(firstSeen)}, nil -} - -func (g *server) Quotes(req *pb.QuotesRequest, stream pb.Gateway_QuotesServer) error { - authHeader := retrieveAuthHeader(stream.Context(), "") - accountModel, err := g.validateIntentAuthHeader(authHeader, true, true, getPeerAddr(stream.Context())) - if err != nil { - return status.Error(codes.PermissionDenied, err.Error()) - } - - if !common.IsHexAddress(req.DappAddress) { - return intent.ErrInvalidAddress - } - - subscriptions := g.params.intentsManager.AddQuotesSubscription(req.DappAddress) - // send quoteSubscription to Relay for the first subscription - if subscriptions == 1 { - sub := bxmessage.NewQuotesSubscription(req.DappAddress) - g.params.connector.Broadcast(sub, nil, utils.RelayProxy) - } - - defer func() { - subscriptions, err = g.params.intentsManager.RmQuotesSubscription(req.DappAddress) - // send quotesUnsubscription to Relay if there are no more subscriptions to a specific address - if err == nil && subscriptions == 0 { - unsub := bxmessage.NewQuotesUnsubscription(req.DappAddress) - g.params.connector.Broadcast(unsub, nil, utils.RelayProxy) - g.log.Debugf("unsubscribed from quote feed for dappAddress: %s, sent IntentsUnsubscribe msg", req.DappAddress) - } - }() - return g.handleQuotes(req, stream, *accountModel) -} - -// Intents intents -func (g *server) Intents(req *pb.IntentsRequest, stream pb.Gateway_IntentsServer) error { - authHeader := retrieveAuthHeader(stream.Context(), "") - accountModel, err := g.validateIntentAuthHeader(authHeader, true, true, getPeerAddr(stream.Context())) - if err != nil { - return status.Error(codes.PermissionDenied, err.Error()) - } - - err = intent.ValidateHashAndSignature(req.SolverAddress, req.Hash, req.Signature, []byte(req.SolverAddress)) - if err != nil { - return status.Errorf(codes.InvalidArgument, err.Error()) - } - - if g.params.intentsManager.IntentsSubscriptionExists(req.SolverAddress) { - return status.Errorf(codes.AlreadyExists, "intents subscription for solver address %s already exists", req.SolverAddress) - } - - var expr conditions.Expr - if req.GetFilters() != "" { - expr, err = filter.ValidateIntentsFilters(req.GetFilters()) - if err != nil { - return status.Error(codes.InvalidArgument, err.Error()) - } - } - - g.params.intentsManager.AddIntentsSubscription(req.SolverAddress, req.Hash, req.Signature) - // send intentsSubscription to Relay - sub := bxmessage.NewIntentsSubscription(req.SolverAddress, req.Hash, req.Signature) - g.params.connector.Broadcast(sub, nil, utils.RelayProxy) - - defer func() { - g.params.intentsManager.RmIntentsSubscription(req.SolverAddress) - // send intentsUnsubscription to Relay - unsub := bxmessage.NewIntentsUnsubscription(req.SolverAddress) - g.params.connector.Broadcast(unsub, nil, utils.RelayProxy) - g.log.Debugf("unsubscribed from intents feed for solverAddress: %s, sent IntentsUnsubscribe msg", req.SolverAddress) - }() - - return g.handleIntents(expr, stream, types.UserIntentsFeed, *accountModel) -} - -// IntentSolutions intent solutions -func (g *server) IntentSolutions(req *pb.IntentSolutionsRequest, stream pb.Gateway_IntentSolutionsServer) error { - authHeader := retrieveAuthHeader(stream.Context(), "") - accountModel, err := g.validateIntentAuthHeader(authHeader, true, true, getPeerAddr(stream.Context())) - if err != nil { - return status.Error(codes.PermissionDenied, err.Error()) - } - - err = intent.ValidateHashAndSignature(req.DappAddress, req.Hash, req.Signature, []byte(req.DappAddress)) - if err != nil { - return status.Errorf(codes.InvalidArgument, err.Error()) - } - - if g.params.intentsManager.SolutionsSubscriptionExists(req.DappAddress) { - return status.Errorf(codes.AlreadyExists, "solutions subscription for dApp address %s already exists", req.DappAddress) - } - - g.params.intentsManager.AddSolutionsSubscription(req.DappAddress, req.Hash, req.Signature) - // send solutionsSubscription to Relay - sub := bxmessage.NewSolutionsSubscription(req.DappAddress, req.Hash, req.Signature) - g.params.connector.Broadcast(sub, nil, utils.RelayProxy) - - defer func() { - g.params.intentsManager.RmSolutionsSubscription(req.DappAddress) - // send solutionsUnsubscription to Relay - unsub := bxmessage.NewSolutionsUnsubscription(req.DappAddress) - g.params.connector.Broadcast(unsub, nil, utils.RelayProxy) - }() - - return g.handleSolutions(req, stream, types.UserIntentSolutionsFeed, *accountModel) -} - -func (g *server) handleSolutions(req *pb.IntentSolutionsRequest, stream pb.Gateway_IntentSolutionsServer, feedType types.FeedType, account sdnmessage.Account) error { - ci := types.ClientInfo{ - AccountID: account.AccountID, - Tier: string(account.TierName), - MetaInfo: types.SDKMetaFromContext(stream.Context()), - RemoteAddress: getPeerAddr(stream.Context()), - } - - sub, err := g.params.feedManager.Subscribe(feedType, types.GRPCFeed, nil, ci, types.ReqOptions{}, false) - if err != nil { - return status.Errorf(codes.InvalidArgument, "failed to subscribe to gRPC %v Feed", feedType) - } - - defer func() { - err = g.params.feedManager.Unsubscribe(sub.SubscriptionID, false, "") - if err != nil { - log.Errorf("failed to unsubscribe from gRPC %v Feed", feedType) - } - }() - - for { - select { - case notification := <-sub.FeedChan: - intentSolution := notification.(*types.UserIntentSolutionNotification) - - if !strings.EqualFold(intentSolution.DappAddress, req.DappAddress) && !strings.EqualFold(intentSolution.SenderAddress, req.DappAddress) { - continue - } - - err = stream.Send(&pb.IntentSolutionsReply{ - IntentId: intentSolution.IntentID, - IntentSolution: intentSolution.Solution, - SolutionId: intentSolution.ID, - }) - if err != nil { - return status.Error(codes.Internal, err.Error()) - } - - log.Tracef("pushed IntentSolution to subscriber: remoteAddress: %s, intentID: %s, solutionID: %s", ci.RemoteAddress, intentSolution.IntentID, intentSolution.ID) - case <-stream.Context().Done(): - log.Debugf("stream cancelled: remoteAddress: %s", ci.RemoteAddress) - return nil - } - } -} - -func (g *server) handleQuotes(req *pb.QuotesRequest, stream pb.Gateway_QuotesServer, account sdnmessage.Account) error { - ci := types.ClientInfo{ - AccountID: account.AccountID, - Tier: string(account.TierName), - MetaInfo: types.SDKMetaFromContext(stream.Context()), - RemoteAddress: getPeerAddr(stream.Context()), - } - sub, err := g.params.feedManager.Subscribe(types.QuotesFeed, types.GRPCFeed, nil, ci, types.ReqOptions{}, false) - if err != nil { - return status.Errorf(codes.InvalidArgument, "failed to subscribe to gRPC Quote Feed") - } - - defer func() { - err = g.params.feedManager.Unsubscribe(sub.SubscriptionID, false, "") - if err != nil { - log.Errorf("failed to unsubscribe from gRPC Quote Feed") - } - }() - - for { - select { - case notification := <-sub.FeedChan: - quote := (notification).(*types.QuoteNotification) - if quote.DappAddress != req.DappAddress { - continue - } - err = stream.Send(&pb.QuotesReply{ - DappAddress: quote.DappAddress, - SolverAddress: quote.SolverAddress, - QuoteId: quote.ID, - Quote: quote.Quote, - Timestamp: timestamppb.New(quote.Timestamp), - }) - if err != nil { - return status.Error(codes.Internal, err.Error()) - } - - log.Tracef("pushed quote to subscriber: remoteAddress: %s, quoteID: %s", ci.RemoteAddress, quote.ID) - case <-stream.Context().Done(): - log.Debugf("stream cancelled: remoteAddress: %s", ci.RemoteAddress) - return nil - } - } -} - -func (g *server) handleIntents(expr conditions.Expr, stream pb.Gateway_IntentsServer, feedType types.FeedType, account sdnmessage.Account) error { - ci := types.ClientInfo{ - AccountID: account.AccountID, - Tier: string(account.TierName), - MetaInfo: types.SDKMetaFromContext(stream.Context()), - RemoteAddress: getPeerAddr(stream.Context()), - } - - sub, err := g.params.feedManager.Subscribe(feedType, types.GRPCFeed, nil, ci, types.ReqOptions{}, false) - if err != nil { - return status.Errorf(codes.InvalidArgument, "failed to subscribe to gRPC %v Feed", feedType) - } - - defer func() { - err = g.params.feedManager.Unsubscribe(sub.SubscriptionID, false, "") - if err != nil { - log.Errorf("failed to unsubscribe from gRPC %v Feed", feedType) - } - }() - - for { - select { - case notification := <-sub.FeedChan: - intent := (notification).(*types.UserIntentNotification).UserIntent - - if expr != nil { - var shouldSend bool - shouldSend, err = conditions.Evaluate(expr, map[string]interface{}{"dapp_address": strings.ToLower(intent.DappAddress)}) - if err != nil { - return status.Error(codes.Internal, err.Error()) - } - if !shouldSend { - continue - } - } - - err = stream.Send(&pb.IntentsReply{ - DappAddress: intent.DappAddress, - SenderAddress: intent.SenderAddress, - IntentId: intent.ID, - Intent: intent.Intent, - Timestamp: timestamppb.New(intent.Timestamp), - }) - if err != nil { - return status.Error(codes.Internal, err.Error()) - } - - log.Tracef("pushed Intent to subscriber: remoteAddress: %s, intentID: %s", ci.RemoteAddress, intent.ID) - case <-stream.Context().Done(): - log.Debugf("stream cancelled: remoteAddress: %s", ci.RemoteAddress) - return nil - } - } -} - -func (g *server) sendIntentNotification(intent *types.UserIntent) { - intentNotification := types.NewUserIntentNotification(intent) - g.notify(intentNotification) -} - -func (g *server) validateIntentAuthHeader(authHeader string, required, allowAccessToInternalGateway bool, ip string) (*sdnmessage.Account, error) { - accountID, secretHash, err := g.accountIDAndHashFromAuthHeader(authHeader, required) - if err != nil { - return nil, err - } - - accountModel, err := g.params.accService.Authorize(accountID, secretHash, allowAccessToInternalGateway, g.params.allowIntroductoryTierAccess, ip) - if err != nil { - return nil, err - } - - return &accountModel, nil -} - -// convertIntentRequest creates intent from request -func (g *server) convertIntentRequest(req *pb.SubmitIntentRequest) (*types.UserIntent, error) { - intentID, err := intent.GenerateIntentID(req.DappAddress, req.Intent) - if err != nil { - return nil, err - } - return &types.UserIntent{ - ID: intentID, - DappAddress: req.DappAddress, - SenderAddress: req.SenderAddress, - Intent: req.Intent, - Hash: req.Hash, - Signature: req.Signature, - Timestamp: time.Now(), - }, nil -} - -func (g *server) convertQuoteRequest(req *pb.SubmitQuoteRequest) (*types.QuoteNotification, error) { - quoteID, err := intent.GenerateQuoteID(req.DappAddress, req.Quote) - if err != nil { - return nil, err - } - return &types.QuoteNotification{ - ID: quoteID, - DappAddress: req.DappAddress, - SolverAddress: req.SolverAddress, - Quote: req.Quote, - Hash: req.Hash, - Signature: req.Signature, - Timestamp: time.Now(), - }, nil -} diff --git a/servers/grpc/intents_test.go b/servers/grpc/intents_test.go deleted file mode 100644 index 58141a4..0000000 --- a/servers/grpc/intents_test.go +++ /dev/null @@ -1,154 +0,0 @@ -package grpc - -import ( - "context" - "fmt" - "strings" - "testing" - "time" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/stretchr/testify/require" - "go.uber.org/mock/gomock" - - "github.com/bloXroute-Labs/gateway/v2/config" - pb "github.com/bloXroute-Labs/gateway/v2/protobuf" - "github.com/bloXroute-Labs/gateway/v2/rpc" - "github.com/bloXroute-Labs/gateway/v2/test" - "github.com/bloXroute-Labs/gateway/v2/test/mock" - "github.com/bloXroute-Labs/gateway/v2/types" - "github.com/bloXroute-Labs/gateway/v2/utils" -) - -func TestGateway_Intents(t *testing.T) { - setupIntentManager := func(s *server, rq *pb.IntentsRequest) { - ctrl := gomock.NewController(t) - intentsManagerMock := mock.NewMockIntentsManager(ctrl) - intentsManagerMock.EXPECT().IntentsSubscriptionExists(rq.SolverAddress).Return(false) - intentsManagerMock.EXPECT().AddIntentsSubscription(rq.SolverAddress, rq.Hash, rq.Signature) - intentsManagerMock.EXPECT().RmIntentsSubscription(rq.SolverAddress) - s.params.intentsManager = intentsManagerMock - } - - testCases := []struct { - description string - generateIntentRequest func(t *testing.T) *pb.IntentsRequest - setupIntentManager func(*server, *pb.IntentsRequest) - expectedErrSubStr string - }{ - { - description: "successful intents subscription request", - generateIntentRequest: genIntentsRequest, - setupIntentManager: setupIntentManager, - }, - { - description: "invalid signature", - generateIntentRequest: func(t *testing.T) *pb.IntentsRequest { - rq := genIntentsRequest(t) - rq.Signature = []byte("invalid") - return rq - }, - expectedErrSubStr: "invalid signature", - }, - { - description: "subscription already exists", - generateIntentRequest: genIntentsRequest, - setupIntentManager: func(s *server, rq *pb.IntentsRequest) { - ctrl := gomock.NewController(t) - intentsManagerMock := mock.NewMockIntentsManager(ctrl) - intentsManagerMock.EXPECT().IntentsSubscriptionExists(rq.SolverAddress).Return(true) - s.params.intentsManager = intentsManagerMock - }, - expectedErrSubStr: "already exists", - }, - } - - for _, tc := range testCases { - t.Run(tc.description, func(t *testing.T) { - port := test.NextTestPort() - ctx, cancel := context.WithCancel(context.Background()) - testServer, feedMngr := testGRPCServer(t, port, "", "") - - rq := tc.generateIntentRequest(t) - if tc.setupIntentManager != nil { - tc.setupIntentManager(testServer.gatewayServer.(*server), rq) - } - - ctl := gomock.NewController(t) - bx := mock.NewMockConnector(ctl) - bx.EXPECT().Broadcast(gomock.Any(), nil, utils.RelayProxy).Return(types.BroadcastResults{}).AnyTimes() - testServer.gatewayServer.(*server).params.connector = bx - - wait := start(ctx, t, fmt.Sprintf("0.0.0.0:%v", port), testServer, feedMngr) - defer func() { - testServer.Shutdown() - cancel() - require.NoError(t, wait()) - }() - - clientConfig := &config.GRPC{ - Enabled: true, - Host: "127.0.0.1", - Port: port, - AuthEnabled: true, - EncodedAuthSet: true, - EncodedAuth: testGatewayUserAuthHeader, - Timeout: 1 * time.Second, - } - - client, err := rpc.GatewayClient(clientConfig) - require.NoError(t, err) - - stream, err := client.Intents(ctx, rq) - require.Nil(t, err) - if tc.expectedErrSubStr != "" { - _, err = stream.Recv() - require.NotNil(t, err) - require.True(t, strings.Contains(err.Error(), tc.expectedErrSubStr)) - } else { - // wait for the subscription to be created - for { - var subs *pb.SubscriptionsReply - subs, err = client.Subscriptions(ctx, &pb.SubscriptionsRequest{}) - require.NoError(t, err) - if len(subs.Subscriptions) > 0 { - break - } - time.Sleep(10 * time.Millisecond) - } - - intent := &types.UserIntent{ID: "123"} - intentNotification := types.NewUserIntentNotification(intent) - feedMngr.Notify(intentNotification) - - res, err := stream.Recv() - require.Nil(t, err) - - require.Nil(t, err) - require.NotNil(t, res) - - err = stream.CloseSend() - require.NoError(t, err) - } - }) - } -} - -func genIntentsRequest(t *testing.T) *pb.IntentsRequest { - // Generate an ECDSA key pair using secp256k1 curve - privKey, err := crypto.GenerateKey() - require.NoError(t, err) - - // Extract the public key - pubKey := privKey.PublicKey - signerAddress := crypto.PubkeyToAddress(pubKey) - hash := crypto.Keccak256Hash([]byte(signerAddress.String())).Bytes() - sig, err := crypto.Sign(hash, privKey) - require.NoError(t, err) - - return &pb.IntentsRequest{ - SolverAddress: signerAddress.String(), - Hash: hash, - Signature: sig, - } -} diff --git a/servers/grpc/server.go b/servers/grpc/server.go index 05ace99..6507975 100644 --- a/servers/grpc/server.go +++ b/servers/grpc/server.go @@ -89,7 +89,6 @@ func NewGRPCServer( gatewayPublicKey string, connector Connector, validatorsManager *validator.Manager, - intentsManager services.IntentsManager, feedManager feedManager, txStore services.TxStore, ) *Server { @@ -107,8 +106,6 @@ func NewGRPCServer( gatewayPublicKey: gatewayPublicKey, connector: connector, validatorsManager: validatorsManager, - allowIntroductoryTierAccess: config.AllowIntroductoryTierAccess, - intentsManager: intentsManager, feedManager: feedManager, txStore: txStore, chainID: bxgateway.NetworkNumToChainID[sdn.NetworkNum()], diff --git a/servers/grpc/tx_test.go b/servers/grpc/tx_test.go index 623ddd7..c75f850 100644 --- a/servers/grpc/tx_test.go +++ b/servers/grpc/tx_test.go @@ -140,11 +140,9 @@ func TestBlxrTx(t *testing.T) { resetNetworks := func() { bxgateway.NetworkNumToChainID = map[types.NetworkNum]types.NetworkID{ - bxgateway.MainnetNum: bxgateway.EthChainID, - bxgateway.BSCMainnetNum: bxgateway.BSCChainID, - bxgateway.PolygonMainnetNum: bxgateway.PolygonChainID, - bxgateway.PolygonMumbaiNum: bxgateway.PolygonChainID, - bxgateway.HoleskyNum: bxgateway.HoleskyChainID, + bxgateway.MainnetNum: bxgateway.EthChainID, + bxgateway.BSCMainnetNum: bxgateway.BSCChainID, + bxgateway.HoleskyNum: bxgateway.HoleskyChainID, } } // swapChainID swaps the chainID for the mainnet to 10 @@ -273,7 +271,7 @@ func TestBlxrTx(t *testing.T) { NextValidator: true, }, generateTxAndHash: generateDynamicFeeTxAndHash, - expectedErrSubStr: "currently next_validator is only supported on BSC and Polygon networks", + expectedErrSubStr: "currently next_validator is only supported on BSC network", }, { description: "Nil validator map on next validator", @@ -380,11 +378,9 @@ func TestGatewayGRPCBlxrBatchTx(t *testing.T) { resetNetworks := func() { bxgateway.NetworkNumToChainID = map[types.NetworkNum]types.NetworkID{ - bxgateway.MainnetNum: bxgateway.EthChainID, - bxgateway.BSCMainnetNum: bxgateway.BSCChainID, - bxgateway.PolygonMainnetNum: bxgateway.PolygonChainID, - bxgateway.PolygonMumbaiNum: bxgateway.PolygonChainID, - bxgateway.HoleskyNum: bxgateway.HoleskyChainID, + bxgateway.MainnetNum: bxgateway.EthChainID, + bxgateway.BSCMainnetNum: bxgateway.BSCChainID, + bxgateway.HoleskyNum: bxgateway.HoleskyChainID, } } // swapChainID swaps the chainID for the mainnet to 10 diff --git a/servers/handler/bundle.go b/servers/handler/bundle.go index 812342d..bfa5cd4 100644 --- a/servers/handler/bundle.go +++ b/servers/handler/bundle.go @@ -187,7 +187,7 @@ func mevBundleFromRequest(payload *jsonrpc.RPCBundleSubmissionPayload, networkNu return nil, "", fmt.Errorf("%w: %v", errInvalidPayload, err) } - if networkNum == bxgateway.PolygonMainnetNum || networkNum == bxgateway.PolygonMumbaiNum { + if networkNum != bxgateway.MainnetNum && networkNum != bxgateway.BSCMainnetNum && networkNum != bxgateway.HoleskyNum { return nil, "", fmt.Errorf("%w: %v", errInvalidNetwork, networkNum) } @@ -208,9 +208,10 @@ func mevBundleFromRequest(payload *jsonrpc.RPCBundleSubmissionPayload, networkNu return nil, parsedBundle.bundleHash, errBlockedTxHashes } - var avoidMixedBundles bool + var avoidMixedBundles, endOfBlock bool if networkNum == bxgateway.BSCMainnetNum { avoidMixedBundles = payload.AvoidMixedBundles + endOfBlock = payload.EndOfBlock } mevBundle, err := bxmessage.NewMEVBundle( @@ -227,6 +228,7 @@ func mevBundleFromRequest(payload *jsonrpc.RPCBundleSubmissionPayload, networkNu payload.IncomingRefundRecipient, payload.BlocksCount, payload.DroppingHashes, + endOfBlock, ) if err != nil { // Validated before, should not happen diff --git a/servers/handler/filter/filter.go b/servers/handler/filter/filter.go index 9473fa2..7bc92aa 100644 --- a/servers/handler/filter/filter.go +++ b/servers/handler/filter/filter.go @@ -7,11 +7,12 @@ import ( "strconv" "strings" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/zhouzhuojie/conditions" + log "github.com/bloXroute-Labs/gateway/v2/logger" "github.com/bloXroute-Labs/gateway/v2/types" "github.com/bloXroute-Labs/gateway/v2/utils" - ethtypes "github.com/ethereum/go-ethereum/core/types" - "github.com/zhouzhuojie/conditions" ) const txFromFilter = "from" @@ -76,30 +77,6 @@ func ValidateFilters(filters string, txFromFieldIncludable bool) (conditions.Exp return expr, nil } -// ValidateIntentsFilters validate filters from intents request -func ValidateIntentsFilters(filters string) (conditions.Expr, error) { - _, expr, err := parseFilter(filters) - if err != nil { - return nil, fmt.Errorf("error parsing Filters: %v", err) - } - if expr == nil { - return nil, nil - } - - err = evaluateIntentsFilters(expr) - if err != nil { - return nil, fmt.Errorf("error evaluated Filters: %v", err) - } - - log.Infof("GetTxContentAndFilters string - %s, GetTxContentAndFilters args - %s", expr, expr.Args()) - return expr, nil -} - -func evaluateIntentsFilters(expr conditions.Expr) error { - _, err := conditions.Evaluate(expr, types.EmptyFilteredIntentMap) - return err -} - // evaluateFilters - evaluating if the Filters provided by the user are ok func evaluateFilters(expr conditions.Expr) error { // Evaluate if we should send the tx diff --git a/servers/handler/filter/filter_test.go b/servers/handler/filter/filter_test.go index aee6339..0b392fe 100644 --- a/servers/handler/filter/filter_test.go +++ b/servers/handler/filter/filter_test.go @@ -87,16 +87,6 @@ func TestFilter(t *testing.T) { } } -func TestIntentsFilter(t *testing.T) { - pythonFormat := "dapp_address = 0x0df00" - expectedGoFormat := "({dapp_address} == '0x0df00')" - - goFormatResult, exp, err := parseFilter(pythonFormat) - assert.Equal(t, strings.ToLower(expectedGoFormat), strings.ToLower(goFormatResult)) - assert.NoError(t, err) - assert.Nil(t, evaluateIntentsFilters(exp)) -} - func TestIsCorrectGasPriceFilters(t *testing.T) { tests := []struct { name string diff --git a/servers/ws/handler.go b/servers/ws/handler.go index acc8ecf..544cd27 100644 --- a/servers/ws/handler.go +++ b/servers/ws/handler.go @@ -14,7 +14,6 @@ import ( "github.com/bloXroute-Labs/gateway/v2/jsonrpc" log "github.com/bloXroute-Labs/gateway/v2/logger" "github.com/bloXroute-Labs/gateway/v2/sdnmessage" - "github.com/bloXroute-Labs/gateway/v2/services" "github.com/bloXroute-Labs/gateway/v2/services/feed" "github.com/bloXroute-Labs/gateway/v2/services/statistics" "github.com/bloXroute-Labs/gateway/v2/services/validator" @@ -27,25 +26,23 @@ var ( ) type handlerObj struct { - chainID types.NetworkID - sdn connections.SDNHTTP - node connections.BxListener - feedManager *feed.Manager - nodeWSManager blockchain.WSManager - validatorsManager *validator.Manager - log *log.Entry - networkNum types.NetworkNum - intentsManager services.IntentsManager - remoteAddress string - connectionAccount sdnmessage.Account - serverAccountID types.AccountID - ethSubscribeIDToChanMap map[string]chan bool - headers map[string]string - stats statistics.Stats - pendingTxsSourceFromNode bool - enableBlockchainRPC bool - txFromFieldIncludable bool - allowIntroductoryTierAccess bool + chainID types.NetworkID + sdn connections.SDNHTTP + node connections.BxListener + feedManager *feed.Manager + nodeWSManager blockchain.WSManager + validatorsManager *validator.Manager + log *log.Entry + networkNum types.NetworkNum + remoteAddress string + connectionAccount sdnmessage.Account + serverAccountID types.AccountID + ethSubscribeIDToChanMap map[string]chan bool + headers map[string]string + stats statistics.Stats + pendingTxsSourceFromNode bool + enableBlockchainRPC bool + txFromFieldIncludable bool } // Handle handling client requests @@ -55,15 +52,7 @@ func (h *handlerObj) Handle(ctx context.Context, conn *jsonrpc2.Conn, req *jsonr h.log.Debugf("websocket handling for method %v ended. Duration %v", jsonrpc.RPCRequestType(req.Method), time.Since(start)) }() - method := jsonrpc.RPCRequestType(req.Method) - - if !h.allowTier(method) { - sendErrorMsg(ctx, jsonrpc.Blocked, "account must be enterprise / enterprise elite / ultra", conn, req.ID) - conn.Close() - return - } - - switch method { + switch jsonrpc.RPCRequestType(req.Method) { case jsonrpc.RPCSubscribe: h.handleRPCSubscribe(ctx, conn, req) case jsonrpc.RPCUnsubscribe: @@ -72,14 +61,6 @@ func (h *handlerObj) Handle(ctx context.Context, conn *jsonrpc2.Conn, req *jsonr h.handleRPCTx(ctx, conn, req) case jsonrpc.RPCBatchTx: h.handleRPCBatchTx(ctx, conn, req) - case jsonrpc.RPCSubmitIntent: - h.handleSubmitIntent(ctx, conn, req) - case jsonrpc.RPCSubmitIntentSolution: - h.handleSubmitIntentSolution(ctx, conn, req) - case jsonrpc.RPCGetIntentSolutions: - h.handleGetIntentSolutions(ctx, conn, req) - case jsonrpc.RPCSubmitQuote: - h.handleSubmitQuote(ctx, conn, req) case jsonrpc.RPCPing: response := rpcPingResponse{ Pong: time.Now().UTC().Format(bxgateway.MicroSecTimeFormat), @@ -148,23 +129,6 @@ func (h *handlerObj) Handle(ctx context.Context, conn *jsonrpc2.Conn, req *jsonr } } -// check if the account has the right tier to access -func (h *handlerObj) allowTier(method jsonrpc.RPCRequestType) bool { - if h.allowIntroductoryTierAccess && // if "allowIntroductoryTierAccess" == false, then this check was already done by the `authorize` method - method != jsonrpc.RPCSubscribe && - method != jsonrpc.RPCUnsubscribe && - method != jsonrpc.RPCSubmitIntent && - method != jsonrpc.RPCSubmitIntentSolution && - method != jsonrpc.RPCSubmitQuote && - method != jsonrpc.RPCGetIntentSolutions && - method != jsonrpc.RPCPing && - !h.connectionAccount.TierName.IsEnterprise() { - return false - } - - return true -} - // sendNotification - build a response according to client request and notify client func (h *handlerObj) sendNotification(ctx context.Context, subscriptionID string, clientReq *ClientReq, conn *jsonrpc2.Conn, notification types.Notification) error { response := BlockResponse{ diff --git a/servers/ws/intents.go b/servers/ws/intents.go deleted file mode 100644 index 56e5285..0000000 --- a/servers/ws/intents.go +++ /dev/null @@ -1,250 +0,0 @@ -package ws - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/sourcegraph/jsonrpc2" - - "github.com/bloXroute-Labs/gateway/v2/bxmessage" - "github.com/bloXroute-Labs/gateway/v2/connections" - "github.com/bloXroute-Labs/gateway/v2/jsonrpc" - "github.com/bloXroute-Labs/gateway/v2/utils/intent" -) - -const ( - solutionsWaitTime = time.Millisecond * 50 - solutionsPollInterval = time.Millisecond * 5 -) - -var ( - // ErrInvalidSenderAddress is returned when the sender address is invalid - ErrInvalidSenderAddress = errors.New("sender_address is invalid") - // ErrInvalidIntent is returned when the intent is invalid - ErrInvalidIntent = errors.New("intent is required") - // ErrRequiredIntentID is returned when the intent ID is invalid - ErrRequiredIntentID = errors.New("intent_id is required") -) - -type rpcIntentResponse struct { - IntentID string `json:"intent_id"` - FirstSeen time.Time `json:"first_seen,omitempty"` -} - -type rpcIntentSolutionResponse struct { - SolutionID string `json:"solution_id"` - FirstSeen time.Time `json:"first_seen,omitempty"` -} - -type rpcGetIntentSolutionsResponse []rpcGetIntentSolutionResult - -type rpcGetIntentSolutionResult struct { - SolutionID string `json:"solution_id"` - SolverAddress string `json:"solver_address"` - DappAddress string `json:"dapp_address"` - IntentSolution []byte `json:"intent_solution"` - Timestamp time.Time `json:"timestamp"` -} - -func (h *handlerObj) handleSubmitIntent(ctx context.Context, conn *jsonrpc2.Conn, req *jsonrpc2.Request) { - if req.Params == nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, errParamsValueIsMissing, conn, req.ID) - return - } - - var params jsonrpc.RPCSubmitIntentPayload - err := json.Unmarshal(*req.Params, ¶ms) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, fmt.Sprintf("failed to unmarshal params for %v request: %v", - jsonrpc.RPCTx, err), conn, req.ID) - return - } - - if err = validateSubmitIntentPayload(¶ms); err != nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, err.Error(), conn, req.ID) - return - } - - id, err := intent.GenerateIntentID(params.DappAddress, params.Intent) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InternalError, err.Error(), conn, req.ID) - return - } - t := time.Now() - intentMsg := bxmessage.NewIntent(id, params.DappAddress, params.SenderAddress, params.Hash, params.Signature, t, params.Intent) - - err = h.node.HandleMsg(intentMsg, nil, connections.RunBackground) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InternalError, err.Error(), conn, req.ID) - return - } - - h.intentsManager.IncIntentSubmissions() - - response := rpcIntentResponse{IntentID: id} - - if err = conn.Reply(ctx, req.ID, response); err != nil { - h.log.Errorf("error replying to %v, method %v: %v", h.remoteAddress, req.Method, err) - return - } -} - -func (h *handlerObj) handleSubmitIntentSolution(ctx context.Context, conn *jsonrpc2.Conn, req *jsonrpc2.Request) { - if req.Params == nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, errParamsValueIsMissing, conn, req.ID) - return - } - - var params jsonrpc.RPCSubmitIntentSolutionPayload - err := json.Unmarshal(*req.Params, ¶ms) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, fmt.Sprintf("failed to unmarshal params for %v request: %v", - jsonrpc.RPCTx, err), conn, req.ID) - return - } - - if err = validateSubmitIntentSolutionPayload(¶ms); err != nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, err.Error(), conn, req.ID) - return - } - - id, err := intent.GenerateSolutionID(params.IntentID, params.IntentSolution) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InternalError, err.Error(), conn, req.ID) - return - } - firstSeen := time.Now() - intentMsg := bxmessage.NewIntentSolution(id, params.SolverAddress, params.IntentID, params.Hash, params.Signature, firstSeen, params.IntentSolution) - - err = h.node.HandleMsg(intentMsg, nil, connections.RunBackground) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InternalError, err.Error(), conn, req.ID) - return - } - - h.intentsManager.IncSolutionSubmissions() - - response := rpcIntentSolutionResponse{SolutionID: id, FirstSeen: firstSeen} - - if err = conn.Reply(ctx, req.ID, response); err != nil { - h.log.Errorf("error replying to %v, method %v: %v", h.remoteAddress, req.Method, err) - return - } -} - -func (h *handlerObj) handleGetIntentSolutions(ctx context.Context, conn *jsonrpc2.Conn, req *jsonrpc2.Request) { - if req.Params == nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, errParamsValueIsMissing, conn, req.ID) - return - } - - var params jsonrpc.RPCGetIntentSolutionsPayload - err := json.Unmarshal(*req.Params, ¶ms) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, fmt.Sprintf("failed to unmarshal params for %v request: %v", - jsonrpc.RPCTx, err), conn, req.ID) - return - } - - err = validateGetIntentSolutionsPayload(¶ms) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, err.Error(), conn, req.ID) - return - } - - h.intentsManager.AddIntentOfInterest(params.IntentID) - - // broadcast the request to the connected relay nodes. - // This will notify relay nodes that the client is interested in solutions for the intent - err = h.node.HandleMsg(bxmessage.NewGetIntentSolutions(params.IntentID, params.DappOrSenderAddress, params.Hash, params.Signature), - nil, connections.RunBackground) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InternalError, err.Error(), conn, req.ID) - return - } - - res := h.solutionsForIntent(params.IntentID, conn.DisconnectNotify()) - - // send the solutions to the client even if the response is empty - if err = conn.Reply(ctx, req.ID, res); err != nil { - h.log.Errorf("error replying to %v, method %v: %v", h.remoteAddress, req.Method, err) - return - } -} - -func (h *handlerObj) solutionsForIntent(intentID string, disconnectNotify <-chan struct{}) rpcGetIntentSolutionsResponse { - // check if we already have solutions for the intent - solutions := h.intentsManager.SolutionsForIntent(intentID) - if len(solutions) == 0 { - timer := time.NewTimer(solutionsWaitTime) - ticker := time.NewTicker(solutionsPollInterval) - defer timer.Stop() - defer ticker.Stop() - - loop: - for { - select { - case <-disconnectNotify: - return nil - case <-timer.C: - break loop - case <-ticker.C: - solutions = h.intentsManager.SolutionsForIntent(intentID) - if len(solutions) > 0 { - break loop - } - } - } - } - - res := make([]rpcGetIntentSolutionResult, len(solutions)) - for i := range solutions { - res[i] = rpcGetIntentSolutionResult{ - SolutionID: solutions[i].ID, - SolverAddress: solutions[i].SolverAddress, - DappAddress: solutions[i].DappAddress, - IntentSolution: solutions[i].Solution, - Timestamp: solutions[i].Timestamp, - } - } - - return res -} - -func validateSubmitIntentPayload(payload *jsonrpc.RPCSubmitIntentPayload) error { - if (payload.DappAddress != payload.SenderAddress) && !common.IsHexAddress(payload.DappAddress) { - return ErrInvalidSenderAddress - } - - if len(payload.Intent) == 0 { - return ErrInvalidIntent - } - - return intent.ValidateHashAndSignature(payload.SenderAddress, payload.Hash, payload.Signature, payload.Intent) -} - -func validateSubmitIntentSolutionPayload(payload *jsonrpc.RPCSubmitIntentSolutionPayload) error { - if len(payload.IntentSolution) == 0 { - return ErrInvalidIntent - } - - if len(payload.IntentID) == 0 { - return ErrRequiredIntentID - } - - return intent.ValidateHashAndSignature(payload.SolverAddress, payload.Hash, payload.Signature, payload.IntentSolution) -} - -func validateGetIntentSolutionsPayload(payload *jsonrpc.RPCGetIntentSolutionsPayload) error { - if len(payload.IntentID) == 0 { - return ErrRequiredIntentID - } - - data := []byte(payload.DappOrSenderAddress + payload.IntentID) - - return intent.ValidateHashAndSignature(payload.DappOrSenderAddress, payload.Hash, payload.Signature, data) -} diff --git a/servers/ws/intents_test.go b/servers/ws/intents_test.go deleted file mode 100644 index 5eb8800..0000000 --- a/servers/ws/intents_test.go +++ /dev/null @@ -1,362 +0,0 @@ -package ws - -import ( - "context" - "encoding/json" - "fmt" - "net/http" - "testing" - "time" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/google/uuid" - "github.com/gorilla/websocket" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.uber.org/mock/gomock" - "golang.org/x/sync/errgroup" - - "github.com/bloXroute-Labs/gateway/v2" - "github.com/bloXroute-Labs/gateway/v2/blockchain/eth" - "github.com/bloXroute-Labs/gateway/v2/blockchain/eth/test" - "github.com/bloXroute-Labs/gateway/v2/bxmessage" - "github.com/bloXroute-Labs/gateway/v2/config" - "github.com/bloXroute-Labs/gateway/v2/connections" - "github.com/bloXroute-Labs/gateway/v2/jsonrpc" - "github.com/bloXroute-Labs/gateway/v2/services" - "github.com/bloXroute-Labs/gateway/v2/services/feed" - "github.com/bloXroute-Labs/gateway/v2/services/statistics" - "github.com/bloXroute-Labs/gateway/v2/test/bxmock" - "github.com/bloXroute-Labs/gateway/v2/test/fixtures" - "github.com/bloXroute-Labs/gateway/v2/test/mock" - "github.com/bloXroute-Labs/gateway/v2/types" -) - -func (s *wsSuite) TestSubmitIntent() { - s.T().Run("equal dapp and sender", func(_ *testing.T) { - intent, err := json.Marshal(s.createIntentRequest()) - s.Require().NoError(err) - reqPayload := fmt.Sprintf(`{"id": "1", "method": "blxr_submit_intent", "params": %s}`, string(intent)) - msg := s.writeMsgToWsAndReadResponse([]byte(reqPayload), nil) - clientRes := s.getClientResponse(msg) - s.Require().Nil(clientRes.Error) - - b, err := json.Marshal(clientRes.Result) - s.Require().NoError(err) - var res rpcIntentResponse - err = json.Unmarshal(b, &res) - s.Require().NoError(err) - crypto.Keccak256Hash() - s.Assert().NotEmpty(res.IntentID) - }) - s.T().Run("different dapp and sender", func(_ *testing.T) { - ir := s.createIntentRequest() - ir.DappAddress = "0x097399a35cfC20efE5FcD2e9b1d892884DAAd642" - intent, err := json.Marshal(ir) - s.Require().NoError(err) - reqPayload := fmt.Sprintf(`{"id": "1", "method": "blxr_submit_intent", "params": %s}`, string(intent)) - msg := s.writeMsgToWsAndReadResponse([]byte(reqPayload), nil) - clientRes := s.getClientResponse(msg) - s.Require().Nil(clientRes.Error) - - b, err := json.Marshal(clientRes.Result) - s.Require().NoError(err) - var res rpcIntentResponse - err = json.Unmarshal(b, &res) - s.Require().NoError(err) - s.Assert().NotEmpty(res.IntentID) - }) - s.T().Run("wrong hash", func(_ *testing.T) { - req := s.createIntentRequest() - req.Intent = []byte("wrong intent") - intent, err := json.Marshal(req) - s.Require().NoError(err) - reqPayload := fmt.Sprintf(`{"id": "1", "method": "blxr_submit_intent", "params": %s}`, string(intent)) - msg := s.writeMsgToWsAndReadResponse([]byte(reqPayload), nil) - clientRes := s.getClientResponse(msg) - s.Require().NotNil(clientRes.Error) - errResp, ok := clientRes.Error.(map[string]interface{}) - s.Require().True(ok) - data, ok := errResp["data"].(string) - s.Require().True(ok) - s.Assert().Contains(data, "hash mismatch") - }) -} - -func (s *wsSuite) TestIntentsSubscribe() { - unsubscribeMessage, subscriptionID := s.assertSubscribe(`{ "id": "2", "method": "subscribe", "params": [ "userIntentSolutionsFeed", { "dapp_address": "0x097399a35cfC20efE5FcD2e9b1d892884DAAd642", "hash": [183,2,62,89,100,47,176,195,131,57,253,105,100,82,169,64,29,188,156,99,54,36,235,232,173,157,89,149,61,184,76,66], "signature": [219,205,179,107,60,59,38,125,46,45,156,10,134,243,162,72,64,73,94,242,204,254,129,50,70,146,3,160,193,121,120,157,15,160,110,100,156,30,241,77,145,65,209,160,191,14,68,103,79,163,72,155,116,2,11,23,11,167,240,4,119,184,40,176,0]}]}`) - - solution := &types.UserIntentSolution{ - ID: uuid.New().String(), - SolverAddress: "0x097399a35cfC20efE5FcD2e9b1d892884DAAd642", - DappAddress: "0x097399a35cfC20efE5FcD2e9b1d892884DAAd642", - IntentID: uuid.New().String(), - Solution: []byte{71, 108, 111, 114, 121, 32, 116, 111, 32, 85, 107, 114, 97, 105, 110, 101, 33}, - Hash: []byte{183, 2, 62, 89, 100, 47, 176, 195, 131, 57, 253, 105, 100, 82, 169, 64, 29, 188, 156, 99, 54, 36, 235, 232, 173, 157, 89, 149, 61, 184, 76, 66}, - Signature: []byte{219, 205, 179, 107, 60, 59, 38, 125, 46, 45, 156, 10, 134, 243, 162, 72, 64, 73, 94, 242, 204, 254, 129, 50, 70, 146, 3, 160, 193, 121, 120, 157, 15, 160, 110, 100, 156, 30, 241, 77, 145, 65, 209, 160, 191, 14, 68, 103, 79, 163, 72, 155, 116, 2, 11, 23, 11, 167, 240, 4, 119, 184, 40, 176, 0}, - Timestamp: time.Now(), - } - - s.feedManager.Notify(types.NewUserIntentSolutionNotification(solution)) - - time.Sleep(time.Millisecond) - - params := s.getClientSubscribeResponseParams() - - var m userIntentSolutionResponse - err := json.Unmarshal(params, &m) - s.Require().NoError(err) - - s.Assert().Equal(m.Subscription, subscriptionID) - s.Assert().Equal(m.Result.IntentID, solution.IntentID) - s.Assert().Equal(m.Result.SolutionID, solution.ID) - s.Assert().Equal(m.Result.IntentSolution, solution.Solution) - - s.writeMsgToWsAndReadResponse([]byte(unsubscribeMessage), nil) - time.Sleep(time.Millisecond) - - s.Assert().False(s.feedManager.SubscriptionExists(subscriptionID)) - s.handlePingRequest() -} - -func (s *wsSuite) TestIntentsSubscribeWithFilter() { - s.T().Run("happy path", func(_ *testing.T) { - unsubscribeMessage, subscriptionID := s.assertSubscribe(`{ "id": "2", "method": "subscribe", "params": [ "userIntentFeed", { "filters":"dapp_address=0x097399a35cfC20efE5FcD2e9b1d892884DAAd642", "solver_address": "0xB0c6E56246F863E4d8708B0f7B928FD6c90CE935", "hash": [104,224,229,103,124,84,82,19,198,59,72,51,180,175,56,179,174,29,110,175,234,66,83,231,106,237,238,130,196,37,186,234], "signature": [175,215,153,143,90,43,18,79,37,7,117,34,76,133,228,194,23,45,41,250,218,204,151,163,142,220,189,139,87,104,56,81,92,130,120,198,254,208,161,5,183,224,250,172,80,3,239,40,41,172,166,80,187,253,185,45,87,140,49,117,213,142,155,229,1]}]}`) - - intent := &types.UserIntent{ - ID: uuid.New().String(), - DappAddress: "0x097399a35cfC20efE5FcD2e9b1d892884DAAd642", - SenderAddress: "0x097399a35cfC20efE5FcD2e9b1d892884DAAd642", - } - - s.feedManager.Notify(types.NewUserIntentNotification(intent)) - - time.Sleep(time.Millisecond) - - params := s.getClientSubscribeResponseParams() - - var m userIntentResponse - err := json.Unmarshal(params, &m) - s.Require().NoError(err) - - s.Assert().Equal(m.Subscription, subscriptionID) - s.Assert().Equal(m.Result.IntentID, intent.ID) - s.Assert().Equal(m.Result.DappAddress, intent.DappAddress) - - s.writeMsgToWsAndReadResponse([]byte(unsubscribeMessage), nil) - time.Sleep(time.Millisecond) - - s.Assert().False(s.feedManager.SubscriptionExists(subscriptionID)) - }) - s.T().Run("invalid filter", func(_ *testing.T) { - subscribeMsg := s.writeMsgToWsAndReadResponse([]byte(`{ "id": "2", "method": "subscribe", "params": [ "userIntentFeed", { "filters":"something=!0x097399a35cfC20efE5FcD2e9b1d892884DAAd642", "solver_address": "0xB0c6E56246F863E4d8708B0f7B928FD6c90CE935", "hash": [104,224,229,103,124,84,82,19,198,59,72,51,180,175,56,179,174,29,110,175,234,66,83,231,106,237,238,130,196,37,186,234], "signature": [175,215,153,143,90,43,18,79,37,7,117,34,76,133,228,194,23,45,41,250,218,204,151,163,142,220,189,139,87,104,56,81,92,130,120,198,254,208,161,5,183,224,250,172,80,3,239,40,41,172,166,80,187,253,185,45,87,140,49,117,213,142,155,229,1]}]}`), nil) - clientRes := s.getClientResponse(subscribeMsg) - s.Require().NotNil(clientRes.Error) - errResp, ok := clientRes.Error.(map[string]interface{}) - s.Require().True(ok) - data, ok := errResp["data"].(string) - s.Require().True(ok) - s.Assert().Contains(data, "error parsing Filters") - }) -} - -func (s *wsSuite) TestGetSolutionsForIntent() { - s.T().Run("happy path", func(_ *testing.T) { - intentID := uuid.New().String() - getIntent := s.createGetSolutionsRequest(intentID) - intent, err := json.Marshal(getIntent) - s.Require().NoError(err) - reqPayload := fmt.Sprintf(`{"id": "1", "method": "blxr_get_intent_solutions", "params": %s}`, string(intent)) - - // add intent solutions to the cache - s.server.intentsManager.AddIntentOfInterest(intentID) - dAppAddress := s.generateRandomAddress() - solutions := []bxmessage.IntentSolution{ - { - ID: uuid.New().String(), - SolverAddress: s.generateRandomAddress(), - IntentID: intentID, - Solution: []byte("test intent solution 1"), - Timestamp: time.Now(), - DappAddress: dAppAddress, - }, - { - ID: uuid.New().String(), - SolverAddress: s.generateRandomAddress(), - IntentID: intentID, - Solution: []byte("test intent solution 2"), - Timestamp: time.Now(), - DappAddress: dAppAddress, - }, - } - s.server.intentsManager.AppendSolutionsForIntent(bxmessage.NewIntentSolutions(solutions)) - - msg := s.writeMsgToWsAndReadResponse([]byte(reqPayload), nil) - clientRes := s.getClientResponse(msg) - - b, err := json.Marshal(clientRes.Result) - s.Require().NoError(err) - - var res rpcGetIntentSolutionsResponse - err = json.Unmarshal(b, &res) - s.Require().NoError(err) - - s.Require().Len(res, 2) - s.Require().Equal(solutions[0].DappAddress, res[0].DappAddress) - s.Require().Equal(solutions[1].DappAddress, res[1].DappAddress) - }) - s.T().Run("no solutions", func(_ *testing.T) { - intentID := uuid.New().String() - getIntent := s.createGetSolutionsRequest(intentID) - intent, err := json.Marshal(getIntent) - s.Require().NoError(err) - reqPayload := fmt.Sprintf(`{"id": "1", "method": "blxr_get_intent_solutions", "params": %s}`, string(intent)) - - msg := s.writeMsgToWsAndReadResponse([]byte(reqPayload), nil) - clientRes := s.getClientResponse(msg) - - b, err := json.Marshal(clientRes.Result) - s.Require().NoError(err) - - var res rpcGetIntentSolutionsResponse - err = json.Unmarshal(b, &res) - s.Require().NoError(err) - - s.Require().Len(res, 0) - }) -} - -func (s *wsSuite) createIntentRequest() *jsonrpc.RPCSubmitIntentPayload { - privKey, err := crypto.GenerateKey() - s.Require().NoError(err) - senderAddress := crypto.PubkeyToAddress(privKey.PublicKey).String() - intent := []byte("test intent") - intentHash := crypto.Keccak256Hash(intent).Bytes() - intentSignature, err := crypto.Sign(intentHash, privKey) - s.Require().NoError(err) - - return &jsonrpc.RPCSubmitIntentPayload{ - DappAddress: senderAddress, - SenderAddress: senderAddress, - Intent: intent, - Hash: intentHash, - Signature: intentSignature, - } -} - -func (s *wsSuite) createGetSolutionsRequest(intentID string) *jsonrpc.RPCGetIntentSolutionsPayload { - privKey, err := crypto.GenerateKey() - s.Require().NoError(err) - dappAddress := crypto.PubkeyToAddress(privKey.PublicKey).String() - data := []byte(dappAddress + intentID) - intentHash := crypto.Keccak256Hash(data).Bytes() - intentSignature, err := crypto.Sign(intentHash, privKey) - s.Require().NoError(err) - - return &jsonrpc.RPCGetIntentSolutionsPayload{ - IntentID: intentID, - DappOrSenderAddress: dappAddress, - Hash: intentHash, - Signature: intentSignature, - } -} - -func (s *wsSuite) generateRandomAddress() string { - privKey, err := crypto.GenerateKey() - s.Require().NoError(err) - return crypto.PubkeyToAddress(privKey.PublicKey).String() -} - -func TestClientHandlerAuth(t *testing.T) { - for _, allowIntroductoryTierAccess := range []bool{true, false} { - t.Run(fmt.Sprintf("allowIntroductoryTierAccess-%t", allowIntroductoryTierAccess), func(t *testing.T) { - ctx, cancel := context.WithCancel(context.Background()) - - eg, gCtx := errgroup.WithContext(ctx) - - ctl := gomock.NewController(t) - sdn := mock.NewMockSDNHTTP(ctl) - sdn.EXPECT().FetchCustomerAccountModel(types.AccountID("gw")).Return(accountIDToAccountModel["gw"], nil).AnyTimes() - sdn.EXPECT().NodeID().Return(types.NodeID("nodeID")).AnyTimes() - sdn.EXPECT().NetworkNum().Return(types.NetworkNum(5)).AnyTimes() - sdn.EXPECT().AccountModel().Return(accountIDToAccountModel["gw"]).AnyTimes() - sdn.EXPECT().GetQuotaUsage(gomock.AnyOf("a", "b", "c", "i", "gw")).DoAndReturn(func(accountID string) (*connections.QuotaResponseBody, error) { - res := connections.QuotaResponseBody{ - AccountID: accountID, - QuotaFilled: 1, - QuotaLimit: 2, - } - - return &res, nil - }).AnyTimes() - - stats := statistics.NoStats{} - - feedManager := feed.NewManager(sdn, services.NewNoOpSubscriptionServices(), - accountIDToAccountModel["gw"], stats, types.NetworkNum(5), true) - - im := services.NewIntentsManager() - as := &mockAccountService{} - - g := bxmock.MockBxListener{} - - cfg := &config.Bx{ - EnableBlockchainRPC: false, - WebsocketHost: localhost, - WebsocketPort: wsPort, - ManageWSServer: true, - WebsocketTLSEnabled: false, - AllowIntroductoryTierAccess: allowIntroductoryTierAccess, - } - - _, blockchainPeersInfo := test.GenerateBlockchainPeersInfo(3) - - nodeWSManager := eth.NewEthWSManager(blockchainPeersInfo, eth.NewMockWSProvider, bxgateway.WSProviderTimeout, false) - - server := NewWSServer(cfg, "", "", sdn, g, as, feedManager, nodeWSManager, - nil, im, stats, true) - server.wsConnDelayOnErr = 10 * time.Millisecond - - eg.Go(func() error { - return feedManager.Start(gCtx) - }) - eg.Go(server.Run) - - dialer := websocket.DefaultDialer - headers := make(http.Header) - - dummyAuthHeader := "aTo2NTQzMjE=" // i:654321 - headers.Set("Authorization", dummyAuthHeader) - ws, _, err := dialer.Dial(wsURL, headers) - require.NoError(t, err) - - // ping - _ = writeMsgToWsAndReadResponse(t, ws, []byte(`{"id": "1", "method": "ping"}`), nil) - - reqPayload := fmt.Sprintf(`{"jsonrpc": "2.0", "id": "1", "method": "eth_sendRawTransaction", "params": ["0x%v"]}`, fixtures.DynamicFeeTransaction) - - var msg []byte - if allowIntroductoryTierAccess { - msg = writeMsgToWsAndReadResponse(t, ws, []byte(reqPayload), nil) - assert.Equal(t, `{"id":"1","error":{"code":-32001,"message":"Insufficient quota","data":"account must be enterprise / enterprise elite / ultra"},"jsonrpc":"2.0"} -`, string(msg)) - err = ws.WriteMessage(websocket.TextMessage, msg) - assert.NoError(t, err) - _, _, err = ws.ReadMessage() - assert.Error(t, err, "connection should be closed by the server") - } else { - msg = writeMsgToWsAndReadResponse(t, ws, []byte(reqPayload), nil) - assert.Equal(t, `{"id":"1","error":{"code":-32601,"message":"Invalid method","data":"got unsupported method name: eth_sendRawTransaction"},"jsonrpc":"2.0"} -`, string(msg)) - // client should be still connected - msg = writeMsgToWsAndReadResponse(t, ws, []byte(reqPayload), nil) - assert.Equal(t, `{"id":"1","error":{"code":-32601,"message":"Invalid method","data":"got unsupported method name: eth_sendRawTransaction"},"jsonrpc":"2.0"} -`, string(msg)) - } - - cancel() - server.Shutdown() - require.NoError(t, eg.Wait()) - }) - } -} diff --git a/servers/ws/models.go b/servers/ws/models.go index e6f8718..07b91b6 100644 --- a/servers/ws/models.go +++ b/servers/ws/models.go @@ -63,18 +63,6 @@ type subscriptionRequest struct { options subscriptionOptions } -type subscriptionIntentParams struct { - SolverAddress string `json:"solver_address"` - Hash []byte `json:"hash"` - Signature []byte `json:"signature"` - DappAddress string `json:"dapp_address"` - Filters string `json:"filters"` -} - -type subscribeQuotesParams struct { - DappAddress string `json:"dapp_address"` -} - // subscriptionOptions Includes subscription options type subscriptionOptions struct { Include []string `json:"Include"` @@ -87,43 +75,6 @@ type rpcPingResponse struct { Pong string `json:"pong"` } -type userIntentResponse struct { - Subscription string `json:"subscription"` - Result userIntentNotification `json:"result"` -} - -type userIntentNotification struct { - DappAddress string `json:"dapp_address"` - SenderAddress string `json:"sender_address"` - IntentID string `json:"intent_id"` - Intent []byte `json:"intent"` - Timestamp string `json:"timestamp"` -} - -type userIntentSolutionResponse struct { - Subscription string `json:"subscription"` - Result userIntentSolutionNotification `json:"result"` -} - -type userIntentSolutionNotification struct { - IntentID string `json:"intent_id"` - SolutionID string `json:"solution_id"` - IntentSolution []byte `json:"intent_solution"` -} - -type quoteResponse struct { - Subscription string `json:"subscription"` - Result quoteNotification `json:"result"` -} - -type quoteNotification struct { - DappAddress string `json:"dapp_address"` - ID string `json:"quote_id"` - SolverAddress string `json:"solver_address"` - Quote []byte `json:"quote"` - Timestamp string `json:"timestamp"` -} - type rpcBatchTxResponse struct { TxHashes []string `json:"txHashes"` } diff --git a/servers/ws/quotes.go b/servers/ws/quotes.go deleted file mode 100644 index f9c5a9a..0000000 --- a/servers/ws/quotes.go +++ /dev/null @@ -1,77 +0,0 @@ -package ws - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "time" - - "github.com/bloXroute-Labs/gateway/v2/bxmessage" - "github.com/bloXroute-Labs/gateway/v2/connections" - "github.com/bloXroute-Labs/gateway/v2/jsonrpc" - "github.com/bloXroute-Labs/gateway/v2/utils/intent" - "github.com/ethereum/go-ethereum/common" - "github.com/sourcegraph/jsonrpc2" -) - -// ErrInvalidQuote is returned when the quote is invalid -var ErrInvalidQuote = errors.New("quote is required") - -type rpcQuoteResponse struct { - QuoteID string `json:"quote_id"` - FirstSeen time.Time `json:"first_seen,omitempty"` -} - -func (h *handlerObj) handleSubmitQuote(ctx context.Context, conn *jsonrpc2.Conn, req *jsonrpc2.Request) { - if req.Params == nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, errParamsValueIsMissing, conn, req.ID) - return - } - - var params jsonrpc.RPCSubmitQuotePayload - err := json.Unmarshal(*req.Params, ¶ms) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, fmt.Sprintf("failed to unmarshal params for %v request: %v", - jsonrpc.RPCTx, err), conn, req.ID) - return - } - - if err = validateSubmitQuotePayload(¶ms); err != nil { - sendErrorMsg(ctx, jsonrpc.InvalidParams, err.Error(), conn, req.ID) - return - } - - id, err := intent.GenerateQuoteID(params.DappAddress, params.Quote) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InternalError, err.Error(), conn, req.ID) - return - } - quoteMsg := bxmessage.NewQuote(id, params.DappAddress, params.SolverAddress, params.Hash, params.Signature, params.Quote, time.Now()) - - err = h.node.HandleMsg(quoteMsg, nil, connections.RunBackground) - if err != nil { - sendErrorMsg(ctx, jsonrpc.InternalError, err.Error(), conn, req.ID) - return - } - - h.intentsManager.IncQuoteSubmissions() - - response := rpcQuoteResponse{QuoteID: id} - - if err = conn.Reply(ctx, req.ID, response); err != nil { - h.log.Errorf("error replying to %v, method %v: %v", h.remoteAddress, req.Method, err) - return - } -} - -func validateSubmitQuotePayload(payload *jsonrpc.RPCSubmitQuotePayload) error { - if !common.IsHexAddress(payload.DappAddress) { - return ErrInvalidSenderAddress - } - if len(payload.Quote) == 0 { - return ErrInvalidQuote - } - - return intent.ValidateHashAndSignature(payload.SolverAddress, payload.Hash, payload.Signature, payload.Quote) -} diff --git a/servers/ws/server.go b/servers/ws/server.go index 2870de0..d2a0815 100644 --- a/servers/ws/server.go +++ b/servers/ws/server.go @@ -8,6 +8,10 @@ import ( "net/http" "time" + "github.com/gorilla/websocket" + "github.com/sourcegraph/jsonrpc2" + websocketjsonrpc2 "github.com/sourcegraph/jsonrpc2/websocket" + "github.com/bloXroute-Labs/gateway/v2" "github.com/bloXroute-Labs/gateway/v2/blockchain" "github.com/bloXroute-Labs/gateway/v2/config" @@ -15,16 +19,12 @@ import ( "github.com/bloXroute-Labs/gateway/v2/jsonrpc" log "github.com/bloXroute-Labs/gateway/v2/logger" "github.com/bloXroute-Labs/gateway/v2/sdnmessage" - "github.com/bloXroute-Labs/gateway/v2/services" "github.com/bloXroute-Labs/gateway/v2/services/account" "github.com/bloXroute-Labs/gateway/v2/services/feed" "github.com/bloXroute-Labs/gateway/v2/services/statistics" "github.com/bloXroute-Labs/gateway/v2/services/validator" "github.com/bloXroute-Labs/gateway/v2/types" "github.com/bloXroute-Labs/gateway/v2/utils" - "github.com/gorilla/websocket" - "github.com/sourcegraph/jsonrpc2" - websocketjsonrpc2 "github.com/sourcegraph/jsonrpc2/websocket" ) const localhost = "127.0.0.1" @@ -47,7 +47,6 @@ type Server struct { validatorsManager *validator.Manager log *log.Entry networkNum types.NetworkNum - intentsManager services.IntentsManager stats statistics.Stats wsConnDelayOnErr time.Duration // wsConnDelayOnErr amount of time to sleep before closing a bad connection. This is configured by tests to a shorted value txFromFieldIncludable bool @@ -64,7 +63,6 @@ func NewWSServer( feedManager *feed.Manager, nodeWSManager blockchain.WSManager, validatorsManager *validator.Manager, - intentsManager services.IntentsManager, stats statistics.Stats, txFromFieldIncludable bool) *Server { @@ -84,7 +82,6 @@ func NewWSServer( validatorsManager: validatorsManager, log: log.WithField("component", "gatewayWs"), networkNum: networkNum, - intentsManager: intentsManager, stats: stats, wsConnDelayOnErr: 10 * time.Second, txFromFieldIncludable: txFromFieldIncludable, @@ -182,7 +179,7 @@ func (s *Server) wsHandler(w http.ResponseWriter, r *http.Request) { s.errorWithDelay(w, r, fmt.Errorf("missing authorization from method: %v", r.Method).Error()) return } - connectionAccountModel, err = s.accService.Authorize(accountID, secretHash, true, s.cfg.AllowIntroductoryTierAccess, r.RemoteAddr) + connectionAccountModel, err = s.accService.Authorize(accountID, secretHash, true, r.RemoteAddr) if err != nil { s.errorWithDelay(w, r, err.Error()) return @@ -210,25 +207,23 @@ func (s *Server) wsHandler(w http.ResponseWriter, r *http.Request) { }) handler := &handlerObj{ - chainID: s.chainID, - sdn: s.sdn, - node: s.node, - feedManager: s.feedManager, - nodeWSManager: s.nodeWSManager, - validatorsManager: s.validatorsManager, - log: logger, - networkNum: s.networkNum, - stats: s.stats, - intentsManager: s.intentsManager, - remoteAddress: r.RemoteAddr, - connectionAccount: connectionAccountModel, - serverAccountID: serverAccountID, - ethSubscribeIDToChanMap: make(map[string]chan bool), - headers: types.SDKMetaFromHeaders(r.Header), - enableBlockchainRPC: s.cfg.EnableBlockchainRPC, - txFromFieldIncludable: s.txFromFieldIncludable, - pendingTxsSourceFromNode: s.cfg.PendingTxsSourceFromNode, - allowIntroductoryTierAccess: s.cfg.AllowIntroductoryTierAccess, + chainID: s.chainID, + sdn: s.sdn, + node: s.node, + feedManager: s.feedManager, + nodeWSManager: s.nodeWSManager, + validatorsManager: s.validatorsManager, + log: logger, + networkNum: s.networkNum, + stats: s.stats, + remoteAddress: r.RemoteAddr, + connectionAccount: connectionAccountModel, + serverAccountID: serverAccountID, + ethSubscribeIDToChanMap: make(map[string]chan bool), + headers: types.SDKMetaFromHeaders(r.Header), + enableBlockchainRPC: s.cfg.EnableBlockchainRPC, + txFromFieldIncludable: s.txFromFieldIncludable, + pendingTxsSourceFromNode: s.cfg.PendingTxsSourceFromNode, } asyncHandler := jsonrpc2.AsyncHandler(handler) diff --git a/servers/ws/server_test.go b/servers/ws/server_test.go index b764c49..75bb5e3 100644 --- a/servers/ws/server_test.go +++ b/servers/ws/server_test.go @@ -53,7 +53,6 @@ func TestAuthorization(t *testing.T) { feedManager := feed.NewManager(sdn, services.NewNoOpSubscriptionServices(), accountIDToAccountModel["gw"], stats, types.NetworkNum(5), true) - im := services.NewIntentsManager() accService := &mockAccountService{} g := bxmock.MockBxListener{} @@ -71,7 +70,7 @@ func TestAuthorization(t *testing.T) { nodeWSManager := eth.NewEthWSManager(blockchainPeersInfo, eth.NewMockWSProvider, bxgateway.WSProviderTimeout, false) server := NewWSServer(cfg, "", "", sdn, g, accService, feedManager, nodeWSManager, - nil, im, stats, true) + nil, stats, true) server.wsConnDelayOnErr = 10 * time.Millisecond // set a shorted delay for tests eg.Go(func() error { diff --git a/servers/ws/subscribe.go b/servers/ws/subscribe.go index 31664ed..7d41042 100644 --- a/servers/ws/subscribe.go +++ b/servers/ws/subscribe.go @@ -35,14 +35,6 @@ func (h *handlerObj) handleRPCSubscribe(ctx context.Context, conn *jsonrpc2.Conn return } - // check if the account has the right tier to access - // if "allowIntroductoryTierAccess" == false, then this check was already done before creating the connection - if h.allowIntroductoryTierAccess && feed != types.UserIntentsFeed && feed != types.UserIntentSolutionsFeed && feed != types.QuotesFeed && !h.connectionAccount.TierName.IsEnterprise() { - sendErrorMsg(ctx, jsonrpc.Blocked, "account must be enterprise / enterprise elite / ultra", conn, req.ID) - conn.Close() - return - } - if len(h.nodeWSManager.Providers()) == 0 && feed == types.NewBlocksFeed && h.networkNum != bxgateway.MainnetNum && h.networkNum != bxgateway.HoleskyNum { errMsg := fmt.Sprintf("%v Feed requires a websockets endpoint to be specifed via either --eth-ws-uri or --multi-node startup parameter", feed) @@ -51,15 +43,8 @@ func (h *handlerObj) handleRPCSubscribe(ctx context.Context, conn *jsonrpc2.Conn } var request *ClientReq - var postRun func() - switch feed { - case types.UserIntentsFeed, types.UserIntentSolutionsFeed: - request, postRun, err = h.createIntentClientReq(req, feed, rpcParams) - case types.QuotesFeed: - request, postRun, err = h.createQuoteClientReq(rpcParams) - default: - request, err = h.createClientReq(req, feed, rpcParams) - } + + request, err = h.createClientReq(req, feed, rpcParams) if err != nil { sendErrorMsg(ctx, jsonrpc.InvalidParams, err.Error(), conn, req.ID) return @@ -71,7 +56,7 @@ func (h *handlerObj) handleRPCSubscribe(ctx context.Context, conn *jsonrpc2.Conn return } - ci, ro := h.createClientInfoAndRequestOpts(feed, request) + ci, ro := h.createClientInfoAndRequestOpts(request) sub, errSubscribe := h.feedManager.Subscribe(feed, types.WebSocketFeed, conn, ci, ro, false) if errSubscribe != nil { @@ -86,10 +71,6 @@ func (h *handlerObj) handleRPCSubscribe(ctx context.Context, conn *jsonrpc2.Conn if err != nil && !errors.Is(err, bxgateway.ErrSubscriptionNotFound) { h.log.Errorf("failed to unsubscribe from %v, subscriptionID %v: %v", feed, subscriptionID, err) } - - if postRun != nil { - postRun() - } }() if err = conn.Reply(ctx, req.ID, subscriptionID); err != nil { @@ -168,36 +149,12 @@ func (h *handlerObj) handleRPCSubscribeNotify(ctx context.Context, conn *jsonrpc sendErrorMsg(ctx, jsonrpc.InvalidRequest, err.Error(), conn, reqID) return } - case types.UserIntentsFeed: - in := notification.(*types.UserIntentNotification) - if !shouldSendIntent(request, in.DappAddress) { - continue - } - if h.sendIntentNotification(ctx, subscriptionID, conn, in) != nil { - return - } - case types.UserIntentSolutionsFeed: - intentSolution := notification.(*types.UserIntentSolutionNotification) - if !strings.EqualFold(intentSolution.DappAddress, request.Includes[0]) && !strings.EqualFold(intentSolution.SenderAddress, request.Includes[0]) { - continue - } - - if h.sendIntentSolutionNotification(ctx, subscriptionID, conn, intentSolution) != nil { - return - } - case types.QuotesFeed: - quote := notification.(*types.QuoteNotification) - if strings.EqualFold(quote.DappAddress, request.Includes[0]) { - if h.sendQuoteNotification(ctx, subscriptionID, conn, quote) != nil { - return - } - } } } } } -func (h *handlerObj) createClientInfoAndRequestOpts(feed types.FeedType, request *ClientReq) (types.ClientInfo, types.ReqOptions) { +func (h *handlerObj) createClientInfoAndRequestOpts(request *ClientReq) (types.ClientInfo, types.ReqOptions) { ci := types.ClientInfo{ RemoteAddress: h.remoteAddress, AccountID: h.connectionAccount.AccountID, @@ -205,10 +162,6 @@ func (h *handlerObj) createClientInfoAndRequestOpts(feed types.FeedType, request MetaInfo: h.headers, } - if feed == types.UserIntentsFeed || feed == types.UserIntentSolutionsFeed { - return ci, types.ReqOptions{} - } - var filters string if request.Expr != nil { filters = request.Expr.String() @@ -331,67 +284,6 @@ func (h *handlerObj) subscribeMultiTxs(ctx context.Context, feedChan chan types. } } -func (h *handlerObj) sendIntentNotification(ctx context.Context, subscriptionID string, conn *jsonrpc2.Conn, in *types.UserIntentNotification) error { - response := userIntentResponse{ - Subscription: subscriptionID, - Result: userIntentNotification{ - DappAddress: in.DappAddress, - SenderAddress: in.SenderAddress, - IntentID: in.ID, - Intent: in.Intent, - Timestamp: in.Timestamp.Format(time.RFC3339), - }, - } - - err := conn.Notify(ctx, "subscribe", response) - if err != nil { - h.log.Errorf("error reply to subscriptionID %v: %v", subscriptionID, err.Error()) - return err - } - - return nil -} - -func (h *handlerObj) sendQuoteNotification(ctx context.Context, subscriptionID string, conn *jsonrpc2.Conn, quote *types.QuoteNotification) error { - response := quoteResponse{ - Subscription: subscriptionID, - Result: quoteNotification{ - DappAddress: quote.DappAddress, - SolverAddress: quote.SolverAddress, - ID: quote.ID, - Quote: quote.Quote, - Timestamp: quote.Timestamp.Format(time.RFC3339), - }, - } - - err := conn.Notify(ctx, "subscribe", response) - if err != nil { - h.log.Errorf("error reply to subscriptionID %v: %v", subscriptionID, err.Error()) - return err - } - - return nil -} - -func (h *handlerObj) sendIntentSolutionNotification(ctx context.Context, subscriptionID string, conn *jsonrpc2.Conn, in *types.UserIntentSolutionNotification) error { - response := userIntentSolutionResponse{ - Subscription: subscriptionID, - Result: userIntentSolutionNotification{ - IntentID: in.IntentID, - IntentSolution: in.Solution, - SolutionID: in.ID, - }, - } - - err := conn.Notify(ctx, "subscribe", response) - if err != nil { - h.log.Errorf("error reply to subscriptionID %v: %v", subscriptionID, err.Error()) - return err - } - - return nil -} - func filterAndIncludeTx(clientReq *ClientReq, tx *types.NewTransactionNotification, remoteAddress string, accountID types.AccountID) *TxResult { if !shouldSendTx(clientReq, tx, remoteAddress, accountID) { return nil @@ -461,19 +353,3 @@ func includeTx(clientReq *ClientReq, tx *types.NewTransactionNotification) *TxRe return &response } - -func shouldSendIntent(clientReq *ClientReq, dAppAddress string) bool { - if clientReq.Expr == nil { - return true - } - - shouldSend, err := conditions.Evaluate(clientReq.Expr, map[string]interface{}{"dapp_address": strings.ToLower(dAppAddress)}) - if err != nil { - log.Errorf("error evaluate Filters. Feed: %v. filters: %s. dapp address: %v error - %v", - clientReq.Feed, clientReq.Expr, dAppAddress, err.Error()) - - return false - } - - return shouldSend -} diff --git a/servers/ws/subscribe_request.go b/servers/ws/subscribe_request.go index 89095f1..f1244d9 100644 --- a/servers/ws/subscribe_request.go +++ b/servers/ws/subscribe_request.go @@ -6,26 +6,21 @@ import ( "fmt" "time" - "github.com/ethereum/go-ethereum/common" "github.com/sourcegraph/jsonrpc2" "github.com/zhouzhuojie/conditions" "github.com/bloXroute-Labs/gateway/v2" - "github.com/bloXroute-Labs/gateway/v2/bxmessage" - "github.com/bloXroute-Labs/gateway/v2/connections" "github.com/bloXroute-Labs/gateway/v2/sdnmessage" "github.com/bloXroute-Labs/gateway/v2/servers/handler" "github.com/bloXroute-Labs/gateway/v2/servers/handler/filter" "github.com/bloXroute-Labs/gateway/v2/servers/handler/validator" "github.com/bloXroute-Labs/gateway/v2/types" "github.com/bloXroute-Labs/gateway/v2/utils" - "github.com/bloXroute-Labs/gateway/v2/utils/intent" ) var ( availableFeeds = []types.FeedType{types.NewTxsFeed, types.NewBlocksFeed, types.BDNBlocksFeed, types.PendingTxsFeed, - types.OnBlockFeed, types.TxReceiptsFeed, types.NewBeaconBlocksFeed, types.BDNBeaconBlocksFeed, types.UserIntentsFeed, - types.UserIntentSolutionsFeed, types.QuotesFeed} + types.OnBlockFeed, types.TxReceiptsFeed, types.NewBeaconBlocksFeed, types.BDNBeaconBlocksFeed} availableFeedsMap = make(map[types.FeedType]struct{}) ) @@ -115,124 +110,6 @@ func (h *handlerObj) createClientReq(req *jsonrpc2.Request, feed types.FeedType, }, nil } -func (h *handlerObj) createQuoteClientReq(rpcParams json.RawMessage) (*ClientReq, func(), error) { - var params subscribeQuotesParams - var expr conditions.Expr - err := json.Unmarshal(rpcParams, ¶ms) - if err != nil { - return nil, nil, fmt.Errorf("failed to unmarshal subscription intent options: %w", err) - } - if !common.IsHexAddress(params.DappAddress) { - return nil, nil, intent.ErrInvalidAddress - } - - subscriptions := h.intentsManager.AddQuotesSubscription(params.DappAddress) - sub := bxmessage.NewQuotesSubscription(params.DappAddress) - - includes := []string{params.DappAddress} - - if subscriptions == 1 { - err = h.node.HandleMsg(sub, nil, connections.RunBackground) - if err != nil { - return nil, nil, fmt.Errorf("failed to send subscription message for feed quotes: %w", err) - } - } - postRun := func() { - subscriptions, err = h.intentsManager.RmQuotesSubscription(params.DappAddress) - // send quotesUnsubscription to Relay if there are no more subscriptions to a specific address - if err == nil && subscriptions == 0 { - unsub := bxmessage.NewQuotesUnsubscription(params.DappAddress) - err = h.node.HandleMsg(unsub, nil, connections.RunBackground) - if err != nil { - h.log.Errorf("failed to handle unsubscription message for dapp address %v and feed quotes: %v", params.DappAddress, err) - } - } - } - - return &ClientReq{Feed: types.QuotesFeed, Includes: includes, Expr: expr}, postRun, nil -} - -func (h *handlerObj) createIntentClientReq(req *jsonrpc2.Request, feed types.FeedType, rpcParams json.RawMessage) (*ClientReq, func(), error) { - var params subscriptionIntentParams - err := json.Unmarshal(rpcParams, ¶ms) - if err != nil { - return nil, nil, fmt.Errorf("failed to unmarshal subscription intent options: %w", err) - } - - switch feed { - case types.UserIntentsFeed: - err = intent.ValidateHashAndSignature(params.SolverAddress, params.Hash, params.Signature, []byte(params.SolverAddress)) - case types.UserIntentSolutionsFeed: - err = intent.ValidateHashAndSignature(params.DappAddress, params.Hash, params.Signature, []byte(params.DappAddress)) - default: - return nil, nil, fmt.Errorf("invalid intentoin feed type %v", feed) - } - if err != nil { - h.log.Debugf("error when validating signature. request id: %v. method: %v. params: %s. remote address: %v account id: %v error - %v", - req.ID, req.Method, *req.Params, h.remoteAddress, h.connectionAccount.AccountID, err) - return nil, nil, err - } - - var sub bxmessage.Message - var postRun func() - var includes []string - var expr conditions.Expr - - switch feed { - case types.UserIntentsFeed: - if h.intentsManager.IntentsSubscriptionExists(params.SolverAddress) { - return nil, nil, fmt.Errorf("intent subscription already exists for solver address %v", params.SolverAddress) - } - h.intentsManager.AddIntentsSubscription(params.SolverAddress, params.Hash, params.Signature) - sub = bxmessage.NewIntentsSubscription(params.SolverAddress, params.Hash, params.Signature) - - if params.Filters != "" { - expr, err = filter.ValidateIntentsFilters(params.Filters) - if err != nil { - h.log.Debugf("error when creating filters. request id: %v. method: %v. params: %s. remote address: %v account id: %v error - %v", - req.ID, req.Method, *req.Params, h.remoteAddress, h.connectionAccount.AccountID, err.Error()) - return nil, nil, fmt.Errorf("error creating Filters: %w", err) - } - } - - postRun = func() { - h.intentsManager.RmIntentsSubscription(params.SolverAddress) - unsub := bxmessage.NewIntentsUnsubscription(params.SolverAddress) - err = h.node.HandleMsg(unsub, nil, connections.RunBackground) - if err != nil { - h.log.Errorf("failed to handle unsubscription message for solver address %v and feed %v: %v", params.SolverAddress, feed, err) - } - } - case types.UserIntentSolutionsFeed: - if h.intentsManager.SolutionsSubscriptionExists(params.DappAddress) { - return nil, nil, fmt.Errorf("intent solutions subscription already exists for dapp address %v", params.DappAddress) - } - h.intentsManager.AddSolutionsSubscription(params.DappAddress, params.Hash, params.Signature) - sub = bxmessage.NewSolutionsSubscription(params.DappAddress, params.Hash, params.Signature) - - includes = []string{params.DappAddress} - - postRun = func() { - h.intentsManager.RmSolutionsSubscription(params.DappAddress) - unsub := bxmessage.NewSolutionsUnsubscription(params.DappAddress) - err = h.node.HandleMsg(unsub, nil, connections.RunBackground) - if err != nil { - h.log.Errorf("failed to handle unsubscription message for dapp address %v and feed %v: %v", params.DappAddress, feed, err) - } - } - default: - return nil, nil, fmt.Errorf("invalid intentoin feed type %v", feed) - } - - // send subscription to Relay - err = h.node.HandleMsg(sub, nil, connections.RunBackground) - if err != nil { - return nil, nil, fmt.Errorf("failed to send subscription message for feed %v: %w", feed, err) - } - - return &ClientReq{Feed: feed, Includes: includes, Expr: expr}, postRun, nil -} - func (h *handlerObj) parseSubscriptionRequest(req *jsonrpc2.Request) (types.FeedType, json.RawMessage, error) { if req.Params == nil { return "", nil, errors.New(errParamsValueIsMissing) diff --git a/servers/ws/tx_test.go b/servers/ws/tx_test.go index 1d0d1f6..a88c316 100644 --- a/servers/ws/tx_test.go +++ b/servers/ws/tx_test.go @@ -83,7 +83,7 @@ func (s *wsSuite) TestBlxrTxRequestWithNextValidator() { s.Require().True(ok) data, ok := err["data"].(string) s.Require().True(ok) - s.Assert().Contains(data, "next_validator is only supported on BSC and Polygon networks") + s.Assert().Contains(data, "next_validator is only supported on BSC network") } func (s *wsSuite) TestBlxrBSCTxRequestWithNextValidator() { diff --git a/servers/ws/ws_test.go b/servers/ws/ws_test.go index 0c5b743..983690a 100644 --- a/servers/ws/ws_test.go +++ b/servers/ws/ws_test.go @@ -130,7 +130,6 @@ func (s *wsSuite) setupSuit(networkNum types.NetworkNum) { s.feedManager = feed.NewManager(s.sdn, services.NewNoOpSubscriptionServices(), accountIDToAccountModel["gw"], stats, networkNum, true) - im := services.NewIntentsManager() as := &mockAccountService{} g := bxmock.MockBxListener{} @@ -158,7 +157,7 @@ func (s *wsSuite) setupSuit(networkNum types.NetworkNum) { s.Assert().NotNil(p3) var validatorManager *validator.Manager - if networkNum == bxgateway.BSCMainnetNum || networkNum == bxgateway.PolygonMainnetNum { + if networkNum == bxgateway.BSCMainnetNum { nextValidatorMap := orderedmap.New[uint64, string]() validatorStatusMap := syncmap.NewStringMapOf[bool]() validatorListMap := syncmap.NewIntegerMapOf[uint64, validator.List]() @@ -170,14 +169,10 @@ func (s *wsSuite) setupSuit(networkNum types.NetworkNum) { } s.server = NewWSServer(cfg, "", "", s.sdn, g, as, s.feedManager, s.nodeWSManager, - validatorManager, im, stats, true) + validatorManager, stats, true) // set a shorted delay for tests s.server.wsConnDelayOnErr = 10 * time.Millisecond - s.eg.Go(func() error { - s.server.intentsManager.CleanupExpiredSolutions(ctx) - return nil - }) s.eg.Go(func() error { return s.feedManager.Start(ctx) }) @@ -275,7 +270,7 @@ func (s *wsSuite) markAllPeersWithSyncStatus(status blockchain.NodeSyncStatus) { type mockAccountService struct{} -func (s *mockAccountService) Authorize(accountID types.AccountID, _ string, _ bool, _ bool, _ string) (sdnmessage.Account, error) { +func (s *mockAccountService) Authorize(accountID types.AccountID, _ string, _ bool, _ string) (sdnmessage.Account, error) { var err error if accountID == "d" { err = errAuth diff --git a/services/account/service.go b/services/account/service.go index 32ee584..82c6e4b 100644 --- a/services/account/service.go +++ b/services/account/service.go @@ -31,7 +31,7 @@ var ( // Accounter declares the interface of the account service type Accounter interface { - Authorize(accountID types.AccountID, secretHash string, isWebsocket bool, allowIntroductoryTierAccess bool, remoteAddr string) (sdnmessage.Account, error) + Authorize(accountID types.AccountID, secretHash string, isWebsocket bool, remoteAddr string) (sdnmessage.Account, error) } type accountFetcher interface { @@ -66,7 +66,7 @@ func NewService(sdn accountFetcher, log *log.Entry) *Service { } // Authorize authorizes an account -func (g *Service) Authorize(accountID types.AccountID, secretHash string, allowAccessByOtherAccounts, allowIntroductoryTierAccess bool, ip string) (sdnmessage.Account, error) { +func (g *Service) Authorize(accountID types.AccountID, secretHash string, allowAccessByOtherAccounts bool, ip string) (sdnmessage.Account, error) { // if gateway received request from a customer with a different account id, it should verify it with the SDN. // if the gateway does not have permission to verify account id (which mostly happen with external gateways), // SDN will return StatusUnauthorized and fail this connection. if SDN return any other error - @@ -102,7 +102,7 @@ func (g *Service) Authorize(accountID types.AccountID, secretHash string, allowA connectionAccountModel = accountRes.Account } - if !allowIntroductoryTierAccess && !connectionAccountModel.TierName.IsEnterprise() { + if !connectionAccountModel.TierName.IsEnterprise() { l.Warnf("customer account %s must be enterprise / enterprise elite / ultra but it is %v", connectionAccountModel.AccountID, connectionAccountModel.TierName) return connectionAccountModel, ErrTierTooLow diff --git a/services/block_processor.go b/services/block_processor.go index 9f56c10..3328c64 100644 --- a/services/block_processor.go +++ b/services/block_processor.go @@ -6,12 +6,13 @@ import ( "math/big" "time" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rlp" + "github.com/bloXroute-Labs/gateway/v2/bxmessage" - "github.com/bloXroute-Labs/gateway/v2/logger" + log "github.com/bloXroute-Labs/gateway/v2/logger" "github.com/bloXroute-Labs/gateway/v2/types" "github.com/bloXroute-Labs/gateway/v2/utils" - ethTypes "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/rlp" ) // error constants for identifying special processing cases @@ -19,7 +20,6 @@ var ( ErrMissingShortIDs = errors.New("missing short IDs") ErrUnknownBlockType = errors.New("unknown block type") ErrNotCompatibleBeaconBlock = errors.New("not compatible beacon block") - ErrQuoteNotExist = errors.New("quote does not exist") ) func (e *ErrAlreadyProcessed) Error() string { @@ -75,6 +75,9 @@ type bxBroadcastBSCBlobSidecar struct { } // BxBlockSSZ is a struct for SSZ encoding/decoding of a block +// To regenerate block_processor_encoding.go file: +// 1. clone github.com/prysmaticlabs/fastssz +// 2. $ go run sszgen/*.go --path {SUBSTITUTE_WITH_PATH_TO_REPO}/gateway/services --objs=BxBlockSSZ type BxBlockSSZ struct { Block []byte `ssz-max:"367832"` Txs []*bxCompressedTransaction `ssz-max:"1048576,1073741825" ssz-size:"?,?"` @@ -215,7 +218,7 @@ func (bp *blockProcessor) processSidecarsFromRLPBroadcast(rlpSidecars []bxBroadc return nil, 0, fmt.Errorf("failed to get blob sidecar by tx hash: %v", hash) } - var ethTx ethTypes.Transaction + var ethTx ethtypes.Transaction err = rlp.DecodeBytes(tx.Content(), ðTx) if err != nil { return nil, 0, fmt.Errorf("failed to decode Ethereum transaction: %v", err) @@ -225,12 +228,12 @@ func (bp *blockProcessor) processSidecarsFromRLPBroadcast(rlpSidecars []bxBroadc return nil, 0, fmt.Errorf("failed to get blob sidecar from Ethereum transaction") } - logger.Tracef("successfully decompressed eth block blob sidecar, index: %d, tx hash: %s", blobSidecar.TxIndex, blobSidecar.TxHash.String()) + log.Tracef("successfully decompressed eth block blob sidecar, index: %d, tx hash: %s", blobSidecar.TxIndex, blobSidecar.TxHash.String()) blobSidecar.TxSidecar = ethTx.BlobTxSidecar() blobSidecar.IsCompressed = false } else { - logger.Tracef("eth block blob sidecar is not compressed, tx hash: %s", blobSidecar.TxHash.String()) + log.Tracef("eth block blob sidecar is not compressed, tx hash: %s", blobSidecar.TxHash.String()) } blobSidecars[i] = blobSidecar } @@ -350,11 +353,11 @@ func (bp *blockProcessor) processBlobSidecarToRLPBroadcast(bxBlobSidecars []*typ bxTransaction, ok := bp.txStore.Get(hash) if ok && bxTransaction.AddTime().Before(maxTimestampForCompression) { - logger.Tracef("Successfully compressed eth block blob sidecar, index: %d, tx hash: %s", sidecar.TxIndex, sidecar.TxHash.String()) + log.Tracef("Successfully compressed eth block blob sidecar, index: %d, tx hash: %s", sidecar.TxIndex, sidecar.TxHash.String()) sidecar.IsCompressed = true sidecar.TxSidecar = nil } else { - logger.Tracef("Unable to compress eth block blob sidecar, sending as is: %s", sidecar.TxHash.String()) + log.Tracef("Unable to compress eth block blob sidecar, sending as is: %s", sidecar.TxHash.String()) sidecar.IsCompressed = false } @@ -402,9 +405,9 @@ func (bp *blockProcessor) newRLPBlockBroadcast(block *types.BxBlock, networkNum if err != nil { return nil, usedShortIDs, err } - logger.Tracef("Successfully processed %d blob sidecars in block %s", len(blobSidecars), block.Hash().String()) + log.Tracef("Successfully processed %d blob sidecars in block %s", len(blobSidecars), block.Hash().String()) } else { - logger.Tracef("No blob sidecars found in block %s", block.Hash().String()) + log.Tracef("No blob sidecars found in block %s", block.Hash().String()) } rlpBlock := bxBlockRLP{ diff --git a/services/block_processor_encoding.go b/services/block_processor_encoding.go index 35f6079..8f08e15 100644 --- a/services/block_processor_encoding.go +++ b/services/block_processor_encoding.go @@ -1,5 +1,5 @@ // Code generated by fastssz. DO NOT EDIT. -// Hash: fdc7d541c3ff5d95bba223e838544d6afd5816ba13b1cd9810d4abb2200096b1 +// Hash: f0045a21c6c265228c266dee91153c1421619496f07697ba5bd0fa6900517d0f package services import ( @@ -45,14 +45,17 @@ func (b *bxCompressedTransaction) UnmarshalSSZ(buf []byte) error { var o1 uint64 // Field (0) 'IsFullTransaction' - b.IsFullTransaction = ssz.UnmarshalBool(buf[0:1]) + b.IsFullTransaction, err = ssz.DecodeBool(buf[0:1]) + if err != nil { + return err + } // Offset (1) 'Transaction' if o1 = ssz.ReadOffset(buf[1:5]); o1 > size { return ssz.ErrOffset } - if o1 < 5 { + if o1 != 5 { return ssz.ErrInvalidVariableOffset } @@ -101,18 +104,10 @@ func (b *bxCompressedTransaction) HashTreeRootWith(hh *ssz.Hasher) (err error) { return } hh.PutBytes(b.Transaction) - if ssz.EnableVectorizedHTR { - hh.MerkleizeWithMixinVectorizedHTR(elemIndx, byteLen, (1073741824+31)/32) - } else { - hh.MerkleizeWithMixin(elemIndx, byteLen, (1073741824+31)/32) - } + hh.MerkleizeWithMixin(elemIndx, byteLen, (1073741824+31)/32) } - if ssz.EnableVectorizedHTR { - hh.MerkleizeVectorizedHTR(indx) - } else { - hh.Merkleize(indx) - } + hh.Merkleize(indx) return } @@ -184,7 +179,7 @@ func (b *BxBlockSSZ) UnmarshalSSZ(buf []byte) error { return ssz.ErrOffset } - if o0 < 16 { + if o0 != 16 { return ssz.ErrInvalidVariableOffset } @@ -266,11 +261,7 @@ func (b *BxBlockSSZ) HashTreeRootWith(hh *ssz.Hasher) (err error) { return } hh.PutBytes(b.Block) - if ssz.EnableVectorizedHTR { - hh.MerkleizeWithMixinVectorizedHTR(elemIndx, byteLen, (367832+31)/32) - } else { - hh.MerkleizeWithMixin(elemIndx, byteLen, (367832+31)/32) - } + hh.MerkleizeWithMixin(elemIndx, byteLen, (367832+31)/32) } // Field (1) 'Txs' @@ -286,20 +277,12 @@ func (b *BxBlockSSZ) HashTreeRootWith(hh *ssz.Hasher) (err error) { return } } - if ssz.EnableVectorizedHTR { - hh.MerkleizeWithMixinVectorizedHTR(subIndx, num, 1073741825) - } else { - hh.MerkleizeWithMixin(subIndx, num, 1073741825) - } + hh.MerkleizeWithMixin(subIndx, num, 1073741825) } // Field (2) 'Number' hh.PutUint64(b.Number) - if ssz.EnableVectorizedHTR { - hh.MerkleizeVectorizedHTR(indx) - } else { - hh.Merkleize(indx) - } + hh.Merkleize(indx) return } diff --git a/services/bx_tx_store.go b/services/bx_tx_store.go index 13ccf05..8d5eaf2 100644 --- a/services/bx_tx_store.go +++ b/services/bx_tx_store.go @@ -352,7 +352,7 @@ func (t *BxTxStore) clean() (cleaned int, cleanedShortIDs types.ShortIDsByNetwor if removeReason != "" { // remove the transaction by hash from both maps // no need to add the hash to the history as it is deleted after long time - // dec-5-2021: add to hash history to prevent a lot of reentry (BSC, Polygon) + // dec-5-2021: add to hash history to prevent a lot of reentry (BSC) t.remove(key, bxTransaction, FullReEntryProtection, removeReason) cleanedShortIDs[networkNum] = append(cleanedShortIDs[networkNum], bxTransaction.ShortIDs()...) diff --git a/services/expiring_map.go b/services/expiring_map.go new file mode 100644 index 0000000..a877055 --- /dev/null +++ b/services/expiring_map.go @@ -0,0 +1,111 @@ +package services + +import ( + "time" + + log "github.com/bloXroute-Labs/gateway/v2/logger" + "github.com/bloXroute-Labs/gateway/v2/utils" + "github.com/bloXroute-Labs/gateway/v2/utils/syncmap" +) + +// Element represents an element stored in the history. +type Element[T any] struct { + Expiration int64 + Value T +} + +// ExpiringMap holds hashes that we have seen in the past +type ExpiringMap[T any] struct { + name string // for logging + clock utils.Clock + cleanupFreq time.Duration + data *syncmap.SyncMap[string, *Element[T]] +} + +// NewExpiringMap creates a new object +func NewExpiringMap[T any](name string, cleanupFreq time.Duration) ExpiringMap[T] { + return newExpiringMap[T](name, utils.RealClock{}, cleanupFreq) +} + +func newExpiringMap[T any](name string, clock utils.Clock, cleanupFreq time.Duration) ExpiringMap[T] { + em := ExpiringMap[T]{ + name: name, + clock: clock, + cleanupFreq: cleanupFreq, + data: syncmap.NewStringMapOf[*Element[T]](), + } + go em.cleanup() + return em +} + +// Add adds the hash for the duration +func (em ExpiringMap[T]) Add(hash string, value T, expiration time.Duration) { + expirationTime := em.clock.Now().Add(expiration).UnixNano() + em.data.Store(hash, &Element[T]{Expiration: expirationTime, Value: value}) +} + +// Remove removes the hash from the data +func (em ExpiringMap[T]) Remove(hash string) { + em.data.Delete(hash) +} + +// SetIfAbsent Sets the given value under the specified key if no value was associated with it. +func (em ExpiringMap[T]) SetIfAbsent(hash string, value T, expiration time.Duration) bool { + expirationTime := em.clock.Now().Add(expiration).UnixNano() + _, exists := em.data.LoadOrStore(hash, &Element[T]{Expiration: expirationTime, Value: value}) + + return !exists +} + +// Exists checks if hash is in history and if found returns the expiration status +func (em ExpiringMap[T]) Exists(hash string) (bool, bool) { + expired := false + if element, ok := em.data.Load(hash); ok { + if em.clock.Now().UnixNano() > element.Expiration { + expired = true + } + return true, expired + } + return false, expired +} + +// Get checks if hash is in history and if found returns the value +func (em ExpiringMap[T]) Get(hash string) (*T, bool) { + if element, ok := em.data.Load(hash); ok { + return &element.Value, true + } + return nil, false +} + +// All iterates over all elements and applies given function +func (em ExpiringMap[T]) All(process func(k string, v *Element[T]) bool) { + em.data.Range(process) +} + +// Count provides the size of the history +func (em ExpiringMap[T]) Count() int { + return em.data.Size() +} + +func (em ExpiringMap[T]) cleanup() { + ticker := em.clock.Ticker(em.cleanupFreq) + for range ticker.Alert() { + itemsCleaned := em.clean() + log.Debugf("cleaned %v entries in ExpiringMap[%v], the remaining entries are %v", itemsCleaned, em.name, em.Count()) + } +} + +func (em ExpiringMap[T]) clean() int { + historyCleaned := 0 + timeNow := em.clock.Now().UnixNano() + + em.data.Range(func(key string, element *Element[T]) bool { + if timeNow > element.Expiration { + em.data.Delete(key) + historyCleaned++ + } + return true + }) + + return historyCleaned +} diff --git a/services/intents_manager.go b/services/intents_manager.go deleted file mode 100644 index 2414acf..0000000 --- a/services/intents_manager.go +++ /dev/null @@ -1,325 +0,0 @@ -package services - -import ( - "context" - "sync" - "sync/atomic" - "time" - - "github.com/bloXroute-Labs/gateway/v2/bxmessage" -) - -const ( - solutionsForIntentExpiry = time.Second * 10 - expiredSolutionsCheck = time.Second -) - -// IntentsManager interface responsible for managing intents and solutions -type IntentsManager interface { - IntentSubscriptionsManager - IntentSolutionsManager - IntentsStatsManager -} - -// IntentSubscriptionsManager responsible for managing client subscriptions -type IntentSubscriptionsManager interface { - SubscriptionMessages() []bxmessage.Message - AddIntentsSubscription(solverAddr string, hash, signature []byte) - RmIntentsSubscription(solverAddr string) - IntentsSubscriptionExists(solverAddr string) bool - AddSolutionsSubscription(dAppAddr string, hash, signature []byte) - RmSolutionsSubscription(dAppAddr string) - SolutionsSubscriptionExists(dAppAddr string) bool - AddQuotesSubscription(dAppAddr string) uint64 - RmQuotesSubscription(dAppAddr string) (uint64, error) -} - -// IntentSolutionsManager responsible for managing internal short-lived gw <-> relay(s) subscription -type IntentSolutionsManager interface { - AddIntentOfInterest(intentID string) - AppendSolutionsForIntent(solutions *bxmessage.IntentSolutions) // receive from relays - AppendSolutionForIntent(solution *bxmessage.IntentSolution) // receive from relays - SolutionsForIntent(intentID string) []bxmessage.IntentSolution - CleanupExpiredSolutions(ctx context.Context) -} - -// IntentsStatsManager keeps track of intent, solution and quote submissions -type IntentsStatsManager interface { - IncIntentSubmissions() - IncSolutionSubmissions() - IncQuoteSubmissions() - TotalIntentSubmissions() uint64 - TotalSolutionSubmissions() uint64 - TotalQuoteSubmissions() uint64 -} - -// IntentsManagerImpl is the implementation of IntentsManager -type IntentsManagerImpl struct { - intentsSubscriptions map[string]*subscription - isMx *sync.RWMutex - solutionsSubscriptions map[string]*subscription - ssMx *sync.RWMutex - solutionsForIntent map[string]solutionsForIntentWExp // intentID -> solutions - sfiMx *sync.RWMutex - quotesSubscriptions map[string]*quoteSubscription - quotesMx *sync.RWMutex - intentsCounter, solutionsCounter, quotesCounter *atomic.Uint64 -} - -type quoteSubscription struct { - addr string - counter uint64 -} - -type subscription struct { - addr string - hash []byte - signature []byte -} - -type solutionsForIntentWExp struct { - solutions map[string]bxmessage.IntentSolution // solutionID -> solution - expiry int64 -} - -// NewIntentsManager creates a new IntentsManager -func NewIntentsManager() *IntentsManagerImpl { - return &IntentsManagerImpl{ - intentsSubscriptions: make(map[string]*subscription), - isMx: new(sync.RWMutex), - solutionsSubscriptions: make(map[string]*subscription), - ssMx: new(sync.RWMutex), - solutionsForIntent: make(map[string]solutionsForIntentWExp), - sfiMx: new(sync.RWMutex), - quotesSubscriptions: make(map[string]*quoteSubscription), - quotesMx: new(sync.RWMutex), - intentsCounter: &atomic.Uint64{}, - solutionsCounter: &atomic.Uint64{}, - quotesCounter: &atomic.Uint64{}, - } -} - -// SubscriptionMessages returns all the subscription messages -func (i *IntentsManagerImpl) SubscriptionMessages() []bxmessage.Message { - var m = make([]bxmessage.Message, 0) - - i.isMx.RLock() - for _, v := range i.intentsSubscriptions { - m = append(m, bxmessage.NewIntentsSubscription(v.addr, v.hash, v.signature)) - } - i.isMx.RUnlock() - - i.ssMx.RLock() - for _, v := range i.solutionsSubscriptions { - m = append(m, bxmessage.NewSolutionsSubscription(v.addr, v.hash, v.signature)) - } - i.ssMx.RUnlock() - - i.quotesMx.RLock() - for _, v := range i.quotesSubscriptions { - m = append(m, bxmessage.NewQuotesSubscription(v.addr)) - } - i.quotesMx.RUnlock() - - return m -} - -// AddIntentsSubscription adds an intent subscription -func (i *IntentsManagerImpl) AddIntentsSubscription(solverAddr string, hash, signature []byte) { - i.isMx.Lock() - defer i.isMx.Unlock() - i.intentsSubscriptions[solverAddr] = &subscription{ - addr: solverAddr, - hash: hash, - signature: signature, - } -} - -// RmIntentsSubscription removes an intent subscription -func (i *IntentsManagerImpl) RmIntentsSubscription(solverAddr string) { - i.isMx.Lock() - defer i.isMx.Unlock() - delete(i.intentsSubscriptions, solverAddr) -} - -// IntentsSubscriptionExists checks if an intent subscription exists -func (i *IntentsManagerImpl) IntentsSubscriptionExists(solverAddr string) bool { - i.isMx.RLock() - defer i.isMx.RUnlock() - _, ok := i.intentsSubscriptions[solverAddr] - return ok -} - -// AddQuotesSubscription adds a quote subscription, return how many subscriptions there are -func (i *IntentsManagerImpl) AddQuotesSubscription(dAppAddr string) uint64 { - i.quotesMx.Lock() - defer i.quotesMx.Unlock() - if sub, exist := i.quotesSubscriptions[dAppAddr]; exist { - sub.counter++ - return sub.counter - } - i.quotesSubscriptions[dAppAddr] = "eSubscription{ - addr: dAppAddr, - counter: 1, - } - return 1 -} - -// AddSolutionsSubscription adds a solutions subscription -func (i *IntentsManagerImpl) AddSolutionsSubscription(dappAddr string, hash, signature []byte) { - i.ssMx.Lock() - defer i.ssMx.Unlock() - i.solutionsSubscriptions[dappAddr] = &subscription{ - addr: dappAddr, - hash: hash, - signature: signature, - } -} - -// RmQuotesSubscription removes a quote subscription -func (i *IntentsManagerImpl) RmQuotesSubscription(dAppAddr string) (uint64, error) { - i.quotesMx.Lock() - defer i.quotesMx.Unlock() - if sub, exist := i.quotesSubscriptions[dAppAddr]; exist { - sub.counter-- - if sub.counter == 0 { - delete(i.quotesSubscriptions, dAppAddr) - } - return sub.counter, nil - } - return 0, ErrQuoteNotExist -} - -// RmSolutionsSubscription removes a solutions subscription -func (i *IntentsManagerImpl) RmSolutionsSubscription(dAppAddr string) { - i.ssMx.Lock() - defer i.ssMx.Unlock() - delete(i.solutionsSubscriptions, dAppAddr) -} - -// SolutionsSubscriptionExists checks if a solutions subscription exists -func (i *IntentsManagerImpl) SolutionsSubscriptionExists(dAppAddr string) bool { - i.ssMx.Lock() - defer i.ssMx.Unlock() - _, ok := i.solutionsSubscriptions[dAppAddr] - return ok -} - -// AddIntentOfInterest adds a record that we are interested in solutions for an intent from the relay(s) -func (i *IntentsManagerImpl) AddIntentOfInterest(intentID string) { - i.sfiMx.Lock() - defer i.sfiMx.Unlock() - - sol, ok := i.solutionsForIntent[intentID] // check if we already have a record - if ok { - sol.expiry = time.Now().Unix() + int64(solutionsForIntentExpiry.Seconds()) // reset expiry - i.solutionsForIntent[intentID] = sol - return - } - - i.solutionsForIntent[intentID] = solutionsForIntentWExp{ - solutions: make(map[string]bxmessage.IntentSolution), - expiry: time.Now().Unix() + int64(solutionsForIntentExpiry.Seconds()), - } -} - -// AppendSolutionsForIntent adds solutions for an intent from the relay(s). -// Expiration time is not updated here, since if there is no interest in the intent, we should not keep the solutions. -func (i *IntentsManagerImpl) AppendSolutionsForIntent(message *bxmessage.IntentSolutions) { - i.sfiMx.Lock() - defer i.sfiMx.Unlock() - - for _, s := range message.Solutions() { - sol, ok := i.solutionsForIntent[s.IntentID] - if !ok { - continue // ignore solutions for intents we are not interested in - } - - sol.solutions[s.ID] = s // add solution - i.solutionsForIntent[s.IntentID] = sol // update - } -} - -// AppendSolutionForIntent adds a solution for an intent from the relay(s) -// Expiration time is not updated here, since if there is no interest in the intent, we should not keep the solutions. -func (i *IntentsManagerImpl) AppendSolutionForIntent(message *bxmessage.IntentSolution) { - i.sfiMx.Lock() - defer i.sfiMx.Unlock() - - sol, ok := i.solutionsForIntent[message.IntentID] - if !ok { - return - } - - sol.solutions[message.ID] = *message - i.solutionsForIntent[message.IntentID] = sol -} - -// SolutionsForIntent returns solutions for an intent -func (i *IntentsManagerImpl) SolutionsForIntent(intentID string) []bxmessage.IntentSolution { - i.sfiMx.Lock() - defer i.sfiMx.Unlock() - - sol, ok := i.solutionsForIntent[intentID] - if !ok { - return nil - } - - solutions := make([]bxmessage.IntentSolution, 0, len(sol.solutions)) - for _, s := range sol.solutions { - solutions = append(solutions, s) - } - - return solutions -} - -// CleanupExpiredSolutions removes expired solutions from memory -func (i *IntentsManagerImpl) CleanupExpiredSolutions(ctx context.Context) { - ticker := time.NewTicker(expiredSolutionsCheck) - defer ticker.Stop() - - for { - select { - case <-ctx.Done(): - return - case <-ticker.C: - i.sfiMx.Lock() - for intentID, v := range i.solutionsForIntent { - if time.Now().Unix() > v.expiry { - delete(i.solutionsForIntent, intentID) - } - } - i.sfiMx.Unlock() - } - } -} - -// IncIntentSubmissions increments the intent submissions counter by 1 -func (i *IntentsManagerImpl) IncIntentSubmissions() { - i.intentsCounter.Add(1) -} - -// IncSolutionSubmissions increments the solution submissions counter by 1 -func (i *IntentsManagerImpl) IncSolutionSubmissions() { - i.solutionsCounter.Add(1) -} - -// IncQuoteSubmissions increments the quote submissions counter by 1 -func (i *IntentsManagerImpl) IncQuoteSubmissions() { - i.quotesCounter.Add(1) -} - -// TotalIntentSubmissions returns the total number of intent submissions -func (i *IntentsManagerImpl) TotalIntentSubmissions() uint64 { - return i.intentsCounter.Load() -} - -// TotalSolutionSubmissions returns the total number of solution submissions -func (i *IntentsManagerImpl) TotalSolutionSubmissions() uint64 { - return i.solutionsCounter.Load() -} - -// TotalQuoteSubmissions returns the total number of quote submissions -func (i *IntentsManagerImpl) TotalQuoteSubmissions() uint64 { - return i.quotesCounter.Load() -} diff --git a/services/intents_manager_test.go b/services/intents_manager_test.go deleted file mode 100644 index b48b5eb..0000000 --- a/services/intents_manager_test.go +++ /dev/null @@ -1,70 +0,0 @@ -package services - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestIntentsManager(t *testing.T) { - t.Run("SubscriptionMessages", func(t *testing.T) { - var target = NewIntentsManager() - target.AddIntentsSubscription("1", nil, nil) - target.AddSolutionsSubscription("1", nil, nil) - require.Len(t, target.SubscriptionMessages(), 2) - }) - - t.Run("AddIntentsSubscription", func(t *testing.T) { - var target = NewIntentsManager() - target.AddIntentsSubscription("1", nil, nil) - _, ok := target.intentsSubscriptions["1"] - require.True(t, ok) - }) - - t.Run("RmIntentsSubscription", func(t *testing.T) { - var target = NewIntentsManager() - target.AddIntentsSubscription("1", nil, nil) - _, ok := target.intentsSubscriptions["1"] - require.True(t, ok) - - target.RmIntentsSubscription("1") - _, ok = target.intentsSubscriptions["1"] - require.False(t, ok) - }) - - t.Run("IntentsSubscriptionExists", func(t *testing.T) { - var target = NewIntentsManager() - target.AddIntentsSubscription("1", nil, nil) - require.True(t, target.IntentsSubscriptionExists("1")) - - target.RmIntentsSubscription("1") - require.False(t, target.IntentsSubscriptionExists("1")) - }) - - t.Run("AddSolutionsSubscription", func(t *testing.T) { - var target = NewIntentsManager() - target.AddSolutionsSubscription("1", nil, nil) - _, ok := target.solutionsSubscriptions["1"] - require.True(t, ok) - }) - - t.Run("RmSolutionsSubscription", func(t *testing.T) { - var target = NewIntentsManager() - target.AddSolutionsSubscription("1", nil, nil) - _, ok := target.solutionsSubscriptions["1"] - require.True(t, ok) - - target.RmSolutionsSubscription("1") - _, ok = target.solutionsSubscriptions["1"] - require.False(t, ok) - }) - - t.Run("SolutionsSubscriptionExists", func(t *testing.T) { - var target = NewIntentsManager() - target.AddSolutionsSubscription("1", nil, nil) - require.True(t, target.SolutionsSubscriptionExists("1")) - - target.RmSolutionsSubscription("1") - require.False(t, target.SolutionsSubscriptionExists("1")) - }) -} diff --git a/services/statistics/fluentd_stats.go b/services/statistics/fluentd_stats.go index b4102ff..abb393a 100644 --- a/services/statistics/fluentd_stats.go +++ b/services/statistics/fluentd_stats.go @@ -48,7 +48,6 @@ type Stats interface { mevBuilderNames []string, uuid string, targetBlockNumber int64, minTimestamp int, maxTimestamp int) LogUnsubscribeStats(subscriptionID string, feedName types.FeedType, networkNum types.NetworkNum, accountID types.AccountID, tierName sdnmessage.AccountTier) LogSDKInfo(blockchain, method, sourceCode, version string, accountID types.AccountID, feed types.FeedConnectionType, start, end time.Time) - BundleSentToBuilderStats(timestamp time.Time, builderName string, bundleHash string, blockNumber string, uuid string, networkNum types.NetworkNum, accountID types.AccountID, accountTier sdnmessage.AccountTier, builderURL string, statusCode int) AddBuilderGatewaySentBundleToMEVBuilderEvent(timestamp time.Time, builderName, bundleHash, blockNumber, uuid, builderURL string, networkNum types.NetworkNum, accountID types.AccountID, accountTier sdnmessage.AccountTier, statusCode int) AddBlobEvent(name, eventSubjectID string, sourceID types.NodeID, networkNum types.NetworkNum, startTime, endTime time.Time, originalSize, compressSize int, blobIndex uint32, blockHash string) @@ -90,10 +89,6 @@ func (NoStats) LogUnsubscribeStats(string, types.FeedType, types.NetworkNum, typ func (NoStats) LogSDKInfo(_, _, _, _ string, _ types.AccountID, _ types.FeedConnectionType, _, _ time.Time) { } -// BundleSentToBuilderStats does nothing -func (NoStats) BundleSentToBuilderStats(_ time.Time, _ string, _ string, _ string, _ string, _ types.NetworkNum, _ types.AccountID, _ sdnmessage.AccountTier, _ string, _ int) { -} - // AddBuilderGatewaySentBundleToMEVBuilderEvent does nothing func (NoStats) AddBuilderGatewaySentBundleToMEVBuilderEvent(_ time.Time, _, _, _, _, _ string, _ types.NetworkNum, _ types.AccountID, _ sdnmessage.AccountTier, _ int) { @@ -455,34 +450,6 @@ func (s FluentdStats) LogSDKInfo(blockchain, method, sourceCode, version string, s.LogToFluentD(record, now, "stats.sdk.events") } -// BundleSentToBuilderStats generates a fluentd STATS event -func (s FluentdStats) BundleSentToBuilderStats(estimatedBundleReceivedTime time.Time, builderName string, bundleHash string, blockNumber string, uuid string, networkNum types.NetworkNum, accountID types.AccountID, accountTier sdnmessage.AccountTier, builderURL string, statusCode int) { - now := time.Now() - blockNumberInt64, err := hex2int64(blockNumber) - if err != nil { - log.Errorf("BundleSentToBuilderStats: parse blockNumber: %s", blockNumber) - return - } - - record := Record{ - Type: "bundleSentToExternalBuilder", - Data: bundleSentToBuilderRecord{ - EstimatedBundleReceivedTime: estimatedBundleReceivedTime.Format(DateFormat), - BundleHash: bundleHash, - BlockNumber: blockNumberInt64, - BuilderName: builderName, - UUID: uuid, - NetworkNum: networkNum, - AccountID: accountID, - AccountTier: accountTier, - BuilderURL: builderURL, - StatusCode: statusCode, - }, - } - - s.LogToFluentD(record, now, "stats.bundles_sent_to_external_builder") -} - // hex2int64 takes a hex string and returns the parsed integer value. // It handles hex strings with or without the "0x" prefix. func hex2int64(hexStr string) (int64, error) { @@ -506,7 +473,7 @@ func (s FluentdStats) AddBuilderGatewaySentBundleToMEVBuilderEvent(timestamp tim record := Record{ Type: "BuilderGatewaySentBundleToMEVBuilder", - Data: bundleSentToBuilderRecord{ + Data: BundleSentToBuilderRecord{ BundleHash: bundleHash, BlockNumber: blockNumberInt64, BuilderName: builderName, diff --git a/services/statistics/record.go b/services/statistics/record.go index e53aa84..7b908a4 100644 --- a/services/statistics/record.go +++ b/services/statistics/record.go @@ -62,7 +62,8 @@ type bundleRecord struct { SentGatewayPeers int `json:"gateway_peers,omitempty"` } -type bundleSentToBuilderRecord struct { +// BundleSentToBuilderRecord represents a record of a bundle sent to a builder +type BundleSentToBuilderRecord struct { EstimatedBundleReceivedTime string `json:"estimated_bundle_received_time"` BundleHash string `json:"bundle_hash"` BlockNumber int64 `json:"block_number"` @@ -74,6 +75,7 @@ type bundleSentToBuilderRecord struct { AccountTier sdnmessage.AccountTier `json:"account_tier"` BuilderURL string `json:"builder_url"` StatusCode int `json:"status_code"` + ErrorMessage string `json:"error_message"` } type ethBlockContent struct { diff --git a/services/user_intents_store.go b/services/user_intents_store.go deleted file mode 100644 index 57421ba..0000000 --- a/services/user_intents_store.go +++ /dev/null @@ -1,18 +0,0 @@ -package services - -import ( - "github.com/bloXroute-Labs/gateway/v2/types" - "github.com/bloXroute-Labs/gateway/v2/utils/syncmap" -) - -// UserIntentStore is syncmap for intents -type UserIntentStore struct { - Cache *syncmap.SyncMap[string, types.UserIntent] -} - -// NewUserIntentsStore constructor for UserIntentStore -func NewUserIntentsStore() *UserIntentStore { - return &UserIntentStore{ - Cache: syncmap.NewStringMapOf[types.UserIntent](), - } -} diff --git a/services/validator/manager.go b/services/validator/manager.go index f585648..8f6cdb6 100644 --- a/services/validator/manager.go +++ b/services/validator/manager.go @@ -49,8 +49,8 @@ func NewManager(nextValidatorMap *orderedmap.OrderedMap[uint64, string], validat // ProcessNextValidatorTx - sets next validator wallets if accessible and returns bool indicating if tx is pending reevaluation due to inaccessible first validator for BSC func (m *Manager) ProcessNextValidatorTx(tx *bxmessage.Tx, fallback uint16, networkNum types.NetworkNum, source connections.Conn) (bool, error) { - if networkNum != bxgateway.BSCMainnetNum && networkNum != bxgateway.PolygonMainnetNum { - return false, errors.New("currently next_validator is only supported on BSC and Polygon networks, please contact bloXroute support") + if networkNum != bxgateway.BSCMainnetNum { + return false, errors.New("currently next_validator is only supported on BSC networks, please contact bloXroute support") } if m == nil { @@ -66,43 +66,31 @@ func (m *Manager) ProcessNextValidatorTx(tx *bxmessage.Tx, fallback uint16, netw return false, errors.New("can't send tx with next_validator because the gateway encountered an issue fetching the epoch block, please try again later or contact bloXroute support") } - if networkNum == bxgateway.BSCMainnetNum { - n1Validator := n2Validator.Prev() - n1ValidatorAccessible := false - n1Wallet := "" - if n1Validator != nil { - n1Wallet = n1Validator.Value - accessible, exist := m.validatorStatusMap.Load(n1Wallet) - if exist { - n1ValidatorAccessible = accessible - } - } - - if n1ValidatorAccessible { - tx.SetWalletID(0, n1Wallet) - } else { - blockIntervalBSC := bxgateway.NetworkToBlockDuration[bxgateway.BSCMainnet] - if fallback != 0 && fallback < uint16(blockIntervalBSC.Milliseconds()) { - return false, nil - } - m.pendingBSCNextValidatorTxHashToInfo[tx.Hash().String()] = PendingNextValidatorTxInfo{ - Tx: tx, - Fallback: fallback, - TimeOfRequest: time.Now(), - Source: source, - } - return true, nil + n1Validator := n2Validator.Prev() + n1ValidatorAccessible := false + n1Wallet := "" + if n1Validator != nil { + n1Wallet = n1Validator.Value + accessible, exist := m.validatorStatusMap.Load(n1Wallet) + if exist { + n1ValidatorAccessible = accessible } } - if networkNum == bxgateway.PolygonMainnetNum || networkNum == bxgateway.PolygonMumbaiNum { - n1Validator := n2Validator.Prev() - if n1Validator != nil { - tx.SetWalletID(0, n1Validator.Value) - tx.SetWalletID(1, n2Validator.Value) - } else { - tx.SetWalletID(0, n2Validator.Value) + if n1ValidatorAccessible { + tx.SetWalletID(0, n1Wallet) + } else { + blockIntervalBSC := bxgateway.NetworkToBlockDuration[bxgateway.BSCMainnet] + if fallback != 0 && int64(fallback) < blockIntervalBSC.Milliseconds() { + return false, nil + } + m.pendingBSCNextValidatorTxHashToInfo[tx.Hash().String()] = PendingNextValidatorTxInfo{ + Tx: tx, + Fallback: fallback, + TimeOfRequest: time.Now(), + Source: source, } + return true, nil } return false, nil diff --git a/test/bxmock/beacon_block.go b/test/bxmock/beacon_block.go index 5b303ff..05cf2b9 100644 --- a/test/bxmock/beacon_block.go +++ b/test/bxmock/beacon_block.go @@ -7,13 +7,14 @@ import ( "github.com/prysmaticlabs/go-bitfield" - bxcommoneth "github.com/bloXroute-Labs/gateway/v2/blockchain/common" "github.com/prysmaticlabs/prysm/v5/config/params" "github.com/prysmaticlabs/prysm/v5/consensus-types/blocks" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" enginev1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/stretchr/testify/assert" + + bxcommoneth "github.com/bloXroute-Labs/gateway/v2/blockchain/common" ) // NewDenebBeaconBlock creates beacon block using execution layer block diff --git a/test/fixtures/eth.go b/test/fixtures/eth.go index 25a4183..d4b765e 100644 --- a/test/fixtures/eth.go +++ b/test/fixtures/eth.go @@ -75,15 +75,9 @@ const DynamicFeeTransactionForRPCInterface = "02f86080800f1f64940000000000000000 // LegacyTransactionBSC is a sample encoded transaction of the legacy format const LegacyTransactionBSC = "f901af83011c7385012a05f2008313d28e946eb0569afb79ec893c8212cbf4dbad74eea666aa80b901441171c9aa0000000000000000000000000000000000000000000000263706a79a5bd74d570000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c00000000000000000000000096058f8c3e16576d9bd68766f3836d9a33158f89000000000000000000000000b8b4383b49d451bbea63bc4421466e1086da6f1800000000000000000000000056c6c72193f26014cda330dc7463bdf45c1b7a7000000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e000000000000000000000000cde540d7eafe93ac5fe6233bee57e1270d3e330f00000000000000000000000000000000000000000000000000000000000026f700000000000000000000000000000000000000000000000000000000000026f28193a01327654ce49fd75daccf08a25d50841303f4d222ea49589e422a6bc4a99b90efa06087a1dfefb50c82cb4eaf120c1424bff4af651fd03690e759a71b2fa8a632e7" -// LegacyTransactionPolygon is a sample encoded transaction of the legacy format -const LegacyTransactionPolygon = "f866348522ecb25c0082520894bbdef5f330f08afd93a7696f4ea79af4a41d0f808080820136a00d90517c9b2380c72a81fa7c8cbb44a18b9db736d7c074a924d36e83303718b0a032ae426dd1ecbee059908258ce0db8cad4b4fef7b71605e8dc69d1ca05afe5f8" - // LegacyTransactionBSCHash is the hash of the LegacyTransactionBSC const LegacyTransactionBSCHash = "afbabdbe8f2a822cd27d5a8fa50a69e6fb86e73e2f53cc81c3abf6594b5b47f2" -// LegacyTransactionPolygonHash is the hash of the LegacyTransactionPolygon -const LegacyTransactionPolygonHash = "1cae0c2efecb15d36bc7db9917130cf5d03db25e036ffd03dc772f268b7a216b" - // BigValueTransactionHashBSC hash of big value transaction const BigValueTransactionHashBSC = "0x54c6d3a0130d9321fe59f503a54c8448cb2a64f61556bbcf13e60ea64b341c80" diff --git a/test/mock/gw_intents_manager_mock.go b/test/mock/gw_intents_manager_mock.go deleted file mode 100644 index 07c8ba2..0000000 --- a/test/mock/gw_intents_manager_mock.go +++ /dev/null @@ -1,628 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: ./services/intents_manager.go -// -// Generated by this command: -// -// mockgen -destination ./test/mock/gw_intents_manager_mock.go -package mock -source ./services/intents_manager.go IntentsManager -// - -// Package mock is a generated GoMock package. -package mock - -import ( - context "context" - reflect "reflect" - - bxmessage "github.com/bloXroute-Labs/gateway/v2/bxmessage" - gomock "go.uber.org/mock/gomock" -) - -// MockIntentsManager is a mock of IntentsManager interface. -type MockIntentsManager struct { - ctrl *gomock.Controller - recorder *MockIntentsManagerMockRecorder -} - -// MockIntentsManagerMockRecorder is the mock recorder for MockIntentsManager. -type MockIntentsManagerMockRecorder struct { - mock *MockIntentsManager -} - -// NewMockIntentsManager creates a new mock instance. -func NewMockIntentsManager(ctrl *gomock.Controller) *MockIntentsManager { - mock := &MockIntentsManager{ctrl: ctrl} - mock.recorder = &MockIntentsManagerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockIntentsManager) EXPECT() *MockIntentsManagerMockRecorder { - return m.recorder -} - -// AddIntentOfInterest mocks base method. -func (m *MockIntentsManager) AddIntentOfInterest(intentID string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AddIntentOfInterest", intentID) -} - -// AddIntentOfInterest indicates an expected call of AddIntentOfInterest. -func (mr *MockIntentsManagerMockRecorder) AddIntentOfInterest(intentID interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddIntentOfInterest", reflect.TypeOf((*MockIntentsManager)(nil).AddIntentOfInterest), intentID) -} - -// AddIntentsSubscription mocks base method. -func (m *MockIntentsManager) AddIntentsSubscription(solverAddr string, hash, signature []byte) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AddIntentsSubscription", solverAddr, hash, signature) -} - -// AddIntentsSubscription indicates an expected call of AddIntentsSubscription. -func (mr *MockIntentsManagerMockRecorder) AddIntentsSubscription(solverAddr, hash, signature interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddIntentsSubscription", reflect.TypeOf((*MockIntentsManager)(nil).AddIntentsSubscription), solverAddr, hash, signature) -} - -// AddQuotesSubscription mocks base method. -func (m *MockIntentsManager) AddQuotesSubscription(dAppAddr string) uint64 { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AddQuotesSubscription", dAppAddr) - ret0, _ := ret[0].(uint64) - return ret0 -} - -// AddQuotesSubscription indicates an expected call of AddQuotesSubscription. -func (mr *MockIntentsManagerMockRecorder) AddQuotesSubscription(dAppAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddQuotesSubscription", reflect.TypeOf((*MockIntentsManager)(nil).AddQuotesSubscription), dAppAddr) -} - -// AddSolutionsSubscription mocks base method. -func (m *MockIntentsManager) AddSolutionsSubscription(dAppAddr string, hash, signature []byte) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AddSolutionsSubscription", dAppAddr, hash, signature) -} - -// AddSolutionsSubscription indicates an expected call of AddSolutionsSubscription. -func (mr *MockIntentsManagerMockRecorder) AddSolutionsSubscription(dAppAddr, hash, signature interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddSolutionsSubscription", reflect.TypeOf((*MockIntentsManager)(nil).AddSolutionsSubscription), dAppAddr, hash, signature) -} - -// AppendSolutionForIntent mocks base method. -func (m *MockIntentsManager) AppendSolutionForIntent(solution *bxmessage.IntentSolution) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AppendSolutionForIntent", solution) -} - -// AppendSolutionForIntent indicates an expected call of AppendSolutionForIntent. -func (mr *MockIntentsManagerMockRecorder) AppendSolutionForIntent(solution interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendSolutionForIntent", reflect.TypeOf((*MockIntentsManager)(nil).AppendSolutionForIntent), solution) -} - -// AppendSolutionsForIntent mocks base method. -func (m *MockIntentsManager) AppendSolutionsForIntent(solutions *bxmessage.IntentSolutions) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AppendSolutionsForIntent", solutions) -} - -// AppendSolutionsForIntent indicates an expected call of AppendSolutionsForIntent. -func (mr *MockIntentsManagerMockRecorder) AppendSolutionsForIntent(solutions interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendSolutionsForIntent", reflect.TypeOf((*MockIntentsManager)(nil).AppendSolutionsForIntent), solutions) -} - -// CleanupExpiredSolutions mocks base method. -func (m *MockIntentsManager) CleanupExpiredSolutions(ctx context.Context) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "CleanupExpiredSolutions", ctx) -} - -// CleanupExpiredSolutions indicates an expected call of CleanupExpiredSolutions. -func (mr *MockIntentsManagerMockRecorder) CleanupExpiredSolutions(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CleanupExpiredSolutions", reflect.TypeOf((*MockIntentsManager)(nil).CleanupExpiredSolutions), ctx) -} - -// IncIntentSubmissions mocks base method. -func (m *MockIntentsManager) IncIntentSubmissions() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "IncIntentSubmissions") -} - -// IncIntentSubmissions indicates an expected call of IncIntentSubmissions. -func (mr *MockIntentsManagerMockRecorder) IncIntentSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IncIntentSubmissions", reflect.TypeOf((*MockIntentsManager)(nil).IncIntentSubmissions)) -} - -// IncQuoteSubmissions mocks base method. -func (m *MockIntentsManager) IncQuoteSubmissions() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "IncQuoteSubmissions") -} - -// IncQuoteSubmissions indicates an expected call of IncQuoteSubmissions. -func (mr *MockIntentsManagerMockRecorder) IncQuoteSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IncQuoteSubmissions", reflect.TypeOf((*MockIntentsManager)(nil).IncQuoteSubmissions)) -} - -// IncSolutionSubmissions mocks base method. -func (m *MockIntentsManager) IncSolutionSubmissions() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "IncSolutionSubmissions") -} - -// IncSolutionSubmissions indicates an expected call of IncSolutionSubmissions. -func (mr *MockIntentsManagerMockRecorder) IncSolutionSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IncSolutionSubmissions", reflect.TypeOf((*MockIntentsManager)(nil).IncSolutionSubmissions)) -} - -// IntentsSubscriptionExists mocks base method. -func (m *MockIntentsManager) IntentsSubscriptionExists(solverAddr string) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IntentsSubscriptionExists", solverAddr) - ret0, _ := ret[0].(bool) - return ret0 -} - -// IntentsSubscriptionExists indicates an expected call of IntentsSubscriptionExists. -func (mr *MockIntentsManagerMockRecorder) IntentsSubscriptionExists(solverAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IntentsSubscriptionExists", reflect.TypeOf((*MockIntentsManager)(nil).IntentsSubscriptionExists), solverAddr) -} - -// RmIntentsSubscription mocks base method. -func (m *MockIntentsManager) RmIntentsSubscription(solverAddr string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "RmIntentsSubscription", solverAddr) -} - -// RmIntentsSubscription indicates an expected call of RmIntentsSubscription. -func (mr *MockIntentsManagerMockRecorder) RmIntentsSubscription(solverAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RmIntentsSubscription", reflect.TypeOf((*MockIntentsManager)(nil).RmIntentsSubscription), solverAddr) -} - -// RmQuotesSubscription mocks base method. -func (m *MockIntentsManager) RmQuotesSubscription(dAppAddr string) (uint64, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RmQuotesSubscription", dAppAddr) - ret0, _ := ret[0].(uint64) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// RmQuotesSubscription indicates an expected call of RmQuotesSubscription. -func (mr *MockIntentsManagerMockRecorder) RmQuotesSubscription(dAppAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RmQuotesSubscription", reflect.TypeOf((*MockIntentsManager)(nil).RmQuotesSubscription), dAppAddr) -} - -// RmSolutionsSubscription mocks base method. -func (m *MockIntentsManager) RmSolutionsSubscription(dAppAddr string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "RmSolutionsSubscription", dAppAddr) -} - -// RmSolutionsSubscription indicates an expected call of RmSolutionsSubscription. -func (mr *MockIntentsManagerMockRecorder) RmSolutionsSubscription(dAppAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RmSolutionsSubscription", reflect.TypeOf((*MockIntentsManager)(nil).RmSolutionsSubscription), dAppAddr) -} - -// SolutionsForIntent mocks base method. -func (m *MockIntentsManager) SolutionsForIntent(intentID string) []bxmessage.IntentSolution { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SolutionsForIntent", intentID) - ret0, _ := ret[0].([]bxmessage.IntentSolution) - return ret0 -} - -// SolutionsForIntent indicates an expected call of SolutionsForIntent. -func (mr *MockIntentsManagerMockRecorder) SolutionsForIntent(intentID interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SolutionsForIntent", reflect.TypeOf((*MockIntentsManager)(nil).SolutionsForIntent), intentID) -} - -// SolutionsSubscriptionExists mocks base method. -func (m *MockIntentsManager) SolutionsSubscriptionExists(dAppAddr string) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SolutionsSubscriptionExists", dAppAddr) - ret0, _ := ret[0].(bool) - return ret0 -} - -// SolutionsSubscriptionExists indicates an expected call of SolutionsSubscriptionExists. -func (mr *MockIntentsManagerMockRecorder) SolutionsSubscriptionExists(dAppAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SolutionsSubscriptionExists", reflect.TypeOf((*MockIntentsManager)(nil).SolutionsSubscriptionExists), dAppAddr) -} - -// SubscriptionMessages mocks base method. -func (m *MockIntentsManager) SubscriptionMessages() []bxmessage.Message { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SubscriptionMessages") - ret0, _ := ret[0].([]bxmessage.Message) - return ret0 -} - -// SubscriptionMessages indicates an expected call of SubscriptionMessages. -func (mr *MockIntentsManagerMockRecorder) SubscriptionMessages() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubscriptionMessages", reflect.TypeOf((*MockIntentsManager)(nil).SubscriptionMessages)) -} - -// TotalIntentSubmissions mocks base method. -func (m *MockIntentsManager) TotalIntentSubmissions() uint64 { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TotalIntentSubmissions") - ret0, _ := ret[0].(uint64) - return ret0 -} - -// TotalIntentSubmissions indicates an expected call of TotalIntentSubmissions. -func (mr *MockIntentsManagerMockRecorder) TotalIntentSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TotalIntentSubmissions", reflect.TypeOf((*MockIntentsManager)(nil).TotalIntentSubmissions)) -} - -// TotalQuoteSubmissions mocks base method. -func (m *MockIntentsManager) TotalQuoteSubmissions() uint64 { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TotalQuoteSubmissions") - ret0, _ := ret[0].(uint64) - return ret0 -} - -// TotalQuoteSubmissions indicates an expected call of TotalQuoteSubmissions. -func (mr *MockIntentsManagerMockRecorder) TotalQuoteSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TotalQuoteSubmissions", reflect.TypeOf((*MockIntentsManager)(nil).TotalQuoteSubmissions)) -} - -// TotalSolutionSubmissions mocks base method. -func (m *MockIntentsManager) TotalSolutionSubmissions() uint64 { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TotalSolutionSubmissions") - ret0, _ := ret[0].(uint64) - return ret0 -} - -// TotalSolutionSubmissions indicates an expected call of TotalSolutionSubmissions. -func (mr *MockIntentsManagerMockRecorder) TotalSolutionSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TotalSolutionSubmissions", reflect.TypeOf((*MockIntentsManager)(nil).TotalSolutionSubmissions)) -} - -// MockIntentSubscriptionsManager is a mock of IntentSubscriptionsManager interface. -type MockIntentSubscriptionsManager struct { - ctrl *gomock.Controller - recorder *MockIntentSubscriptionsManagerMockRecorder -} - -// MockIntentSubscriptionsManagerMockRecorder is the mock recorder for MockIntentSubscriptionsManager. -type MockIntentSubscriptionsManagerMockRecorder struct { - mock *MockIntentSubscriptionsManager -} - -// NewMockIntentSubscriptionsManager creates a new mock instance. -func NewMockIntentSubscriptionsManager(ctrl *gomock.Controller) *MockIntentSubscriptionsManager { - mock := &MockIntentSubscriptionsManager{ctrl: ctrl} - mock.recorder = &MockIntentSubscriptionsManagerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockIntentSubscriptionsManager) EXPECT() *MockIntentSubscriptionsManagerMockRecorder { - return m.recorder -} - -// AddIntentsSubscription mocks base method. -func (m *MockIntentSubscriptionsManager) AddIntentsSubscription(solverAddr string, hash, signature []byte) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AddIntentsSubscription", solverAddr, hash, signature) -} - -// AddIntentsSubscription indicates an expected call of AddIntentsSubscription. -func (mr *MockIntentSubscriptionsManagerMockRecorder) AddIntentsSubscription(solverAddr, hash, signature interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddIntentsSubscription", reflect.TypeOf((*MockIntentSubscriptionsManager)(nil).AddIntentsSubscription), solverAddr, hash, signature) -} - -// AddQuotesSubscription mocks base method. -func (m *MockIntentSubscriptionsManager) AddQuotesSubscription(dAppAddr string) uint64 { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AddQuotesSubscription", dAppAddr) - ret0, _ := ret[0].(uint64) - return ret0 -} - -// AddQuotesSubscription indicates an expected call of AddQuotesSubscription. -func (mr *MockIntentSubscriptionsManagerMockRecorder) AddQuotesSubscription(dAppAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddQuotesSubscription", reflect.TypeOf((*MockIntentSubscriptionsManager)(nil).AddQuotesSubscription), dAppAddr) -} - -// AddSolutionsSubscription mocks base method. -func (m *MockIntentSubscriptionsManager) AddSolutionsSubscription(dAppAddr string, hash, signature []byte) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AddSolutionsSubscription", dAppAddr, hash, signature) -} - -// AddSolutionsSubscription indicates an expected call of AddSolutionsSubscription. -func (mr *MockIntentSubscriptionsManagerMockRecorder) AddSolutionsSubscription(dAppAddr, hash, signature interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddSolutionsSubscription", reflect.TypeOf((*MockIntentSubscriptionsManager)(nil).AddSolutionsSubscription), dAppAddr, hash, signature) -} - -// IntentsSubscriptionExists mocks base method. -func (m *MockIntentSubscriptionsManager) IntentsSubscriptionExists(solverAddr string) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "IntentsSubscriptionExists", solverAddr) - ret0, _ := ret[0].(bool) - return ret0 -} - -// IntentsSubscriptionExists indicates an expected call of IntentsSubscriptionExists. -func (mr *MockIntentSubscriptionsManagerMockRecorder) IntentsSubscriptionExists(solverAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IntentsSubscriptionExists", reflect.TypeOf((*MockIntentSubscriptionsManager)(nil).IntentsSubscriptionExists), solverAddr) -} - -// RmIntentsSubscription mocks base method. -func (m *MockIntentSubscriptionsManager) RmIntentsSubscription(solverAddr string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "RmIntentsSubscription", solverAddr) -} - -// RmIntentsSubscription indicates an expected call of RmIntentsSubscription. -func (mr *MockIntentSubscriptionsManagerMockRecorder) RmIntentsSubscription(solverAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RmIntentsSubscription", reflect.TypeOf((*MockIntentSubscriptionsManager)(nil).RmIntentsSubscription), solverAddr) -} - -// RmQuotesSubscription mocks base method. -func (m *MockIntentSubscriptionsManager) RmQuotesSubscription(dAppAddr string) (uint64, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RmQuotesSubscription", dAppAddr) - ret0, _ := ret[0].(uint64) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// RmQuotesSubscription indicates an expected call of RmQuotesSubscription. -func (mr *MockIntentSubscriptionsManagerMockRecorder) RmQuotesSubscription(dAppAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RmQuotesSubscription", reflect.TypeOf((*MockIntentSubscriptionsManager)(nil).RmQuotesSubscription), dAppAddr) -} - -// RmSolutionsSubscription mocks base method. -func (m *MockIntentSubscriptionsManager) RmSolutionsSubscription(dAppAddr string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "RmSolutionsSubscription", dAppAddr) -} - -// RmSolutionsSubscription indicates an expected call of RmSolutionsSubscription. -func (mr *MockIntentSubscriptionsManagerMockRecorder) RmSolutionsSubscription(dAppAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RmSolutionsSubscription", reflect.TypeOf((*MockIntentSubscriptionsManager)(nil).RmSolutionsSubscription), dAppAddr) -} - -// SolutionsSubscriptionExists mocks base method. -func (m *MockIntentSubscriptionsManager) SolutionsSubscriptionExists(dAppAddr string) bool { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SolutionsSubscriptionExists", dAppAddr) - ret0, _ := ret[0].(bool) - return ret0 -} - -// SolutionsSubscriptionExists indicates an expected call of SolutionsSubscriptionExists. -func (mr *MockIntentSubscriptionsManagerMockRecorder) SolutionsSubscriptionExists(dAppAddr interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SolutionsSubscriptionExists", reflect.TypeOf((*MockIntentSubscriptionsManager)(nil).SolutionsSubscriptionExists), dAppAddr) -} - -// SubscriptionMessages mocks base method. -func (m *MockIntentSubscriptionsManager) SubscriptionMessages() []bxmessage.Message { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SubscriptionMessages") - ret0, _ := ret[0].([]bxmessage.Message) - return ret0 -} - -// SubscriptionMessages indicates an expected call of SubscriptionMessages. -func (mr *MockIntentSubscriptionsManagerMockRecorder) SubscriptionMessages() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SubscriptionMessages", reflect.TypeOf((*MockIntentSubscriptionsManager)(nil).SubscriptionMessages)) -} - -// MockIntentSolutionsManager is a mock of IntentSolutionsManager interface. -type MockIntentSolutionsManager struct { - ctrl *gomock.Controller - recorder *MockIntentSolutionsManagerMockRecorder -} - -// MockIntentSolutionsManagerMockRecorder is the mock recorder for MockIntentSolutionsManager. -type MockIntentSolutionsManagerMockRecorder struct { - mock *MockIntentSolutionsManager -} - -// NewMockIntentSolutionsManager creates a new mock instance. -func NewMockIntentSolutionsManager(ctrl *gomock.Controller) *MockIntentSolutionsManager { - mock := &MockIntentSolutionsManager{ctrl: ctrl} - mock.recorder = &MockIntentSolutionsManagerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockIntentSolutionsManager) EXPECT() *MockIntentSolutionsManagerMockRecorder { - return m.recorder -} - -// AddIntentOfInterest mocks base method. -func (m *MockIntentSolutionsManager) AddIntentOfInterest(intentID string) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AddIntentOfInterest", intentID) -} - -// AddIntentOfInterest indicates an expected call of AddIntentOfInterest. -func (mr *MockIntentSolutionsManagerMockRecorder) AddIntentOfInterest(intentID interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddIntentOfInterest", reflect.TypeOf((*MockIntentSolutionsManager)(nil).AddIntentOfInterest), intentID) -} - -// AppendSolutionForIntent mocks base method. -func (m *MockIntentSolutionsManager) AppendSolutionForIntent(solution *bxmessage.IntentSolution) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AppendSolutionForIntent", solution) -} - -// AppendSolutionForIntent indicates an expected call of AppendSolutionForIntent. -func (mr *MockIntentSolutionsManagerMockRecorder) AppendSolutionForIntent(solution interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendSolutionForIntent", reflect.TypeOf((*MockIntentSolutionsManager)(nil).AppendSolutionForIntent), solution) -} - -// AppendSolutionsForIntent mocks base method. -func (m *MockIntentSolutionsManager) AppendSolutionsForIntent(solutions *bxmessage.IntentSolutions) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "AppendSolutionsForIntent", solutions) -} - -// AppendSolutionsForIntent indicates an expected call of AppendSolutionsForIntent. -func (mr *MockIntentSolutionsManagerMockRecorder) AppendSolutionsForIntent(solutions interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AppendSolutionsForIntent", reflect.TypeOf((*MockIntentSolutionsManager)(nil).AppendSolutionsForIntent), solutions) -} - -// CleanupExpiredSolutions mocks base method. -func (m *MockIntentSolutionsManager) CleanupExpiredSolutions(ctx context.Context) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "CleanupExpiredSolutions", ctx) -} - -// CleanupExpiredSolutions indicates an expected call of CleanupExpiredSolutions. -func (mr *MockIntentSolutionsManagerMockRecorder) CleanupExpiredSolutions(ctx interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CleanupExpiredSolutions", reflect.TypeOf((*MockIntentSolutionsManager)(nil).CleanupExpiredSolutions), ctx) -} - -// SolutionsForIntent mocks base method. -func (m *MockIntentSolutionsManager) SolutionsForIntent(intentID string) []bxmessage.IntentSolution { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SolutionsForIntent", intentID) - ret0, _ := ret[0].([]bxmessage.IntentSolution) - return ret0 -} - -// SolutionsForIntent indicates an expected call of SolutionsForIntent. -func (mr *MockIntentSolutionsManagerMockRecorder) SolutionsForIntent(intentID interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SolutionsForIntent", reflect.TypeOf((*MockIntentSolutionsManager)(nil).SolutionsForIntent), intentID) -} - -// MockIntentsStatsManager is a mock of IntentsStatsManager interface. -type MockIntentsStatsManager struct { - ctrl *gomock.Controller - recorder *MockIntentsStatsManagerMockRecorder -} - -// MockIntentsStatsManagerMockRecorder is the mock recorder for MockIntentsStatsManager. -type MockIntentsStatsManagerMockRecorder struct { - mock *MockIntentsStatsManager -} - -// NewMockIntentsStatsManager creates a new mock instance. -func NewMockIntentsStatsManager(ctrl *gomock.Controller) *MockIntentsStatsManager { - mock := &MockIntentsStatsManager{ctrl: ctrl} - mock.recorder = &MockIntentsStatsManagerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockIntentsStatsManager) EXPECT() *MockIntentsStatsManagerMockRecorder { - return m.recorder -} - -// IncIntentSubmissions mocks base method. -func (m *MockIntentsStatsManager) IncIntentSubmissions() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "IncIntentSubmissions") -} - -// IncIntentSubmissions indicates an expected call of IncIntentSubmissions. -func (mr *MockIntentsStatsManagerMockRecorder) IncIntentSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IncIntentSubmissions", reflect.TypeOf((*MockIntentsStatsManager)(nil).IncIntentSubmissions)) -} - -// IncQuoteSubmissions mocks base method. -func (m *MockIntentsStatsManager) IncQuoteSubmissions() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "IncQuoteSubmissions") -} - -// IncQuoteSubmissions indicates an expected call of IncQuoteSubmissions. -func (mr *MockIntentsStatsManagerMockRecorder) IncQuoteSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IncQuoteSubmissions", reflect.TypeOf((*MockIntentsStatsManager)(nil).IncQuoteSubmissions)) -} - -// IncSolutionSubmissions mocks base method. -func (m *MockIntentsStatsManager) IncSolutionSubmissions() { - m.ctrl.T.Helper() - m.ctrl.Call(m, "IncSolutionSubmissions") -} - -// IncSolutionSubmissions indicates an expected call of IncSolutionSubmissions. -func (mr *MockIntentsStatsManagerMockRecorder) IncSolutionSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IncSolutionSubmissions", reflect.TypeOf((*MockIntentsStatsManager)(nil).IncSolutionSubmissions)) -} - -// TotalIntentSubmissions mocks base method. -func (m *MockIntentsStatsManager) TotalIntentSubmissions() uint64 { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TotalIntentSubmissions") - ret0, _ := ret[0].(uint64) - return ret0 -} - -// TotalIntentSubmissions indicates an expected call of TotalIntentSubmissions. -func (mr *MockIntentsStatsManagerMockRecorder) TotalIntentSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TotalIntentSubmissions", reflect.TypeOf((*MockIntentsStatsManager)(nil).TotalIntentSubmissions)) -} - -// TotalQuoteSubmissions mocks base method. -func (m *MockIntentsStatsManager) TotalQuoteSubmissions() uint64 { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TotalQuoteSubmissions") - ret0, _ := ret[0].(uint64) - return ret0 -} - -// TotalQuoteSubmissions indicates an expected call of TotalQuoteSubmissions. -func (mr *MockIntentsStatsManagerMockRecorder) TotalQuoteSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TotalQuoteSubmissions", reflect.TypeOf((*MockIntentsStatsManager)(nil).TotalQuoteSubmissions)) -} - -// TotalSolutionSubmissions mocks base method. -func (m *MockIntentsStatsManager) TotalSolutionSubmissions() uint64 { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TotalSolutionSubmissions") - ret0, _ := ret[0].(uint64) - return ret0 -} - -// TotalSolutionSubmissions indicates an expected call of TotalSolutionSubmissions. -func (mr *MockIntentsStatsManagerMockRecorder) TotalSolutionSubmissions() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TotalSolutionSubmissions", reflect.TypeOf((*MockIntentsStatsManager)(nil).TotalSolutionSubmissions)) -} diff --git a/test/mock/gw_intents_server_mock.go b/test/mock/gw_intents_server_mock.go deleted file mode 100644 index 6cfc07e..0000000 --- a/test/mock/gw_intents_server_mock.go +++ /dev/null @@ -1,137 +0,0 @@ -// Code generated by MockGen. DO NOT EDIT. -// Source: github.com/bloXroute-Labs/gateway/v2/protobuf (interfaces: Gateway_IntentsServer) -// -// Generated by this command: -// -// mockgen -destination ../test/mock/gw_intents_server_mock.go -package mock github.com/bloXroute-Labs/gateway/v2/protobuf Gateway_IntentsServer -// -// Package mock is a generated GoMock package. -package mock - -import ( - context "context" - reflect "reflect" - - gateway "github.com/bloXroute-Labs/gateway/v2/protobuf" - gomock "go.uber.org/mock/gomock" - metadata "google.golang.org/grpc/metadata" -) - -// MockGateway_IntentsServer is a mock of Gateway_IntentsServer interface. -type MockGateway_IntentsServer struct { - ctrl *gomock.Controller - recorder *MockGateway_IntentsServerMockRecorder -} - -// MockGateway_IntentsServerMockRecorder is the mock recorder for MockGateway_IntentsServer. -type MockGateway_IntentsServerMockRecorder struct { - mock *MockGateway_IntentsServer -} - -// NewMockGateway_IntentsServer creates a new mock instance. -func NewMockGateway_IntentsServer(ctrl *gomock.Controller) *MockGateway_IntentsServer { - mock := &MockGateway_IntentsServer{ctrl: ctrl} - mock.recorder = &MockGateway_IntentsServerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockGateway_IntentsServer) EXPECT() *MockGateway_IntentsServerMockRecorder { - return m.recorder -} - -// Context mocks base method. -func (m *MockGateway_IntentsServer) Context() context.Context { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Context") - ret0, _ := ret[0].(context.Context) - return ret0 -} - -// Context indicates an expected call of Context. -func (mr *MockGateway_IntentsServerMockRecorder) Context() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Context", reflect.TypeOf((*MockGateway_IntentsServer)(nil).Context)) -} - -// RecvMsg mocks base method. -func (m *MockGateway_IntentsServer) RecvMsg(arg0 any) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "RecvMsg", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// RecvMsg indicates an expected call of RecvMsg. -func (mr *MockGateway_IntentsServerMockRecorder) RecvMsg(arg0 any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RecvMsg", reflect.TypeOf((*MockGateway_IntentsServer)(nil).RecvMsg), arg0) -} - -// Send mocks base method. -func (m *MockGateway_IntentsServer) Send(arg0 *gateway.IntentsReply) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Send", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// Send indicates an expected call of Send. -func (mr *MockGateway_IntentsServerMockRecorder) Send(arg0 any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockGateway_IntentsServer)(nil).Send), arg0) -} - -// SendHeader mocks base method. -func (m *MockGateway_IntentsServer) SendHeader(arg0 metadata.MD) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SendHeader", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// SendHeader indicates an expected call of SendHeader. -func (mr *MockGateway_IntentsServerMockRecorder) SendHeader(arg0 any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendHeader", reflect.TypeOf((*MockGateway_IntentsServer)(nil).SendHeader), arg0) -} - -// SendMsg mocks base method. -func (m *MockGateway_IntentsServer) SendMsg(arg0 any) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SendMsg", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// SendMsg indicates an expected call of SendMsg. -func (mr *MockGateway_IntentsServerMockRecorder) SendMsg(arg0 any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SendMsg", reflect.TypeOf((*MockGateway_IntentsServer)(nil).SendMsg), arg0) -} - -// SetHeader mocks base method. -func (m *MockGateway_IntentsServer) SetHeader(arg0 metadata.MD) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "SetHeader", arg0) - ret0, _ := ret[0].(error) - return ret0 -} - -// SetHeader indicates an expected call of SetHeader. -func (mr *MockGateway_IntentsServerMockRecorder) SetHeader(arg0 any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHeader", reflect.TypeOf((*MockGateway_IntentsServer)(nil).SetHeader), arg0) -} - -// SetTrailer mocks base method. -func (m *MockGateway_IntentsServer) SetTrailer(arg0 metadata.MD) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "SetTrailer", arg0) -} - -// SetTrailer indicates an expected call of SetTrailer. -func (mr *MockGateway_IntentsServerMockRecorder) SetTrailer(arg0 any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTrailer", reflect.TypeOf((*MockGateway_IntentsServer)(nil).SetTrailer), arg0) -} diff --git a/types/block_notification.go b/types/block_notification.go index 1388341..9d512b7 100644 --- a/types/block_notification.go +++ b/types/block_notification.go @@ -5,24 +5,28 @@ import ( "errors" "fmt" - bxethcommon "github.com/bloXroute-Labs/gateway/v2/blockchain/common" - log "github.com/bloXroute-Labs/gateway/v2/logger" ethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces" ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v5/runtime/version" + + "github.com/bloXroute-Labs/gateway/v2/blockchain/bdn" + bxethcommon "github.com/bloXroute-Labs/gateway/v2/blockchain/common" + log "github.com/bloXroute-Labs/gateway/v2/logger" ) // NewBeaconBlockNotification creates beacon block notification func NewBeaconBlockNotification(block interfaces.ReadOnlySignedBeaconBlock) (BlockNotification, error) { + genericBlock, err := bdn.PbGenericBlock(block) + if err != nil { + return nil, err + } + switch block.Version() { case version.Bellatrix: - blk, err := block.PbBellatrixBlock() - if err != nil { - return nil, err - } + blk := genericBlock.GetBellatrix() hash, err := blk.GetBlock().HashTreeRoot() if err != nil { @@ -34,10 +38,7 @@ func NewBeaconBlockNotification(block interfaces.ReadOnlySignedBeaconBlock) (Blo SignedBeaconBlockBellatrix: blk, }, nil case version.Capella: - blk, err := block.PbCapellaBlock() - if err != nil { - return nil, err - } + blk := genericBlock.GetCapella() hash, err := blk.GetBlock().HashTreeRoot() if err != nil { @@ -49,10 +50,8 @@ func NewBeaconBlockNotification(block interfaces.ReadOnlySignedBeaconBlock) (Blo SignedBeaconBlockCapella: blk, }, nil case version.Deneb: - blk, err := block.PbDenebBlock() - if err != nil { - return nil, err - } + blk := genericBlock.GetDeneb().GetBlock() + hash, err := blk.GetBlock().HashTreeRoot() if err != nil { return nil, err diff --git a/types/feed_type.go b/types/feed_type.go index d9eb47f..3719026 100644 --- a/types/feed_type.go +++ b/types/feed_type.go @@ -5,16 +5,13 @@ type FeedType string // FeedType enumeration const ( - NewTxsFeed FeedType = "newTxs" - PendingTxsFeed FeedType = "pendingTxs" - BDNBlocksFeed FeedType = "bdnBlocks" - NewBlocksFeed FeedType = "newBlocks" - OnBlockFeed FeedType = "ethOnBlock" - TxReceiptsFeed FeedType = "txReceipts" - TransactionStatusFeed FeedType = "transactionStatus" - UserIntentsFeed FeedType = "userIntentFeed" - UserIntentSolutionsFeed FeedType = "userIntentSolutionsFeed" - QuotesFeed FeedType = "quotesFeed" + NewTxsFeed FeedType = "newTxs" + PendingTxsFeed FeedType = "pendingTxs" + BDNBlocksFeed FeedType = "bdnBlocks" + NewBlocksFeed FeedType = "newBlocks" + OnBlockFeed FeedType = "ethOnBlock" + TxReceiptsFeed FeedType = "txReceipts" + TransactionStatusFeed FeedType = "transactionStatus" ) // FeedConnectionType types of feeds diff --git a/types/quote_notification.go b/types/quote_notification.go deleted file mode 100644 index 78e157b..0000000 --- a/types/quote_notification.go +++ /dev/null @@ -1,39 +0,0 @@ -package types - -import "time" - -// QuoteNotification describes quote notification -type QuoteNotification struct { - ID string // UUIDv4 - quote id - DappAddress string // ETH Address - SolverAddress string // ETH Address - Quote []byte // Variable length - Hash []byte // Keccak256 - Signature []byte // ECDSA Signature - Timestamp time.Time // Short timestamp -} - -// WithFields implements Notification -func (q *QuoteNotification) WithFields(_ []string) Notification { - return nil -} - -// LocalRegion implements Notification -func (q *QuoteNotification) LocalRegion() bool { - return true -} - -// GetHash implements Notification -func (q *QuoteNotification) GetHash() string { - return string(q.Hash) -} - -// NotificationType implements Notification -func (q *QuoteNotification) NotificationType() FeedType { - return QuotesFeed -} - -// Filters return a map of key,value that can be used to filter transactions -func (q *QuoteNotification) Filters(_ []string) map[string]interface{} { - return nil -} diff --git a/types/user_intent_notification.go b/types/user_intent_notification.go deleted file mode 100644 index 632d915..0000000 --- a/types/user_intent_notification.go +++ /dev/null @@ -1,61 +0,0 @@ -package types - -import ( - "sync" - "time" -) - -// EmptyFilteredIntentMap is a map of key,value that can be used to filter intents -var EmptyFilteredIntentMap = map[string]interface{}{ - "dapp_address": "0x0", -} - -// UserIntent describes user request for submitting intent -type UserIntent struct { - ID string - DappAddress string - SenderAddress string - Intent []byte // The intent payload - Hash []byte - Signature []byte - Timestamp time.Time -} - -// UserIntentNotification describes user intent notification -type UserIntentNotification struct { - UserIntent - lock sync.Mutex -} - -// NewUserIntentNotification constructor for UserIntentNotification -func NewUserIntentNotification(intent *UserIntent) *UserIntentNotification { - return &UserIntentNotification{ - UserIntent: *intent, - lock: sync.Mutex{}, - } -} - -// WithFields not implemented -func (i *UserIntentNotification) WithFields(_ []string) Notification { - return nil -} - -// LocalRegion implements Notification -func (i *UserIntentNotification) LocalRegion() bool { - return true -} - -// GetHash implements Notification -func (i *UserIntentNotification) GetHash() string { - return string(i.Hash) -} - -// NotificationType implements Notification -func (i *UserIntentNotification) NotificationType() FeedType { - return UserIntentsFeed -} - -// Filters returns a map of key,value that can be used to filter transactions -func (i *UserIntentNotification) Filters(_ []string) map[string]interface{} { - return nil -} diff --git a/types/user_intent_solution_notification.go b/types/user_intent_solution_notification.go deleted file mode 100644 index 8e23543..0000000 --- a/types/user_intent_solution_notification.go +++ /dev/null @@ -1,58 +0,0 @@ -package types - -import ( - "sync" - "time" -) - -// UserIntentSolution describes IntentSolution submission body -type UserIntentSolution struct { - ID string - SolverAddress string - DappAddress string - IntentID string - Solution []byte // The intent payload - Hash []byte - Signature []byte - Timestamp time.Time - SenderAddress string -} - -// UserIntentSolutionNotification describes IntentSolution user notification -type UserIntentSolutionNotification struct { - UserIntentSolution - lock sync.Mutex -} - -// NewUserIntentSolutionNotification constructor for UserIntentSolutionNotification -func NewUserIntentSolutionNotification(solution *UserIntentSolution) *UserIntentSolutionNotification { - return &UserIntentSolutionNotification{ - UserIntentSolution: *solution, - lock: sync.Mutex{}, - } -} - -// WithFields implements Notification -func (u *UserIntentSolutionNotification) WithFields(_ []string) Notification { - return nil -} - -// LocalRegion implements Notification -func (u *UserIntentSolutionNotification) LocalRegion() bool { - return true -} - -// GetHash implements Notification -func (u *UserIntentSolutionNotification) GetHash() string { - return string(u.Hash) -} - -// NotificationType implements Notification -func (u *UserIntentSolutionNotification) NotificationType() FeedType { - return UserIntentSolutionsFeed -} - -// Filters returns a map of key,value that can be used to filter transactions -func (u *UserIntentSolutionNotification) Filters(_ []string) map[string]interface{} { - return nil -} diff --git a/utils/bundle/dispatcher.go b/utils/bundle/dispatcher.go index 80c8c05..4310db6 100644 --- a/utils/bundle/dispatcher.go +++ b/utils/bundle/dispatcher.go @@ -107,6 +107,8 @@ func (d *Dispatcher) bundleForBuildersJSON(bundle *bxmessage.MEVBundle) ([]byte, if bundle.GetNetworkNum() == bxgateway.BSCMainnetNum { params[0].AvoidMixedBundles = bundle.AvoidMixedBundles params[0].RefundRecipient = bundle.IncomingRefundRecipient + params[0].EndOfBlock = bundle.EndOfBlock + params[0].AccountTier = string(bundle.OriginalSenderAccountTier) } paramsBytes, err := json.Marshal(params) diff --git a/utils/eth_flags.go b/utils/eth_flags.go index 68c0449..6c1660a 100644 --- a/utils/eth_flags.go +++ b/utils/eth_flags.go @@ -41,11 +41,6 @@ var ( Usage: "Ethereum websockets endpoint", DefaultText: "", } - PolygonWSUriFlag = &cli.StringFlag{ - Name: "polygon-ws-uri", - Usage: "Ethereum websockets endpoint", - DefaultText: "", - } BeaconAPIUriFlag = &cli.StringFlag{ Name: "beacon-api-uri", Usage: "Beacon API endpoints. Expected format: IP:PORT", diff --git a/utils/flags.go b/utils/flags.go index 7c5da6e..8bdd2fa 100644 --- a/utils/flags.go +++ b/utils/flags.go @@ -314,15 +314,6 @@ var ( Name: "bsc-source-endpoint", Usage: "websocket endpoint for BSC mainnet go-gateway", } - PolygonMainnetGatewayEndpoint = &cli.StringFlag{ - Name: "polygon-source-endpoint", - Usage: "websocket endpoint for Polygon mainnet go-gateway", - } - PolygonMainnetHeimdallEndpoints = &cli.StringFlag{ - Name: "polygon-heimdall-endpoints", - Aliases: []string{"polygon-heimdall-endpoint"}, - Usage: "tcp endpoints for Polygon mainnet heimdall server", - } CheckMevCredit = &cli.BoolFlag{ Name: "check-mev-credit", Usage: "enable this flag will forward the mev rpc request to cloud api", @@ -421,6 +412,11 @@ var ( Usage: "Database DSN string ", Required: true, } + ELKFlag = &cli.StringFlag{ + Name: "elk", + Usage: "elk ", + Required: true, + } BloxrouteAccountsFlag = &cli.StringFlag{ Name: "bloxroute-accounts", Usage: "enable detailed bundle trace response for these accounts", @@ -431,11 +427,5 @@ var ( Hidden: true, Value: false, } - EnableIntroductoryIntentsAccess = &cli.BoolFlag{ - Name: "enable-introductory-intents-access", - Usage: "enable intents access for Introductory tiers", - Hidden: true, - Value: false, - } ) diff --git a/utils/http/request.go b/utils/http/request.go index da3d360..bbf64b9 100644 --- a/utils/http/request.go +++ b/utils/http/request.go @@ -25,7 +25,7 @@ func NewPOSTRequest[T any](client *http.Client, endpoint string, params any, aut request, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint, bytes.NewReader(paramsBytes)) if err != nil { - err := fmt.Errorf("failed to create http request for %v, with params %v, error %v, ", endpoint, params, err) + err := fmt.Errorf("failed to create http request for %v, with params %+v, error %v, ", endpoint, params, err) return *new(T), err } request.Header.Add("Accept", "application/json") @@ -37,7 +37,7 @@ func NewPOSTRequest[T any](client *http.Client, endpoint string, params any, aut response, err := client.Do(request) if err != nil { - err := fmt.Errorf("failed to get response from %v, with params %v, error %v, ", endpoint, params, err) + err := fmt.Errorf("failed to get response from %v, with params %+v, error %v, ", endpoint, params, err) return *new(T), err } defer response.Body.Close() diff --git a/utils/intent/id.go b/utils/intent/id.go deleted file mode 100644 index 9afa3e1..0000000 --- a/utils/intent/id.go +++ /dev/null @@ -1,32 +0,0 @@ -package intent - -import ( - "bytes" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/google/uuid" -) - -// GenerateIntentID generates an intent ID from the dApp address, sender address, and intent -func GenerateIntentID(dAppAddress string, intent []byte) (string, error) { - return generateID(dAppAddress, intent) -} - -// GenerateSolutionID generates a solution ID from the solver address, intent ID, and solution -func GenerateSolutionID(intentID string, solution []byte) (string, error) { - return generateID(intentID, solution) -} - -// GenerateQuoteID generates a quote ID from the dapp address, quote ID and quote -func GenerateQuoteID(dAppAddress string, quote []byte) (string, error) { - return generateID(dAppAddress, quote) -} - -func generateID(s string, data []byte) (string, error) { - hash := crypto.Keccak256Hash([]byte(s + string(data))) - uuidFromHash, err := uuid.NewRandomFromReader(bytes.NewReader(hash[:])) - if err != nil { - return "", err - } - return uuidFromHash.String(), nil -} diff --git a/utils/intent/id_test.go b/utils/intent/id_test.go deleted file mode 100644 index 128dbab..0000000 --- a/utils/intent/id_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package intent - -import ( - "testing" - - "github.com/bloXroute-Labs/gateway/v2/types" - "github.com/ethereum/go-ethereum/common" - "github.com/google/uuid" - "github.com/stretchr/testify/require" -) - -func TestGenerateIntentID(t *testing.T) { - dAppAddress := "dAppAddress" - intent := []byte("intent") - - got, err := GenerateIntentID(dAppAddress, intent) - require.NoError(t, err) - require.NotEmpty(t, got) - require.Len(t, common.HexToHash(got).Bytes(), types.Keccak256HashLen) -} - -func TestGenerateSolutionID(t *testing.T) { - intentID := "intentID" - solution := []byte("solution") - - got, err := GenerateSolutionID(intentID, solution) - require.NoError(t, err) - require.NotEmpty(t, got) - _, err = uuid.Parse(got) - require.NoError(t, err) -} diff --git a/utils/intent/validate.go b/utils/intent/validate.go deleted file mode 100644 index ca6c3c9..0000000 --- a/utils/intent/validate.go +++ /dev/null @@ -1,54 +0,0 @@ -package intent - -import ( - "bytes" - "errors" - "fmt" - - "github.com/bloXroute-Labs/gateway/v2/types" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" -) - -var ( - // ErrInvalidSignature is returned when the signature is invalid - ErrInvalidSignature = errors.New("invalid signature") - // ErrInvalidAddress is returned when the address is not valid hex address - ErrInvalidAddress = errors.New("invalid address") - // ErrInvalidHash is returned when the hash is not valid Keccak256Hash - ErrInvalidHash = errors.New("invalid hash") - // ErrInvalidSignatureLength is returned when the signature length is not equal to ECDSASignatureLen - ErrInvalidSignatureLength = errors.New("invalid signature length") - // ErrHashMismatch is returned when the provided hash does not match the calculated hash - ErrHashMismatch = errors.New("hash mismatch") -) - -// ValidateHashAndSignature validates the hash and signature -func ValidateHashAndSignature(address string, hash, signature, data []byte) error { - if !common.IsHexAddress(address) { - return ErrInvalidAddress - } - - if len(hash) != types.Keccak256HashLen { - return ErrInvalidHash - } - - if len(signature) != types.ECDSASignatureLen { - return ErrInvalidSignatureLength - } - - pubKey, err := crypto.SigToPub(hash, signature) - if err != nil { - return fmt.Errorf("failed to validate signature: %w", err) - } - - if !bytes.Equal(crypto.PubkeyToAddress(*pubKey).Bytes(), common.HexToAddress(address).Bytes()) { - return ErrInvalidSignature - } - - if !bytes.Equal(crypto.Keccak256Hash(data).Bytes(), hash) { - return ErrHashMismatch - } - - return nil -}