From cd7b098b0015b4895a123f8ae21c2363e08cb085 Mon Sep 17 00:00:00 2001 From: Tanmay Date: Mon, 23 Oct 2023 14:35:20 -0400 Subject: [PATCH 01/15] add simple debug --- zetaclient/evm_client.go | 43 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/zetaclient/evm_client.go b/zetaclient/evm_client.go index f5cdbe1de4..93deb6446f 100644 --- a/zetaclient/evm_client.go +++ b/zetaclient/evm_client.go @@ -13,6 +13,8 @@ import ( "sync/atomic" "time" + "github.com/zeta-chain/protocol-contracts/pkg/contracts/evm/zeta.non-eth.sol" + zetaconnectoreth "github.com/zeta-chain/protocol-contracts/pkg/contracts/evm/zetaconnector.eth.sol" "gorm.io/driver/sqlite" "gorm.io/gorm" @@ -228,14 +230,33 @@ func (ob *EVMChainClient) GetConnectorContract() (*zetaconnector.ZetaConnectorNo return FetchConnectorContract(addr, ob.evmClient) } -func FetchConnectorContract(addr ethcommon.Address, client *ethclient.Client) (*zetaconnector.ZetaConnectorNonEth, error) { - return zetaconnector.NewZetaConnectorNonEth(addr, client) +func (ob *EVMChainClient) GetConnectorContractEth() (*zetaconnectoreth.ZetaConnectorEth, error) { + addr := ethcommon.HexToAddress(ob.GetCoreParams().ConnectorContractAddress) + return FetchConnectorContractEth(addr, ob.evmClient) } + +func (ob *EVMChainClient) GetZetaTokenNonEthContract() (*zeta.ZetaNonEth, error) { + addr := ethcommon.HexToAddress(ob.GetCoreParams().ZetaTokenContractAddress) + return FetchZetaZetaNonEthTokenContract(addr, ob.evmClient) +} + func (ob *EVMChainClient) GetERC20CustodyContract() (*erc20custody.ERC20Custody, error) { addr := ethcommon.HexToAddress(ob.GetCoreParams().Erc20CustodyContractAddress) return FetchERC20CustodyContract(addr, ob.evmClient) } +func FetchConnectorContract(addr ethcommon.Address, client *ethclient.Client) (*zetaconnector.ZetaConnectorNonEth, error) { + return zetaconnector.NewZetaConnectorNonEth(addr, client) +} + +func FetchConnectorContractEth(addr ethcommon.Address, client *ethclient.Client) (*zetaconnectoreth.ZetaConnectorEth, error) { + return zetaconnectoreth.NewZetaConnectorEth(addr, client) +} + +func FetchZetaZetaNonEthTokenContract(addr ethcommon.Address, client *ethclient.Client) (*zeta.ZetaNonEth, error) { + return zeta.NewZetaNonEth(addr, client) +} + func FetchERC20CustodyContract(addr ethcommon.Address, client *ethclient.Client) (*erc20custody.ERC20Custody, error) { return erc20custody.NewERC20Custody(addr, client) } @@ -978,12 +999,28 @@ func (ob *EVMChainClient) WatchGasPrice() { ob.logger.WatchGasPrice.Error().Err(err).Msgf("PostGasPrice error at zeta block : %d ", height) } } + ticker := NewDynamicTicker(fmt.Sprintf("EVM_WatchGasPrice_%d", ob.chain.ChainId), ob.GetCoreParams().GasPriceTicker) defer ticker.Stop() for { select { case <-ticker.C(): - err := ob.PostGasPrice() + contract, err := ob.GetZetaTokenNonEthContract() + if err == nil { + supply, err := contract.TotalSupply(nil) + if err == nil { + ob.logger.WatchGasPrice.Info().Msgf("TotalSupply : %d", supply) + } + } + + ce, err := ob.GetConnectorContractEth() + if err == nil { + lockedamout, err := ce.GetLockedAmount(nil) + if err == nil { + ob.logger.WatchGasPrice.Info().Msgf("LockedAmount : %d", lockedamout) + } + } + err = ob.PostGasPrice() if err != nil { height, err := ob.zetaClient.GetBlockHeight() if err != nil { From 6d4ecc4d15ca5bc09b1aab7a00f974e51cde7834 Mon Sep 17 00:00:00 2001 From: Tanmay Date: Thu, 26 Oct 2023 13:53:53 -0400 Subject: [PATCH 02/15] add supply checked file --- app/setup_handlers.go | 4 ++ x/emissions/abci.go | 1 + zetaclient/zeta_supply_checker.go | 73 +++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 zetaclient/zeta_supply_checker.go diff --git a/app/setup_handlers.go b/app/setup_handlers.go index 18a8ae1f62..345b60ebd9 100644 --- a/app/setup_handlers.go +++ b/app/setup_handlers.go @@ -18,7 +18,11 @@ func SetupHandlers(app *App) { vm[m] = mb.ConsensusVersion() } vm[observertypes.ModuleName] = vm[observertypes.ModuleName] - 1 + info, _ := app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress("valAddr")) + info.Tombstoned = false + app.SlashingKeeper.SetValidatorSigningInfo(ctx, sdk.ConsAddress("valAddr"), info) return app.mm.RunMigrations(ctx, app.configurator, vm) + }) upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() diff --git a/x/emissions/abci.go b/x/emissions/abci.go index 8e0fed774b..50f2f3daae 100644 --- a/x/emissions/abci.go +++ b/x/emissions/abci.go @@ -11,6 +11,7 @@ import ( ) func BeginBlocker(ctx sdk.Context, keeper keeper.Keeper) { + reservesFactor, bondFactor, durationFactor := keeper.GetBlockRewardComponents(ctx) blockRewards := reservesFactor.Mul(bondFactor).Mul(durationFactor) if blockRewards.IsZero() { diff --git a/zetaclient/zeta_supply_checker.go b/zetaclient/zeta_supply_checker.go new file mode 100644 index 0000000000..8ae4f2c8c6 --- /dev/null +++ b/zetaclient/zeta_supply_checker.go @@ -0,0 +1,73 @@ +package zetaclient + +import ( + "fmt" + "math/big" + + ethcommon "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/zeta-chain/zetacore/common" + "github.com/zeta-chain/zetacore/zetaclient/config" +) + +type ZetaSupplyChecker struct { + chainClientMap map[common.Chain]ChainClient + cfg config.Config + evmClient *ethclient.Client + zetaClient *ZetaCoreBridge + ticker DynamicTicker + stop chan struct{} +} + +func (zs *ZetaSupplyChecker) Start() { + defer zs.ticker.Stop() + for { + select { + case <-zs.ticker.C(): + fmt.Println("Checking Zeta Supply") + case <-zs.stop: + return + } + } +} + +func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { + externalChainEvmChain := make([]common.Chain, 0) + ethereumChain := common.Chain{} + for chain, _ := range zs.chainClientMap { + if chain.IsExternalChain() && common.IsEVMChain(chain.ChainId) && !common.IsEthereumChain(chain.ChainId) { + externalChainEvmChain = append(externalChainEvmChain, chain) + } + if common.IsEthereumChain(chain.ChainId) { + ethereumChain = chain + } + } + // Todo add checks for ethereum chain + externalChainTotalSupply := big.NewInt(0) + for _, chain := range externalChainEvmChain { + zetaTokenAddressString := zs.cfg.EVMChainConfigs[chain.ChainId].CoreParams.ZetaTokenContractAddress + zetaTokenAddress := ethcommon.HexToAddress(zetaTokenAddressString) + zetatokenNonEth, err := FetchZetaZetaNonEthTokenContract(zetaTokenAddress, zs.evmClient) + if err != nil { + return err + } + totalSupply, err := zetatokenNonEth.TotalSupply(nil) + if err != nil { + return err + } + externalChainTotalSupply.Add(externalChainTotalSupply, totalSupply) + } + ethConnectorAddressString := zs.cfg.EVMChainConfigs[ethereumChain.ChainId].CoreParams.ConnectorContractAddress + ethConnectorAddress := ethcommon.HexToAddress(ethConnectorAddressString) + ethConnectorContract, err := FetchConnectorContractEth(ethConnectorAddress, zs.evmClient) + if err != nil { + return err + } + ethLockedAmount, err := ethConnectorContract.GetLockedAmount(nil) + if err != nil { + return err + } + pendingCCTX + zs.zetaClient.GetAllPendingCctx() + return nil +} From 33e1f58cdee598cc3533bb59a5c6faaea1db98af Mon Sep 17 00:00:00 2001 From: Tanmay Date: Mon, 30 Oct 2023 19:20:09 -0400 Subject: [PATCH 03/15] add check for zetasupply to zetaclient --- cmd/zetaclientd/start.go | 9 +++ zetaclient/query.go | 12 +++ zetaclient/zeta_supply_checker.go | 130 ++++++++++++++++++++++++++---- 3 files changed, 134 insertions(+), 17 deletions(-) diff --git a/cmd/zetaclientd/start.go b/cmd/zetaclientd/start.go index 0e770b951f..a3fcad06c7 100644 --- a/cmd/zetaclientd/start.go +++ b/cmd/zetaclientd/start.go @@ -106,6 +106,7 @@ func start(_ *cobra.Command, _ []string) error { go zetaBridge.ConfigUpdater(cfg) // Generate TSS address . The Tss address is generated through Keygen ceremony. The TSS key is used to sign all outbound transactions . + // The bridgePk is private key for the Hotkey. The Hotkey is used to sign all inbound transactions // Each node processes a portion of the key stored in ~/.tss by default . Custom location can be specified in config file during init. // After generating the key , the address is set on the zetacore bridgePk, err := zetaBridge.GetKeys().GetPrivateKey() @@ -240,6 +241,14 @@ func start(_ *cobra.Command, _ []string) error { mo1 := mc.NewCoreObserver(zetaBridge, signerMap, chainClientMap, metrics, tss, masterLogger, cfg, telemetryServer) mo1.MonitorCore() + zetaSupplyChecker, errStartingzetaSupplyChecker := mc.NewZetaSupplyChecker(cfg, zetaBridge, masterLogger) + if errStartingzetaSupplyChecker != nil { + startLogger.Err(err).Msg("NewZetaSupplyChecker") + } + if errStartingzetaSupplyChecker == nil { + zetaSupplyChecker.Start() + defer zetaSupplyChecker.Stop() + } startLogger.Info().Msgf("awaiting the os.Interrupt, syscall.SIGTERM signals...") ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM) diff --git a/zetaclient/query.go b/zetaclient/query.go index d84d335e0c..6adc11af1f 100644 --- a/zetaclient/query.go +++ b/zetaclient/query.go @@ -7,10 +7,13 @@ import ( "time" + sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" "github.com/cosmos/cosmos-sdk/types/query" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" tmtypes "github.com/tendermint/tendermint/proto/tendermint/types" + "github.com/zeta-chain/zetacore/cmd/zetacored/config" "github.com/zeta-chain/zetacore/common" "github.com/zeta-chain/zetacore/x/crosschain/types" zetaObserverTypes "github.com/zeta-chain/zetacore/x/observer/types" @@ -145,6 +148,15 @@ func (b *ZetaCoreBridge) GetAllPendingCctx(chainID int64) ([]*types.CrossChainTx return resp.CrossChainTx, nil } +func (b *ZetaCoreBridge) GetZetaTokenSupplyOnNode() (sdkmath.Int, error) { + client := banktypes.NewQueryClient(b.grpcConn) + resp, err := client.SupplyOf(context.Background(), &banktypes.QuerySupplyOfRequest{Denom: config.BaseDenom}) + if err != nil { + return sdkmath.ZeroInt(), err + } + return resp.GetAmount().Amount, nil +} + func (b *ZetaCoreBridge) GetLastBlockHeight() ([]*types.LastBlockHeight, error) { client := types.NewQueryClient(b.grpcConn) resp, err := client.LastBlockHeightAll(context.Background(), &types.QueryAllLastBlockHeightRequest{}) diff --git a/zetaclient/zeta_supply_checker.go b/zetaclient/zeta_supply_checker.go index 8ae4f2c8c6..e4cb24b6ad 100644 --- a/zetaclient/zeta_supply_checker.go +++ b/zetaclient/zeta_supply_checker.go @@ -4,50 +4,86 @@ import ( "fmt" "math/big" + sdkmath "cosmossdk.io/math" ethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethclient" + "github.com/rs/zerolog" "github.com/zeta-chain/zetacore/common" + "github.com/zeta-chain/zetacore/x/crosschain/types" "github.com/zeta-chain/zetacore/zetaclient/config" ) type ZetaSupplyChecker struct { - chainClientMap map[common.Chain]ChainClient - cfg config.Config - evmClient *ethclient.Client - zetaClient *ZetaCoreBridge - ticker DynamicTicker - stop chan struct{} + cfg *config.Config + evmClient map[int64]*ethclient.Client + zetaClient *ZetaCoreBridge + ticker *DynamicTicker + stop chan struct{} + logger zerolog.Logger } +func NewZetaSupplyChecker(cfg *config.Config, zetaClient *ZetaCoreBridge, logger zerolog.Logger) (ZetaSupplyChecker, error) { + zetaSupplyChecker := ZetaSupplyChecker{} + for _, evmConfig := range cfg.GetAllEVMConfigs() { + if evmConfig.Chain.IsZetaChain() { + continue + } + client, err := ethclient.Dial(evmConfig.Endpoint) + if err != nil { + return zetaSupplyChecker, err + } + zetaSupplyChecker.evmClient[evmConfig.Chain.ChainId] = client + } + zetaSupplyChecker.zetaClient = zetaClient + zetaSupplyChecker.cfg = cfg + zetaSupplyChecker.logger = logger.With(). + Str("module", "ZetaSupplyChecker"). + Logger() + zetaSupplyChecker.stop = make(chan struct{}) + zetaSupplyChecker.ticker = NewDynamicTicker(fmt.Sprintf("ZETASupplyTicker"), 15) + return zetaSupplyChecker, nil +} func (zs *ZetaSupplyChecker) Start() { defer zs.ticker.Stop() for { select { case <-zs.ticker.C(): - fmt.Println("Checking Zeta Supply") + err := zs.CheckZetaTokenSupply() + if err != nil { + zs.logger.Error().Err(err).Msgf("ZetaSupplyChecker error") + } case <-zs.stop: return } } } +func (b *ZetaSupplyChecker) Stop() { + b.logger.Info().Msgf("ZetaSupplyChecker is stopping") + close(b.stop) +} + func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { - externalChainEvmChain := make([]common.Chain, 0) + externalEvmChain := make([]common.Chain, 0) ethereumChain := common.Chain{} - for chain, _ := range zs.chainClientMap { + for chainID, _ := range zs.evmClient { + chain := common.GetChainFromChainID(chainID) if chain.IsExternalChain() && common.IsEVMChain(chain.ChainId) && !common.IsEthereumChain(chain.ChainId) { - externalChainEvmChain = append(externalChainEvmChain, chain) + externalEvmChain = append(externalEvmChain, *chain) } if common.IsEthereumChain(chain.ChainId) { - ethereumChain = chain + ethereumChain = *chain } } - // Todo add checks for ethereum chain + if len(externalEvmChain) == 0 { + return fmt.Errorf("no external chain found") + } externalChainTotalSupply := big.NewInt(0) - for _, chain := range externalChainEvmChain { + for _, chain := range externalEvmChain { + zetaTokenAddressString := zs.cfg.EVMChainConfigs[chain.ChainId].CoreParams.ZetaTokenContractAddress zetaTokenAddress := ethcommon.HexToAddress(zetaTokenAddressString) - zetatokenNonEth, err := FetchZetaZetaNonEthTokenContract(zetaTokenAddress, zs.evmClient) + zetatokenNonEth, err := FetchZetaZetaNonEthTokenContract(zetaTokenAddress, zs.evmClient[chain.ChainId]) if err != nil { return err } @@ -56,18 +92,78 @@ func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { return err } externalChainTotalSupply.Add(externalChainTotalSupply, totalSupply) + } + ethConnectorAddressString := zs.cfg.EVMChainConfigs[ethereumChain.ChainId].CoreParams.ConnectorContractAddress ethConnectorAddress := ethcommon.HexToAddress(ethConnectorAddressString) - ethConnectorContract, err := FetchConnectorContractEth(ethConnectorAddress, zs.evmClient) + ethConnectorContract, err := FetchConnectorContractEth(ethConnectorAddress, zs.evmClient[ethereumChain.ChainId]) if err != nil { return err } + ethLockedAmount, err := ethConnectorContract.GetLockedAmount(nil) if err != nil { return err } - pendingCCTX - zs.zetaClient.GetAllPendingCctx() + + zetaInTransit := zs.GetAmountOfZetaInTransit(externalEvmChain) + zetaTokenSupplyOnNode, err := zs.zetaClient.GetZetaTokenSupplyOnNode() + if err != nil { + return err + } + genesisAmounts := big.NewInt(0) + AbortedTxAmounts := big.NewInt(0) + negativeAmounts := genesisAmounts.Add(genesisAmounts, AbortedTxAmounts).Add(genesisAmounts, zetaInTransit) + positiveAmounts := externalChainTotalSupply.Add(externalChainTotalSupply, zetaTokenSupplyOnNode.BigInt()) + lhs := ethLockedAmount + rhs := positiveAmounts.Sub(positiveAmounts, negativeAmounts) + + if lhs.Cmp(rhs) != 0 { + return fmt.Errorf("zeta supply mismatch, lhs : %s , rhs : %s", lhs.String(), rhs.String()) + } return nil } + +func (zs *ZetaSupplyChecker) GetGenesistokenAmounts() *big.Int { + return nil +} + +func (zs *ZetaSupplyChecker) AbortedTxAmount() *big.Int { + return nil +} + +func (zs *ZetaSupplyChecker) GetAmountOfZetaInTransit(externalEvmchain []common.Chain) *big.Int { + cctxs := zs.GetPendingCCTXNotAwaitingConfirmation(externalEvmchain) + amount := sdkmath.ZeroUint() + for _, cctx := range cctxs { + amount = amount.Add(cctx.GetCurrentOutTxParam().Amount) + } + return amount.BigInt() +} +func (zs *ZetaSupplyChecker) GetPendingCCTXNotAwaitingConfirmation(externalEvmchain []common.Chain) []*types.CrossChainTx { + ccTxNotAwaitngconfirmation := make([]*types.CrossChainTx, 0) + for _, chain := range externalEvmchain { + cctx, err := zs.zetaClient.GetAllPendingCctx(chain.ChainId) + if err != nil { + continue + } + nonceToCctxMap := make(map[uint64]*types.CrossChainTx) + for _, c := range cctx { + if c.GetInboundTxParams().CoinType == common.CoinType_Zeta { + nonceToCctxMap[c.GetCurrentOutTxParam().OutboundTxTssNonce] = c + } + } + trackers, err := zs.zetaClient.GetAllOutTxTrackerByChain(chain, Ascending) + if err != nil { + continue + } + for _, tracker := range trackers { + if _, ok := nonceToCctxMap[tracker.Nonce]; !ok { + ccTxNotAwaitngconfirmation = append(ccTxNotAwaitngconfirmation, nonceToCctxMap[tracker.Nonce]) + } + } + + } + return ccTxNotAwaitngconfirmation +} From 4ef7d2b9e75915260fe055578e8a9951ec174510 Mon Sep 17 00:00:00 2001 From: Tanmay Date: Mon, 30 Oct 2023 19:22:48 -0400 Subject: [PATCH 04/15] add error logging for mismatch --- zetaclient/zeta_supply_checker.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/zetaclient/zeta_supply_checker.go b/zetaclient/zeta_supply_checker.go index e4cb24b6ad..de8f1add1f 100644 --- a/zetaclient/zeta_supply_checker.go +++ b/zetaclient/zeta_supply_checker.go @@ -120,6 +120,13 @@ func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { rhs := positiveAmounts.Sub(positiveAmounts, negativeAmounts) if lhs.Cmp(rhs) != 0 { + zs.logger.Error().Msgf("zeta supply mismatch, lhs : %s , rhs : %s", lhs.String(), rhs.String()) + zs.logger.Error().Msgf("aborted tx amounts : %s", AbortedTxAmounts.String()) + zs.logger.Error().Msgf("genesis amounts : %s", genesisAmounts.String()) + zs.logger.Error().Msgf("zeta in transit : %s", zetaInTransit.String()) + zs.logger.Error().Msgf("external chain total supply : %s", externalChainTotalSupply.String()) + zs.logger.Error().Msgf("zeta token supply on node : %s", zetaTokenSupplyOnNode.String()) + zs.logger.Error().Msgf("eth locked amount : %s", ethLockedAmount.String()) return fmt.Errorf("zeta supply mismatch, lhs : %s , rhs : %s", lhs.String(), rhs.String()) } return nil From e0412901ccfbb5b7d125b646dec6992e2adfd59f Mon Sep 17 00:00:00 2001 From: Tanmay Date: Tue, 31 Oct 2023 14:19:26 -0400 Subject: [PATCH 05/15] add new query for querying cctx by status --- docs/openapi/openapi.swagger.yaml | 34 + proto/crosschain/query.proto | 11 + x/crosschain/keeper/keeper_cross_chain_tx.go | 23 + x/crosschain/types/query.pb.go | 893 +++++++++++++------ x/crosschain/types/query.pb.gw.go | 107 +++ zetaclient/evm_client.go | 15 - zetaclient/query.go | 9 + zetaclient/zeta_supply_checker.go | 133 ++- 8 files changed, 903 insertions(+), 322 deletions(-) diff --git a/docs/openapi/openapi.swagger.yaml b/docs/openapi/openapi.swagger.yaml index 5bc7f67767..9571f6de23 100644 --- a/docs/openapi/openapi.swagger.yaml +++ b/docs/openapi/openapi.swagger.yaml @@ -26646,6 +26646,32 @@ paths: type: boolean tags: - Query + /zeta-chain/crosschain/cctxbyStatus/{status}: + get: + operationId: Query_CctxByStatus + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/crosschainQueryCctxByStatusResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/googlerpcStatus' + parameters: + - name: status + in: path + required: true + type: string + enum: + - PendingInbound + - PendingOutbound + - OutboundMined + - PendingRevert + - Reverted + - Aborted + tags: + - Query /zeta-chain/crosschain/chainNonces: get: summary: Queries a list of chainNonces items. @@ -50810,6 +50836,14 @@ definitions: items: type: object $ref: '#/definitions/crosschainPendingNonces' + crosschainQueryCctxByStatusResponse: + type: object + properties: + CrossChainTx: + type: array + items: + type: object + $ref: '#/definitions/crosschainCrossChainTx' crosschainQueryConvertGasToZetaResponse: type: object properties: diff --git a/proto/crosschain/query.proto b/proto/crosschain/query.proto index e05265258d..4ba5849353 100644 --- a/proto/crosschain/query.proto +++ b/proto/crosschain/query.proto @@ -143,6 +143,17 @@ service Query { rpc TssHistory(QueryTssHistoryRequest) returns (QueryTssHistoryResponse) { option (google.api.http).get = "/zeta-chain/crosschain/tssHistory"; } + + rpc CctxByStatus(QueryCctxByStatusRequest) returns (QueryCctxByStatusResponse) { + option (google.api.http).get = "/zeta-chain/crosschain/cctxbyStatus/{status}"; + } +} + +message QueryCctxByStatusRequest { + CctxStatus status = 1; +} +message QueryCctxByStatusResponse { + repeated CrossChainTx CrossChainTx = 1 [(gogoproto.nullable) = false]; } message QueryTssHistoryRequest {} diff --git a/x/crosschain/keeper/keeper_cross_chain_tx.go b/x/crosschain/keeper/keeper_cross_chain_tx.go index a53c1159c4..a8ee87dd7e 100644 --- a/x/crosschain/keeper/keeper_cross_chain_tx.go +++ b/x/crosschain/keeper/keeper_cross_chain_tx.go @@ -127,6 +127,29 @@ func (k Keeper) CctxAll(c context.Context, req *types.QueryAllCctxRequest) (*typ return &types.QueryAllCctxResponse{CrossChainTx: sends, Pagination: pageRes}, nil } +func (k Keeper) CctxByStatus(c context.Context, req *types.QueryCctxByStatusRequest) (*types.QueryCctxByStatusResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + ctx := sdk.UnwrapSDKContext(c) + p := types.KeyPrefix(fmt.Sprintf("%s", types.SendKey)) + store := prefix.NewStore(ctx.KVStore(k.storeKey), p) + + iterator := sdk.KVStorePrefixIterator(store, []byte{}) + + defer iterator.Close() + cctxList := make([]types.CrossChainTx, 0) + for ; iterator.Valid(); iterator.Next() { + var val types.CrossChainTx + k.cdc.MustUnmarshal(iterator.Value(), &val) + if val.CctxStatus.Status == req.Status { + cctxList = append(cctxList, val) + } + } + + return &types.QueryCctxByStatusResponse{CrossChainTx: cctxList}, nil +} + func (k Keeper) Cctx(c context.Context, req *types.QueryGetCctxRequest) (*types.QueryGetCctxResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") diff --git a/x/crosschain/types/query.pb.go b/x/crosschain/types/query.pb.go index 868abf1169..bac8d3450a 100644 --- a/x/crosschain/types/query.pb.go +++ b/x/crosschain/types/query.pb.go @@ -31,6 +31,94 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +type QueryCctxByStatusRequest struct { + Status CctxStatus `protobuf:"varint,1,opt,name=status,proto3,enum=zetachain.zetacore.crosschain.CctxStatus" json:"status,omitempty"` +} + +func (m *QueryCctxByStatusRequest) Reset() { *m = QueryCctxByStatusRequest{} } +func (m *QueryCctxByStatusRequest) String() string { return proto.CompactTextString(m) } +func (*QueryCctxByStatusRequest) ProtoMessage() {} +func (*QueryCctxByStatusRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_65a992045e92a606, []int{0} +} +func (m *QueryCctxByStatusRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCctxByStatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCctxByStatusRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCctxByStatusRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCctxByStatusRequest.Merge(m, src) +} +func (m *QueryCctxByStatusRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryCctxByStatusRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCctxByStatusRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCctxByStatusRequest proto.InternalMessageInfo + +func (m *QueryCctxByStatusRequest) GetStatus() CctxStatus { + if m != nil { + return m.Status + } + return CctxStatus_PendingInbound +} + +type QueryCctxByStatusResponse struct { + CrossChainTx []CrossChainTx `protobuf:"bytes,1,rep,name=CrossChainTx,proto3" json:"CrossChainTx"` +} + +func (m *QueryCctxByStatusResponse) Reset() { *m = QueryCctxByStatusResponse{} } +func (m *QueryCctxByStatusResponse) String() string { return proto.CompactTextString(m) } +func (*QueryCctxByStatusResponse) ProtoMessage() {} +func (*QueryCctxByStatusResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_65a992045e92a606, []int{1} +} +func (m *QueryCctxByStatusResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCctxByStatusResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCctxByStatusResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryCctxByStatusResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCctxByStatusResponse.Merge(m, src) +} +func (m *QueryCctxByStatusResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryCctxByStatusResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCctxByStatusResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCctxByStatusResponse proto.InternalMessageInfo + +func (m *QueryCctxByStatusResponse) GetCrossChainTx() []CrossChainTx { + if m != nil { + return m.CrossChainTx + } + return nil +} + type QueryTssHistoryRequest struct { } @@ -38,7 +126,7 @@ func (m *QueryTssHistoryRequest) Reset() { *m = QueryTssHistoryRequest{} func (m *QueryTssHistoryRequest) String() string { return proto.CompactTextString(m) } func (*QueryTssHistoryRequest) ProtoMessage() {} func (*QueryTssHistoryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{0} + return fileDescriptor_65a992045e92a606, []int{2} } func (m *QueryTssHistoryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -75,7 +163,7 @@ func (m *QueryTssHistoryResponse) Reset() { *m = QueryTssHistoryResponse func (m *QueryTssHistoryResponse) String() string { return proto.CompactTextString(m) } func (*QueryTssHistoryResponse) ProtoMessage() {} func (*QueryTssHistoryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{1} + return fileDescriptor_65a992045e92a606, []int{3} } func (m *QueryTssHistoryResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -119,7 +207,7 @@ func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } func (*QueryParamsRequest) ProtoMessage() {} func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{2} + return fileDescriptor_65a992045e92a606, []int{4} } func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,7 +246,7 @@ func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } func (*QueryParamsResponse) ProtoMessage() {} func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{3} + return fileDescriptor_65a992045e92a606, []int{5} } func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -203,7 +291,7 @@ func (m *QueryGetOutTxTrackerRequest) Reset() { *m = QueryGetOutTxTracke func (m *QueryGetOutTxTrackerRequest) String() string { return proto.CompactTextString(m) } func (*QueryGetOutTxTrackerRequest) ProtoMessage() {} func (*QueryGetOutTxTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{4} + return fileDescriptor_65a992045e92a606, []int{6} } func (m *QueryGetOutTxTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -254,7 +342,7 @@ func (m *QueryGetOutTxTrackerResponse) Reset() { *m = QueryGetOutTxTrack func (m *QueryGetOutTxTrackerResponse) String() string { return proto.CompactTextString(m) } func (*QueryGetOutTxTrackerResponse) ProtoMessage() {} func (*QueryGetOutTxTrackerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{5} + return fileDescriptor_65a992045e92a606, []int{7} } func (m *QueryGetOutTxTrackerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -298,7 +386,7 @@ func (m *QueryAllOutTxTrackerRequest) Reset() { *m = QueryAllOutTxTracke func (m *QueryAllOutTxTrackerRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllOutTxTrackerRequest) ProtoMessage() {} func (*QueryAllOutTxTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{6} + return fileDescriptor_65a992045e92a606, []int{8} } func (m *QueryAllOutTxTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -343,7 +431,7 @@ func (m *QueryAllOutTxTrackerResponse) Reset() { *m = QueryAllOutTxTrack func (m *QueryAllOutTxTrackerResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllOutTxTrackerResponse) ProtoMessage() {} func (*QueryAllOutTxTrackerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{7} + return fileDescriptor_65a992045e92a606, []int{9} } func (m *QueryAllOutTxTrackerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -395,7 +483,7 @@ func (m *QueryAllOutTxTrackerByChainRequest) Reset() { *m = QueryAllOutT func (m *QueryAllOutTxTrackerByChainRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllOutTxTrackerByChainRequest) ProtoMessage() {} func (*QueryAllOutTxTrackerByChainRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{8} + return fileDescriptor_65a992045e92a606, []int{10} } func (m *QueryAllOutTxTrackerByChainRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -447,7 +535,7 @@ func (m *QueryAllOutTxTrackerByChainResponse) Reset() { *m = QueryAllOut func (m *QueryAllOutTxTrackerByChainResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllOutTxTrackerByChainResponse) ProtoMessage() {} func (*QueryAllOutTxTrackerByChainResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{9} + return fileDescriptor_65a992045e92a606, []int{11} } func (m *QueryAllOutTxTrackerByChainResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -499,7 +587,7 @@ func (m *QueryAllInTxTrackerByChainRequest) Reset() { *m = QueryAllInTxT func (m *QueryAllInTxTrackerByChainRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllInTxTrackerByChainRequest) ProtoMessage() {} func (*QueryAllInTxTrackerByChainRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{10} + return fileDescriptor_65a992045e92a606, []int{12} } func (m *QueryAllInTxTrackerByChainRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -551,7 +639,7 @@ func (m *QueryAllInTxTrackerByChainResponse) Reset() { *m = QueryAllInTx func (m *QueryAllInTxTrackerByChainResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllInTxTrackerByChainResponse) ProtoMessage() {} func (*QueryAllInTxTrackerByChainResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{11} + return fileDescriptor_65a992045e92a606, []int{13} } func (m *QueryAllInTxTrackerByChainResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -601,7 +689,7 @@ func (m *QueryAllInTxTrackersRequest) Reset() { *m = QueryAllInTxTracker func (m *QueryAllInTxTrackersRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllInTxTrackersRequest) ProtoMessage() {} func (*QueryAllInTxTrackersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{12} + return fileDescriptor_65a992045e92a606, []int{14} } func (m *QueryAllInTxTrackersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -638,7 +726,7 @@ func (m *QueryAllInTxTrackersResponse) Reset() { *m = QueryAllInTxTracke func (m *QueryAllInTxTrackersResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllInTxTrackersResponse) ProtoMessage() {} func (*QueryAllInTxTrackersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{13} + return fileDescriptor_65a992045e92a606, []int{15} } func (m *QueryAllInTxTrackersResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -682,7 +770,7 @@ func (m *QueryGetInTxHashToCctxRequest) Reset() { *m = QueryGetInTxHashT func (m *QueryGetInTxHashToCctxRequest) String() string { return proto.CompactTextString(m) } func (*QueryGetInTxHashToCctxRequest) ProtoMessage() {} func (*QueryGetInTxHashToCctxRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{14} + return fileDescriptor_65a992045e92a606, []int{16} } func (m *QueryGetInTxHashToCctxRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -726,7 +814,7 @@ func (m *QueryGetInTxHashToCctxResponse) Reset() { *m = QueryGetInTxHash func (m *QueryGetInTxHashToCctxResponse) String() string { return proto.CompactTextString(m) } func (*QueryGetInTxHashToCctxResponse) ProtoMessage() {} func (*QueryGetInTxHashToCctxResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{15} + return fileDescriptor_65a992045e92a606, []int{17} } func (m *QueryGetInTxHashToCctxResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -770,7 +858,7 @@ func (m *QueryInTxHashToCctxDataRequest) Reset() { *m = QueryInTxHashToC func (m *QueryInTxHashToCctxDataRequest) String() string { return proto.CompactTextString(m) } func (*QueryInTxHashToCctxDataRequest) ProtoMessage() {} func (*QueryInTxHashToCctxDataRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{16} + return fileDescriptor_65a992045e92a606, []int{18} } func (m *QueryInTxHashToCctxDataRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -814,7 +902,7 @@ func (m *QueryInTxHashToCctxDataResponse) Reset() { *m = QueryInTxHashTo func (m *QueryInTxHashToCctxDataResponse) String() string { return proto.CompactTextString(m) } func (*QueryInTxHashToCctxDataResponse) ProtoMessage() {} func (*QueryInTxHashToCctxDataResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{17} + return fileDescriptor_65a992045e92a606, []int{19} } func (m *QueryInTxHashToCctxDataResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -858,7 +946,7 @@ func (m *QueryAllInTxHashToCctxRequest) Reset() { *m = QueryAllInTxHashT func (m *QueryAllInTxHashToCctxRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllInTxHashToCctxRequest) ProtoMessage() {} func (*QueryAllInTxHashToCctxRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{18} + return fileDescriptor_65a992045e92a606, []int{20} } func (m *QueryAllInTxHashToCctxRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -903,7 +991,7 @@ func (m *QueryAllInTxHashToCctxResponse) Reset() { *m = QueryAllInTxHash func (m *QueryAllInTxHashToCctxResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllInTxHashToCctxResponse) ProtoMessage() {} func (*QueryAllInTxHashToCctxResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{19} + return fileDescriptor_65a992045e92a606, []int{21} } func (m *QueryAllInTxHashToCctxResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -954,7 +1042,7 @@ func (m *QueryGetTssAddressRequest) Reset() { *m = QueryGetTssAddressReq func (m *QueryGetTssAddressRequest) String() string { return proto.CompactTextString(m) } func (*QueryGetTssAddressRequest) ProtoMessage() {} func (*QueryGetTssAddressRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{20} + return fileDescriptor_65a992045e92a606, []int{22} } func (m *QueryGetTssAddressRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -999,7 +1087,7 @@ func (m *QueryGetTssAddressResponse) Reset() { *m = QueryGetTssAddressRe func (m *QueryGetTssAddressResponse) String() string { return proto.CompactTextString(m) } func (*QueryGetTssAddressResponse) ProtoMessage() {} func (*QueryGetTssAddressResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{21} + return fileDescriptor_65a992045e92a606, []int{23} } func (m *QueryGetTssAddressResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1049,7 +1137,7 @@ func (m *QueryGetTSSRequest) Reset() { *m = QueryGetTSSRequest{} } func (m *QueryGetTSSRequest) String() string { return proto.CompactTextString(m) } func (*QueryGetTSSRequest) ProtoMessage() {} func (*QueryGetTSSRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{22} + return fileDescriptor_65a992045e92a606, []int{24} } func (m *QueryGetTSSRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1086,7 +1174,7 @@ func (m *QueryGetTSSResponse) Reset() { *m = QueryGetTSSResponse{} } func (m *QueryGetTSSResponse) String() string { return proto.CompactTextString(m) } func (*QueryGetTSSResponse) ProtoMessage() {} func (*QueryGetTSSResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{23} + return fileDescriptor_65a992045e92a606, []int{25} } func (m *QueryGetTSSResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1130,7 +1218,7 @@ func (m *QueryGetGasPriceRequest) Reset() { *m = QueryGetGasPriceRequest func (m *QueryGetGasPriceRequest) String() string { return proto.CompactTextString(m) } func (*QueryGetGasPriceRequest) ProtoMessage() {} func (*QueryGetGasPriceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{24} + return fileDescriptor_65a992045e92a606, []int{26} } func (m *QueryGetGasPriceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1174,7 +1262,7 @@ func (m *QueryGetGasPriceResponse) Reset() { *m = QueryGetGasPriceRespon func (m *QueryGetGasPriceResponse) String() string { return proto.CompactTextString(m) } func (*QueryGetGasPriceResponse) ProtoMessage() {} func (*QueryGetGasPriceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{25} + return fileDescriptor_65a992045e92a606, []int{27} } func (m *QueryGetGasPriceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1218,7 +1306,7 @@ func (m *QueryAllGasPriceRequest) Reset() { *m = QueryAllGasPriceRequest func (m *QueryAllGasPriceRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllGasPriceRequest) ProtoMessage() {} func (*QueryAllGasPriceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{26} + return fileDescriptor_65a992045e92a606, []int{28} } func (m *QueryAllGasPriceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1263,7 +1351,7 @@ func (m *QueryAllGasPriceResponse) Reset() { *m = QueryAllGasPriceRespon func (m *QueryAllGasPriceResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllGasPriceResponse) ProtoMessage() {} func (*QueryAllGasPriceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{27} + return fileDescriptor_65a992045e92a606, []int{29} } func (m *QueryAllGasPriceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1314,7 +1402,7 @@ func (m *QueryGetChainNoncesRequest) Reset() { *m = QueryGetChainNoncesR func (m *QueryGetChainNoncesRequest) String() string { return proto.CompactTextString(m) } func (*QueryGetChainNoncesRequest) ProtoMessage() {} func (*QueryGetChainNoncesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{28} + return fileDescriptor_65a992045e92a606, []int{30} } func (m *QueryGetChainNoncesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1358,7 +1446,7 @@ func (m *QueryGetChainNoncesResponse) Reset() { *m = QueryGetChainNonces func (m *QueryGetChainNoncesResponse) String() string { return proto.CompactTextString(m) } func (*QueryGetChainNoncesResponse) ProtoMessage() {} func (*QueryGetChainNoncesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{29} + return fileDescriptor_65a992045e92a606, []int{31} } func (m *QueryGetChainNoncesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1402,7 +1490,7 @@ func (m *QueryAllChainNoncesRequest) Reset() { *m = QueryAllChainNoncesR func (m *QueryAllChainNoncesRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllChainNoncesRequest) ProtoMessage() {} func (*QueryAllChainNoncesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{30} + return fileDescriptor_65a992045e92a606, []int{32} } func (m *QueryAllChainNoncesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1447,7 +1535,7 @@ func (m *QueryAllChainNoncesResponse) Reset() { *m = QueryAllChainNonces func (m *QueryAllChainNoncesResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllChainNoncesResponse) ProtoMessage() {} func (*QueryAllChainNoncesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{31} + return fileDescriptor_65a992045e92a606, []int{33} } func (m *QueryAllChainNoncesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1497,7 +1585,7 @@ func (m *QueryAllPendingNoncesRequest) Reset() { *m = QueryAllPendingNon func (m *QueryAllPendingNoncesRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllPendingNoncesRequest) ProtoMessage() {} func (*QueryAllPendingNoncesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{32} + return fileDescriptor_65a992045e92a606, []int{34} } func (m *QueryAllPendingNoncesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1534,7 +1622,7 @@ func (m *QueryAllPendingNoncesResponse) Reset() { *m = QueryAllPendingNo func (m *QueryAllPendingNoncesResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllPendingNoncesResponse) ProtoMessage() {} func (*QueryAllPendingNoncesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{33} + return fileDescriptor_65a992045e92a606, []int{35} } func (m *QueryAllPendingNoncesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1578,7 +1666,7 @@ func (m *QueryPendingNoncesByChainRequest) Reset() { *m = QueryPendingNo func (m *QueryPendingNoncesByChainRequest) String() string { return proto.CompactTextString(m) } func (*QueryPendingNoncesByChainRequest) ProtoMessage() {} func (*QueryPendingNoncesByChainRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{34} + return fileDescriptor_65a992045e92a606, []int{36} } func (m *QueryPendingNoncesByChainRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1622,7 +1710,7 @@ func (m *QueryPendingNoncesByChainResponse) Reset() { *m = QueryPendingN func (m *QueryPendingNoncesByChainResponse) String() string { return proto.CompactTextString(m) } func (*QueryPendingNoncesByChainResponse) ProtoMessage() {} func (*QueryPendingNoncesByChainResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{35} + return fileDescriptor_65a992045e92a606, []int{37} } func (m *QueryPendingNoncesByChainResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1666,7 +1754,7 @@ func (m *QueryGetLastBlockHeightRequest) Reset() { *m = QueryGetLastBloc func (m *QueryGetLastBlockHeightRequest) String() string { return proto.CompactTextString(m) } func (*QueryGetLastBlockHeightRequest) ProtoMessage() {} func (*QueryGetLastBlockHeightRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{36} + return fileDescriptor_65a992045e92a606, []int{38} } func (m *QueryGetLastBlockHeightRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1710,7 +1798,7 @@ func (m *QueryGetLastBlockHeightResponse) Reset() { *m = QueryGetLastBlo func (m *QueryGetLastBlockHeightResponse) String() string { return proto.CompactTextString(m) } func (*QueryGetLastBlockHeightResponse) ProtoMessage() {} func (*QueryGetLastBlockHeightResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{37} + return fileDescriptor_65a992045e92a606, []int{39} } func (m *QueryGetLastBlockHeightResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1754,7 +1842,7 @@ func (m *QueryAllLastBlockHeightRequest) Reset() { *m = QueryAllLastBloc func (m *QueryAllLastBlockHeightRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllLastBlockHeightRequest) ProtoMessage() {} func (*QueryAllLastBlockHeightRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{38} + return fileDescriptor_65a992045e92a606, []int{40} } func (m *QueryAllLastBlockHeightRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1799,7 +1887,7 @@ func (m *QueryAllLastBlockHeightResponse) Reset() { *m = QueryAllLastBlo func (m *QueryAllLastBlockHeightResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllLastBlockHeightResponse) ProtoMessage() {} func (*QueryAllLastBlockHeightResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{39} + return fileDescriptor_65a992045e92a606, []int{41} } func (m *QueryAllLastBlockHeightResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1850,7 +1938,7 @@ func (m *QueryGetCctxRequest) Reset() { *m = QueryGetCctxRequest{} } func (m *QueryGetCctxRequest) String() string { return proto.CompactTextString(m) } func (*QueryGetCctxRequest) ProtoMessage() {} func (*QueryGetCctxRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{40} + return fileDescriptor_65a992045e92a606, []int{42} } func (m *QueryGetCctxRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1895,7 +1983,7 @@ func (m *QueryGetCctxByNonceRequest) Reset() { *m = QueryGetCctxByNonceR func (m *QueryGetCctxByNonceRequest) String() string { return proto.CompactTextString(m) } func (*QueryGetCctxByNonceRequest) ProtoMessage() {} func (*QueryGetCctxByNonceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{41} + return fileDescriptor_65a992045e92a606, []int{43} } func (m *QueryGetCctxByNonceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1946,7 +2034,7 @@ func (m *QueryGetCctxResponse) Reset() { *m = QueryGetCctxResponse{} } func (m *QueryGetCctxResponse) String() string { return proto.CompactTextString(m) } func (*QueryGetCctxResponse) ProtoMessage() {} func (*QueryGetCctxResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{42} + return fileDescriptor_65a992045e92a606, []int{44} } func (m *QueryGetCctxResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1990,7 +2078,7 @@ func (m *QueryAllCctxRequest) Reset() { *m = QueryAllCctxRequest{} } func (m *QueryAllCctxRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllCctxRequest) ProtoMessage() {} func (*QueryAllCctxRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{43} + return fileDescriptor_65a992045e92a606, []int{45} } func (m *QueryAllCctxRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2035,7 +2123,7 @@ func (m *QueryAllCctxResponse) Reset() { *m = QueryAllCctxResponse{} } func (m *QueryAllCctxResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllCctxResponse) ProtoMessage() {} func (*QueryAllCctxResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{44} + return fileDescriptor_65a992045e92a606, []int{46} } func (m *QueryAllCctxResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2087,7 +2175,7 @@ func (m *QueryAllCctxPendingRequest) Reset() { *m = QueryAllCctxPendingR func (m *QueryAllCctxPendingRequest) String() string { return proto.CompactTextString(m) } func (*QueryAllCctxPendingRequest) ProtoMessage() {} func (*QueryAllCctxPendingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{45} + return fileDescriptor_65a992045e92a606, []int{47} } func (m *QueryAllCctxPendingRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2139,7 +2227,7 @@ func (m *QueryAllCctxPendingResponse) Reset() { *m = QueryAllCctxPending func (m *QueryAllCctxPendingResponse) String() string { return proto.CompactTextString(m) } func (*QueryAllCctxPendingResponse) ProtoMessage() {} func (*QueryAllCctxPendingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{46} + return fileDescriptor_65a992045e92a606, []int{48} } func (m *QueryAllCctxPendingResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2189,7 +2277,7 @@ func (m *QueryLastZetaHeightRequest) Reset() { *m = QueryLastZetaHeightR func (m *QueryLastZetaHeightRequest) String() string { return proto.CompactTextString(m) } func (*QueryLastZetaHeightRequest) ProtoMessage() {} func (*QueryLastZetaHeightRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{47} + return fileDescriptor_65a992045e92a606, []int{49} } func (m *QueryLastZetaHeightRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2226,7 +2314,7 @@ func (m *QueryLastZetaHeightResponse) Reset() { *m = QueryLastZetaHeight func (m *QueryLastZetaHeightResponse) String() string { return proto.CompactTextString(m) } func (*QueryLastZetaHeightResponse) ProtoMessage() {} func (*QueryLastZetaHeightResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{48} + return fileDescriptor_65a992045e92a606, []int{50} } func (m *QueryLastZetaHeightResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2271,7 +2359,7 @@ func (m *QueryConvertGasToZetaRequest) Reset() { *m = QueryConvertGasToZ func (m *QueryConvertGasToZetaRequest) String() string { return proto.CompactTextString(m) } func (*QueryConvertGasToZetaRequest) ProtoMessage() {} func (*QueryConvertGasToZetaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{49} + return fileDescriptor_65a992045e92a606, []int{51} } func (m *QueryConvertGasToZetaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2324,7 +2412,7 @@ func (m *QueryConvertGasToZetaResponse) Reset() { *m = QueryConvertGasTo func (m *QueryConvertGasToZetaResponse) String() string { return proto.CompactTextString(m) } func (*QueryConvertGasToZetaResponse) ProtoMessage() {} func (*QueryConvertGasToZetaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{50} + return fileDescriptor_65a992045e92a606, []int{52} } func (m *QueryConvertGasToZetaResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2381,7 +2469,7 @@ func (m *QueryMessagePassingProtocolFeeRequest) Reset() { *m = QueryMess func (m *QueryMessagePassingProtocolFeeRequest) String() string { return proto.CompactTextString(m) } func (*QueryMessagePassingProtocolFeeRequest) ProtoMessage() {} func (*QueryMessagePassingProtocolFeeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{51} + return fileDescriptor_65a992045e92a606, []int{53} } func (m *QueryMessagePassingProtocolFeeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2420,7 +2508,7 @@ func (m *QueryMessagePassingProtocolFeeResponse) Reset() { func (m *QueryMessagePassingProtocolFeeResponse) String() string { return proto.CompactTextString(m) } func (*QueryMessagePassingProtocolFeeResponse) ProtoMessage() {} func (*QueryMessagePassingProtocolFeeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{52} + return fileDescriptor_65a992045e92a606, []int{54} } func (m *QueryMessagePassingProtocolFeeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2464,7 +2552,7 @@ func (m *QueryZEVMGetTransactionReceiptRequest) Reset() { *m = QueryZEVM func (m *QueryZEVMGetTransactionReceiptRequest) String() string { return proto.CompactTextString(m) } func (*QueryZEVMGetTransactionReceiptRequest) ProtoMessage() {} func (*QueryZEVMGetTransactionReceiptRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{53} + return fileDescriptor_65a992045e92a606, []int{55} } func (m *QueryZEVMGetTransactionReceiptRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2521,7 +2609,7 @@ func (m *QueryZEVMGetTransactionReceiptResponse) Reset() { func (m *QueryZEVMGetTransactionReceiptResponse) String() string { return proto.CompactTextString(m) } func (*QueryZEVMGetTransactionReceiptResponse) ProtoMessage() {} func (*QueryZEVMGetTransactionReceiptResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{54} + return fileDescriptor_65a992045e92a606, []int{56} } func (m *QueryZEVMGetTransactionReceiptResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2651,7 +2739,7 @@ func (m *Log) Reset() { *m = Log{} } func (m *Log) String() string { return proto.CompactTextString(m) } func (*Log) ProtoMessage() {} func (*Log) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{55} + return fileDescriptor_65a992045e92a606, []int{57} } func (m *Log) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2751,7 +2839,7 @@ func (m *QueryZEVMGetTransactionRequest) Reset() { *m = QueryZEVMGetTran func (m *QueryZEVMGetTransactionRequest) String() string { return proto.CompactTextString(m) } func (*QueryZEVMGetTransactionRequest) ProtoMessage() {} func (*QueryZEVMGetTransactionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{56} + return fileDescriptor_65a992045e92a606, []int{58} } func (m *QueryZEVMGetTransactionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2811,7 +2899,7 @@ func (m *QueryZEVMGetTransactionResponse) Reset() { *m = QueryZEVMGetTra func (m *QueryZEVMGetTransactionResponse) String() string { return proto.CompactTextString(m) } func (*QueryZEVMGetTransactionResponse) ProtoMessage() {} func (*QueryZEVMGetTransactionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{57} + return fileDescriptor_65a992045e92a606, []int{59} } func (m *QueryZEVMGetTransactionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2967,7 +3055,7 @@ func (m *QueryZEVMGetBlockByNumberRequest) Reset() { *m = QueryZEVMGetBl func (m *QueryZEVMGetBlockByNumberRequest) String() string { return proto.CompactTextString(m) } func (*QueryZEVMGetBlockByNumberRequest) ProtoMessage() {} func (*QueryZEVMGetBlockByNumberRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{58} + return fileDescriptor_65a992045e92a606, []int{60} } func (m *QueryZEVMGetBlockByNumberRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3031,7 +3119,7 @@ func (m *QueryZEVMGetBlockByNumberResponse) Reset() { *m = QueryZEVMGetB func (m *QueryZEVMGetBlockByNumberResponse) String() string { return proto.CompactTextString(m) } func (*QueryZEVMGetBlockByNumberResponse) ProtoMessage() {} func (*QueryZEVMGetBlockByNumberResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_65a992045e92a606, []int{59} + return fileDescriptor_65a992045e92a606, []int{61} } func (m *QueryZEVMGetBlockByNumberResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3208,6 +3296,8 @@ func (m *QueryZEVMGetBlockByNumberResponse) GetMixHash() string { } func init() { + proto.RegisterType((*QueryCctxByStatusRequest)(nil), "zetachain.zetacore.crosschain.QueryCctxByStatusRequest") + proto.RegisterType((*QueryCctxByStatusResponse)(nil), "zetachain.zetacore.crosschain.QueryCctxByStatusResponse") proto.RegisterType((*QueryTssHistoryRequest)(nil), "zetachain.zetacore.crosschain.QueryTssHistoryRequest") proto.RegisterType((*QueryTssHistoryResponse)(nil), "zetachain.zetacore.crosschain.QueryTssHistoryResponse") proto.RegisterType((*QueryParamsRequest)(nil), "zetachain.zetacore.crosschain.QueryParamsRequest") @@ -3273,204 +3363,210 @@ func init() { func init() { proto.RegisterFile("crosschain/query.proto", fileDescriptor_65a992045e92a606) } var fileDescriptor_65a992045e92a606 = []byte{ - // 3151 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0xdd, 0x6f, 0x1b, 0xc7, - 0x11, 0xf7, 0x89, 0xfa, 0x5c, 0x4a, 0x96, 0xbc, 0x56, 0x1c, 0x86, 0xb1, 0x45, 0xe7, 0x1c, 0x5b, - 0x8e, 0x3f, 0xc8, 0x58, 0xb1, 0x95, 0xc4, 0x76, 0xd2, 0x48, 0x76, 0xac, 0x18, 0x51, 0x12, 0xf5, - 0xa4, 0xf4, 0xc3, 0x45, 0x4b, 0x9c, 0xc8, 0x35, 0x75, 0x30, 0xc9, 0x63, 0x6e, 0x97, 0x82, 0x14, - 0x43, 0x2d, 0x90, 0x87, 0x3e, 0x07, 0x28, 0xd0, 0xbe, 0xf4, 0xb5, 0x1f, 0x0f, 0x7d, 0x28, 0xd0, - 0xa0, 0x29, 0x50, 0x20, 0x45, 0xd1, 0xd6, 0xcd, 0x63, 0xd0, 0x02, 0x45, 0x3f, 0x00, 0xa2, 0x48, - 0xfa, 0xc4, 0xff, 0xa0, 0x40, 0x1f, 0x8a, 0x9d, 0x9b, 0xe3, 0xed, 0xf1, 0xee, 0xc4, 0x13, 0xc5, - 0x04, 0xed, 0x8b, 0xb8, 0x3b, 0x7b, 0x33, 0xfb, 0x9b, 0xd9, 0x99, 0xdd, 0xd9, 0x9b, 0x13, 0x39, - 0x51, 0x72, 0x6c, 0xce, 0x4b, 0x5b, 0xa6, 0x55, 0x2f, 0xbc, 0xd3, 0x64, 0xce, 0x6e, 0xbe, 0xe1, - 0xd8, 0xc2, 0xa6, 0xa7, 0xde, 0x65, 0xc2, 0x04, 0x72, 0x1e, 0x5a, 0xb6, 0xc3, 0xf2, 0xfe, 0xa3, - 0xd9, 0x0b, 0x25, 0x9b, 0xd7, 0x6c, 0x5e, 0xd8, 0x34, 0x39, 0x73, 0xf9, 0x0a, 0xdb, 0x57, 0x36, - 0x99, 0x30, 0xaf, 0x14, 0x1a, 0x66, 0xc5, 0xaa, 0x9b, 0xc2, 0xb2, 0xeb, 0xae, 0xa8, 0xec, 0x29, - 0x65, 0x0a, 0xf8, 0x5b, 0xac, 0xdb, 0xf5, 0x12, 0xe3, 0x38, 0x9c, 0x53, 0x87, 0x65, 0xb3, 0xe8, - 0x3e, 0x24, 0x76, 0xf0, 0x81, 0xac, 0xf2, 0x40, 0xc5, 0xe4, 0xc5, 0x86, 0x63, 0x95, 0x18, 0x8e, - 0x9d, 0x51, 0xc6, 0x80, 0xa7, 0xb8, 0x65, 0xf2, 0xad, 0xa2, 0xb0, 0x8b, 0xa5, 0x52, 0x47, 0xc0, - 0x5c, 0xe8, 0x21, 0xe1, 0x98, 0xa5, 0x07, 0xcc, 0xc1, 0x71, 0x5d, 0x19, 0xaf, 0x9a, 0x5c, 0x14, - 0x37, 0xab, 0x76, 0xe9, 0x41, 0x71, 0x8b, 0x59, 0x95, 0x2d, 0x11, 0x21, 0x03, 0xe0, 0x77, 0xcd, - 0xa1, 0x6a, 0x61, 0x37, 0x45, 0x78, 0x92, 0xc7, 0x95, 0x07, 0x1a, 0xa6, 0x63, 0xd6, 0x3c, 0xfd, - 0x67, 0x95, 0x01, 0xc1, 0x3b, 0xd4, 0x8a, 0x5d, 0xb1, 0xa1, 0x59, 0x90, 0x2d, 0xa4, 0x9e, 0xac, - 0xd8, 0x76, 0xa5, 0xca, 0x0a, 0x66, 0xc3, 0x2a, 0x98, 0xf5, 0xba, 0x2d, 0xc0, 0xce, 0xc8, 0xa3, - 0x67, 0xc8, 0x89, 0x2f, 0xcb, 0xa5, 0xd8, 0xe0, 0xfc, 0x35, 0x8b, 0x0b, 0xdb, 0xd9, 0x35, 0xd8, - 0x3b, 0x4d, 0xc6, 0x85, 0xfe, 0x2d, 0xf2, 0x78, 0x68, 0x84, 0x37, 0xec, 0x3a, 0x67, 0xf4, 0x16, - 0x19, 0x17, 0x9c, 0x17, 0xab, 0x16, 0x17, 0x19, 0xed, 0x74, 0xea, 0x7c, 0x7a, 0x41, 0xcf, 0xef, - 0xbb, 0xf6, 0xf9, 0x8d, 0xf5, 0xf5, 0xe5, 0xe1, 0x8f, 0x5b, 0xb9, 0x23, 0xc6, 0x98, 0xe0, 0x7c, - 0xd5, 0xe2, 0x42, 0x9f, 0x25, 0x14, 0xe4, 0xaf, 0x81, 0x62, 0xde, 0xac, 0xf7, 0xc8, 0xf1, 0x00, - 0xb5, 0x33, 0xe3, 0xa8, 0x6b, 0x80, 0x8c, 0x76, 0x5a, 0x3b, 0x9f, 0x5e, 0x38, 0xdb, 0x63, 0x3e, - 0x97, 0x1d, 0xa7, 0x44, 0x56, 0xfd, 0x0d, 0xf2, 0x24, 0xc8, 0x5e, 0x61, 0xe2, 0xad, 0xa6, 0xd8, - 0xd8, 0xd9, 0x70, 0x8d, 0x8d, 0x53, 0xd3, 0x0c, 0x19, 0x03, 0xe6, 0xbb, 0xb7, 0x61, 0x92, 0x94, - 0xe1, 0x75, 0xe9, 0x2c, 0x19, 0x81, 0xf5, 0xcb, 0x0c, 0x9d, 0xd6, 0xce, 0x0f, 0x1b, 0x6e, 0x47, - 0x6f, 0x92, 0x93, 0xd1, 0xe2, 0x10, 0xf3, 0xdb, 0x64, 0xd2, 0x56, 0xe8, 0x88, 0xfc, 0x62, 0x0f, - 0xe4, 0xaa, 0x28, 0xc4, 0x1f, 0x10, 0xa3, 0x33, 0xd4, 0x62, 0xa9, 0x5a, 0x8d, 0xd2, 0xe2, 0x0e, - 0x21, 0x7e, 0x34, 0xe1, 0x9c, 0xe7, 0xf2, 0x6e, 0xe8, 0xe5, 0x65, 0xe8, 0xe5, 0xdd, 0x90, 0xc5, - 0xd0, 0xcb, 0xaf, 0x99, 0x15, 0x86, 0xbc, 0x86, 0xc2, 0xa9, 0x7f, 0xa4, 0xa1, 0x7a, 0xa1, 0x79, - 0x62, 0xd5, 0x4b, 0x0d, 0x40, 0x3d, 0xba, 0x12, 0xc0, 0x3f, 0x04, 0xf8, 0xe7, 0x7b, 0xe2, 0x77, - 0x31, 0x05, 0x14, 0x78, 0x4f, 0x23, 0x7a, 0x94, 0x02, 0xcb, 0xbb, 0xb7, 0x24, 0x12, 0xcf, 0x5e, - 0xb3, 0x64, 0x04, 0x90, 0xe1, 0x9a, 0xbb, 0x9d, 0x2e, 0x2b, 0x0e, 0xf5, 0x6d, 0xc5, 0x3f, 0x68, - 0xe4, 0xcc, 0xbe, 0x20, 0xfe, 0x4f, 0x8c, 0xf9, 0x5d, 0x8d, 0x3c, 0xe5, 0xe9, 0x71, 0xb7, 0x1e, - 0x67, 0xcb, 0x27, 0xc8, 0xb8, 0xbb, 0x0f, 0x5b, 0xe5, 0x60, 0x08, 0x95, 0x07, 0x66, 0xd0, 0xdf, - 0x2a, 0xab, 0x1a, 0x05, 0x04, 0xed, 0x69, 0x90, 0xb4, 0x55, 0xef, 0x36, 0xe7, 0x85, 0x1e, 0xe6, - 0x54, 0xe5, 0xb9, 0xd6, 0x54, 0x85, 0x0c, 0xce, 0x98, 0xa7, 0xfc, 0x08, 0x56, 0xa6, 0xec, 0x6c, - 0x81, 0x8e, 0x1f, 0x78, 0xc1, 0xe1, 0xcf, 0x4f, 0x37, 0xfd, 0x06, 0x39, 0xe5, 0xed, 0x65, 0xf2, - 0xc9, 0xd7, 0x4c, 0xbe, 0xb5, 0x61, 0xdf, 0x2a, 0x89, 0x1d, 0x6f, 0x69, 0xb3, 0x64, 0xdc, 0xc2, - 0x01, 0x58, 0xda, 0x09, 0xa3, 0xd3, 0xd7, 0xf7, 0xc8, 0x5c, 0x1c, 0x33, 0x42, 0xfe, 0x06, 0x39, - 0x6a, 0x05, 0x46, 0x70, 0x63, 0xba, 0x9c, 0x00, 0xb5, 0xcf, 0x84, 0xc0, 0xbb, 0x44, 0xe9, 0x37, - 0x71, 0xfa, 0xe0, 0xc3, 0xb7, 0x4d, 0x61, 0x26, 0x01, 0xff, 0x2e, 0xc9, 0xc5, 0x72, 0x23, 0xfa, - 0xaf, 0x92, 0xa9, 0x5b, 0x12, 0x13, 0xb8, 0xd8, 0xc6, 0x0e, 0x4f, 0x18, 0x9d, 0x2a, 0x0f, 0x42, - 0x0f, 0xca, 0xd1, 0x2b, 0x68, 0x75, 0x5c, 0xe9, 0xb0, 0xd5, 0x07, 0xb5, 0x99, 0x3f, 0xd2, 0xd0, - 0x46, 0x11, 0x33, 0xed, 0xb3, 0x44, 0xa9, 0x01, 0x2d, 0xd1, 0xe0, 0x42, 0xe7, 0x06, 0x79, 0xc2, - 0x73, 0xb5, 0x0d, 0xce, 0x97, 0xca, 0x65, 0x87, 0x71, 0x2f, 0x70, 0xe8, 0x1c, 0x49, 0xcb, 0xb4, - 0xa4, 0xd1, 0xdc, 0x2c, 0x3e, 0x60, 0xbb, 0xb8, 0xd2, 0x13, 0x82, 0xf3, 0xb5, 0xe6, 0xe6, 0xeb, - 0x6c, 0x57, 0x7f, 0x85, 0x64, 0xa3, 0x98, 0xd1, 0x00, 0x33, 0x24, 0xc5, 0x84, 0xe7, 0x1f, 0xb2, - 0x29, 0x29, 0x9b, 0xa2, 0x04, 0x70, 0x27, 0x0c, 0xd9, 0xec, 0xe4, 0x2c, 0x52, 0xc2, 0xfa, 0xba, - 0x17, 0xb0, 0xaf, 0x63, 0xce, 0xe2, 0x51, 0x51, 0xe0, 0x55, 0x92, 0xda, 0x58, 0x5f, 0xc7, 0x55, - 0x4b, 0x90, 0x20, 0x19, 0xf2, 0x71, 0xbd, 0x80, 0x69, 0xd7, 0x0a, 0x13, 0x2b, 0x26, 0x5f, 0x93, - 0x79, 0xab, 0x72, 0x54, 0x59, 0xf5, 0x32, 0xdb, 0x41, 0x8c, 0x6e, 0x47, 0x2f, 0x92, 0x4c, 0x98, - 0xc1, 0x4f, 0xd4, 0x3c, 0x1a, 0xe2, 0x98, 0xef, 0x81, 0xa3, 0x23, 0xa2, 0xc3, 0xa8, 0x9b, 0x88, - 0x68, 0xa9, 0x5a, 0xed, 0x46, 0x34, 0x28, 0xff, 0xfc, 0xa9, 0x86, 0x4a, 0x04, 0xe6, 0x88, 0x54, - 0x22, 0xd5, 0x97, 0x12, 0x83, 0xf3, 0xc0, 0x05, 0xdf, 0x89, 0x20, 0x8e, 0xdf, 0x84, 0x7b, 0xc9, - 0xfe, 0x4b, 0xf4, 0xc0, 0x4f, 0x3c, 0x03, 0x3c, 0xa8, 0xe0, 0x2a, 0x49, 0x2b, 0x64, 0x34, 0x63, - 0xaf, 0x0d, 0x5d, 0x15, 0xa4, 0xb2, 0xeb, 0x65, 0x04, 0xb8, 0x54, 0xad, 0x46, 0x00, 0x1c, 0xd4, - 0x8a, 0x7d, 0xa0, 0xf9, 0x87, 0x58, 0x22, 0x9d, 0x52, 0x87, 0xd0, 0x69, 0x70, 0xab, 0x37, 0xe7, - 0x9f, 0xad, 0x6b, 0xac, 0x5e, 0xb6, 0xea, 0x95, 0x80, 0x79, 0x74, 0xe1, 0xef, 0xc8, 0x5d, 0xe3, - 0xa8, 0xd7, 0x3a, 0x39, 0xda, 0x70, 0x07, 0xf0, 0x46, 0x8a, 0xaa, 0x5d, 0xea, 0x75, 0x21, 0x09, - 0x48, 0x9b, 0x6a, 0xa8, 0x5d, 0xfd, 0x25, 0x72, 0xda, 0xbd, 0xf4, 0xa8, 0xd4, 0xc4, 0xb9, 0x95, - 0xfe, 0x6d, 0xcc, 0xcd, 0xa2, 0xd9, 0x11, 0xf8, 0xd7, 0x23, 0x80, 0x6b, 0x07, 0x05, 0xee, 0x1d, - 0x63, 0x41, 0xf8, 0x8b, 0xfe, 0xf9, 0xbf, 0x6a, 0x72, 0xb1, 0x2c, 0x6f, 0xc2, 0xaf, 0xc1, 0x45, - 0x78, 0xff, 0xb0, 0x78, 0x88, 0x47, 0x6f, 0x14, 0x1f, 0xa2, 0xfe, 0x1a, 0x99, 0xee, 0x1a, 0x42, - 0xd8, 0xf9, 0x1e, 0xb0, 0xbb, 0x05, 0x76, 0x8b, 0xd1, 0xb7, 0xfc, 0x13, 0x31, 0x06, 0xf4, 0xa0, - 0x42, 0xe5, 0xf7, 0x1a, 0xea, 0x19, 0x35, 0xd5, 0x7e, 0x7a, 0xa6, 0x06, 0xa0, 0xe7, 0xe0, 0x42, - 0xe7, 0xa2, 0x7f, 0xca, 0xa9, 0x29, 0x4a, 0xf4, 0xd2, 0xae, 0x2a, 0xbb, 0xa4, 0x4c, 0x0b, 0x76, - 0xc1, 0x55, 0xfa, 0xbd, 0x69, 0x57, 0xc8, 0x6c, 0x70, 0x6a, 0xb4, 0xda, 0x5b, 0x64, 0x52, 0x4d, - 0xa8, 0x12, 0xde, 0xb0, 0x55, 0x16, 0x23, 0x20, 0x40, 0xff, 0x26, 0xea, 0x28, 0x37, 0xb5, 0xcf, - 0x21, 0x0d, 0xfb, 0xb9, 0x86, 0x8a, 0x74, 0xe4, 0xc7, 0x2a, 0x92, 0x3a, 0x94, 0x22, 0x83, 0x5b, - 0xf5, 0xef, 0x28, 0xa7, 0x49, 0x49, 0xec, 0xe0, 0x6e, 0xf0, 0x05, 0x5e, 0xf8, 0x3e, 0x54, 0x0f, - 0x1a, 0x15, 0xc1, 0xff, 0xbc, 0xe9, 0x4e, 0xa2, 0xe9, 0x64, 0x44, 0xde, 0x63, 0xc2, 0x0c, 0xec, - 0x2e, 0xfa, 0x35, 0x54, 0xab, 0x7b, 0x14, 0xd5, 0x3a, 0x41, 0x46, 0x95, 0xfd, 0x2e, 0x65, 0x60, - 0x4f, 0xdf, 0xc0, 0x03, 0xec, 0x96, 0x5d, 0xdf, 0x66, 0x8e, 0xcc, 0xf8, 0x36, 0x6c, 0xc9, 0x1e, - 0x0a, 0xad, 0xd0, 0x82, 0x64, 0xc9, 0x78, 0xc5, 0xe4, 0xab, 0x56, 0xcd, 0x12, 0x98, 0xd2, 0x76, - 0xfa, 0xfa, 0x8f, 0x34, 0x3c, 0xf7, 0xc2, 0x62, 0x11, 0xcf, 0x25, 0x72, 0xcc, 0x6e, 0x8a, 0x4d, - 0xbb, 0x59, 0x2f, 0xaf, 0x98, 0xfc, 0x6e, 0x5d, 0x0e, 0x62, 0xc8, 0x87, 0x07, 0xe4, 0xd3, 0xf0, - 0x7a, 0xb1, 0x64, 0x57, 0xef, 0x30, 0x86, 0x4f, 0xbb, 0x93, 0x86, 0x07, 0xe8, 0x79, 0x32, 0x2d, - 0x7f, 0xd5, 0xcd, 0x2f, 0x05, 0xe1, 0xdf, 0x4d, 0xd6, 0xe7, 0xc9, 0x59, 0x80, 0xf9, 0x06, 0xe3, - 0xdc, 0xac, 0xb0, 0x35, 0x93, 0x73, 0xab, 0x5e, 0x59, 0xf3, 0x25, 0x7a, 0xd6, 0xbd, 0x43, 0xce, - 0xf5, 0x7a, 0x10, 0x15, 0x3b, 0x49, 0x26, 0xee, 0x77, 0x20, 0xe2, 0x95, 0xa1, 0x43, 0xd0, 0x6f, - 0xe0, 0x84, 0xf7, 0x5e, 0xfd, 0xca, 0x1b, 0x32, 0xbd, 0x77, 0xcc, 0x3a, 0x37, 0x4b, 0x72, 0x79, - 0x0d, 0x56, 0x62, 0x56, 0xa3, 0x73, 0x58, 0x50, 0x32, 0xbc, 0xe5, 0x5f, 0x2f, 0xa1, 0xad, 0xff, - 0x67, 0x18, 0x51, 0xec, 0xc3, 0xdd, 0x31, 0x2f, 0xc1, 0x17, 0xc8, 0x1d, 0x21, 0xcb, 0x53, 0xed, - 0x56, 0x6e, 0x02, 0xa8, 0xf2, 0x26, 0x65, 0xf8, 0x4d, 0xba, 0x40, 0x26, 0xdd, 0xa7, 0xeb, 0xcd, - 0xda, 0x26, 0x73, 0x5c, 0xcb, 0x2e, 0x4f, 0xb7, 0x5b, 0xb9, 0x34, 0xd0, 0xdf, 0x04, 0xb2, 0xa1, - 0x76, 0xe8, 0xcb, 0x64, 0xa6, 0x64, 0xd7, 0x85, 0x63, 0x96, 0x44, 0xd1, 0x74, 0xaf, 0x3e, 0x60, - 0xe5, 0x89, 0xe5, 0xe3, 0xed, 0x56, 0x6e, 0xda, 0x1b, 0xf3, 0x6e, 0x45, 0xdd, 0x04, 0xfa, 0x2a, - 0x39, 0x5e, 0x6a, 0xd6, 0x9a, 0x55, 0x53, 0x58, 0xdb, 0xac, 0x58, 0x31, 0x79, 0xb1, 0xc9, 0x59, - 0x39, 0x33, 0x0c, 0x22, 0x1e, 0x6b, 0xb7, 0x72, 0xc7, 0xfc, 0xe1, 0x15, 0x93, 0xbf, 0xcd, 0x59, - 0xd9, 0x08, 0x93, 0xe8, 0x49, 0x32, 0x7c, 0xdf, 0xb1, 0x6b, 0x99, 0x11, 0xe0, 0x1b, 0x6f, 0xb7, - 0x72, 0xd0, 0x37, 0xe0, 0x2f, 0x3d, 0x07, 0x3e, 0xea, 0x4a, 0x1e, 0x85, 0x27, 0xd2, 0xed, 0x56, - 0x6e, 0xac, 0x82, 0xf2, 0xbc, 0x86, 0x34, 0x57, 0xd5, 0xae, 0xf0, 0xe2, 0x66, 0xd5, 0xb6, 0x6b, - 0x99, 0x31, 0xdf, 0x5c, 0x92, 0xba, 0x2c, 0x89, 0x86, 0xdf, 0xa4, 0x3a, 0x19, 0xe5, 0xc2, 0x14, - 0x4d, 0x9e, 0x19, 0x87, 0x27, 0x49, 0xbb, 0x95, 0x43, 0x8a, 0x81, 0xbf, 0xf4, 0x04, 0x19, 0x12, - 0x76, 0x66, 0x02, 0xc6, 0x47, 0xdb, 0xad, 0xdc, 0x90, 0xb0, 0x8d, 0x21, 0x61, 0x4b, 0xb3, 0x09, - 0x7f, 0xd9, 0xdc, 0xe5, 0x21, 0xbe, 0xd9, 0x94, 0x31, 0x58, 0xa4, 0x6e, 0x02, 0x5d, 0x22, 0xc7, - 0x54, 0x7e, 0xf7, 0xa8, 0x4c, 0x83, 0x80, 0xd9, 0x76, 0x2b, 0xa7, 0x0a, 0xbf, 0x2b, 0xc7, 0x8c, - 0x10, 0x85, 0x2e, 0x92, 0x61, 0xa9, 0x4b, 0x66, 0x32, 0xd1, 0x9b, 0xf6, 0x55, 0xbb, 0x62, 0xc0, - 0xf3, 0xfa, 0x7b, 0x29, 0x92, 0x5a, 0xb5, 0x2b, 0x72, 0x4b, 0xf0, 0x16, 0xdc, 0xf5, 0x4e, 0xaf, - 0x2b, 0x37, 0x19, 0x61, 0x37, 0xac, 0x12, 0xcf, 0x0c, 0x9d, 0x4e, 0x9d, 0x9f, 0x30, 0xb0, 0x27, - 0x9d, 0xb9, 0x6c, 0x0a, 0xd3, 0xf5, 0x0f, 0x03, 0xda, 0x21, 0x9f, 0x93, 0x0b, 0x3f, 0xdc, 0xdb, - 0xe7, 0x42, 0xc6, 0x1b, 0x39, 0xac, 0xf1, 0x46, 0x61, 0xe2, 0xa4, 0xc6, 0x0b, 0x06, 0xd6, 0x58, - 0x8f, 0xc0, 0x7a, 0x86, 0x48, 0xb7, 0xc1, 0x89, 0xc6, 0x61, 0xa2, 0xc9, 0x76, 0x2b, 0x37, 0x5e, - 0xb5, 0x2b, 0xee, 0x04, 0x9d, 0x16, 0x3d, 0x4b, 0xc6, 0x1c, 0x56, 0xb3, 0xb7, 0x59, 0x19, 0xbc, - 0x66, 0xdc, 0xf5, 0x54, 0x24, 0x19, 0x5e, 0x43, 0xbf, 0x8a, 0x69, 0x66, 0xd4, 0x16, 0x10, 0xbf, - 0x73, 0xfc, 0x7b, 0x18, 0x53, 0xc6, 0x28, 0xb6, 0x2f, 0x6c, 0xcb, 0xf0, 0x62, 0x35, 0x15, 0x19, - 0xab, 0x4f, 0x90, 0x54, 0xc5, 0xe4, 0xb8, 0x01, 0x8c, 0xb5, 0x5b, 0x39, 0xd9, 0x35, 0xe4, 0x1f, - 0x69, 0xc6, 0x4e, 0xd1, 0x0d, 0x17, 0x1c, 0xcc, 0x58, 0xe9, 0xdc, 0xcb, 0xbd, 0x96, 0x9c, 0x03, - 0xf0, 0x8f, 0xfa, 0x73, 0xc8, 0xbe, 0x6b, 0x07, 0x9a, 0x93, 0xc9, 0x65, 0xa3, 0x29, 0x70, 0xe1, - 0x26, 0xda, 0xad, 0x9c, 0x4b, 0x30, 0xdc, 0x1f, 0xf9, 0x80, 0x9b, 0x2f, 0x8e, 0xfb, 0x0f, 0x00, - 0x01, 0x53, 0xc7, 0xd8, 0xb8, 0x8e, 0x74, 0x2d, 0x72, 0xa0, 0xb8, 0xcc, 0x91, 0x91, 0x6d, 0xb3, - 0xda, 0x64, 0x18, 0xce, 0x30, 0x37, 0x10, 0x0c, 0xf7, 0x47, 0xea, 0x26, 0x76, 0x1b, 0x2c, 0x33, - 0xe9, 0xeb, 0x26, 0xfb, 0x06, 0xfc, 0xa5, 0x05, 0x92, 0x36, 0x4b, 0x25, 0xe6, 0xd5, 0xd1, 0xa6, - 0x64, 0x04, 0x2e, 0x1f, 0x6d, 0xb7, 0x72, 0xc4, 0x25, 0xaf, 0x5a, 0x32, 0x13, 0xf2, 0xdb, 0x72, - 0x73, 0xec, 0x24, 0x5b, 0x47, 0xfd, 0xcd, 0x11, 0xcf, 0x77, 0xff, 0xa0, 0x3f, 0x4e, 0xb4, 0xed, - 0xcc, 0x34, 0x3c, 0x30, 0xd2, 0x6e, 0xe5, 0xb4, 0x6d, 0x43, 0xdb, 0x96, 0x44, 0x27, 0x33, 0xe3, - 0x13, 0x1d, 0x43, 0x73, 0x24, 0x91, 0x67, 0x8e, 0xf9, 0x44, 0x6e, 0x68, 0x5c, 0xbf, 0x8e, 0x97, - 0x51, 0x74, 0x3d, 0x38, 0x7e, 0x97, 0x77, 0xd1, 0x3f, 0xd0, 0x67, 0x4f, 0x90, 0xd1, 0x2d, 0x3f, - 0x3b, 0x19, 0x36, 0xb0, 0xa7, 0xff, 0x6d, 0x0c, 0xaf, 0xa2, 0xd1, 0xcc, 0xe8, 0xb9, 0x3a, 0x19, - 0x45, 0x2f, 0xd4, 0xfc, 0xfd, 0xd8, 0xa5, 0x18, 0xf8, 0xdb, 0xf1, 0x8b, 0xa1, 0x48, 0xbf, 0x28, - 0x90, 0x74, 0xc3, 0x74, 0x58, 0x5d, 0xb8, 0xce, 0xef, 0x3a, 0x28, 0xd8, 0xce, 0x25, 0x83, 0xf7, - 0x2b, 0x6d, 0xdf, 0x4f, 0x86, 0x63, 0xfc, 0xa4, 0x40, 0xd2, 0x7c, 0xcb, 0x7c, 0xae, 0xd8, 0xac, - 0x97, 0xaa, 0x8c, 0xa3, 0xd3, 0x82, 0x44, 0x49, 0x7e, 0x1b, 0xa8, 0x86, 0xd2, 0xee, 0x3a, 0x82, - 0x46, 0x7b, 0x1c, 0x41, 0x41, 0x77, 0xe3, 0x45, 0xc7, 0xb6, 0x3d, 0xa7, 0xee, 0x76, 0x37, 0x6e, - 0xd8, 0xb6, 0x30, 0x42, 0x14, 0x39, 0xa1, 0x3c, 0xab, 0x98, 0xcb, 0x3b, 0xee, 0x4f, 0x08, 0x54, - 0x60, 0xf2, 0x9b, 0xf4, 0x1a, 0x99, 0x72, 0xdc, 0x1c, 0x03, 0x27, 0x73, 0x43, 0x60, 0xa6, 0xdd, - 0xca, 0x4d, 0x7a, 0x03, 0xc0, 0x13, 0xe8, 0x49, 0x3b, 0xd5, 0xac, 0x3a, 0x73, 0x30, 0x14, 0xc0, - 0x4e, 0x40, 0x30, 0xdc, 0x1f, 0x9a, 0x27, 0xa4, 0x6c, 0xdd, 0xbf, 0x6f, 0x95, 0x9a, 0x55, 0xb1, - 0x8b, 0x9e, 0x0f, 0x66, 0xf2, 0xa9, 0x86, 0xd2, 0x86, 0x23, 0xc0, 0x16, 0x66, 0xb5, 0xa8, 0x70, - 0x4d, 0x2a, 0x47, 0x80, 0x1c, 0xbb, 0xed, 0xb3, 0x76, 0x13, 0xa4, 0xd6, 0x6c, 0x47, 0x38, 0x66, - 0x11, 0x0e, 0xa4, 0x29, 0x5f, 0x6b, 0xa0, 0xc2, 0x6b, 0x7a, 0xbf, 0x29, 0xbd, 0x86, 0x5b, 0xef, - 0x32, 0x0c, 0x0f, 0xf0, 0x1a, 0xd9, 0x37, 0xe0, 0xaf, 0xb7, 0x2d, 0x55, 0x21, 0x05, 0x9e, 0x0e, - 0x6c, 0x4b, 0x90, 0x06, 0xfb, 0x09, 0x71, 0x20, 0x11, 0x99, 0xd9, 0x27, 0x11, 0xb9, 0x48, 0x26, - 0x84, 0x55, 0x63, 0x5c, 0x98, 0xb5, 0x06, 0x46, 0x12, 0xa0, 0xeb, 0x10, 0x0d, 0xbf, 0x49, 0xaf, - 0x92, 0x49, 0x75, 0x55, 0x33, 0x14, 0x42, 0x1e, 0x96, 0x24, 0xb0, 0xda, 0x81, 0x9e, 0x8c, 0x16, - 0x74, 0xca, 0xe3, 0xf0, 0x3c, 0x44, 0x8b, 0x4b, 0x31, 0xf0, 0x97, 0x5e, 0x27, 0x33, 0xf2, 0x66, - 0x52, 0xbc, 0xcf, 0x58, 0xb1, 0xc1, 0x1c, 0x99, 0x9e, 0x65, 0x66, 0x01, 0xcd, 0xb1, 0x76, 0x2b, - 0x37, 0x25, 0xc7, 0xee, 0x30, 0xb6, 0xc6, 0x9c, 0x15, 0x93, 0x1b, 0xc1, 0xae, 0x54, 0xb5, 0x66, - 0xb9, 0xdf, 0x40, 0x64, 0x1e, 0xf3, 0x55, 0xad, 0x59, 0xf0, 0x02, 0xdf, 0xf0, 0x1a, 0x0b, 0x8f, - 0xe6, 0xc9, 0x08, 0xc4, 0x36, 0xfd, 0xbe, 0x46, 0x46, 0xdd, 0x02, 0x3b, 0xbd, 0xd2, 0x23, 0x1b, - 0x09, 0x57, 0xf8, 0xb3, 0x0b, 0x07, 0x61, 0x71, 0x77, 0x0c, 0xfd, 0xec, 0x7b, 0x7f, 0xfe, 0xd7, - 0xf7, 0x86, 0x72, 0xf4, 0x54, 0x41, 0x72, 0x5c, 0x56, 0x3e, 0xfc, 0x50, 0x3f, 0x8e, 0xa0, 0x8f, - 0x34, 0x32, 0xa9, 0xd6, 0x44, 0xe9, 0xf5, 0x24, 0x73, 0x45, 0x7f, 0x0e, 0x90, 0xbd, 0xd1, 0x17, - 0x2f, 0x02, 0x7e, 0x09, 0x00, 0x3f, 0x4f, 0xaf, 0xc5, 0x00, 0x56, 0xab, 0xb4, 0x85, 0x87, 0xf8, - 0xf6, 0x63, 0xaf, 0xf0, 0x10, 0x36, 0xa3, 0x3d, 0xfa, 0xa1, 0x46, 0xa6, 0x55, 0xb9, 0x4b, 0xd5, - 0x6a, 0x32, 0x5d, 0xa2, 0x3f, 0x0a, 0x48, 0xa6, 0x4b, 0x4c, 0xa1, 0x5f, 0xbf, 0x08, 0xba, 0x9c, - 0xa5, 0x67, 0x12, 0xe8, 0x42, 0xff, 0xa1, 0x91, 0x13, 0x5d, 0xc8, 0xf1, 0x4d, 0x24, 0x5d, 0xea, - 0x03, 0x44, 0xf0, 0x25, 0x68, 0x76, 0xf9, 0x30, 0x22, 0x50, 0x9d, 0xeb, 0xa0, 0xce, 0x55, 0xba, - 0x90, 0x40, 0x1d, 0xe4, 0xc5, 0x15, 0xda, 0xa3, 0x7f, 0xd7, 0xc8, 0x63, 0x4a, 0x25, 0x55, 0x51, - 0xee, 0x95, 0x84, 0xc8, 0x62, 0x8b, 0xe7, 0xd9, 0xa5, 0x43, 0x48, 0x40, 0xd5, 0x6e, 0x82, 0x6a, - 0x8b, 0xf4, 0x6a, 0x8c, 0x6a, 0x56, 0x3d, 0x46, 0xb3, 0xa2, 0x55, 0xde, 0xa3, 0xbf, 0xd4, 0xc8, - 0xd1, 0xa0, 0x72, 0x89, 0x7d, 0x2e, 0xa2, 0x8c, 0x9d, 0xd8, 0xe7, 0xa2, 0x6a, 0xdc, 0x3d, 0x7d, - 0x4e, 0xd1, 0x84, 0xd3, 0x3f, 0x22, 0x70, 0xa5, 0xe0, 0x78, 0x33, 0x61, 0xf0, 0x46, 0x96, 0x5d, - 0xb3, 0x2f, 0xf5, 0xc9, 0x8d, 0xe0, 0x5f, 0x00, 0xf0, 0x0b, 0xf4, 0xd9, 0x7d, 0xc0, 0xfb, 0x6c, - 0x85, 0x87, 0x5e, 0x7f, 0x8f, 0xfe, 0x45, 0x23, 0x34, 0x5c, 0x88, 0xa6, 0x89, 0xf0, 0xc4, 0x96, - 0xbf, 0xb3, 0x2f, 0xf7, 0xcb, 0x8e, 0xfa, 0x2c, 0x81, 0x3e, 0x37, 0xe8, 0x8b, 0xb1, 0xfa, 0x74, - 0x7f, 0x44, 0x07, 0xa7, 0xb5, 0xaa, 0xd8, 0x6f, 0x34, 0x72, 0x2c, 0x38, 0x83, 0x74, 0xaf, 0x9b, - 0x07, 0x70, 0x91, 0x3e, 0x57, 0x29, 0xb6, 0xe0, 0xad, 0x5f, 0x06, 0xad, 0xe6, 0xe9, 0xd9, 0x44, - 0xab, 0x44, 0x3f, 0xd0, 0xc8, 0x54, 0xa0, 0x70, 0x4c, 0x5f, 0x48, 0xe8, 0x25, 0xa1, 0x42, 0x75, - 0xf6, 0xc5, 0x3e, 0x38, 0x11, 0x75, 0x1e, 0x50, 0x9f, 0xa7, 0xe7, 0x62, 0x50, 0x57, 0x98, 0x28, - 0x0a, 0xce, 0xbd, 0x57, 0x3c, 0xf4, 0x7d, 0x0d, 0xaa, 0xd0, 0xc9, 0x0e, 0xea, 0x40, 0x59, 0x3b, - 0xd9, 0x41, 0x1d, 0xac, 0x79, 0xeb, 0x3a, 0xc0, 0x3b, 0x49, 0xb3, 0x31, 0xf0, 0x24, 0x94, 0x9f, - 0x69, 0x7e, 0x41, 0x97, 0x2e, 0x26, 0x9c, 0xa4, 0xab, 0xf2, 0x9c, 0x7d, 0xfe, 0xc0, 0x7c, 0x88, - 0xb0, 0x00, 0x08, 0x9f, 0xa1, 0xf3, 0x71, 0x06, 0x44, 0x06, 0xe9, 0xbd, 0x65, 0xb6, 0xb3, 0x47, - 0x7f, 0xa2, 0x91, 0xb4, 0x27, 0x45, 0x3a, 0xed, 0x62, 0x42, 0xb7, 0xeb, 0x0b, 0x71, 0x44, 0xfd, - 0x5b, 0x9f, 0x07, 0xc4, 0x4f, 0xd1, 0x5c, 0x0f, 0xc4, 0xf4, 0x23, 0x8d, 0xcc, 0x74, 0xbf, 0xc0, - 0xa5, 0x89, 0xb6, 0xe1, 0x98, 0xb7, 0xc9, 0xd9, 0x9b, 0xfd, 0x31, 0x27, 0x34, 0x75, 0xa9, 0x1b, - 0xeb, 0x23, 0x8d, 0xa4, 0x95, 0x77, 0xb4, 0xf4, 0x76, 0x92, 0xe9, 0x7b, 0xbd, 0x0b, 0xce, 0xbe, - 0x7a, 0x48, 0x29, 0xa8, 0xcd, 0x05, 0xd0, 0xe6, 0x69, 0xaa, 0xc7, 0xe5, 0xa0, 0x0a, 0xf0, 0x5f, - 0x69, 0x81, 0xf2, 0x37, 0x4d, 0x1a, 0xf0, 0xe1, 0x82, 0x7d, 0xf6, 0x7a, 0x3f, 0xac, 0x08, 0x79, - 0x01, 0x20, 0x5f, 0xa2, 0x17, 0xe2, 0x16, 0xc0, 0xe7, 0xe9, 0xb8, 0xfb, 0x2f, 0x34, 0x72, 0x54, - 0x91, 0x25, 0x3d, 0xfe, 0xc5, 0x84, 0x9e, 0xdb, 0x2f, 0xfa, 0xe8, 0x4f, 0x08, 0x7a, 0x1a, 0x5c, - 0x41, 0x4f, 0x7f, 0xad, 0x91, 0x99, 0x40, 0xa5, 0x5a, 0xe2, 0x4e, 0x9a, 0x81, 0x44, 0x7d, 0x09, - 0x90, 0xbd, 0xd9, 0x1f, 0x33, 0x62, 0xbf, 0x04, 0xd8, 0xcf, 0xd1, 0xa7, 0xe3, 0x9c, 0x45, 0xe5, - 0xa2, 0x7f, 0xd2, 0xc8, 0x6c, 0x54, 0xf1, 0x9e, 0x7e, 0x29, 0xd1, 0x5d, 0x29, 0xfe, 0xab, 0x81, - 0xec, 0x2b, 0xfd, 0x0b, 0x40, 0x4d, 0x9e, 0x07, 0x4d, 0xae, 0xd0, 0x42, 0x12, 0x4d, 0xd4, 0x74, - 0xf2, 0x63, 0x2d, 0x54, 0xd3, 0xa6, 0x49, 0x13, 0xab, 0xe8, 0x8a, 0x7c, 0xb2, 0x44, 0x26, 0xfe, - 0x6b, 0x02, 0x7d, 0x11, 0x74, 0x79, 0x96, 0xe6, 0x63, 0x74, 0xa9, 0x06, 0xf9, 0x3a, 0x31, 0xf1, - 0x3b, 0x8d, 0xd0, 0x2e, 0x99, 0xd2, 0xbf, 0x92, 0x26, 0x20, 0x87, 0xd1, 0x26, 0xfe, 0x9b, 0x81, - 0x9e, 0xa9, 0x40, 0x97, 0x36, 0xf4, 0x87, 0x1a, 0x19, 0x86, 0x54, 0x26, 0xe9, 0xc1, 0xae, 0x26, - 0x5b, 0xcf, 0x1d, 0x88, 0x27, 0x61, 0x16, 0x5f, 0xc2, 0xf4, 0x17, 0x8c, 0xfc, 0x81, 0xdc, 0x33, - 0xfd, 0x6f, 0x05, 0x92, 0xef, 0x99, 0xa1, 0xef, 0x0b, 0xfa, 0x03, 0x7b, 0x0d, 0xc0, 0x16, 0xe8, - 0xe5, 0x7d, 0xc1, 0x86, 0xae, 0xea, 0x3f, 0xd0, 0xc8, 0x98, 0x97, 0xcf, 0x2e, 0x24, 0xdd, 0xed, - 0x0e, 0x6a, 0xd8, 0xae, 0xef, 0x05, 0xf4, 0x33, 0x80, 0xf5, 0x14, 0x7d, 0x72, 0x1f, 0xac, 0xee, - 0x4e, 0xee, 0x22, 0xc3, 0x08, 0x4f, 0xbe, 0x93, 0x87, 0x4a, 0xfd, 0xc9, 0x77, 0xf2, 0x70, 0x8d, - 0xbe, 0xf7, 0x4e, 0xee, 0xf3, 0xc0, 0x2d, 0x34, 0x58, 0x13, 0x4f, 0x86, 0x3a, 0xb2, 0xca, 0x9e, - 0x0c, 0x75, 0x74, 0x09, 0xbe, 0xe7, 0x05, 0xa1, 0x1a, 0x44, 0xf9, 0x63, 0x8d, 0x10, 0xff, 0x7f, - 0x65, 0xe8, 0xb5, 0x24, 0x33, 0x87, 0xfe, 0xeb, 0x26, 0xbb, 0x78, 0x50, 0x36, 0x04, 0xfb, 0x0c, - 0x80, 0x3d, 0x43, 0x9f, 0x8a, 0x01, 0x2b, 0x3a, 0x2c, 0xcb, 0xaf, 0x7f, 0xfc, 0xe9, 0x9c, 0xf6, - 0xc9, 0xa7, 0x73, 0xda, 0x3f, 0x3f, 0x9d, 0xd3, 0xde, 0xff, 0x6c, 0xee, 0xc8, 0x27, 0x9f, 0xcd, - 0x1d, 0xf9, 0xeb, 0x67, 0x73, 0x47, 0xee, 0x5d, 0xa9, 0x58, 0x62, 0xab, 0xb9, 0x99, 0x2f, 0xd9, - 0x35, 0x55, 0x8c, 0x87, 0xa3, 0xb0, 0x13, 0x90, 0xb8, 0xdb, 0x60, 0x7c, 0x73, 0x14, 0xd2, 0x9e, - 0xe7, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x16, 0xbf, 0x39, 0xb6, 0x14, 0x36, 0x00, 0x00, + // 3234 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0xdb, 0x6f, 0x1b, 0xc7, + 0xd5, 0xf7, 0x8a, 0xba, 0x0e, 0x75, 0xf3, 0x58, 0x71, 0x18, 0xc6, 0x16, 0x9d, 0x75, 0x7c, 0xb7, + 0xc9, 0x58, 0xb1, 0x95, 0xc4, 0x76, 0xf2, 0x45, 0xb2, 0x63, 0xc5, 0x88, 0x92, 0xe8, 0x5b, 0x29, + 0xdf, 0xd7, 0xba, 0x48, 0x89, 0x15, 0x39, 0xa6, 0x16, 0x26, 0xb9, 0xcc, 0xce, 0x50, 0x90, 0x62, + 0xa8, 0x2d, 0xf2, 0xd0, 0xe7, 0x00, 0x05, 0xda, 0x97, 0xbe, 0xf6, 0xf2, 0xd0, 0x87, 0x02, 0x0d, + 0x9a, 0x02, 0x05, 0x52, 0x14, 0x6d, 0xd3, 0x3c, 0x06, 0x2d, 0x50, 0xf4, 0x02, 0x10, 0x45, 0xd2, + 0x27, 0xfe, 0x07, 0x05, 0xfa, 0x50, 0xcc, 0xd9, 0xb3, 0xdc, 0x59, 0xee, 0xae, 0xb8, 0xa2, 0x98, + 0xa0, 0x7d, 0x11, 0x67, 0xce, 0xec, 0x39, 0xf3, 0x3b, 0x97, 0x39, 0x73, 0x66, 0x67, 0x45, 0x8e, + 0x97, 0x1c, 0x9b, 0xf3, 0xd2, 0x96, 0x69, 0xd5, 0x0b, 0xef, 0x34, 0x99, 0xb3, 0x9b, 0x6f, 0x38, + 0xb6, 0xb0, 0xe9, 0xc9, 0x77, 0x99, 0x30, 0x81, 0x9c, 0x87, 0x96, 0xed, 0xb0, 0xbc, 0xff, 0x68, + 0xf6, 0x62, 0xc9, 0xe6, 0x35, 0x9b, 0x17, 0x36, 0x4d, 0xce, 0x5c, 0xbe, 0xc2, 0xf6, 0xd5, 0x4d, + 0x26, 0xcc, 0xab, 0x85, 0x86, 0x59, 0xb1, 0xea, 0xa6, 0xb0, 0xec, 0xba, 0x2b, 0x2a, 0x7b, 0x52, + 0x99, 0x02, 0xfe, 0x16, 0xeb, 0x76, 0xbd, 0xc4, 0x38, 0x0e, 0xe7, 0xd4, 0x61, 0xd9, 0x2c, 0xba, + 0x0f, 0x89, 0x1d, 0x7c, 0x20, 0xab, 0x3c, 0x50, 0x31, 0x79, 0xb1, 0xe1, 0x58, 0x25, 0x86, 0x63, + 0xa7, 0x95, 0x31, 0xe0, 0x29, 0x6e, 0x99, 0x7c, 0xab, 0x28, 0xec, 0x62, 0xa9, 0xd4, 0x11, 0x30, + 0x1f, 0x7a, 0x48, 0x38, 0x66, 0xe9, 0x21, 0x73, 0x70, 0x5c, 0x57, 0xc6, 0xab, 0x26, 0x17, 0xc5, + 0xcd, 0xaa, 0x5d, 0x7a, 0x58, 0xdc, 0x62, 0x56, 0x65, 0x4b, 0x44, 0xc8, 0x00, 0xf8, 0x5d, 0x73, + 0xa8, 0x5a, 0xd8, 0x4d, 0x11, 0x9e, 0xe4, 0x71, 0xe5, 0x81, 0x86, 0xe9, 0x98, 0x35, 0x4f, 0xff, + 0x39, 0x65, 0x40, 0xf0, 0x0e, 0xb5, 0x62, 0x57, 0x6c, 0x68, 0x16, 0x64, 0x0b, 0xa9, 0x27, 0x2a, + 0xb6, 0x5d, 0xa9, 0xb2, 0x82, 0xd9, 0xb0, 0x0a, 0x66, 0xbd, 0x6e, 0x0b, 0xb0, 0x33, 0xf2, 0xe8, + 0x6f, 0x93, 0xcc, 0xff, 0x4a, 0x57, 0xdc, 0x2e, 0x89, 0x9d, 0xe5, 0xdd, 0x75, 0x61, 0x8a, 0x26, + 0x37, 0xd8, 0x3b, 0x4d, 0xc6, 0x05, 0x5d, 0x22, 0xa3, 0x1c, 0x08, 0x19, 0xed, 0x94, 0x76, 0x7e, + 0x7a, 0xe1, 0x42, 0x7e, 0x5f, 0x07, 0xe7, 0xa5, 0x0c, 0x94, 0x80, 0x8c, 0xba, 0x43, 0x9e, 0x88, + 0x10, 0xcf, 0x1b, 0x76, 0x9d, 0x33, 0xfa, 0x16, 0x99, 0xbc, 0x2d, 0xb9, 0x6f, 0x4b, 0xee, 0x8d, + 0x9d, 0x8c, 0x76, 0x2a, 0x75, 0x3e, 0xbd, 0x70, 0xa9, 0xd7, 0x2c, 0x0a, 0xcb, 0xf2, 0xf0, 0x27, + 0xad, 0xdc, 0x11, 0x23, 0x20, 0x46, 0xcf, 0x90, 0xe3, 0x30, 0xe7, 0x06, 0xe7, 0xaf, 0x5a, 0x5c, + 0xd8, 0xce, 0x2e, 0x2a, 0xa4, 0x7f, 0x9d, 0x3c, 0x1e, 0x1a, 0x41, 0x2c, 0xb7, 0xc9, 0xb8, 0xe0, + 0xbc, 0x58, 0xb5, 0xb8, 0x40, 0x1c, 0x7a, 0x0f, 0x1c, 0x1b, 0xeb, 0xeb, 0x38, 0xfd, 0x98, 0xe0, + 0x7c, 0xd5, 0xe2, 0x42, 0x9f, 0x23, 0x14, 0xe4, 0xaf, 0x81, 0xaf, 0xbc, 0x59, 0xef, 0x93, 0x63, + 0x01, 0x6a, 0x67, 0xc6, 0x51, 0xd7, 0xa7, 0x60, 0xdd, 0xf4, 0xc2, 0x99, 0x1e, 0xf3, 0xb9, 0xec, + 0x38, 0x25, 0xb2, 0xea, 0xaf, 0x93, 0x27, 0x41, 0xf6, 0x0a, 0x13, 0x6f, 0x36, 0xc5, 0xc6, 0xce, + 0x86, 0x1b, 0x3f, 0x9e, 0x07, 0x33, 0x64, 0x0c, 0x98, 0xef, 0xdd, 0x81, 0x49, 0x52, 0x86, 0xd7, + 0xa5, 0x73, 0x64, 0x04, 0x42, 0x32, 0x33, 0x74, 0x4a, 0x3b, 0x3f, 0x6c, 0xb8, 0x1d, 0xbd, 0x49, + 0x4e, 0x44, 0x8b, 0xf3, 0x3d, 0x66, 0x2b, 0x74, 0x44, 0xde, 0xcb, 0x63, 0xaa, 0x28, 0xcf, 0x63, + 0xaa, 0x18, 0x9d, 0xa1, 0x16, 0x4b, 0xd5, 0x6a, 0x94, 0x16, 0x77, 0x09, 0xf1, 0x13, 0x04, 0xce, + 0x79, 0x36, 0xef, 0x66, 0x93, 0xbc, 0xcc, 0x26, 0x79, 0x37, 0x0b, 0x61, 0x36, 0xc9, 0xaf, 0x99, + 0x15, 0x86, 0xbc, 0x86, 0xc2, 0xa9, 0x7f, 0xa4, 0xa1, 0x7a, 0xa1, 0x79, 0x62, 0xd5, 0x4b, 0x0d, + 0x40, 0x3d, 0xba, 0x12, 0xc0, 0x3f, 0x04, 0xf8, 0xcf, 0xf5, 0xc4, 0xef, 0x62, 0x0a, 0x28, 0xf0, + 0x9e, 0x46, 0xf4, 0x28, 0x05, 0x96, 0x77, 0x21, 0xf6, 0x3d, 0x7b, 0xcd, 0x91, 0x11, 0x40, 0x86, + 0x3e, 0x77, 0x3b, 0x5d, 0x56, 0x1c, 0xea, 0xdb, 0x8a, 0xbf, 0xd3, 0xc8, 0xe9, 0x7d, 0x41, 0xfc, + 0x97, 0x18, 0xf3, 0xdb, 0x1a, 0x79, 0xca, 0xd3, 0xe3, 0x5e, 0x3d, 0xce, 0x96, 0x4f, 0x90, 0x71, + 0x77, 0x6b, 0xb1, 0xca, 0xc1, 0x25, 0x54, 0x1e, 0x98, 0x41, 0x7f, 0xad, 0x78, 0x35, 0x0a, 0x08, + 0xda, 0xd3, 0x20, 0x69, 0xab, 0xde, 0x6d, 0xce, 0x8b, 0x3d, 0xcc, 0xa9, 0xca, 0x73, 0xad, 0xa9, + 0x0a, 0x19, 0x9c, 0x31, 0x4f, 0xfa, 0x2b, 0x58, 0x99, 0xb2, 0x93, 0x02, 0x1d, 0x7f, 0xe1, 0x05, + 0x87, 0xbf, 0x38, 0xdd, 0xf4, 0x9b, 0xe4, 0xa4, 0x97, 0xcb, 0xe4, 0x93, 0xaf, 0x9a, 0x7c, 0x6b, + 0xc3, 0x96, 0xfb, 0x90, 0xe7, 0xda, 0x2c, 0x19, 0xb7, 0x70, 0x00, 0x5c, 0x3b, 0x61, 0x74, 0xfa, + 0xfa, 0x1e, 0x99, 0x8f, 0x63, 0x46, 0xc8, 0x5f, 0x23, 0xd3, 0x56, 0x60, 0x04, 0x13, 0xd3, 0x95, + 0x04, 0xa8, 0x7d, 0x26, 0x04, 0xde, 0x25, 0x4a, 0xbf, 0x85, 0xd3, 0x07, 0x1f, 0xbe, 0x63, 0x0a, + 0x33, 0x09, 0xf8, 0x77, 0x49, 0x2e, 0x96, 0x1b, 0xd1, 0xff, 0x3f, 0x99, 0x52, 0xf7, 0x4c, 0xde, + 0xff, 0xde, 0x1b, 0x94, 0xa3, 0x57, 0xd0, 0xea, 0xe8, 0xe9, 0xb0, 0xd5, 0x07, 0x95, 0xcc, 0x3f, + 0xd6, 0xd0, 0x46, 0x11, 0x33, 0xed, 0xe3, 0xa2, 0xd4, 0x80, 0x5c, 0x34, 0xb8, 0xa5, 0x73, 0x13, + 0x4b, 0xa4, 0x15, 0x26, 0x36, 0x38, 0x5f, 0x2a, 0x97, 0x1d, 0xc6, 0x3b, 0x25, 0xd8, 0x3c, 0x49, + 0xcb, 0xb2, 0xa4, 0xd1, 0xdc, 0x2c, 0x3e, 0x64, 0xbb, 0xe8, 0xe9, 0x09, 0xc1, 0xf9, 0x5a, 0x73, + 0xf3, 0x35, 0xb6, 0xab, 0xbf, 0x4c, 0xb2, 0x51, 0xcc, 0x68, 0x80, 0x59, 0x92, 0x62, 0xc2, 0x8b, + 0x0f, 0xd9, 0x94, 0x94, 0x4d, 0x51, 0x02, 0xb8, 0x13, 0x86, 0x6c, 0x76, 0x6a, 0x16, 0x29, 0x61, + 0x7d, 0xdd, 0x5b, 0xb0, 0xaf, 0x61, 0xcd, 0xe2, 0x51, 0x51, 0xe0, 0x35, 0x92, 0xda, 0x58, 0x5f, + 0x47, 0xaf, 0x25, 0x28, 0x90, 0x0c, 0xf9, 0xb8, 0x5e, 0xc0, 0xb2, 0x6b, 0x85, 0x89, 0x15, 0x93, + 0xaf, 0xc9, 0x52, 0x5c, 0xd9, 0xaa, 0xac, 0x7a, 0x99, 0xed, 0x20, 0x46, 0xb7, 0xa3, 0x17, 0xb1, + 0x28, 0x0d, 0x30, 0xf8, 0x85, 0x9a, 0x47, 0x43, 0x1c, 0xe7, 0x7a, 0xe0, 0xe8, 0x88, 0xe8, 0x30, + 0xea, 0x26, 0x22, 0x5a, 0xaa, 0x56, 0xbb, 0x11, 0x0d, 0x2a, 0x3e, 0x7f, 0xac, 0xa1, 0x12, 0x81, + 0x39, 0x22, 0x95, 0x48, 0xf5, 0xa5, 0xc4, 0xe0, 0x22, 0x70, 0xc1, 0x0f, 0x22, 0x58, 0xc7, 0x6f, + 0xc0, 0x51, 0x6b, 0x7f, 0x17, 0x3d, 0xf4, 0x0b, 0xcf, 0x00, 0x0f, 0x2a, 0xb8, 0x4a, 0xd2, 0x0a, + 0x19, 0xcd, 0xd8, 0x2b, 0xa1, 0xab, 0x82, 0x54, 0x76, 0xbd, 0x8c, 0x00, 0x97, 0xaa, 0xd5, 0x08, + 0x80, 0x83, 0xf2, 0xd8, 0x07, 0x9a, 0xbf, 0x89, 0x25, 0xd2, 0x29, 0x75, 0x08, 0x9d, 0x06, 0xe7, + 0xbd, 0x79, 0x7f, 0x6f, 0x5d, 0x63, 0xf5, 0xb2, 0x55, 0xaf, 0x04, 0xcc, 0xa3, 0x0b, 0x3f, 0x23, + 0x77, 0x8d, 0xa3, 0x5e, 0xeb, 0x64, 0xba, 0xe1, 0x0e, 0xe0, 0x21, 0x1b, 0x55, 0xbb, 0xdc, 0xeb, + 0x40, 0x12, 0x90, 0x36, 0xd5, 0x50, 0xbb, 0xfa, 0x8b, 0xe4, 0x94, 0x7b, 0xe8, 0x51, 0xa9, 0x89, + 0x6b, 0x2b, 0xfd, 0x1b, 0x58, 0x9b, 0x45, 0xb3, 0x23, 0xf0, 0xaf, 0x46, 0x00, 0xd7, 0x0e, 0x0a, + 0xdc, 0xdb, 0xc6, 0x82, 0xf0, 0x17, 0xfd, 0xfd, 0x7f, 0xd5, 0xe4, 0x62, 0x59, 0x1e, 0xee, 0x5f, + 0x85, 0xb3, 0xfd, 0xfe, 0xcb, 0xe2, 0x11, 0x6e, 0xbd, 0x51, 0x7c, 0x88, 0xfa, 0x2b, 0x64, 0xa6, + 0x6b, 0x08, 0x61, 0xe7, 0x7b, 0xc0, 0xee, 0x16, 0xd8, 0x2d, 0x46, 0xdf, 0xf2, 0x77, 0xc4, 0x18, + 0xd0, 0x83, 0x5a, 0x2a, 0xbf, 0xd5, 0x50, 0xcf, 0xa8, 0xa9, 0xf6, 0xd3, 0x33, 0x35, 0x00, 0x3d, + 0x07, 0xb7, 0x74, 0x2e, 0xf9, 0xbb, 0x9c, 0x5a, 0xa2, 0x44, 0xbb, 0x76, 0x55, 0xc9, 0x92, 0xf0, + 0x36, 0x03, 0x42, 0xa5, 0xdf, 0x93, 0x76, 0x85, 0xcc, 0x05, 0xa7, 0x46, 0xab, 0xbd, 0x19, 0x7a, + 0x27, 0xa2, 0x1d, 0xb0, 0x2e, 0xeb, 0x7a, 0x1b, 0xf2, 0x36, 0xea, 0x28, 0x93, 0xda, 0x17, 0x50, + 0x86, 0xfd, 0x54, 0x43, 0x45, 0x3a, 0xf2, 0x63, 0x15, 0x49, 0x1d, 0x4a, 0x91, 0xc1, 0x79, 0xfd, + 0x9b, 0xca, 0x6e, 0x52, 0x12, 0x3b, 0x98, 0x0d, 0xbe, 0xc4, 0x03, 0xdf, 0x87, 0xea, 0x46, 0xa3, + 0x22, 0xf8, 0x8f, 0x37, 0xdd, 0x09, 0x34, 0x9d, 0x5c, 0x91, 0xf7, 0x99, 0x30, 0x03, 0xd9, 0x45, + 0xbf, 0x8e, 0x6a, 0x75, 0x8f, 0xa2, 0x5a, 0xc7, 0xc9, 0xa8, 0x92, 0xef, 0x52, 0x06, 0xf6, 0xf4, + 0x0d, 0xdc, 0xc0, 0x6e, 0xdb, 0xf5, 0x6d, 0xe6, 0xc8, 0x8a, 0x6f, 0xc3, 0x96, 0xec, 0xa1, 0xa5, + 0x15, 0x72, 0x48, 0x96, 0x8c, 0x57, 0x4c, 0xbe, 0x6a, 0xd5, 0x2c, 0x81, 0x25, 0x6d, 0xa7, 0xaf, + 0xff, 0x40, 0xc3, 0x7d, 0x2f, 0x2c, 0x16, 0xf1, 0x5c, 0x26, 0x47, 0xed, 0xa6, 0xd8, 0xb4, 0x9b, + 0xf5, 0xf2, 0x8a, 0xc9, 0xef, 0xd5, 0xe5, 0x20, 0x2e, 0xf9, 0xf0, 0x80, 0x7c, 0x1a, 0xde, 0x98, + 0x96, 0xec, 0xea, 0x5d, 0xc6, 0xf0, 0x69, 0x77, 0xd2, 0xf0, 0x00, 0x3d, 0x4f, 0x66, 0xe4, 0xaf, + 0x9a, 0xfc, 0x52, 0xb0, 0xfc, 0xbb, 0xc9, 0xfa, 0x39, 0x72, 0x06, 0x60, 0xbe, 0xce, 0x38, 0x37, + 0x2b, 0x6c, 0xcd, 0xe4, 0xdc, 0xaa, 0x57, 0xd6, 0x7c, 0x89, 0x9e, 0x75, 0xef, 0x92, 0xb3, 0xbd, + 0x1e, 0x44, 0xc5, 0x4e, 0x90, 0x89, 0x07, 0x1d, 0x88, 0x78, 0x64, 0xe8, 0x10, 0xf4, 0x9b, 0x38, + 0xe1, 0xfd, 0x57, 0xfe, 0xef, 0x75, 0x59, 0xde, 0x3b, 0x66, 0x9d, 0x9b, 0x25, 0xe9, 0x5e, 0x83, + 0x95, 0x98, 0xd5, 0xe8, 0x6c, 0x16, 0x94, 0x0c, 0x6f, 0xf9, 0xc7, 0x4b, 0x68, 0xeb, 0xff, 0x1a, + 0x46, 0x14, 0xfb, 0x70, 0x77, 0xcc, 0x4b, 0xf0, 0x9d, 0x78, 0x47, 0xc8, 0xf2, 0x54, 0xbb, 0x95, + 0x9b, 0x00, 0xaa, 0x3c, 0x49, 0x19, 0x7e, 0x93, 0x2e, 0x90, 0x49, 0xf7, 0xe9, 0x7a, 0xb3, 0xb6, + 0xc9, 0x1c, 0xd7, 0xb2, 0xcb, 0x33, 0xed, 0x56, 0x2e, 0x0d, 0xf4, 0x37, 0x80, 0x6c, 0xa8, 0x1d, + 0xfa, 0x12, 0x99, 0x2d, 0xd9, 0x75, 0xe1, 0x98, 0x25, 0x51, 0x34, 0xdd, 0xa3, 0x0f, 0x58, 0x79, + 0x62, 0xf9, 0x58, 0xbb, 0x95, 0x9b, 0xf1, 0xc6, 0xbc, 0x53, 0x51, 0x37, 0x81, 0xbe, 0x42, 0x8e, + 0x95, 0x9a, 0xb5, 0x66, 0xd5, 0x14, 0xd6, 0x36, 0x2b, 0x56, 0x4c, 0x5e, 0x6c, 0x72, 0x56, 0xce, + 0x0c, 0x83, 0x88, 0xc7, 0xda, 0xad, 0xdc, 0x51, 0x7f, 0x78, 0xc5, 0xe4, 0x6f, 0x71, 0x56, 0x36, + 0xc2, 0x24, 0x7a, 0x82, 0x0c, 0x3f, 0x70, 0xec, 0x5a, 0x66, 0x04, 0xf8, 0xc6, 0xdb, 0xad, 0x1c, + 0xf4, 0x0d, 0xf8, 0x4b, 0xcf, 0x42, 0x8c, 0xba, 0x92, 0x47, 0xe1, 0x89, 0x74, 0xbb, 0x95, 0x1b, + 0xab, 0xa0, 0x3c, 0xaf, 0x21, 0xcd, 0x55, 0xb5, 0x2b, 0xbc, 0xb8, 0x59, 0xb5, 0xed, 0x5a, 0x66, + 0xcc, 0x37, 0x97, 0xa4, 0x2e, 0x4b, 0xa2, 0xe1, 0x37, 0xa9, 0xde, 0x79, 0x35, 0x3f, 0x0e, 0x4f, + 0x92, 0x76, 0x2b, 0x87, 0x14, 0xef, 0xdd, 0x3b, 0x3d, 0x4e, 0x86, 0x84, 0x9d, 0x99, 0x80, 0xf1, + 0xd1, 0x76, 0x2b, 0x37, 0x24, 0x6c, 0x63, 0x48, 0xd8, 0xd2, 0x6c, 0xc2, 0x77, 0x9b, 0xeb, 0x1e, + 0xe2, 0x9b, 0x4d, 0x19, 0x03, 0x27, 0x75, 0x13, 0xe8, 0x12, 0x39, 0xaa, 0xf2, 0xbb, 0x5b, 0x65, + 0x1a, 0x04, 0xcc, 0xb5, 0x5b, 0x39, 0x55, 0xf8, 0x3d, 0x39, 0x66, 0x84, 0x28, 0x74, 0x91, 0x0c, + 0x4b, 0x5d, 0x32, 0x93, 0x89, 0xde, 0xb4, 0xaf, 0xda, 0x15, 0x03, 0x9e, 0xd7, 0xdf, 0x4b, 0x91, + 0xd4, 0xaa, 0x5d, 0x91, 0x29, 0xc1, 0x73, 0xb8, 0x1b, 0x9d, 0x5e, 0x57, 0x26, 0x19, 0x61, 0x37, + 0xac, 0x12, 0xcf, 0x0c, 0x9d, 0x4a, 0x9d, 0x9f, 0x30, 0xb0, 0x27, 0x83, 0xb9, 0x6c, 0x0a, 0xd3, + 0x8d, 0x0f, 0x03, 0xda, 0xa1, 0x98, 0x93, 0x8e, 0x1f, 0xee, 0x1d, 0x73, 0x21, 0xe3, 0x8d, 0x1c, + 0xd6, 0x78, 0xa3, 0x30, 0x71, 0x52, 0xe3, 0x05, 0x17, 0xd6, 0x58, 0x8f, 0x85, 0x75, 0x81, 0xc8, + 0xb0, 0xc1, 0x89, 0xc6, 0x61, 0xa2, 0xc9, 0x76, 0x2b, 0x37, 0x5e, 0xb5, 0x2b, 0xee, 0x04, 0x9d, + 0x16, 0x3d, 0x43, 0xc6, 0x1c, 0x56, 0xb3, 0xb7, 0x59, 0x19, 0xa2, 0x66, 0xdc, 0x8d, 0x54, 0x24, + 0x19, 0x5e, 0x43, 0xbf, 0x86, 0x65, 0x66, 0x54, 0x0a, 0x88, 0xcf, 0x1c, 0xff, 0x1c, 0xc6, 0x92, + 0x31, 0x8a, 0xed, 0x4b, 0x4b, 0x19, 0xde, 0x5a, 0x4d, 0x45, 0xae, 0xd5, 0x27, 0x48, 0xaa, 0x62, + 0x72, 0x4c, 0x00, 0x63, 0xed, 0x56, 0x4e, 0x76, 0x0d, 0xf9, 0x47, 0x9a, 0xb1, 0x73, 0x8f, 0x88, + 0x0e, 0x07, 0x33, 0x56, 0x3a, 0xe7, 0x72, 0xaf, 0x25, 0xe7, 0x00, 0xfc, 0xa3, 0xfe, 0x1c, 0xb2, + 0xef, 0xda, 0x81, 0xe6, 0x64, 0x71, 0xd9, 0x68, 0x0a, 0x74, 0xdc, 0x44, 0xbb, 0x95, 0x73, 0x09, + 0x86, 0xfb, 0x23, 0x1f, 0x70, 0xeb, 0xc5, 0x71, 0xff, 0x01, 0x20, 0x60, 0xe9, 0x18, 0xbb, 0xae, + 0x23, 0x43, 0x8b, 0x1c, 0x68, 0x5d, 0xe6, 0xc8, 0xc8, 0xb6, 0x59, 0x6d, 0x32, 0x5c, 0xce, 0x30, + 0x37, 0x10, 0x0c, 0xf7, 0x47, 0xea, 0x26, 0x76, 0x1b, 0x2c, 0x33, 0xe9, 0xeb, 0x26, 0xfb, 0x06, + 0xfc, 0xa5, 0x05, 0x92, 0x36, 0x4b, 0x25, 0xe6, 0xdd, 0xa3, 0x4d, 0xc9, 0x15, 0xb8, 0x3c, 0xdd, + 0x6e, 0xe5, 0x88, 0x4b, 0x5e, 0xb5, 0x64, 0x25, 0xe4, 0xb7, 0x65, 0x72, 0xec, 0x14, 0x5b, 0xd3, + 0x7e, 0x72, 0xc4, 0xfd, 0xdd, 0xdf, 0xe8, 0x8f, 0x11, 0x6d, 0x3b, 0x33, 0x03, 0x0f, 0x8c, 0xb4, + 0x5b, 0x39, 0x6d, 0xdb, 0xd0, 0xb6, 0x25, 0xd1, 0xc9, 0xcc, 0xfa, 0x44, 0xc7, 0xd0, 0x1c, 0x49, + 0xe4, 0x99, 0xa3, 0x3e, 0x91, 0x1b, 0x1a, 0xd7, 0x6f, 0xe0, 0x61, 0x14, 0x43, 0x0f, 0xb6, 0xdf, + 0xe5, 0x5d, 0x8c, 0x0f, 0x8c, 0xd9, 0xe3, 0x64, 0x74, 0xcb, 0xaf, 0x4e, 0x86, 0x0d, 0xec, 0xe9, + 0x7f, 0x19, 0xc3, 0xa3, 0x68, 0x34, 0x33, 0x46, 0xae, 0x4e, 0x46, 0x31, 0x0a, 0x35, 0x3f, 0x1f, + 0xbb, 0x14, 0x03, 0x7f, 0x3b, 0x71, 0x31, 0x14, 0x19, 0x17, 0x05, 0x92, 0x6e, 0x98, 0x0e, 0xab, + 0x0b, 0x37, 0xf8, 0xdd, 0x00, 0x05, 0xdb, 0xb9, 0x64, 0x88, 0x7e, 0xa5, 0xed, 0xc7, 0xc9, 0x70, + 0x4c, 0x9c, 0x14, 0x48, 0x9a, 0x6f, 0x99, 0xcf, 0x16, 0x9b, 0xf5, 0x52, 0x95, 0x71, 0x0c, 0x5a, + 0x90, 0x28, 0xc9, 0x6f, 0x01, 0xd5, 0x50, 0xda, 0x5d, 0x5b, 0xd0, 0x68, 0x8f, 0x2d, 0x28, 0x18, + 0x6e, 0xbc, 0xe8, 0xd8, 0xb6, 0x17, 0xd4, 0xdd, 0xe1, 0xc6, 0x0d, 0xdb, 0x16, 0x46, 0x88, 0x22, + 0x27, 0x94, 0x7b, 0x15, 0x73, 0x79, 0xc7, 0xfd, 0x09, 0x81, 0x0a, 0x4c, 0x7e, 0x93, 0x5e, 0x27, + 0x53, 0x8e, 0x5b, 0x63, 0xe0, 0x64, 0xee, 0x12, 0x98, 0x6d, 0xb7, 0x72, 0x93, 0xde, 0x00, 0xf0, + 0x04, 0x7a, 0xd2, 0x4e, 0x35, 0xab, 0xce, 0x1c, 0x5c, 0x0a, 0x60, 0x27, 0x20, 0x18, 0xee, 0x0f, + 0xcd, 0x13, 0x52, 0xb6, 0x1e, 0x3c, 0xb0, 0x4a, 0xcd, 0xaa, 0xd8, 0xc5, 0xc8, 0x07, 0x33, 0xf9, + 0x54, 0x43, 0x69, 0xc3, 0x16, 0x60, 0x0b, 0xb3, 0x5a, 0x54, 0xb8, 0x26, 0x95, 0x2d, 0x40, 0x8e, + 0xdd, 0xf1, 0x59, 0xbb, 0x09, 0x52, 0x6b, 0xb6, 0x23, 0x1c, 0xb3, 0x08, 0x1b, 0xd2, 0x94, 0xaf, + 0x35, 0x50, 0xe1, 0x35, 0xbd, 0xdf, 0x94, 0x51, 0xc3, 0xad, 0x77, 0x19, 0x2e, 0x0f, 0x88, 0x1a, + 0xd9, 0x37, 0xe0, 0xaf, 0x97, 0x96, 0xaa, 0x50, 0x02, 0xcf, 0x04, 0xd2, 0x12, 0x94, 0xc1, 0x7e, + 0x41, 0x1c, 0x28, 0x44, 0x66, 0xf7, 0x29, 0x44, 0x2e, 0x91, 0x09, 0x61, 0xd5, 0x18, 0x17, 0x66, + 0xad, 0x81, 0x2b, 0x09, 0xd0, 0x75, 0x88, 0x86, 0xdf, 0xa4, 0xd7, 0xc8, 0xa4, 0xea, 0xd5, 0x0c, + 0x85, 0x25, 0x0f, 0x2e, 0x09, 0x78, 0x3b, 0xd0, 0x93, 0xab, 0x05, 0x83, 0xf2, 0x18, 0x3c, 0x0f, + 0xab, 0xc5, 0xa5, 0x18, 0xf8, 0x4b, 0x6f, 0x90, 0x59, 0x79, 0x32, 0x29, 0x3e, 0x60, 0xac, 0xd8, + 0x60, 0x8e, 0x2c, 0xcf, 0x32, 0x73, 0x80, 0xe6, 0x68, 0xbb, 0x95, 0x9b, 0x92, 0x63, 0x77, 0x19, + 0x5b, 0x63, 0xce, 0x8a, 0xc9, 0x8d, 0x60, 0x57, 0xaa, 0x5a, 0xb3, 0xdc, 0xcf, 0x3a, 0x32, 0x8f, + 0xf9, 0xaa, 0xd6, 0x2c, 0x78, 0x81, 0x6f, 0x78, 0x8d, 0x85, 0x6f, 0x5d, 0x20, 0x23, 0xb0, 0xb6, + 0xe9, 0x77, 0x35, 0x32, 0xea, 0x5e, 0xb0, 0xd3, 0xab, 0x3d, 0xaa, 0x91, 0xf0, 0x0d, 0x7f, 0x76, + 0xe1, 0x20, 0x2c, 0x6e, 0xc6, 0xd0, 0xcf, 0xbc, 0xf7, 0xc7, 0x7f, 0x7c, 0x67, 0x28, 0x47, 0x4f, + 0x16, 0x24, 0xc7, 0x15, 0xe5, 0x5b, 0x16, 0xf5, 0x7b, 0x0f, 0xfa, 0xb1, 0x46, 0x26, 0xd5, 0x3b, + 0x51, 0x7a, 0x23, 0xc9, 0x5c, 0xd1, 0x9f, 0x03, 0x64, 0x6f, 0xf6, 0xc5, 0x8b, 0x80, 0x5f, 0x04, + 0xc0, 0xcf, 0xd1, 0xeb, 0x31, 0x80, 0xd5, 0x5b, 0xda, 0xc2, 0x23, 0x7c, 0xfb, 0xb1, 0x57, 0x78, + 0x04, 0xc9, 0x68, 0x8f, 0x7e, 0xa8, 0x91, 0x19, 0x55, 0xee, 0x52, 0xb5, 0x9a, 0x4c, 0x97, 0xe8, + 0x8f, 0x02, 0x92, 0xe9, 0x12, 0x73, 0xd1, 0xaf, 0x5f, 0x02, 0x5d, 0xce, 0xd0, 0xd3, 0x09, 0x74, + 0xa1, 0x7f, 0xd3, 0xc8, 0xf1, 0x2e, 0xe4, 0xf8, 0x26, 0x92, 0x2e, 0xf5, 0x01, 0x22, 0xf8, 0x12, + 0x34, 0xbb, 0x7c, 0x18, 0x11, 0xa8, 0xce, 0x0d, 0x50, 0xe7, 0x1a, 0x5d, 0x48, 0xa0, 0x0e, 0xf2, + 0xa2, 0x87, 0xf6, 0xe8, 0x5f, 0x35, 0xf2, 0x98, 0x72, 0x93, 0xaa, 0x28, 0xf7, 0x72, 0x42, 0x64, + 0xb1, 0x97, 0xe7, 0xd9, 0xa5, 0x43, 0x48, 0x40, 0xd5, 0x6e, 0x81, 0x6a, 0x8b, 0xf4, 0x5a, 0x8c, + 0x6a, 0x56, 0x3d, 0x46, 0xb3, 0xa2, 0x55, 0xde, 0xa3, 0x3f, 0xd7, 0xc8, 0x74, 0x50, 0xb9, 0xc4, + 0x31, 0x17, 0x71, 0x8d, 0x9d, 0x38, 0xe6, 0xa2, 0xee, 0xb8, 0x7b, 0xc6, 0x9c, 0xa2, 0x09, 0xa7, + 0xbf, 0x47, 0xe0, 0xca, 0x85, 0xe3, 0xad, 0x84, 0x8b, 0x37, 0xf2, 0xda, 0x35, 0xfb, 0x62, 0x9f, + 0xdc, 0x08, 0xfe, 0x79, 0x00, 0xbf, 0x40, 0x9f, 0xd9, 0x07, 0xbc, 0xcf, 0x56, 0x78, 0xe4, 0xf5, + 0xf7, 0xe8, 0x9f, 0x34, 0x42, 0xc3, 0x17, 0xd1, 0x34, 0x11, 0x9e, 0xd8, 0xeb, 0xef, 0xec, 0x4b, + 0xfd, 0xb2, 0xa3, 0x3e, 0x4b, 0xa0, 0xcf, 0x4d, 0xfa, 0x42, 0xac, 0x3e, 0xdd, 0xdf, 0x05, 0xc2, + 0x6e, 0xad, 0x2a, 0xf6, 0x2b, 0x8d, 0x1c, 0x0d, 0xce, 0x20, 0xc3, 0xeb, 0xd6, 0x01, 0x42, 0xa4, + 0x4f, 0x2f, 0xc5, 0x5e, 0x78, 0xeb, 0x57, 0x40, 0xab, 0x73, 0xf4, 0x4c, 0x22, 0x2f, 0xd1, 0x0f, + 0x34, 0x32, 0x15, 0xb8, 0x38, 0xa6, 0xcf, 0x27, 0x8c, 0x92, 0xd0, 0x45, 0x75, 0xf6, 0x85, 0x3e, + 0x38, 0x11, 0x75, 0x1e, 0x50, 0x9f, 0xa7, 0x67, 0x63, 0x50, 0x57, 0x98, 0x28, 0x0a, 0xce, 0xbd, + 0x57, 0x3c, 0xf4, 0x7d, 0x0d, 0x6e, 0xa1, 0x93, 0x6d, 0xd4, 0x81, 0x6b, 0xed, 0x64, 0x1b, 0x75, + 0xf0, 0xce, 0x5b, 0xd7, 0x01, 0xde, 0x09, 0x9a, 0x8d, 0x81, 0x27, 0xa1, 0xfc, 0x44, 0xf3, 0x2f, + 0x74, 0xe9, 0x62, 0xc2, 0x49, 0xba, 0x6e, 0x9e, 0xb3, 0xcf, 0x1d, 0x98, 0x0f, 0x11, 0x16, 0x00, + 0xe1, 0x05, 0x7a, 0x2e, 0xce, 0x80, 0xc8, 0x20, 0xa3, 0xb7, 0xcc, 0x76, 0xf6, 0xe8, 0x8f, 0x34, + 0x92, 0xf6, 0xa4, 0xc8, 0xa0, 0x5d, 0x4c, 0x18, 0x76, 0x7d, 0x21, 0x8e, 0xb8, 0xff, 0xd6, 0xcf, + 0x01, 0xe2, 0xa7, 0x68, 0xae, 0x07, 0x62, 0xfa, 0x91, 0x46, 0x66, 0xbb, 0x5f, 0xe0, 0xd2, 0x44, + 0x69, 0x38, 0xe6, 0x6d, 0x72, 0xf6, 0x56, 0x7f, 0xcc, 0x09, 0x4d, 0x5d, 0xea, 0xc6, 0xfa, 0xb1, + 0x46, 0xd2, 0xca, 0x3b, 0x5a, 0x7a, 0x27, 0xc9, 0xf4, 0xbd, 0xde, 0x05, 0x67, 0x5f, 0x39, 0xa4, + 0x14, 0xd4, 0xe6, 0x22, 0x68, 0xf3, 0x34, 0xd5, 0xe3, 0x6a, 0x50, 0x05, 0xf8, 0x2f, 0xb4, 0xc0, + 0xf5, 0x37, 0x4d, 0xba, 0xe0, 0xc3, 0x17, 0xf6, 0xd9, 0x1b, 0xfd, 0xb0, 0x22, 0xe4, 0x05, 0x80, + 0x7c, 0x99, 0x5e, 0x8c, 0x73, 0x80, 0xcf, 0xd3, 0x09, 0xf7, 0x9f, 0x69, 0x64, 0x5a, 0x91, 0x25, + 0x23, 0xfe, 0x85, 0x84, 0x91, 0xdb, 0x2f, 0xfa, 0xe8, 0x4f, 0x08, 0x7a, 0x1a, 0x5c, 0x41, 0x4f, + 0x7f, 0xa9, 0x91, 0xd9, 0xc0, 0x4d, 0xb5, 0xc4, 0x9d, 0xb4, 0x02, 0x89, 0xfa, 0x12, 0x20, 0x7b, + 0xab, 0x3f, 0x66, 0xc4, 0x7e, 0x19, 0xb0, 0x9f, 0xa5, 0x4f, 0xc7, 0x05, 0x8b, 0xca, 0x45, 0xff, + 0xa0, 0x91, 0xb9, 0xa8, 0xcb, 0x7b, 0xfa, 0x3f, 0x89, 0xce, 0x4a, 0xf1, 0x5f, 0x0d, 0x64, 0x5f, + 0xee, 0x5f, 0x00, 0x6a, 0xf2, 0x1c, 0x68, 0x72, 0x95, 0x16, 0x92, 0x68, 0xa2, 0x96, 0x93, 0x9f, + 0x68, 0xa1, 0x3b, 0x6d, 0x9a, 0xb4, 0xb0, 0x8a, 0xbe, 0x91, 0x4f, 0x56, 0xc8, 0xc4, 0x7f, 0x4d, + 0xa0, 0x2f, 0x82, 0x2e, 0xcf, 0xd0, 0x7c, 0x8c, 0x2e, 0xd5, 0x20, 0x5f, 0x67, 0x4d, 0xfc, 0x46, + 0x23, 0xb4, 0x4b, 0xa6, 0x8c, 0xaf, 0xa4, 0x05, 0xc8, 0x61, 0xb4, 0x89, 0xff, 0x66, 0xa0, 0x67, + 0x29, 0xd0, 0xa5, 0x0d, 0xfd, 0xbe, 0x46, 0x86, 0xa1, 0x94, 0x49, 0xba, 0xb1, 0xab, 0xc5, 0xd6, + 0xb3, 0x07, 0xe2, 0x49, 0x58, 0xc5, 0x97, 0xb0, 0xfc, 0x05, 0x23, 0x7f, 0x20, 0x73, 0xa6, 0xff, + 0xad, 0x40, 0xf2, 0x9c, 0x19, 0xfa, 0xbe, 0xa0, 0x3f, 0xb0, 0xd7, 0x01, 0x6c, 0x81, 0x5e, 0xd9, + 0x17, 0x6c, 0xe8, 0xa8, 0xfe, 0x3d, 0x8d, 0x8c, 0x79, 0xf5, 0xec, 0x42, 0xd2, 0x6c, 0x77, 0x50, + 0xc3, 0x76, 0x7d, 0x2f, 0xa0, 0x9f, 0x06, 0xac, 0x27, 0xe9, 0x93, 0xfb, 0x60, 0x75, 0x33, 0xb9, + 0x8b, 0x0c, 0x57, 0x78, 0xf2, 0x4c, 0x1e, 0xba, 0xea, 0x4f, 0x9e, 0xc9, 0xc3, 0x77, 0xf4, 0xbd, + 0x33, 0xb9, 0xcf, 0x03, 0xa7, 0xd0, 0xe0, 0x9d, 0x78, 0x32, 0xd4, 0x91, 0xb7, 0xec, 0xc9, 0x50, + 0x47, 0x5f, 0xc1, 0xf7, 0x3c, 0x20, 0x54, 0x83, 0x28, 0x7f, 0xa8, 0x11, 0xe2, 0xff, 0xaf, 0x0c, + 0xbd, 0x9e, 0x64, 0xe6, 0xd0, 0x7f, 0xdd, 0x64, 0x17, 0x0f, 0xca, 0x86, 0x60, 0x2f, 0x00, 0xd8, + 0xd3, 0xf4, 0xa9, 0x18, 0xb0, 0xc2, 0x47, 0xf6, 0xa1, 0x46, 0x26, 0xd5, 0x7f, 0x31, 0xa2, 0x89, + 0x2a, 0xd3, 0x88, 0xff, 0x79, 0xca, 0x3e, 0x7f, 0x70, 0x46, 0x84, 0x7b, 0x0d, 0xe0, 0xe6, 0xe9, + 0xe5, 0x7d, 0x22, 0x62, 0x13, 0x99, 0x0a, 0x8f, 0xdc, 0x3b, 0xda, 0xbd, 0xe5, 0xd7, 0x3e, 0xf9, + 0x6c, 0x5e, 0xfb, 0xf4, 0xb3, 0x79, 0xed, 0xef, 0x9f, 0xcd, 0x6b, 0xef, 0x7f, 0x3e, 0x7f, 0xe4, + 0xd3, 0xcf, 0xe7, 0x8f, 0xfc, 0xf9, 0xf3, 0xf9, 0x23, 0xf7, 0xaf, 0x56, 0x2c, 0xb1, 0xd5, 0xdc, + 0xcc, 0x97, 0xec, 0x9a, 0x2a, 0xd1, 0x03, 0x55, 0xd8, 0x09, 0xd8, 0x62, 0xb7, 0xc1, 0xf8, 0xe6, + 0x28, 0x14, 0x6c, 0xcf, 0xfe, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x62, 0xb0, 0x08, 0xf4, 0xa1, 0x37, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3531,6 +3627,7 @@ type QueryClient interface { // Queries a list of lastMetaHeight items. LastZetaHeight(ctx context.Context, in *QueryLastZetaHeightRequest, opts ...grpc.CallOption) (*QueryLastZetaHeightResponse, error) TssHistory(ctx context.Context, in *QueryTssHistoryRequest, opts ...grpc.CallOption) (*QueryTssHistoryResponse, error) + CctxByStatus(ctx context.Context, in *QueryCctxByStatusRequest, opts ...grpc.CallOption) (*QueryCctxByStatusResponse, error) } type queryClient struct { @@ -3784,6 +3881,15 @@ func (c *queryClient) TssHistory(ctx context.Context, in *QueryTssHistoryRequest return out, nil } +func (c *queryClient) CctxByStatus(ctx context.Context, in *QueryCctxByStatusRequest, opts ...grpc.CallOption) (*QueryCctxByStatusResponse, error) { + out := new(QueryCctxByStatusResponse) + err := c.cc.Invoke(ctx, "/zetachain.zetacore.crosschain.Query/CctxByStatus", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // Parameters queries the parameters of the module. @@ -3832,6 +3938,7 @@ type QueryServer interface { // Queries a list of lastMetaHeight items. LastZetaHeight(context.Context, *QueryLastZetaHeightRequest) (*QueryLastZetaHeightResponse, error) TssHistory(context.Context, *QueryTssHistoryRequest) (*QueryTssHistoryResponse, error) + CctxByStatus(context.Context, *QueryCctxByStatusRequest) (*QueryCctxByStatusResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -3919,6 +4026,9 @@ func (*UnimplementedQueryServer) LastZetaHeight(ctx context.Context, req *QueryL func (*UnimplementedQueryServer) TssHistory(ctx context.Context, req *QueryTssHistoryRequest) (*QueryTssHistoryResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method TssHistory not implemented") } +func (*UnimplementedQueryServer) CctxByStatus(ctx context.Context, req *QueryCctxByStatusRequest) (*QueryCctxByStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CctxByStatus not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -4410,6 +4520,24 @@ func _Query_TssHistory_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _Query_CctxByStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryCctxByStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).CctxByStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/zetachain.zetacore.crosschain.Query/CctxByStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).CctxByStatus(ctx, req.(*QueryCctxByStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "zetachain.zetacore.crosschain.Query", HandlerType: (*QueryServer)(nil), @@ -4522,11 +4650,80 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "TssHistory", Handler: _Query_TssHistory_Handler, }, + { + MethodName: "CctxByStatus", + Handler: _Query_CctxByStatus_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "crosschain/query.proto", } +func (m *QueryCctxByStatusRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCctxByStatusRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCctxByStatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Status != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryCctxByStatusResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryCctxByStatusResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCctxByStatusResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.CrossChainTx) > 0 { + for iNdEx := len(m.CrossChainTx) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.CrossChainTx[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *QueryTssHistoryRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7022,6 +7219,33 @@ func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *QueryCctxByStatusRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Status != 0 { + n += 1 + sovQuery(uint64(m.Status)) + } + return n +} + +func (m *QueryCctxByStatusResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.CrossChainTx) > 0 { + for _, e := range m.CrossChainTx { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + func (m *QueryTssHistoryRequest) Size() (n int) { if m == nil { return 0 @@ -8084,6 +8308,159 @@ func sovQuery(x uint64) (n int) { func sozQuery(x uint64) (n int) { return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (m *QueryCctxByStatusRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryCctxByStatusRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCctxByStatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= CctxStatus(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryCctxByStatusResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryCctxByStatusResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCctxByStatusResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CrossChainTx", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CrossChainTx = append(m.CrossChainTx, CrossChainTx{}) + if err := m.CrossChainTx[len(m.CrossChainTx)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *QueryTssHistoryRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/crosschain/types/query.pb.gw.go b/x/crosschain/types/query.pb.gw.go index ee6cee4368..b4a9373a3a 100644 --- a/x/crosschain/types/query.pb.gw.go +++ b/x/crosschain/types/query.pb.gw.go @@ -1157,6 +1157,66 @@ func local_request_Query_TssHistory_0(ctx context.Context, marshaler runtime.Mar } +func request_Query_CctxByStatus_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCctxByStatusRequest + var metadata runtime.ServerMetadata + + var ( + val string + e int32 + ok bool + err error + _ = err + ) + + val, ok = pathParams["status"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "status") + } + + e, err = runtime.Enum(val, CctxStatus_value) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "status", err) + } + + protoReq.Status = CctxStatus(e) + + msg, err := client.CctxByStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_CctxByStatus_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCctxByStatusRequest + var metadata runtime.ServerMetadata + + var ( + val string + e int32 + ok bool + err error + _ = err + ) + + val, ok = pathParams["status"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "status") + } + + e, err = runtime.Enum(val, CctxStatus_value) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "status", err) + } + + protoReq.Status = CctxStatus(e) + + msg, err := server.CctxByStatus(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -1784,6 +1844,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_CctxByStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_CctxByStatus_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CctxByStatus_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -2365,6 +2448,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_CctxByStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_CctxByStatus_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_CctxByStatus_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -2422,6 +2525,8 @@ var ( pattern_Query_LastZetaHeight_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"zeta-chain", "crosschain", "lastZetaHeight"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_TssHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"zeta-chain", "crosschain", "tssHistory"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_CctxByStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"zeta-chain", "crosschain", "cctxbyStatus", "status"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -2478,4 +2583,6 @@ var ( forward_Query_LastZetaHeight_0 = runtime.ForwardResponseMessage forward_Query_TssHistory_0 = runtime.ForwardResponseMessage + + forward_Query_CctxByStatus_0 = runtime.ForwardResponseMessage ) diff --git a/zetaclient/evm_client.go b/zetaclient/evm_client.go index 93deb6446f..0eec6a0bb2 100644 --- a/zetaclient/evm_client.go +++ b/zetaclient/evm_client.go @@ -1005,21 +1005,6 @@ func (ob *EVMChainClient) WatchGasPrice() { for { select { case <-ticker.C(): - contract, err := ob.GetZetaTokenNonEthContract() - if err == nil { - supply, err := contract.TotalSupply(nil) - if err == nil { - ob.logger.WatchGasPrice.Info().Msgf("TotalSupply : %d", supply) - } - } - - ce, err := ob.GetConnectorContractEth() - if err == nil { - lockedamout, err := ce.GetLockedAmount(nil) - if err == nil { - ob.logger.WatchGasPrice.Info().Msgf("LockedAmount : %d", lockedamout) - } - } err = ob.PostGasPrice() if err != nil { height, err := ob.zetaClient.GetBlockHeight() diff --git a/zetaclient/query.go b/zetaclient/query.go index 6adc11af1f..c18649299e 100644 --- a/zetaclient/query.go +++ b/zetaclient/query.go @@ -148,6 +148,15 @@ func (b *ZetaCoreBridge) GetAllPendingCctx(chainID int64) ([]*types.CrossChainTx return resp.CrossChainTx, nil } +func (b *ZetaCoreBridge) GetCctxByStatus(status types.CctxStatus) ([]types.CrossChainTx, error) { + client := types.NewQueryClient(b.grpcConn) + resp, err := client.CctxByStatus(context.Background(), &types.QueryCctxByStatusRequest{Status: status}) + if err != nil { + return nil, err + } + return resp.CrossChainTx, nil +} + func (b *ZetaCoreBridge) GetZetaTokenSupplyOnNode() (sdkmath.Int, error) { client := banktypes.NewQueryClient(b.grpcConn) resp, err := client.SupplyOf(context.Background(), &banktypes.QuerySupplyOfRequest{Denom: config.BaseDenom}) diff --git a/zetaclient/zeta_supply_checker.go b/zetaclient/zeta_supply_checker.go index de8f1add1f..7962dea93f 100644 --- a/zetaclient/zeta_supply_checker.go +++ b/zetaclient/zeta_supply_checker.go @@ -14,16 +14,27 @@ import ( ) type ZetaSupplyChecker struct { - cfg *config.Config - evmClient map[int64]*ethclient.Client - zetaClient *ZetaCoreBridge - ticker *DynamicTicker - stop chan struct{} - logger zerolog.Logger + cfg *config.Config + evmClient map[int64]*ethclient.Client + zetaClient *ZetaCoreBridge + ticker *DynamicTicker + stop chan struct{} + logger zerolog.Logger + externalEvmChain []common.Chain + ethereumChain common.Chain } func NewZetaSupplyChecker(cfg *config.Config, zetaClient *ZetaCoreBridge, logger zerolog.Logger) (ZetaSupplyChecker, error) { - zetaSupplyChecker := ZetaSupplyChecker{} + zetaSupplyChecker := ZetaSupplyChecker{ + stop: make(chan struct{}), + ticker: NewDynamicTicker(fmt.Sprintf("ZETASupplyTicker"), 15), + evmClient: make(map[int64]*ethclient.Client), + logger: logger.With(). + Str("module", "ZetaSupplyChecker"). + Logger(), + cfg: cfg, + zetaClient: zetaClient, + } for _, evmConfig := range cfg.GetAllEVMConfigs() { if evmConfig.Chain.IsZetaChain() { continue @@ -32,15 +43,22 @@ func NewZetaSupplyChecker(cfg *config.Config, zetaClient *ZetaCoreBridge, logger if err != nil { return zetaSupplyChecker, err } + fmt.Println("Adding evmConfig.Chain.ChainId", evmConfig.Chain.ChainId) zetaSupplyChecker.evmClient[evmConfig.Chain.ChainId] = client } - zetaSupplyChecker.zetaClient = zetaClient - zetaSupplyChecker.cfg = cfg - zetaSupplyChecker.logger = logger.With(). - Str("module", "ZetaSupplyChecker"). - Logger() - zetaSupplyChecker.stop = make(chan struct{}) - zetaSupplyChecker.ticker = NewDynamicTicker(fmt.Sprintf("ZETASupplyTicker"), 15) + + for chainID, _ := range zetaSupplyChecker.evmClient { + chain := common.GetChainFromChainID(chainID) + if chain.IsExternalChain() && common.IsEVMChain(chain.ChainId) && !common.IsEthereumChain(chain.ChainId) { + zetaSupplyChecker.externalEvmChain = append(zetaSupplyChecker.externalEvmChain, *chain) + } + if common.IsEthereumChain(chain.ChainId) { + zetaSupplyChecker.ethereumChain = *chain + } + } + + logger.Info().Msgf("zeta supply checker initialized , external chains : %v ,ethereum chain :%v", zetaSupplyChecker.externalEvmChain, zetaSupplyChecker.ethereumChain) + return zetaSupplyChecker, nil } func (zs *ZetaSupplyChecker) Start() { @@ -64,24 +82,14 @@ func (b *ZetaSupplyChecker) Stop() { } func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { - externalEvmChain := make([]common.Chain, 0) - ethereumChain := common.Chain{} - for chainID, _ := range zs.evmClient { - chain := common.GetChainFromChainID(chainID) - if chain.IsExternalChain() && common.IsEVMChain(chain.ChainId) && !common.IsEthereumChain(chain.ChainId) { - externalEvmChain = append(externalEvmChain, *chain) - } - if common.IsEthereumChain(chain.ChainId) { - ethereumChain = *chain - } - } - if len(externalEvmChain) == 0 { - return fmt.Errorf("no external chain found") - } - externalChainTotalSupply := big.NewInt(0) - for _, chain := range externalEvmChain { - zetaTokenAddressString := zs.cfg.EVMChainConfigs[chain.ChainId].CoreParams.ZetaTokenContractAddress + externalChainTotalSupply := big.NewInt(0) + for _, chain := range zs.externalEvmChain { + externalEvmChainConfig, ok := zs.cfg.GetEVMConfig(chain.ChainId) + if !ok { + return fmt.Errorf("externalEvmChainConfig not found for chain id %d", chain.ChainId) + } + zetaTokenAddressString := externalEvmChainConfig.ZetaTokenContractAddress zetaTokenAddress := ethcommon.HexToAddress(zetaTokenAddressString) zetatokenNonEth, err := FetchZetaZetaNonEthTokenContract(zetaTokenAddress, zs.evmClient[chain.ChainId]) if err != nil { @@ -91,13 +99,17 @@ func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { if err != nil { return err } + fmt.Println("Adding to external chain total supply", totalSupply.String()) externalChainTotalSupply.Add(externalChainTotalSupply, totalSupply) - } - ethConnectorAddressString := zs.cfg.EVMChainConfigs[ethereumChain.ChainId].CoreParams.ConnectorContractAddress + ethConfig, ok := zs.cfg.GetEVMConfig(zs.ethereumChain.ChainId) + if !ok { + return fmt.Errorf("eth config not found for chain id %d", zs.ethereumChain.ChainId) + } + ethConnectorAddressString := ethConfig.ConnectorContractAddress ethConnectorAddress := ethcommon.HexToAddress(ethConnectorAddressString) - ethConnectorContract, err := FetchConnectorContractEth(ethConnectorAddress, zs.evmClient[ethereumChain.ChainId]) + ethConnectorContract, err := FetchConnectorContractEth(ethConnectorAddress, zs.evmClient[zs.ethereumChain.ChainId]) if err != nil { return err } @@ -107,37 +119,60 @@ func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { return err } - zetaInTransit := zs.GetAmountOfZetaInTransit(externalEvmChain) + zetaInTransit := zs.GetAmountOfZetaInTransit(zs.externalEvmChain) zetaTokenSupplyOnNode, err := zs.zetaClient.GetZetaTokenSupplyOnNode() if err != nil { return err } - genesisAmounts := big.NewInt(0) - AbortedTxAmounts := big.NewInt(0) - negativeAmounts := genesisAmounts.Add(genesisAmounts, AbortedTxAmounts).Add(genesisAmounts, zetaInTransit) - positiveAmounts := externalChainTotalSupply.Add(externalChainTotalSupply, zetaTokenSupplyOnNode.BigInt()) - lhs := ethLockedAmount - rhs := positiveAmounts.Sub(positiveAmounts, negativeAmounts) + genesisAmounts := zs.GetGenesistokenAmounts() + abortedTxAmounts := zs.AbortedTxAmount() + negativeAmounts := big.NewInt(0) + negativeAmounts.Add(genesisAmounts, abortedTxAmounts) + negativeAmounts.Add(negativeAmounts, zetaInTransit) + positiveAmounts := big.NewInt(0) + positiveAmounts.Add(externalChainTotalSupply, zetaTokenSupplyOnNode.BigInt()) + + rhs := big.NewInt(0) + lhs := ethLockedAmount + rhs.Sub(positiveAmounts, negativeAmounts) + copyZetaTokenSupplyOnNode := big.NewInt(0).Set(zetaTokenSupplyOnNode.BigInt()) + copyGenesisAmounts := big.NewInt(0).Set(genesisAmounts) + nodeAmounts := big.NewInt(0).Sub(copyZetaTokenSupplyOnNode, copyGenesisAmounts) + zs.logger.Info().Msgf("--------------------------------------------------------------------------------") + zs.logger.Info().Msgf("aborted tx amounts : %s", abortedTxAmounts.String()) + zs.logger.Info().Msgf("zeta in transit : %s", zetaInTransit.String()) + zs.logger.Info().Msgf("external chain total supply : %s", externalChainTotalSupply.String()) + zs.logger.Info().Msgf("zeta token on node : %s", nodeAmounts.String()) + zs.logger.Info().Msgf("eth locked amount : %s", ethLockedAmount.String()) if lhs.Cmp(rhs) != 0 { zs.logger.Error().Msgf("zeta supply mismatch, lhs : %s , rhs : %s", lhs.String(), rhs.String()) - zs.logger.Error().Msgf("aborted tx amounts : %s", AbortedTxAmounts.String()) - zs.logger.Error().Msgf("genesis amounts : %s", genesisAmounts.String()) - zs.logger.Error().Msgf("zeta in transit : %s", zetaInTransit.String()) - zs.logger.Error().Msgf("external chain total supply : %s", externalChainTotalSupply.String()) - zs.logger.Error().Msgf("zeta token supply on node : %s", zetaTokenSupplyOnNode.String()) - zs.logger.Error().Msgf("eth locked amount : %s", ethLockedAmount.String()) return fmt.Errorf("zeta supply mismatch, lhs : %s , rhs : %s", lhs.String(), rhs.String()) } + + zs.logger.Info().Msgf("zeta supply check passed, lhs : %s , rhs : %s", lhs.String(), rhs.String()) + zs.logger.Info().Msgf("--------------------------------------------------------------------------------") return nil } func (zs *ZetaSupplyChecker) GetGenesistokenAmounts() *big.Int { - return nil + i, ok := big.NewInt(0).SetString("108402000200000000000000000", 10) + if !ok { + panic("error parsing genesis amount") + } + return i } func (zs *ZetaSupplyChecker) AbortedTxAmount() *big.Int { - return nil + cctxList, err := zs.zetaClient.GetCctxByStatus(types.CctxStatus_Aborted) + if err != nil { + panic(err) + } + amount := sdkmath.ZeroUint() + for _, cctx := range cctxList { + amount = amount.Add(cctx.GetCurrentOutTxParam().Amount) + } + return amount.BigInt() } func (zs *ZetaSupplyChecker) GetAmountOfZetaInTransit(externalEvmchain []common.Chain) *big.Int { From 246c5c5f5ed5eba50f8aea1724182b0649f8e6d4 Mon Sep 17 00:00:00 2001 From: Tanmay Date: Tue, 31 Oct 2023 19:49:18 -0400 Subject: [PATCH 06/15] remove pending cctxs which have existing trackers --- .../localnet/orchestrator/smoketest/main.go | 22 ++-- zetaclient/zeta_supply_checker.go | 112 ++++++++++-------- zetaclient/zeta_supply_checker_test.go | 52 ++++++++ 3 files changed, 128 insertions(+), 58 deletions(-) create mode 100644 zetaclient/zeta_supply_checker_test.go diff --git a/contrib/localnet/orchestrator/smoketest/main.go b/contrib/localnet/orchestrator/smoketest/main.go index 7d01a5cadf..fd94c4571d 100644 --- a/contrib/localnet/orchestrator/smoketest/main.go +++ b/contrib/localnet/orchestrator/smoketest/main.go @@ -303,17 +303,17 @@ func LocalSmokeTest(_ *cobra.Command, _ []string) { smokeTest.TestMessagePassingRevertSuccess() smokeTest.CheckZRC20ReserveAndSupply() - smokeTest.TestPauseZRC20() - smokeTest.CheckZRC20ReserveAndSupply() - - smokeTest.TestERC20DepositAndCallRefund() - smokeTest.CheckZRC20ReserveAndSupply() - - smokeTest.TestUpdateBytecode() - smokeTest.CheckZRC20ReserveAndSupply() - - smokeTest.TestDepositEtherLiquidityCap() - smokeTest.CheckZRC20ReserveAndSupply() + //smokeTest.TestPauseZRC20() + //smokeTest.CheckZRC20ReserveAndSupply() + // + //smokeTest.TestERC20DepositAndCallRefund() + //smokeTest.CheckZRC20ReserveAndSupply() + // + //smokeTest.TestUpdateBytecode() + //smokeTest.CheckZRC20ReserveAndSupply() + // + //smokeTest.TestDepositEtherLiquidityCap() + //smokeTest.CheckZRC20ReserveAndSupply() // add your dev test here smokeTest.TestMyTest() diff --git a/zetaclient/zeta_supply_checker.go b/zetaclient/zeta_supply_checker.go index 7962dea93f..8de2c48d84 100644 --- a/zetaclient/zeta_supply_checker.go +++ b/zetaclient/zeta_supply_checker.go @@ -2,7 +2,6 @@ package zetaclient import ( "fmt" - "math/big" sdkmath "cosmossdk.io/math" ethcommon "github.com/ethereum/go-ethereum/common" @@ -83,7 +82,7 @@ func (b *ZetaSupplyChecker) Stop() { func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { - externalChainTotalSupply := big.NewInt(0) + externalChainTotalSupply := sdkmath.ZeroInt() for _, chain := range zs.externalEvmChain { externalEvmChainConfig, ok := zs.cfg.GetEVMConfig(chain.ChainId) if !ok { @@ -100,7 +99,12 @@ func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { return err } fmt.Println("Adding to external chain total supply", totalSupply.String()) - externalChainTotalSupply.Add(externalChainTotalSupply, totalSupply) + totalSupplyInt, ok := sdkmath.NewIntFromString(totalSupply.String()) + if !ok { + zs.logger.Error().Msgf("error parsing total supply for chain %d", chain.ChainId) + continue + } + externalChainTotalSupply = externalChainTotalSupply.Add(totalSupplyInt) } ethConfig, ok := zs.cfg.GetEVMConfig(zs.ethereumChain.ChainId) @@ -118,52 +122,52 @@ func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { if err != nil { return err } + ethLockedAmountInt, ok := sdkmath.NewIntFromString(ethLockedAmount.String()) + if !ok { + return fmt.Errorf("error parsing eth locked amount") + } - zetaInTransit := zs.GetAmountOfZetaInTransit(zs.externalEvmChain) + zetaInTransit := zs.GetAmountOfZetaInTransit() zetaTokenSupplyOnNode, err := zs.zetaClient.GetZetaTokenSupplyOnNode() if err != nil { return err } - genesisAmounts := zs.GetGenesistokenAmounts() - abortedTxAmounts := zs.AbortedTxAmount() - negativeAmounts := big.NewInt(0) - negativeAmounts.Add(genesisAmounts, abortedTxAmounts) - negativeAmounts.Add(negativeAmounts, zetaInTransit) - - positiveAmounts := big.NewInt(0) - positiveAmounts.Add(externalChainTotalSupply, zetaTokenSupplyOnNode.BigInt()) - - rhs := big.NewInt(0) - lhs := ethLockedAmount - rhs.Sub(positiveAmounts, negativeAmounts) - copyZetaTokenSupplyOnNode := big.NewInt(0).Set(zetaTokenSupplyOnNode.BigInt()) - copyGenesisAmounts := big.NewInt(0).Set(genesisAmounts) - nodeAmounts := big.NewInt(0).Sub(copyZetaTokenSupplyOnNode, copyGenesisAmounts) - zs.logger.Info().Msgf("--------------------------------------------------------------------------------") - zs.logger.Info().Msgf("aborted tx amounts : %s", abortedTxAmounts.String()) - zs.logger.Info().Msgf("zeta in transit : %s", zetaInTransit.String()) - zs.logger.Info().Msgf("external chain total supply : %s", externalChainTotalSupply.String()) - zs.logger.Info().Msgf("zeta token on node : %s", nodeAmounts.String()) - zs.logger.Info().Msgf("eth locked amount : %s", ethLockedAmount.String()) - if lhs.Cmp(rhs) != 0 { - zs.logger.Error().Msgf("zeta supply mismatch, lhs : %s , rhs : %s", lhs.String(), rhs.String()) - return fmt.Errorf("zeta supply mismatch, lhs : %s , rhs : %s", lhs.String(), rhs.String()) - } - - zs.logger.Info().Msgf("zeta supply check passed, lhs : %s , rhs : %s", lhs.String(), rhs.String()) - zs.logger.Info().Msgf("--------------------------------------------------------------------------------") + ValidateZetaSupply(zs.logger, zs.AbortedTxAmount(), zetaInTransit, zs.GetGenesistokenAmounts(), externalChainTotalSupply, zetaTokenSupplyOnNode, ethLockedAmountInt) return nil } -func (zs *ZetaSupplyChecker) GetGenesistokenAmounts() *big.Int { - i, ok := big.NewInt(0).SetString("108402000200000000000000000", 10) +func ValidateZetaSupply(logger zerolog.Logger, abortedTxAmounts, zetaInTransit, genesisAmounts, externalChainTotalSupply, zetaTokenSupplyOnNode, ethLockedAmount sdkmath.Int) bool { + lhs := ethLockedAmount.Sub(abortedTxAmounts) + rhs := zetaTokenSupplyOnNode.Add(zetaInTransit).Add(externalChainTotalSupply).Sub(genesisAmounts) + + copyZetaTokenSupplyOnNode := zetaTokenSupplyOnNode + copyGenesisAmounts := genesisAmounts + nodeAmounts := copyZetaTokenSupplyOnNode.Sub(copyGenesisAmounts) + logger.Info().Msgf("--------------------------------------------------------------------------------") + logger.Info().Msgf("aborted tx amounts : %s", abortedTxAmounts.String()) + logger.Info().Msgf("zeta in transit : %s", zetaInTransit.String()) + logger.Info().Msgf("external chain total supply : %s", externalChainTotalSupply.String()) + logger.Info().Msgf("zeta token on node : %s", nodeAmounts.String()) + logger.Info().Msgf("eth locked amount : %s", ethLockedAmount.String()) + if !lhs.Equal(rhs) { + logger.Error().Msgf("zeta supply mismatch, lhs : %s , rhs : %s", lhs.String(), rhs.String()) + return false + } + logger.Info().Msgf("zeta supply check passed, lhs : %s , rhs : %s", lhs.String(), rhs.String()) + logger.Info().Msgf("--------------------------------------------------------------------------------") + return true +} + +func (zs *ZetaSupplyChecker) GetGenesistokenAmounts() sdkmath.Int { + amount, ok := sdkmath.NewIntFromString("108402000200000000000000000") if !ok { panic("error parsing genesis amount") } - return i + + return amount } -func (zs *ZetaSupplyChecker) AbortedTxAmount() *big.Int { +func (zs *ZetaSupplyChecker) AbortedTxAmount() sdkmath.Int { cctxList, err := zs.zetaClient.GetCctxByStatus(types.CctxStatus_Aborted) if err != nil { panic(err) @@ -172,20 +176,30 @@ func (zs *ZetaSupplyChecker) AbortedTxAmount() *big.Int { for _, cctx := range cctxList { amount = amount.Add(cctx.GetCurrentOutTxParam().Amount) } - return amount.BigInt() + amountInt, ok := sdkmath.NewIntFromString(amount.String()) + if !ok { + panic("error parsing amount") + } + return amountInt } -func (zs *ZetaSupplyChecker) GetAmountOfZetaInTransit(externalEvmchain []common.Chain) *big.Int { - cctxs := zs.GetPendingCCTXNotAwaitingConfirmation(externalEvmchain) +func (zs *ZetaSupplyChecker) GetAmountOfZetaInTransit() sdkmath.Int { + chainsToCheck := make([]common.Chain, len(zs.externalEvmChain)+1) + chainsToCheck = append(append(chainsToCheck, zs.externalEvmChain...), zs.ethereumChain) + cctxs := zs.GetPendingCCTXInTransit(chainsToCheck) amount := sdkmath.ZeroUint() for _, cctx := range cctxs { amount = amount.Add(cctx.GetCurrentOutTxParam().Amount) } - return amount.BigInt() + amountInt, ok := sdkmath.NewIntFromString(amount.String()) + if !ok { + panic("error parsing amount") + } + return amountInt } -func (zs *ZetaSupplyChecker) GetPendingCCTXNotAwaitingConfirmation(externalEvmchain []common.Chain) []*types.CrossChainTx { - ccTxNotAwaitngconfirmation := make([]*types.CrossChainTx, 0) - for _, chain := range externalEvmchain { +func (zs *ZetaSupplyChecker) GetPendingCCTXInTransit(receivingChains []common.Chain) []*types.CrossChainTx { + cctxInTransit := make([]*types.CrossChainTx, 0) + for _, chain := range receivingChains { cctx, err := zs.zetaClient.GetAllPendingCctx(chain.ChainId) if err != nil { continue @@ -196,16 +210,20 @@ func (zs *ZetaSupplyChecker) GetPendingCCTXNotAwaitingConfirmation(externalEvmch nonceToCctxMap[c.GetCurrentOutTxParam().OutboundTxTssNonce] = c } } + trackers, err := zs.zetaClient.GetAllOutTxTrackerByChain(chain, Ascending) if err != nil { continue } for _, tracker := range trackers { - if _, ok := nonceToCctxMap[tracker.Nonce]; !ok { - ccTxNotAwaitngconfirmation = append(ccTxNotAwaitngconfirmation, nonceToCctxMap[tracker.Nonce]) + zs.logger.Info().Msgf("tracker exists for nonce: %d , removing from supply checks", tracker.Nonce) + delete(nonceToCctxMap, tracker.Nonce) + } + for _, c := range nonceToCctxMap { + if c != nil { + cctxInTransit = append(cctxInTransit, c) } } - } - return ccTxNotAwaitngconfirmation + return cctxInTransit } diff --git a/zetaclient/zeta_supply_checker_test.go b/zetaclient/zeta_supply_checker_test.go new file mode 100644 index 0000000000..dcd7c93838 --- /dev/null +++ b/zetaclient/zeta_supply_checker_test.go @@ -0,0 +1,52 @@ +package zetaclient_test + +import ( + "os" + "testing" + + sdkmath "cosmossdk.io/math" + "github.com/rs/zerolog" + "github.com/stretchr/testify/assert" + "github.com/zeta-chain/zetacore/zetaclient" +) + +func MustNewIntFromString(val string) sdkmath.Int { + v, ok := sdkmath.NewIntFromString(val) + if !ok { + panic("invalid int") + } + return v +} +func TestZetaSupplyChecker_ValidateZetaSupply(t *testing.T) { + tt := []struct { + name string + abortedTxAmount sdkmath.Int + zetaInTransit sdkmath.Int + genesisAmounts sdkmath.Int + externalChainTotalSupply sdkmath.Int + zetaTokenSupplyOnNode sdkmath.Int + ethLockedAmount sdkmath.Int + validate assert.BoolAssertionFunc + }{ + { + name: "1 zeta cctx in progress", + abortedTxAmount: MustNewIntFromString("0"), + zetaInTransit: MustNewIntFromString("1000000000000000000"), + externalChainTotalSupply: MustNewIntFromString("9000000000000000000"), + genesisAmounts: MustNewIntFromString("1000000000000000000"), + zetaTokenSupplyOnNode: MustNewIntFromString("1000000000000000000"), + ethLockedAmount: MustNewIntFromString("10000000000000000000"), + validate: func(t assert.TestingT, b bool, i ...interface{}) bool { + return assert.True(t, b, i...) + }, + }, + // Todo add more scenarios + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + logger := zerolog.New(os.Stdout).With().Timestamp().Logger() + tc.validate(t, zetaclient.ValidateZetaSupply(logger, tc.abortedTxAmount, tc.zetaInTransit, tc.genesisAmounts, tc.externalChainTotalSupply, tc.zetaTokenSupplyOnNode, tc.ethLockedAmount)) + }) + } +} From c276ed108c85d320d077625231008daa042e57f1 Mon Sep 17 00:00:00 2001 From: Tanmay Date: Tue, 31 Oct 2023 21:07:31 -0400 Subject: [PATCH 07/15] add function to query genesis supply --- app/setup_handlers.go | 3 --- .../localnet/orchestrator/smoketest/main.go | 22 +++++++++---------- zetaclient/query.go | 21 ++++++++++++++++++ zetaclient/zeta_supply_checker.go | 4 +--- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/app/setup_handlers.go b/app/setup_handlers.go index 345b60ebd9..f18a9c56d4 100644 --- a/app/setup_handlers.go +++ b/app/setup_handlers.go @@ -18,9 +18,6 @@ func SetupHandlers(app *App) { vm[m] = mb.ConsensusVersion() } vm[observertypes.ModuleName] = vm[observertypes.ModuleName] - 1 - info, _ := app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress("valAddr")) - info.Tombstoned = false - app.SlashingKeeper.SetValidatorSigningInfo(ctx, sdk.ConsAddress("valAddr"), info) return app.mm.RunMigrations(ctx, app.configurator, vm) }) diff --git a/contrib/localnet/orchestrator/smoketest/main.go b/contrib/localnet/orchestrator/smoketest/main.go index fd94c4571d..7d01a5cadf 100644 --- a/contrib/localnet/orchestrator/smoketest/main.go +++ b/contrib/localnet/orchestrator/smoketest/main.go @@ -303,17 +303,17 @@ func LocalSmokeTest(_ *cobra.Command, _ []string) { smokeTest.TestMessagePassingRevertSuccess() smokeTest.CheckZRC20ReserveAndSupply() - //smokeTest.TestPauseZRC20() - //smokeTest.CheckZRC20ReserveAndSupply() - // - //smokeTest.TestERC20DepositAndCallRefund() - //smokeTest.CheckZRC20ReserveAndSupply() - // - //smokeTest.TestUpdateBytecode() - //smokeTest.CheckZRC20ReserveAndSupply() - // - //smokeTest.TestDepositEtherLiquidityCap() - //smokeTest.CheckZRC20ReserveAndSupply() + smokeTest.TestPauseZRC20() + smokeTest.CheckZRC20ReserveAndSupply() + + smokeTest.TestERC20DepositAndCallRefund() + smokeTest.CheckZRC20ReserveAndSupply() + + smokeTest.TestUpdateBytecode() + smokeTest.CheckZRC20ReserveAndSupply() + + smokeTest.TestDepositEtherLiquidityCap() + smokeTest.CheckZRC20ReserveAndSupply() // add your dev test here smokeTest.TestMyTest() diff --git a/zetaclient/query.go b/zetaclient/query.go index c18649299e..4b35fda892 100644 --- a/zetaclient/query.go +++ b/zetaclient/query.go @@ -9,10 +9,13 @@ import ( sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" + types2 "github.com/cosmos/cosmos-sdk/x/genutil/types" + "github.com/cosmos/cosmos-sdk/types/query" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" tmtypes "github.com/tendermint/tendermint/proto/tendermint/types" + tmhttp "github.com/tendermint/tendermint/rpc/client/http" "github.com/zeta-chain/zetacore/cmd/zetacored/config" "github.com/zeta-chain/zetacore/common" "github.com/zeta-chain/zetacore/x/crosschain/types" @@ -157,6 +160,24 @@ func (b *ZetaCoreBridge) GetCctxByStatus(status types.CctxStatus) ([]types.Cross return resp.CrossChainTx, nil } +func (b *ZetaCoreBridge) GetGenesisSupply() (sdkmath.Int, error) { + tmUrl := fmt.Sprintf("http://%s", b.cfg.ChainRPC) + s, err := tmhttp.New(tmUrl, "/websocket") + if err != nil { + return sdkmath.ZeroInt(), err + } + res, err := s.Genesis(context.Background()) + if err != nil { + return sdkmath.ZeroInt(), err + } + appState, err := types2.GenesisStateFromGenDoc(*res.Genesis) + if err != nil { + return sdkmath.ZeroInt(), err + } + bankstate := banktypes.GetGenesisStateFromAppState(b.encodingCfg.Codec, appState) + return bankstate.Supply.AmountOf(config.BaseDenom), nil +} + func (b *ZetaCoreBridge) GetZetaTokenSupplyOnNode() (sdkmath.Int, error) { client := banktypes.NewQueryClient(b.grpcConn) resp, err := client.SupplyOf(context.Background(), &banktypes.QuerySupplyOfRequest{Denom: config.BaseDenom}) diff --git a/zetaclient/zeta_supply_checker.go b/zetaclient/zeta_supply_checker.go index 8de2c48d84..2a9740a42c 100644 --- a/zetaclient/zeta_supply_checker.go +++ b/zetaclient/zeta_supply_checker.go @@ -42,7 +42,6 @@ func NewZetaSupplyChecker(cfg *config.Config, zetaClient *ZetaCoreBridge, logger if err != nil { return zetaSupplyChecker, err } - fmt.Println("Adding evmConfig.Chain.ChainId", evmConfig.Chain.ChainId) zetaSupplyChecker.evmClient[evmConfig.Chain.ChainId] = client } @@ -98,7 +97,6 @@ func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { if err != nil { return err } - fmt.Println("Adding to external chain total supply", totalSupply.String()) totalSupplyInt, ok := sdkmath.NewIntFromString(totalSupply.String()) if !ok { zs.logger.Error().Msgf("error parsing total supply for chain %d", chain.ChainId) @@ -158,12 +156,12 @@ func ValidateZetaSupply(logger zerolog.Logger, abortedTxAmounts, zetaInTransit, return true } +// TODO : Get this from genesis supply in genesis.json func (zs *ZetaSupplyChecker) GetGenesistokenAmounts() sdkmath.Int { amount, ok := sdkmath.NewIntFromString("108402000200000000000000000") if !ok { panic("error parsing genesis amount") } - return amount } From e57be53e104e5fd92e54e55f388f4d1beaa7dd79 Mon Sep 17 00:00:00 2001 From: Tanmay Date: Wed, 1 Nov 2023 02:27:34 -0400 Subject: [PATCH 08/15] account for coins minted from funginble module in begin block --- zetaclient/zeta_supply_checker.go | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/zetaclient/zeta_supply_checker.go b/zetaclient/zeta_supply_checker.go index 2a9740a42c..dd88ca60db 100644 --- a/zetaclient/zeta_supply_checker.go +++ b/zetaclient/zeta_supply_checker.go @@ -21,6 +21,7 @@ type ZetaSupplyChecker struct { logger zerolog.Logger externalEvmChain []common.Chain ethereumChain common.Chain + genesisSupply sdkmath.Int } func NewZetaSupplyChecker(cfg *config.Config, zetaClient *ZetaCoreBridge, logger zerolog.Logger) (ZetaSupplyChecker, error) { @@ -54,6 +55,15 @@ func NewZetaSupplyChecker(cfg *config.Config, zetaClient *ZetaCoreBridge, logger zetaSupplyChecker.ethereumChain = *chain } } + balances, err := zetaSupplyChecker.zetaClient.GetGenesisSupply() + if err != nil { + return zetaSupplyChecker, err + } + tokensMintedAtBeginBlock, ok := sdkmath.NewIntFromString("200000000000000000") + if !ok { + return zetaSupplyChecker, fmt.Errorf("error parsing tokens minted at begin block") + } + zetaSupplyChecker.genesisSupply = balances.Add(tokensMintedAtBeginBlock) logger.Info().Msgf("zeta supply checker initialized , external chains : %v ,ethereum chain :%v", zetaSupplyChecker.externalEvmChain, zetaSupplyChecker.ethereumChain) @@ -130,7 +140,7 @@ func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { if err != nil { return err } - ValidateZetaSupply(zs.logger, zs.AbortedTxAmount(), zetaInTransit, zs.GetGenesistokenAmounts(), externalChainTotalSupply, zetaTokenSupplyOnNode, ethLockedAmountInt) + ValidateZetaSupply(zs.logger, zs.AbortedTxAmount(), zetaInTransit, zs.genesisSupply, externalChainTotalSupply, zetaTokenSupplyOnNode, ethLockedAmountInt) return nil } @@ -145,7 +155,9 @@ func ValidateZetaSupply(logger zerolog.Logger, abortedTxAmounts, zetaInTransit, logger.Info().Msgf("aborted tx amounts : %s", abortedTxAmounts.String()) logger.Info().Msgf("zeta in transit : %s", zetaInTransit.String()) logger.Info().Msgf("external chain total supply : %s", externalChainTotalSupply.String()) - logger.Info().Msgf("zeta token on node : %s", nodeAmounts.String()) + logger.Info().Msgf("effective zeta supply on node : %s", nodeAmounts.String()) + logger.Info().Msgf("zeta token supply on node : %s", zetaTokenSupplyOnNode.String()) + logger.Info().Msgf("genesis amounts : %s", genesisAmounts.String()) logger.Info().Msgf("eth locked amount : %s", ethLockedAmount.String()) if !lhs.Equal(rhs) { logger.Error().Msgf("zeta supply mismatch, lhs : %s , rhs : %s", lhs.String(), rhs.String()) @@ -156,15 +168,6 @@ func ValidateZetaSupply(logger zerolog.Logger, abortedTxAmounts, zetaInTransit, return true } -// TODO : Get this from genesis supply in genesis.json -func (zs *ZetaSupplyChecker) GetGenesistokenAmounts() sdkmath.Int { - amount, ok := sdkmath.NewIntFromString("108402000200000000000000000") - if !ok { - panic("error parsing genesis amount") - } - return amount -} - func (zs *ZetaSupplyChecker) AbortedTxAmount() sdkmath.Int { cctxList, err := zs.zetaClient.GetCctxByStatus(types.CctxStatus_Aborted) if err != nil { From 876985d69fb76594feeb7bed14bc6bea0ec28fcd Mon Sep 17 00:00:00 2001 From: Tanmay Date: Wed, 1 Nov 2023 11:48:32 -0400 Subject: [PATCH 09/15] rename identifiers to more meanigful names --- zetaclient/query.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zetaclient/query.go b/zetaclient/query.go index 4b35fda892..e602fe0dc6 100644 --- a/zetaclient/query.go +++ b/zetaclient/query.go @@ -9,7 +9,7 @@ import ( sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client/grpc/tmservice" - types2 "github.com/cosmos/cosmos-sdk/x/genutil/types" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/cosmos/cosmos-sdk/types/query" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -170,7 +170,7 @@ func (b *ZetaCoreBridge) GetGenesisSupply() (sdkmath.Int, error) { if err != nil { return sdkmath.ZeroInt(), err } - appState, err := types2.GenesisStateFromGenDoc(*res.Genesis) + appState, err := genutiltypes.GenesisStateFromGenDoc(*res.Genesis) if err != nil { return sdkmath.ZeroInt(), err } From 622e6e4bad58cbf48ba4d83170ddc283d3ecd1f4 Mon Sep 17 00:00:00 2001 From: Tanmay Date: Mon, 6 Nov 2023 08:48:31 -0500 Subject: [PATCH 10/15] rename errStartingzetaSupplyChecker to err in start.go --- app/setup_handlers.go | 1 - cmd/zetaclientd/start.go | 6 +++--- zetaclient/zeta_supply_checker_test.go | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/setup_handlers.go b/app/setup_handlers.go index f18a9c56d4..18a8ae1f62 100644 --- a/app/setup_handlers.go +++ b/app/setup_handlers.go @@ -19,7 +19,6 @@ func SetupHandlers(app *App) { } vm[observertypes.ModuleName] = vm[observertypes.ModuleName] - 1 return app.mm.RunMigrations(ctx, app.configurator, vm) - }) upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk() diff --git a/cmd/zetaclientd/start.go b/cmd/zetaclientd/start.go index a3fcad06c7..3f2481b6f1 100644 --- a/cmd/zetaclientd/start.go +++ b/cmd/zetaclientd/start.go @@ -241,11 +241,11 @@ func start(_ *cobra.Command, _ []string) error { mo1 := mc.NewCoreObserver(zetaBridge, signerMap, chainClientMap, metrics, tss, masterLogger, cfg, telemetryServer) mo1.MonitorCore() - zetaSupplyChecker, errStartingzetaSupplyChecker := mc.NewZetaSupplyChecker(cfg, zetaBridge, masterLogger) - if errStartingzetaSupplyChecker != nil { + zetaSupplyChecker, err := mc.NewZetaSupplyChecker(cfg, zetaBridge, masterLogger) + if err != nil { startLogger.Err(err).Msg("NewZetaSupplyChecker") } - if errStartingzetaSupplyChecker == nil { + if err == nil { zetaSupplyChecker.Start() defer zetaSupplyChecker.Stop() } diff --git a/zetaclient/zeta_supply_checker_test.go b/zetaclient/zeta_supply_checker_test.go index dcd7c93838..020477ccd4 100644 --- a/zetaclient/zeta_supply_checker_test.go +++ b/zetaclient/zeta_supply_checker_test.go @@ -41,6 +41,7 @@ func TestZetaSupplyChecker_ValidateZetaSupply(t *testing.T) { }, }, // Todo add more scenarios + //https://github.com/zeta-chain/node/issues/1375 } for _, tc := range tt { From e2a71877b01d3860e38cbb3ecd2dc4375e66224f Mon Sep 17 00:00:00 2001 From: Tanmay Date: Tue, 7 Nov 2023 17:56:44 -0500 Subject: [PATCH 11/15] remove panic from aborted amount function --- zetaclient/zeta_supply_checker.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/zetaclient/zeta_supply_checker.go b/zetaclient/zeta_supply_checker.go index dd88ca60db..09cf4594d6 100644 --- a/zetaclient/zeta_supply_checker.go +++ b/zetaclient/zeta_supply_checker.go @@ -2,6 +2,7 @@ package zetaclient import ( "fmt" + "github.com/pkg/errors" sdkmath "cosmossdk.io/math" ethcommon "github.com/ethereum/go-ethereum/common" @@ -140,7 +141,11 @@ func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { if err != nil { return err } - ValidateZetaSupply(zs.logger, zs.AbortedTxAmount(), zetaInTransit, zs.genesisSupply, externalChainTotalSupply, zetaTokenSupplyOnNode, ethLockedAmountInt) + abortedAmount, err := zs.AbortedTxAmount() + if err != nil { + return err + } + ValidateZetaSupply(zs.logger, abortedAmount, zetaInTransit, zs.genesisSupply, externalChainTotalSupply, zetaTokenSupplyOnNode, ethLockedAmountInt) return nil } @@ -168,10 +173,10 @@ func ValidateZetaSupply(logger zerolog.Logger, abortedTxAmounts, zetaInTransit, return true } -func (zs *ZetaSupplyChecker) AbortedTxAmount() sdkmath.Int { +func (zs *ZetaSupplyChecker) AbortedTxAmount() (sdkmath.Int, error) { cctxList, err := zs.zetaClient.GetCctxByStatus(types.CctxStatus_Aborted) if err != nil { - panic(err) + return sdkmath.ZeroInt(), err } amount := sdkmath.ZeroUint() for _, cctx := range cctxList { @@ -179,9 +184,9 @@ func (zs *ZetaSupplyChecker) AbortedTxAmount() sdkmath.Int { } amountInt, ok := sdkmath.NewIntFromString(amount.String()) if !ok { - panic("error parsing amount") + return sdkmath.ZeroInt(), errors.New("error parsing amount") } - return amountInt + return amountInt, nil } func (zs *ZetaSupplyChecker) GetAmountOfZetaInTransit() sdkmath.Int { From 9068798f59ac256d50e74e3197e4ee90274ebd6f Mon Sep 17 00:00:00 2001 From: Tanmay Date: Tue, 7 Nov 2023 19:43:20 -0500 Subject: [PATCH 12/15] fix lint --- zetaclient/query.go | 4 ++-- zetaclient/zeta_supply_checker.go | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/zetaclient/query.go b/zetaclient/query.go index 57e577dd32..95ac8f8586 100644 --- a/zetaclient/query.go +++ b/zetaclient/query.go @@ -146,8 +146,8 @@ func (b *ZetaCoreBridge) GetCctxByStatus(status types.CctxStatus) ([]types.Cross } func (b *ZetaCoreBridge) GetGenesisSupply() (sdkmath.Int, error) { - tmUrl := fmt.Sprintf("http://%s", b.cfg.ChainRPC) - s, err := tmhttp.New(tmUrl, "/websocket") + tmURL := fmt.Sprintf("http://%s", b.cfg.ChainRPC) + s, err := tmhttp.New(tmURL, "/websocket") if err != nil { return sdkmath.ZeroInt(), err } diff --git a/zetaclient/zeta_supply_checker.go b/zetaclient/zeta_supply_checker.go index 09cf4594d6..13d40d3959 100644 --- a/zetaclient/zeta_supply_checker.go +++ b/zetaclient/zeta_supply_checker.go @@ -2,6 +2,7 @@ package zetaclient import ( "fmt" + "github.com/pkg/errors" sdkmath "cosmossdk.io/math" @@ -47,7 +48,7 @@ func NewZetaSupplyChecker(cfg *config.Config, zetaClient *ZetaCoreBridge, logger zetaSupplyChecker.evmClient[evmConfig.Chain.ChainId] = client } - for chainID, _ := range zetaSupplyChecker.evmClient { + for chainID := range zetaSupplyChecker.evmClient { chain := common.GetChainFromChainID(chainID) if chain.IsExternalChain() && common.IsEVMChain(chain.ChainId) && !common.IsEthereumChain(chain.ChainId) { zetaSupplyChecker.externalEvmChain = append(zetaSupplyChecker.externalEvmChain, *chain) @@ -85,9 +86,9 @@ func (zs *ZetaSupplyChecker) Start() { } } -func (b *ZetaSupplyChecker) Stop() { - b.logger.Info().Msgf("ZetaSupplyChecker is stopping") - close(b.stop) +func (zs *ZetaSupplyChecker) Stop() { + zs.logger.Info().Msgf("ZetaSupplyChecker is stopping") + close(zs.stop) } func (zs *ZetaSupplyChecker) CheckZetaTokenSupply() error { From 961c7628dbfd6540f8da60b2bd9397efcc642153 Mon Sep 17 00:00:00 2001 From: Tanmay Date: Tue, 7 Nov 2023 22:15:16 -0500 Subject: [PATCH 13/15] generate new files --- typescript/crosschain/query_pb.d.ts | 50 ++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/typescript/crosschain/query_pb.d.ts b/typescript/crosschain/query_pb.d.ts index 0446c27b90..2176ad0a5f 100644 --- a/typescript/crosschain/query_pb.d.ts +++ b/typescript/crosschain/query_pb.d.ts @@ -5,18 +5,66 @@ import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; import { Message, proto3 } from "@bufbuild/protobuf"; +import type { CctxStatus, CrossChainTx } from "./cross_chain_tx_pb.js"; import type { TSS } from "./tss_pb.js"; import type { Params } from "./params_pb.js"; import type { OutTxTracker } from "./out_tx_tracker_pb.js"; import type { PageRequest, PageResponse } from "../cosmos/base/query/v1beta1/pagination_pb.js"; import type { InTxTracker } from "./in_tx_tracker_pb.js"; import type { InTxHashToCctx } from "./in_tx_hash_to_cctx_pb.js"; -import type { CrossChainTx } from "./cross_chain_tx_pb.js"; import type { GasPrice } from "./gas_price_pb.js"; import type { ChainNonces } from "./chain_nonces_pb.js"; import type { PendingNonces } from "./nonce_to_cctx_pb.js"; import type { LastBlockHeight } from "./last_block_height_pb.js"; +/** + * @generated from message zetachain.zetacore.crosschain.QueryCctxByStatusRequest + */ +export declare class QueryCctxByStatusRequest extends Message { + /** + * @generated from field: zetachain.zetacore.crosschain.CctxStatus status = 1; + */ + status: CctxStatus; + + constructor(data?: PartialMessage); + + static readonly runtime: typeof proto3; + static readonly typeName = "zetachain.zetacore.crosschain.QueryCctxByStatusRequest"; + static readonly fields: FieldList; + + static fromBinary(bytes: Uint8Array, options?: Partial): QueryCctxByStatusRequest; + + static fromJson(jsonValue: JsonValue, options?: Partial): QueryCctxByStatusRequest; + + static fromJsonString(jsonString: string, options?: Partial): QueryCctxByStatusRequest; + + static equals(a: QueryCctxByStatusRequest | PlainMessage | undefined, b: QueryCctxByStatusRequest | PlainMessage | undefined): boolean; +} + +/** + * @generated from message zetachain.zetacore.crosschain.QueryCctxByStatusResponse + */ +export declare class QueryCctxByStatusResponse extends Message { + /** + * @generated from field: repeated zetachain.zetacore.crosschain.CrossChainTx CrossChainTx = 1; + */ + CrossChainTx: CrossChainTx[]; + + constructor(data?: PartialMessage); + + static readonly runtime: typeof proto3; + static readonly typeName = "zetachain.zetacore.crosschain.QueryCctxByStatusResponse"; + static readonly fields: FieldList; + + static fromBinary(bytes: Uint8Array, options?: Partial): QueryCctxByStatusResponse; + + static fromJson(jsonValue: JsonValue, options?: Partial): QueryCctxByStatusResponse; + + static fromJsonString(jsonString: string, options?: Partial): QueryCctxByStatusResponse; + + static equals(a: QueryCctxByStatusResponse | PlainMessage | undefined, b: QueryCctxByStatusResponse | PlainMessage | undefined): boolean; +} + /** * @generated from message zetachain.zetacore.crosschain.QueryTssHistoryRequest */ From b49bd4c0e5ffbacd885fee0b95535f6cf2f018f9 Mon Sep 17 00:00:00 2001 From: Tanmay Date: Fri, 10 Nov 2023 13:12:34 -0500 Subject: [PATCH 14/15] add changelog --- changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.md b/changelog.md index 91e046ae20..da2bd64a37 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,7 @@ ## Version: v10.1.2 ### What's Changed: +* add a new thread to zetaclient which checks zeta supply in all connected chains in every block * bfa1cb8 skip mainnet addresses in cctxs * 6e1fb4a skip garbage trackers and increase btc gas fee * fix: added upgrade name, and allow download. allows to test release can. by @gzukel in https://github.com/zeta-chain/node/pull/1195 From 2271f143185ed2ea7574aedd29eb8619d91ea789 Mon Sep 17 00:00:00 2001 From: Tanmay Date: Fri, 10 Nov 2023 13:19:40 -0500 Subject: [PATCH 15/15] add an unreleased section in changelog.md --- changelog.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index da2bd64a37..1ffd5ecc19 100644 --- a/changelog.md +++ b/changelog.md @@ -3,7 +3,6 @@ ## Version: v10.1.2 ### What's Changed: -* add a new thread to zetaclient which checks zeta supply in all connected chains in every block * bfa1cb8 skip mainnet addresses in cctxs * 6e1fb4a skip garbage trackers and increase btc gas fee * fix: added upgrade name, and allow download. allows to test release can. by @gzukel in https://github.com/zeta-chain/node/pull/1195 @@ -42,5 +41,8 @@ * chore: increment handler version by @kingpinXD in https://github.com/zeta-chain/node/pull/1307 * fix: begin blocker for mock mainnet by @kingpinXD in https://github.com/zeta-chain/node/pull/1308 +### Unreleased: +* add a new thread to zetaclient which checks zeta supply in all connected chains in every block +